kune-commits
Threads by month
- ----- 2026 -----
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2025 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2024 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2023 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2022 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2021 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2020 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2019 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2018 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2017 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2016 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2015 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2014 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2013 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2012 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2011 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2010 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2009 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2008 -----
- December
- November
- October
- September
- August
- July
- June
- May
- 1587 discussions
13 Jul '11
Author: vjrj_
Date: 2011-07-13 17:25:35 +0200 (Wed, 13 Jul 2011)
New Revision: 1451
Modified:
trunk/img/webtemplate/theme-palettes.svg
trunk/src/main/resources/kune.properties
Log:
themed improved
Modified: trunk/img/webtemplate/theme-palettes.svg
===================================================================
--- trunk/img/webtemplate/theme-palettes.svg 2011-07-13 12:21:02 UTC (rev 1450)
+++ trunk/img/webtemplate/theme-palettes.svg 2011-07-13 15:25:35 UTC (rev 1451)
@@ -27,7 +27,7 @@
inkscape:pageshadow="2"
inkscape:zoom="1"
inkscape:cx="346.17698"
- inkscape:cy="-166.02205"
+ inkscape:cy="-246.02205"
inkscape:document-units="px"
inkscape:current-layer="layer1"
showgrid="false"
@@ -44,7 +44,7 @@
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
- <dc:title></dc:title>
+ <dc:title />
</cc:Work>
</rdf:RDF>
</metadata>
@@ -72,7 +72,7 @@
height="40"
width="150"
id="rect7959-4"
- style="color:#000000;fill:#e6e6e6;fill-opacity:0.94901961;fill-rule:nonzero;stroke:none;stroke-width:0.73427981;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" />
+ style="color:#000000;fill:#e6e6e6;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.73427980999999998;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" />
<rect
style="color:#000000;fill:#ffffff;fill-opacity:0.94901961;fill-rule:nonzero;stroke:none;stroke-width:0.73427981;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
id="rect7961-9"
@@ -140,7 +140,7 @@
height="40"
width="150"
id="rect7983-4"
- style="color:#000000;fill:#e6e6e6;fill-opacity:0.94901961;fill-rule:nonzero;stroke:none;stroke-width:0.73427981;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" />
+ style="color:#000000;fill:#e6e6e6;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.73427980999999998;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" />
<rect
style="color:#000000;fill:#ffffff;fill-opacity:0.94901961;fill-rule:nonzero;stroke:none;stroke-width:0.73427981;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
id="rect7985-7"
@@ -375,7 +375,7 @@
id="rect7559"
style="color:#000000;fill:#9753aa;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.73427980999999998;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" />
<rect
- style="color:#000000;fill:#e26fff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.73427980999999998;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+ style="color:#000000;fill:#db79f4;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.73427980999999998;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
id="rect7561"
width="150"
height="40"
@@ -441,7 +441,7 @@
height="40"
width="150"
id="rect7583"
- style="color:#000000;fill:#c653e2;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.73427980999999998;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" />
+ style="color:#000000;fill:#b852d2;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.73427980999999998;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" />
<rect
style="color:#000000;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.73427980999999998;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
id="rect7585"
@@ -501,7 +501,7 @@
x="189"
y="254.36218">lorem </tspan></text>
<rect
- style="color:#000000;fill:#de8787;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.73427980999999998;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+ style="color:#000000;fill:#ec3a3a;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.73427980999999998;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
id="rect7605"
width="150"
height="40"
@@ -515,7 +515,7 @@
id="rect7607"
style="color:#000000;fill:#d35f5f;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.73427980999999998;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" />
<rect
- style="color:#000000;fill:#c04141;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.73427980999999998;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+ style="color:#000000;fill:#9f0000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.73427980999999998;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
id="rect7609"
width="150"
height="40"
@@ -527,10 +527,10 @@
height="40"
width="150"
id="rect7611"
- style="color:#000000;fill:#ff8080;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.73427980999999998;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" />
+ style="color:#000000;fill:#c52b2b;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.73427980999999998;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" />
<text
xml:space="preserve"
- style="font-size:18px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:125%;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;baseline-shift:baseline;color:#000000;fill:#aa0000;fill-opacity:0.94901961;fill-rule:nonzero;stroke:none;stroke-width:1.40678155000000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Ubuntu;-inkscape-font-specification:Ubuntu"
+ style="font-size:18px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:125%;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;baseline-shift:baseline;color:#000000;fill:#ffffff;fill-opacity:0.94901961000000001;fill-rule:nonzero;stroke:none;stroke-width:1.40678155000000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Ubuntu;-inkscape-font-specification:Ubuntu"
x="38"
y="450.36218"
id="text7613"
@@ -583,7 +583,7 @@
id="rect7631"
style="color:#000000;fill:#ffe0e0;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.73427980999999998;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" />
<rect
- style="color:#000000;fill:#b86262;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.73427980999999998;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+ style="color:#000000;fill:#ec3a3a;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.73427980999999998;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
id="rect7633"
width="150"
height="40"
@@ -795,7 +795,7 @@
x="189"
y="654.36218">lorem </tspan></text>
<rect
- style="color:#000000;fill:#ffe680;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.73427980999999998;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+ style="color:#000000;fill:#e7cc5f;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.73427980999999998;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
id="rect7705"
width="150"
height="40"
@@ -821,7 +821,7 @@
height="40"
width="150"
id="rect7711"
- style="color:#000000;fill:#f5cc22;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.73427980999999998;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" />
+ style="color:#000000;fill:#dcbc3a;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.73427980999999998;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" />
<text
xml:space="preserve"
style="font-size:18px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:125%;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;baseline-shift:baseline;color:#000000;fill:#151515;fill-opacity:0.94901961;fill-rule:nonzero;stroke:none;stroke-width:1.40678155000000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Ubuntu;-inkscape-font-specification:Ubuntu"
@@ -1241,7 +1241,7 @@
height="40"
width="150"
id="rect7855"
- style="color:#000000;fill:#ffe7d7;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.73427980999999998;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" />
+ style="color:#000000;fill:#e8bc9e;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.73427980999999998;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" />
<rect
style="color:#000000;fill:#eac9b3;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.73427980999999998;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
id="rect7857"
@@ -1551,7 +1551,7 @@
id="rect7959"
style="color:#000000;fill:#b15278;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.73427980999999998;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" />
<rect
- style="color:#000000;fill:#ff74ab;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.73427980999999998;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+ style="color:#000000;fill:#e777a4;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.73427980999999998;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
id="rect7961"
width="150"
height="40"
@@ -1983,7 +1983,7 @@
height="40"
width="150"
id="rect3367"
- style="color:#000000;fill:#000055;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.73427981;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+ style="color:#000000;fill:#0c1f3d;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.73427980999999998;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
inkscape:export-filename="/home/vjrj/proyectos/dev/kune/trunk/img/webtemplate/highcontrast.png"
inkscape:export-xdpi="90"
inkscape:export-ydpi="90" />
@@ -2003,12 +2003,12 @@
height="40"
width="150"
id="rect3371"
- style="color:#000000;fill:#00002b;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.73427981;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+ style="color:#000000;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.73427980999999998;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
inkscape:export-filename="/home/vjrj/proyectos/dev/kune/trunk/img/webtemplate/highcontrast.png"
inkscape:export-xdpi="90"
inkscape:export-ydpi="90" />
<rect
- style="color:#000000;fill:#000055;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.73427981;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+ style="color:#000000;fill:#0c2855;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.73427980999999998;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
id="rect3373"
width="150"
height="40"
@@ -2077,7 +2077,7 @@
x="38"
y="1150.3622">lorem </tspan></text>
<rect
- style="color:#000000;fill:#0000aa;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.73427981;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+ style="color:#000000;fill:#162d50;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.73427980999999998;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
id="rect3393"
width="150"
height="40"
@@ -2092,12 +2092,12 @@
height="40"
width="150"
id="rect3395"
- style="color:#000000;fill:#00112b;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.73427981;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+ style="color:#000000;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.73427980999999998;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
inkscape:export-filename="/home/vjrj/proyectos/dev/kune/trunk/img/webtemplate/highcontrast.png"
inkscape:export-xdpi="90"
inkscape:export-ydpi="90" />
<rect
- style="color:#000000;fill:#b3b3b3;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.73427980999999998;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+ style="color:#000000;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.73427980999999998;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
id="rect3397"
width="150"
height="40"
@@ -2267,7 +2267,7 @@
height="40"
width="150"
id="rect4215"
- style="color:#000000;fill:#000000;fill-opacity:0.94901961000000001;fill-rule:nonzero;stroke:none;stroke-width:0.73427980999999998;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" />
+ style="color:#000000;fill:#ffffff;fill-opacity:0.94901961;fill-rule:nonzero;stroke:none;stroke-width:0.73427980999999998;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" />
<rect
style="color:#000000;fill:#000000;fill-opacity:0.94901961000000001;fill-rule:nonzero;stroke:none;stroke-width:0.73427980999999998;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
id="rect4217"
@@ -2291,7 +2291,7 @@
id="text4223"
y="1313.1414"
x="561.34814"
- style="font-size:18px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:125%;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;baseline-shift:baseline;color:#000000;fill:#ffffff;fill-opacity:0.94901961000000001;fill-rule:nonzero;stroke:none;stroke-width:1.40678155000000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Ubuntu;-inkscape-font-specification:Ubuntu"
+ style="font-size:18px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:125%;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;baseline-shift:baseline;color:#000000;fill:#000000;fill-opacity:0.94901961000000001;fill-rule:nonzero;stroke:none;stroke-width:1.40678155000000005;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Ubuntu;-inkscape-font-specification:Ubuntu Bold"
xml:space="preserve"><tspan
y="1313.1414"
x="561.34814"
Modified: trunk/src/main/resources/kune.properties
===================================================================
--- trunk/src/main/resources/kune.properties 2011-07-13 12:21:02 UTC (rev 1450)
+++ trunk/src/main/resources/kune.properties 2011-07-13 15:25:35 UTC (rev 1451)
@@ -41,29 +41,29 @@
kune.wsthemes.default.colors = #FFF,#FFF,#FFF,#FFF,#552200,#FFF,#a05a2c,#a05a2c
kune.wsthemes.green.backgrounds = #abde88, #bfe7a6, #5a8141, #749b5a, #d5efc3, #749b5a, #FFF, #eaf7e1
kune.wsthemes.green.colors = #225500, #225500, #FFF, #FFF, #17280b, #FFF, #225500, #225500
-kune.wsthemes.purple.backgrounds = #ddaee9, #f4c6ff, #9753aa, #e26fff, #f4e4f8, #c653e2, #FFF, #f9e3ff
+kune.wsthemes.purple.backgrounds = #ddaee9, #f4c6ff, #9753aa, #db79f4, #f4e4f8, #b852d2, #FFF, #f9e3ff
kune.wsthemes.purple.colors = #FFF, #FFF, #FFF, #FFF, #6d0c87, #FFF, #6d0c87, #6d0c87
kune.wsthemes.grey.backgrounds = #cfcfcf, #b7b7b7, #565656, #868686, #ededed, #6e6e6e, #FFF, #e7e7e7
kune.wsthemes.grey.colors = #4d4d4d, #4d4d4d, #FFF, #FFF, #000, #FFF, #4d4d4d, #4d4d4d
-kune.wsthemes.red.backgrounds = #de8787, #d35f5f, #c04141, #ff8080, #ffe0e0, #b86262, #FFF, #f7e1e1
-kune.wsthemes.red.colors = #aa0000, #FFF, #FFF, #FFF, #a02c2c, #FFF, #a02c2c, #a02c2c
-kune.wsthemes.sahara.backgrounds = #ffe7d7, #eac9b3, #d59367, #eac9b3, #f7ece4, #e0ae8d, #FFF, #f7ece4
+kune.wsthemes.red.backgrounds = #ec3a3a, #d35f5f, #9f0000, #c52b2b, #ffe0e0, #ec3a3a, #FFF, #f7e1e1
+kune.wsthemes.red.colors = #FFF, #FFF, #FFF, #FFF, #a02c2c, #FFF, #a02c2c, #a02c2c
+kune.wsthemes.sahara.backgrounds = #e8bc9e, #eac9b3, #d59367, #eac9b3, #f7ece4, #e0ae8d, #FFF, #f7ece4
kune.wsthemes.sahara.colors = #502d16, #502d16, #552200, #502d16, #502d16, #784421, #d45500, #d45500
kune.wsthemes.blue.backgrounds = #8cbaff, #87aade, #5280c5, #528ce2, #c5dcff, #528ce2, #FFF, #c9d8f0
kune.wsthemes.blue.colors = #FFF, #FFF, #FFF, #FFF, #0044aa, #FFF, #0044aa, #0044aa
kune.wsthemes.redblack.backgrounds = #a14242, #b96363, #424242, #a14242, #ffe0e0, #a14242, #FFF, #f7e1e1
kune.wsthemes.redblack.colors = #FFF, #FFF, #FFF, #FFF, #800000, #FFF, #800000, #800000
-kune.wsthemes.camp.backgrounds = #ffe680, #a49e87, #3c3c3c, #f5cc22, #f6f1de, #4f472b, #FFF, #fff8dc
+kune.wsthemes.camp.backgrounds = #e7cc5f, #a49e87, #3c3c3c, #dcbc3a, #f6f1de, #4f472b, #FFF, #fff8dc
kune.wsthemes.camp.colors = #151515, #151515, #fecc00, #151515, #000000, #f3c401, #151515, #151515
-kune.wsthemes.pink.backgrounds = #e49db9, #edbdd0, #b15278, #ff74ab, #ffddf8, #d25b8b, #FFF, #f6dee8
+kune.wsthemes.pink.backgrounds = #e49db9, #edbdd0, #b15278, #e777a4, #ffddf8, #d25b8b, #FFF, #f6dee8
kune.wsthemes.pink.colors = #FFF, #FFF, #FFF, #FFF, #2b0022, #FFF, #800066, #800066
-kune.wsthemes.highcontrast.backgrounds = #000055, #162d50, #00002b, #000055, #0000aa, #00112b, #b3b3b3, #162d50
+kune.wsthemes.highcontrast.backgrounds = #0c1f3d, #162d50, #000000, #0c2855, #162d50, #000000, #FFF, #162d50
kune.wsthemes.highcontrast.colors = #FFF, #FFF, #FFF, #FFF, #FFF, #FFF, #000, #FFF
-kune.wsthemes.whiteblack.backgrounds = #FFF, #FFF, #e6e6e6, #FFF, #FFF, #e6e6e6, #FFF, #FFF
+kune.wsthemes.whiteblack.backgrounds = #FFF, #FFF, #e3dbdb, #FFF, #FFF, #e3dbdb, #FFF, #FFF
kune.wsthemes.whiteblack.colors = #000, #000, #000, #000, #000, #000, #000, #000
-kune.wsthemes.blackwhite.backgrounds = #000, #000, #808080, #000, #000, #e6e6e6, #000, #000
-kune.wsthemes.blackwhite.colors = #FFF, #FFF, #000, #FFF, #FFF, #000, #FFF, #FFF
-kune.wsthemes.transparent.backgrounds = transparent, transparent, #e6e6e6, transparent, transparent, #e6e6e6, transparent, transparent
+kune.wsthemes.blackwhite.backgrounds = #000, #000, #808080, #000, #000, #e3dbdb, #FFF, #000
+kune.wsthemes.blackwhite.colors = #FFF, #FFF, #000, #FFF, #FFF, #000, #000, #FFF
+kune.wsthemes.transparent.backgrounds = transparent, transparent, #e3dbdb, transparent, transparent, #e3dbdb, transparent, transparent
kune.wsthemes.transparent.colors = #000, #000, #000, #000, #000, #000, #000, #000
### Gallery options
1
0
r1450 - in trunk/src/main: java/cc/kune/core/client/rpcservices java/cc/kune/core/client/sn/actions java/cc/kune/core/client/sn/actions/conditions java/cc/kune/core/client/sn/actions/registry java/cc/kune/core/public java/cc/kune/core/server/rpc webapp/others/splash/js
by Vicente J. Ruiz Jurado 13 Jul '11
by Vicente J. Ruiz Jurado 13 Jul '11
13 Jul '11
Author: vjrj_
Date: 2011-07-13 14:21:02 +0200 (Wed, 13 Jul 2011)
New Revision: 1450
Added:
trunk/src/main/java/cc/kune/core/client/sn/actions/UnJoinFromCurrentGroupAction.java
trunk/src/main/java/cc/kune/core/client/sn/actions/UnJoinFromThisGroupAction.java
trunk/src/main/java/cc/kune/core/client/sn/actions/conditions/ImPartOfGroupCondition.java
Removed:
trunk/src/main/java/cc/kune/core/client/sn/actions/UnJoinGroupAction.java
Modified:
trunk/src/main/java/cc/kune/core/client/rpcservices/SocialNetworkService.java
trunk/src/main/java/cc/kune/core/client/rpcservices/SocialNetworkServiceAsync.java
trunk/src/main/java/cc/kune/core/client/sn/actions/registry/GroupSNConfActions.java
trunk/src/main/java/cc/kune/core/client/sn/actions/registry/UserSNMenuItemsRegistry.java
trunk/src/main/java/cc/kune/core/public/ws.html
trunk/src/main/java/cc/kune/core/server/rpc/SocialNetworkRPC.java
trunk/src/main/webapp/others/splash/js/common_client.js
trunk/src/main/webapp/others/splash/js/permalink_client.js
Log:
gadget render when offline; Unjoin from personal page
Modified: trunk/src/main/java/cc/kune/core/client/rpcservices/SocialNetworkService.java
===================================================================
--- trunk/src/main/java/cc/kune/core/client/rpcservices/SocialNetworkService.java 2011-07-13 02:03:09 UTC (rev 1449)
+++ trunk/src/main/java/cc/kune/core/client/rpcservices/SocialNetworkService.java 2011-07-13 12:21:02 UTC (rev 1450)
@@ -30,33 +30,34 @@
@RemoteServiceRelativePath("SocialNetworkService")
public interface SocialNetworkService extends RemoteService {
- SocialNetworkDataDTO acceptJoinGroup(String hash, StateToken groupToken, String groupToAcceptShortName)
- throws DefaultException;
+ SocialNetworkDataDTO acceptJoinGroup(String hash, StateToken groupToken, String groupToAcceptShortName)
+ throws DefaultException;
- SocialNetworkDataDTO addAdminMember(String hash, StateToken groupToken, String groupToAddShortName)
- throws DefaultException;
+ SocialNetworkDataDTO addAdminMember(String hash, StateToken groupToken, String groupToAddShortName)
+ throws DefaultException;
- SocialNetworkDataDTO addCollabMember(String hash, StateToken groupToken, String groupToAddShortName)
- throws DefaultException;
+ SocialNetworkDataDTO addCollabMember(String hash, StateToken groupToken, String groupToAddShortName)
+ throws DefaultException;
- SocialNetworkDataDTO addViewerMember(String hash, StateToken groupToken, String groupToAddShortName)
- throws DefaultException;
+ SocialNetworkDataDTO addViewerMember(String hash, StateToken groupToken, String groupToAddShortName)
+ throws DefaultException;
- SocialNetworkDataDTO deleteMember(String hash, StateToken groupToken, String groupToDeleteShortName)
- throws DefaultException;
+ SocialNetworkDataDTO deleteMember(String hash, StateToken groupToken, String groupToDeleteShortName)
+ throws DefaultException;
- SocialNetworkDataDTO denyJoinGroup(String hash, StateToken groupToken, String groupToDenyShortName)
- throws DefaultException;
+ SocialNetworkDataDTO denyJoinGroup(String hash, StateToken groupToken, String groupToDenyShortName)
+ throws DefaultException;
- SocialNetworkDataDTO getSocialNetwork(String hash, StateToken groupToken) throws DefaultException;
+ SocialNetworkDataDTO getSocialNetwork(String hash, StateToken groupToken) throws DefaultException;
- SocialNetworkRequestResult requestJoinGroup(String hash, StateToken groupToken) throws DefaultException;
+ SocialNetworkRequestResult requestJoinGroup(String hash, StateToken groupToken)
+ throws DefaultException;
- SocialNetworkDataDTO setAdminAsCollab(String hash, StateToken groupToken, String groupToSetCollabShortName)
- throws DefaultException;
+ SocialNetworkDataDTO setAdminAsCollab(String hash, StateToken groupToken,
+ String groupToSetCollabShortName) throws DefaultException;
- SocialNetworkDataDTO setCollabAsAdmin(String hash, StateToken groupToken, String groupToSetAdminShortName)
- throws DefaultException;
+ SocialNetworkDataDTO setCollabAsAdmin(String hash, StateToken groupToken,
+ String groupToSetAdminShortName) throws DefaultException;
- SocialNetworkDataDTO unJoinGroup(String hash, StateToken groupToken) throws DefaultException;
+ void unJoinGroup(String hash, StateToken groupToken) throws DefaultException;
}
Modified: trunk/src/main/java/cc/kune/core/client/rpcservices/SocialNetworkServiceAsync.java
===================================================================
--- trunk/src/main/java/cc/kune/core/client/rpcservices/SocialNetworkServiceAsync.java 2011-07-13 02:03:09 UTC (rev 1449)
+++ trunk/src/main/java/cc/kune/core/client/rpcservices/SocialNetworkServiceAsync.java 2011-07-13 12:21:02 UTC (rev 1450)
@@ -19,7 +19,6 @@
*/
package cc.kune.core.client.rpcservices;
-
import cc.kune.core.shared.domain.utils.StateToken;
import cc.kune.core.shared.dto.SocialNetworkDataDTO;
import cc.kune.core.shared.dto.SocialNetworkRequestResult;
@@ -28,33 +27,34 @@
public interface SocialNetworkServiceAsync {
- void acceptJoinGroup(String hash, StateToken groupToken, String groupToAcceptShortName,
- AsyncCallback<SocialNetworkDataDTO> callback);
+ void acceptJoinGroup(String hash, StateToken groupToken, String groupToAcceptShortName,
+ AsyncCallback<SocialNetworkDataDTO> callback);
- void addAdminMember(String hash, StateToken groupToken, String groupToAddShortName,
- AsyncCallback<SocialNetworkDataDTO> callback);
+ void addAdminMember(String hash, StateToken groupToken, String groupToAddShortName,
+ AsyncCallback<SocialNetworkDataDTO> callback);
- void addCollabMember(String hash, StateToken groupToken, String groupToAddShortName,
- AsyncCallback<SocialNetworkDataDTO> callback);
+ void addCollabMember(String hash, StateToken groupToken, String groupToAddShortName,
+ AsyncCallback<SocialNetworkDataDTO> callback);
- void addViewerMember(String hash, StateToken groupToken, String groupToAddShortName,
- AsyncCallback<SocialNetworkDataDTO> callback);
+ void addViewerMember(String hash, StateToken groupToken, String groupToAddShortName,
+ AsyncCallback<SocialNetworkDataDTO> callback);
- void deleteMember(String hash, StateToken groupToken, String groupToDeleteShortName,
- AsyncCallback<SocialNetworkDataDTO> callback);
+ void deleteMember(String hash, StateToken groupToken, String groupToDeleteShortName,
+ AsyncCallback<SocialNetworkDataDTO> callback);
- void denyJoinGroup(String hash, StateToken groupToken, String groupToDenyShortName,
- AsyncCallback<SocialNetworkDataDTO> callback);
+ void denyJoinGroup(String hash, StateToken groupToken, String groupToDenyShortName,
+ AsyncCallback<SocialNetworkDataDTO> callback);
- void getSocialNetwork(String hash, StateToken groupToken, AsyncCallback<SocialNetworkDataDTO> callback);
+ void getSocialNetwork(String hash, StateToken groupToken, AsyncCallback<SocialNetworkDataDTO> callback);
- void requestJoinGroup(String hash, StateToken groupToken, AsyncCallback<SocialNetworkRequestResult> callback);
+ void requestJoinGroup(String hash, StateToken groupToken,
+ AsyncCallback<SocialNetworkRequestResult> callback);
- void setAdminAsCollab(String hash, StateToken groupToken, String groupToSetCollabShortName,
- AsyncCallback<SocialNetworkDataDTO> callback);
+ void setAdminAsCollab(String hash, StateToken groupToken, String groupToSetCollabShortName,
+ AsyncCallback<SocialNetworkDataDTO> callback);
- void setCollabAsAdmin(String hash, StateToken groupToken, String groupToSetAdminShortName,
- AsyncCallback<SocialNetworkDataDTO> callback);
+ void setCollabAsAdmin(String hash, StateToken groupToken, String groupToSetAdminShortName,
+ AsyncCallback<SocialNetworkDataDTO> callback);
- void unJoinGroup(String hash, StateToken groupToken, AsyncCallback<SocialNetworkDataDTO> callback);
+ void unJoinGroup(String hash, StateToken groupToken, AsyncCallback<Void> callback);
}
Added: trunk/src/main/java/cc/kune/core/client/sn/actions/UnJoinFromCurrentGroupAction.java
===================================================================
--- trunk/src/main/java/cc/kune/core/client/sn/actions/UnJoinFromCurrentGroupAction.java (rev 0)
+++ trunk/src/main/java/cc/kune/core/client/sn/actions/UnJoinFromCurrentGroupAction.java 2011-07-13 12:21:02 UTC (rev 1450)
@@ -0,0 +1,73 @@
+/*
+ *
+ * Copyright (C) 2007-2011 The kune development team (see CREDITS for details)
+ * This file is part of kune.
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as
+ * published by the Free Software Foundation, either version 3 of the
+ * License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ *
+ */
+package cc.kune.core.client.sn.actions;
+
+import cc.kune.common.client.actions.Action;
+import cc.kune.common.client.actions.ActionEvent;
+import cc.kune.common.client.notify.NotifyUser;
+import cc.kune.common.client.utils.OnAcceptCallback;
+import cc.kune.core.client.resources.CoreResources;
+import cc.kune.core.client.rpcservices.AsyncCallbackSimple;
+import cc.kune.core.client.rpcservices.SocialNetworkServiceAsync;
+import cc.kune.core.client.state.AccessRightsClientManager;
+import cc.kune.core.client.state.Session;
+import cc.kune.core.client.state.StateManager;
+import cc.kune.core.shared.dto.AccessRolDTO;
+import cc.kune.core.shared.i18n.I18nTranslationService;
+
+import com.google.inject.Inject;
+import com.google.inject.Provider;
+
+public class UnJoinFromCurrentGroupAction extends SNRolAction {
+
+ @Inject
+ public UnJoinFromCurrentGroupAction(final StateManager stateManager, final Session session,
+ final I18nTranslationService i18n, final CoreResources res,
+ final Provider<SocialNetworkServiceAsync> snServiceProvider,
+ final AccessRightsClientManager rightsClientManager) {
+ super(stateManager, session, i18n, res, snServiceProvider, rightsClientManager, AccessRolDTO.Editor,
+ true, false, true);
+ putValue(NAME, i18n.t("Leave this group"));
+ putValue(SHORT_DESCRIPTION, i18n.t("Do not participate anymore in this group"));
+ putValue(Action.SMALL_ICON, res.del());
+ putValue(Action.STYLES, "k-sn-join");
+ }
+
+ @Override
+ public void actionPerformed(final ActionEvent event) {
+ NotifyUser.askConfirmation(i18n.t("Leave this group"), i18n.t("Are you sure?"),
+ new OnAcceptCallback() {
+ @Override
+ public void onSuccess() {
+ NotifyUser.showProgressProcessing();
+ snServiceProvider.get().unJoinGroup(session.getUserHash(),
+ session.getCurrentState().getStateToken(), new AsyncCallbackSimple<Void>() {
+ @Override
+ public void onSuccess(final Void result) {
+ NotifyUser.hideProgress();
+ NotifyUser.info(i18n.t("Removed as member"));
+ stateManager.refreshCurrentGroupState();
+ }
+ });
+ }
+ });
+ }
+
+}
\ No newline at end of file
Added: trunk/src/main/java/cc/kune/core/client/sn/actions/UnJoinFromThisGroupAction.java
===================================================================
--- trunk/src/main/java/cc/kune/core/client/sn/actions/UnJoinFromThisGroupAction.java (rev 0)
+++ trunk/src/main/java/cc/kune/core/client/sn/actions/UnJoinFromThisGroupAction.java 2011-07-13 12:21:02 UTC (rev 1450)
@@ -0,0 +1,83 @@
+/*
+ *
+ * Copyright (C) 2007-2011 The kune development team (see CREDITS for details)
+ * This file is part of kune.
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as
+ * published by the Free Software Foundation, either version 3 of the
+ * License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ *
+ */
+package cc.kune.core.client.sn.actions;
+
+import cc.kune.common.client.actions.Action;
+import cc.kune.common.client.actions.ActionEvent;
+import cc.kune.common.client.notify.NotifyUser;
+import cc.kune.common.client.utils.OnAcceptCallback;
+import cc.kune.core.client.actions.RolAction;
+import cc.kune.core.client.resources.CoreResources;
+import cc.kune.core.client.rpcservices.AsyncCallbackSimple;
+import cc.kune.core.client.rpcservices.SocialNetworkServiceAsync;
+import cc.kune.core.client.state.AccessRightsClientManager;
+import cc.kune.core.client.state.Session;
+import cc.kune.core.client.state.StateManager;
+import cc.kune.core.shared.dto.AccessRolDTO;
+import cc.kune.core.shared.dto.GroupDTO;
+import cc.kune.core.shared.i18n.I18nTranslationService;
+
+import com.google.inject.Inject;
+import com.google.inject.Provider;
+
+public class UnJoinFromThisGroupAction extends RolAction {
+
+ private final I18nTranslationService i18n;
+ private final Session session;
+ private final Provider<SocialNetworkServiceAsync> snServiceProvider;
+ private final StateManager stateManager;
+
+ @Inject
+ public UnJoinFromThisGroupAction(final StateManager stateManager, final Session session,
+ final I18nTranslationService i18n, final CoreResources res,
+ final Provider<SocialNetworkServiceAsync> snServiceProvider,
+ final AccessRightsClientManager rightsClientManager) {
+ super(AccessRolDTO.Editor, true);
+ this.stateManager = stateManager;
+ this.session = session;
+ this.i18n = i18n;
+ this.snServiceProvider = snServiceProvider;
+ putValue(NAME, i18n.t("Leave this group"));
+ putValue(SHORT_DESCRIPTION, i18n.t("Do not participate anymore in this group"));
+ putValue(Action.SMALL_ICON, res.del());
+ putValue(Action.STYLES, "k-sn-join");
+ }
+
+ @Override
+ public void actionPerformed(final ActionEvent event) {
+ NotifyUser.askConfirmation(i18n.t("Leave this group"), i18n.t("Are you sure?"),
+ new OnAcceptCallback() {
+ @Override
+ public void onSuccess() {
+ NotifyUser.showProgressProcessing();
+ snServiceProvider.get().unJoinGroup(session.getUserHash(),
+ ((GroupDTO) event.getTarget()).getStateToken(), new AsyncCallbackSimple<Void>() {
+ @Override
+ public void onSuccess(final Void result) {
+ NotifyUser.hideProgress();
+ NotifyUser.info(i18n.t("Removed as member"));
+ stateManager.refreshCurrentGroupState();
+ }
+ });
+ }
+ });
+ }
+
+}
\ No newline at end of file
Deleted: trunk/src/main/java/cc/kune/core/client/sn/actions/UnJoinGroupAction.java
===================================================================
--- trunk/src/main/java/cc/kune/core/client/sn/actions/UnJoinGroupAction.java 2011-07-13 02:03:09 UTC (rev 1449)
+++ trunk/src/main/java/cc/kune/core/client/sn/actions/UnJoinGroupAction.java 2011-07-13 12:21:02 UTC (rev 1450)
@@ -1,75 +0,0 @@
-/*
- *
- * Copyright (C) 2007-2011 The kune development team (see CREDITS for details)
- * This file is part of kune.
- *
- * This program is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Affero General Public License as
- * published by the Free Software Foundation, either version 3 of the
- * License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU Affero General Public License for more details.
- *
- * You should have received a copy of the GNU Affero General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- *
- */
-package cc.kune.core.client.sn.actions;
-
-import cc.kune.common.client.actions.Action;
-import cc.kune.common.client.actions.ActionEvent;
-import cc.kune.common.client.notify.NotifyUser;
-import cc.kune.common.client.utils.OnAcceptCallback;
-import cc.kune.core.client.resources.CoreResources;
-import cc.kune.core.client.rpcservices.AsyncCallbackSimple;
-import cc.kune.core.client.rpcservices.SocialNetworkServiceAsync;
-import cc.kune.core.client.state.AccessRightsClientManager;
-import cc.kune.core.client.state.Session;
-import cc.kune.core.client.state.StateManager;
-import cc.kune.core.shared.dto.AccessRolDTO;
-import cc.kune.core.shared.dto.SocialNetworkDataDTO;
-import cc.kune.core.shared.i18n.I18nTranslationService;
-
-import com.google.inject.Inject;
-import com.google.inject.Provider;
-
-public class UnJoinGroupAction extends SNRolAction {
-
- @Inject
- public UnJoinGroupAction(final StateManager stateManager, final Session session, final I18nTranslationService i18n,
- final CoreResources res, final Provider<SocialNetworkServiceAsync> snServiceProvider,
- final AccessRightsClientManager rightsClientManager) {
- super(stateManager, session, i18n, res, snServiceProvider, rightsClientManager, AccessRolDTO.Editor, true,
- false, true);
- putValue(NAME, i18n.t("Leave this group"));
- putValue(SHORT_DESCRIPTION, i18n.t("Do not participate anymore in this group"));
- putValue(Action.SMALL_ICON, res.del());
- putValue(Action.STYLES, "k-sn-join");
- }
-
- @Override
- public void actionPerformed(final ActionEvent event) {
- NotifyUser.askConfirmation(i18n.t("Leave this group"), i18n.t("Are you sure?"), new OnAcceptCallback() {
- @Override
- public void onSuccess() {
- NotifyUser.showProgressProcessing();
- snServiceProvider.get().unJoinGroup(session.getUserHash(), session.getCurrentState().getStateToken(),
- new AsyncCallbackSimple<SocialNetworkDataDTO>() {
- @Override
- public void onSuccess(final SocialNetworkDataDTO result) {
- NotifyUser.hideProgress();
- NotifyUser.info(i18n.t("Removed as member"));
- stateManager.refreshCurrentGroupState();
- // in the future with user info:
- // stateManager.reloadSocialNetwork((SocialNetworkResultDTO)
- // result);
- }
- });
- }
- });
- }
-
-}
\ No newline at end of file
Added: trunk/src/main/java/cc/kune/core/client/sn/actions/conditions/ImPartOfGroupCondition.java
===================================================================
--- trunk/src/main/java/cc/kune/core/client/sn/actions/conditions/ImPartOfGroupCondition.java (rev 0)
+++ trunk/src/main/java/cc/kune/core/client/sn/actions/conditions/ImPartOfGroupCondition.java 2011-07-13 12:21:02 UTC (rev 1450)
@@ -0,0 +1,60 @@
+/*
+ *
+ * Copyright (C) 2007-2011 The kune development team (see CREDITS for details)
+ * This file is part of kune.
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as
+ * published by the Free Software Foundation, either version 3 of the
+ * License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ *
+ */
+package cc.kune.core.client.sn.actions.conditions;
+
+import cc.kune.common.client.actions.ui.descrip.GuiActionDescrip;
+import cc.kune.common.client.actions.ui.descrip.GuiAddCondition;
+import cc.kune.core.client.state.Session;
+import cc.kune.core.shared.dto.GroupDTO;
+import cc.kune.core.shared.dto.UserSimpleDTO;
+
+import com.google.inject.Inject;
+import com.google.inject.Singleton;
+
+@Singleton
+public class ImPartOfGroupCondition implements GuiAddCondition {
+
+ private final Session session;
+
+ @Inject
+ public ImPartOfGroupCondition(final Session session) {
+ this.session = session;
+ }
+
+ @Override
+ public boolean mustBeAdded(final GuiActionDescrip descr) {
+ final Object target = descr.getTarget();
+ if (target instanceof UserSimpleDTO) {
+ return false;
+ }
+ final GroupDTO targetGroup = (GroupDTO) target;
+ for (final GroupDTO adminIn : session.getCurrentUserInfo().getGroupsIsAdmin()) {
+ if (adminIn.equals(targetGroup)) {
+ return true;
+ }
+ }
+ for (final GroupDTO collabIn : session.getCurrentUserInfo().getGroupsIsCollab()) {
+ if (collabIn.equals(targetGroup)) {
+ return true;
+ }
+ }
+ return false;
+ }
+}
Modified: trunk/src/main/java/cc/kune/core/client/sn/actions/registry/GroupSNConfActions.java
===================================================================
--- trunk/src/main/java/cc/kune/core/client/sn/actions/registry/GroupSNConfActions.java 2011-07-13 02:03:09 UTC (rev 1449)
+++ trunk/src/main/java/cc/kune/core/client/sn/actions/registry/GroupSNConfActions.java 2011-07-13 12:21:02 UTC (rev 1450)
@@ -30,7 +30,7 @@
import cc.kune.core.client.sn.actions.JoinGroupAction;
import cc.kune.core.client.sn.actions.MembersModerationMenuItem;
import cc.kune.core.client.sn.actions.MembersVisibilityMenuItem;
-import cc.kune.core.client.sn.actions.UnJoinGroupAction;
+import cc.kune.core.client.sn.actions.UnJoinFromCurrentGroupAction;
import cc.kune.core.client.sn.actions.conditions.IsGroupCondition;
import cc.kune.core.client.sn.actions.conditions.IsLoggedCondition;
import cc.kune.core.client.state.Session;
@@ -66,7 +66,7 @@
final I18nTranslationService i18n, final Provider<MembersVisibilityMenuItem> membersVisibility,
final Provider<MembersModerationMenuItem> membersModeration, final CoreResources res,
final IsLoggedCondition isLoggedCondition, final JoinGroupAction joinGroupAction,
- final IsGroupCondition isGroupCondition, final UnJoinGroupAction unJoinGroupAction) {
+ final IsGroupCondition isGroupCondition, final UnJoinFromCurrentGroupAction unJoinGroupAction) {
OPTIONS_MENU.withToolTip(i18n.t("Options")).withIcon(res.arrowdownsitebar()).withStyles(
OPTIONS_STYLES);
final GuiActionDescrip optionsTitle = new MenuTitleItemDescriptor(i18n.t("Options")).withParent(OPTIONS_MENU);
@@ -132,7 +132,6 @@
closedItem.setChecked(true);
break;
}
- unJoinBtn.setVisible(session.isLogged());
}
});
}
Modified: trunk/src/main/java/cc/kune/core/client/sn/actions/registry/UserSNMenuItemsRegistry.java
===================================================================
--- trunk/src/main/java/cc/kune/core/client/sn/actions/registry/UserSNMenuItemsRegistry.java 2011-07-13 02:03:09 UTC (rev 1449)
+++ trunk/src/main/java/cc/kune/core/client/sn/actions/registry/UserSNMenuItemsRegistry.java 2011-07-13 12:21:02 UTC (rev 1450)
@@ -28,7 +28,8 @@
import cc.kune.core.client.sn.actions.GotoPersonAction;
import cc.kune.core.client.sn.actions.GotoYourHomePageAction;
import cc.kune.core.client.sn.actions.RemoveMemberAction;
-import cc.kune.core.client.sn.actions.UnJoinGroupAction;
+import cc.kune.core.client.sn.actions.UnJoinFromThisGroupAction;
+import cc.kune.core.client.sn.actions.conditions.ImPartOfGroupCondition;
import cc.kune.core.client.sn.actions.conditions.IsCurrentStateAdministrableCondition;
import cc.kune.core.client.sn.actions.conditions.IsGroupCondition;
import cc.kune.core.client.sn.actions.conditions.IsLoggedCondition;
@@ -47,12 +48,13 @@
public UserSNMenuItemsRegistry(final Session session,
final IsCurrentStateAdministrableCondition isAdministrableCondition,
final IsPersonCondition isPersonCondition, final IsGroupCondition isGroupCondition,
- final IsLoggedCondition isLoggedCondition, final IsMeCondition isMe,
- final IsNotMeCondition isNotMe, final ChangeToCollabAction changeToCollabAction,
- final ChangeToAdminAction changeToAdminAction, final RemoveMemberAction removeMemberAction,
- final AcceptJoinGroupAction acceptJoinGroupAction, final DenyJoinGroupAction denyJoinGroupAction,
- final GotoGroupAction gotoGroupAction, final GotoPersonAction gotoPersonAction,
- final UnJoinGroupAction unjoinAction, final GotoYourHomePageAction gotoYourHomePageAction) {
+ final ImPartOfGroupCondition imPartOfGroup, final IsLoggedCondition isLoggedCondition,
+ final IsMeCondition isMe, final IsNotMeCondition isNotMe,
+ final ChangeToCollabAction changeToCollabAction, final ChangeToAdminAction changeToAdminAction,
+ final RemoveMemberAction removeMemberAction, final AcceptJoinGroupAction acceptJoinGroupAction,
+ final DenyJoinGroupAction denyJoinGroupAction, final GotoGroupAction gotoGroupAction,
+ final GotoPersonAction gotoPersonAction, final UnJoinFromThisGroupAction unjoinAction,
+ final GotoYourHomePageAction gotoYourHomePageAction) {
add(new Provider<MenuItemDescriptor>() {
@Override
public MenuItemDescriptor get() {
@@ -81,14 +83,15 @@
});
// This doesn't works, because its unregister from current state not
// from target group
- // add(new Provider<MenuItemDescriptor>() {
- // @Override
- // public MenuItemDescriptor get() {
- // final MenuItemDescriptor item = new MenuItemDescriptor(unjoinAction);
- // item.add(isLoggedCondition);
- // item.add(isGroupCondition);
- // return item;
- // }
- // });
+ add(new Provider<MenuItemDescriptor>() {
+ @Override
+ public MenuItemDescriptor get() {
+ final MenuItemDescriptor item = new MenuItemDescriptor(unjoinAction);
+ item.add(isLoggedCondition);
+ item.add(isGroupCondition);
+ item.add(imPartOfGroup);
+ return item;
+ }
+ });
}
}
Modified: trunk/src/main/java/cc/kune/core/public/ws.html
===================================================================
--- trunk/src/main/java/cc/kune/core/public/ws.html 2011-07-13 02:03:09 UTC (rev 1449)
+++ trunk/src/main/java/cc/kune/core/public/ws.html 2011-07-13 12:21:02 UTC (rev 1450)
@@ -58,7 +58,7 @@
<script type="text/javascript" src="/others/splash/js/gadget.js"></script>
<script type="text/javascript" src="/others/splash/js/rpc.js"></script>
<script type="text/javascript" src="/others/splash/js/common_client.js"></script>
-<script type="text/javascript" src="/others/splash/js/permalink_client.js"></script>
+<!-- <script type="text/javascript" src="/others/splash/js/permalink_client.js"></script> -->
<script type="text/javascript" src="http://wave.google.com/gadgets/js/core:rpc.js?c=1"></script>
<style type="text/css">
Modified: trunk/src/main/java/cc/kune/core/server/rpc/SocialNetworkRPC.java
===================================================================
--- trunk/src/main/java/cc/kune/core/server/rpc/SocialNetworkRPC.java 2011-07-13 02:03:09 UTC (rev 1449)
+++ trunk/src/main/java/cc/kune/core/server/rpc/SocialNetworkRPC.java 2011-07-13 12:21:02 UTC (rev 1450)
@@ -220,14 +220,12 @@
@Override
@Authenticated
@Transactional
- public SocialNetworkDataDTO unJoinGroup(final String hash, final StateToken groupToken)
- throws DefaultException {
+ public void unJoinGroup(final String hash, final StateToken groupToken) throws DefaultException {
final UserSession userSession = getUserSession();
final User userLogged = userSession.getUser();
final Group group = groupManager.findByShortName(groupToken.getGroup());
checkIsNotPersonalGroup(group);
socialNetworkManager.unJoinGroup(userLogged.getUserGroup(), group);
- return generateResponse(userLogged, group);
}
}
Modified: trunk/src/main/webapp/others/splash/js/common_client.js
===================================================================
--- trunk/src/main/webapp/others/splash/js/common_client.js 2011-07-13 02:03:09 UTC (rev 1449)
+++ trunk/src/main/webapp/others/splash/js/common_client.js 2011-07-13 12:21:02 UTC (rev 1450)
@@ -125,6 +125,6 @@
}
});
- initEditor();
+ // initEditor();
initGadgetSystem();
}
Modified: trunk/src/main/webapp/others/splash/js/permalink_client.js
===================================================================
--- trunk/src/main/webapp/others/splash/js/permalink_client.js 2011-07-13 02:03:09 UTC (rev 1449)
+++ trunk/src/main/webapp/others/splash/js/permalink_client.js 2011-07-13 12:21:02 UTC (rev 1450)
@@ -96,11 +96,11 @@
var rpc = window.wave.Rpc.getInstance();
initGadgetSystem();
- rpc.rpcOpenWave();
+// rpc.rpcOpenWave();
- setInterval(function() {
+ //setInterval(function() {
// This is needed to specify the scope of the function.
- window.wave.Rpc.getInstance().rpcAsyncUpdate();
- }, RPC_UPDATE_INTERVAL_MS);
+ // window.wave.Rpc.getInstance().rpcAsyncUpdate();
+ //}, RPC_UPDATE_INTERVAL_MS);
});
1
0
r1449 - in trunk: . src/main/java/cc/kune/chat/client src/main/java/cc/kune/common/client/tooltip src/main/java/cc/kune/common/client/ui src/main/java/cc/kune/core/client/actions/xml src/main/java/cc/kune/core/public src/main/webapp/others src/test/java/com/google/wave/splash/text
by Vicente J. Ruiz Jurado 13 Jul '11
by Vicente J. Ruiz Jurado 13 Jul '11
13 Jul '11
Author: vjrj_
Date: 2011-07-13 04:03:09 +0200 (Wed, 13 Jul 2011)
New Revision: 1449
Modified:
trunk/.classpath
trunk/src/main/java/cc/kune/chat/client/AvatarDecoratorImpl.java
trunk/src/main/java/cc/kune/chat/client/MediumAvatarDecoratorImpl.java
trunk/src/main/java/cc/kune/chat/client/SmallAvatarDecoratorImpl.java
trunk/src/main/java/cc/kune/common/client/tooltip/TooltipPosition.java
trunk/src/main/java/cc/kune/common/client/ui/AbstractDecorator.java
trunk/src/main/java/cc/kune/common/client/ui/AbstractDecorator.ui.xml
trunk/src/main/java/cc/kune/common/client/ui/EditableLabel.java
trunk/src/main/java/cc/kune/core/client/actions/xml/NewGadgetAction.java
trunk/src/main/java/cc/kune/core/client/actions/xml/XMLActionsParser.java
trunk/src/main/java/cc/kune/core/public/ws.html
trunk/src/main/webapp/others/kune-client-actions.xml
trunk/src/test/java/com/google/wave/splash/text/ContentNewUnrendererTest.java
Log:
Gadget list JP improved; Title blinks on gadget add; Tooltip fix ; Tooltip for xmpp status
Modified: trunk/.classpath
===================================================================
--- trunk/.classpath 2011-07-12 17:32:54 UTC (rev 1448)
+++ trunk/.classpath 2011-07-13 02:03:09 UTC (rev 1449)
@@ -1,153 +1,155 @@
+<?xml version="1.0" encoding="UTF-8"?>
<classpath>
- <classpathentry kind="src" path="src/test/java" output="target/test-classes" including="**/*.java"/>
- <classpathentry kind="src" path="src/main/java" including="**/*.java"/>
- <classpathentry kind="src" path="src/main/resources" excluding="**/*.java"/>
- <classpathentry kind="output" path="target/kune-0.0.8/WEB-INF/classes"/>
- <classpathentry kind="var" path="M2_REPO/javax/inject/javax.inject/1/javax.inject-1.jar" sourcepath="M2_REPO/javax/inject/javax.inject/1/javax.inject-1-sources.jar"/>
- <classpathentry kind="var" path="M2_REPO/javax/transaction/jta/1.1/jta-1.1.jar" sourcepath="M2_REPO/javax/transaction/jta/1.1/jta-1.1-sources.jar"/>
- <classpathentry kind="var" path="M2_REPO/javax/persistence/persistence-api/1.0/persistence-api-1.0.jar" sourcepath="M2_REPO/javax/persistence/persistence-api/1.0/persistence-api-1.0-sources.jar"/>
- <classpathentry kind="var" path="M2_REPO/javax/servlet/servlet-api/2.5/servlet-api-2.5.jar" sourcepath="M2_REPO/javax/servlet/servlet-api/2.5/servlet-api-2.5-sources.jar"/>
- <classpathentry kind="var" path="M2_REPO/antlr/antlr/2.7.6/antlr-2.7.6.jar" sourcepath="M2_REPO/antlr/antlr/2.7.6/antlr-2.7.6-sources.jar"/>
- <classpathentry kind="var" path="M2_REPO/aopalliance/aopalliance/1.0/aopalliance-1.0.jar" sourcepath="M2_REPO/aopalliance/aopalliance/1.0/aopalliance-1.0-sources.jar"/>
- <classpathentry kind="var" path="M2_REPO/com/google/appengine/appengine-api-1.0-sdk/1.3.1/appengine-api-1.0-sdk-1.3.1.jar"/>
- <classpathentry kind="var" path="M2_REPO/avalon-framework/avalon-framework/4.1.3/avalon-framework-4.1.3.jar"/>
- <classpathentry kind="var" path="M2_REPO/org/waveprotocol/box/0.3.1-SNAPSHOT/box-0.3.1-SNAPSHOT.jar"/>
- <classpathentry kind="var" path="M2_REPO/org/waveprotocol/box-src/0.3.1-SNAPSHOT/box-src-0.3.1-SNAPSHOT.jar"/>
- <classpathentry kind="var" path="M2_REPO/org/beanshell/bsh/2.0b4/bsh-2.0b4.jar"/>
- <classpathentry kind="var" path="M2_REPO/c3p0/c3p0/0.9.1/c3p0-0.9.1.jar" sourcepath="M2_REPO/c3p0/c3p0/0.9.1/c3p0-0.9.1-sources.jar"/>
- <classpathentry kind="var" path="M2_REPO/classworlds/classworlds/1.1-alpha-2/classworlds-1.1-alpha-2.jar"/>
- <classpathentry kind="var" path="M2_REPO/org/waveprotocol/client/0.3.1-SNAPSHOT/client-0.3.1-SNAPSHOT.jar"/>
- <classpathentry kind="var" path="M2_REPO/org/waveprotocol/client-common/0.3.1-SNAPSHOT/client-common-0.3.1-SNAPSHOT.jar"/>
- <classpathentry kind="var" path="M2_REPO/org/waveprotocol/client-common-src/0.3.1-SNAPSHOT/client-common-src-0.3.1-SNAPSHOT.jar"/>
- <classpathentry kind="var" path="M2_REPO/org/waveprotocol/client-scheduler-src/0.3.1-SNAPSHOT/client-scheduler-src-0.3.1-SNAPSHOT.jar"/>
- <classpathentry kind="var" path="M2_REPO/org/waveprotocol/client-src/0.3.1-SNAPSHOT/client-src-0.3.1-SNAPSHOT.jar"/>
- <classpathentry kind="var" path="M2_REPO/org/cobogw/gwt/cobogw/1.3.1/cobogw-1.3.1.jar"/>
- <classpathentry kind="var" path="M2_REPO/org/waveprotocol/common-src/0.3.1-SNAPSHOT/common-src-0.3.1-SNAPSHOT.jar"/>
- <classpathentry kind="var" path="M2_REPO/commons-beanutils/commons-beanutils/1.7.0/commons-beanutils-1.7.0.jar" sourcepath="M2_REPO/commons-beanutils/commons-beanutils/1.7.0/commons-beanutils-1.7.0-sources.jar"/>
- <classpathentry kind="var" path="M2_REPO/commons-cli/commons-cli/1.2/commons-cli-1.2.jar" sourcepath="M2_REPO/commons-cli/commons-cli/1.2/commons-cli-1.2-sources.jar"/>
- <classpathentry kind="var" path="M2_REPO/commons-codec/commons-codec/1.4/commons-codec-1.4.jar" sourcepath="M2_REPO/commons-codec/commons-codec/1.4/commons-codec-1.4-sources.jar"/>
- <classpathentry kind="var" path="M2_REPO/commons-collections/commons-collections/3.2/commons-collections-3.2.jar" sourcepath="M2_REPO/commons-collections/commons-collections/3.2/commons-collections-3.2-sources.jar"/>
- <classpathentry kind="var" path="M2_REPO/commons-fileupload/commons-fileupload/1.2/commons-fileupload-1.2.jar" sourcepath="M2_REPO/commons-fileupload/commons-fileupload/1.2/commons-fileupload-1.2-sources.jar"/>
- <classpathentry kind="var" path="M2_REPO/commons-httpclient/commons-httpclient/3.1/commons-httpclient-3.1.jar"/>
- <classpathentry kind="var" path="M2_REPO/commons-io/commons-io/1.3.1/commons-io-1.3.1.jar" sourcepath="M2_REPO/commons-io/commons-io/1.3.1/commons-io-1.3.1-sources.jar"/>
- <classpathentry kind="var" path="M2_REPO/commons-lang/commons-lang/2.5/commons-lang-2.5.jar" sourcepath="M2_REPO/commons-lang/commons-lang/2.5/commons-lang-2.5-sources.jar"/>
- <classpathentry kind="var" path="M2_REPO/commons-logging/commons-logging/1.1/commons-logging-1.1.jar" sourcepath="M2_REPO/commons-logging/commons-logging/1.1/commons-logging-1.1-sources.jar"/>
- <classpathentry kind="var" path="M2_REPO/org/waveprotocol/communication-src/0.3.1-SNAPSHOT/communication-src-0.3.1-SNAPSHOT.jar"/>
- <classpathentry kind="var" path="M2_REPO/org/waveprotocol/concurrencycontrol-src/0.3.1-SNAPSHOT/concurrencycontrol-src-0.3.1-SNAPSHOT.jar"/>
- <classpathentry kind="var" path="M2_REPO/net/sourceforge/htmlunit/crawl_htmlunit/r5662-gae/crawl_htmlunit-r5662-gae.jar"/>
- <classpathentry kind="var" path="M2_REPO/net/sourceforge/cssparser/cssparser/0.9.5/cssparser-0.9.5.jar" sourcepath="M2_REPO/net/sourceforge/cssparser/cssparser/0.9.5/cssparser-0.9.5-sources.jar"/>
- <classpathentry kind="var" path="M2_REPO/dom4j/dom4j/1.6.1/dom4j-1.6.1.jar" sourcepath="M2_REPO/dom4j/dom4j/1.6.1/dom4j-1.6.1-sources.jar"/>
- <classpathentry kind="var" path="M2_REPO/net/sf/dozer/dozer/4.0/dozer-4.0.jar" sourcepath="M2_REPO/net/sf/dozer/dozer/4.0/dozer-4.0-sources.jar"/>
- <classpathentry kind="var" path="M2_REPO/org/hibernate/ejb3-persistence/1.0.2.GA/ejb3-persistence-1.0.2.GA.jar" sourcepath="M2_REPO/org/hibernate/ejb3-persistence/1.0.2.GA/ejb3-persistence-1.0.2.GA-sources.jar"/>
- <classpathentry kind="var" path="M2_REPO/com/calclab/emite/emite/r1694/emite-r1694.jar"/>
- <classpathentry kind="var" path="M2_REPO/com/calclab/emite/emite-proxy/0.1/emite-proxy-0.1.jar"/>
- <classpathentry kind="var" path="M2_REPO/net/sf/ezmorph/ezmorph/1.0.3/ezmorph-1.0.3.jar" sourcepath="M2_REPO/net/sf/ezmorph/ezmorph/1.0.3/ezmorph-1.0.3-sources.jar"/>
- <classpathentry kind="var" path="M2_REPO/freemarker/freemarker/2.3.8/freemarker-2.3.8.jar"/>
- <classpathentry kind="var" path="M2_REPO/com/google/guava/guava-gwt/r09/guava-gwt-r09.jar"/>
- <classpathentry kind="var" path="M2_REPO/com/google/inject/guice/3.0/guice-3.0.jar" sourcepath="M2_REPO/com/google/inject/guice/3.0/guice-3.0-sources.jar"/>
- <classpathentry kind="var" path="M2_REPO/com/google/inject/extensions/guice-assisted-inject/2.0/guice-assisted-inject-2.0.jar"/>
- <classpathentry kind="var" path="M2_REPO/com/google/inject/extensions/guice-persist/3.0/guice-persist-3.0.jar" sourcepath="M2_REPO/com/google/inject/extensions/guice-persist/3.0/guice-persist-3.0-sources.jar"/>
- <classpathentry kind="var" path="M2_REPO/com/google/inject/extensions/guice-servlet/3.0/guice-servlet-3.0.jar" sourcepath="M2_REPO/com/google/inject/extensions/guice-servlet/3.0/guice-servlet-3.0-sources.jar"/>
- <classpathentry kind="var" path="M2_REPO/org/adamtacy/gwt-fx/r464/gwt-fx-r464.jar"/>
- <classpathentry kind="var" path="M2_REPO/com/google/gwt/gwt-gin/1.0-r137/gwt-gin-1.0-r137.jar"/>
- <classpathentry kind="var" path="M2_REPO/com/allen_sauer/gwt/log/gwt-log/gwt-log/3.0.1/gwt-log-3.0.1.jar"/>
- <classpathentry kind="var" path="M2_REPO/com/google/gwt/gwt-servlet/2.1.1/gwt-servlet-2.1.1.jar" sourcepath="M2_REPO/com/google/gwt/gwt-servlet/2.1.1/gwt-servlet-2.1.1-sources.jar"/>
- <classpathentry kind="var" path="M2_REPO/com/google/gwt/gwt-user/2.1.1/gwt-user-2.1.1.jar" sourcepath="M2_REPO/com/google/gwt/gwt-user/2.1.1/gwt-user-2.1.1-sources.jar"/>
- <classpathentry kind="var" path="M2_REPO/org/waveprotocol/gwt-util-src/0.3.1-SNAPSHOT/gwt-util-src-0.3.1-SNAPSHOT.jar"/>
- <classpathentry kind="var" path="M2_REPO/com/allen_sauer/gwt/voices/gwt-voices/gwt-voices/2.0.0/gwt-voices-2.0.0.jar"/>
- <classpathentry kind="var" path="M2_REPO/com/gwtext/gwtext/2.0.5/gwtext-2.0.5.jar"/>
- <classpathentry kind="var" path="M2_REPO/com/gwtextux/gwtextux/0.4.0.924/gwtextux-0.4.0.924.jar"/>
- <classpathentry kind="var" path="M2_REPO/com/gwtplatform/gwtp-all/0.5/gwtp-all-0.5.jar" sourcepath="M2_REPO/com/gwtplatform/gwtp-all/0.5/gwtp-all-0.5-sources.jar"/>
- <classpathentry kind="var" path="M2_REPO/com/gwtplatform/gwtp-clients-common/0.5/gwtp-clients-common-0.5.jar" sourcepath="M2_REPO/com/gwtplatform/gwtp-clients-common/0.5/gwtp-clients-common-0.5-sources.jar"/>
- <classpathentry kind="var" path="M2_REPO/com/gwtplatform/gwtp-crawler/0.5/gwtp-crawler-0.5.jar" sourcepath="M2_REPO/com/gwtplatform/gwtp-crawler/0.5/gwtp-crawler-0.5-sources.jar"/>
- <classpathentry kind="var" path="M2_REPO/com/gwtplatform/gwtp-dispatch-client/0.5/gwtp-dispatch-client-0.5.jar" sourcepath="M2_REPO/com/gwtplatform/gwtp-dispatch-client/0.5/gwtp-dispatch-client-0.5-sources.jar"/>
- <classpathentry kind="var" path="M2_REPO/com/gwtplatform/gwtp-dispatch-server/0.5/gwtp-dispatch-server-0.5.jar" sourcepath="M2_REPO/com/gwtplatform/gwtp-dispatch-server/0.5/gwtp-dispatch-server-0.5-sources.jar"/>
- <classpathentry kind="var" path="M2_REPO/com/gwtplatform/gwtp-dispatch-shared/0.5/gwtp-dispatch-shared-0.5.jar" sourcepath="M2_REPO/com/gwtplatform/gwtp-dispatch-shared/0.5/gwtp-dispatch-shared-0.5-sources.jar"/>
- <classpathentry kind="var" path="M2_REPO/com/gwtplatform/gwtp-mvp-client/0.5/gwtp-mvp-client-0.5.jar" sourcepath="M2_REPO/com/gwtplatform/gwtp-mvp-client/0.5/gwtp-mvp-client-0.5-sources.jar"/>
- <classpathentry kind="var" path="M2_REPO/com/gwtplatform/gwtp-processors/0.5/gwtp-processors-0.5.jar" sourcepath="M2_REPO/com/gwtplatform/gwtp-processors/0.5/gwtp-processors-0.5-sources.jar"/>
- <classpathentry kind="var" path="M2_REPO/com/gwtplatform/gwtp-tester/0.5/gwtp-tester-0.5.jar" sourcepath="M2_REPO/com/gwtplatform/gwtp-tester/0.5/gwtp-tester-0.5-sources.jar"/>
- <classpathentry kind="var" path="M2_REPO/com/googlecode/gwtupload/gwtupload/0.6.3-compat/gwtupload-0.6.3-compat.jar" sourcepath="M2_REPO/com/googlecode/gwtupload/gwtupload/0.6.3-compat/gwtupload-0.6.3-compat-sources.jar"/>
- <classpathentry kind="var" path="M2_REPO/com/extjs/gxt/2.2.1/gxt-2.2.1.jar"/>
- <classpathentry kind="var" path="M2_REPO/com/h2database/h2/1.0.20070617/h2-1.0.20070617.jar"/>
- <classpathentry kind="var" path="M2_REPO/com/calclab/emite/hablar/r1697/hablar-r1697.jar"/>
- <classpathentry kind="var" path="M2_REPO/org/hamcrest/hamcrest-all/1.1/hamcrest-all-1.1.jar" sourcepath="M2_REPO/org/hamcrest/hamcrest-all/1.1/hamcrest-all-1.1-sources.jar"/>
- <classpathentry kind="var" path="M2_REPO/org/hamcrest/hamcrest-core/1.1/hamcrest-core-1.1.jar" sourcepath="M2_REPO/org/hamcrest/hamcrest-core/1.1/hamcrest-core-1.1-sources.jar"/>
- <classpathentry kind="var" path="M2_REPO/org/hibernate/hibernate-annotations/3.4.0.GA/hibernate-annotations-3.4.0.GA.jar" sourcepath="M2_REPO/org/hibernate/hibernate-annotations/3.4.0.GA/hibernate-annotations-3.4.0.GA-sources.jar"/>
- <classpathentry kind="var" path="M2_REPO/org/hibernate/hibernate-c3p0/3.3.1.GA/hibernate-c3p0-3.3.1.GA.jar" sourcepath="M2_REPO/org/hibernate/hibernate-c3p0/3.3.1.GA/hibernate-c3p0-3.3.1.GA-sources.jar"/>
- <classpathentry kind="var" path="M2_REPO/org/hibernate/hibernate-commons-annotations/3.3.0.ga/hibernate-commons-annotations-3.3.0.ga.jar" sourcepath="M2_REPO/org/hibernate/hibernate-commons-annotations/3.3.0.ga/hibernate-commons-annotations-3.3.0.ga-sources.jar"/>
- <classpathentry kind="var" path="M2_REPO/org/hibernate/hibernate-core/3.3.1.GA/hibernate-core-3.3.1.GA.jar" sourcepath="M2_REPO/org/hibernate/hibernate-core/3.3.1.GA/hibernate-core-3.3.1.GA-sources.jar"/>
- <classpathentry kind="var" path="M2_REPO/org/hibernate/hibernate-entitymanager/3.4.0.GA/hibernate-entitymanager-3.4.0.GA.jar" sourcepath="M2_REPO/org/hibernate/hibernate-entitymanager/3.4.0.GA/hibernate-entitymanager-3.4.0.GA-sources.jar"/>
- <classpathentry kind="var" path="M2_REPO/org/hibernate/hibernate-search/3.1.0.GA/hibernate-search-3.1.0.GA.jar" sourcepath="M2_REPO/org/hibernate/hibernate-search/3.1.0.GA/hibernate-search-3.1.0.GA-sources.jar"/>
- <classpathentry kind="var" path="M2_REPO/org/hibernate/hibernate-tools/3.2.3.GA/hibernate-tools-3.2.3.GA.jar"/>
- <classpathentry kind="var" path="M2_REPO/org/hibernate/hibernate-validator/3.1.0.GA/hibernate-validator-3.1.0.GA.jar" sourcepath="M2_REPO/org/hibernate/hibernate-validator/3.1.0.GA/hibernate-validator-3.1.0.GA-sources.jar"/>
- <classpathentry kind="var" path="M2_REPO/net/sourceforge/htmlunit/htmlunit/2.7/htmlunit-2.7.jar" sourcepath="M2_REPO/net/sourceforge/htmlunit/htmlunit/2.7/htmlunit-2.7-sources.jar"/>
- <classpathentry kind="var" path="M2_REPO/net/sourceforge/htmlunit/htmlunit-core-js/2.7/htmlunit-core-js-2.7.jar" sourcepath="M2_REPO/net/sourceforge/htmlunit/htmlunit-core-js/2.7/htmlunit-core-js-2.7-sources.jar"/>
- <classpathentry kind="var" path="M2_REPO/javassist/javassist/3.4.GA/javassist-3.4.GA.jar"/>
- <classpathentry kind="var" path="M2_REPO/org/slf4j/jcl-over-slf4j/1.6.1/jcl-over-slf4j-1.6.1.jar" sourcepath="M2_REPO/org/slf4j/jcl-over-slf4j/1.6.1/jcl-over-slf4j-1.6.1-sources.jar"/>
- <classpathentry kind="var" path="M2_REPO/com/beust/jcommander/1.12/jcommander-1.12.jar" sourcepath="M2_REPO/com/beust/jcommander/1.12/jcommander-1.12-sources.jar"/>
- <classpathentry kind="var" path="M2_REPO/org/codehaus/jettison/jettison/1.0-RC2/jettison-1.0-RC2.jar" sourcepath="M2_REPO/org/codehaus/jettison/jettison/1.0-RC2/jettison-1.0-RC2-sources.jar"/>
- <classpathentry kind="var" path="M2_REPO/jmagick/jmagick/6.2.6-0/jmagick-6.2.6-0.jar"/>
- <classpathentry kind="var" path="M2_REPO/net/java/dev/jna/jna/3.2.2/jna-3.2.2.jar" sourcepath="M2_REPO/net/java/dev/jna/jna/3.2.2/jna-3.2.2-sources.jar"/>
- <classpathentry kind="var" path="M2_REPO/org/jruby/jruby-complete/1.2.0/jruby-complete-1.2.0.jar"/>
- <classpathentry kind="var" path="M2_REPO/org/jruby/rack/jruby-rack/0.9.4/jruby-rack-0.9.4.jar"/>
- <classpathentry kind="var" path="M2_REPO/org/json/json/20080701/json-20080701.jar" sourcepath="M2_REPO/org/json/json/20080701/json-20080701-sources.jar"/>
- <classpathentry kind="var" path="M2_REPO/net/sf/json-lib/json-lib/2.1/json-lib-2.1-jdk15.jar" sourcepath="M2_REPO/net/sf/json-lib/json-lib/2.1/json-lib-2.1-jdk15-sources.jar"/>
- <classpathentry kind="var" path="M2_REPO/org/jsoup/jsoup/1.2.2/jsoup-1.2.2.jar" sourcepath="M2_REPO/org/jsoup/jsoup/1.2.2/jsoup-1.2.2-sources.jar"/>
- <classpathentry kind="var" path="M2_REPO/net/sourceforge/findbugs/jsr-305/v0r47/jsr-305-v0r47.jar" sourcepath="M2_REPO/net/sourceforge/findbugs/jsr-305/v0r47/jsr-305-v0r47-sources.jar"/>
- <classpathentry kind="var" path="M2_REPO/org/hibernate/jtidy/r8-20060801/jtidy-r8-20060801.jar"/>
- <classpathentry kind="var" path="M2_REPO/org/jukito/jukito/1.0/jukito-1.0.jar" sourcepath="M2_REPO/org/jukito/jukito/1.0/jukito-1.0-sources.jar"/>
- <classpathentry kind="var" path="M2_REPO/junit/junit/4.8.2/junit-4.8.2.jar" sourcepath="M2_REPO/junit/junit/4.8.2/junit-4.8.2-sources.jar"/>
- <classpathentry kind="var" path="M2_REPO/org/liquibase/liquibase-core/1.7.0/liquibase-core-1.7.0.jar"/>
- <classpathentry kind="var" path="M2_REPO/org/liquibase/liquibase-plugin/1.7.0.0/liquibase-plugin-1.7.0.0.jar"/>
- <classpathentry kind="var" path="M2_REPO/log4j/log4j/1.2.16/log4j-1.2.16.jar" sourcepath="M2_REPO/log4j/log4j/1.2.16/log4j-1.2.16-sources.jar"/>
- <classpathentry kind="var" path="M2_REPO/logkit/logkit/1.0.1/logkit-1.0.1.jar" sourcepath="M2_REPO/logkit/logkit/1.0.1/logkit-1.0.1-sources.jar"/>
- <classpathentry kind="var" path="M2_REPO/org/apache/lucene/lucene-core/2.4.0/lucene-core-2.4.0.jar" sourcepath="M2_REPO/org/apache/lucene/lucene-core/2.4.0/lucene-core-2.4.0-sources.jar"/>
- <classpathentry kind="var" path="M2_REPO/org/apache/maven/maven-artifact/2.0/maven-artifact-2.0.jar" sourcepath="M2_REPO/org/apache/maven/maven-artifact/2.0/maven-artifact-2.0-sources.jar"/>
- <classpathentry kind="var" path="M2_REPO/org/apache/maven/maven-artifact-manager/2.0/maven-artifact-manager-2.0.jar" sourcepath="M2_REPO/org/apache/maven/maven-artifact-manager/2.0/maven-artifact-manager-2.0-sources.jar"/>
- <classpathentry kind="var" path="M2_REPO/org/apache/maven/maven-model/2.0/maven-model-2.0.jar" sourcepath="M2_REPO/org/apache/maven/maven-model/2.0/maven-model-2.0-sources.jar"/>
- <classpathentry kind="var" path="M2_REPO/org/apache/maven/maven-plugin-api/2.0/maven-plugin-api-2.0.jar" sourcepath="M2_REPO/org/apache/maven/maven-plugin-api/2.0/maven-plugin-api-2.0-sources.jar"/>
- <classpathentry kind="var" path="M2_REPO/org/apache/maven/maven-profile/2.0/maven-profile-2.0.jar" sourcepath="M2_REPO/org/apache/maven/maven-profile/2.0/maven-profile-2.0-sources.jar"/>
- <classpathentry kind="var" path="M2_REPO/org/apache/maven/maven-project/2.0/maven-project-2.0.jar" sourcepath="M2_REPO/org/apache/maven/maven-project/2.0/maven-project-2.0-sources.jar"/>
- <classpathentry kind="var" path="M2_REPO/org/apache/maven/maven-repository-metadata/2.0/maven-repository-metadata-2.0.jar" sourcepath="M2_REPO/org/apache/maven/maven-repository-metadata/2.0/maven-repository-metadata-2.0-sources.jar"/>
- <classpathentry kind="var" path="M2_REPO/org/waveprotocol/media-src/0.3.1-SNAPSHOT/media-src-0.3.1-SNAPSHOT.jar"/>
- <classpathentry kind="var" path="M2_REPO/org/mockito/mockito-core/1.8.5/mockito-core-1.8.5.jar" sourcepath="M2_REPO/org/mockito/mockito-core/1.8.5/mockito-core-1.8.5-sources.jar"/>
- <classpathentry kind="var" path="M2_REPO/org/waveprotocol/model-src/0.3.1-SNAPSHOT/model-src-0.3.1-SNAPSHOT.jar"/>
- <classpathentry kind="var" path="M2_REPO/org/mvel/mvel2/2.0.16/mvel2-2.0.16.jar" sourcepath="M2_REPO/org/mvel/mvel2/2.0.16/mvel2-2.0.16-sources.jar"/>
- <classpathentry kind="var" path="M2_REPO/mysql/mysql-connector-java/5.1.13/mysql-connector-java-5.1.13.jar"/>
- <classpathentry kind="var" path="M2_REPO/net/sourceforge/nekohtml/nekohtml/1.9.14/nekohtml-1.9.14.jar" sourcepath="M2_REPO/net/sourceforge/nekohtml/nekohtml/1.9.14/nekohtml-1.9.14-sources.jar"/>
- <classpathentry kind="var" path="M2_REPO/org/objenesis/objenesis/1.0/objenesis-1.0.jar" sourcepath="M2_REPO/org/objenesis/objenesis/1.0/objenesis-1.0-sources.jar"/>
- <classpathentry kind="var" path="M2_REPO/org/codehaus/plexus/plexus-container-default/1.0-alpha-8/plexus-container-default-1.0-alpha-8.jar" sourcepath="M2_REPO/org/codehaus/plexus/plexus-container-default/1.0-alpha-8/plexus-container-default-1.0-alpha-8-sources.jar"/>
- <classpathentry kind="var" path="M2_REPO/org/codehaus/plexus/plexus-utils/1.0.4/plexus-utils-1.0.4.jar" sourcepath="M2_REPO/org/codehaus/plexus/plexus-utils/1.0.4/plexus-utils-1.0.4-sources.jar"/>
- <classpathentry kind="var" path="M2_REPO/org/waveprotocol/proto-msg/0.3.1-SNAPSHOT/proto-msg-0.3.1-SNAPSHOT.jar"/>
- <classpathentry kind="var" path="M2_REPO/org/w3c/css/sac/1.3/sac-1.3.jar" sourcepath="M2_REPO/org/w3c/css/sac/1.3/sac-1.3-sources.jar"/>
- <classpathentry kind="var" path="M2_REPO/org/seleniumhq/selenium/selenium/2.0a4/selenium-2.0a4.jar" sourcepath="M2_REPO/org/seleniumhq/selenium/selenium/2.0a4/selenium-2.0a4-sources.jar"/>
- <classpathentry kind="var" path="M2_REPO/org/seleniumhq/selenium/selenium-chrome-driver/2.0a4/selenium-chrome-driver-2.0a4.jar" sourcepath="M2_REPO/org/seleniumhq/selenium/selenium-chrome-driver/2.0a4/selenium-chrome-driver-2.0a4-sources.jar"/>
- <classpathentry kind="var" path="M2_REPO/org/seleniumhq/selenium/selenium-common/2.0a4/selenium-common-2.0a4.jar" sourcepath="M2_REPO/org/seleniumhq/selenium/selenium-common/2.0a4/selenium-common-2.0a4-sources.jar"/>
- <classpathentry kind="var" path="M2_REPO/org/seleniumhq/selenium/selenium-firefox-driver/2.0a4/selenium-firefox-driver-2.0a4.jar" sourcepath="M2_REPO/org/seleniumhq/selenium/selenium-firefox-driver/2.0a4/selenium-firefox-driver-2.0a4-sources.jar"/>
- <classpathentry kind="var" path="M2_REPO/org/seleniumhq/selenium/selenium-htmlunit-driver/2.0a4/selenium-htmlunit-driver-2.0a4.jar" sourcepath="M2_REPO/org/seleniumhq/selenium/selenium-htmlunit-driver/2.0a4/selenium-htmlunit-driver-2.0a4-sources.jar"/>
- <classpathentry kind="var" path="M2_REPO/org/seleniumhq/selenium/selenium-ie-driver/2.0a4/selenium-ie-driver-2.0a4.jar" sourcepath="M2_REPO/org/seleniumhq/selenium/selenium-ie-driver/2.0a4/selenium-ie-driver-2.0a4-sources.jar"/>
- <classpathentry kind="var" path="M2_REPO/org/seleniumhq/selenium/selenium-remote-client/2.0a4/selenium-remote-client-2.0a4.jar" sourcepath="M2_REPO/org/seleniumhq/selenium/selenium-remote-client/2.0a4/selenium-remote-client-2.0a4-sources.jar"/>
- <classpathentry kind="var" path="M2_REPO/org/seleniumhq/selenium/selenium-remote-common/2.0a4/selenium-remote-common-2.0a4.jar" sourcepath="M2_REPO/org/seleniumhq/selenium/selenium-remote-common/2.0a4/selenium-remote-common-2.0a4-sources.jar"/>
- <classpathentry kind="var" path="M2_REPO/org/seleniumhq/selenium/selenium-support/2.0a4/selenium-support-2.0a4.jar" sourcepath="M2_REPO/org/seleniumhq/selenium/selenium-support/2.0a4/selenium-support-2.0a4-sources.jar"/>
- <classpathentry kind="var" path="M2_REPO/xalan/serializer/2.7.1/serializer-2.7.1.jar"/>
- <classpathentry kind="var" path="M2_REPO/org/slf4j/slf4j-api/1.6.1/slf4j-api-1.6.1.jar" sourcepath="M2_REPO/org/slf4j/slf4j-api/1.6.1/slf4j-api-1.6.1-sources.jar"/>
- <classpathentry kind="var" path="M2_REPO/org/slf4j/slf4j-log4j12/1.6.1/slf4j-log4j12-1.6.1.jar" sourcepath="M2_REPO/org/slf4j/slf4j-log4j12/1.6.1/slf4j-log4j12-1.6.1-sources.jar"/>
- <classpathentry kind="var" path="M2_REPO/jivesoftware/smack/3.1.0/smack-3.1.0.jar"/>
- <classpathentry kind="var" path="M2_REPO/jivesoftware/smackx/3.1.0/smackx-3.1.0.jar"/>
- <classpathentry kind="var" path="M2_REPO/org/jivesoftware/smackx/debugger/smackx-debugger/3.0.4/smackx-debugger-3.0.4.jar"/>
- <classpathentry kind="var" path="M2_REPO/org/yaml/snakeyaml/1.6/snakeyaml-1.6.jar" sourcepath="M2_REPO/org/yaml/snakeyaml/1.6/snakeyaml-1.6-sources.jar"/>
- <classpathentry kind="var" path="M2_REPO/stax/stax-api/1.0.1/stax-api-1.0.1.jar"/>
- <classpathentry kind="var" path="M2_REPO/org/testng/testng/6.0.1/testng-6.0.1.jar" sourcepath="M2_REPO/org/testng/testng/6.0.1/testng-6.0.1-sources.jar"/>
- <classpathentry kind="var" path="M2_REPO/tigase/tigase-xmltools/3.3.5/tigase-xmltools-3.3.5.jar" sourcepath="M2_REPO/tigase/tigase-xmltools/3.3.5/tigase-xmltools-3.3.5-sources.jar"/>
- <classpathentry kind="var" path="M2_REPO/org/waveprotocol/util-src/0.3.1-SNAPSHOT/util-src-0.3.1-SNAPSHOT.jar"/>
- <classpathentry kind="var" path="M2_REPO/org/apache/maven/wagon/wagon-provider-api/1.0-alpha-5/wagon-provider-api-1.0-alpha-5.jar" sourcepath="M2_REPO/org/apache/maven/wagon/wagon-provider-api/1.0-alpha-5/wagon-provider-api-1.0-alpha-5-sources.jar"/>
- <classpathentry kind="var" path="M2_REPO/org/waveprotocol/waveinabox-server-0.3/0.3.1-SNAPSHOT/waveinabox-server-0.3-0.3.1-SNAPSHOT.jar"/>
- <classpathentry kind="var" path="M2_REPO/xalan/xalan/2.7.1/xalan-2.7.1.jar" sourcepath="M2_REPO/xalan/xalan/2.7.1/xalan-2.7.1-sources.jar"/>
- <classpathentry kind="var" path="M2_REPO/xerces/xercesImpl/2.9.1/xercesImpl-2.9.1.jar"/>
- <classpathentry kind="var" path="M2_REPO/xml-apis/xml-apis/1.0.b2/xml-apis-1.0.b2.jar" sourcepath="M2_REPO/xml-apis/xml-apis/1.0.b2/xml-apis-1.0.b2-sources.jar"/>
- <classpathentry kind="var" path="M2_REPO/xpp3/xpp3_min/1.1.3.4.O/xpp3_min-1.1.3.4.O.jar"/>
- <classpathentry kind="var" path="M2_REPO/com/thoughtworks/xstream/xstream/1.2.2/xstream-1.2.2.jar" sourcepath="M2_REPO/com/thoughtworks/xstream/xstream/1.2.2/xstream-1.2.2-sources.jar"/>
- <classpathentry kind="var" path="M2_REPO/org/xwiki/platform/xwiki-web-gwt-dom/2.3-rc-1/xwiki-web-gwt-dom-2.3-rc-1.jar" sourcepath="M2_REPO/org/xwiki/platform/xwiki-web-gwt-dom/2.3-rc-1/xwiki-web-gwt-dom-2.3-rc-1-sources.jar"/>
- <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/>
- <classpathentry kind="src" path=".apt_generated" including="**/*.java"/> <classpathentry kind="con" path="com.google.gwt.eclipse.core.GWT_CONTAINER"/>
-</classpath>
\ No newline at end of file
+ <classpathentry including="**/*.java" kind="src" output="target/test-classes" path="src/test/java"/>
+ <classpathentry including="**/*.java" kind="src" path="src/main/java"/>
+ <classpathentry excluding="**/*.java" kind="src" path="src/main/resources"/>
+ <classpathentry kind="var" path="M2_REPO/javax/inject/javax.inject/1/javax.inject-1.jar" sourcepath="M2_REPO/javax/inject/javax.inject/1/javax.inject-1-sources.jar"/>
+ <classpathentry kind="var" path="M2_REPO/javax/transaction/jta/1.1/jta-1.1.jar" sourcepath="M2_REPO/javax/transaction/jta/1.1/jta-1.1-sources.jar"/>
+ <classpathentry kind="var" path="M2_REPO/javax/persistence/persistence-api/1.0/persistence-api-1.0.jar" sourcepath="M2_REPO/javax/persistence/persistence-api/1.0/persistence-api-1.0-sources.jar"/>
+ <classpathentry kind="var" path="M2_REPO/javax/servlet/servlet-api/2.5/servlet-api-2.5.jar" sourcepath="M2_REPO/javax/servlet/servlet-api/2.5/servlet-api-2.5-sources.jar"/>
+ <classpathentry kind="var" path="M2_REPO/antlr/antlr/2.7.6/antlr-2.7.6.jar" sourcepath="M2_REPO/antlr/antlr/2.7.6/antlr-2.7.6-sources.jar"/>
+ <classpathentry kind="var" path="M2_REPO/aopalliance/aopalliance/1.0/aopalliance-1.0.jar" sourcepath="M2_REPO/aopalliance/aopalliance/1.0/aopalliance-1.0-sources.jar"/>
+ <classpathentry kind="var" path="M2_REPO/com/google/appengine/appengine-api-1.0-sdk/1.3.1/appengine-api-1.0-sdk-1.3.1.jar"/>
+ <classpathentry kind="var" path="M2_REPO/avalon-framework/avalon-framework/4.1.3/avalon-framework-4.1.3.jar"/>
+ <classpathentry kind="var" path="M2_REPO/org/waveprotocol/box/0.3.1-SNAPSHOT/box-0.3.1-SNAPSHOT.jar" sourcepath="/M2_REPO/org/waveprotocol/box-src/0.3.1-SNAPSHOT/box-src-0.3.1-SNAPSHOT.jar"/>
+ <classpathentry kind="var" path="M2_REPO/org/waveprotocol/box-src/0.3.1-SNAPSHOT/box-src-0.3.1-SNAPSHOT.jar"/>
+ <classpathentry kind="var" path="M2_REPO/org/beanshell/bsh/2.0b4/bsh-2.0b4.jar"/>
+ <classpathentry kind="var" path="M2_REPO/c3p0/c3p0/0.9.1/c3p0-0.9.1.jar" sourcepath="M2_REPO/c3p0/c3p0/0.9.1/c3p0-0.9.1-sources.jar"/>
+ <classpathentry kind="var" path="M2_REPO/classworlds/classworlds/1.1-alpha-2/classworlds-1.1-alpha-2.jar"/>
+ <classpathentry kind="var" path="M2_REPO/org/waveprotocol/client/0.3.1-SNAPSHOT/client-0.3.1-SNAPSHOT.jar" sourcepath="/M2_REPO/org/waveprotocol/client-src/0.3.1-SNAPSHOT/client-src-0.3.1-SNAPSHOT.jar"/>
+ <classpathentry kind="var" path="M2_REPO/org/waveprotocol/client-common/0.3.1-SNAPSHOT/client-common-0.3.1-SNAPSHOT.jar"/>
+ <classpathentry kind="var" path="M2_REPO/org/waveprotocol/client-common-src/0.3.1-SNAPSHOT/client-common-src-0.3.1-SNAPSHOT.jar"/>
+ <classpathentry kind="var" path="M2_REPO/org/waveprotocol/client-scheduler-src/0.3.1-SNAPSHOT/client-scheduler-src-0.3.1-SNAPSHOT.jar"/>
+ <classpathentry kind="var" path="M2_REPO/org/waveprotocol/client-src/0.3.1-SNAPSHOT/client-src-0.3.1-SNAPSHOT.jar"/>
+ <classpathentry kind="var" path="M2_REPO/org/cobogw/gwt/cobogw/1.3.1/cobogw-1.3.1.jar"/>
+ <classpathentry kind="var" path="M2_REPO/org/waveprotocol/common-src/0.3.1-SNAPSHOT/common-src-0.3.1-SNAPSHOT.jar"/>
+ <classpathentry kind="var" path="M2_REPO/commons-beanutils/commons-beanutils/1.7.0/commons-beanutils-1.7.0.jar" sourcepath="M2_REPO/commons-beanutils/commons-beanutils/1.7.0/commons-beanutils-1.7.0-sources.jar"/>
+ <classpathentry kind="var" path="M2_REPO/commons-cli/commons-cli/1.2/commons-cli-1.2.jar" sourcepath="M2_REPO/commons-cli/commons-cli/1.2/commons-cli-1.2-sources.jar"/>
+ <classpathentry kind="var" path="M2_REPO/commons-codec/commons-codec/1.4/commons-codec-1.4.jar" sourcepath="M2_REPO/commons-codec/commons-codec/1.4/commons-codec-1.4-sources.jar"/>
+ <classpathentry kind="var" path="M2_REPO/commons-collections/commons-collections/3.2/commons-collections-3.2.jar" sourcepath="M2_REPO/commons-collections/commons-collections/3.2/commons-collections-3.2-sources.jar"/>
+ <classpathentry kind="var" path="M2_REPO/commons-fileupload/commons-fileupload/1.2/commons-fileupload-1.2.jar" sourcepath="M2_REPO/commons-fileupload/commons-fileupload/1.2/commons-fileupload-1.2-sources.jar"/>
+ <classpathentry kind="var" path="M2_REPO/commons-httpclient/commons-httpclient/3.1/commons-httpclient-3.1.jar"/>
+ <classpathentry kind="var" path="M2_REPO/commons-io/commons-io/1.3.1/commons-io-1.3.1.jar" sourcepath="M2_REPO/commons-io/commons-io/1.3.1/commons-io-1.3.1-sources.jar"/>
+ <classpathentry kind="var" path="M2_REPO/commons-lang/commons-lang/2.5/commons-lang-2.5.jar" sourcepath="M2_REPO/commons-lang/commons-lang/2.5/commons-lang-2.5-sources.jar"/>
+ <classpathentry kind="var" path="M2_REPO/commons-logging/commons-logging/1.1/commons-logging-1.1.jar" sourcepath="M2_REPO/commons-logging/commons-logging/1.1/commons-logging-1.1-sources.jar"/>
+ <classpathentry kind="var" path="M2_REPO/org/waveprotocol/communication-src/0.3.1-SNAPSHOT/communication-src-0.3.1-SNAPSHOT.jar"/>
+ <classpathentry kind="var" path="M2_REPO/org/waveprotocol/concurrencycontrol-src/0.3.1-SNAPSHOT/concurrencycontrol-src-0.3.1-SNAPSHOT.jar"/>
+ <classpathentry kind="var" path="M2_REPO/net/sourceforge/htmlunit/crawl_htmlunit/r5662-gae/crawl_htmlunit-r5662-gae.jar"/>
+ <classpathentry kind="var" path="M2_REPO/net/sourceforge/cssparser/cssparser/0.9.5/cssparser-0.9.5.jar" sourcepath="M2_REPO/net/sourceforge/cssparser/cssparser/0.9.5/cssparser-0.9.5-sources.jar"/>
+ <classpathentry kind="var" path="M2_REPO/dom4j/dom4j/1.6.1/dom4j-1.6.1.jar" sourcepath="M2_REPO/dom4j/dom4j/1.6.1/dom4j-1.6.1-sources.jar"/>
+ <classpathentry kind="var" path="M2_REPO/net/sf/dozer/dozer/4.0/dozer-4.0.jar" sourcepath="M2_REPO/net/sf/dozer/dozer/4.0/dozer-4.0-sources.jar"/>
+ <classpathentry kind="var" path="M2_REPO/org/hibernate/ejb3-persistence/1.0.2.GA/ejb3-persistence-1.0.2.GA.jar" sourcepath="M2_REPO/org/hibernate/ejb3-persistence/1.0.2.GA/ejb3-persistence-1.0.2.GA-sources.jar"/>
+ <classpathentry kind="var" path="M2_REPO/com/calclab/emite/emite/r1694/emite-r1694.jar"/>
+ <classpathentry kind="var" path="M2_REPO/com/calclab/emite/emite-proxy/0.1/emite-proxy-0.1.jar"/>
+ <classpathentry kind="var" path="M2_REPO/net/sf/ezmorph/ezmorph/1.0.3/ezmorph-1.0.3.jar" sourcepath="M2_REPO/net/sf/ezmorph/ezmorph/1.0.3/ezmorph-1.0.3-sources.jar"/>
+ <classpathentry kind="var" path="M2_REPO/freemarker/freemarker/2.3.8/freemarker-2.3.8.jar"/>
+ <classpathentry kind="var" path="M2_REPO/com/google/guava/guava-gwt/r09/guava-gwt-r09.jar"/>
+ <classpathentry kind="var" path="M2_REPO/com/google/inject/guice/3.0/guice-3.0.jar" sourcepath="M2_REPO/com/google/inject/guice/3.0/guice-3.0-sources.jar"/>
+ <classpathentry kind="var" path="M2_REPO/com/google/inject/extensions/guice-assisted-inject/2.0/guice-assisted-inject-2.0.jar"/>
+ <classpathentry kind="var" path="M2_REPO/com/google/inject/extensions/guice-persist/3.0/guice-persist-3.0.jar" sourcepath="M2_REPO/com/google/inject/extensions/guice-persist/3.0/guice-persist-3.0-sources.jar"/>
+ <classpathentry kind="var" path="M2_REPO/com/google/inject/extensions/guice-servlet/3.0/guice-servlet-3.0.jar" sourcepath="M2_REPO/com/google/inject/extensions/guice-servlet/3.0/guice-servlet-3.0-sources.jar"/>
+ <classpathentry kind="var" path="M2_REPO/org/adamtacy/gwt-fx/r464/gwt-fx-r464.jar"/>
+ <classpathentry kind="var" path="M2_REPO/com/google/gwt/gwt-gin/1.0-r137/gwt-gin-1.0-r137.jar"/>
+ <classpathentry kind="var" path="M2_REPO/com/allen_sauer/gwt/log/gwt-log/gwt-log/3.0.1/gwt-log-3.0.1.jar"/>
+ <classpathentry kind="var" path="M2_REPO/com/google/gwt/gwt-servlet/2.1.1/gwt-servlet-2.1.1.jar" sourcepath="M2_REPO/com/google/gwt/gwt-servlet/2.1.1/gwt-servlet-2.1.1-sources.jar"/>
+ <classpathentry kind="var" path="M2_REPO/com/google/gwt/gwt-user/2.1.1/gwt-user-2.1.1.jar" sourcepath="M2_REPO/com/google/gwt/gwt-user/2.1.1/gwt-user-2.1.1-sources.jar"/>
+ <classpathentry kind="var" path="M2_REPO/org/waveprotocol/gwt-util-src/0.3.1-SNAPSHOT/gwt-util-src-0.3.1-SNAPSHOT.jar"/>
+ <classpathentry kind="var" path="M2_REPO/com/allen_sauer/gwt/voices/gwt-voices/gwt-voices/2.0.0/gwt-voices-2.0.0.jar"/>
+ <classpathentry kind="var" path="M2_REPO/com/gwtext/gwtext/2.0.5/gwtext-2.0.5.jar"/>
+ <classpathentry kind="var" path="M2_REPO/com/gwtextux/gwtextux/0.4.0.924/gwtextux-0.4.0.924.jar"/>
+ <classpathentry kind="var" path="M2_REPO/com/gwtplatform/gwtp-all/0.5/gwtp-all-0.5.jar" sourcepath="M2_REPO/com/gwtplatform/gwtp-all/0.5/gwtp-all-0.5-sources.jar"/>
+ <classpathentry kind="var" path="M2_REPO/com/gwtplatform/gwtp-clients-common/0.5/gwtp-clients-common-0.5.jar" sourcepath="M2_REPO/com/gwtplatform/gwtp-clients-common/0.5/gwtp-clients-common-0.5-sources.jar"/>
+ <classpathentry kind="var" path="M2_REPO/com/gwtplatform/gwtp-crawler/0.5/gwtp-crawler-0.5.jar" sourcepath="M2_REPO/com/gwtplatform/gwtp-crawler/0.5/gwtp-crawler-0.5-sources.jar"/>
+ <classpathentry kind="var" path="M2_REPO/com/gwtplatform/gwtp-dispatch-client/0.5/gwtp-dispatch-client-0.5.jar" sourcepath="M2_REPO/com/gwtplatform/gwtp-dispatch-client/0.5/gwtp-dispatch-client-0.5-sources.jar"/>
+ <classpathentry kind="var" path="M2_REPO/com/gwtplatform/gwtp-dispatch-server/0.5/gwtp-dispatch-server-0.5.jar" sourcepath="M2_REPO/com/gwtplatform/gwtp-dispatch-server/0.5/gwtp-dispatch-server-0.5-sources.jar"/>
+ <classpathentry kind="var" path="M2_REPO/com/gwtplatform/gwtp-dispatch-shared/0.5/gwtp-dispatch-shared-0.5.jar" sourcepath="M2_REPO/com/gwtplatform/gwtp-dispatch-shared/0.5/gwtp-dispatch-shared-0.5-sources.jar"/>
+ <classpathentry kind="var" path="M2_REPO/com/gwtplatform/gwtp-mvp-client/0.5/gwtp-mvp-client-0.5.jar" sourcepath="M2_REPO/com/gwtplatform/gwtp-mvp-client/0.5/gwtp-mvp-client-0.5-sources.jar"/>
+ <classpathentry kind="var" path="M2_REPO/com/gwtplatform/gwtp-processors/0.5/gwtp-processors-0.5.jar" sourcepath="M2_REPO/com/gwtplatform/gwtp-processors/0.5/gwtp-processors-0.5-sources.jar"/>
+ <classpathentry kind="var" path="M2_REPO/com/gwtplatform/gwtp-tester/0.5/gwtp-tester-0.5.jar" sourcepath="M2_REPO/com/gwtplatform/gwtp-tester/0.5/gwtp-tester-0.5-sources.jar"/>
+ <classpathentry kind="var" path="M2_REPO/com/googlecode/gwtupload/gwtupload/0.6.3-compat/gwtupload-0.6.3-compat.jar" sourcepath="M2_REPO/com/googlecode/gwtupload/gwtupload/0.6.3-compat/gwtupload-0.6.3-compat-sources.jar"/>
+ <classpathentry kind="var" path="M2_REPO/com/extjs/gxt/2.2.1/gxt-2.2.1.jar"/>
+ <classpathentry kind="var" path="M2_REPO/com/h2database/h2/1.0.20070617/h2-1.0.20070617.jar"/>
+ <classpathentry kind="var" path="M2_REPO/com/calclab/emite/hablar/r1697/hablar-r1697.jar"/>
+ <classpathentry kind="var" path="M2_REPO/org/hamcrest/hamcrest-all/1.1/hamcrest-all-1.1.jar" sourcepath="M2_REPO/org/hamcrest/hamcrest-all/1.1/hamcrest-all-1.1-sources.jar"/>
+ <classpathentry kind="var" path="M2_REPO/org/hamcrest/hamcrest-core/1.1/hamcrest-core-1.1.jar" sourcepath="M2_REPO/org/hamcrest/hamcrest-core/1.1/hamcrest-core-1.1-sources.jar"/>
+ <classpathentry kind="var" path="M2_REPO/org/hibernate/hibernate-annotations/3.4.0.GA/hibernate-annotations-3.4.0.GA.jar" sourcepath="M2_REPO/org/hibernate/hibernate-annotations/3.4.0.GA/hibernate-annotations-3.4.0.GA-sources.jar"/>
+ <classpathentry kind="var" path="M2_REPO/org/hibernate/hibernate-c3p0/3.3.1.GA/hibernate-c3p0-3.3.1.GA.jar" sourcepath="M2_REPO/org/hibernate/hibernate-c3p0/3.3.1.GA/hibernate-c3p0-3.3.1.GA-sources.jar"/>
+ <classpathentry kind="var" path="M2_REPO/org/hibernate/hibernate-commons-annotations/3.3.0.ga/hibernate-commons-annotations-3.3.0.ga.jar" sourcepath="M2_REPO/org/hibernate/hibernate-commons-annotations/3.3.0.ga/hibernate-commons-annotations-3.3.0.ga-sources.jar"/>
+ <classpathentry kind="var" path="M2_REPO/org/hibernate/hibernate-core/3.3.1.GA/hibernate-core-3.3.1.GA.jar" sourcepath="M2_REPO/org/hibernate/hibernate-core/3.3.1.GA/hibernate-core-3.3.1.GA-sources.jar"/>
+ <classpathentry kind="var" path="M2_REPO/org/hibernate/hibernate-entitymanager/3.4.0.GA/hibernate-entitymanager-3.4.0.GA.jar" sourcepath="M2_REPO/org/hibernate/hibernate-entitymanager/3.4.0.GA/hibernate-entitymanager-3.4.0.GA-sources.jar"/>
+ <classpathentry kind="var" path="M2_REPO/org/hibernate/hibernate-search/3.1.0.GA/hibernate-search-3.1.0.GA.jar" sourcepath="M2_REPO/org/hibernate/hibernate-search/3.1.0.GA/hibernate-search-3.1.0.GA-sources.jar"/>
+ <classpathentry kind="var" path="M2_REPO/org/hibernate/hibernate-tools/3.2.3.GA/hibernate-tools-3.2.3.GA.jar"/>
+ <classpathentry kind="var" path="M2_REPO/org/hibernate/hibernate-validator/3.1.0.GA/hibernate-validator-3.1.0.GA.jar" sourcepath="M2_REPO/org/hibernate/hibernate-validator/3.1.0.GA/hibernate-validator-3.1.0.GA-sources.jar"/>
+ <classpathentry kind="var" path="M2_REPO/net/sourceforge/htmlunit/htmlunit/2.7/htmlunit-2.7.jar" sourcepath="M2_REPO/net/sourceforge/htmlunit/htmlunit/2.7/htmlunit-2.7-sources.jar"/>
+ <classpathentry kind="var" path="M2_REPO/net/sourceforge/htmlunit/htmlunit-core-js/2.7/htmlunit-core-js-2.7.jar" sourcepath="M2_REPO/net/sourceforge/htmlunit/htmlunit-core-js/2.7/htmlunit-core-js-2.7-sources.jar"/>
+ <classpathentry kind="var" path="M2_REPO/javassist/javassist/3.4.GA/javassist-3.4.GA.jar"/>
+ <classpathentry kind="var" path="M2_REPO/org/slf4j/jcl-over-slf4j/1.6.1/jcl-over-slf4j-1.6.1.jar" sourcepath="M2_REPO/org/slf4j/jcl-over-slf4j/1.6.1/jcl-over-slf4j-1.6.1-sources.jar"/>
+ <classpathentry kind="var" path="M2_REPO/com/beust/jcommander/1.12/jcommander-1.12.jar" sourcepath="M2_REPO/com/beust/jcommander/1.12/jcommander-1.12-sources.jar"/>
+ <classpathentry kind="var" path="M2_REPO/org/codehaus/jettison/jettison/1.0-RC2/jettison-1.0-RC2.jar" sourcepath="M2_REPO/org/codehaus/jettison/jettison/1.0-RC2/jettison-1.0-RC2-sources.jar"/>
+ <classpathentry kind="var" path="M2_REPO/jmagick/jmagick/6.2.6-0/jmagick-6.2.6-0.jar"/>
+ <classpathentry kind="var" path="M2_REPO/net/java/dev/jna/jna/3.2.2/jna-3.2.2.jar" sourcepath="M2_REPO/net/java/dev/jna/jna/3.2.2/jna-3.2.2-sources.jar"/>
+ <classpathentry kind="var" path="M2_REPO/org/jruby/jruby-complete/1.2.0/jruby-complete-1.2.0.jar"/>
+ <classpathentry kind="var" path="M2_REPO/org/jruby/rack/jruby-rack/0.9.4/jruby-rack-0.9.4.jar"/>
+ <classpathentry kind="var" path="M2_REPO/org/json/json/20080701/json-20080701.jar" sourcepath="M2_REPO/org/json/json/20080701/json-20080701-sources.jar"/>
+ <classpathentry kind="var" path="M2_REPO/net/sf/json-lib/json-lib/2.1/json-lib-2.1-jdk15.jar" sourcepath="M2_REPO/net/sf/json-lib/json-lib/2.1/json-lib-2.1-jdk15-sources.jar"/>
+ <classpathentry kind="var" path="M2_REPO/org/jsoup/jsoup/1.2.2/jsoup-1.2.2.jar" sourcepath="M2_REPO/org/jsoup/jsoup/1.2.2/jsoup-1.2.2-sources.jar"/>
+ <classpathentry kind="var" path="M2_REPO/net/sourceforge/findbugs/jsr-305/v0r47/jsr-305-v0r47.jar" sourcepath="M2_REPO/net/sourceforge/findbugs/jsr-305/v0r47/jsr-305-v0r47-sources.jar"/>
+ <classpathentry kind="var" path="M2_REPO/org/hibernate/jtidy/r8-20060801/jtidy-r8-20060801.jar"/>
+ <classpathentry kind="var" path="M2_REPO/org/jukito/jukito/1.0/jukito-1.0.jar" sourcepath="M2_REPO/org/jukito/jukito/1.0/jukito-1.0-sources.jar"/>
+ <classpathentry kind="var" path="M2_REPO/junit/junit/4.8.2/junit-4.8.2.jar" sourcepath="M2_REPO/junit/junit/4.8.2/junit-4.8.2-sources.jar"/>
+ <classpathentry kind="var" path="M2_REPO/org/liquibase/liquibase-core/1.7.0/liquibase-core-1.7.0.jar"/>
+ <classpathentry kind="var" path="M2_REPO/org/liquibase/liquibase-plugin/1.7.0.0/liquibase-plugin-1.7.0.0.jar"/>
+ <classpathentry kind="var" path="M2_REPO/log4j/log4j/1.2.16/log4j-1.2.16.jar" sourcepath="M2_REPO/log4j/log4j/1.2.16/log4j-1.2.16-sources.jar"/>
+ <classpathentry kind="var" path="M2_REPO/logkit/logkit/1.0.1/logkit-1.0.1.jar" sourcepath="M2_REPO/logkit/logkit/1.0.1/logkit-1.0.1-sources.jar"/>
+ <classpathentry kind="var" path="M2_REPO/org/apache/lucene/lucene-core/2.4.0/lucene-core-2.4.0.jar" sourcepath="M2_REPO/org/apache/lucene/lucene-core/2.4.0/lucene-core-2.4.0-sources.jar"/>
+ <classpathentry kind="var" path="M2_REPO/org/apache/maven/maven-artifact/2.0/maven-artifact-2.0.jar" sourcepath="M2_REPO/org/apache/maven/maven-artifact/2.0/maven-artifact-2.0-sources.jar"/>
+ <classpathentry kind="var" path="M2_REPO/org/apache/maven/maven-artifact-manager/2.0/maven-artifact-manager-2.0.jar" sourcepath="M2_REPO/org/apache/maven/maven-artifact-manager/2.0/maven-artifact-manager-2.0-sources.jar"/>
+ <classpathentry kind="var" path="M2_REPO/org/apache/maven/maven-model/2.0/maven-model-2.0.jar" sourcepath="M2_REPO/org/apache/maven/maven-model/2.0/maven-model-2.0-sources.jar"/>
+ <classpathentry kind="var" path="M2_REPO/org/apache/maven/maven-plugin-api/2.0/maven-plugin-api-2.0.jar" sourcepath="M2_REPO/org/apache/maven/maven-plugin-api/2.0/maven-plugin-api-2.0-sources.jar"/>
+ <classpathentry kind="var" path="M2_REPO/org/apache/maven/maven-profile/2.0/maven-profile-2.0.jar" sourcepath="M2_REPO/org/apache/maven/maven-profile/2.0/maven-profile-2.0-sources.jar"/>
+ <classpathentry kind="var" path="M2_REPO/org/apache/maven/maven-project/2.0/maven-project-2.0.jar" sourcepath="M2_REPO/org/apache/maven/maven-project/2.0/maven-project-2.0-sources.jar"/>
+ <classpathentry kind="var" path="M2_REPO/org/apache/maven/maven-repository-metadata/2.0/maven-repository-metadata-2.0.jar" sourcepath="M2_REPO/org/apache/maven/maven-repository-metadata/2.0/maven-repository-metadata-2.0-sources.jar"/>
+ <classpathentry kind="var" path="M2_REPO/org/waveprotocol/media-src/0.3.1-SNAPSHOT/media-src-0.3.1-SNAPSHOT.jar"/>
+ <classpathentry kind="var" path="M2_REPO/org/mockito/mockito-core/1.8.5/mockito-core-1.8.5.jar" sourcepath="M2_REPO/org/mockito/mockito-core/1.8.5/mockito-core-1.8.5-sources.jar"/>
+ <classpathentry kind="var" path="M2_REPO/org/waveprotocol/model-src/0.3.1-SNAPSHOT/model-src-0.3.1-SNAPSHOT.jar"/>
+ <classpathentry kind="var" path="M2_REPO/org/mvel/mvel2/2.0.16/mvel2-2.0.16.jar" sourcepath="M2_REPO/org/mvel/mvel2/2.0.16/mvel2-2.0.16-sources.jar"/>
+ <classpathentry kind="var" path="M2_REPO/mysql/mysql-connector-java/5.1.13/mysql-connector-java-5.1.13.jar"/>
+ <classpathentry kind="var" path="M2_REPO/net/sourceforge/nekohtml/nekohtml/1.9.14/nekohtml-1.9.14.jar" sourcepath="M2_REPO/net/sourceforge/nekohtml/nekohtml/1.9.14/nekohtml-1.9.14-sources.jar"/>
+ <classpathentry kind="var" path="M2_REPO/org/objenesis/objenesis/1.0/objenesis-1.0.jar" sourcepath="M2_REPO/org/objenesis/objenesis/1.0/objenesis-1.0-sources.jar"/>
+ <classpathentry kind="var" path="M2_REPO/org/codehaus/plexus/plexus-container-default/1.0-alpha-8/plexus-container-default-1.0-alpha-8.jar" sourcepath="M2_REPO/org/codehaus/plexus/plexus-container-default/1.0-alpha-8/plexus-container-default-1.0-alpha-8-sources.jar"/>
+ <classpathentry kind="var" path="M2_REPO/org/codehaus/plexus/plexus-utils/1.0.4/plexus-utils-1.0.4.jar" sourcepath="M2_REPO/org/codehaus/plexus/plexus-utils/1.0.4/plexus-utils-1.0.4-sources.jar"/>
+ <classpathentry kind="var" path="M2_REPO/org/waveprotocol/proto-msg/0.3.1-SNAPSHOT/proto-msg-0.3.1-SNAPSHOT.jar"/>
+ <classpathentry kind="var" path="M2_REPO/org/w3c/css/sac/1.3/sac-1.3.jar" sourcepath="M2_REPO/org/w3c/css/sac/1.3/sac-1.3-sources.jar"/>
+ <classpathentry kind="var" path="M2_REPO/org/seleniumhq/selenium/selenium/2.0a4/selenium-2.0a4.jar" sourcepath="M2_REPO/org/seleniumhq/selenium/selenium/2.0a4/selenium-2.0a4-sources.jar"/>
+ <classpathentry kind="var" path="M2_REPO/org/seleniumhq/selenium/selenium-chrome-driver/2.0a4/selenium-chrome-driver-2.0a4.jar" sourcepath="M2_REPO/org/seleniumhq/selenium/selenium-chrome-driver/2.0a4/selenium-chrome-driver-2.0a4-sources.jar"/>
+ <classpathentry kind="var" path="M2_REPO/org/seleniumhq/selenium/selenium-common/2.0a4/selenium-common-2.0a4.jar" sourcepath="M2_REPO/org/seleniumhq/selenium/selenium-common/2.0a4/selenium-common-2.0a4-sources.jar"/>
+ <classpathentry kind="var" path="M2_REPO/org/seleniumhq/selenium/selenium-firefox-driver/2.0a4/selenium-firefox-driver-2.0a4.jar" sourcepath="M2_REPO/org/seleniumhq/selenium/selenium-firefox-driver/2.0a4/selenium-firefox-driver-2.0a4-sources.jar"/>
+ <classpathentry kind="var" path="M2_REPO/org/seleniumhq/selenium/selenium-htmlunit-driver/2.0a4/selenium-htmlunit-driver-2.0a4.jar" sourcepath="M2_REPO/org/seleniumhq/selenium/selenium-htmlunit-driver/2.0a4/selenium-htmlunit-driver-2.0a4-sources.jar"/>
+ <classpathentry kind="var" path="M2_REPO/org/seleniumhq/selenium/selenium-ie-driver/2.0a4/selenium-ie-driver-2.0a4.jar" sourcepath="M2_REPO/org/seleniumhq/selenium/selenium-ie-driver/2.0a4/selenium-ie-driver-2.0a4-sources.jar"/>
+ <classpathentry kind="var" path="M2_REPO/org/seleniumhq/selenium/selenium-remote-client/2.0a4/selenium-remote-client-2.0a4.jar" sourcepath="M2_REPO/org/seleniumhq/selenium/selenium-remote-client/2.0a4/selenium-remote-client-2.0a4-sources.jar"/>
+ <classpathentry kind="var" path="M2_REPO/org/seleniumhq/selenium/selenium-remote-common/2.0a4/selenium-remote-common-2.0a4.jar" sourcepath="M2_REPO/org/seleniumhq/selenium/selenium-remote-common/2.0a4/selenium-remote-common-2.0a4-sources.jar"/>
+ <classpathentry kind="var" path="M2_REPO/org/seleniumhq/selenium/selenium-support/2.0a4/selenium-support-2.0a4.jar" sourcepath="M2_REPO/org/seleniumhq/selenium/selenium-support/2.0a4/selenium-support-2.0a4-sources.jar"/>
+ <classpathentry kind="var" path="M2_REPO/xalan/serializer/2.7.1/serializer-2.7.1.jar"/>
+ <classpathentry kind="var" path="M2_REPO/org/slf4j/slf4j-api/1.6.1/slf4j-api-1.6.1.jar" sourcepath="M2_REPO/org/slf4j/slf4j-api/1.6.1/slf4j-api-1.6.1-sources.jar"/>
+ <classpathentry kind="var" path="M2_REPO/org/slf4j/slf4j-log4j12/1.6.1/slf4j-log4j12-1.6.1.jar" sourcepath="M2_REPO/org/slf4j/slf4j-log4j12/1.6.1/slf4j-log4j12-1.6.1-sources.jar"/>
+ <classpathentry kind="var" path="M2_REPO/jivesoftware/smack/3.1.0/smack-3.1.0.jar"/>
+ <classpathentry kind="var" path="M2_REPO/jivesoftware/smackx/3.1.0/smackx-3.1.0.jar"/>
+ <classpathentry kind="var" path="M2_REPO/org/jivesoftware/smackx/debugger/smackx-debugger/3.0.4/smackx-debugger-3.0.4.jar"/>
+ <classpathentry kind="var" path="M2_REPO/org/yaml/snakeyaml/1.6/snakeyaml-1.6.jar" sourcepath="M2_REPO/org/yaml/snakeyaml/1.6/snakeyaml-1.6-sources.jar"/>
+ <classpathentry kind="var" path="M2_REPO/stax/stax-api/1.0.1/stax-api-1.0.1.jar"/>
+ <classpathentry kind="var" path="M2_REPO/org/testng/testng/6.0.1/testng-6.0.1.jar" sourcepath="M2_REPO/org/testng/testng/6.0.1/testng-6.0.1-sources.jar"/>
+ <classpathentry kind="var" path="M2_REPO/tigase/tigase-xmltools/3.3.5/tigase-xmltools-3.3.5.jar" sourcepath="M2_REPO/tigase/tigase-xmltools/3.3.5/tigase-xmltools-3.3.5-sources.jar"/>
+ <classpathentry kind="var" path="M2_REPO/org/waveprotocol/util-src/0.3.1-SNAPSHOT/util-src-0.3.1-SNAPSHOT.jar"/>
+ <classpathentry kind="var" path="M2_REPO/org/apache/maven/wagon/wagon-provider-api/1.0-alpha-5/wagon-provider-api-1.0-alpha-5.jar" sourcepath="M2_REPO/org/apache/maven/wagon/wagon-provider-api/1.0-alpha-5/wagon-provider-api-1.0-alpha-5-sources.jar"/>
+ <classpathentry kind="var" path="M2_REPO/org/waveprotocol/waveinabox-server-0.3/0.3.1-SNAPSHOT/waveinabox-server-0.3-0.3.1-SNAPSHOT.jar" sourcepath="/M2_REPO/org/waveprotocol/model-src/0.3.1-SNAPSHOT/model-src-0.3.1-SNAPSHOT.jar"/>
+ <classpathentry kind="var" path="M2_REPO/xalan/xalan/2.7.1/xalan-2.7.1.jar" sourcepath="M2_REPO/xalan/xalan/2.7.1/xalan-2.7.1-sources.jar"/>
+ <classpathentry kind="var" path="M2_REPO/xerces/xercesImpl/2.9.1/xercesImpl-2.9.1.jar"/>
+ <classpathentry kind="var" path="M2_REPO/xml-apis/xml-apis/1.0.b2/xml-apis-1.0.b2.jar" sourcepath="M2_REPO/xml-apis/xml-apis/1.0.b2/xml-apis-1.0.b2-sources.jar"/>
+ <classpathentry kind="var" path="M2_REPO/xpp3/xpp3_min/1.1.3.4.O/xpp3_min-1.1.3.4.O.jar"/>
+ <classpathentry kind="var" path="M2_REPO/com/thoughtworks/xstream/xstream/1.2.2/xstream-1.2.2.jar" sourcepath="M2_REPO/com/thoughtworks/xstream/xstream/1.2.2/xstream-1.2.2-sources.jar"/>
+ <classpathentry kind="var" path="M2_REPO/org/xwiki/platform/xwiki-web-gwt-dom/2.3-rc-1/xwiki-web-gwt-dom-2.3-rc-1.jar" sourcepath="M2_REPO/org/xwiki/platform/xwiki-web-gwt-dom/2.3-rc-1/xwiki-web-gwt-dom-2.3-rc-1-sources.jar"/>
+ <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/>
+ <classpathentry including="**/*.java" kind="src" path=".apt_generated"/>
+ <classpathentry kind="con" path="com.google.gwt.eclipse.core.GWT_CONTAINER"/>
+ <classpathentry kind="output" path="target/kune-0.0.8/WEB-INF/classes"/>
+</classpath>
Modified: trunk/src/main/java/cc/kune/chat/client/AvatarDecoratorImpl.java
===================================================================
--- trunk/src/main/java/cc/kune/chat/client/AvatarDecoratorImpl.java 2011-07-12 17:32:54 UTC (rev 1448)
+++ trunk/src/main/java/cc/kune/chat/client/AvatarDecoratorImpl.java 2011-07-13 02:03:09 UTC (rev 1449)
@@ -1,7 +1,9 @@
package cc.kune.chat.client;
import cc.kune.common.client.ui.AbstractDecorator;
+import cc.kune.common.client.utils.TextUtils;
import cc.kune.core.client.avatar.AvatarDecorator;
+import cc.kune.core.shared.i18n.I18nTranslationService;
import com.calclab.emite.core.client.events.StateChangedEvent;
import com.calclab.emite.core.client.events.StateChangedHandler;
@@ -33,6 +35,8 @@
private final ImageResource chatDotBusy;
private final ImageResource chatDotExtendedAway;
private final ImageResource chatDotXA;
+ private final I18nTranslationService i18n;
+ private final HandlerRegistration presenceHandler;
private final PresenceManager presenceManager;
private final XmppRoster roster;
private final HandlerRegistration rosterHandler;
@@ -40,12 +44,13 @@
private final HandlerRegistration sessionStateChangedHandler;
private XmppURI uri;
private final XmppSession xmppSession;
- private HandlerRegistration presenceHandler;
- public AvatarDecoratorImpl(final ChatInstances chatInstances, final ChatClient chatClient,
- final ImageResource chatDotBusy, final ImageResource chatDotXA, final ImageResource chatDotAway,
- final ImageResource chatDotExtendedAway, final ImageResource chatDotAvailable) {
+ public AvatarDecoratorImpl(final I18nTranslationService i18n, final ChatInstances chatInstances,
+ final ChatClient chatClient, final ImageResource chatDotBusy, final ImageResource chatDotXA,
+ final ImageResource chatDotAway, final ImageResource chatDotExtendedAway,
+ final ImageResource chatDotAvailable) {
this.chatClient = chatClient;
+ this.i18n = i18n;
this.chatDotBusy = chatDotBusy;
this.chatDotXA = chatDotXA;
this.chatDotAway = chatDotAway;
@@ -111,20 +116,27 @@
}
private void setIcon(final boolean available, final Show show, final String status) {
+ String finalStatus = "";
if (show == Show.dnd) {
+ finalStatus = i18n.t("Busy");
super.setImage(chatDotBusy);
} else if (show == Show.xa) {
+ finalStatus = i18n.t("Away");
super.setImage(chatDotXA);
+ super.setImage(chatDotAway);
} else if (show == Show.away) {
- super.setImage(chatDotAway);
+ finalStatus = i18n.t("Away");
} else if (show == Show.chat) {
+ finalStatus = i18n.t("Available for chat");
super.setImage(chatDotExtendedAway);
} else if (available) {
+ finalStatus = i18n.t("Available");
super.setImage(chatDotAvailable);
} else {
clearDecorator();
}
- super.setImageTooltip(status);
+ super.setImageTooltip(TextUtils.empty(finalStatus) ? status : finalStatus
+ + (TextUtils.empty(status) ? "" : ": " + status));
}
@Override
Modified: trunk/src/main/java/cc/kune/chat/client/MediumAvatarDecoratorImpl.java
===================================================================
--- trunk/src/main/java/cc/kune/chat/client/MediumAvatarDecoratorImpl.java 2011-07-12 17:32:54 UTC (rev 1448)
+++ trunk/src/main/java/cc/kune/chat/client/MediumAvatarDecoratorImpl.java 2011-07-13 02:03:09 UTC (rev 1449)
@@ -2,15 +2,16 @@
import cc.kune.core.client.avatar.MediumAvatarDecorator;
import cc.kune.core.client.resources.CoreResources;
+import cc.kune.core.shared.i18n.I18nTranslationService;
import com.google.inject.Inject;
public class MediumAvatarDecoratorImpl extends AvatarDecoratorImpl implements MediumAvatarDecorator {
@Inject
- public MediumAvatarDecoratorImpl(final CoreResources res, final ChatInstances chatInstances,
- final ChatClient chatClient) {
- super(chatInstances, chatClient, res.chatDotBusyMedium(), res.chatDotAwayMedium(),
+ public MediumAvatarDecoratorImpl(final I18nTranslationService i18n, final CoreResources res,
+ final ChatInstances chatInstances, final ChatClient chatClient) {
+ super(i18n, chatInstances, chatClient, res.chatDotBusyMedium(), res.chatDotAwayMedium(),
res.chatDotAwayMedium(), res.chatDotExtendedAwayMedium(), res.chatDotAvailableMedium());
setImagePosition(53, -6, -10);
}
Modified: trunk/src/main/java/cc/kune/chat/client/SmallAvatarDecoratorImpl.java
===================================================================
--- trunk/src/main/java/cc/kune/chat/client/SmallAvatarDecoratorImpl.java 2011-07-12 17:32:54 UTC (rev 1448)
+++ trunk/src/main/java/cc/kune/chat/client/SmallAvatarDecoratorImpl.java 2011-07-13 02:03:09 UTC (rev 1449)
@@ -2,15 +2,16 @@
import cc.kune.core.client.avatar.SmallAvatarDecorator;
import cc.kune.core.client.resources.CoreResources;
+import cc.kune.core.shared.i18n.I18nTranslationService;
import com.google.inject.Inject;
public class SmallAvatarDecoratorImpl extends AvatarDecoratorImpl implements SmallAvatarDecorator {
@Inject
- public SmallAvatarDecoratorImpl(final CoreResources res, final ChatInstances chatInstances,
- final ChatClient chatClient) {
- super(chatInstances, chatClient, res.chatDotBusySmall(), res.chatDotAwaySmall(),
+ public SmallAvatarDecoratorImpl(final I18nTranslationService i18n, final CoreResources res,
+ final ChatInstances chatInstances, final ChatClient chatClient) {
+ super(i18n, chatInstances, chatClient, res.chatDotBusySmall(), res.chatDotAwaySmall(),
res.chatDotAwaySmall(), res.chatDotExtendedAwaySmall(), res.chatDotAvailableSmall());
setImagePosition(23, -9, -8);
}
Modified: trunk/src/main/java/cc/kune/common/client/tooltip/TooltipPosition.java
===================================================================
--- trunk/src/main/java/cc/kune/common/client/tooltip/TooltipPosition.java 2011-07-12 17:32:54 UTC (rev 1448)
+++ trunk/src/main/java/cc/kune/common/client/tooltip/TooltipPosition.java 2011-07-13 02:03:09 UTC (rev 1449)
@@ -21,68 +21,68 @@
public class TooltipPosition {
- public enum ArrowPosition {
- E, N, NE, NW, S, SE, SW, W
- }
+ public enum ArrowPosition {
+ E, N, NE, NW, S, SE, SW, W
+ }
- public static final int ARROW_DEF_MARGIN = 10;
- public static final int ARROW_SIZE = 7;
- public static final int TOOLTIP_DISTANCE = 12;
+ public static final int ARROW_DEF_MARGIN = 6;
+ public static final int ARROW_SIZE = 7;
+ public static final int TOOLTIP_DISTANCE = 12;
- private int arrowLeft;
- private ArrowPosition arrowPosition;
- private int arrowTop;
- private int left;
- private int top;
+ private int arrowLeft;
+ private ArrowPosition arrowPosition;
+ private int arrowTop;
+ private int left;
+ private int top;
- public TooltipPosition(final int left, final int top, final ArrowPosition arrowPosition, final int arrowLeft,
- final int arrowTop) {
- super();
- this.left = left;
- this.top = top;
- this.arrowPosition = arrowPosition;
- this.arrowLeft = arrowLeft;
- this.arrowTop = arrowTop;
- }
+ public TooltipPosition(final int left, final int top, final ArrowPosition arrowPosition,
+ final int arrowLeft, final int arrowTop) {
+ super();
+ this.left = left;
+ this.top = top;
+ this.arrowPosition = arrowPosition;
+ this.arrowLeft = arrowLeft;
+ this.arrowTop = arrowTop;
+ }
- public int getArrowLeft() {
- return arrowLeft;
- }
+ public int getArrowLeft() {
+ return arrowLeft;
+ }
- public ArrowPosition getArrowPosition() {
- return arrowPosition;
- }
+ public ArrowPosition getArrowPosition() {
+ return arrowPosition;
+ }
- public int getArrowTop() {
- return arrowTop;
- }
+ public int getArrowTop() {
+ return arrowTop;
+ }
- public int getLeft() {
- return left;
- }
+ public int getLeft() {
+ return left;
+ }
- public int getTop() {
- return top;
- }
+ public int getTop() {
+ return top;
+ }
- public void setArrowLeft(final int arrowLeft) {
- this.arrowLeft = arrowLeft;
- }
+ public void setArrowLeft(final int arrowLeft) {
+ this.arrowLeft = arrowLeft;
+ }
- public void setArrowPosition(final ArrowPosition arrowPosition) {
- this.arrowPosition = arrowPosition;
- }
+ public void setArrowPosition(final ArrowPosition arrowPosition) {
+ this.arrowPosition = arrowPosition;
+ }
- public void setArrowTop(final int arrowTop) {
- this.arrowTop = arrowTop;
- }
+ public void setArrowTop(final int arrowTop) {
+ this.arrowTop = arrowTop;
+ }
- public void setLeft(final int left) {
- this.left = left;
- }
+ public void setLeft(final int left) {
+ this.left = left;
+ }
- public void setTop(final int top) {
- this.top = top;
- }
+ public void setTop(final int top) {
+ this.top = top;
+ }
}
Modified: trunk/src/main/java/cc/kune/common/client/ui/AbstractDecorator.java
===================================================================
--- trunk/src/main/java/cc/kune/common/client/ui/AbstractDecorator.java 2011-07-12 17:32:54 UTC (rev 1448)
+++ trunk/src/main/java/cc/kune/common/client/ui/AbstractDecorator.java 2011-07-13 02:03:09 UTC (rev 1449)
@@ -29,12 +29,14 @@
@UiField
FlowPanel mainPanel;
private int offset = 0;
+ private Tooltip tooltip;
private int top = 0;
@UiField
SimplePanel widgetContainer;
public AbstractDecorator() {
initWidget(BINDER.createAndBindUi(this));
+ decorationImage.setVisible(false);
}
public void clearImage() {
@@ -59,7 +61,12 @@
}
public void setImageTooltip(final String text) {
- Tooltip.to(decorationImage, text);
+ if (tooltip == null) {
+ tooltip = Tooltip.to(decorationImage, text);
+ decorationImage.addStyleName("k-pointer");
+ } else {
+ tooltip.setText(text);
+ }
}
private void setPosition() {
Modified: trunk/src/main/java/cc/kune/common/client/ui/AbstractDecorator.ui.xml
===================================================================
--- trunk/src/main/java/cc/kune/common/client/ui/AbstractDecorator.ui.xml 2011-07-12 17:32:54 UTC (rev 1448)
+++ trunk/src/main/java/cc/kune/common/client/ui/AbstractDecorator.ui.xml 2011-07-13 02:03:09 UTC (rev 1449)
@@ -8,6 +8,7 @@
top: 0px;
left: 0px;
float: left;
+ background-color: transparent;
}
.container {
Modified: trunk/src/main/java/cc/kune/common/client/ui/EditableLabel.java
===================================================================
--- trunk/src/main/java/cc/kune/common/client/ui/EditableLabel.java 2011-07-12 17:32:54 UTC (rev 1448)
+++ trunk/src/main/java/cc/kune/common/client/ui/EditableLabel.java 2011-07-13 02:03:09 UTC (rev 1449)
@@ -54,7 +54,6 @@
@UiField
TextBox textbox;
private Tooltip tooltip;
-
private String tooltipText;
public EditableLabel() {
@@ -99,6 +98,10 @@
fireEvent(new EditEvent(textbox.getValue()));
}
+ private String getTooltipValue() {
+ return editable ? tooltipText : "";
+ }
+
@UiHandler("textbox")
void handleKeys(final KeyDownEvent event) {
if (event.getNativeKeyCode() == 13) {
@@ -158,7 +161,12 @@
public void setEditable(final boolean editable) {
this.editable = editable;
- tooltip = Tooltip.to(label, editable ? tooltipText : "");
+ if (tooltip == null) {
+ tooltip = Tooltip.to(label, getTooltipValue());
+
+ } else {
+ tooltip.setText(getTooltipValue());
+ }
}
public void setText(final String text) {
Modified: trunk/src/main/java/cc/kune/core/client/actions/xml/NewGadgetAction.java
===================================================================
--- trunk/src/main/java/cc/kune/core/client/actions/xml/NewGadgetAction.java 2011-07-12 17:32:54 UTC (rev 1448)
+++ trunk/src/main/java/cc/kune/core/client/actions/xml/NewGadgetAction.java 2011-07-13 02:03:09 UTC (rev 1449)
@@ -11,6 +11,7 @@
import cc.kune.core.shared.dto.AccessRolDTO;
import cc.kune.core.shared.dto.StateContentDTO;
import cc.kune.core.shared.i18n.I18nTranslationService;
+import cc.kune.gspace.client.viewers.ContentViewerPresenter;
import com.google.inject.Provider;
@@ -18,6 +19,7 @@
private final String body;
private final Provider<ContentServiceAsync> contentService;
+ private final ContentViewerPresenter contentViewer;
private final String gadgetName;
private final I18nTranslationService i18n;
private final Session session;
@@ -26,11 +28,13 @@
private final String typeId;
public NewGadgetAction(final Provider<ContentServiceAsync> contentService,
- final StateManager stateManager, final Session session, final I18nTranslationService i18n,
- final AccessRolDTO rol, final boolean authNeeded, final String gadgetName, final String typeId,
- final String iconUrl, final String title, final String body) {
+ final ContentViewerPresenter contentViewerPresenter, final StateManager stateManager,
+ final Session session, final I18nTranslationService i18n, final AccessRolDTO rol,
+ final boolean authNeeded, final String gadgetName, final String typeId, final String iconUrl,
+ final String title, final String body) {
super(rol, authNeeded);
this.contentService = contentService;
+ this.contentViewer = contentViewerPresenter;
this.stateManager = stateManager;
this.i18n = i18n;
this.gadgetName = gadgetName;
@@ -49,6 +53,7 @@
public void onSuccess(final StateContentDTO result) {
NotifyUser.info(i18n.t("[%s] created succesfully", title));
stateManager.setRetrievedStateAndGo(result);
+ contentViewer.blinkTitle();
}
});
}
Modified: trunk/src/main/java/cc/kune/core/client/actions/xml/XMLActionsParser.java
===================================================================
--- trunk/src/main/java/cc/kune/core/client/actions/xml/XMLActionsParser.java 2011-07-12 17:32:54 UTC (rev 1448)
+++ trunk/src/main/java/cc/kune/core/client/actions/xml/XMLActionsParser.java 2011-07-13 02:03:09 UTC (rev 1449)
@@ -16,6 +16,7 @@
import cc.kune.core.client.state.StateManager;
import cc.kune.core.shared.i18n.I18nTranslationService;
import cc.kune.gspace.client.actions.ActionGroups;
+import cc.kune.gspace.client.viewers.ContentViewerPresenter;
import com.calclab.emite.core.client.services.Services;
import com.google.gwt.http.client.Request;
@@ -34,8 +35,10 @@
private final ActionRegistryByType actionRegistry;
private final Provider<ContentServiceAsync> contentService;
+ private final ContentViewerPresenter contentViewer;
private final ErrorHandler errHandler;
private final I18nTranslationService i18n;
+
private final NewMenusForTypeIdsRegistry newMenusRegistry;
private final Session session;
@@ -45,11 +48,12 @@
private final HashMap<String, SubMenuDescriptor> submenus;
@Inject
- public XMLActionsParser(final ErrorHandler errHandler, final ActionRegistryByType actionRegistry,
- final Provider<ContentServiceAsync> contentService, final Session session,
- final StateManager stateManager, final I18nTranslationService i18n,
+ public XMLActionsParser(final ErrorHandler errHandler, final ContentViewerPresenter contentViewer,
+ final ActionRegistryByType actionRegistry, final Provider<ContentServiceAsync> contentService,
+ final Session session, final StateManager stateManager, final I18nTranslationService i18n,
final NewMenusForTypeIdsRegistry newMenusRegistry, final Services services) {
this.errHandler = errHandler;
+ this.contentViewer = contentViewer;
this.actionRegistry = actionRegistry;
this.contentService = contentService;
this.session = session;
@@ -121,10 +125,11 @@
for (final XMLTypeId typeId : descrip.getTypeIds()) {
final String origTypeId = typeId.getOrigTypeId();
final String contentIntro = descrip.getNewContentTextIntro();
- final NewGadgetAction action = new NewGadgetAction(contentService, stateManager, session,
- i18n, descrip.getRol().getRolRequired(), descrip.getRol().isAuthNeed(),
- extension.getExtName(), typeId.getDestTypeId(), extension.getIconUrl(),
- descrip.getNewContentTitle(), TextUtils.empty(contentIntro) ? "" : contentIntro);
+ final NewGadgetAction action = new NewGadgetAction(contentService, contentViewer,
+ stateManager, session, i18n, descrip.getRol().getRolRequired(),
+ descrip.getRol().isAuthNeed(), extension.getExtName(), typeId.getDestTypeId(),
+ extension.getIconUrl(), descrip.getNewContentTitle(), TextUtils.empty(contentIntro) ? ""
+ : contentIntro);
final String path = descrip.getPath();
final MenuDescriptor menu = newMenusRegistry.get(origTypeId);
assert menu != null;
Modified: trunk/src/main/java/cc/kune/core/public/ws.html
===================================================================
--- trunk/src/main/java/cc/kune/core/public/ws.html 2011-07-12 17:32:54 UTC (rev 1448)
+++ trunk/src/main/java/cc/kune/core/public/ws.html 2011-07-13 02:03:09 UTC (rev 1449)
@@ -59,6 +59,7 @@
<script type="text/javascript" src="/others/splash/js/rpc.js"></script>
<script type="text/javascript" src="/others/splash/js/common_client.js"></script>
<script type="text/javascript" src="/others/splash/js/permalink_client.js"></script>
+<script type="text/javascript" src="http://wave.google.com/gadgets/js/core:rpc.js?c=1"></script>
<style type="text/css">
body {
Modified: trunk/src/main/webapp/others/kune-client-actions.xml
===================================================================
--- trunk/src/main/webapp/others/kune-client-actions.xml 2011-07-12 17:32:54 UTC (rev 1448)
+++ trunk/src/main/webapp/others/kune-client-actions.xml 2011-07-13 02:03:09 UTC (rev 1449)
@@ -27,10 +27,11 @@
</extension>
<extension>
+ <!-- Warning: this is a robot -->
<name>tasklistbot</name>
<installerUrl>http://tasklistbot.appspot.com/TaskList.xml
</installerUrl>
- <gadgetUrl>http://everybodywave.appspot.com/gadget/foobar/main.xml
+ <gadgetUrl>http://tasklistbot.appspot.com/TaskList.xml
</gadgetUrl>
<iconUrl>http://tasklistbot.appspot.com/resources/tasklistbot_avatar.png
</iconUrl>
@@ -219,7 +220,7 @@
<path>Gadget»Media</path>
<description>Add a Picasa photo album to a wave.</description>
<new-content-title>New Album</new-content-title>
- <new-content-textintro></new-content-textintro>
+ <new-content-textintro>Sorry, this gadget has problems with its height. We hope this will be fixed soon</new-content-textintro>
<enabled>true</enabled>
<typeIds>
<typeId origTypeId="docs.folder" destTypeId="docs.doc" />
@@ -245,7 +246,8 @@
</description>
<new-content-title>New To-Do list</new-content-title>
<new-content-textintro></new-content-textintro>
- <enabled>true</enabled>
+ <!-- Seems broken right now -->
+ <enabled>false</enabled>
<typeIds>
<typeId origTypeId="docs.folder" destTypeId="docs.doc" />
<typeId origTypeId="docs.root" destTypeId="docs.doc" />
@@ -270,7 +272,8 @@
shortener.(http://goo.gl/)</description>
<new-content-title>New Shorten URL</new-content-title>
<new-content-textintro></new-content-textintro>
- <enabled>true</enabled>
+ <!-- Disabled: Not useful for a new doc -->
+ <enabled>false</enabled>
<typeIds>
<typeId origTypeId="docs.folder" destTypeId="docs.doc" />
<typeId origTypeId="docs.root" destTypeId="docs.doc" />
@@ -372,7 +375,8 @@
<description></description>
<new-content-title>New Task List</new-content-title>
<new-content-textintro></new-content-textintro>
- <enabled>true</enabled>
+ <!-- This is a robot -->
+ <enabled>false</enabled>
<typeIds>
<typeId origTypeId="docs.folder" destTypeId="docs.doc" />
<typeId origTypeId="docs.root" destTypeId="docs.doc" />
@@ -397,7 +401,8 @@
all participants.</description>
<new-content-title>New Notification</new-content-title>
<new-content-textintro></new-content-textintro>
- <enabled>true</enabled>
+ <!-- Disabled: not working in WIAB -->
+ <enabled>false</enabled>
<typeIds>
<typeId origTypeId="docs.folder" destTypeId="docs.doc" />
<typeId origTypeId="docs.root" destTypeId="docs.doc" />
@@ -446,7 +451,7 @@
<path>Gadget»Media</path>
<description>Lets you insert, resize and annotate any image from
the web.</description>
- <new-content-title>New image</new-content-title>
+ <new-content-title>Edit this to insert, resize and annotate any image from the web</new-content-title>
<new-content-textintro></new-content-textintro>
<enabled>true</enabled>
<typeIds>
@@ -548,7 +553,7 @@
<description>Shows results from Twitter for a given search term.
Participants can edit to specify new term.</description>
<new-content-title>Twitter search</new-content-title>
- <new-content-textintro></new-content-textintro>
+ <new-content-textintro>Sorry, this gadget has problems with its height. We hope this will be fixed soon</new-content-textintro>
<enabled>true</enabled>
<typeIds>
<typeId origTypeId="docs.folder" destTypeId="docs.doc" />
Modified: trunk/src/test/java/com/google/wave/splash/text/ContentNewUnrendererTest.java
===================================================================
--- trunk/src/test/java/com/google/wave/splash/text/ContentNewUnrendererTest.java 2011-07-12 17:32:54 UTC (rev 1448)
+++ trunk/src/test/java/com/google/wave/splash/text/ContentNewUnrendererTest.java 2011-07-13 02:03:09 UTC (rev 1449)
@@ -1,20 +1,29 @@
package com.google.wave.splash.text;
-import static org.junit.Assert.assertEquals;
-
import org.junit.Ignore;
import org.junit.Test;
+import org.waveprotocol.wave.client.editor.content.CMutableDocument;
+import org.waveprotocol.wave.client.editor.content.ContentDocument;
+import org.waveprotocol.wave.model.document.indexed.IndexedDocument;
+import org.waveprotocol.wave.model.document.operation.Nindo;
+import org.waveprotocol.wave.model.document.raw.impl.Element;
+import org.waveprotocol.wave.model.document.raw.impl.Node;
+import org.waveprotocol.wave.model.document.raw.impl.Text;
+import org.waveprotocol.wave.model.document.util.DocProviders;
+import org.waveprotocol.wave.model.operation.OperationSequencer;
-import com.google.wave.splash.text.ContentUnrenderer.UnrenderedBlip;
-
public class ContentNewUnrendererTest {
@Ignore
@Test
public void testBasicUnrender() {
- // final IndexedDocument<Node, Element, Text> result =
- // ContentNewUnrenderer.unrender("<b>Some <em>bold</em></b>");
- final UnrenderedBlip result = ContentUnrenderer.unrender("<p></p><p><b>Some <em>bold</em></b></p>");
- assertEquals("", result.elements.toString());
+ final IndexedDocument<Node, Element, Text> result = ContentNewUnrenderer.unrender("<b>Some <em>bold</em></b>");
+ // final UnrenderedBlip result =
+ // ContentUnrenderer.unrender("<p></p><p><b>Some <em>bold</em></b></p>");
+ // assertEquals("", result.elements.toString());
+
+ final OperationSequencer<Nindo> sequencer = DocProviders.createCopyingSequencer(result);
+ final CMutableDocument mutable = new ContentDocument(null).createSequencedDocumentWrapper(sequencer);
+ // WaveletDataUtil.createEmptyWavelet(null, null, null, 0)
}
}
1
0
r1448 - in trunk: img/webtemplate src/main/java/cc/kune/chat/client src/main/java/cc/kune/chat/client/actions src/main/java/cc/kune/common/client/tooltip src/main/java/cc/kune/common/client/ui src/main/java/cc/kune/core/client/actions/xml src/main/java/cc/kune/core/client/resources src/main/java/cc/kune/core/client/sn
by Vicente J. Ruiz Jurado 12 Jul '11
by Vicente J. Ruiz Jurado 12 Jul '11
12 Jul '11
Author: vjrj_
Date: 2011-07-12 19:32:54 +0200 (Tue, 12 Jul 2011)
New Revision: 1448
Added:
trunk/img/webtemplate/chat-revisited.png
trunk/src/main/java/cc/kune/chat/client/actions/AddAsBuddieAction.java
trunk/src/main/java/cc/kune/core/client/resources/question32.png
Modified:
trunk/img/webtemplate/web_template-2011.svg
trunk/src/main/java/cc/kune/chat/client/AvatarDecoratorImpl.java
trunk/src/main/java/cc/kune/chat/client/ChatClientDefault.java
trunk/src/main/java/cc/kune/chat/client/ChatInstances.java
trunk/src/main/java/cc/kune/chat/client/ChatParts.java
trunk/src/main/java/cc/kune/chat/client/actions/AddAsBuddieHeaderButton.java
trunk/src/main/java/cc/kune/common/client/tooltip/Tooltip.java
trunk/src/main/java/cc/kune/common/client/tooltip/TooltipTimers.java
trunk/src/main/java/cc/kune/common/client/ui/BasicThumb.java
trunk/src/main/java/cc/kune/core/client/actions/xml/XMLWaveExtension.java
trunk/src/main/java/cc/kune/core/client/resources/CoreResources.java
trunk/src/main/java/cc/kune/core/client/sn/AbstractSNPanel.java
Log:
XML Extensions trim fix; SN menu lazy; tooltip hide when menu shows; Subscription confirmation
Added: trunk/img/webtemplate/chat-revisited.png
===================================================================
(Binary files differ)
Property changes on: trunk/img/webtemplate/chat-revisited.png
___________________________________________________________________
Name: svn:mime-type
+ application/octet-stream
Modified: trunk/img/webtemplate/web_template-2011.svg
===================================================================
--- trunk/img/webtemplate/web_template-2011.svg 2011-07-10 20:58:52 UTC (rev 1447)
+++ trunk/img/webtemplate/web_template-2011.svg 2011-07-12 17:32:54 UTC (rev 1448)
@@ -22,6 +22,32 @@
style="display:inline">
<defs
id="defs3184">
+ <marker
+ inkscape:stockid="Arrow1Lstart"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="Arrow1Lstart"
+ style="overflow:visible">
+ <path
+ id="path4904"
+ d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1.0pt;marker-start:none"
+ transform="scale(0.8) translate(12.5,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow2Mstart"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="Arrow2Mstart"
+ style="overflow:visible">
+ <path
+ id="path4928"
+ style="font-size:12.0;fill-rule:evenodd;stroke-width:0.62500000;stroke-linejoin:round"
+ d="M 8.7185878,4.0337352 L -2.2072895,0.016013256 L 8.7185884,-4.0017078 C 6.9730900,-1.6296469 6.9831476,1.6157441 8.7185878,4.0337352 z "
+ transform="scale(0.6) translate(0,0)" />
+ </marker>
<linearGradient
inkscape:collect="always"
id="linearGradient4127">
@@ -52,9 +78,9 @@
borderopacity="1.0"
inkscape:pageopacity="0"
inkscape:pageshadow="2"
- inkscape:zoom="0.35355339"
- inkscape:cx="598.70994"
- inkscape:cy="950.73513"
+ inkscape:zoom="1"
+ inkscape:cx="488.6491"
+ inkscape:cy="1879.6308"
inkscape:current-layer="layer1"
inkscape:document-units="px"
showgrid="false"
@@ -97,7 +123,7 @@
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
- <dc:title />
+ <dc:title></dc:title>
</cc:Work>
</rdf:RDF>
</metadata>
@@ -1432,30 +1458,6 @@
x="-130.78345"
y="757.93884">rates</tspan></text>
<text
- transform="matrix(1.0176358,-0.00753392,0.00727468,0.98261598,0,0)"
- inkscape:export-ydpi="90"
- inkscape:export-xdpi="90"
- inkscape:export-filename="/home/vjrj/proyectos/dev/kune/trunk/img/webtemplate/web_template-2011.png"
- sodipodi:linespacing="100%"
- id="text3993"
- y="81.933052"
- x="-115.68397"
- style="font-size:18px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;line-height:100%;letter-spacing:0px;word-spacing:0px;fill:#0000ff;fill-opacity:1;stroke:none;display:inline;font-family:'festus!';-inkscape-font-specification:'festus!'"
- xml:space="preserve"><tspan
- y="81.933052"
- x="-115.68397"
- sodipodi:role="line"
- id="tspan3995">icons of the </tspan><tspan
- y="99.933052"
- x="-115.68397"
- sodipodi:role="line"
- id="tspan3997">minimized apps</tspan><tspan
- y="117.93305"
- x="-115.68397"
- sodipodi:role="line"
- id="tspan4063"
- dx="0 4">(jabber chat, etc)</tspan></text>
- <text
xml:space="preserve"
style="font-size:18px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;line-height:100%;letter-spacing:0px;word-spacing:0px;fill:#0000ff;fill-opacity:1;stroke:none;display:inline;font-family:'festus!';-inkscape-font-specification:'festus!'"
x="1012.2725"
@@ -2473,6 +2475,1434 @@
id="path3823"
style="color:#000000;fill:#c87137;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
sodipodi:type="star" />
+ <rect
+ style="color:#000000;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:#cccccc;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+ id="rect6473"
+ width="772"
+ height="1148"
+ x="43"
+ y="-1448"
+ inkscape:export-filename="/home/vjrj/proyectos/dev/kune/trunk/img/webtemplate/chat-revisited.png"
+ inkscape:export-xdpi="90"
+ inkscape:export-ydpi="90" />
+ <rect
+ style="color:#000000;fill:#552200;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.52077562px;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+ id="rect3824"
+ width="707.21039"
+ height="630.90399"
+ x="73.875587"
+ y="-995.74152"
+ inkscape:export-filename="/home/vjrj/proyectos/dev/kune/trunk/img/webtemplate/chat-revisited.png"
+ inkscape:export-xdpi="90"
+ inkscape:export-ydpi="90" />
+ <rect
+ y="-968.24432"
+ x="80.351868"
+ height="32.98317"
+ width="146.36401"
+ id="rect4088"
+ style="opacity:0.82999998;color:#000000;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.52077562px;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+ inkscape:export-filename="/home/vjrj/proyectos/dev/kune/trunk/img/webtemplate/chat-revisited.png"
+ inkscape:export-xdpi="90"
+ inkscape:export-ydpi="90" />
+ <rect
+ style="opacity:0.82999998;color:#000000;fill:#999999;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.52077562px;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+ id="rect3872"
+ width="527.24084"
+ height="29.156178"
+ x="238.32439"
+ y="-665.15656"
+ inkscape:export-filename="/home/vjrj/proyectos/dev/kune/trunk/img/webtemplate/chat-revisited.png"
+ inkscape:export-xdpi="90"
+ inkscape:export-ydpi="90" />
+ <path
+ sodipodi:type="arc"
+ style="opacity:0.82999998;color:#000000;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.52077562px;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+ id="path3826"
+ sodipodi:cx="243.24474"
+ sodipodi:cy="-1704.0453"
+ sodipodi:rx="79.195961"
+ sodipodi:ry="79.195961"
+ d="m 322.4407,-1704.0453 a 79.195961,79.195961 0 1 1 -158.39193,0 79.195961,79.195961 0 1 1 158.39193,0 z"
+ transform="translate(-724.07735,1029.5475)" />
+ <rect
+ style="opacity:0.82999998;color:#000000;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.52077562px;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+ id="rect3830"
+ width="146.36401"
+ height="257.33154"
+ x="80.351868"
+ y="-928.98218"
+ inkscape:export-filename="/home/vjrj/proyectos/dev/kune/trunk/img/webtemplate/chat-revisited.png"
+ inkscape:export-xdpi="90"
+ inkscape:export-ydpi="90" />
+ <rect
+ style="color:#000000;fill:#f9f9f9;fill-opacity:1;fill-rule:nonzero;stroke:#cccccc;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+ id="rect6451"
+ width="16"
+ height="229"
+ x="211"
+ y="-930"
+ inkscape:export-filename="/home/vjrj/proyectos/dev/kune/trunk/img/webtemplate/chat-revisited.png"
+ inkscape:export-xdpi="90"
+ inkscape:export-ydpi="90" />
+ <rect
+ rx="7.4279795"
+ ry="7.4279795"
+ y="-664.66113"
+ x="306.63422"
+ height="46.690155"
+ width="66.851814"
+ id="rect4056"
+ style="color:#000000;fill:#b3b3b3;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.52077562px;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+ inkscape:export-filename="/home/vjrj/proyectos/dev/kune/trunk/img/webtemplate/chat-revisited.png"
+ inkscape:export-xdpi="90"
+ inkscape:export-ydpi="90" />
+ <rect
+ style="color:#000000;fill:#b3b3b3;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.52077562px;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+ id="rect4058"
+ width="66.851814"
+ height="46.690155"
+ x="376.63422"
+ y="-664.66113"
+ ry="7.4279795"
+ rx="7.4279795"
+ inkscape:export-filename="/home/vjrj/proyectos/dev/kune/trunk/img/webtemplate/chat-revisited.png"
+ inkscape:export-xdpi="90"
+ inkscape:export-ydpi="90" />
+ <rect
+ style="color:#000000;fill:#ececec;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.52077562px;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+ id="rect3832"
+ width="529.53052"
+ height="170.80717"
+ x="236.64713"
+ y="-637.33972"
+ inkscape:export-filename="/home/vjrj/proyectos/dev/kune/trunk/img/webtemplate/chat-revisited.png"
+ inkscape:export-xdpi="90"
+ inkscape:export-ydpi="90" />
+ <rect
+ y="-967.83386"
+ x="234.48746"
+ height="294.62897"
+ width="375.62448"
+ id="rect3834"
+ style="opacity:0.82999998;color:#000000;fill:#f4d7d7;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.52077562px;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+ inkscape:export-filename="/home/vjrj/proyectos/dev/kune/trunk/img/webtemplate/chat-revisited.png"
+ inkscape:export-xdpi="90"
+ inkscape:export-ydpi="90" />
+ <text
+ transform="matrix(1.0176358,-0.00753392,0.00727468,0.98261598,0,0)"
+ inkscape:export-ydpi="90"
+ inkscape:export-xdpi="90"
+ inkscape:export-filename="/home/vjrj/proyectos/dev/kune/trunk/img/webtemplate/chat-revisited.png"
+ sodipodi:linespacing="100%"
+ id="text3993"
+ y="-735.8465"
+ x="154.39923"
+ style="font-size:28px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;line-height:100%;letter-spacing:0px;word-spacing:0px;fill:#0000ff;fill-opacity:1;stroke:#ffffff;stroke-width:0.5;display:inline;font-family:'festus!';-inkscape-font-specification:'festus! Bold'"
+ xml:space="preserve"><tspan
+ y="-735.8465"
+ x="154.39923"
+ sodipodi:role="line"
+ id="tspan4063"
+ style="stroke-width:0.5">drag & drop</tspan></text>
+ <rect
+ y="-463.78766"
+ x="236.64713"
+ height="67.908195"
+ width="531.96021"
+ id="rect3836"
+ style="color:#000000;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.52077562px;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+ inkscape:export-filename="/home/vjrj/proyectos/dev/kune/trunk/img/webtemplate/chat-revisited.png"
+ inkscape:export-xdpi="90"
+ inkscape:export-ydpi="90" />
+ <rect
+ y="-969.16553"
+ x="620.72406"
+ height="293.34161"
+ width="146.36401"
+ id="rect3838"
+ style="opacity:0.82999998;color:#000000;fill:#ffaaaa;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.52077562px;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+ inkscape:export-filename="/home/vjrj/proyectos/dev/kune/trunk/img/webtemplate/chat-revisited.png"
+ inkscape:export-xdpi="90"
+ inkscape:export-ydpi="90" />
+ <rect
+ style="opacity:0.82999998;color:#000000;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.52077562px;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+ id="rect3840"
+ width="58.312355"
+ height="29.156178"
+ x="236.39433"
+ y="-386.09869"
+ inkscape:export-filename="/home/vjrj/proyectos/dev/kune/trunk/img/webtemplate/chat-revisited.png"
+ inkscape:export-xdpi="90"
+ inkscape:export-ydpi="90" />
+ <rect
+ y="-390.74152"
+ x="73.875587"
+ height="51.903992"
+ width="707.21039"
+ id="rect6447"
+ style="color:#000000;fill:#552200;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.52077562px;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+ ry="15.000001"
+ rx="15"
+ inkscape:export-filename="/home/vjrj/proyectos/dev/kune/trunk/img/webtemplate/chat-revisited.png"
+ inkscape:export-xdpi="90"
+ inkscape:export-ydpi="90" />
+ <rect
+ y="-386.09869"
+ x="236.39433"
+ height="29.156178"
+ width="58.312355"
+ id="rect3842"
+ style="opacity:0.82999998;color:#000000;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.52077562px;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+ inkscape:export-filename="/home/vjrj/proyectos/dev/kune/trunk/img/webtemplate/chat-revisited.png"
+ inkscape:export-xdpi="90"
+ inkscape:export-ydpi="90" />
+ <rect
+ style="opacity:0.82999998;color:#000000;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.52077562px;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+ id="rect3846"
+ width="145.78088"
+ height="29.156178"
+ x="81.324394"
+ y="-657.97308"
+ inkscape:export-filename="/home/vjrj/proyectos/dev/kune/trunk/img/webtemplate/chat-revisited.png"
+ inkscape:export-xdpi="90"
+ inkscape:export-ydpi="90" />
+ <rect
+ y="-621.97308"
+ x="81.324394"
+ height="29.156178"
+ width="145.78088"
+ id="rect3848"
+ style="opacity:0.82999998;color:#000000;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.52077562px;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+ inkscape:export-filename="/home/vjrj/proyectos/dev/kune/trunk/img/webtemplate/chat-revisited.png"
+ inkscape:export-xdpi="90"
+ inkscape:export-ydpi="90" />
+ <rect
+ style="opacity:0.82999998;color:#000000;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.52077562px;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+ id="rect3850"
+ width="145.78088"
+ height="29.156178"
+ x="81.324394"
+ y="-586.91193"
+ inkscape:export-filename="/home/vjrj/proyectos/dev/kune/trunk/img/webtemplate/chat-revisited.png"
+ inkscape:export-xdpi="90"
+ inkscape:export-ydpi="90" />
+ <image
+ width="31.736002"
+ height="31.743042"
+ xlink:href="data:image/jpeg;base64,/9j/4AAQSkZJRgABAQAAAQABAAD/2wBDAAgGBgcGBQgHBwcJCQgKDBQNDAsLDBkSEw8UHRofHh0a HBwgJC4nICIsIxwcKDcpLDAxNDQ0Hyc5PTgyPC4zNDL/2wBDAQkJCQwLDBgNDRgyIRwhMjIyMjIy MjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjL/wAARCABkAGQDASIA AhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQA AAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3 ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWm p6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEA AwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSEx BhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElK U1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3 uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwD3+iii gAooooAKY7rGpZ2Cj1JxWZqmqfZAYoQDLjknoo9ff6Vzsksksu+RmdiTgk5IH9KuMG9SHNJ2OxS7 t5DtSeJm9A4JqeuAkQFeeTn86bZ67d6VMAXMttnDRk5x9Cen8v5hunbYFPueg0VXtbmK8to7iFw0 bjKkVYrMsKKKKACiiigAooooASmSyLFE8jfdVST9AKkqjqr+Xpk59QB+ZA/rQtxM5WSVppXlc5Zi SeeB7e1M5ySSDx+VAIx1PToKDyTxj6iuowGuODxkkevSsm+HBHBPt2rWkPB4zwayb08Ec/lQxo3v A98xe50+RjgASxg9hnDfqR+tdrXmXhCUp4ngUDiRXQ8+ik/j0Fem1zzWprHYKKKKkoKKKKACiiig AqnqieZps6+ilvy5/pVymSIJI2RujAgj60LRiZw579h/OgnoScDHAFDApIyMCHUkN7GkJGB06+vT /GuowGSnCEDIH0rFvXySMkjPY9K0rqXg9ck81hXMm44BwPek2M2fBsYl8SRt/wA80duvTIx/WvSx XDeAbbMt5dEYAVY1Prnk/wAh+ddzWE3qax2CiiipKCiiigAooooAKKKKAOL8QQGx1IygHy58sMDo 3cf1/Gsh7sADnt0B6V3er2UF9p8sNwwRfvCQn7hHQ15XK7xyFCc4OMjoa3hLQyktSzc3OSew+tZ5 JcjHJz6fp70E5JyMn3NdH4MsbS81NpZ5EMkADRxHALH+97gfzIP1G7K4Ja2Ox8OaadL0aGCQYmb9 5J/vHt+AwPwrXNFJWD1NRaKKKACiiigAoo7VSvr9LKIMRuduFUd6EribLbMEUsxAA6knisu71y3g ysX71/Y4X8+/4ZrBub2e7YtMxIB4UHAH4f1qD19cdMVtGn3Ic+xLfXlxfZEj/KOQo+6P8awbu0yT gcVs4Bzkkk+9RtGrk9CMHv1rSySsiLtnLNAwONpwT370+CGVZQ6MyuDlShIII7gjp9a3mtFJJwMC nR2ip2ANKwGxpPiK4WNYr8GUY/1q8MPqOn+e9dJb3cF2m6CVXHcA4I+o6iuLVAFHtTGDKwdGZWBy GU4I+hFQ6aexam+p6BRXH6X4meKZbfUG3RkgLMeCp/2vUe/866+smmty077C0UUUhiZwMnpXHX10 by6eTtnCj2H8v/r10uqS+Tp0zDqV2/mcVyJOBwCTjsela0l1M5voB4AGMnPbvQAc4GRkY5/zxSYx xwCBSnggDk/yrYzADgdScdh0oPAPTpQc4POKOAcZJP8AKgAI5PA6dqTqAegzwAOv+NL256+nrRwA ACSfYUABxk8frTWAK46nH+fpTiMEdc5/KkY/KcZJx2PSgDKvkwDwM57d66zwhqZvNOa1kJMtsQuT 3U9PywR+ArlrwYUjjIHNS+ErkweJI4x92ZGRvbjI/UD86zmrouL1PSaKKKwNTK14/wCgKPWQA/ka 5odvpRRW9LYxnuIOh/GjFFFaEinv9f6U0nCgiiigBcdKF+YjNFFAAOWx7Udh9KKKAM27+4341U0p jHr9gV4JuIx+bYooqHsyo7nrFFFFc5sf/9k= "
+ id="image15329-3-3"
+ x="84.471268"
+ y="-923.71503"
+ style="display:inline"
+ inkscape:export-filename="/home/vjrj/proyectos/dev/kune/trunk/img/webtemplate/chat-revisited.png"
+ inkscape:export-xdpi="90"
+ inkscape:export-ydpi="90" />
+ <text
+ xml:space="preserve"
+ style="font-size:18px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:100%;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;baseline-shift:baseline;opacity:0.82999998;color:#000000;fill:#782121;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.52077562px;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Ubuntu;-inkscape-font-specification:Ubuntu Bold"
+ x="241.19073"
+ y="-365.95026"
+ id="text3878"
+ sodipodi:linespacing="100%"
+ inkscape:export-filename="/home/vjrj/proyectos/dev/kune/trunk/img/webtemplate/chat-revisited.png"
+ inkscape:export-xdpi="90"
+ inkscape:export-ydpi="90"><tspan
+ sodipodi:role="line"
+ id="tspan3880"
+ x="241.19073"
+ y="-365.95026">Send</tspan></text>
+ <rect
+ y="-386.09869"
+ x="302.39435"
+ height="29.156178"
+ width="32.800701"
+ id="rect3882"
+ style="opacity:0.82999998;color:#000000;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.52077562px;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+ inkscape:export-filename="/home/vjrj/proyectos/dev/kune/trunk/img/webtemplate/chat-revisited.png"
+ inkscape:export-xdpi="90"
+ inkscape:export-ydpi="90" />
+ <rect
+ style="opacity:0.82999998;color:#000000;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.52077562px;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+ id="rect3884"
+ width="30.371019"
+ height="29.156178"
+ x="302.39435"
+ y="-386.09869"
+ inkscape:export-filename="/home/vjrj/proyectos/dev/kune/trunk/img/webtemplate/chat-revisited.png"
+ inkscape:export-xdpi="90"
+ inkscape:export-ydpi="90" />
+ <text
+ sodipodi:linespacing="100%"
+ id="text3887"
+ y="-363.95026"
+ x="310.19073"
+ style="font-size:22px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:100%;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;baseline-shift:baseline;opacity:0.82999998;color:#000000;fill:#782121;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.52077562px;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Ubuntu;-inkscape-font-specification:Ubuntu Bold"
+ xml:space="preserve"
+ inkscape:export-filename="/home/vjrj/proyectos/dev/kune/trunk/img/webtemplate/chat-revisited.png"
+ inkscape:export-xdpi="90"
+ inkscape:export-ydpi="90"><tspan
+ y="-363.95026"
+ x="310.19073"
+ id="tspan3889"
+ sodipodi:role="line">:)</tspan></text>
+ <rect
+ style="opacity:0.82999998;color:#000000;fill:#d1b8b8;fill-opacity:0.97254902;fill-rule:nonzero;stroke:#a02c2c;stroke-width:2;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+ id="rect3891"
+ width="349.99832"
+ height="82.609161"
+ x="238.29099"
+ y="-919.56219"
+ ry="31.585857"
+ rx="27.941336"
+ inkscape:export-filename="/home/vjrj/proyectos/dev/kune/trunk/img/webtemplate/chat-revisited.png"
+ inkscape:export-xdpi="90"
+ inkscape:export-ydpi="90" />
+ <rect
+ style="color:#000000;fill:#d1b8b8;fill-opacity:0.97255111;fill-rule:nonzero;stroke:none;stroke-width:0.52077562px;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+ id="rect6401"
+ width="73.859985"
+ height="21.884439"
+ x="266.71661"
+ y="-932.573"
+ inkscape:export-filename="/home/vjrj/proyectos/dev/kune/trunk/img/webtemplate/chat-revisited.png"
+ inkscape:export-xdpi="90"
+ inkscape:export-ydpi="90" />
+ <image
+ inkscape:export-ydpi="90"
+ inkscape:export-xdpi="90"
+ inkscape:export-filename="/home/vjrj/proyectos/dev/kune/trunk/img/webtemplate/chat-revisited.png"
+ width="16"
+ height="32"
+ id="image12519-4"
+ x="210.80858"
+ y="-701.30103"
+ style="display:inline"
+ xlink:href="/home/vjrj/proyectos/ourproject.org/kune/svn/trunk/img/various/scroll2.png"
+ sodipodi:absref="/home/vjrj/proyectos/ourproject.org/kune/svn/trunk/img/various/scroll2.png" />
+ <image
+ sodipodi:absref="/home/vjrj/proyectos/ourproject.org/kune/svn/trunk/img/various/scroll2.png"
+ xlink:href="/home/vjrj/proyectos/ourproject.org/kune/svn/trunk/img/various/scroll2.png"
+ style="display:inline"
+ y="-706.30103"
+ x="593.80859"
+ id="image3922"
+ height="32"
+ width="16"
+ inkscape:export-filename="/home/vjrj/proyectos/dev/kune/trunk/img/webtemplate/chat-revisited.png"
+ inkscape:export-xdpi="90"
+ inkscape:export-ydpi="90" />
+ <image
+ inkscape:export-ydpi="90"
+ inkscape:export-xdpi="90"
+ inkscape:export-filename="/home/vjrj/proyectos/dev/kune/trunk/img/webtemplate/chat-revisited.png"
+ width="16"
+ height="32"
+ id="image3924"
+ x="750.80859"
+ y="-707.30103"
+ style="display:inline"
+ xlink:href="/home/vjrj/proyectos/ourproject.org/kune/svn/trunk/img/various/scroll2.png"
+ sodipodi:absref="/home/vjrj/proyectos/ourproject.org/kune/svn/trunk/img/various/scroll2.png" />
+ <image
+ sodipodi:absref="/home/vjrj/proyectos/ourproject.org/kune/svn/trunk/img/various/scroll2.png"
+ xlink:href="/home/vjrj/proyectos/ourproject.org/kune/svn/trunk/img/various/scroll2.png"
+ style="display:inline"
+ y="-501.30103"
+ x="749.80859"
+ id="image3926"
+ height="32"
+ width="16"
+ inkscape:export-filename="/home/vjrj/proyectos/dev/kune/trunk/img/webtemplate/chat-revisited.png"
+ inkscape:export-xdpi="90"
+ inkscape:export-ydpi="90" />
+ <image
+ style="display:inline"
+ y="-910.71503"
+ x="260.10443"
+ id="image3928"
+ xlink:href="data:image/jpeg;base64,/9j/4AAQSkZJRgABAQAAAQABAAD/2wBDAAgGBgcGBQgHBwcJCQgKDBQNDAsLDBkSEw8UHRofHh0a HBwgJC4nICIsIxwcKDcpLDAxNDQ0Hyc5PTgyPC4zNDL/2wBDAQkJCQwLDBgNDRgyIRwhMjIyMjIy MjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjL/wAARCABkAGQDASIA AhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQA AAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3 ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWm p6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEA AwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSEx BhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElK U1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3 uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwD3+iii gAooooAKY7rGpZ2Cj1JxWZqmqfZAYoQDLjknoo9ff6Vzsksksu+RmdiTgk5IH9KuMG9SHNJ2OxS7 t5DtSeJm9A4JqeuAkQFeeTn86bZ67d6VMAXMttnDRk5x9Cen8v5hunbYFPueg0VXtbmK8to7iFw0 bjKkVYrMsKKKKACiiigAooooASmSyLFE8jfdVST9AKkqjqr+Xpk59QB+ZA/rQtxM5WSVppXlc5Zi SeeB7e1M5ySSDx+VAIx1PToKDyTxj6iuowGuODxkkevSsm+HBHBPt2rWkPB4zwayb08Ec/lQxo3v A98xe50+RjgASxg9hnDfqR+tdrXmXhCUp4ngUDiRXQ8+ik/j0Fem1zzWprHYKKKKkoKKKKACiiig AqnqieZps6+ilvy5/pVymSIJI2RujAgj60LRiZw579h/OgnoScDHAFDApIyMCHUkN7GkJGB06+vT /GuowGSnCEDIH0rFvXySMkjPY9K0rqXg9ck81hXMm44BwPek2M2fBsYl8SRt/wA80duvTIx/WvSx XDeAbbMt5dEYAVY1Prnk/wAh+ddzWE3qax2CiiipKCiiigAooooAKKKKAOL8QQGx1IygHy58sMDo 3cf1/Gsh7sADnt0B6V3er2UF9p8sNwwRfvCQn7hHQ15XK7xyFCc4OMjoa3hLQyktSzc3OSew+tZ5 JcjHJz6fp70E5JyMn3NdH4MsbS81NpZ5EMkADRxHALH+97gfzIP1G7K4Ja2Ox8OaadL0aGCQYmb9 5J/vHt+AwPwrXNFJWD1NRaKKKACiiigAoo7VSvr9LKIMRuduFUd6EribLbMEUsxAA6knisu71y3g ysX71/Y4X8+/4ZrBub2e7YtMxIB4UHAH4f1qD19cdMVtGn3Ic+xLfXlxfZEj/KOQo+6P8awbu0yT gcVs4Bzkkk+9RtGrk9CMHv1rSySsiLtnLNAwONpwT370+CGVZQ6MyuDlShIII7gjp9a3mtFJJwMC nR2ip2ANKwGxpPiK4WNYr8GUY/1q8MPqOn+e9dJb3cF2m6CVXHcA4I+o6iuLVAFHtTGDKwdGZWBy GU4I+hFQ6aexam+p6BRXH6X4meKZbfUG3RkgLMeCp/2vUe/866+smmty077C0UUUhiZwMnpXHX10 by6eTtnCj2H8v/r10uqS+Tp0zDqV2/mcVyJOBwCTjsela0l1M5voB4AGMnPbvQAc4GRkY5/zxSYx xwCBSnggDk/yrYzADgdScdh0oPAPTpQc4POKOAcZJP8AKgAI5PA6dqTqAegzwAOv+NL256+nrRwA ACSfYUABxk8frTWAK46nH+fpTiMEdc5/KkY/KcZJx2PSgDKvkwDwM57d66zwhqZvNOa1kJMtsQuT 3U9PywR+ArlrwYUjjIHNS+ErkweJI4x92ZGRvbjI/UD86zmrouL1PSaKKKwNTK14/wCgKPWQA/ka 5odvpRRW9LYxnuIOh/GjFFFaEinv9f6U0nCgiiigBcdKF+YjNFFAAOWx7Udh9KKKAM27+4341U0p jHr9gV4JuIx+bYooqHsyo7nrFFFFc5sf/9k= "
+ height="31.743042"
+ width="31.736002"
+ inkscape:export-filename="/home/vjrj/proyectos/dev/kune/trunk/img/webtemplate/chat-revisited.png"
+ inkscape:export-xdpi="90"
+ inkscape:export-ydpi="90" />
+ <image
+ width="31.736002"
+ height="31.743042"
+ xlink:href="data:image/jpeg;base64,/9j/4AAQSkZJRgABAQAAAQABAAD/2wBDAAgGBgcGBQgHBwcJCQgKDBQNDAsLDBkSEw8UHRofHh0a HBwgJC4nICIsIxwcKDcpLDAxNDQ0Hyc5PTgyPC4zNDL/2wBDAQkJCQwLDBgNDRgyIRwhMjIyMjIy MjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjL/wAARCABkAGQDASIA AhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQA AAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3 ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWm p6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEA AwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSEx BhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElK U1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3 uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwD3+iii gAooooAKY7rGpZ2Cj1JxWZqmqfZAYoQDLjknoo9ff6Vzsksksu+RmdiTgk5IH9KuMG9SHNJ2OxS7 t5DtSeJm9A4JqeuAkQFeeTn86bZ67d6VMAXMttnDRk5x9Cen8v5hunbYFPueg0VXtbmK8to7iFw0 bjKkVYrMsKKKKACiiigAooooASmSyLFE8jfdVST9AKkqjqr+Xpk59QB+ZA/rQtxM5WSVppXlc5Zi SeeB7e1M5ySSDx+VAIx1PToKDyTxj6iuowGuODxkkevSsm+HBHBPt2rWkPB4zwayb08Ec/lQxo3v A98xe50+RjgASxg9hnDfqR+tdrXmXhCUp4ngUDiRXQ8+ik/j0Fem1zzWprHYKKKKkoKKKKACiiig AqnqieZps6+ilvy5/pVymSIJI2RujAgj60LRiZw579h/OgnoScDHAFDApIyMCHUkN7GkJGB06+vT /GuowGSnCEDIH0rFvXySMkjPY9K0rqXg9ck81hXMm44BwPek2M2fBsYl8SRt/wA80duvTIx/WvSx XDeAbbMt5dEYAVY1Prnk/wAh+ddzWE3qax2CiiipKCiiigAooooAKKKKAOL8QQGx1IygHy58sMDo 3cf1/Gsh7sADnt0B6V3er2UF9p8sNwwRfvCQn7hHQ15XK7xyFCc4OMjoa3hLQyktSzc3OSew+tZ5 JcjHJz6fp70E5JyMn3NdH4MsbS81NpZ5EMkADRxHALH+97gfzIP1G7K4Ja2Ox8OaadL0aGCQYmb9 5J/vHt+AwPwrXNFJWD1NRaKKKACiiigAoo7VSvr9LKIMRuduFUd6EribLbMEUsxAA6knisu71y3g ysX71/Y4X8+/4ZrBub2e7YtMxIB4UHAH4f1qD19cdMVtGn3Ic+xLfXlxfZEj/KOQo+6P8awbu0yT gcVs4Bzkkk+9RtGrk9CMHv1rSySsiLtnLNAwONpwT370+CGVZQ6MyuDlShIII7gjp9a3mtFJJwMC nR2ip2ANKwGxpPiK4WNYr8GUY/1q8MPqOn+e9dJb3cF2m6CVXHcA4I+o6iuLVAFHtTGDKwdGZWBy GU4I+hFQ6aexam+p6BRXH6X4meKZbfUG3RkgLMeCp/2vUe/866+smmty077C0UUUhiZwMnpXHX10 by6eTtnCj2H8v/r10uqS+Tp0zDqV2/mcVyJOBwCTjsela0l1M5voB4AGMnPbvQAc4GRkY5/zxSYx xwCBSnggDk/yrYzADgdScdh0oPAPTpQc4POKOAcZJP8AKgAI5PA6dqTqAegzwAOv+NL256+nrRwA ACSfYUABxk8frTWAK46nH+fpTiMEdc5/KkY/KcZJx2PSgDKvkwDwM57d66zwhqZvNOa1kJMtsQuT 3U9PywR+ArlrwYUjjIHNS+ErkweJI4x92ZGRvbjI/UD86zmrouL1PSaKKKwNTK14/wCgKPWQA/ka 5odvpRRW9LYxnuIOh/GjFFFaEinv9f6U0nCgiiigBcdKF+YjNFFAAOWx7Udh9KKKAM27+4341U0p jHr9gV4JuIx+bYooqHsyo7nrFFFFc5sf/9k= "
+ id="image3930"
+ x="296.10443"
+ y="-910.71503"
+ style="display:inline"
+ inkscape:export-filename="/home/vjrj/proyectos/dev/kune/trunk/img/webtemplate/chat-revisited.png"
+ inkscape:export-xdpi="90"
+ inkscape:export-ydpi="90" />
+ <image
+ style="display:inline"
+ y="-910.71503"
+ x="331.10443"
+ id="image3932"
+ xlink:href="data:image/jpeg;base64,/9j/4AAQSkZJRgABAQAAAQABAAD/2wBDAAgGBgcGBQgHBwcJCQgKDBQNDAsLDBkSEw8UHRofHh0a HBwgJC4nICIsIxwcKDcpLDAxNDQ0Hyc5PTgyPC4zNDL/2wBDAQkJCQwLDBgNDRgyIRwhMjIyMjIy MjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjL/wAARCABkAGQDASIA AhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQA AAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3 ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWm p6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEA AwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSEx BhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElK U1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3 uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwD3+iii gAooooAKY7rGpZ2Cj1JxWZqmqfZAYoQDLjknoo9ff6Vzsksksu+RmdiTgk5IH9KuMG9SHNJ2OxS7 t5DtSeJm9A4JqeuAkQFeeTn86bZ67d6VMAXMttnDRk5x9Cen8v5hunbYFPueg0VXtbmK8to7iFw0 bjKkVYrMsKKKKACiiigAooooASmSyLFE8jfdVST9AKkqjqr+Xpk59QB+ZA/rQtxM5WSVppXlc5Zi SeeB7e1M5ySSDx+VAIx1PToKDyTxj6iuowGuODxkkevSsm+HBHBPt2rWkPB4zwayb08Ec/lQxo3v A98xe50+RjgASxg9hnDfqR+tdrXmXhCUp4ngUDiRXQ8+ik/j0Fem1zzWprHYKKKKkoKKKKACiiig AqnqieZps6+ilvy5/pVymSIJI2RujAgj60LRiZw579h/OgnoScDHAFDApIyMCHUkN7GkJGB06+vT /GuowGSnCEDIH0rFvXySMkjPY9K0rqXg9ck81hXMm44BwPek2M2fBsYl8SRt/wA80duvTIx/WvSx XDeAbbMt5dEYAVY1Prnk/wAh+ddzWE3qax2CiiipKCiiigAooooAKKKKAOL8QQGx1IygHy58sMDo 3cf1/Gsh7sADnt0B6V3er2UF9p8sNwwRfvCQn7hHQ15XK7xyFCc4OMjoa3hLQyktSzc3OSew+tZ5 JcjHJz6fp70E5JyMn3NdH4MsbS81NpZ5EMkADRxHALH+97gfzIP1G7K4Ja2Ox8OaadL0aGCQYmb9 5J/vHt+AwPwrXNFJWD1NRaKKKACiiigAoo7VSvr9LKIMRuduFUd6EribLbMEUsxAA6knisu71y3g ysX71/Y4X8+/4ZrBub2e7YtMxIB4UHAH4f1qD19cdMVtGn3Ic+xLfXlxfZEj/KOQo+6P8awbu0yT gcVs4Bzkkk+9RtGrk9CMHv1rSySsiLtnLNAwONpwT370+CGVZQ6MyuDlShIII7gjp9a3mtFJJwMC nR2ip2ANKwGxpPiK4WNYr8GUY/1q8MPqOn+e9dJb3cF2m6CVXHcA4I+o6iuLVAFHtTGDKwdGZWBy GU4I+hFQ6aexam+p6BRXH6X4meKZbfUG3RkgLMeCp/2vUe/866+smmty077C0UUUhiZwMnpXHX10 by6eTtnCj2H8v/r10uqS+Tp0zDqV2/mcVyJOBwCTjsela0l1M5voB4AGMnPbvQAc4GRkY5/zxSYx xwCBSnggDk/yrYzADgdScdh0oPAPTpQc4POKOAcZJP8AKgAI5PA6dqTqAegzwAOv+NL256+nrRwA ACSfYUABxk8frTWAK46nH+fpTiMEdc5/KkY/KcZJx2PSgDKvkwDwM57d66zwhqZvNOa1kJMtsQuT 3U9PywR+ArlrwYUjjIHNS+ErkweJI4x92ZGRvbjI/UD86zmrouL1PSaKKKwNTK14/wCgKPWQA/ka 5odvpRRW9LYxnuIOh/GjFFFaEinv9f6U0nCgiiigBcdKF+YjNFFAAOWx7Udh9KKKAM27+4341U0p jHr9gV4JuIx+bYooqHsyo7nrFFFFc5sf/9k= "
+ height="31.743042"
+ width="31.736002"
+ inkscape:export-filename="/home/vjrj/proyectos/dev/kune/trunk/img/webtemplate/chat-revisited.png"
+ inkscape:export-xdpi="90"
+ inkscape:export-ydpi="90" />
+ <image
+ width="31.736002"
+ height="31.743042"
+ xlink:href="data:image/jpeg;base64,/9j/4AAQSkZJRgABAQAAAQABAAD/2wBDAAgGBgcGBQgHBwcJCQgKDBQNDAsLDBkSEw8UHRofHh0a HBwgJC4nICIsIxwcKDcpLDAxNDQ0Hyc5PTgyPC4zNDL/2wBDAQkJCQwLDBgNDRgyIRwhMjIyMjIy MjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjL/wAARCABkAGQDASIA AhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQA AAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3 ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWm p6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEA AwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSEx BhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElK U1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3 uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwD3+iii gAooooAKY7rGpZ2Cj1JxWZqmqfZAYoQDLjknoo9ff6Vzsksksu+RmdiTgk5IH9KuMG9SHNJ2OxS7 t5DtSeJm9A4JqeuAkQFeeTn86bZ67d6VMAXMttnDRk5x9Cen8v5hunbYFPueg0VXtbmK8to7iFw0 bjKkVYrMsKKKKACiiigAooooASmSyLFE8jfdVST9AKkqjqr+Xpk59QB+ZA/rQtxM5WSVppXlc5Zi SeeB7e1M5ySSDx+VAIx1PToKDyTxj6iuowGuODxkkevSsm+HBHBPt2rWkPB4zwayb08Ec/lQxo3v A98xe50+RjgASxg9hnDfqR+tdrXmXhCUp4ngUDiRXQ8+ik/j0Fem1zzWprHYKKKKkoKKKKACiiig AqnqieZps6+ilvy5/pVymSIJI2RujAgj60LRiZw579h/OgnoScDHAFDApIyMCHUkN7GkJGB06+vT /GuowGSnCEDIH0rFvXySMkjPY9K0rqXg9ck81hXMm44BwPek2M2fBsYl8SRt/wA80duvTIx/WvSx XDeAbbMt5dEYAVY1Prnk/wAh+ddzWE3qax2CiiipKCiiigAooooAKKKKAOL8QQGx1IygHy58sMDo 3cf1/Gsh7sADnt0B6V3er2UF9p8sNwwRfvCQn7hHQ15XK7xyFCc4OMjoa3hLQyktSzc3OSew+tZ5 JcjHJz6fp70E5JyMn3NdH4MsbS81NpZ5EMkADRxHALH+97gfzIP1G7K4Ja2Ox8OaadL0aGCQYmb9 5J/vHt+AwPwrXNFJWD1NRaKKKACiiigAoo7VSvr9LKIMRuduFUd6EribLbMEUsxAA6knisu71y3g ysX71/Y4X8+/4ZrBub2e7YtMxIB4UHAH4f1qD19cdMVtGn3Ic+xLfXlxfZEj/KOQo+6P8awbu0yT gcVs4Bzkkk+9RtGrk9CMHv1rSySsiLtnLNAwONpwT370+CGVZQ6MyuDlShIII7gjp9a3mtFJJwMC nR2ip2ANKwGxpPiK4WNYr8GUY/1q8MPqOn+e9dJb3cF2m6CVXHcA4I+o6iuLVAFHtTGDKwdGZWBy GU4I+hFQ6aexam+p6BRXH6X4meKZbfUG3RkgLMeCp/2vUe/866+smmty077C0UUUhiZwMnpXHX10 by6eTtnCj2H8v/r10uqS+Tp0zDqV2/mcVyJOBwCTjsela0l1M5voB4AGMnPbvQAc4GRkY5/zxSYx xwCBSnggDk/yrYzADgdScdh0oPAPTpQc4POKOAcZJP8AKgAI5PA6dqTqAegzwAOv+NL256+nrRwA ACSfYUABxk8frTWAK46nH+fpTiMEdc5/KkY/KcZJx2PSgDKvkwDwM57d66zwhqZvNOa1kJMtsQuT 3U9PywR+ArlrwYUjjIHNS+ErkweJI4x92ZGRvbjI/UD86zmrouL1PSaKKKwNTK14/wCgKPWQA/ka 5odvpRRW9LYxnuIOh/GjFFFaEinv9f6U0nCgiiigBcdKF+YjNFFAAOWx7Udh9KKKAM27+4341U0p jHr9gV4JuIx+bYooqHsyo7nrFFFFc5sf/9k= "
+ id="image3934"
+ x="366.10443"
+ y="-910.71503"
+ style="display:inline"
+ inkscape:export-filename="/home/vjrj/proyectos/dev/kune/trunk/img/webtemplate/chat-revisited.png"
+ inkscape:export-xdpi="90"
+ inkscape:export-ydpi="90" />
+ <image
+ width="31.736002"
+ height="31.743042"
+ xlink:href="data:image/jpeg;base64,/9j/4AAQSkZJRgABAQAAAQABAAD/2wBDAAgGBgcGBQgHBwcJCQgKDBQNDAsLDBkSEw8UHRofHh0a HBwgJC4nICIsIxwcKDcpLDAxNDQ0Hyc5PTgyPC4zNDL/2wBDAQkJCQwLDBgNDRgyIRwhMjIyMjIy MjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjL/wAARCABkAGQDASIA AhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQA AAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3 ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWm p6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEA AwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSEx BhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElK U1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3 uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwD3+iii gAooooAKY7rGpZ2Cj1JxWZqmqfZAYoQDLjknoo9ff6Vzsksksu+RmdiTgk5IH9KuMG9SHNJ2OxS7 t5DtSeJm9A4JqeuAkQFeeTn86bZ67d6VMAXMttnDRk5x9Cen8v5hunbYFPueg0VXtbmK8to7iFw0 bjKkVYrMsKKKKACiiigAooooASmSyLFE8jfdVST9AKkqjqr+Xpk59QB+ZA/rQtxM5WSVppXlc5Zi SeeB7e1M5ySSDx+VAIx1PToKDyTxj6iuowGuODxkkevSsm+HBHBPt2rWkPB4zwayb08Ec/lQxo3v A98xe50+RjgASxg9hnDfqR+tdrXmXhCUp4ngUDiRXQ8+ik/j0Fem1zzWprHYKKKKkoKKKKACiiig AqnqieZps6+ilvy5/pVymSIJI2RujAgj60LRiZw579h/OgnoScDHAFDApIyMCHUkN7GkJGB06+vT /GuowGSnCEDIH0rFvXySMkjPY9K0rqXg9ck81hXMm44BwPek2M2fBsYl8SRt/wA80duvTIx/WvSx XDeAbbMt5dEYAVY1Prnk/wAh+ddzWE3qax2CiiipKCiiigAooooAKKKKAOL8QQGx1IygHy58sMDo 3cf1/Gsh7sADnt0B6V3er2UF9p8sNwwRfvCQn7hHQ15XK7xyFCc4OMjoa3hLQyktSzc3OSew+tZ5 JcjHJz6fp70E5JyMn3NdH4MsbS81NpZ5EMkADRxHALH+97gfzIP1G7K4Ja2Ox8OaadL0aGCQYmb9 5J/vHt+AwPwrXNFJWD1NRaKKKACiiigAoo7VSvr9LKIMRuduFUd6EribLbMEUsxAA6knisu71y3g ysX71/Y4X8+/4ZrBub2e7YtMxIB4UHAH4f1qD19cdMVtGn3Ic+xLfXlxfZEj/KOQo+6P8awbu0yT gcVs4Bzkkk+9RtGrk9CMHv1rSySsiLtnLNAwONpwT370+CGVZQ6MyuDlShIII7gjp9a3mtFJJwMC nR2ip2ANKwGxpPiK4WNYr8GUY/1q8MPqOn+e9dJb3cF2m6CVXHcA4I+o6iuLVAFHtTGDKwdGZWBy GU4I+hFQ6aexam+p6BRXH6X4meKZbfUG3RkgLMeCp/2vUe/866+smmty077C0UUUhiZwMnpXHX10 by6eTtnCj2H8v/r10uqS+Tp0zDqV2/mcVyJOBwCTjsela0l1M5voB4AGMnPbvQAc4GRkY5/zxSYx xwCBSnggDk/yrYzADgdScdh0oPAPTpQc4POKOAcZJP8AKgAI5PA6dqTqAegzwAOv+NL256+nrRwA ACSfYUABxk8frTWAK46nH+fpTiMEdc5/KkY/KcZJx2PSgDKvkwDwM57d66zwhqZvNOa1kJMtsQuT 3U9PywR+ArlrwYUjjIHNS+ErkweJI4x92ZGRvbjI/UD86zmrouL1PSaKKKwNTK14/wCgKPWQA/ka 5odvpRRW9LYxnuIOh/GjFFFaEinv9f6U0nCgiiigBcdKF+YjNFFAAOWx7Udh9KKKAM27+4341U0p jHr9gV4JuIx+bYooqHsyo7nrFFFFc5sf/9k= "
+ id="image3936"
+ x="400.10443"
+ y="-910.71503"
+ style="display:inline"
+ inkscape:export-filename="/home/vjrj/proyectos/dev/kune/trunk/img/webtemplate/chat-revisited.png"
+ inkscape:export-xdpi="90"
+ inkscape:export-ydpi="90" />
+ <image
+ style="display:inline"
+ y="-910.71503"
+ x="436.10443"
+ id="image3938"
+ xlink:href="data:image/jpeg;base64,/9j/4AAQSkZJRgABAQAAAQABAAD/2wBDAAgGBgcGBQgHBwcJCQgKDBQNDAsLDBkSEw8UHRofHh0a HBwgJC4nICIsIxwcKDcpLDAxNDQ0Hyc5PTgyPC4zNDL/2wBDAQkJCQwLDBgNDRgyIRwhMjIyMjIy MjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjL/wAARCABkAGQDASIA AhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQA AAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3 ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWm p6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEA AwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSEx BhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElK U1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3 uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwD3+iii gAooooAKY7rGpZ2Cj1JxWZqmqfZAYoQDLjknoo9ff6Vzsksksu+RmdiTgk5IH9KuMG9SHNJ2OxS7 t5DtSeJm9A4JqeuAkQFeeTn86bZ67d6VMAXMttnDRk5x9Cen8v5hunbYFPueg0VXtbmK8to7iFw0 bjKkVYrMsKKKKACiiigAooooASmSyLFE8jfdVST9AKkqjqr+Xpk59QB+ZA/rQtxM5WSVppXlc5Zi SeeB7e1M5ySSDx+VAIx1PToKDyTxj6iuowGuODxkkevSsm+HBHBPt2rWkPB4zwayb08Ec/lQxo3v A98xe50+RjgASxg9hnDfqR+tdrXmXhCUp4ngUDiRXQ8+ik/j0Fem1zzWprHYKKKKkoKKKKACiiig AqnqieZps6+ilvy5/pVymSIJI2RujAgj60LRiZw579h/OgnoScDHAFDApIyMCHUkN7GkJGB06+vT /GuowGSnCEDIH0rFvXySMkjPY9K0rqXg9ck81hXMm44BwPek2M2fBsYl8SRt/wA80duvTIx/WvSx XDeAbbMt5dEYAVY1Prnk/wAh+ddzWE3qax2CiiipKCiiigAooooAKKKKAOL8QQGx1IygHy58sMDo 3cf1/Gsh7sADnt0B6V3er2UF9p8sNwwRfvCQn7hHQ15XK7xyFCc4OMjoa3hLQyktSzc3OSew+tZ5 JcjHJz6fp70E5JyMn3NdH4MsbS81NpZ5EMkADRxHALH+97gfzIP1G7K4Ja2Ox8OaadL0aGCQYmb9 5J/vHt+AwPwrXNFJWD1NRaKKKACiiigAoo7VSvr9LKIMRuduFUd6EribLbMEUsxAA6knisu71y3g ysX71/Y4X8+/4ZrBub2e7YtMxIB4UHAH4f1qD19cdMVtGn3Ic+xLfXlxfZEj/KOQo+6P8awbu0yT gcVs4Bzkkk+9RtGrk9CMHv1rSySsiLtnLNAwONpwT370+CGVZQ6MyuDlShIII7gjp9a3mtFJJwMC nR2ip2ANKwGxpPiK4WNYr8GUY/1q8MPqOn+e9dJb3cF2m6CVXHcA4I+o6iuLVAFHtTGDKwdGZWBy GU4I+hFQ6aexam+p6BRXH6X4meKZbfUG3RkgLMeCp/2vUe/866+smmty077C0UUUhiZwMnpXHX10 by6eTtnCj2H8v/r10uqS+Tp0zDqV2/mcVyJOBwCTjsela0l1M5voB4AGMnPbvQAc4GRkY5/zxSYx xwCBSnggDk/yrYzADgdScdh0oPAPTpQc4POKOAcZJP8AKgAI5PA6dqTqAegzwAOv+NL256+nrRwA ACSfYUABxk8frTWAK46nH+fpTiMEdc5/KkY/KcZJx2PSgDKvkwDwM57d66zwhqZvNOa1kJMtsQuT 3U9PywR+ArlrwYUjjIHNS+ErkweJI4x92ZGRvbjI/UD86zmrouL1PSaKKKwNTK14/wCgKPWQA/ka 5odvpRRW9LYxnuIOh/GjFFFaEinv9f6U0nCgiiigBcdKF+YjNFFAAOWx7Udh9KKKAM27+4341U0p jHr9gV4JuIx+bYooqHsyo7nrFFFFc5sf/9k= "
+ height="31.743042"
+ width="31.736002"
+ inkscape:export-filename="/home/vjrj/proyectos/dev/kune/trunk/img/webtemplate/chat-revisited.png"
+ inkscape:export-xdpi="90"
+ inkscape:export-ydpi="90" />
+ <image
+ width="31.736002"
+ height="31.743042"
+ xlink:href="data:image/jpeg;base64,/9j/4AAQSkZJRgABAQAAAQABAAD/2wBDAAgGBgcGBQgHBwcJCQgKDBQNDAsLDBkSEw8UHRofHh0a HBwgJC4nICIsIxwcKDcpLDAxNDQ0Hyc5PTgyPC4zNDL/2wBDAQkJCQwLDBgNDRgyIRwhMjIyMjIy MjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjL/wAARCABkAGQDASIA AhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQA AAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3 ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWm p6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEA AwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSEx BhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElK U1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3 uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwD3+iii gAooooAKY7rGpZ2Cj1JxWZqmqfZAYoQDLjknoo9ff6Vzsksksu+RmdiTgk5IH9KuMG9SHNJ2OxS7 t5DtSeJm9A4JqeuAkQFeeTn86bZ67d6VMAXMttnDRk5x9Cen8v5hunbYFPueg0VXtbmK8to7iFw0 bjKkVYrMsKKKKACiiigAooooASmSyLFE8jfdVST9AKkqjqr+Xpk59QB+ZA/rQtxM5WSVppXlc5Zi SeeB7e1M5ySSDx+VAIx1PToKDyTxj6iuowGuODxkkevSsm+HBHBPt2rWkPB4zwayb08Ec/lQxo3v A98xe50+RjgASxg9hnDfqR+tdrXmXhCUp4ngUDiRXQ8+ik/j0Fem1zzWprHYKKKKkoKKKKACiiig AqnqieZps6+ilvy5/pVymSIJI2RujAgj60LRiZw579h/OgnoScDHAFDApIyMCHUkN7GkJGB06+vT /GuowGSnCEDIH0rFvXySMkjPY9K0rqXg9ck81hXMm44BwPek2M2fBsYl8SRt/wA80duvTIx/WvSx XDeAbbMt5dEYAVY1Prnk/wAh+ddzWE3qax2CiiipKCiiigAooooAKKKKAOL8QQGx1IygHy58sMDo 3cf1/Gsh7sADnt0B6V3er2UF9p8sNwwRfvCQn7hHQ15XK7xyFCc4OMjoa3hLQyktSzc3OSew+tZ5 JcjHJz6fp70E5JyMn3NdH4MsbS81NpZ5EMkADRxHALH+97gfzIP1G7K4Ja2Ox8OaadL0aGCQYmb9 5J/vHt+AwPwrXNFJWD1NRaKKKACiiigAoo7VSvr9LKIMRuduFUd6EribLbMEUsxAA6knisu71y3g ysX71/Y4X8+/4ZrBub2e7YtMxIB4UHAH4f1qD19cdMVtGn3Ic+xLfXlxfZEj/KOQo+6P8awbu0yT gcVs4Bzkkk+9RtGrk9CMHv1rSySsiLtnLNAwONpwT370+CGVZQ6MyuDlShIII7gjp9a3mtFJJwMC nR2ip2ANKwGxpPiK4WNYr8GUY/1q8MPqOn+e9dJb3cF2m6CVXHcA4I+o6iuLVAFHtTGDKwdGZWBy GU4I+hFQ6aexam+p6BRXH6X4meKZbfUG3RkgLMeCp/2vUe/866+smmty077C0UUUhiZwMnpXHX10 by6eTtnCj2H8v/r10uqS+Tp0zDqV2/mcVyJOBwCTjsela0l1M5voB4AGMnPbvQAc4GRkY5/zxSYx xwCBSnggDk/yrYzADgdScdh0oPAPTpQc4POKOAcZJP8AKgAI5PA6dqTqAegzwAOv+NL256+nrRwA ACSfYUABxk8frTWAK46nH+fpTiMEdc5/KkY/KcZJx2PSgDKvkwDwM57d66zwhqZvNOa1kJMtsQuT 3U9PywR+ArlrwYUjjIHNS+ErkweJI4x92ZGRvbjI/UD86zmrouL1PSaKKKwNTK14/wCgKPWQA/ka 5odvpRRW9LYxnuIOh/GjFFFaEinv9f6U0nCgiiigBcdKF+YjNFFAAOWx7Udh9KKKAM27+4341U0p jHr9gV4JuIx+bYooqHsyo7nrFFFFc5sf/9k= "
+ id="image3940"
+ x="471.10443"
+ y="-910.71503"
+ style="display:inline"
+ inkscape:export-filename="/home/vjrj/proyectos/dev/kune/trunk/img/webtemplate/chat-revisited.png"
+ inkscape:export-xdpi="90"
+ inkscape:export-ydpi="90" />
+ <image
+ style="display:inline"
+ y="-910.71503"
+ x="506.10443"
+ id="image3942"
+ xlink:href="data:image/jpeg;base64,/9j/4AAQSkZJRgABAQAAAQABAAD/2wBDAAgGBgcGBQgHBwcJCQgKDBQNDAsLDBkSEw8UHRofHh0a HBwgJC4nICIsIxwcKDcpLDAxNDQ0Hyc5PTgyPC4zNDL/2wBDAQkJCQwLDBgNDRgyIRwhMjIyMjIy MjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjL/wAARCABkAGQDASIA AhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQA AAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3 ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWm p6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEA AwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSEx BhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElK U1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3 uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwD3+iii gAooooAKY7rGpZ2Cj1JxWZqmqfZAYoQDLjknoo9ff6Vzsksksu+RmdiTgk5IH9KuMG9SHNJ2OxS7 t5DtSeJm9A4JqeuAkQFeeTn86bZ67d6VMAXMttnDRk5x9Cen8v5hunbYFPueg0VXtbmK8to7iFw0 bjKkVYrMsKKKKACiiigAooooASmSyLFE8jfdVST9AKkqjqr+Xpk59QB+ZA/rQtxM5WSVppXlc5Zi SeeB7e1M5ySSDx+VAIx1PToKDyTxj6iuowGuODxkkevSsm+HBHBPt2rWkPB4zwayb08Ec/lQxo3v A98xe50+RjgASxg9hnDfqR+tdrXmXhCUp4ngUDiRXQ8+ik/j0Fem1zzWprHYKKKKkoKKKKACiiig AqnqieZps6+ilvy5/pVymSIJI2RujAgj60LRiZw579h/OgnoScDHAFDApIyMCHUkN7GkJGB06+vT /GuowGSnCEDIH0rFvXySMkjPY9K0rqXg9ck81hXMm44BwPek2M2fBsYl8SRt/wA80duvTIx/WvSx XDeAbbMt5dEYAVY1Prnk/wAh+ddzWE3qax2CiiipKCiiigAooooAKKKKAOL8QQGx1IygHy58sMDo 3cf1/Gsh7sADnt0B6V3er2UF9p8sNwwRfvCQn7hHQ15XK7xyFCc4OMjoa3hLQyktSzc3OSew+tZ5 JcjHJz6fp70E5JyMn3NdH4MsbS81NpZ5EMkADRxHALH+97gfzIP1G7K4Ja2Ox8OaadL0aGCQYmb9 5J/vHt+AwPwrXNFJWD1NRaKKKACiiigAoo7VSvr9LKIMRuduFUd6EribLbMEUsxAA6knisu71y3g ysX71/Y4X8+/4ZrBub2e7YtMxIB4UHAH4f1qD19cdMVtGn3Ic+xLfXlxfZEj/KOQo+6P8awbu0yT gcVs4Bzkkk+9RtGrk9CMHv1rSySsiLtnLNAwONpwT370+CGVZQ6MyuDlShIII7gjp9a3mtFJJwMC nR2ip2ANKwGxpPiK4WNYr8GUY/1q8MPqOn+e9dJb3cF2m6CVXHcA4I+o6iuLVAFHtTGDKwdGZWBy GU4I+hFQ6aexam+p6BRXH6X4meKZbfUG3RkgLMeCp/2vUe/866+smmty077C0UUUhiZwMnpXHX10 by6eTtnCj2H8v/r10uqS+Tp0zDqV2/mcVyJOBwCTjsela0l1M5voB4AGMnPbvQAc4GRkY5/zxSYx xwCBSnggDk/yrYzADgdScdh0oPAPTpQc4POKOAcZJP8AKgAI5PA6dqTqAegzwAOv+NL256+nrRwA ACSfYUABxk8frTWAK46nH+fpTiMEdc5/KkY/KcZJx2PSgDKvkwDwM57d66zwhqZvNOa1kJMtsQuT 3U9PywR+ArlrwYUjjIHNS+ErkweJI4x92ZGRvbjI/UD86zmrouL1PSaKKKwNTK14/wCgKPWQA/ka 5odvpRRW9LYxnuIOh/GjFFFaEinv9f6U0nCgiiigBcdKF+YjNFFAAOWx7Udh9KKKAM27+4341U0p jHr9gV4JuIx+bYooqHsyo7nrFFFFc5sf/9k= "
+ height="31.743042"
+ width="31.736002"
+ inkscape:export-filename="/home/vjrj/proyectos/dev/kune/trunk/img/webtemplate/chat-revisited.png"
+ inkscape:export-xdpi="90"
+ inkscape:export-ydpi="90" />
+ <image
+ style="display:inline"
+ y="-875.71503"
+ x="260.10443"
+ id="image3944"
+ xlink:href="data:image/jpeg;base64,/9j/4AAQSkZJRgABAQAAAQABAAD/2wBDAAgGBgcGBQgHBwcJCQgKDBQNDAsLDBkSEw8UHRofHh0a HBwgJC4nICIsIxwcKDcpLDAxNDQ0Hyc5PTgyPC4zNDL/2wBDAQkJCQwLDBgNDRgyIRwhMjIyMjIy MjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjL/wAARCABkAGQDASIA AhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQA AAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3 ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWm p6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEA AwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSEx BhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElK U1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3 uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwD3+iii gAooooAKY7rGpZ2Cj1JxWZqmqfZAYoQDLjknoo9ff6Vzsksksu+RmdiTgk5IH9KuMG9SHNJ2OxS7 t5DtSeJm9A4JqeuAkQFeeTn86bZ67d6VMAXMttnDRk5x9Cen8v5hunbYFPueg0VXtbmK8to7iFw0 bjKkVYrMsKKKKACiiigAooooASmSyLFE8jfdVST9AKkqjqr+Xpk59QB+ZA/rQtxM5WSVppXlc5Zi SeeB7e1M5ySSDx+VAIx1PToKDyTxj6iuowGuODxkkevSsm+HBHBPt2rWkPB4zwayb08Ec/lQxo3v A98xe50+RjgASxg9hnDfqR+tdrXmXhCUp4ngUDiRXQ8+ik/j0Fem1zzWprHYKKKKkoKKKKACiiig AqnqieZps6+ilvy5/pVymSIJI2RujAgj60LRiZw579h/OgnoScDHAFDApIyMCHUkN7GkJGB06+vT /GuowGSnCEDIH0rFvXySMkjPY9K0rqXg9ck81hXMm44BwPek2M2fBsYl8SRt/wA80duvTIx/WvSx XDeAbbMt5dEYAVY1Prnk/wAh+ddzWE3qax2CiiipKCiiigAooooAKKKKAOL8QQGx1IygHy58sMDo 3cf1/Gsh7sADnt0B6V3er2UF9p8sNwwRfvCQn7hHQ15XK7xyFCc4OMjoa3hLQyktSzc3OSew+tZ5 JcjHJz6fp70E5JyMn3NdH4MsbS81NpZ5EMkADRxHALH+97gfzIP1G7K4Ja2Ox8OaadL0aGCQYmb9 5J/vHt+AwPwrXNFJWD1NRaKKKACiiigAoo7VSvr9LKIMRuduFUd6EribLbMEUsxAA6knisu71y3g ysX71/Y4X8+/4ZrBub2e7YtMxIB4UHAH4f1qD19cdMVtGn3Ic+xLfXlxfZEj/KOQo+6P8awbu0yT gcVs4Bzkkk+9RtGrk9CMHv1rSySsiLtnLNAwONpwT370+CGVZQ6MyuDlShIII7gjp9a3mtFJJwMC nR2ip2ANKwGxpPiK4WNYr8GUY/1q8MPqOn+e9dJb3cF2m6CVXHcA4I+o6iuLVAFHtTGDKwdGZWBy GU4I+hFQ6aexam+p6BRXH6X4meKZbfUG3RkgLMeCp/2vUe/866+smmty077C0UUUhiZwMnpXHX10 by6eTtnCj2H8v/r10uqS+Tp0zDqV2/mcVyJOBwCTjsela0l1M5voB4AGMnPbvQAc4GRkY5/zxSYx xwCBSnggDk/yrYzADgdScdh0oPAPTpQc4POKOAcZJP8AKgAI5PA6dqTqAegzwAOv+NL256+nrRwA ACSfYUABxk8frTWAK46nH+fpTiMEdc5/KkY/KcZJx2PSgDKvkwDwM57d66zwhqZvNOa1kJMtsQuT 3U9PywR+ArlrwYUjjIHNS+ErkweJI4x92ZGRvbjI/UD86zmrouL1PSaKKKwNTK14/wCgKPWQA/ka 5odvpRRW9LYxnuIOh/GjFFFaEinv9f6U0nCgiiigBcdKF+YjNFFAAOWx7Udh9KKKAM27+4341U0p jHr9gV4JuIx+bYooqHsyo7nrFFFFc5sf/9k= "
+ height="31.743042"
+ width="31.736002"
+ inkscape:export-filename="/home/vjrj/proyectos/dev/kune/trunk/img/webtemplate/chat-revisited.png"
+ inkscape:export-xdpi="90"
+ inkscape:export-ydpi="90" />
+ <image
+ width="31.736002"
+ height="31.743042"
+ xlink:href="data:image/jpeg;base64,/9j/4AAQSkZJRgABAQAAAQABAAD/2wBDAAgGBgcGBQgHBwcJCQgKDBQNDAsLDBkSEw8UHRofHh0a HBwgJC4nICIsIxwcKDcpLDAxNDQ0Hyc5PTgyPC4zNDL/2wBDAQkJCQwLDBgNDRgyIRwhMjIyMjIy MjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjL/wAARCABkAGQDASIA AhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQA AAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3 ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWm p6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEA AwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSEx BhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElK U1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3 uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwD3+iii gAooooAKY7rGpZ2Cj1JxWZqmqfZAYoQDLjknoo9ff6Vzsksksu+RmdiTgk5IH9KuMG9SHNJ2OxS7 t5DtSeJm9A4JqeuAkQFeeTn86bZ67d6VMAXMttnDRk5x9Cen8v5hunbYFPueg0VXtbmK8to7iFw0 bjKkVYrMsKKKKACiiigAooooASmSyLFE8jfdVST9AKkqjqr+Xpk59QB+ZA/rQtxM5WSVppXlc5Zi SeeB7e1M5ySSDx+VAIx1PToKDyTxj6iuowGuODxkkevSsm+HBHBPt2rWkPB4zwayb08Ec/lQxo3v A98xe50+RjgASxg9hnDfqR+tdrXmXhCUp4ngUDiRXQ8+ik/j0Fem1zzWprHYKKKKkoKKKKACiiig AqnqieZps6+ilvy5/pVymSIJI2RujAgj60LRiZw579h/OgnoScDHAFDApIyMCHUkN7GkJGB06+vT /GuowGSnCEDIH0rFvXySMkjPY9K0rqXg9ck81hXMm44BwPek2M2fBsYl8SRt/wA80duvTIx/WvSx XDeAbbMt5dEYAVY1Prnk/wAh+ddzWE3qax2CiiipKCiiigAooooAKKKKAOL8QQGx1IygHy58sMDo 3cf1/Gsh7sADnt0B6V3er2UF9p8sNwwRfvCQn7hHQ15XK7xyFCc4OMjoa3hLQyktSzc3OSew+tZ5 JcjHJz6fp70E5JyMn3NdH4MsbS81NpZ5EMkADRxHALH+97gfzIP1G7K4Ja2Ox8OaadL0aGCQYmb9 5J/vHt+AwPwrXNFJWD1NRaKKKACiiigAoo7VSvr9LKIMRuduFUd6EribLbMEUsxAA6knisu71y3g ysX71/Y4X8+/4ZrBub2e7YtMxIB4UHAH4f1qD19cdMVtGn3Ic+xLfXlxfZEj/KOQo+6P8awbu0yT gcVs4Bzkkk+9RtGrk9CMHv1rSySsiLtnLNAwONpwT370+CGVZQ6MyuDlShIII7gjp9a3mtFJJwMC nR2ip2ANKwGxpPiK4WNYr8GUY/1q8MPqOn+e9dJb3cF2m6CVXHcA4I+o6iuLVAFHtTGDKwdGZWBy GU4I+hFQ6aexam+p6BRXH6X4meKZbfUG3RkgLMeCp/2vUe/866+smmty077C0UUUhiZwMnpXHX10 by6eTtnCj2H8v/r10uqS+Tp0zDqV2/mcVyJOBwCTjsela0l1M5voB4AGMnPbvQAc4GRkY5/zxSYx xwCBSnggDk/yrYzADgdScdh0oPAPTpQc4POKOAcZJP8AKgAI5PA6dqTqAegzwAOv+NL256+nrRwA ACSfYUABxk8frTWAK46nH+fpTiMEdc5/KkY/KcZJx2PSgDKvkwDwM57d66zwhqZvNOa1kJMtsQuT 3U9PywR+ArlrwYUjjIHNS+ErkweJI4x92ZGRvbjI/UD86zmrouL1PSaKKKwNTK14/wCgKPWQA/ka 5odvpRRW9LYxnuIOh/GjFFFaEinv9f6U0nCgiiigBcdKF+YjNFFAAOWx7Udh9KKKAM27+4341U0p jHr9gV4JuIx+bYooqHsyo7nrFFFFc5sf/9k= "
+ id="image3946"
+ x="296.10443"
+ y="-875.71503"
+ style="display:inline"
+ inkscape:export-filename="/home/vjrj/proyectos/dev/kune/trunk/img/webtemplate/chat-revisited.png"
+ inkscape:export-xdpi="90"
+ inkscape:export-ydpi="90" />
+ <image
+ style="display:inline"
+ y="-875.71503"
+ x="331.10443"
+ id="image3948"
+ xlink:href="data:image/jpeg;base64,/9j/4AAQSkZJRgABAQAAAQABAAD/2wBDAAgGBgcGBQgHBwcJCQgKDBQNDAsLDBkSEw8UHRofHh0a HBwgJC4nICIsIxwcKDcpLDAxNDQ0Hyc5PTgyPC4zNDL/2wBDAQkJCQwLDBgNDRgyIRwhMjIyMjIy MjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjL/wAARCABkAGQDASIA AhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQA AAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3 ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWm p6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEA AwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSEx BhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElK U1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3 uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwD3+iii gAooooAKY7rGpZ2Cj1JxWZqmqfZAYoQDLjknoo9ff6Vzsksksu+RmdiTgk5IH9KuMG9SHNJ2OxS7 t5DtSeJm9A4JqeuAkQFeeTn86bZ67d6VMAXMttnDRk5x9Cen8v5hunbYFPueg0VXtbmK8to7iFw0 bjKkVYrMsKKKKACiiigAooooASmSyLFE8jfdVST9AKkqjqr+Xpk59QB+ZA/rQtxM5WSVppXlc5Zi SeeB7e1M5ySSDx+VAIx1PToKDyTxj6iuowGuODxkkevSsm+HBHBPt2rWkPB4zwayb08Ec/lQxo3v A98xe50+RjgASxg9hnDfqR+tdrXmXhCUp4ngUDiRXQ8+ik/j0Fem1zzWprHYKKKKkoKKKKACiiig AqnqieZps6+ilvy5/pVymSIJI2RujAgj60LRiZw579h/OgnoScDHAFDApIyMCHUkN7GkJGB06+vT /GuowGSnCEDIH0rFvXySMkjPY9K0rqXg9ck81hXMm44BwPek2M2fBsYl8SRt/wA80duvTIx/WvSx XDeAbbMt5dEYAVY1Prnk/wAh+ddzWE3qax2CiiipKCiiigAooooAKKKKAOL8QQGx1IygHy58sMDo 3cf1/Gsh7sADnt0B6V3er2UF9p8sNwwRfvCQn7hHQ15XK7xyFCc4OMjoa3hLQyktSzc3OSew+tZ5 JcjHJz6fp70E5JyMn3NdH4MsbS81NpZ5EMkADRxHALH+97gfzIP1G7K4Ja2Ox8OaadL0aGCQYmb9 5J/vHt+AwPwrXNFJWD1NRaKKKACiiigAoo7VSvr9LKIMRuduFUd6EribLbMEUsxAA6knisu71y3g ysX71/Y4X8+/4ZrBub2e7YtMxIB4UHAH4f1qD19cdMVtGn3Ic+xLfXlxfZEj/KOQo+6P8awbu0yT gcVs4Bzkkk+9RtGrk9CMHv1rSySsiLtnLNAwONpwT370+CGVZQ6MyuDlShIII7gjp9a3mtFJJwMC nR2ip2ANKwGxpPiK4WNYr8GUY/1q8MPqOn+e9dJb3cF2m6CVXHcA4I+o6iuLVAFHtTGDKwdGZWBy GU4I+hFQ6aexam+p6BRXH6X4meKZbfUG3RkgLMeCp/2vUe/866+smmty077C0UUUhiZwMnpXHX10 by6eTtnCj2H8v/r10uqS+Tp0zDqV2/mcVyJOBwCTjsela0l1M5voB4AGMnPbvQAc4GRkY5/zxSYx xwCBSnggDk/yrYzADgdScdh0oPAPTpQc4POKOAcZJP8AKgAI5PA6dqTqAegzwAOv+NL256+nrRwA ACSfYUABxk8frTWAK46nH+fpTiMEdc5/KkY/KcZJx2PSgDKvkwDwM57d66zwhqZvNOa1kJMtsQuT 3U9PywR+ArlrwYUjjIHNS+ErkweJI4x92ZGRvbjI/UD86zmrouL1PSaKKKwNTK14/wCgKPWQA/ka 5odvpRRW9LYxnuIOh/GjFFFaEinv9f6U0nCgiiigBcdKF+YjNFFAAOWx7Udh9KKKAM27+4341U0p jHr9gV4JuIx+bYooqHsyo7nrFFFFc5sf/9k= "
+ height="31.743042"
+ width="31.736002"
+ inkscape:export-filename="/home/vjrj/proyectos/dev/kune/trunk/img/webtemplate/chat-revisited.png"
+ inkscape:export-xdpi="90"
+ inkscape:export-ydpi="90" />
+ <image
+ width="31.736002"
+ height="31.743042"
+ xlink:href="data:image/jpeg;base64,/9j/4AAQSkZJRgABAQAAAQABAAD/2wBDAAgGBgcGBQgHBwcJCQgKDBQNDAsLDBkSEw8UHRofHh0a HBwgJC4nICIsIxwcKDcpLDAxNDQ0Hyc5PTgyPC4zNDL/2wBDAQkJCQwLDBgNDRgyIRwhMjIyMjIy MjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjL/wAARCABkAGQDASIA AhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQA AAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3 ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWm p6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEA AwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSEx BhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElK U1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3 uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwD3+iii gAooooAKY7rGpZ2Cj1JxWZqmqfZAYoQDLjknoo9ff6Vzsksksu+RmdiTgk5IH9KuMG9SHNJ2OxS7 t5DtSeJm9A4JqeuAkQFeeTn86bZ67d6VMAXMttnDRk5x9Cen8v5hunbYFPueg0VXtbmK8to7iFw0 bjKkVYrMsKKKKACiiigAooooASmSyLFE8jfdVST9AKkqjqr+Xpk59QB+ZA/rQtxM5WSVppXlc5Zi SeeB7e1M5ySSDx+VAIx1PToKDyTxj6iuowGuODxkkevSsm+HBHBPt2rWkPB4zwayb08Ec/lQxo3v A98xe50+RjgASxg9hnDfqR+tdrXmXhCUp4ngUDiRXQ8+ik/j0Fem1zzWprHYKKKKkoKKKKACiiig AqnqieZps6+ilvy5/pVymSIJI2RujAgj60LRiZw579h/OgnoScDHAFDApIyMCHUkN7GkJGB06+vT /GuowGSnCEDIH0rFvXySMkjPY9K0rqXg9ck81hXMm44BwPek2M2fBsYl8SRt/wA80duvTIx/WvSx XDeAbbMt5dEYAVY1Prnk/wAh+ddzWE3qax2CiiipKCiiigAooooAKKKKAOL8QQGx1IygHy58sMDo 3cf1/Gsh7sADnt0B6V3er2UF9p8sNwwRfvCQn7hHQ15XK7xyFCc4OMjoa3hLQyktSzc3OSew+tZ5 JcjHJz6fp70E5JyMn3NdH4MsbS81NpZ5EMkADRxHALH+97gfzIP1G7K4Ja2Ox8OaadL0aGCQYmb9 5J/vHt+AwPwrXNFJWD1NRaKKKACiiigAoo7VSvr9LKIMRuduFUd6EribLbMEUsxAA6knisu71y3g ysX71/Y4X8+/4ZrBub2e7YtMxIB4UHAH4f1qD19cdMVtGn3Ic+xLfXlxfZEj/KOQo+6P8awbu0yT gcVs4Bzkkk+9RtGrk9CMHv1rSySsiLtnLNAwONpwT370+CGVZQ6MyuDlShIII7gjp9a3mtFJJwMC nR2ip2ANKwGxpPiK4WNYr8GUY/1q8MPqOn+e9dJb3cF2m6CVXHcA4I+o6iuLVAFHtTGDKwdGZWBy GU4I+hFQ6aexam+p6BRXH6X4meKZbfUG3RkgLMeCp/2vUe/866+smmty077C0UUUhiZwMnpXHX10 by6eTtnCj2H8v/r10uqS+Tp0zDqV2/mcVyJOBwCTjsela0l1M5voB4AGMnPbvQAc4GRkY5/zxSYx xwCBSnggDk/yrYzADgdScdh0oPAPTpQc4POKOAcZJP8AKgAI5PA6dqTqAegzwAOv+NL256+nrRwA ACSfYUABxk8frTWAK46nH+fpTiMEdc5/KkY/KcZJx2PSgDKvkwDwM57d66zwhqZvNOa1kJMtsQuT 3U9PywR+ArlrwYUjjIHNS+ErkweJI4x92ZGRvbjI/UD86zmrouL1PSaKKKwNTK14/wCgKPWQA/ka 5odvpRRW9LYxnuIOh/GjFFFaEinv9f6U0nCgiiigBcdKF+YjNFFAAOWx7Udh9KKKAM27+4341U0p jHr9gV4JuIx+bYooqHsyo7nrFFFFc5sf/9k= "
+ id="image3950"
+ x="366.10443"
+ y="-875.71503"
+ style="display:inline"
+ inkscape:export-filename="/home/vjrj/proyectos/dev/kune/trunk/img/webtemplate/chat-revisited.png"
+ inkscape:export-xdpi="90"
+ inkscape:export-ydpi="90" />
+ <image
+ style="display:inline"
+ y="-910.71503"
+ x="541.10443"
+ id="image3952"
+ xlink:href="data:image/jpeg;base64,/9j/4AAQSkZJRgABAQAAAQABAAD/2wBDAAgGBgcGBQgHBwcJCQgKDBQNDAsLDBkSEw8UHRofHh0a HBwgJC4nICIsIxwcKDcpLDAxNDQ0Hyc5PTgyPC4zNDL/2wBDAQkJCQwLDBgNDRgyIRwhMjIyMjIy MjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjL/wAARCABkAGQDASIA AhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQA AAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3 ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWm p6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEA AwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSEx BhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElK U1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3 uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwD3+iii gAooooAKY7rGpZ2Cj1JxWZqmqfZAYoQDLjknoo9ff6Vzsksksu+RmdiTgk5IH9KuMG9SHNJ2OxS7 t5DtSeJm9A4JqeuAkQFeeTn86bZ67d6VMAXMttnDRk5x9Cen8v5hunbYFPueg0VXtbmK8to7iFw0 bjKkVYrMsKKKKACiiigAooooASmSyLFE8jfdVST9AKkqjqr+Xpk59QB+ZA/rQtxM5WSVppXlc5Zi SeeB7e1M5ySSDx+VAIx1PToKDyTxj6iuowGuODxkkevSsm+HBHBPt2rWkPB4zwayb08Ec/lQxo3v A98xe50+RjgASxg9hnDfqR+tdrXmXhCUp4ngUDiRXQ8+ik/j0Fem1zzWprHYKKKKkoKKKKACiiig AqnqieZps6+ilvy5/pVymSIJI2RujAgj60LRiZw579h/OgnoScDHAFDApIyMCHUkN7GkJGB06+vT /GuowGSnCEDIH0rFvXySMkjPY9K0rqXg9ck81hXMm44BwPek2M2fBsYl8SRt/wA80duvTIx/WvSx XDeAbbMt5dEYAVY1Prnk/wAh+ddzWE3qax2CiiipKCiiigAooooAKKKKAOL8QQGx1IygHy58sMDo 3cf1/Gsh7sADnt0B6V3er2UF9p8sNwwRfvCQn7hHQ15XK7xyFCc4OMjoa3hLQyktSzc3OSew+tZ5 JcjHJz6fp70E5JyMn3NdH4MsbS81NpZ5EMkADRxHALH+97gfzIP1G7K4Ja2Ox8OaadL0aGCQYmb9 5J/vHt+AwPwrXNFJWD1NRaKKKACiiigAoo7VSvr9LKIMRuduFUd6EribLbMEUsxAA6knisu71y3g ysX71/Y4X8+/4ZrBub2e7YtMxIB4UHAH4f1qD19cdMVtGn3Ic+xLfXlxfZEj/KOQo+6P8awbu0yT gcVs4Bzkkk+9RtGrk9CMHv1rSySsiLtnLNAwONpwT370+CGVZQ6MyuDlShIII7gjp9a3mtFJJwMC nR2ip2ANKwGxpPiK4WNYr8GUY/1q8MPqOn+e9dJb3cF2m6CVXHcA4I+o6iuLVAFHtTGDKwdGZWBy GU4I+hFQ6aexam+p6BRXH6X4meKZbfUG3RkgLMeCp/2vUe/866+smmty077C0UUUhiZwMnpXHX10 by6eTtnCj2H8v/r10uqS+Tp0zDqV2/mcVyJOBwCTjsela0l1M5voB4AGMnPbvQAc4GRkY5/zxSYx xwCBSnggDk/yrYzADgdScdh0oPAPTpQc4POKOAcZJP8AKgAI5PA6dqTqAegzwAOv+NL256+nrRwA ACSfYUABxk8frTWAK46nH+fpTiMEdc5/KkY/KcZJx2PSgDKvkwDwM57d66zwhqZvNOa1kJMtsQuT 3U9PywR+ArlrwYUjjIHNS+ErkweJI4x92ZGRvbjI/UD86zmrouL1PSaKKKwNTK14/wCgKPWQA/ka 5odvpRRW9LYxnuIOh/GjFFFaEinv9f6U0nCgiiigBcdKF+YjNFFAAOWx7Udh9KKKAM27+4341U0p jHr9gV4JuIx+bYooqHsyo7nrFFFFc5sf/9k= "
+ height="31.743042"
+ width="31.736002"
+ inkscape:export-filename="/home/vjrj/proyectos/dev/kune/trunk/img/webtemplate/chat-revisited.png"
+ inkscape:export-xdpi="90"
+ inkscape:export-ydpi="90" />
+ <rect
+ rx="27.941336"
+ ry="31.585857"
+ y="-820.56219"
+ x="238.29099"
+ height="56.408123"
+ width="349.99832"
+ id="rect3956"
+ style="opacity:0.82999998;color:#000000;fill:#d1b8b8;fill-opacity:0.97254902;fill-rule:nonzero;stroke:#1a1a1a;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+ inkscape:export-filename="/home/vjrj/proyectos/dev/kune/trunk/img/webtemplate/chat-revisited.png"
+ inkscape:export-xdpi="90"
+ inkscape:export-ydpi="90" />
+ <image
+ width="31.736002"
+ height="31.743042"
+ xlink:href="data:image/jpeg;base64,/9j/4AAQSkZJRgABAQAAAQABAAD/2wBDAAgGBgcGBQgHBwcJCQgKDBQNDAsLDBkSEw8UHRofHh0a HBwgJC4nICIsIxwcKDcpLDAxNDQ0Hyc5PTgyPC4zNDL/2wBDAQkJCQwLDBgNDRgyIRwhMjIyMjIy MjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjL/wAARCABkAGQDASIA AhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQA AAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3 ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWm p6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEA AwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSEx BhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElK U1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3 uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwD3+iii gAooooAKY7rGpZ2Cj1JxWZqmqfZAYoQDLjknoo9ff6Vzsksksu+RmdiTgk5IH9KuMG9SHNJ2OxS7 t5DtSeJm9A4JqeuAkQFeeTn86bZ67d6VMAXMttnDRk5x9Cen8v5hunbYFPueg0VXtbmK8to7iFw0 bjKkVYrMsKKKKACiiigAooooASmSyLFE8jfdVST9AKkqjqr+Xpk59QB+ZA/rQtxM5WSVppXlc5Zi SeeB7e1M5ySSDx+VAIx1PToKDyTxj6iuowGuODxkkevSsm+HBHBPt2rWkPB4zwayb08Ec/lQxo3v A98xe50+RjgASxg9hnDfqR+tdrXmXhCUp4ngUDiRXQ8+ik/j0Fem1zzWprHYKKKKkoKKKKACiiig AqnqieZps6+ilvy5/pVymSIJI2RujAgj60LRiZw579h/OgnoScDHAFDApIyMCHUkN7GkJGB06+vT /GuowGSnCEDIH0rFvXySMkjPY9K0rqXg9ck81hXMm44BwPek2M2fBsYl8SRt/wA80duvTIx/WvSx XDeAbbMt5dEYAVY1Prnk/wAh+ddzWE3qax2CiiipKCiiigAooooAKKKKAOL8QQGx1IygHy58sMDo 3cf1/Gsh7sADnt0B6V3er2UF9p8sNwwRfvCQn7hHQ15XK7xyFCc4OMjoa3hLQyktSzc3OSew+tZ5 JcjHJz6fp70E5JyMn3NdH4MsbS81NpZ5EMkADRxHALH+97gfzIP1G7K4Ja2Ox8OaadL0aGCQYmb9 5J/vHt+AwPwrXNFJWD1NRaKKKACiiigAoo7VSvr9LKIMRuduFUd6EribLbMEUsxAA6knisu71y3g ysX71/Y4X8+/4ZrBub2e7YtMxIB4UHAH4f1qD19cdMVtGn3Ic+xLfXlxfZEj/KOQo+6P8awbu0yT gcVs4Bzkkk+9RtGrk9CMHv1rSySsiLtnLNAwONpwT370+CGVZQ6MyuDlShIII7gjp9a3mtFJJwMC nR2ip2ANKwGxpPiK4WNYr8GUY/1q8MPqOn+e9dJb3cF2m6CVXHcA4I+o6iuLVAFHtTGDKwdGZWBy GU4I+hFQ6aexam+p6BRXH6X4meKZbfUG3RkgLMeCp/2vUe/866+smmty077C0UUUhiZwMnpXHX10 by6eTtnCj2H8v/r10uqS+Tp0zDqV2/mcVyJOBwCTjsela0l1M5voB4AGMnPbvQAc4GRkY5/zxSYx xwCBSnggDk/yrYzADgdScdh0oPAPTpQc4POKOAcZJP8AKgAI5PA6dqTqAegzwAOv+NL256+nrRwA ACSfYUABxk8frTWAK46nH+fpTiMEdc5/KkY/KcZJx2PSgDKvkwDwM57d66zwhqZvNOa1kJMtsQuT 3U9PywR+ArlrwYUjjIHNS+ErkweJI4x92ZGRvbjI/UD86zmrouL1PSaKKKwNTK14/wCgKPWQA/ka 5odvpRRW9LYxnuIOh/GjFFFaEinv9f6U0nCgiiigBcdKF+YjNFFAAOWx7Udh9KKKAM27+4341U0p jHr9gV4JuIx+bYooqHsyo7nrFFFFc5sf/9k= "
+ id="image3958"
+ x="260.10443"
+ y="-804.71503"
+ style="display:inline"
+ inkscape:export-filename="/home/vjrj/proyectos/dev/kune/trunk/img/webtemplate/chat-revisited.png"
+ inkscape:export-xdpi="90"
+ inkscape:export-ydpi="90" />
+ <image
+ style="display:inline"
+ y="-804.71503"
+ x="296.10443"
+ id="image3960"
+ xlink:href="data:image/jpeg;base64,/9j/4AAQSkZJRgABAQAAAQABAAD/2wBDAAgGBgcGBQgHBwcJCQgKDBQNDAsLDBkSEw8UHRofHh0a HBwgJC4nICIsIxwcKDcpLDAxNDQ0Hyc5PTgyPC4zNDL/2wBDAQkJCQwLDBgNDRgyIRwhMjIyMjIy MjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjL/wAARCABkAGQDASIA AhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQA AAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3 ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWm p6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEA AwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSEx BhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElK U1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3 uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwD3+iii gAooooAKY7rGpZ2Cj1JxWZqmqfZAYoQDLjknoo9ff6Vzsksksu+RmdiTgk5IH9KuMG9SHNJ2OxS7 t5DtSeJm9A4JqeuAkQFeeTn86bZ67d6VMAXMttnDRk5x9Cen8v5hunbYFPueg0VXtbmK8to7iFw0 bjKkVYrMsKKKKACiiigAooooASmSyLFE8jfdVST9AKkqjqr+Xpk59QB+ZA/rQtxM5WSVppXlc5Zi SeeB7e1M5ySSDx+VAIx1PToKDyTxj6iuowGuODxkkevSsm+HBHBPt2rWkPB4zwayb08Ec/lQxo3v A98xe50+RjgASxg9hnDfqR+tdrXmXhCUp4ngUDiRXQ8+ik/j0Fem1zzWprHYKKKKkoKKKKACiiig AqnqieZps6+ilvy5/pVymSIJI2RujAgj60LRiZw579h/OgnoScDHAFDApIyMCHUkN7GkJGB06+vT /GuowGSnCEDIH0rFvXySMkjPY9K0rqXg9ck81hXMm44BwPek2M2fBsYl8SRt/wA80duvTIx/WvSx XDeAbbMt5dEYAVY1Prnk/wAh+ddzWE3qax2CiiipKCiiigAooooAKKKKAOL8QQGx1IygHy58sMDo 3cf1/Gsh7sADnt0B6V3er2UF9p8sNwwRfvCQn7hHQ15XK7xyFCc4OMjoa3hLQyktSzc3OSew+tZ5 JcjHJz6fp70E5JyMn3NdH4MsbS81NpZ5EMkADRxHALH+97gfzIP1G7K4Ja2Ox8OaadL0aGCQYmb9 5J/vHt+AwPwrXNFJWD1NRaKKKACiiigAoo7VSvr9LKIMRuduFUd6EribLbMEUsxAA6knisu71y3g ysX71/Y4X8+/4ZrBub2e7YtMxIB4UHAH4f1qD19cdMVtGn3Ic+xLfXlxfZEj/KOQo+6P8awbu0yT gcVs4Bzkkk+9RtGrk9CMHv1rSySsiLtnLNAwONpwT370+CGVZQ6MyuDlShIII7gjp9a3mtFJJwMC nR2ip2ANKwGxpPiK4WNYr8GUY/1q8MPqOn+e9dJb3cF2m6CVXHcA4I+o6iuLVAFHtTGDKwdGZWBy GU4I+hFQ6aexam+p6BRXH6X4meKZbfUG3RkgLMeCp/2vUe/866+smmty077C0UUUhiZwMnpXHX10 by6eTtnCj2H8v/r10uqS+Tp0zDqV2/mcVyJOBwCTjsela0l1M5voB4AGMnPbvQAc4GRkY5/zxSYx xwCBSnggDk/yrYzADgdScdh0oPAPTpQc4POKOAcZJP8AKgAI5PA6dqTqAegzwAOv+NL256+nrRwA ACSfYUABxk8frTWAK46nH+fpTiMEdc5/KkY/KcZJx2PSgDKvkwDwM57d66zwhqZvNOa1kJMtsQuT 3U9PywR+ArlrwYUjjIHNS+ErkweJI4x92ZGRvbjI/UD86zmrouL1PSaKKKwNTK14/wCgKPWQA/ka 5odvpRRW9LYxnuIOh/GjFFFaEinv9f6U0nCgiiigBcdKF+YjNFFAAOWx7Udh9KKKAM27+4341U0p jHr9gV4JuIx+bYooqHsyo7nrFFFFc5sf/9k= "
+ height="31.743042"
+ width="31.736002"
+ inkscape:export-filename="/home/vjrj/proyectos/dev/kune/trunk/img/webtemplate/chat-revisited.png"
+ inkscape:export-xdpi="90"
+ inkscape:export-ydpi="90" />
+ <image
+ width="31.736002"
+ height="31.743042"
+ xlink:href="data:image/jpeg;base64,/9j/4AAQSkZJRgABAQAAAQABAAD/2wBDAAgGBgcGBQgHBwcJCQgKDBQNDAsLDBkSEw8UHRofHh0a HBwgJC4nICIsIxwcKDcpLDAxNDQ0Hyc5PTgyPC4zNDL/2wBDAQkJCQwLDBgNDRgyIRwhMjIyMjIy MjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjL/wAARCABkAGQDASIA AhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQA AAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3 ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWm p6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEA AwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSEx BhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElK U1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3 uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwD3+iii gAooooAKY7rGpZ2Cj1JxWZqmqfZAYoQDLjknoo9ff6Vzsksksu+RmdiTgk5IH9KuMG9SHNJ2OxS7 t5DtSeJm9A4JqeuAkQFeeTn86bZ67d6VMAXMttnDRk5x9Cen8v5hunbYFPueg0VXtbmK8to7iFw0 bjKkVYrMsKKKKACiiigAooooASmSyLFE8jfdVST9AKkqjqr+Xpk59QB+ZA/rQtxM5WSVppXlc5Zi SeeB7e1M5ySSDx+VAIx1PToKDyTxj6iuowGuODxkkevSsm+HBHBPt2rWkPB4zwayb08Ec/lQxo3v A98xe50+RjgASxg9hnDfqR+tdrXmXhCUp4ngUDiRXQ8+ik/j0Fem1zzWprHYKKKKkoKKKKACiiig AqnqieZps6+ilvy5/pVymSIJI2RujAgj60LRiZw579h/OgnoScDHAFDApIyMCHUkN7GkJGB06+vT /GuowGSnCEDIH0rFvXySMkjPY9K0rqXg9ck81hXMm44BwPek2M2fBsYl8SRt/wA80duvTIx/WvSx XDeAbbMt5dEYAVY1Prnk/wAh+ddzWE3qax2CiiipKCiiigAooooAKKKKAOL8QQGx1IygHy58sMDo 3cf1/Gsh7sADnt0B6V3er2UF9p8sNwwRfvCQn7hHQ15XK7xyFCc4OMjoa3hLQyktSzc3OSew+tZ5 JcjHJz6fp70E5JyMn3NdH4MsbS81NpZ5EMkADRxHALH+97gfzIP1G7K4Ja2Ox8OaadL0aGCQYmb9 5J/vHt+AwPwrXNFJWD1NRaKKKACiiigAoo7VSvr9LKIMRuduFUd6EribLbMEUsxAA6knisu71y3g ysX71/Y4X8+/4ZrBub2e7YtMxIB4UHAH4f1qD19cdMVtGn3Ic+xLfXlxfZEj/KOQo+6P8awbu0yT gcVs4Bzkkk+9RtGrk9CMHv1rSySsiLtnLNAwONpwT370+CGVZQ6MyuDlShIII7gjp9a3mtFJJwMC nR2ip2ANKwGxpPiK4WNYr8GUY/1q8MPqOn+e9dJb3cF2m6CVXHcA4I+o6iuLVAFHtTGDKwdGZWBy GU4I+hFQ6aexam+p6BRXH6X4meKZbfUG3RkgLMeCp/2vUe/866+smmty077C0UUUhiZwMnpXHX10 by6eTtnCj2H8v/r10uqS+Tp0zDqV2/mcVyJOBwCTjsela0l1M5voB4AGMnPbvQAc4GRkY5/zxSYx xwCBSnggDk/yrYzADgdScdh0oPAPTpQc4POKOAcZJP8AKgAI5PA6dqTqAegzwAOv+NL256+nrRwA ACSfYUABxk8frTWAK46nH+fpTiMEdc5/KkY/KcZJx2PSgDKvkwDwM57d66zwhqZvNOa1kJMtsQuT 3U9PywR+ArlrwYUjjIHNS+ErkweJI4x92ZGRvbjI/UD86zmrouL1PSaKKKwNTK14/wCgKPWQA/ka 5odvpRRW9LYxnuIOh/GjFFFaEinv9f6U0nCgiiigBcdKF+YjNFFAAOWx7Udh9KKKAM27+4341U0p jHr9gV4JuIx+bYooqHsyo7nrFFFFc5sf/9k= "
+ id="image3962"
+ x="331.10443"
+ y="-804.71503"
+ style="display:inline"
+ inkscape:export-filename="/home/vjrj/proyectos/dev/kune/trunk/img/webtemplate/chat-revisited.png"
+ inkscape:export-xdpi="90"
+ inkscape:export-ydpi="90" />
+ <image
+ style="display:inline"
+ y="-804.71503"
+ x="366.10443"
+ id="image3964"
+ xlink:href="data:image/jpeg;base64,/9j/4AAQSkZJRgABAQAAAQABAAD/2wBDAAgGBgcGBQgHBwcJCQgKDBQNDAsLDBkSEw8UHRofHh0a HBwgJC4nICIsIxwcKDcpLDAxNDQ0Hyc5PTgyPC4zNDL/2wBDAQkJCQwLDBgNDRgyIRwhMjIyMjIy MjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjL/wAARCABkAGQDASIA AhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQA AAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3 ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWm p6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEA AwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSEx BhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElK U1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3 uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwD3+iii gAooooAKY7rGpZ2Cj1JxWZqmqfZAYoQDLjknoo9ff6Vzsksksu+RmdiTgk5IH9KuMG9SHNJ2OxS7 t5DtSeJm9A4JqeuAkQFeeTn86bZ67d6VMAXMttnDRk5x9Cen8v5hunbYFPueg0VXtbmK8to7iFw0 bjKkVYrMsKKKKACiiigAooooASmSyLFE8jfdVST9AKkqjqr+Xpk59QB+ZA/rQtxM5WSVppXlc5Zi SeeB7e1M5ySSDx+VAIx1PToKDyTxj6iuowGuODxkkevSsm+HBHBPt2rWkPB4zwayb08Ec/lQxo3v A98xe50+RjgASxg9hnDfqR+tdrXmXhCUp4ngUDiRXQ8+ik/j0Fem1zzWprHYKKKKkoKKKKACiiig AqnqieZps6+ilvy5/pVymSIJI2RujAgj60LRiZw579h/OgnoScDHAFDApIyMCHUkN7GkJGB06+vT /GuowGSnCEDIH0rFvXySMkjPY9K0rqXg9ck81hXMm44BwPek2M2fBsYl8SRt/wA80duvTIx/WvSx XDeAbbMt5dEYAVY1Prnk/wAh+ddzWE3qax2CiiipKCiiigAooooAKKKKAOL8QQGx1IygHy58sMDo 3cf1/Gsh7sADnt0B6V3er2UF9p8sNwwRfvCQn7hHQ15XK7xyFCc4OMjoa3hLQyktSzc3OSew+tZ5 JcjHJz6fp70E5JyMn3NdH4MsbS81NpZ5EMkADRxHALH+97gfzIP1G7K4Ja2Ox8OaadL0aGCQYmb9 5J/vHt+AwPwrXNFJWD1NRaKKKACiiigAoo7VSvr9LKIMRuduFUd6EribLbMEUsxAA6knisu71y3g ysX71/Y4X8+/4ZrBub2e7YtMxIB4UHAH4f1qD19cdMVtGn3Ic+xLfXlxfZEj/KOQo+6P8awbu0yT gcVs4Bzkkk+9RtGrk9CMHv1rSySsiLtnLNAwONpwT370+CGVZQ6MyuDlShIII7gjp9a3mtFJJwMC nR2ip2ANKwGxpPiK4WNYr8GUY/1q8MPqOn+e9dJb3cF2m6CVXHcA4I+o6iuLVAFHtTGDKwdGZWBy GU4I+hFQ6aexam+p6BRXH6X4meKZbfUG3RkgLMeCp/2vUe/866+smmty077C0UUUhiZwMnpXHX10 by6eTtnCj2H8v/r10uqS+Tp0zDqV2/mcVyJOBwCTjsela0l1M5voB4AGMnPbvQAc4GRkY5/zxSYx xwCBSnggDk/yrYzADgdScdh0oPAPTpQc4POKOAcZJP8AKgAI5PA6dqTqAegzwAOv+NL256+nrRwA ACSfYUABxk8frTWAK46nH+fpTiMEdc5/KkY/KcZJx2PSgDKvkwDwM57d66zwhqZvNOa1kJMtsQuT 3U9PywR+ArlrwYUjjIHNS+ErkweJI4x92ZGRvbjI/UD86zmrouL1PSaKKKwNTK14/wCgKPWQA/ka 5odvpRRW9LYxnuIOh/GjFFFaEinv9f6U0nCgiiigBcdKF+YjNFFAAOWx7Udh9KKKAM27+4341U0p jHr9gV4JuIx+bYooqHsyo7nrFFFFc5sf/9k= "
+ height="31.743042"
+ width="31.736002"
+ inkscape:export-filename="/home/vjrj/proyectos/dev/kune/trunk/img/webtemplate/chat-revisited.png"
+ inkscape:export-xdpi="90"
+ inkscape:export-ydpi="90" />
+ <image
+ style="display:inline"
+ y="-804.71503"
+ x="400.10443"
+ id="image3966"
+ xlink:href="data:image/jpeg;base64,/9j/4AAQSkZJRgABAQAAAQABAAD/2wBDAAgGBgcGBQgHBwcJCQgKDBQNDAsLDBkSEw8UHRofHh0a HBwgJC4nICIsIxwcKDcpLDAxNDQ0Hyc5PTgyPC4zNDL/2wBDAQkJCQwLDBgNDRgyIRwhMjIyMjIy MjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjL/wAARCABkAGQDASIA AhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQA AAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3 ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWm p6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEA AwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSEx BhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElK U1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3 uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwD3+iii gAooooAKY7rGpZ2Cj1JxWZqmqfZAYoQDLjknoo9ff6Vzsksksu+RmdiTgk5IH9KuMG9SHNJ2OxS7 t5DtSeJm9A4JqeuAkQFeeTn86bZ67d6VMAXMttnDRk5x9Cen8v5hunbYFPueg0VXtbmK8to7iFw0 bjKkVYrMsKKKKACiiigAooooASmSyLFE8jfdVST9AKkqjqr+Xpk59QB+ZA/rQtxM5WSVppXlc5Zi SeeB7e1M5ySSDx+VAIx1PToKDyTxj6iuowGuODxkkevSsm+HBHBPt2rWkPB4zwayb08Ec/lQxo3v A98xe50+RjgASxg9hnDfqR+tdrXmXhCUp4ngUDiRXQ8+ik/j0Fem1zzWprHYKKKKkoKKKKACiiig AqnqieZps6+ilvy5/pVymSIJI2RujAgj60LRiZw579h/OgnoScDHAFDApIyMCHUkN7GkJGB06+vT /GuowGSnCEDIH0rFvXySMkjPY9K0rqXg9ck81hXMm44BwPek2M2fBsYl8SRt/wA80duvTIx/WvSx XDeAbbMt5dEYAVY1Prnk/wAh+ddzWE3qax2CiiipKCiiigAooooAKKKKAOL8QQGx1IygHy58sMDo 3cf1/Gsh7sADnt0B6V3er2UF9p8sNwwRfvCQn7hHQ15XK7xyFCc4OMjoa3hLQyktSzc3OSew+tZ5 JcjHJz6fp70E5JyMn3NdH4MsbS81NpZ5EMkADRxHALH+97gfzIP1G7K4Ja2Ox8OaadL0aGCQYmb9 5J/vHt+AwPwrXNFJWD1NRaKKKACiiigAoo7VSvr9LKIMRuduFUd6EribLbMEUsxAA6knisu71y3g ysX71/Y4X8+/4ZrBub2e7YtMxIB4UHAH4f1qD19cdMVtGn3Ic+xLfXlxfZEj/KOQo+6P8awbu0yT gcVs4Bzkkk+9RtGrk9CMHv1rSySsiLtnLNAwONpwT370+CGVZQ6MyuDlShIII7gjp9a3mtFJJwMC nR2ip2ANKwGxpPiK4WNYr8GUY/1q8MPqOn+e9dJb3cF2m6CVXHcA4I+o6iuLVAFHtTGDKwdGZWBy GU4I+hFQ6aexam+p6BRXH6X4meKZbfUG3RkgLMeCp/2vUe/866+smmty077C0UUUhiZwMnpXHX10 by6eTtnCj2H8v/r10uqS+Tp0zDqV2/mcVyJOBwCTjsela0l1M5voB4AGMnPbvQAc4GRkY5/zxSYx xwCBSnggDk/yrYzADgdScdh0oPAPTpQc4POKOAcZJP8AKgAI5PA6dqTqAegzwAOv+NL256+nrRwA ACSfYUABxk8frTWAK46nH+fpTiMEdc5/KkY/KcZJx2PSgDKvkwDwM57d66zwhqZvNOa1kJMtsQuT 3U9PywR+ArlrwYUjjIHNS+ErkweJI4x92ZGRvbjI/UD86zmrouL1PSaKKKwNTK14/wCgKPWQA/ka 5odvpRRW9LYxnuIOh/GjFFFaEinv9f6U0nCgiiigBcdKF+YjNFFAAOWx7Udh9KKKAM27+4341U0p jHr9gV4JuIx+bYooqHsyo7nrFFFFc5sf/9k= "
+ height="31.743042"
+ width="31.736002"
+ inkscape:export-filename="/home/vjrj/proyectos/dev/kune/trunk/img/webtemplate/chat-revisited.png"
+ inkscape:export-xdpi="90"
+ inkscape:export-ydpi="90" />
+ <image
+ width="31.736002"
+ height="31.743042"
+ xlink:href="data:image/jpeg;base64,/9j/4AAQSkZJRgABAQAAAQABAAD/2wBDAAgGBgcGBQgHBwcJCQgKDBQNDAsLDBkSEw8UHRofHh0a HBwgJC4nICIsIxwcKDcpLDAxNDQ0Hyc5PTgyPC4zNDL/2wBDAQkJCQwLDBgNDRgyIRwhMjIyMjIy MjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjL/wAARCABkAGQDASIA AhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQA AAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3 ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWm p6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEA AwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSEx BhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElK U1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3 uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwD3+iii gAooooAKY7rGpZ2Cj1JxWZqmqfZAYoQDLjknoo9ff6Vzsksksu+RmdiTgk5IH9KuMG9SHNJ2OxS7 t5DtSeJm9A4JqeuAkQFeeTn86bZ67d6VMAXMttnDRk5x9Cen8v5hunbYFPueg0VXtbmK8to7iFw0 bjKkVYrMsKKKKACiiigAooooASmSyLFE8jfdVST9AKkqjqr+Xpk59QB+ZA/rQtxM5WSVppXlc5Zi SeeB7e1M5ySSDx+VAIx1PToKDyTxj6iuowGuODxkkevSsm+HBHBPt2rWkPB4zwayb08Ec/lQxo3v A98xe50+RjgASxg9hnDfqR+tdrXmXhCUp4ngUDiRXQ8+ik/j0Fem1zzWprHYKKKKkoKKKKACiiig AqnqieZps6+ilvy5/pVymSIJI2RujAgj60LRiZw579h/OgnoScDHAFDApIyMCHUkN7GkJGB06+vT /GuowGSnCEDIH0rFvXySMkjPY9K0rqXg9ck81hXMm44BwPek2M2fBsYl8SRt/wA80duvTIx/WvSx XDeAbbMt5dEYAVY1Prnk/wAh+ddzWE3qax2CiiipKCiiigAooooAKKKKAOL8QQGx1IygHy58sMDo 3cf1/Gsh7sADnt0B6V3er2UF9p8sNwwRfvCQn7hHQ15XK7xyFCc4OMjoa3hLQyktSzc3OSew+tZ5 JcjHJz6fp70E5JyMn3NdH4MsbS81NpZ5EMkADRxHALH+97gfzIP1G7K4Ja2Ox8OaadL0aGCQYmb9 5J/vHt+AwPwrXNFJWD1NRaKKKACiiigAoo7VSvr9LKIMRuduFUd6EribLbMEUsxAA6knisu71y3g ysX71/Y4X8+/4ZrBub2e7YtMxIB4UHAH4f1qD19cdMVtGn3Ic+xLfXlxfZEj/KOQo+6P8awbu0yT gcVs4Bzkkk+9RtGrk9CMHv1rSySsiLtnLNAwONpwT370+CGVZQ6MyuDlShIII7gjp9a3mtFJJwMC nR2ip2ANKwGxpPiK4WNYr8GUY/1q8MPqOn+e9dJb3cF2m6CVXHcA4I+o6iuLVAFHtTGDKwdGZWBy GU4I+hFQ6aexam+p6BRXH6X4meKZbfUG3RkgLMeCp/2vUe/866+smmty077C0UUUhiZwMnpXHX10 by6eTtnCj2H8v/r10uqS+Tp0zDqV2/mcVyJOBwCTjsela0l1M5voB4AGMnPbvQAc4GRkY5/zxSYx xwCBSnggDk/yrYzADgdScdh0oPAPTpQc4POKOAcZJP8AKgAI5PA6dqTqAegzwAOv+NL256+nrRwA ACSfYUABxk8frTWAK46nH+fpTiMEdc5/KkY/KcZJx2PSgDKvkwDwM57d66zwhqZvNOa1kJMtsQuT 3U9PywR+ArlrwYUjjIHNS+ErkweJI4x92ZGRvbjI/UD86zmrouL1PSaKKKwNTK14/wCgKPWQA/ka 5odvpRRW9LYxnuIOh/GjFFFaEinv9f6U0nCgiiigBcdKF+YjNFFAAOWx7Udh9KKKAM27+4341U0p jHr9gV4JuIx+bYooqHsyo7nrFFFFc5sf/9k= "
+ id="image3968"
+ x="436.10443"
+ y="-804.71503"
+ style="display:inline"
+ inkscape:export-filename="/home/vjrj/proyectos/dev/kune/trunk/img/webtemplate/chat-revisited.png"
+ inkscape:export-xdpi="90"
+ inkscape:export-ydpi="90" />
+ <image
+ style="display:inline"
+ y="-804.71503"
+ x="471.10443"
+ id="image3970"
+ xlink:href="data:image/jpeg;base64,/9j/4AAQSkZJRgABAQAAAQABAAD/2wBDAAgGBgcGBQgHBwcJCQgKDBQNDAsLDBkSEw8UHRofHh0a HBwgJC4nICIsIxwcKDcpLDAxNDQ0Hyc5PTgyPC4zNDL/2wBDAQkJCQwLDBgNDRgyIRwhMjIyMjIy MjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjL/wAARCABkAGQDASIA AhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQA AAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3 ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWm p6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEA AwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSEx BhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElK U1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3 uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwD3+iii gAooooAKY7rGpZ2Cj1JxWZqmqfZAYoQDLjknoo9ff6Vzsksksu+RmdiTgk5IH9KuMG9SHNJ2OxS7 t5DtSeJm9A4JqeuAkQFeeTn86bZ67d6VMAXMttnDRk5x9Cen8v5hunbYFPueg0VXtbmK8to7iFw0 bjKkVYrMsKKKKACiiigAooooASmSyLFE8jfdVST9AKkqjqr+Xpk59QB+ZA/rQtxM5WSVppXlc5Zi SeeB7e1M5ySSDx+VAIx1PToKDyTxj6iuowGuODxkkevSsm+HBHBPt2rWkPB4zwayb08Ec/lQxo3v A98xe50+RjgASxg9hnDfqR+tdrXmXhCUp4ngUDiRXQ8+ik/j0Fem1zzWprHYKKKKkoKKKKACiiig AqnqieZps6+ilvy5/pVymSIJI2RujAgj60LRiZw579h/OgnoScDHAFDApIyMCHUkN7GkJGB06+vT /GuowGSnCEDIH0rFvXySMkjPY9K0rqXg9ck81hXMm44BwPek2M2fBsYl8SRt/wA80duvTIx/WvSx XDeAbbMt5dEYAVY1Prnk/wAh+ddzWE3qax2CiiipKCiiigAooooAKKKKAOL8QQGx1IygHy58sMDo 3cf1/Gsh7sADnt0B6V3er2UF9p8sNwwRfvCQn7hHQ15XK7xyFCc4OMjoa3hLQyktSzc3OSew+tZ5 JcjHJz6fp70E5JyMn3NdH4MsbS81NpZ5EMkADRxHALH+97gfzIP1G7K4Ja2Ox8OaadL0aGCQYmb9 5J/vHt+AwPwrXNFJWD1NRaKKKACiiigAoo7VSvr9LKIMRuduFUd6EribLbMEUsxAA6knisu71y3g ysX71/Y4X8+/4ZrBub2e7YtMxIB4UHAH4f1qD19cdMVtGn3Ic+xLfXlxfZEj/KOQo+6P8awbu0yT gcVs4Bzkkk+9RtGrk9CMHv1rSySsiLtnLNAwONpwT370+CGVZQ6MyuDlShIII7gjp9a3mtFJJwMC nR2ip2ANKwGxpPiK4WNYr8GUY/1q8MPqOn+e9dJb3cF2m6CVXHcA4I+o6iuLVAFHtTGDKwdGZWBy GU4I+hFQ6aexam+p6BRXH6X4meKZbfUG3RkgLMeCp/2vUe/866+smmty077C0UUUhiZwMnpXHX10 by6eTtnCj2H8v/r10uqS+Tp0zDqV2/mcVyJOBwCTjsela0l1M5voB4AGMnPbvQAc4GRkY5/zxSYx xwCBSnggDk/yrYzADgdScdh0oPAPTpQc4POKOAcZJP8AKgAI5PA6dqTqAegzwAOv+NL256+nrRwA ACSfYUABxk8frTWAK46nH+fpTiMEdc5/KkY/KcZJx2PSgDKvkwDwM57d66zwhqZvNOa1kJMtsQuT 3U9PywR+ArlrwYUjjIHNS+ErkweJI4x92ZGRvbjI/UD86zmrouL1PSaKKKwNTK14/wCgKPWQA/ka 5odvpRRW9LYxnuIOh/GjFFFaEinv9f6U0nCgiiigBcdKF+YjNFFAAOWx7Udh9KKKAM27+4341U0p jHr9gV4JuIx+bYooqHsyo7nrFFFFc5sf/9k= "
+ height="31.743042"
+ width="31.736002"
+ inkscape:export-filename="/home/vjrj/proyectos/dev/kune/trunk/img/webtemplate/chat-revisited.png"
+ inkscape:export-xdpi="90"
+ inkscape:export-ydpi="90" />
+ <image
+ width="31.736002"
+ height="31.743042"
+ xlink:href="data:image/jpeg;base64,/9j/4AAQSkZJRgABAQAAAQABAAD/2wBDAAgGBgcGBQgHBwcJCQgKDBQNDAsLDBkSEw8UHRofHh0a HBwgJC4nICIsIxwcKDcpLDAxNDQ0Hyc5PTgyPC4zNDL/2wBDAQkJCQwLDBgNDRgyIRwhMjIyMjIy MjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjL/wAARCABkAGQDASIA AhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQA AAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3 ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWm p6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEA AwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSEx BhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElK U1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3 uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwD3+iii gAooooAKY7rGpZ2Cj1JxWZqmqfZAYoQDLjknoo9ff6Vzsksksu+RmdiTgk5IH9KuMG9SHNJ2OxS7 t5DtSeJm9A4JqeuAkQFeeTn86bZ67d6VMAXMttnDRk5x9Cen8v5hunbYFPueg0VXtbmK8to7iFw0 bjKkVYrMsKKKKACiiigAooooASmSyLFE8jfdVST9AKkqjqr+Xpk59QB+ZA/rQtxM5WSVppXlc5Zi SeeB7e1M5ySSDx+VAIx1PToKDyTxj6iuowGuODxkkevSsm+HBHBPt2rWkPB4zwayb08Ec/lQxo3v A98xe50+RjgASxg9hnDfqR+tdrXmXhCUp4ngUDiRXQ8+ik/j0Fem1zzWprHYKKKKkoKKKKACiiig AqnqieZps6+ilvy5/pVymSIJI2RujAgj60LRiZw579h/OgnoScDHAFDApIyMCHUkN7GkJGB06+vT /GuowGSnCEDIH0rFvXySMkjPY9K0rqXg9ck81hXMm44BwPek2M2fBsYl8SRt/wA80duvTIx/WvSx XDeAbbMt5dEYAVY1Prnk/wAh+ddzWE3qax2CiiipKCiiigAooooAKKKKAOL8QQGx1IygHy58sMDo 3cf1/Gsh7sADnt0B6V3er2UF9p8sNwwRfvCQn7hHQ15XK7xyFCc4OMjoa3hLQyktSzc3OSew+tZ5 JcjHJz6fp70E5JyMn3NdH4MsbS81NpZ5EMkADRxHALH+97gfzIP1G7K4Ja2Ox8OaadL0aGCQYmb9 5J/vHt+AwPwrXNFJWD1NRaKKKACiiigAoo7VSvr9LKIMRuduFUd6EribLbMEUsxAA6knisu71y3g ysX71/Y4X8+/4ZrBub2e7YtMxIB4UHAH4f1qD19cdMVtGn3Ic+xLfXlxfZEj/KOQo+6P8awbu0yT gcVs4Bzkkk+9RtGrk9CMHv1rSySsiLtnLNAwONpwT370+CGVZQ6MyuDlShIII7gjp9a3mtFJJwMC nR2ip2ANKwGxpPiK4WNYr8GUY/1q8MPqOn+e9dJb3cF2m6CVXHcA4I+o6iuLVAFHtTGDKwdGZWBy GU4I+hFQ6aexam+p6BRXH6X4meKZbfUG3RkgLMeCp/2vUe/866+smmty077C0UUUhiZwMnpXHX10 by6eTtnCj2H8v/r10uqS+Tp0zDqV2/mcVyJOBwCTjsela0l1M5voB4AGMnPbvQAc4GRkY5/zxSYx xwCBSnggDk/yrYzADgdScdh0oPAPTpQc4POKOAcZJP8AKgAI5PA6dqTqAegzwAOv+NL256+nrRwA ACSfYUABxk8frTWAK46nH+fpTiMEdc5/KkY/KcZJx2PSgDKvkwDwM57d66zwhqZvNOa1kJMtsQuT 3U9PywR+ArlrwYUjjIHNS+ErkweJI4x92ZGRvbjI/UD86zmrouL1PSaKKKwNTK14/wCgKPWQA/ka 5odvpRRW9LYxnuIOh/GjFFFaEinv9f6U0nCgiiigBcdKF+YjNFFAAOWx7Udh9KKKAM27+4341U0p jHr9gV4JuIx+bYooqHsyo7nrFFFFc5sf/9k= "
+ id="image3972"
+ x="506.10443"
+ y="-804.71503"
+ style="display:inline"
+ inkscape:export-filename="/home/vjrj/proyectos/dev/kune/trunk/img/webtemplate/chat-revisited.png"
+ inkscape:export-xdpi="90"
+ inkscape:export-ydpi="90" />
+ <text
+ sodipodi:linespacing="100%"
+ id="text3984"
+ y="-945.57721"
+ x="84.272552"
+ style="font-size:22px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:100%;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;baseline-shift:baseline;opacity:0.82999998;color:#000000;fill:#782121;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.52077562px;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Ubuntu;-inkscape-font-specification:Ubuntu Bold"
+ xml:space="preserve"
+ inkscape:export-filename="/home/vjrj/proyectos/dev/kune/trunk/img/webtemplate/chat-revisited.png"
+ inkscape:export-xdpi="90"
+ inkscape:export-ydpi="90"><tspan
+ y="-945.57721"
+ x="84.272552"
+ id="tspan3986"
+ sodipodi:role="line"
+ style="font-size:18px">Your contacts</tspan></text>
+ <text
+ xml:space="preserve"
+ style="font-size:22px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:100%;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;baseline-shift:baseline;opacity:0.82999998;color:#000000;fill:#782121;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.52077562px;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Ubuntu;-inkscape-font-specification:Ubuntu Bold"
+ x="244.27255"
+ y="-944.57721"
+ id="text4005"
+ sodipodi:linespacing="100%"
+ inkscape:export-filename="/home/vjrj/proyectos/dev/kune/trunk/img/webtemplate/chat-revisited.png"
+ inkscape:export-xdpi="90"
+ inkscape:export-ydpi="90"><tspan
+ sodipodi:role="line"
+ id="tspan4007"
+ x="244.27255"
+ y="-944.57721"><tspan
+ style="font-size:18px"
+ id="tspan6328">Your Groups of Contacts</tspan><tspan
+ style="font-size:10px"
+ id="tspan6326">(XMPP) </tspan></tspan></text>
+ <text
+ sodipodi:linespacing="100%"
+ id="text4028"
+ y="-947.57721"
+ x="625.78333"
+ style="font-size:22px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:100%;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;baseline-shift:baseline;opacity:0.82999998;color:#000000;fill:#782121;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.52077562px;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Ubuntu;-inkscape-font-specification:Ubuntu Bold"
+ xml:space="preserve"
+ inkscape:export-filename="/home/vjrj/proyectos/dev/kune/trunk/img/webtemplate/chat-revisited.png"
+ inkscape:export-xdpi="90"
+ inkscape:export-ydpi="90"><tspan
+ y="-947.57721"
+ x="625.78333"
+ sodipodi:role="line"
+ style="font-size:18px"
+ id="tspan6332">Groups you</tspan><tspan
+ y="-929.57721"
+ x="625.78333"
+ sodipodi:role="line"
+ style="font-size:18px"
+ id="tspan6461">participate in</tspan></text>
+ <image
+ style="display:inline"
+ y="-920.7627"
+ x="625.47876"
+ id="image4197-4"
+ xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADgAAAA4CAYAAACohjseAAAABHNCSVQICAgIfAhkiAAAB71JREFU aIHVml9IXGcah5+j49SZ4zmHOOl0G4Wdtqvp0A6RqknTJt1cJNltWAiFtltKoBakgwy5sA2kF8WL QlZy6V6YSRmUtRZSJA32oliSQiBNyPonmRUJiiSkVNJEE6zOycyoM+fdC3WjiX9mnKNmX/jdfPOd 9/2eec98h/P9RhER7AhFUbyaRpeisK2ggNvJJP95+JB24Gexq8haQkRyFuBXVe7W1zM9OIh0dSGN jaR9PiZVlXtOJyeAMjtqZb02G+CK3W5Gw2HSS03p60Pq6khoGnFd5yKw6/8KUNO4EAqRXG1qIoE0 NZH2eHhoGFwG9jz1gE4nx/x+zKmpzC+bmkLCYSyvF9Mw6Ab2PZWAQJWqEh8eXluKmRmkpQWrpATT MLgOHHhqAIE8TWOotRUr1zWkUkh7O+LzETMMBoBDmw7ocBCqrMS088tOp5GODqSsjJhhMAQcBpQN BwQ8LhexaNT2u0lEEMtCOjuR8nJiuk4UqNhQQE2jLRhcfde0o6PNzViaRryoiAiwZd0BgSrDID4+ vr5wCzU2htTUkHC7mcjPpzbb2zYbOEXXGYhEct9Y1qKeHiQQwNR1BoAq2wHz86kNBDAta+Ph5mVZ SCSCZRjENY02wGMLILDF7Waip2fz4BZqfBwJBkm6XMQcDkJAXk6ARUVEampIbDbY44pGkcpKTE1j aLnbNpPuVWga8bGxzQdaTq2tWKpK3OnkWFaAcxtLtLl5czaWbDQ8jPj9mJrGBaA4U8DD5eXE0unN B8hEU1NIKETS7WYU8K8KaBgMdXZuzOJ++QX57jvkp5+Q33/PLVc4TFpVuQt4V+reobIyYuv1WLAs 5NSpPDl0SBev1yXFxars379Tqqu3S2GhQ8rLNfnwQ1UuXVpb/vp6pjWNayt1b6CjY33gbt5E3nrL La+//qqcOXNGbt68KQtjampKent7pampSZ57TpdPP3VKIpFdjcFBRNe5u1z3Dvh86/Pbi0QU8XgK 5eTJE5JKpWS1GBsbk/ff/5ts3+6W69czr9PVhXg8XF2ue9fb2+2Hu3QJ2bbNkBs3bqwK9ni0trbI iy+qEotlVquxkbSqcnqp7u0rKcFMpeyFM03kpZfccu7cuazh5uOjj/4uwWBhRvV8PiaBvUt1r7ul xf7nXl3dM/LBB4fXDCciMj4+LqWlHvnxx5Vr9fUhqso9QHm8e3u8XsyZGXvhRkcRt7tA7t+/nxOg iMjZs2elulpbsV5dHQmnkxMijz0HDYPL4bD93fvhB+TNNwM5w4mImKYpLpdDpqeXrpVIIJpGfP6g OW/+hFtRlF0OBxUff4xi16n5fPT25lFd/Wdbcqmqygsv/IGBgaU//+orLEWhW0SGgUeAus7JhgYK nU5b1rEoenqKqK7ebVu+qqqdXLv25Pj0NHz5JcnJSY7Pj+UBKIpSJsLOTz55BGxn/PorlJaW2pav pORPjIw8eaO1tiKpFFER+ff8WB6A00nNkSMohYW2rWFR7NgxQzQatS1ff/8VAoHFhlUqBQ0NxCcm HnUPIE9RFKWggNraWtYJD6qrE/T2XrItX19fP6+9tnjs66+RqSluiMjPj8/f6/MxaffOuVBXryIv v1xqyy46MjIixcXPLMqfSiElJZgs4XPkqSpHgkFU277eJWLHDnjw4D5XrlzJOdepU//k4EHHorEz Z8A0GRaRi09c4PFwtatr/bo3r2+/RbZvL5VEIrHm7nV3d4vX65LffnuUN52e9TVYxrxB17k7OLj+ gCLIe++55Nixo2uCSyQS4vf/Ub75ZvG5b0cHYhgMLFcUTeNafT3TGwE4NoY8/3yhfPHFcZmens4Y bmRkRA4e3CvvvONelM+yZs0aVnCkALyqyt3lLGi7dfs2sn+/WyoqyqS/v39VuLa2f8nWrUXy+ecF kkwuztXZiRgGQysVnKf0u92MhkIks3Frc9Hp04ps3eqSd9/9izQ2/kPOnz8vDx48kFu3bklHR4cc P/6ZvPFGQF55RZWlDpzT6VkHCji8KuAcZLGmccHvx1yra5ut7txB2tqQo0edsnu3IS6XQ559tlDe fluXhoY8+f57nujavJqbsebstRXNmCcGnE6OqSpxO9zbbJXpEcnY2P/eGFb1DpcehCpNY6iyEnO9 jM5cVFNDoqiISCaTl/8A8hwOQi4XsWCQ5EZ6giuppwdxu5kgQ0N09Qng0TTaDIN4JIK12fZZIICZ n09tphdlnB2o0nUGAgHMzbLRIhGsOQM0Y5c3qwqAkp9PrdvNRE0NiY10nMbHEcMgThbubtaAC0C3 FBUR0TTizc1YG2HOBIMkNY22rNeaS1WgQteJlpcT6+yc/Y2sB1w0irhcxMjAsrYVcA5SAQ4bBkNl ZcQ6OjJ/nmWqykpMh4PQmtZn50qAQ4bBgM9HrL199kU017StrVhzFvWyPvyGAS4APWAYXC8pwWxp wVrrQfLwMKKq2W8s6w64AHSfYdDt9WKGw1jZ/u3S78dcynd/agAXgO4xDC57PDxsaiKdidcXCpHU NC7kXHsjABeA7tJ1Lmoa8bo6En19S08Nh0nP+ezFOdfcSMAFoGVOJydUlXs+H5ONjaS7umZd2fp6 puf8db8dtZS5gpsSiqIowB5V5UhhITtmZvCJcCcW468iMmpHjf8C6MILrTFT1g8AAAAASUVORK5C YII= "
+ height="22"
+ width="22"
+ inkscape:export-filename="/home/vjrj/proyectos/dev/kune/trunk/img/webtemplate/chat-revisited.png"
+ inkscape:export-xdpi="90"
+ inkscape:export-ydpi="90" />
+ <text
+ sodipodi:linespacing="100%"
+ id="text4050"
+ y="-637.15228"
+ x="86.734329"
+ style="font-size:18px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:100%;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;baseline-shift:baseline;opacity:0.82999998;color:#000000;fill:#782121;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.52077562px;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Ubuntu;-inkscape-font-specification:Ubuntu Bold"
+ xml:space="preserve"
+ inkscape:export-filename="/home/vjrj/proyectos/dev/kune/trunk/img/webtemplate/chat-revisited.png"
+ inkscape:export-xdpi="90"
+ inkscape:export-ydpi="90"><tspan
+ y="-637.15228"
+ x="86.734329"
+ id="tspan4052"
+ sodipodi:role="line">Add contact</tspan></text>
+ <rect
+ style="color:#000000;fill:#ececec;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.52077562px;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+ id="rect4054"
+ width="66.851814"
+ height="46.690155"
+ x="236.6342"
+ y="-664.66113"
+ ry="7.4279795"
+ rx="7.4279795"
+ inkscape:export-filename="/home/vjrj/proyectos/dev/kune/trunk/img/webtemplate/chat-revisited.png"
+ inkscape:export-xdpi="90"
+ inkscape:export-ydpi="90" />
+ <image
+ style="display:inline"
+ y="-663.94092"
+ x="238.39769"
+ id="image4060"
+ xlink:href="data:image/jpeg;base64,/9j/4AAQSkZJRgABAQAAAQABAAD/2wBDAAgGBgcGBQgHBwcJCQgKDBQNDAsLDBkSEw8UHRofHh0a HBwgJC4nICIsIxwcKDcpLDAxNDQ0Hyc5PTgyPC4zNDL/2wBDAQkJCQwLDBgNDRgyIRwhMjIyMjIy MjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjL/wAARCABkAGQDASIA AhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQA AAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3 ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWm p6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEA AwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSEx BhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElK U1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3 uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwD3+iii gAooooAKY7rGpZ2Cj1JxWZqmqfZAYoQDLjknoo9ff6Vzsksksu+RmdiTgk5IH9KuMG9SHNJ2OxS7 t5DtSeJm9A4JqeuAkQFeeTn86bZ67d6VMAXMttnDRk5x9Cen8v5hunbYFPueg0VXtbmK8to7iFw0 bjKkVYrMsKKKKACiiigAooooASmSyLFE8jfdVST9AKkqjqr+Xpk59QB+ZA/rQtxM5WSVppXlc5Zi SeeB7e1M5ySSDx+VAIx1PToKDyTxj6iuowGuODxkkevSsm+HBHBPt2rWkPB4zwayb08Ec/lQxo3v A98xe50+RjgASxg9hnDfqR+tdrXmXhCUp4ngUDiRXQ8+ik/j0Fem1zzWprHYKKKKkoKKKKACiiig AqnqieZps6+ilvy5/pVymSIJI2RujAgj60LRiZw579h/OgnoScDHAFDApIyMCHUkN7GkJGB06+vT /GuowGSnCEDIH0rFvXySMkjPY9K0rqXg9ck81hXMm44BwPek2M2fBsYl8SRt/wA80duvTIx/WvSx XDeAbbMt5dEYAVY1Prnk/wAh+ddzWE3qax2CiiipKCiiigAooooAKKKKAOL8QQGx1IygHy58sMDo 3cf1/Gsh7sADnt0B6V3er2UF9p8sNwwRfvCQn7hHQ15XK7xyFCc4OMjoa3hLQyktSzc3OSew+tZ5 JcjHJz6fp70E5JyMn3NdH4MsbS81NpZ5EMkADRxHALH+97gfzIP1G7K4Ja2Ox8OaadL0aGCQYmb9 5J/vHt+AwPwrXNFJWD1NRaKKKACiiigAoo7VSvr9LKIMRuduFUd6EribLbMEUsxAA6knisu71y3g ysX71/Y4X8+/4ZrBub2e7YtMxIB4UHAH4f1qD19cdMVtGn3Ic+xLfXlxfZEj/KOQo+6P8awbu0yT gcVs4Bzkkk+9RtGrk9CMHv1rSySsiLtnLNAwONpwT370+CGVZQ6MyuDlShIII7gjp9a3mtFJJwMC nR2ip2ANKwGxpPiK4WNYr8GUY/1q8MPqOn+e9dJb3cF2m6CVXHcA4I+o6iuLVAFHtTGDKwdGZWBy GU4I+hFQ6aexam+p6BRXH6X4meKZbfUG3RkgLMeCp/2vUe/866+smmty077C0UUUhiZwMnpXHX10 by6eTtnCj2H8v/r10uqS+Tp0zDqV2/mcVyJOBwCTjsela0l1M5voB4AGMnPbvQAc4GRkY5/zxSYx xwCBSnggDk/yrYzADgdScdh0oPAPTpQc4POKOAcZJP8AKgAI5PA6dqTqAegzwAOv+NL256+nrRwA ACSfYUABxk8frTWAK46nH+fpTiMEdc5/KkY/KcZJx2PSgDKvkwDwM57d66zwhqZvNOa1kJMtsQuT 3U9PywR+ArlrwYUjjIHNS+ErkweJI4x92ZGRvbjI/UD86zmrouL1PSaKKKwNTK14/wCgKPWQA/ka 5odvpRRW9LYxnuIOh/GjFFFaEinv9f6U0nCgiiigBcdKF+YjNFFAAOWx7Udh9KKKAM27+4341U0p jHr9gV4JuIx+bYooqHsyo7nrFFFFc5sf/9k= "
+ height="23.252039"
+ width="23.246883"
+ inkscape:export-filename="/home/vjrj/proyectos/dev/kune/trunk/img/webtemplate/chat-revisited.png"
+ inkscape:export-xdpi="90"
+ inkscape:export-ydpi="90" />
+ <image
+ width="23.246883"
+ height="23.252039"
+ xlink:href="data:image/jpeg;base64,/9j/4AAQSkZJRgABAQAAAQABAAD/2wBDAAgGBgcGBQgHBwcJCQgKDBQNDAsLDBkSEw8UHRofHh0a HBwgJC4nICIsIxwcKDcpLDAxNDQ0Hyc5PTgyPC4zNDL/2wBDAQkJCQwLDBgNDRgyIRwhMjIyMjIy MjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjL/wAARCABkAGQDASIA AhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQA AAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3 ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWm p6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEA AwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSEx BhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElK U1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3 uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwD3+iii gAooooAKY7rGpZ2Cj1JxWZqmqfZAYoQDLjknoo9ff6Vzsksksu+RmdiTgk5IH9KuMG9SHNJ2OxS7 t5DtSeJm9A4JqeuAkQFeeTn86bZ67d6VMAXMttnDRk5x9Cen8v5hunbYFPueg0VXtbmK8to7iFw0 bjKkVYrMsKKKKACiiigAooooASmSyLFE8jfdVST9AKkqjqr+Xpk59QB+ZA/rQtxM5WSVppXlc5Zi SeeB7e1M5ySSDx+VAIx1PToKDyTxj6iuowGuODxkkevSsm+HBHBPt2rWkPB4zwayb08Ec/lQxo3v A98xe50+RjgASxg9hnDfqR+tdrXmXhCUp4ngUDiRXQ8+ik/j0Fem1zzWprHYKKKKkoKKKKACiiig AqnqieZps6+ilvy5/pVymSIJI2RujAgj60LRiZw579h/OgnoScDHAFDApIyMCHUkN7GkJGB06+vT /GuowGSnCEDIH0rFvXySMkjPY9K0rqXg9ck81hXMm44BwPek2M2fBsYl8SRt/wA80duvTIx/WvSx XDeAbbMt5dEYAVY1Prnk/wAh+ddzWE3qax2CiiipKCiiigAooooAKKKKAOL8QQGx1IygHy58sMDo 3cf1/Gsh7sADnt0B6V3er2UF9p8sNwwRfvCQn7hHQ15XK7xyFCc4OMjoa3hLQyktSzc3OSew+tZ5 JcjHJz6fp70E5JyMn3NdH4MsbS81NpZ5EMkADRxHALH+97gfzIP1G7K4Ja2Ox8OaadL0aGCQYmb9 5J/vHt+AwPwrXNFJWD1NRaKKKACiiigAoo7VSvr9LKIMRuduFUd6EribLbMEUsxAA6knisu71y3g ysX71/Y4X8+/4ZrBub2e7YtMxIB4UHAH4f1qD19cdMVtGn3Ic+xLfXlxfZEj/KOQo+6P8awbu0yT gcVs4Bzkkk+9RtGrk9CMHv1rSySsiLtnLNAwONpwT370+CGVZQ6MyuDlShIII7gjp9a3mtFJJwMC nR2ip2ANKwGxpPiK4WNYr8GUY/1q8MPqOn+e9dJb3cF2m6CVXHcA4I+o6iuLVAFHtTGDKwdGZWBy GU4I+hFQ6aexam+p6BRXH6X4meKZbfUG3RkgLMeCp/2vUe/866+smmty077C0UUUhiZwMnpXHX10 by6eTtnCj2H8v/r10uqS+Tp0zDqV2/mcVyJOBwCTjsela0l1M5voB4AGMnPbvQAc4GRkY5/zxSYx xwCBSnggDk/yrYzADgdScdh0oPAPTpQc4POKOAcZJP8AKgAI5PA6dqTqAegzwAOv+NL256+nrRwA ACSfYUABxk8frTWAK46nH+fpTiMEdc5/KkY/KcZJx2PSgDKvkwDwM57d66zwhqZvNOa1kJMtsQuT 3U9PywR+ArlrwYUjjIHNS+ErkweJI4x92ZGRvbjI/UD86zmrouL1PSaKKKwNTK14/wCgKPWQA/ka 5odvpRRW9LYxnuIOh/GjFFFaEinv9f6U0nCgiiigBcdKF+YjNFFAAOWx7Udh9KKKAM27+4341U0p jHr9gV4JuIx+bYooqHsyo7nrFFFFc5sf/9k= "
+ id="image4062"
+ x="310.39771"
+ y="-663.94092"
+ style="display:inline"
+ inkscape:export-filename="/home/vjrj/proyectos/dev/kune/trunk/img/webtemplate/chat-revisited.png"
+ inkscape:export-xdpi="90"
+ inkscape:export-ydpi="90" />
+ <image
+ inkscape:export-ydpi="90"
+ inkscape:export-xdpi="90"
+ inkscape:export-filename="/home/vjrj/proyectos/dev/kune/trunk/img/webtemplate/chat-revisited.png"
+ width="22"
+ height="22"
+ xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADgAAAA4CAYAAACohjseAAAABHNCSVQICAgIfAhkiAAAB71JREFU aIHVml9IXGcah5+j49SZ4zmHOOl0G4Wdtqvp0A6RqknTJt1cJNltWAiFtltKoBakgwy5sA2kF8WL QlZy6V6YSRmUtRZSJA32oliSQiBNyPonmRUJiiSkVNJEE6zOycyoM+fdC3WjiX9mnKNmX/jdfPOd 9/2eec98h/P9RhER7AhFUbyaRpeisK2ggNvJJP95+JB24Gexq8haQkRyFuBXVe7W1zM9OIh0dSGN jaR9PiZVlXtOJyeAMjtqZb02G+CK3W5Gw2HSS03p60Pq6khoGnFd5yKw6/8KUNO4EAqRXG1qIoE0 NZH2eHhoGFwG9jz1gE4nx/x+zKmpzC+bmkLCYSyvF9Mw6Ab2PZWAQJWqEh8eXluKmRmkpQWrpATT MLgOHHhqAIE8TWOotRUr1zWkUkh7O+LzETMMBoBDmw7ocBCqrMS088tOp5GODqSsjJhhMAQcBpQN BwQ8LhexaNT2u0lEEMtCOjuR8nJiuk4UqNhQQE2jLRhcfde0o6PNzViaRryoiAiwZd0BgSrDID4+ vr5wCzU2htTUkHC7mcjPpzbb2zYbOEXXGYhEct9Y1qKeHiQQwNR1BoAq2wHz86kNBDAta+Ph5mVZ SCSCZRjENY02wGMLILDF7Waip2fz4BZqfBwJBkm6XMQcDkJAXk6ARUVEampIbDbY44pGkcpKTE1j aLnbNpPuVWga8bGxzQdaTq2tWKpK3OnkWFaAcxtLtLl5czaWbDQ8jPj9mJrGBaA4U8DD5eXE0unN B8hEU1NIKETS7WYU8K8KaBgMdXZuzOJ++QX57jvkp5+Q33/PLVc4TFpVuQt4V+reobIyYuv1WLAs 5NSpPDl0SBev1yXFxars379Tqqu3S2GhQ8rLNfnwQ1UuXVpb/vp6pjWNayt1b6CjY33gbt5E3nrL La+//qqcOXNGbt68KQtjampKent7pampSZ57TpdPP3VKIpFdjcFBRNe5u1z3Dvh86/Pbi0QU8XgK 5eTJE5JKpWS1GBsbk/ff/5ts3+6W69czr9PVhXg8XF2ue9fb2+2Hu3QJ2bbNkBs3bqwK9ni0trbI iy+qEotlVquxkbSqcnqp7u0rKcFMpeyFM03kpZfccu7cuazh5uOjj/4uwWBhRvV8PiaBvUt1r7ul xf7nXl3dM/LBB4fXDCciMj4+LqWlHvnxx5Vr9fUhqso9QHm8e3u8XsyZGXvhRkcRt7tA7t+/nxOg iMjZs2elulpbsV5dHQmnkxMijz0HDYPL4bD93fvhB+TNNwM5w4mImKYpLpdDpqeXrpVIIJpGfP6g OW/+hFtRlF0OBxUff4xi16n5fPT25lFd/Wdbcqmqygsv/IGBgaU//+orLEWhW0SGgUeAus7JhgYK nU5b1rEoenqKqK7ebVu+qqqdXLv25Pj0NHz5JcnJSY7Pj+UBKIpSJsLOTz55BGxn/PorlJaW2pav pORPjIw8eaO1tiKpFFER+ff8WB6A00nNkSMohYW2rWFR7NgxQzQatS1ff/8VAoHFhlUqBQ0NxCcm HnUPIE9RFKWggNraWtYJD6qrE/T2XrItX19fP6+9tnjs66+RqSluiMjPj8/f6/MxaffOuVBXryIv v1xqyy46MjIixcXPLMqfSiElJZgs4XPkqSpHgkFU277eJWLHDnjw4D5XrlzJOdepU//k4EHHorEz Z8A0GRaRi09c4PFwtatr/bo3r2+/RbZvL5VEIrHm7nV3d4vX65LffnuUN52e9TVYxrxB17k7OLj+ gCLIe++55Nixo2uCSyQS4vf/Ub75ZvG5b0cHYhgMLFcUTeNafT3TGwE4NoY8/3yhfPHFcZmens4Y bmRkRA4e3CvvvONelM+yZs0aVnCkALyqyt3lLGi7dfs2sn+/WyoqyqS/v39VuLa2f8nWrUXy+ecF kkwuztXZiRgGQysVnKf0u92MhkIks3Frc9Hp04ps3eqSd9/9izQ2/kPOnz8vDx48kFu3bklHR4cc P/6ZvPFGQF55RZWlDpzT6VkHCji8KuAcZLGmccHvx1yra5ut7txB2tqQo0edsnu3IS6XQ559tlDe fluXhoY8+f57nujavJqbsebstRXNmCcGnE6OqSpxO9zbbJXpEcnY2P/eGFb1DpcehCpNY6iyEnO9 jM5cVFNDoqiISCaTl/8A8hwOQi4XsWCQ5EZ6giuppwdxu5kgQ0N09Qng0TTaDIN4JIK12fZZIICZ n09tphdlnB2o0nUGAgHMzbLRIhGsOQM0Y5c3qwqAkp9PrdvNRE0NiY10nMbHEcMgThbubtaAC0C3 FBUR0TTizc1YG2HOBIMkNY22rNeaS1WgQteJlpcT6+yc/Y2sB1w0irhcxMjAsrYVcA5SAQ4bBkNl ZcQ6OjJ/nmWqykpMh4PQmtZn50qAQ4bBgM9HrL199kU017StrVhzFvWyPvyGAS4APWAYXC8pwWxp wVrrQfLwMKKq2W8s6w64AHSfYdDt9WKGw1jZ/u3S78dcynd/agAXgO4xDC57PDxsaiKdidcXCpHU NC7kXHsjABeA7tJ1Lmoa8bo6En19S08Nh0nP+ezFOdfcSMAFoGVOJydUlXs+H5ONjaS7umZd2fp6 puf8db8dtZS5gpsSiqIowB5V5UhhITtmZvCJcCcW468iMmpHjf8C6MILrTFT1g8AAAAASUVORK5C YII= "
+ id="image4068"
+ x="625.47876"
+ y="-920.7627"
+ style="display:inline" />
+ <image
+ style="display:inline"
+ y="-662.29431"
+ x="379.29431"
+ id="image4070"
+ xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADgAAAA4CAYAAACohjseAAAABHNCSVQICAgIfAhkiAAAB71JREFU aIHVml9IXGcah5+j49SZ4zmHOOl0G4Wdtqvp0A6RqknTJt1cJNltWAiFtltKoBakgwy5sA2kF8WL QlZy6V6YSRmUtRZSJA32oliSQiBNyPonmRUJiiSkVNJEE6zOycyoM+fdC3WjiX9mnKNmX/jdfPOd 9/2eec98h/P9RhER7AhFUbyaRpeisK2ggNvJJP95+JB24Gexq8haQkRyFuBXVe7W1zM9OIh0dSGN jaR9PiZVlXtOJyeAMjtqZb02G+CK3W5Gw2HSS03p60Pq6khoGnFd5yKw6/8KUNO4EAqRXG1qIoE0 NZH2eHhoGFwG9jz1gE4nx/x+zKmpzC+bmkLCYSyvF9Mw6Ab2PZWAQJWqEh8eXluKmRmkpQWrpATT MLgOHHhqAIE8TWOotRUr1zWkUkh7O+LzETMMBoBDmw7ocBCqrMS088tOp5GODqSsjJhhMAQcBpQN BwQ8LhexaNT2u0lEEMtCOjuR8nJiuk4UqNhQQE2jLRhcfde0o6PNzViaRryoiAiwZd0BgSrDID4+ vr5wCzU2htTUkHC7mcjPpzbb2zYbOEXXGYhEct9Y1qKeHiQQwNR1BoAq2wHz86kNBDAta+Ph5mVZ SCSCZRjENY02wGMLILDF7Waip2fz4BZqfBwJBkm6XMQcDkJAXk6ARUVEampIbDbY44pGkcpKTE1j aLnbNpPuVWga8bGxzQdaTq2tWKpK3OnkWFaAcxtLtLl5czaWbDQ8jPj9mJrGBaA4U8DD5eXE0unN B8hEU1NIKETS7WYU8K8KaBgMdXZuzOJ++QX57jvkp5+Q33/PLVc4TFpVuQt4V+reobIyYuv1WLAs 5NSpPDl0SBev1yXFxars379Tqqu3S2GhQ8rLNfnwQ1UuXVpb/vp6pjWNayt1b6CjY33gbt5E3nrL La+//qqcOXNGbt68KQtjampKent7pampSZ57TpdPP3VKIpFdjcFBRNe5u1z3Dvh86/Pbi0QU8XgK 5eTJE5JKpWS1GBsbk/ff/5ts3+6W69czr9PVhXg8XF2ue9fb2+2Hu3QJ2bbNkBs3bqwK9ni0trbI iy+qEotlVquxkbSqcnqp7u0rKcFMpeyFM03kpZfccu7cuazh5uOjj/4uwWBhRvV8PiaBvUt1r7ul xf7nXl3dM/LBB4fXDCciMj4+LqWlHvnxx5Vr9fUhqso9QHm8e3u8XsyZGXvhRkcRt7tA7t+/nxOg iMjZs2elulpbsV5dHQmnkxMijz0HDYPL4bD93fvhB+TNNwM5w4mImKYpLpdDpqeXrpVIIJpGfP6g OW/+hFtRlF0OBxUff4xi16n5fPT25lFd/Wdbcqmqygsv/IGBgaU//+orLEWhW0SGgUeAus7JhgYK nU5b1rEoenqKqK7ebVu+qqqdXLv25Pj0NHz5JcnJSY7Pj+UBKIpSJsLOTz55BGxn/PorlJaW2pav pORPjIw8eaO1tiKpFFER+ff8WB6A00nNkSMohYW2rWFR7NgxQzQatS1ff/8VAoHFhlUqBQ0NxCcm HnUPIE9RFKWggNraWtYJD6qrE/T2XrItX19fP6+9tnjs66+RqSluiMjPj8/f6/MxaffOuVBXryIv v1xqyy46MjIixcXPLMqfSiElJZgs4XPkqSpHgkFU277eJWLHDnjw4D5XrlzJOdepU//k4EHHorEz Z8A0GRaRi09c4PFwtatr/bo3r2+/RbZvL5VEIrHm7nV3d4vX65LffnuUN52e9TVYxrxB17k7OLj+ gCLIe++55Nixo2uCSyQS4vf/Ub75ZvG5b0cHYhgMLFcUTeNafT3TGwE4NoY8/3yhfPHFcZmens4Y bmRkRA4e3CvvvONelM+yZs0aVnCkALyqyt3lLGi7dfs2sn+/WyoqyqS/v39VuLa2f8nWrUXy+ecF kkwuztXZiRgGQysVnKf0u92MhkIks3Frc9Hp04ps3eqSd9/9izQ2/kPOnz8vDx48kFu3bklHR4cc P/6ZvPFGQF55RZWlDpzT6VkHCji8KuAcZLGmccHvx1yra5ut7txB2tqQo0edsnu3IS6XQ559tlDe fluXhoY8+f57nujavJqbsebstRXNmCcGnE6OqSpxO9zbbJXpEcnY2P/eGFb1DpcehCpNY6iyEnO9 jM5cVFNDoqiISCaTl/8A8hwOQi4XsWCQ5EZ6giuppwdxu5kgQ0N09Qng0TTaDIN4JIK12fZZIICZ n09tphdlnB2o0nUGAgHMzbLRIhGsOQM0Y5c3qwqAkp9PrdvNRE0NiY10nMbHEcMgThbubtaAC0C3 FBUR0TTizc1YG2HOBIMkNY22rNeaS1WgQteJlpcT6+yc/Y2sB1w0irhcxMjAsrYVcA5SAQ4bBkNl ZcQ6OjJ/nmWqykpMh4PQmtZn50qAQ4bBgM9HrL199kU017StrVhzFvWyPvyGAS4APWAYXC8pwWxp wVrrQfLwMKKq2W8s6w64AHSfYdDt9WKGw1jZ/u3S78dcynd/agAXgO4xDC57PDxsaiKdidcXCpHU NC7kXHsjABeA7tJ1Lmoa8bo6En19S08Nh0nP+ezFOdfcSMAFoGVOJydUlXs+H5ONjaS7umZd2fp6 puf8db8dtZS5gpsSiqIowB5V5UhhITtmZvCJcCcW468iMmpHjf8C6MILrTFT1g8AAAAASUVORK5C YII= "
+ height="22"
+ width="22"
+ inkscape:export-filename="/home/vjrj/proyectos/dev/kune/trunk/img/webtemplate/chat-revisited.png"
+ inkscape:export-xdpi="90"
+ inkscape:export-ydpi="90" />
+ <text
+ xml:space="preserve"
+ style="font-size:22px;font-style:italic;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:100%;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;baseline-shift:baseline;opacity:0.82999998;color:#000000;fill:#b3b3b3;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.52077562px;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Ubuntu;-inkscape-font-specification:Ubuntu Italic"
+ x="244.21739"
+ y="-438.23007"
+ id="text4072"
+ sodipodi:linespacing="100%"
+ inkscape:export-filename="/home/vjrj/proyectos/dev/kune/trunk/img/webtemplate/chat-revisited.png"
+ inkscape:export-xdpi="90"
+ inkscape:export-ydpi="90"><tspan
+ sodipodi:role="line"
+ id="tspan4074"
+ x="244.21739"
+ y="-438.23007">Write here, write now ;)</tspan></text>
+ <text
+ xml:space="preserve"
+ style="font-size:18px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:100%;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;baseline-shift:baseline;opacity:0.82999998;color:#000000;fill:#782121;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.52077562px;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Ubuntu;-inkscape-font-specification:Ubuntu Bold"
+ x="85.766296"
+ y="-601.15228"
+ id="text4076"
+ sodipodi:linespacing="100%"
+ inkscape:export-filename="/home/vjrj/proyectos/dev/kune/trunk/img/webtemplate/chat-revisited.png"
+ inkscape:export-xdpi="90"
+ inkscape:export-ydpi="90"><tspan
+ sodipodi:role="line"
+ id="tspan4078"
+ x="85.766296"
+ y="-601.15228">New room</tspan></text>
+ <text
+ sodipodi:linespacing="100%"
+ id="text4080"
+ y="-565.15228"
+ x="85.766296"
+ style="font-size:18px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:100%;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;baseline-shift:baseline;opacity:0.82999998;color:#000000;fill:#782121;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.52077562px;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Ubuntu;-inkscape-font-specification:Ubuntu Bold"
+ xml:space="preserve"
+ inkscape:export-filename="/home/vjrj/proyectos/dev/kune/trunk/img/webtemplate/chat-revisited.png"
+ inkscape:export-xdpi="90"
+ inkscape:export-ydpi="90"><tspan
+ y="-565.15228"
+ x="85.766296"
+ id="tspan4082"
+ sodipodi:role="line">Start chat</tspan></text>
+ <text
+ xml:space="preserve"
+ style="font-size:22px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:100%;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;baseline-shift:baseline;color:#000000;fill:#782121;fill-opacity:0.97254902;fill-rule:nonzero;stroke:none;stroke-width:0.52077562px;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Ubuntu;-inkscape-font-specification:Ubuntu Bold"
+ x="702.0177"
+ y="-644.28217"
+ id="text4084"
+ sodipodi:linespacing="100%"
+ inkscape:export-filename="/home/vjrj/proyectos/dev/kune/trunk/img/webtemplate/chat-revisited.png"
+ inkscape:export-xdpi="90"
+ inkscape:export-ydpi="90"><tspan
+ sodipodi:role="line"
+ id="tspan4086"
+ x="702.0177"
+ y="-644.28217"
+ style="fill:#782121;fill-opacity:0.97254902">Chat</tspan></text>
+ <path
+ style="fill:#0000ff;stroke:#0000ff;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:3, 3;stroke-dashoffset:0;marker-start:url(#Arrow1Lstart);marker-mid:none;marker-end:url(#Arrow1Lstart)"
+ d="m 151.11072,-708.23846 c 38.55475,-1.06114 132.11699,0.0538 117.71947,0.0808"
+ id="path4128"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="cc"
+ inkscape:export-filename="/home/vjrj/proyectos/dev/kune/trunk/img/webtemplate/chat-revisited.png"
+ inkscape:export-xdpi="90"
+ inkscape:export-ydpi="90" />
+ <rect
+ y="-928.00006"
+ x="594"
+ height="222"
+ width="16"
+ id="rect6453"
+ style="color:#000000;fill:#f9f9f9;fill-opacity:1;fill-rule:nonzero;stroke:#cccccc;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+ inkscape:export-filename="/home/vjrj/proyectos/dev/kune/trunk/img/webtemplate/chat-revisited.png"
+ inkscape:export-xdpi="90"
+ inkscape:export-ydpi="90" />
+ <text
+ xml:space="preserve"
+ style="font-size:28px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;line-height:100%;letter-spacing:0px;word-spacing:0px;fill:#0000ff;fill-opacity:1;stroke:#ffffff;stroke-width:0.5;display:inline;font-family:'festus!';-inkscape-font-specification:'festus! Bold'"
+ x="564.28058"
+ y="-740.25293"
+ id="text6083"
+ sodipodi:linespacing="100%"
+ inkscape:export-filename="/home/vjrj/proyectos/dev/kune/trunk/img/webtemplate/chat-revisited.png"
+ inkscape:export-xdpi="90"
+ inkscape:export-ydpi="90"
+ transform="matrix(1.0176358,-0.00753392,0.00727468,0.98261598,0,0)"><tspan
+ style="stroke-width:0.5"
+ id="tspan6085"
+ sodipodi:role="line"
+ x="564.28058"
+ y="-740.25293">drag & drop</tspan></text>
+ <path
+ sodipodi:nodetypes="cc"
+ inkscape:connector-curvature="0"
+ id="path6087"
+ d="m 567.18858,-721.65637 c 38.55475,-1.06114 132.11699,0.0538 117.71947,0.0808"
+ style="fill:#0000ff;stroke:#0000ff;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:3, 3;stroke-dashoffset:0;marker-start:url(#Arrow1Lstart);marker-mid:none;marker-end:url(#Arrow1Lstart)"
+ inkscape:export-filename="/home/vjrj/proyectos/dev/kune/trunk/img/webtemplate/chat-revisited.png"
+ inkscape:export-xdpi="90"
+ inkscape:export-ydpi="90" />
+ <text
+ transform="matrix(1.0176358,-0.00753392,0.00727468,0.98261598,0,0)"
+ inkscape:export-ydpi="90"
+ inkscape:export-xdpi="90"
+ inkscape:export-filename="/home/vjrj/proyectos/dev/kune/trunk/img/webtemplate/chat-revisited.png"
+ sodipodi:linespacing="100%"
+ id="text6089"
+ y="-590.73108"
+ x="337.89642"
+ style="font-size:28px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;line-height:100%;letter-spacing:0px;word-spacing:0px;fill:#0000ff;fill-opacity:1;stroke:#ffffff;stroke-width:0.5;display:inline;font-family:'festus!';-inkscape-font-specification:'festus! Bold'"
+ xml:space="preserve"><tspan
+ y="-590.73108"
+ x="337.89642"
+ sodipodi:role="line"
+ id="tspan6091"
+ style="stroke-width:0.5">drop here to chat or to make</tspan><tspan
+ y="-562.73108"
+ x="337.89642"
+ sodipodi:role="line"
+ style="stroke-width:0.5"
+ id="tspan6126">a group chat</tspan></text>
+ <text
+ xml:space="preserve"
+ style="font-size:22px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:100%;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;baseline-shift:baseline;opacity:0.82999998;color:#000000;fill:#782121;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.52077562px;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Ubuntu;-inkscape-font-specification:Ubuntu"
+ x="121.27255"
+ y="-901.57721"
+ id="text6116"
+ sodipodi:linespacing="100%"
+ inkscape:export-filename="/home/vjrj/proyectos/dev/kune/trunk/img/webtemplate/chat-revisited.png"
+ inkscape:export-xdpi="90"
+ inkscape:export-ydpi="90"><tspan
+ sodipodi:role="line"
+ id="tspan6118"
+ x="121.27255"
+ y="-901.57721">Jane</tspan></text>
+ <path
+ sodipodi:type="arc"
+ style="color:#000000;fill:#008000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.52077562px;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+ id="path6120"
+ sodipodi:cx="118.99664"
+ sodipodi:cy="-1104.4874"
+ sodipodi:rx="5.4711099"
+ sodipodi:ry="5.4711099"
+ d="m 124.46775,-1104.4874 a 5.4711099,5.4711099 0 1 1 -10.94222,0 5.4711099,5.4711099 0 1 1 10.94222,0 z"
+ transform="translate(205.16663,226.26996)"
+ inkscape:export-filename="/home/vjrj/proyectos/dev/kune/trunk/img/webtemplate/chat-revisited.png"
+ inkscape:export-xdpi="90"
+ inkscape:export-ydpi="90" />
+ <path
+ d="m 124.46775,-1104.4874 a 5.4711099,5.4711099 0 1 1 -10.94222,0 5.4711099,5.4711099 0 1 1 10.94222,0 z"
+ sodipodi:ry="5.4711099"
+ sodipodi:rx="5.4711099"
+ sodipodi:cy="-1104.4874"
+ sodipodi:cx="118.99664"
+ id="path6122"
+ style="color:#000000;fill:#008000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.52077562px;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+ sodipodi:type="arc"
+ transform="translate(-3,211)"
+ inkscape:export-filename="/home/vjrj/proyectos/dev/kune/trunk/img/webtemplate/chat-revisited.png"
+ inkscape:export-xdpi="90"
+ inkscape:export-ydpi="90" />
+ <path
+ transform="translate(344.16663,226.26996)"
+ d="m 124.46775,-1104.4874 a 5.4711099,5.4711099 0 1 1 -10.94222,0 5.4711099,5.4711099 0 1 1 10.94222,0 z"
+ sodipodi:ry="5.4711099"
+ sodipodi:rx="5.4711099"
+ sodipodi:cy="-1104.4874"
+ sodipodi:cx="118.99664"
+ id="path6124"
+ style="color:#000000;fill:#ff0000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.52077562px;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+ sodipodi:type="arc"
+ inkscape:export-filename="/home/vjrj/proyectos/dev/kune/trunk/img/webtemplate/chat-revisited.png"
+ inkscape:export-xdpi="90"
+ inkscape:export-ydpi="90" />
+ <image
+ style="display:inline"
+ y="-886.71503"
+ x="84.471268"
+ id="image6128"
+ xlink:href="data:image/jpeg;base64,/9j/4AAQSkZJRgABAQAAAQABAAD/2wBDAAgGBgcGBQgHBwcJCQgKDBQNDAsLDBkSEw8UHRofHh0a HBwgJC4nICIsIxwcKDcpLDAxNDQ0Hyc5PTgyPC4zNDL/2wBDAQkJCQwLDBgNDRgyIRwhMjIyMjIy MjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjL/wAARCABkAGQDASIA AhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQA AAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3 ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWm p6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEA AwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSEx BhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElK U1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3 uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwD3+iii gAooooAKY7rGpZ2Cj1JxWZqmqfZAYoQDLjknoo9ff6Vzsksksu+RmdiTgk5IH9KuMG9SHNJ2OxS7 t5DtSeJm9A4JqeuAkQFeeTn86bZ67d6VMAXMttnDRk5x9Cen8v5hunbYFPueg0VXtbmK8to7iFw0 bjKkVYrMsKKKKACiiigAooooASmSyLFE8jfdVST9AKkqjqr+Xpk59QB+ZA/rQtxM5WSVppXlc5Zi SeeB7e1M5ySSDx+VAIx1PToKDyTxj6iuowGuODxkkevSsm+HBHBPt2rWkPB4zwayb08Ec/lQxo3v A98xe50+RjgASxg9hnDfqR+tdrXmXhCUp4ngUDiRXQ8+ik/j0Fem1zzWprHYKKKKkoKKKKACiiig AqnqieZps6+ilvy5/pVymSIJI2RujAgj60LRiZw579h/OgnoScDHAFDApIyMCHUkN7GkJGB06+vT /GuowGSnCEDIH0rFvXySMkjPY9K0rqXg9ck81hXMm44BwPek2M2fBsYl8SRt/wA80duvTIx/WvSx XDeAbbMt5dEYAVY1Prnk/wAh+ddzWE3qax2CiiipKCiiigAooooAKKKKAOL8QQGx1IygHy58sMDo 3cf1/Gsh7sADnt0B6V3er2UF9p8sNwwRfvCQn7hHQ15XK7xyFCc4OMjoa3hLQyktSzc3OSew+tZ5 JcjHJz6fp70E5JyMn3NdH4MsbS81NpZ5EMkADRxHALH+97gfzIP1G7K4Ja2Ox8OaadL0aGCQYmb9 5J/vHt+AwPwrXNFJWD1NRaKKKACiiigAoo7VSvr9LKIMRuduFUd6EribLbMEUsxAA6knisu71y3g ysX71/Y4X8+/4ZrBub2e7YtMxIB4UHAH4f1qD19cdMVtGn3Ic+xLfXlxfZEj/KOQo+6P8awbu0yT gcVs4Bzkkk+9RtGrk9CMHv1rSySsiLtnLNAwONpwT370+CGVZQ6MyuDlShIII7gjp9a3mtFJJwMC nR2ip2ANKwGxpPiK4WNYr8GUY/1q8MPqOn+e9dJb3cF2m6CVXHcA4I+o6iuLVAFHtTGDKwdGZWBy GU4I+hFQ6aexam+p6BRXH6X4meKZbfUG3RkgLMeCp/2vUe/866+smmty077C0UUUhiZwMnpXHX10 by6eTtnCj2H8v/r10uqS+Tp0zDqV2/mcVyJOBwCTjsela0l1M5voB4AGMnPbvQAc4GRkY5/zxSYx xwCBSnggDk/yrYzADgdScdh0oPAPTpQc4POKOAcZJP8AKgAI5PA6dqTqAegzwAOv+NL256+nrRwA ACSfYUABxk8frTWAK46nH+fpTiMEdc5/KkY/KcZJx2PSgDKvkwDwM57d66zwhqZvNOa1kJMtsQuT 3U9PywR+ArlrwYUjjIHNS+ErkweJI4x92ZGRvbjI/UD86zmrouL1PSaKKKwNTK14/wCgKPWQA/ka 5odvpRRW9LYxnuIOh/GjFFFaEinv9f6U0nCgiiigBcdKF+YjNFFAAOWx7Udh9KKKAM27+4341U0p jHr9gV4JuIx+bYooqHsyo7nrFFFFc5sf/9k= "
+ height="31.743042"
+ width="31.736002"
+ inkscape:export-filename="/home/vjrj/proyectos/dev/kune/trunk/img/webtemplate/chat-revisited.png"
+ inkscape:export-xdpi="90"
+ inkscape:export-ydpi="90" />
+ <text
+ sodipodi:linespacing="100%"
+ id="text6130"
+ y="-864.57721"
+ x="121.27255"
+ style="font-size:22px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:100%;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;baseline-shift:baseline;opacity:0.82999998;color:#000000;fill:#782121;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.52077562px;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Ubuntu;-inkscape-font-specification:Ubuntu"
+ xml:space="preserve"
+ inkscape:export-filename="/home/vjrj/proyectos/dev/kune/trunk/img/webtemplate/chat-revisited.png"
+ inkscape:export-xdpi="90"
+ inkscape:export-ydpi="90"><tspan
+ y="-864.57721"
+ x="121.27255"
+ id="tspan6132"
+ sodipodi:role="line">John</tspan></text>
+ <path
+ transform="translate(-3,248)"
+ sodipodi:type="arc"
+ style="color:#000000;fill:#008000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.52077562px;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+ id="path6134"
+ sodipodi:cx="118.99664"
+ sodipodi:cy="-1104.4874"
+ sodipodi:rx="5.4711099"
+ sodipodi:ry="5.4711099"
+ d="m 124.46775,-1104.4874 a 5.4711099,5.4711099 0 1 1 -10.94222,0 5.4711099,5.4711099 0 1 1 10.94222,0 z"
+ inkscape:export-filename="/home/vjrj/proyectos/dev/kune/trunk/img/webtemplate/chat-revisited.png"
+ inkscape:export-xdpi="90"
+ inkscape:export-ydpi="90" />
+ <text
+ sodipodi:linespacing="100%"
+ id="text6136"
+ y="-903.15161"
+ x="653.97021"
+ style="font-size:22px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:100%;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;baseline-shift:baseline;opacity:0.82999998;color:#000000;fill:#782121;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.52077562px;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Ubuntu;-inkscape-font-specification:Ubuntu"
+ xml:space="preserve"
+ inkscape:export-filename="/home/vjrj/proyectos/dev/kune/trunk/img/webtemplate/chat-revisited.png"
+ inkscape:export-xdpi="90"
+ inkscape:export-ydpi="90"><tspan
+ y="-903.15161"
+ x="653.97021"
+ id="tspan6138"
+ sodipodi:role="line">Foo</tspan></text>
+ <rect
+ rx="15"
+ ry="15.000001"
+ style="color:#000000;fill:#552200;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.52077562px;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+ id="rect6449"
+ width="707.21039"
+ height="51.903992"
+ x="73.875587"
+ y="-1120.7415"
+ inkscape:export-filename="/home/vjrj/proyectos/dev/kune/trunk/img/webtemplate/chat-revisited.png"
+ inkscape:export-xdpi="90"
+ inkscape:export-ydpi="90" />
+ <rect
+ y="-1422.0948"
+ x="73.875587"
+ height="331.25742"
+ width="707.21039"
+ id="rect6140"
+ style="color:#000000;fill:#552200;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.52077562px;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+ inkscape:export-filename="/home/vjrj/proyectos/dev/kune/trunk/img/webtemplate/chat-revisited.png"
+ inkscape:export-xdpi="90"
+ inkscape:export-ydpi="90" />
+ <rect
+ style="opacity:0.82999998;color:#000000;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.52077562px;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+ id="rect6142"
+ width="146.36401"
+ height="32.98317"
+ x="80.351868"
+ y="-1398.2444"
+ inkscape:export-filename="/home/vjrj/proyectos/dev/kune/trunk/img/webtemplate/chat-revisited.png"
+ inkscape:export-xdpi="90"
+ inkscape:export-ydpi="90" />
+ <rect
+ y="-1395.1566"
+ x="238.32439"
+ height="29.156178"
+ width="527.24084"
+ id="rect6144"
+ style="opacity:0.82999998;color:#000000;fill:#999999;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.52077562px;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+ inkscape:export-filename="/home/vjrj/proyectos/dev/kune/trunk/img/webtemplate/chat-revisited.png"
+ inkscape:export-xdpi="90"
+ inkscape:export-ydpi="90" />
+ <rect
+ style="color:#000000;fill:#b3b3b3;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.52077562px;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+ id="rect6148"
+ width="66.851814"
+ height="46.690155"
+ x="306.63422"
+ y="-1394.6611"
+ ry="7.4279795"
+ rx="7.4279795"
+ inkscape:export-filename="/home/vjrj/proyectos/dev/kune/trunk/img/webtemplate/chat-revisited.png"
+ inkscape:export-xdpi="90"
+ inkscape:export-ydpi="90" />
+ <rect
+ rx="7.4279795"
+ ry="7.4279795"
+ y="-1394.6611"
+ x="376.63422"
+ height="46.690155"
+ width="66.851814"
+ id="rect6150"
+ style="color:#000000;fill:#b3b3b3;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.52077562px;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+ inkscape:export-filename="/home/vjrj/proyectos/dev/kune/trunk/img/webtemplate/chat-revisited.png"
+ inkscape:export-xdpi="90"
+ inkscape:export-ydpi="90" />
+ <rect
+ y="-1367.3397"
+ x="236.64713"
+ height="170.80717"
+ width="529.53052"
+ id="rect6152"
+ style="color:#000000;fill:#ececec;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.52077562px;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+ inkscape:export-filename="/home/vjrj/proyectos/dev/kune/trunk/img/webtemplate/chat-revisited.png"
+ inkscape:export-xdpi="90"
+ inkscape:export-ydpi="90" />
+ <rect
+ style="color:#000000;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.52077562px;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+ id="rect6160"
+ width="531.96021"
+ height="67.908195"
+ x="236.64713"
+ y="-1193.7877"
+ inkscape:export-filename="/home/vjrj/proyectos/dev/kune/trunk/img/webtemplate/chat-revisited.png"
+ inkscape:export-xdpi="90"
+ inkscape:export-ydpi="90" />
+ <rect
+ y="-1116.0986"
+ x="236.39433"
+ height="29.156178"
+ width="58.312355"
+ id="rect6164"
+ style="opacity:0.82999998;color:#000000;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.52077562px;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+ inkscape:export-filename="/home/vjrj/proyectos/dev/kune/trunk/img/webtemplate/chat-revisited.png"
+ inkscape:export-xdpi="90"
+ inkscape:export-ydpi="90" />
+ <rect
+ style="opacity:0.82999998;color:#000000;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.52077562px;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+ id="rect6166"
+ width="58.312355"
+ height="29.156178"
+ x="236.39433"
+ y="-1116.0986"
+ inkscape:export-filename="/home/vjrj/proyectos/dev/kune/trunk/img/webtemplate/chat-revisited.png"
+ inkscape:export-xdpi="90"
+ inkscape:export-ydpi="90" />
+ <rect
+ y="-1357.9731"
+ x="81.324394"
+ height="29.156178"
+ width="145.78088"
+ id="rect6168"
+ style="opacity:0.82999998;color:#000000;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.52077562px;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+ inkscape:export-filename="/home/vjrj/proyectos/dev/kune/trunk/img/webtemplate/chat-revisited.png"
+ inkscape:export-xdpi="90"
+ inkscape:export-ydpi="90" />
+ <rect
+ style="opacity:0.82999998;color:#000000;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.52077562px;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+ id="rect6170"
+ width="145.78088"
+ height="29.156178"
+ x="81.324394"
+ y="-1321.9731"
+ inkscape:export-filename="/home/vjrj/proyectos/dev/kune/trunk/img/webtemplate/chat-revisited.png"
+ inkscape:export-xdpi="90"
+ inkscape:export-ydpi="90" />
+ <rect
+ y="-1286.9119"
+ x="81.324394"
+ height="29.156178"
+ width="145.78088"
+ id="rect6172"
+ style="opacity:0.82999998;color:#000000;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.52077562px;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+ inkscape:export-filename="/home/vjrj/proyectos/dev/kune/trunk/img/webtemplate/chat-revisited.png"
+ inkscape:export-xdpi="90"
+ inkscape:export-ydpi="90" />
+ <text
+ sodipodi:linespacing="100%"
+ id="text6176"
+ y="-1095.9503"
+ x="241.19073"
+ style="font-size:18px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:100%;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;baseline-shift:baseline;opacity:0.82999998;color:#000000;fill:#782121;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.52077562px;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Ubuntu;-inkscape-font-specification:Ubuntu Bold"
+ xml:space="preserve"
+ inkscape:export-filename="/home/vjrj/proyectos/dev/kune/trunk/img/webtemplate/chat-revisited.png"
+ inkscape:export-xdpi="90"
+ inkscape:export-ydpi="90"><tspan
+ y="-1095.9503"
+ x="241.19073"
+ id="tspan6178"
+ sodipodi:role="line">Send</tspan></text>
+ <rect
+ style="opacity:0.82999998;color:#000000;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.52077562px;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+ id="rect6180"
+ width="32.800701"
+ height="29.156178"
+ x="302.39435"
+ y="-1116.0986"
+ inkscape:export-filename="/home/vjrj/proyectos/dev/kune/trunk/img/webtemplate/chat-revisited.png"
+ inkscape:export-xdpi="90"
+ inkscape:export-ydpi="90" />
+ <rect
+ y="-1116.0986"
+ x="302.39435"
+ height="29.156178"
+ width="30.371019"
+ id="rect6182"
+ style="opacity:0.82999998;color:#000000;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.52077562px;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+ inkscape:export-filename="/home/vjrj/proyectos/dev/kune/trunk/img/webtemplate/chat-revisited.png"
+ inkscape:export-xdpi="90"
+ inkscape:export-ydpi="90" />
+ <text
+ xml:space="preserve"
+ style="font-size:22px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:100%;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;baseline-shift:baseline;opacity:0.82999998;color:#000000;fill:#782121;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.52077562px;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Ubuntu;-inkscape-font-specification:Ubuntu Bold"
+ x="310.19073"
+ y="-1093.9503"
+ id="text6184"
+ sodipodi:linespacing="100%"
+ inkscape:export-filename="/home/vjrj/proyectos/dev/kune/trunk/img/webtemplate/chat-revisited.png"
+ inkscape:export-xdpi="90"
+ inkscape:export-ydpi="90"><tspan
+ sodipodi:role="line"
+ id="tspan6186"
+ x="310.19073"
+ y="-1093.9503">:)</tspan></text>
+ <image
+ inkscape:export-ydpi="90"
+ inkscape:export-xdpi="90"
+ inkscape:export-filename="/home/vjrj/proyectos/dev/kune/trunk/img/webtemplate/chat-revisited.png"
+ width="16"
+ height="32"
+ id="image6196"
+ x="749.80859"
+ y="-1231.301"
+ style="display:inline"
+ xlink:href="/home/vjrj/proyectos/ourproject.org/kune/svn/trunk/img/various/scroll2.png"
+ sodipodi:absref="/home/vjrj/proyectos/ourproject.org/kune/svn/trunk/img/various/scroll2.png" />
+ <text
+ xml:space="preserve"
+ style="font-size:18px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:100%;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;baseline-shift:baseline;opacity:0.82999998;color:#000000;fill:#782121;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.52077562px;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Ubuntu;-inkscape-font-specification:Ubuntu Bold"
+ x="84.272552"
+ y="-1377.5771"
+ id="text6242"
+ sodipodi:linespacing="100%"
+ inkscape:export-filename="/home/vjrj/proyectos/dev/kune/trunk/img/webtemplate/chat-revisited.png"
+ inkscape:export-xdpi="90"
+ inkscape:export-ydpi="90"><tspan
+ sodipodi:role="line"
+ id="tspan6244"
+ x="84.272552"
+ y="-1377.5771">Your contacts</tspan></text>
+ <text
+ xml:space="preserve"
+ style="font-size:18px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:100%;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;baseline-shift:baseline;opacity:0.82999998;color:#000000;fill:#782121;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.52077562px;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Ubuntu;-inkscape-font-specification:Ubuntu Bold"
+ x="86.734329"
+ y="-1337.1523"
+ id="text6256"
+ sodipodi:linespacing="100%"
+ inkscape:export-filename="/home/vjrj/proyectos/dev/kune/trunk/img/webtemplate/chat-revisited.png"
+ inkscape:export-xdpi="90"
+ inkscape:export-ydpi="90"><tspan
+ sodipodi:role="line"
+ id="tspan6258"
+ x="86.734329"
+ y="-1337.1523">Add contact</tspan></text>
+ <rect
+ rx="7.4279795"
+ ry="7.4279795"
+ y="-1394.6611"
+ x="236.6342"
+ height="46.690155"
+ width="66.851814"
+ id="rect6260"
+ style="color:#000000;fill:#ececec;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.52077562px;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+ inkscape:export-filename="/home/vjrj/proyectos/dev/kune/trunk/img/webtemplate/chat-revisited.png"
+ inkscape:export-xdpi="90"
+ inkscape:export-ydpi="90" />
+ <image
+ width="23.246883"
+ height="23.252039"
+ xlink:href="data:image/jpeg;base64,/9j/4AAQSkZJRgABAQAAAQABAAD/2wBDAAgGBgcGBQgHBwcJCQgKDBQNDAsLDBkSEw8UHRofHh0a HBwgJC4nICIsIxwcKDcpLDAxNDQ0Hyc5PTgyPC4zNDL/2wBDAQkJCQwLDBgNDRgyIRwhMjIyMjIy MjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjL/wAARCABkAGQDASIA AhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQA AAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3 ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWm p6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEA AwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSEx BhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElK U1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3 uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwD3+iii gAooooAKY7rGpZ2Cj1JxWZqmqfZAYoQDLjknoo9ff6Vzsksksu+RmdiTgk5IH9KuMG9SHNJ2OxS7 t5DtSeJm9A4JqeuAkQFeeTn86bZ67d6VMAXMttnDRk5x9Cen8v5hunbYFPueg0VXtbmK8to7iFw0 bjKkVYrMsKKKKACiiigAooooASmSyLFE8jfdVST9AKkqjqr+Xpk59QB+ZA/rQtxM5WSVppXlc5Zi SeeB7e1M5ySSDx+VAIx1PToKDyTxj6iuowGuODxkkevSsm+HBHBPt2rWkPB4zwayb08Ec/lQxo3v A98xe50+RjgASxg9hnDfqR+tdrXmXhCUp4ngUDiRXQ8+ik/j0Fem1zzWprHYKKKKkoKKKKACiiig AqnqieZps6+ilvy5/pVymSIJI2RujAgj60LRiZw579h/OgnoScDHAFDApIyMCHUkN7GkJGB06+vT /GuowGSnCEDIH0rFvXySMkjPY9K0rqXg9ck81hXMm44BwPek2M2fBsYl8SRt/wA80duvTIx/WvSx XDeAbbMt5dEYAVY1Prnk/wAh+ddzWE3qax2CiiipKCiiigAooooAKKKKAOL8QQGx1IygHy58sMDo 3cf1/Gsh7sADnt0B6V3er2UF9p8sNwwRfvCQn7hHQ15XK7xyFCc4OMjoa3hLQyktSzc3OSew+tZ5 JcjHJz6fp70E5JyMn3NdH4MsbS81NpZ5EMkADRxHALH+97gfzIP1G7K4Ja2Ox8OaadL0aGCQYmb9 5J/vHt+AwPwrXNFJWD1NRaKKKACiiigAoo7VSvr9LKIMRuduFUd6EribLbMEUsxAA6knisu71y3g ysX71/Y4X8+/4ZrBub2e7YtMxIB4UHAH4f1qD19cdMVtGn3Ic+xLfXlxfZEj/KOQo+6P8awbu0yT gcVs4Bzkkk+9RtGrk9CMHv1rSySsiLtnLNAwONpwT370+CGVZQ6MyuDlShIII7gjp9a3mtFJJwMC nR2ip2ANKwGxpPiK4WNYr8GUY/1q8MPqOn+e9dJb3cF2m6CVXHcA4I+o6iuLVAFHtTGDKwdGZWBy GU4I+hFQ6aexam+p6BRXH6X4meKZbfUG3RkgLMeCp/2vUe/866+smmty077C0UUUhiZwMnpXHX10 by6eTtnCj2H8v/r10uqS+Tp0zDqV2/mcVyJOBwCTjsela0l1M5voB4AGMnPbvQAc4GRkY5/zxSYx xwCBSnggDk/yrYzADgdScdh0oPAPTpQc4POKOAcZJP8AKgAI5PA6dqTqAegzwAOv+NL256+nrRwA ACSfYUABxk8frTWAK46nH+fpTiMEdc5/KkY/KcZJx2PSgDKvkwDwM57d66zwhqZvNOa1kJMtsQuT 3U9PywR+ArlrwYUjjIHNS+ErkweJI4x92ZGRvbjI/UD86zmrouL1PSaKKKwNTK14/wCgKPWQA/ka 5odvpRRW9LYxnuIOh/GjFFFaEinv9f6U0nCgiiigBcdKF+YjNFFAAOWx7Udh9KKKAM27+4341U0p jHr9gV4JuIx+bYooqHsyo7nrFFFFc5sf/9k= "
+ id="image6262"
+ x="238.39769"
+ y="-1393.9409"
+ style="display:inline"
+ inkscape:export-filename="/home/vjrj/proyectos/dev/kune/trunk/img/webtemplate/chat-revisited.png"
+ inkscape:export-xdpi="90"
+ inkscape:export-ydpi="90" />
+ <image
+ style="display:inline"
+ y="-1393.9409"
+ x="310.39771"
+ id="image6264"
+ xlink:href="data:image/jpeg;base64,/9j/4AAQSkZJRgABAQAAAQABAAD/2wBDAAgGBgcGBQgHBwcJCQgKDBQNDAsLDBkSEw8UHRofHh0a HBwgJC4nICIsIxwcKDcpLDAxNDQ0Hyc5PTgyPC4zNDL/2wBDAQkJCQwLDBgNDRgyIRwhMjIyMjIy MjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjL/wAARCABkAGQDASIA AhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQA AAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3 ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWm p6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEA AwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSEx BhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElK U1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3 uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwD3+iii gAooooAKY7rGpZ2Cj1JxWZqmqfZAYoQDLjknoo9ff6Vzsksksu+RmdiTgk5IH9KuMG9SHNJ2OxS7 t5DtSeJm9A4JqeuAkQFeeTn86bZ67d6VMAXMttnDRk5x9Cen8v5hunbYFPueg0VXtbmK8to7iFw0 bjKkVYrMsKKKKACiiigAooooASmSyLFE8jfdVST9AKkqjqr+Xpk59QB+ZA/rQtxM5WSVppXlc5Zi SeeB7e1M5ySSDx+VAIx1PToKDyTxj6iuowGuODxkkevSsm+HBHBPt2rWkPB4zwayb08Ec/lQxo3v A98xe50+RjgASxg9hnDfqR+tdrXmXhCUp4ngUDiRXQ8+ik/j0Fem1zzWprHYKKKKkoKKKKACiiig AqnqieZps6+ilvy5/pVymSIJI2RujAgj60LRiZw579h/OgnoScDHAFDApIyMCHUkN7GkJGB06+vT /GuowGSnCEDIH0rFvXySMkjPY9K0rqXg9ck81hXMm44BwPek2M2fBsYl8SRt/wA80duvTIx/WvSx XDeAbbMt5dEYAVY1Prnk/wAh+ddzWE3qax2CiiipKCiiigAooooAKKKKAOL8QQGx1IygHy58sMDo 3cf1/Gsh7sADnt0B6V3er2UF9p8sNwwRfvCQn7hHQ15XK7xyFCc4OMjoa3hLQyktSzc3OSew+tZ5 JcjHJz6fp70E5JyMn3NdH4MsbS81NpZ5EMkADRxHALH+97gfzIP1G7K4Ja2Ox8OaadL0aGCQYmb9 5J/vHt+AwPwrXNFJWD1NRaKKKACiiigAoo7VSvr9LKIMRuduFUd6EribLbMEUsxAA6knisu71y3g ysX71/Y4X8+/4ZrBub2e7YtMxIB4UHAH4f1qD19cdMVtGn3Ic+xLfXlxfZEj/KOQo+6P8awbu0yT gcVs4Bzkkk+9RtGrk9CMHv1rSySsiLtnLNAwONpwT370+CGVZQ6MyuDlShIII7gjp9a3mtFJJwMC nR2ip2ANKwGxpPiK4WNYr8GUY/1q8MPqOn+e9dJb3cF2m6CVXHcA4I+o6iuLVAFHtTGDKwdGZWBy GU4I+hFQ6aexam+p6BRXH6X4meKZbfUG3RkgLMeCp/2vUe/866+smmty077C0UUUhiZwMnpXHX10 by6eTtnCj2H8v/r10uqS+Tp0zDqV2/mcVyJOBwCTjsela0l1M5voB4AGMnPbvQAc4GRkY5/zxSYx xwCBSnggDk/yrYzADgdScdh0oPAPTpQc4POKOAcZJP8AKgAI5PA6dqTqAegzwAOv+NL256+nrRwA ACSfYUABxk8frTWAK46nH+fpTiMEdc5/KkY/KcZJx2PSgDKvkwDwM57d66zwhqZvNOa1kJMtsQuT 3U9PywR+ArlrwYUjjIHNS+ErkweJI4x92ZGRvbjI/UD86zmrouL1PSaKKKwNTK14/wCgKPWQA/ka 5odvpRRW9LYxnuIOh/GjFFFaEinv9f6U0nCgiiigBcdKF+YjNFFAAOWx7Udh9KKKAM27+4341U0p jHr9gV4JuIx+bYooqHsyo7nrFFFFc5sf/9k= "
+ height="23.252039"
+ width="23.246883"
+ inkscape:export-filename="/home/vjrj/proyectos/dev/kune/trunk/img/webtemplate/chat-revisited.png"
+ inkscape:export-xdpi="90"
+ inkscape:export-ydpi="90" />
+ <image
+ inkscape:export-ydpi="90"
+ inkscape:export-xdpi="90"
+ inkscape:export-filename="/home/vjrj/proyectos/dev/kune/trunk/img/webtemplate/chat-revisited.png"
+ width="22"
+ height="22"
+ xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADgAAAA4CAYAAACohjseAAAABHNCSVQICAgIfAhkiAAAB71JREFU aIHVml9IXGcah5+j49SZ4zmHOOl0G4Wdtqvp0A6RqknTJt1cJNltWAiFtltKoBakgwy5sA2kF8WL QlZy6V6YSRmUtRZSJA32oliSQiBNyPonmRUJiiSkVNJEE6zOycyoM+fdC3WjiX9mnKNmX/jdfPOd 9/2eec98h/P9RhER7AhFUbyaRpeisK2ggNvJJP95+JB24Gexq8haQkRyFuBXVe7W1zM9OIh0dSGN jaR9PiZVlXtOJyeAMjtqZb02G+CK3W5Gw2HSS03p60Pq6khoGnFd5yKw6/8KUNO4EAqRXG1qIoE0 NZH2eHhoGFwG9jz1gE4nx/x+zKmpzC+bmkLCYSyvF9Mw6Ab2PZWAQJWqEh8eXluKmRmkpQWrpATT MLgOHHhqAIE8TWOotRUr1zWkUkh7O+LzETMMBoBDmw7ocBCqrMS088tOp5GODqSsjJhhMAQcBpQN BwQ8LhexaNT2u0lEEMtCOjuR8nJiuk4UqNhQQE2jLRhcfde0o6PNzViaRryoiAiwZd0BgSrDID4+ vr5wCzU2htTUkHC7mcjPpzbb2zYbOEXXGYhEct9Y1qKeHiQQwNR1BoAq2wHz86kNBDAta+Ph5mVZ SCSCZRjENY02wGMLILDF7Waip2fz4BZqfBwJBkm6XMQcDkJAXk6ARUVEampIbDbY44pGkcpKTE1j aLnbNpPuVWga8bGxzQdaTq2tWKpK3OnkWFaAcxtLtLl5czaWbDQ8jPj9mJrGBaA4U8DD5eXE0unN B8hEU1NIKETS7WYU8K8KaBgMdXZuzOJ++QX57jvkp5+Q33/PLVc4TFpVuQt4V+reobIyYuv1WLAs 5NSpPDl0SBev1yXFxars379Tqqu3S2GhQ8rLNfnwQ1UuXVpb/vp6pjWNayt1b6CjY33gbt5E3nrL La+//qqcOXNGbt68KQtjampKent7pampSZ57TpdPP3VKIpFdjcFBRNe5u1z3Dvh86/Pbi0QU8XgK 5eTJE5JKpWS1GBsbk/ff/5ts3+6W69czr9PVhXg8XF2ue9fb2+2Hu3QJ2bbNkBs3bqwK9ni0trbI iy+qEotlVquxkbSqcnqp7u0rKcFMpeyFM03kpZfccu7cuazh5uOjj/4uwWBhRvV8PiaBvUt1r7ul xf7nXl3dM/LBB4fXDCciMj4+LqWlHvnxx5Vr9fUhqso9QHm8e3u8XsyZGXvhRkcRt7tA7t+/nxOg iMjZs2elulpbsV5dHQmnkxMijz0HDYPL4bD93fvhB+TNNwM5w4mImKYpLpdDpqeXrpVIIJpGfP6g OW/+hFtRlF0OBxUff4xi16n5fPT25lFd/Wdbcqmqygsv/IGBgaU//+orLEWhW0SGgUeAus7JhgYK nU5b1rEoenqKqK7ebVu+qqqdXLv25Pj0NHz5JcnJSY7Pj+UBKIpSJsLOTz55BGxn/PorlJaW2pav pORPjIw8eaO1tiKpFFER+ff8WB6A00nNkSMohYW2rWFR7NgxQzQatS1ff/8VAoHFhlUqBQ0NxCcm HnUPIE9RFKWggNraWtYJD6qrE/T2XrItX19fP6+9tnjs66+RqSluiMjPj8/f6/MxaffOuVBXryIv v1xqyy46MjIixcXPLMqfSiElJZgs4XPkqSpHgkFU277eJWLHDnjw4D5XrlzJOdepU//k4EHHorEz Z8A0GRaRi09c4PFwtatr/bo3r2+/RbZvL5VEIrHm7nV3d4vX65LffnuUN52e9TVYxrxB17k7OLj+ gCLIe++55Nixo2uCSyQS4vf/Ub75ZvG5b0cHYhgMLFcUTeNafT3TGwE4NoY8/3yhfPHFcZmens4Y bmRkRA4e3CvvvONelM+yZs0aVnCkALyqyt3lLGi7dfs2sn+/WyoqyqS/v39VuLa2f8nWrUXy+ecF kkwuztXZiRgGQysVnKf0u92MhkIks3Frc9Hp04ps3eqSd9/9izQ2/kPOnz8vDx48kFu3bklHR4cc P/6ZvPFGQF55RZWlDpzT6VkHCji8KuAcZLGmccHvx1yra5ut7txB2tqQo0edsnu3IS6XQ559tlDe fluXhoY8+f57nujavJqbsebstRXNmCcGnE6OqSpxO9zbbJXpEcnY2P/eGFb1DpcehCpNY6iyEnO9 jM5cVFNDoqiISCaTl/8A8hwOQi4XsWCQ5EZ6giuppwdxu5kgQ0N09Qng0TTaDIN4JIK12fZZIICZ n09tphdlnB2o0nUGAgHMzbLRIhGsOQM0Y5c3qwqAkp9PrdvNRE0NiY10nMbHEcMgThbubtaAC0C3 FBUR0TTizc1YG2HOBIMkNY22rNeaS1WgQteJlpcT6+yc/Y2sB1w0irhcxMjAsrYVcA5SAQ4bBkNl ZcQ6OjJ/nmWqykpMh4PQmtZn50qAQ4bBgM9HrL199kU017StrVhzFvWyPvyGAS4APWAYXC8pwWxp wVrrQfLwMKKq2W8s6w64AHSfYdDt9WKGw1jZ/u3S78dcynd/agAXgO4xDC57PDxsaiKdidcXCpHU NC7kXHsjABeA7tJ1Lmoa8bo6En19S08Nh0nP+ezFOdfcSMAFoGVOJydUlXs+H5ONjaS7umZd2fp6 puf8db8dtZS5gpsSiqIowB5V5UhhITtmZvCJcCcW468iMmpHjf8C6MILrTFT1g8AAAAASUVORK5C YII= "
+ id="image6268"
+ x="379.29431"
+ y="-1392.2943"
+ style="display:inline" />
+ <text
+ sodipodi:linespacing="100%"
+ id="text6270"
+ y="-1168.2301"
+ x="244.21739"
+ style="font-size:22px;font-style:italic;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:100%;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;baseline-shift:baseline;opacity:0.82999997999999997;color:#000000;fill:#b3b3b3;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.52077561999999999px;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Ubuntu;-inkscape-font-specification:Ubuntu Italic"
+ xml:space="preserve"
+ inkscape:export-filename="/home/vjrj/proyectos/dev/kune/trunk/img/webtemplate/chat-revisited.png"
+ inkscape:export-xdpi="90"
+ inkscape:export-ydpi="90"><tspan
+ y="-1168.2301"
+ x="244.21739"
+ id="tspan6272"
+ sodipodi:role="line">Write here, write now ;)</tspan></text>
+ <text
+ sodipodi:linespacing="100%"
+ id="text6274"
+ y="-1301.1523"
+ x="85.766296"
+ style="font-size:18px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:100%;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;baseline-shift:baseline;opacity:0.82999998;color:#000000;fill:#782121;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.52077562px;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Ubuntu;-inkscape-font-specification:Ubuntu Bold"
+ xml:space="preserve"
+ inkscape:export-filename="/home/vjrj/proyectos/dev/kune/trunk/img/webtemplate/chat-revisited.png"
+ inkscape:export-xdpi="90"
+ inkscape:export-ydpi="90"><tspan
+ y="-1301.1523"
+ x="85.766296"
+ id="tspan6276"
+ sodipodi:role="line">New chatroom</tspan></text>
+ <text
+ xml:space="preserve"
+ style="font-size:18px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:100%;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;baseline-shift:baseline;opacity:0.82999998;color:#000000;fill:#782121;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.52077562px;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Ubuntu;-inkscape-font-specification:Ubuntu Bold"
+ x="85.766296"
+ y="-1265.1523"
+ id="text6278"
+ sodipodi:linespacing="100%"
+ inkscape:export-filename="/home/vjrj/proyectos/dev/kune/trunk/img/webtemplate/chat-revisited.png"
+ inkscape:export-xdpi="90"
+ inkscape:export-ydpi="90"><tspan
+ sodipodi:role="line"
+ id="tspan6280"
+ x="85.766296"
+ y="-1265.1523">Start chat</tspan></text>
+ <text
+ sodipodi:linespacing="100%"
+ id="text6282"
+ y="-1376.2822"
+ x="698.0177"
+ style="font-size:22px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:100%;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;baseline-shift:baseline;opacity:0.82999998;color:#000000;fill:#782121;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.52077562px;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Ubuntu;-inkscape-font-specification:Ubuntu Bold"
+ xml:space="preserve"
+ inkscape:export-filename="/home/vjrj/proyectos/dev/kune/trunk/img/webtemplate/chat-revisited.png"
+ inkscape:export-xdpi="90"
+ inkscape:export-ydpi="90"><tspan
+ style="fill:#ffffff"
+ y="-1376.2822"
+ x="698.0177"
+ id="tspan6284"
+ sodipodi:role="line">Chat</tspan></text>
+ <text
+ xml:space="preserve"
+ style="font-size:28px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;line-height:100%;letter-spacing:0px;word-spacing:0px;fill:#0000ff;fill-opacity:1;stroke:#ffffff;stroke-width:0.5;display:inline;font-family:'festus!';-inkscape-font-specification:'festus! Bold'"
+ x="343.20746"
+ y="-1333.6051"
+ id="text6294"
+ sodipodi:linespacing="100%"
+ inkscape:export-filename="/home/vjrj/proyectos/dev/kune/trunk/img/webtemplate/chat-revisited.png"
+ inkscape:export-xdpi="90"
+ inkscape:export-ydpi="90"
+ transform="matrix(1.0176358,-0.00753392,0.00727468,0.98261598,0,0)"><tspan
+ style="stroke-width:0.5"
+ id="tspan6296"
+ sodipodi:role="line"
+ x="343.20746"
+ y="-1333.6051">drop here to chat or to make</tspan><tspan
+ id="tspan6298"
+ style="stroke-width:0.5"
+ sodipodi:role="line"
+ x="343.20746"
+ y="-1305.6051">a group chat</tspan></text>
+ <path
+ sodipodi:type="star"
+ style="color:#000000;fill:#000080;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.52077562px;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+ id="path6322"
+ sodipodi:sides="3"
+ sodipodi:cx="332.36993"
+ sodipodi:cy="-1041.5697"
+ sodipodi:r1="26.309727"
+ sodipodi:r2="13.154863"
+ sodipodi:arg1="0.52359878"
+ sodipodi:arg2="1.5707963"
+ inkscape:flatsided="true"
+ inkscape:rounded="0"
+ inkscape:randomized="0"
+ d="m 355.15483,-1028.4148 -45.56979,0 22.78489,-39.4646 z"
+ inkscape:transform-center-y="6.5773991"
+ transform="matrix(1,0,0,-1,0,-2081.2943)"
+ inkscape:export-filename="/home/vjrj/proyectos/dev/kune/trunk/img/webtemplate/chat-revisited.png"
+ inkscape:export-xdpi="90"
+ inkscape:export-ydpi="90" />
+ <text
+ sodipodi:linespacing="100%"
+ id="text6393"
+ y="-916.57721"
+ x="276.27255"
+ style="font-size:18px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:100%;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;baseline-shift:baseline;opacity:0.82999998;color:#000000;fill:#782121;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.52077562px;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Ubuntu;-inkscape-font-specification:Ubuntu Bold"
+ xml:space="preserve"
+ inkscape:export-filename="/home/vjrj/proyectos/dev/kune/trunk/img/webtemplate/chat-revisited.png"
+ inkscape:export-xdpi="90"
+ inkscape:export-ydpi="90"><tspan
+ y="-916.57721"
+ x="276.27255"
+ id="tspan6395"
+ sodipodi:role="line">family</tspan></text>
+ <rect
+ y="-832.573"
+ x="266.71661"
+ height="21.884439"
+ width="59.859985"
+ id="rect6420"
+ style="color:#000000;fill:#d1b8b8;fill-opacity:0.97255111;fill-rule:nonzero;stroke:none;stroke-width:0.52077562px;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+ inkscape:export-filename="/home/vjrj/proyectos/dev/kune/trunk/img/webtemplate/chat-revisited.png"
+ inkscape:export-xdpi="90"
+ inkscape:export-ydpi="90" />
+ <text
+ xml:space="preserve"
+ style="font-size:18px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:100%;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;baseline-shift:baseline;opacity:0.82999998;color:#000000;fill:#782121;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.52077562px;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Ubuntu;-inkscape-font-specification:Ubuntu Bold"
+ x="276.27255"
+ y="-816.57721"
+ id="text6422"
+ sodipodi:linespacing="100%"
+ inkscape:export-filename="/home/vjrj/proyectos/dev/kune/trunk/img/webtemplate/chat-revisited.png"
+ inkscape:export-xdpi="90"
+ inkscape:export-ydpi="90"><tspan
+ sodipodi:role="line"
+ id="tspan6424"
+ x="276.27255"
+ y="-816.57721">work</tspan></text>
+ <rect
+ style="color:#000000;fill:#f9f9f9;fill-opacity:1;fill-rule:nonzero;stroke:#cccccc;stroke-width:0.99999994;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+ id="rect6455"
+ width="16"
+ height="218.08206"
+ x="752"
+ y="-925.08209"
+ inkscape:export-filename="/home/vjrj/proyectos/dev/kune/trunk/img/webtemplate/chat-revisited.png"
+ inkscape:export-xdpi="90"
+ inkscape:export-ydpi="90" />
+ <rect
+ inkscape:export-ydpi="90"
+ inkscape:export-xdpi="90"
+ inkscape:export-filename="/home/vjrj/proyectos/dev/kune/trunk/img/webtemplate/chat-revisited.png"
+ style="color:#000000;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.52077562px;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+ id="rect6467"
+ width="94.312332"
+ height="29.156178"
+ x="671.39435"
+ y="-386.09869" />
+ <rect
+ inkscape:export-ydpi="90"
+ inkscape:export-xdpi="90"
+ inkscape:export-filename="/home/vjrj/proyectos/dev/kune/trunk/img/webtemplate/chat-revisited.png"
+ y="-386.09869"
+ x="707.39435"
+ height="29.156178"
+ width="58.312355"
+ id="rect6465"
+ style="opacity:0.82999998;color:#000000;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.52077562px;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" />
+ <text
+ inkscape:export-ydpi="90"
+ inkscape:export-xdpi="90"
+ inkscape:export-filename="/home/vjrj/proyectos/dev/kune/trunk/img/webtemplate/chat-revisited.png"
+ sodipodi:linespacing="100%"
+ id="text6469"
+ y="-365.95026"
+ x="676.19073"
+ style="font-size:18px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:100%;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;baseline-shift:baseline;opacity:0.82999998;color:#000000;fill:#782121;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.52077562px;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Ubuntu;-inkscape-font-specification:Ubuntu Bold"
+ xml:space="preserve"><tspan
+ y="-365.95026"
+ x="676.19073"
+ id="tspan6471"
+ sodipodi:role="line">wave this!</tspan></text>
+ <rect
+ y="-1117.0986"
+ x="671.39435"
+ height="29.156178"
+ width="94.312332"
+ id="rect6475"
+ style="color:#000000;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.52077562px;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+ inkscape:export-filename="/home/vjrj/proyectos/dev/kune/trunk/img/webtemplate/chat-revisited.png"
+ inkscape:export-xdpi="90"
+ inkscape:export-ydpi="90" />
+ <rect
+ style="opacity:0.82999998;color:#000000;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.52077562px;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+ id="rect6477"
+ width="58.312355"
+ height="29.156178"
+ x="707.39435"
+ y="-1117.0986"
+ inkscape:export-filename="/home/vjrj/proyectos/dev/kune/trunk/img/webtemplate/chat-revisited.png"
+ inkscape:export-xdpi="90"
+ inkscape:export-ydpi="90" />
+ <text
+ xml:space="preserve"
+ style="font-size:18px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:100%;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;baseline-shift:baseline;opacity:0.82999998;color:#000000;fill:#782121;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.52077562px;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Ubuntu;-inkscape-font-specification:Ubuntu Bold"
+ x="676.19073"
+ y="-1096.9503"
+ id="text6479"
+ sodipodi:linespacing="100%"
+ inkscape:export-filename="/home/vjrj/proyectos/dev/kune/trunk/img/webtemplate/chat-revisited.png"
+ inkscape:export-xdpi="90"
+ inkscape:export-ydpi="90"><tspan
+ sodipodi:role="line"
+ id="tspan6481"
+ x="676.19073"
+ y="-1096.9503">wave this!</tspan></text>
</g>
<g
inkscape:groupmode="layer"
Modified: trunk/src/main/java/cc/kune/chat/client/AvatarDecoratorImpl.java
===================================================================
--- trunk/src/main/java/cc/kune/chat/client/AvatarDecoratorImpl.java 2011-07-10 20:58:52 UTC (rev 1447)
+++ trunk/src/main/java/cc/kune/chat/client/AvatarDecoratorImpl.java 2011-07-12 17:32:54 UTC (rev 1448)
@@ -33,7 +33,6 @@
private final ImageResource chatDotBusy;
private final ImageResource chatDotExtendedAway;
private final ImageResource chatDotXA;
- private final HandlerRegistration presenceHandler;
private final PresenceManager presenceManager;
private final XmppRoster roster;
private final HandlerRegistration rosterHandler;
@@ -41,6 +40,7 @@
private final HandlerRegistration sessionStateChangedHandler;
private XmppURI uri;
private final XmppSession xmppSession;
+ private HandlerRegistration presenceHandler;
public AvatarDecoratorImpl(final ChatInstances chatInstances, final ChatClient chatClient,
final ImageResource chatDotBusy, final ImageResource chatDotXA, final ImageResource chatDotAway,
Modified: trunk/src/main/java/cc/kune/chat/client/ChatClientDefault.java
===================================================================
--- trunk/src/main/java/cc/kune/chat/client/ChatClientDefault.java 2011-07-10 20:58:52 UTC (rev 1447)
+++ trunk/src/main/java/cc/kune/chat/client/ChatClientDefault.java 2011-07-12 17:32:54 UTC (rev 1448)
@@ -36,11 +36,13 @@
import cc.kune.common.client.log.Log;
import cc.kune.common.client.notify.NotifyUser;
import cc.kune.common.client.shortcuts.GlobalShortcutRegister;
+import cc.kune.common.client.utils.SimpleResponseCallback;
import cc.kune.common.client.utils.TextUtils;
import cc.kune.common.client.utils.WindowUtils;
import cc.kune.core.client.events.AvatarChangedEvent;
import cc.kune.core.client.init.AppStartEvent;
import cc.kune.core.client.init.AppStopEvent;
+import cc.kune.core.client.resources.CoreResources;
import cc.kune.core.client.sitebar.SitebarActions;
import cc.kune.core.client.sitebar.SitebarActionsPresenter;
import cc.kune.core.client.state.Session;
@@ -54,7 +56,11 @@
import com.calclab.emite.core.client.xmpp.session.XmppSession;
import com.calclab.emite.core.client.xmpp.stanzas.XmppURI;
import com.calclab.emite.im.client.chat.ChatManager;
+import com.calclab.emite.im.client.roster.SubscriptionHandler.Behaviour;
+import com.calclab.emite.im.client.roster.SubscriptionManager;
import com.calclab.emite.im.client.roster.XmppRoster;
+import com.calclab.emite.im.client.roster.events.SubscriptionRequestReceivedEvent;
+import com.calclab.emite.im.client.roster.events.SubscriptionRequestReceivedHandler;
import com.calclab.emite.xep.avatar.client.AvatarManager;
import com.calclab.emite.xep.muc.client.Room;
import com.calclab.emite.xep.muc.client.RoomManager;
@@ -81,12 +87,10 @@
public class ChatClientAction extends AbstractExtendedAction {
- private final EventBus eventBus;
private final ChatResources res;
- public ChatClientAction(final EventBus eventBus, final ChatResources res) {
+ public ChatClientAction(final ChatResources res) {
super();
- this.eventBus = eventBus;
this.res = res;
putValue(Action.SMALL_ICON, res.chat());
@@ -94,7 +98,7 @@
@Override
public void actionPerformed(final ActionEvent event) {
- eventBus.fireEvent(new ToggleShowChatDialogEvent());
+ kuneEventBus.fireEvent(new ToggleShowChatDialogEvent());
}
public void setBlink(final boolean blink) {
@@ -106,7 +110,6 @@
}
protected static final String CHAT_CLIENT_ICON_ID = "k-chat-icon-id";
-
private static final String CHAT_TITLE = "Chat ;)";
private final ChatClientAction action;
@@ -117,27 +120,27 @@
private final ChatOptions chatOptions;
private final ChatResources chatResources;
private Dialog dialog;
- private final EventBus eventBus;
private final I18nTranslationService i18n;
+ private final EventBus kuneEventBus;
+ private final CoreResources res;
private final RoomManager roomManager;
private final XmppRoster roster;
private final Session session;
-
private final GlobalShortcutRegister shorcutRegister;
-
private final SitebarActions siteActions;
-
+ private final SubscriptionManager subscriptionManager;
private final XmppSession xmppSession;
@Inject
- public ChatClientDefault(final EventBus eventBus, final I18nTranslationService i18n,
- final SitebarActions siteActions, final Session session,
+ public ChatClientDefault(final EventBus kuneEventBus, final I18nTranslationService i18n,
+ final SitebarActions siteActions, final Session session, final CoreResources res,
final GlobalShortcutRegister shorcutRegister, final ChatOptions chatOptions,
final ChatResources chatResources, final ChatInstances chatInstances) {
- this.eventBus = eventBus;
+ this.kuneEventBus = kuneEventBus;
this.i18n = i18n;
+ this.res = res;
this.chatInstances = chatInstances;
- action = new ChatClientAction(eventBus, chatResources);
+ action = new ChatClientAction(chatResources);
this.siteActions = siteActions;
this.session = session;
this.shorcutRegister = shorcutRegister;
@@ -149,6 +152,8 @@
this.chatManager = chatInstances.chatManager;
this.roomManager = chatInstances.roomManager;
this.avatarManager = chatInstances.avatarManager;
+ this.subscriptionManager = chatInstances.subscriptionManager;
+
// Not necessary, in ChatInstance
// Suco.get(SessionReconnect.class);
@@ -173,29 +178,30 @@
logout();
}
});
- eventBus.addHandler(ShowChatDialogEvent.getType(), new ShowChatDialogHandler() {
+ kuneEventBus.addHandler(ShowChatDialogEvent.getType(), new ShowChatDialogHandler() {
@Override
public void onShowChatDialog(final ShowChatDialogEvent event) {
createActionIfNeeded();
showDialog(event.show);
}
});
- eventBus.addHandler(ToggleShowChatDialogEvent.getType(), new ToggleShowChatDialogHandler() {
+ kuneEventBus.addHandler(ToggleShowChatDialogEvent.getType(), new ToggleShowChatDialogHandler() {
@Override
public void onToggleShowChatDialog(final ToggleShowChatDialogEvent event) {
toggleShowDialog();
}
});
- eventBus.addHandler(AvatarChangedEvent.getType(), new AvatarChangedEvent.AvatarChangedHandler() {
+ kuneEventBus.addHandler(AvatarChangedEvent.getType(),
+ new AvatarChangedEvent.AvatarChangedHandler() {
- @Override
- public void onAvatarChanged(final AvatarChangedEvent event) {
- setAvatar(event.getPhotoBinary());
- }
- });
+ @Override
+ public void onAvatarChanged(final AvatarChangedEvent event) {
+ setAvatar(event.getPhotoBinary());
+ }
+ });
}
});
- eventBus.addHandler(AppStopEvent.getType(), new AppStopEvent.AppStopHandler() {
+ kuneEventBus.addHandler(AppStopEvent.getType(), new AppStopEvent.AppStopHandler() {
@Override
public void onAppStop(final AppStopEvent event) {
logout();
@@ -205,7 +211,7 @@
@Override
public void addNewBuddie(final String shortName) {
- roster.requestAddItem(uriFrom(shortName), shortName, "");
+ roster.requestAddItem(uriFrom(shortName), shortName);
}
@Override
@@ -309,7 +315,7 @@
final KuneHablarWidget widget = new KuneHablarWidget(config.layout, config.tabHeaderSize);
final Hablar hablar = widget.getHablar();
HablarComplete.install(hablar, config);
- new KuneHablarSignals(eventBus, xmppSession, hablar, action, chatInstances);
+ new KuneHablarSignals(kuneEventBus, xmppSession, hablar, action, chatInstances);
if (htmlConfig.hasLogger) {
new HablarConsole(hablar);
}
@@ -317,8 +323,29 @@
if (htmlConfig.hasLogin) {
new HablarLogin(hablar, LoginConfig.getFromMeta());
}
- new KuneSoundManager(eventBus, config.soundConfig);
+ new KuneSoundManager(kuneEventBus, config.soundConfig);
createDialog(widget, htmlConfig);
+ chatInstances.subscriptionHandler.setBehaviour(Behaviour.none);
+ subscriptionManager.addSubscriptionRequestReceivedHandler(new SubscriptionRequestReceivedHandler() {
+ @Override
+ public void onSubscriptionRequestReceived(final SubscriptionRequestReceivedEvent event) {
+ final XmppURI uri = event.getFrom();
+ final String nick = event.getNick();
+ NotifyUser.askConfirmation(res.question32(), i18n.t("Confirm new buddie"), i18n.t(
+ "[%s] had added you as a buddy. Do you want to add him/her also?", uri.getJID().toString()),
+ new SimpleResponseCallback() {
+ @Override
+ public void onCancel() {
+ subscriptionManager.refuseSubscriptionRequest(uri.getJID());
+ }
+
+ @Override
+ public void onSuccess() {
+ subscriptionManager.approveSubscriptionRequest(uri.getJID(), nick);
+ }
+ });
+ }
+ });
}
@Override
Modified: trunk/src/main/java/cc/kune/chat/client/ChatInstances.java
===================================================================
--- trunk/src/main/java/cc/kune/chat/client/ChatInstances.java 2011-07-10 20:58:52 UTC (rev 1447)
+++ trunk/src/main/java/cc/kune/chat/client/ChatInstances.java 2011-07-12 17:32:54 UTC (rev 1448)
@@ -3,6 +3,8 @@
import com.calclab.emite.core.client.xmpp.session.XmppSession;
import com.calclab.emite.im.client.chat.ChatManager;
import com.calclab.emite.im.client.presence.PresenceManager;
+import com.calclab.emite.im.client.roster.SubscriptionHandler;
+import com.calclab.emite.im.client.roster.SubscriptionManager;
import com.calclab.emite.im.client.roster.XmppRoster;
import com.calclab.emite.reconnect.client.SessionReconnect;
import com.calclab.emite.xep.avatar.client.AvatarManager;
@@ -12,14 +14,16 @@
public class ChatInstances {
- public AvatarManager avatarManager;
- public ChatManager chatManager;
- public PresenceManager presenceManager;
- public PrivateStorageManager privateStorageManager;
- public RoomManager roomManager;
- public XmppRoster roster;
- public SessionReconnect sessionReconnect;
- public XmppSession xmppSession;
+ public final AvatarManager avatarManager;
+ public final ChatManager chatManager;
+ public final PresenceManager presenceManager;
+ public final PrivateStorageManager privateStorageManager;
+ public final RoomManager roomManager;
+ public final XmppRoster roster;
+ public final SessionReconnect sessionReconnect;
+ public final SubscriptionHandler subscriptionHandler;
+ public final SubscriptionManager subscriptionManager;
+ public final XmppSession xmppSession;
public ChatInstances() {
this.xmppSession = Suco.get(XmppSession.class);
@@ -30,5 +34,7 @@
this.avatarManager = Suco.get(AvatarManager.class);
this.presenceManager = Suco.get(PresenceManager.class);
this.privateStorageManager = Suco.get(PrivateStorageManager.class);
+ this.subscriptionManager = Suco.get(SubscriptionManager.class);
+ this.subscriptionHandler = Suco.get(SubscriptionHandler.class);
}
}
Modified: trunk/src/main/java/cc/kune/chat/client/ChatParts.java
===================================================================
--- trunk/src/main/java/cc/kune/chat/client/ChatParts.java 2011-07-10 20:58:52 UTC (rev 1447)
+++ trunk/src/main/java/cc/kune/chat/client/ChatParts.java 2011-07-12 17:32:54 UTC (rev 1448)
@@ -19,8 +19,8 @@
*/
package cc.kune.chat.client;
+import cc.kune.chat.client.actions.AddAsBuddieAction;
import cc.kune.chat.client.actions.AddAsBuddieHeaderButton;
-import cc.kune.chat.client.actions.AddAsBuddieHeaderButton.AddAsBuddieAction;
import cc.kune.chat.client.actions.ChatClientActions;
import cc.kune.chat.client.actions.ChatSitebarActions;
import cc.kune.chat.client.actions.OpenGroupPublicChatRoomAction;
@@ -93,8 +93,8 @@
public MenuItemDescriptor get() {
final MenuItemDescriptor item = new MenuItemDescriptor(startChatWithMemberAction.get());
item.add(isNotMe);
+ item.add(isNotBuddieCondition);
item.add(isPersonCondition);
- item.add(isNotBuddieCondition);
item.add(isLogged);
return item;
}
@@ -116,8 +116,8 @@
final MenuItemDescriptor item = new MenuItemDescriptor(action);
item.add(isNotMe);
item.add(isNotBuddieCondition);
+ item.add(isPersonCondition);
item.add(isLogged);
- item.add(isPersonCondition);
/**
* FIXME Buggy & duplicate code with {@link AddAsBuddieHeaderButton}
*/
Added: trunk/src/main/java/cc/kune/chat/client/actions/AddAsBuddieAction.java
===================================================================
--- trunk/src/main/java/cc/kune/chat/client/actions/AddAsBuddieAction.java (rev 0)
+++ trunk/src/main/java/cc/kune/chat/client/actions/AddAsBuddieAction.java 2011-07-12 17:32:54 UTC (rev 1448)
@@ -0,0 +1,43 @@
+package cc.kune.chat.client.actions;
+
+import cc.kune.chat.client.ChatClient;
+import cc.kune.chat.client.ChatInstances;
+import cc.kune.common.client.actions.AbstractExtendedAction;
+import cc.kune.common.client.actions.Action;
+import cc.kune.common.client.actions.ActionEvent;
+import cc.kune.core.client.resources.CoreMessages;
+import cc.kune.core.client.resources.CoreResources;
+import cc.kune.core.client.state.StateManager;
+import cc.kune.core.shared.dto.GroupDTO;
+import cc.kune.core.shared.dto.UserSimpleDTO;
+import cc.kune.core.shared.i18n.I18nTranslationService;
+
+import com.google.inject.Inject;
+
+public class AddAsBuddieAction extends AbstractExtendedAction {
+ private final ChatClient chatEngine;
+
+ @Inject
+ public AddAsBuddieAction(final ChatClient chatEngine, final ChatInstances chatInstances,
+ final StateManager stateManager, final I18nTranslationService i18n, final CoreResources img) {
+ super();
+ this.chatEngine = chatEngine;
+ putValue(Action.NAME, i18n.t(CoreMessages.ADD_AS_A_BUDDIE));
+ putValue(Action.SMALL_ICON, img.addGreen());
+ }
+
+ @Override
+ public void actionPerformed(final ActionEvent event) {
+ String username = null;
+ if (event.getTarget() instanceof GroupDTO) {
+ username = ((GroupDTO) event.getTarget()).getShortName();
+ } else if (event.getTarget() instanceof UserSimpleDTO) {
+ username = ((UserSimpleDTO) event.getTarget()).getShortName();
+ }
+ if (username != null) {
+ chatEngine.addNewBuddie(username);
+ // NotifyUser.info("Added as buddie. Waiting buddie response");
+ setEnabled(false);
+ }
+ }
+}
Modified: trunk/src/main/java/cc/kune/chat/client/actions/AddAsBuddieHeaderButton.java
===================================================================
--- trunk/src/main/java/cc/kune/chat/client/actions/AddAsBuddieHeaderButton.java 2011-07-10 20:58:52 UTC (rev 1447)
+++ trunk/src/main/java/cc/kune/chat/client/actions/AddAsBuddieHeaderButton.java 2011-07-12 17:32:54 UTC (rev 1448)
@@ -28,7 +28,6 @@
import cc.kune.common.client.actions.PropertyChangeEvent;
import cc.kune.common.client.actions.PropertyChangeListener;
import cc.kune.common.client.actions.ui.descrip.ButtonDescriptor;
-import cc.kune.common.client.notify.NotifyUser;
import cc.kune.core.client.resources.CoreMessages;
import cc.kune.core.client.resources.CoreResources;
import cc.kune.core.client.state.Session;
@@ -39,18 +38,20 @@
import cc.kune.core.shared.dto.StateAbstractDTO;
import cc.kune.core.shared.i18n.I18nTranslationService;
-import com.calclab.emite.im.client.roster.events.RosterGroupChangedEvent;
-import com.calclab.emite.im.client.roster.events.RosterGroupChangedHandler;
+import com.calclab.emite.im.client.roster.events.RosterItemChangedEvent;
+import com.calclab.emite.im.client.roster.events.RosterItemChangedHandler;
+import com.calclab.emite.im.client.roster.events.RosterRetrievedEvent;
+import com.calclab.emite.im.client.roster.events.RosterRetrievedHandler;
import com.google.inject.Inject;
public class AddAsBuddieHeaderButton {
- public static class AddAsBuddieAction extends AbstractExtendedAction {
+ public static class AddAsBuddieHeaderAction extends AbstractExtendedAction {
private final ChatClient chatEngine;
private final Session session;
@Inject
- public AddAsBuddieAction(final ChatClient chatEngine, final Session session,
+ public AddAsBuddieHeaderAction(final ChatClient chatEngine, final Session session,
final ChatInstances chatInstances, final StateManager stateManager,
final I18nTranslationService i18n, final CoreResources img) {
super();
@@ -62,16 +63,18 @@
setState(event.getState());
}
});
- chatInstances.roster.addRosterGroupChangedHandler(new RosterGroupChangedHandler() {
-
+ chatInstances.roster.addRosterItemChangedHandler(new RosterItemChangedHandler() {
@Override
- public void onGroupChanged(final RosterGroupChangedEvent event) {
- final StateAbstractDTO currentState = session.getCurrentState();
- if (currentState != null) {
- setState(currentState);
- }
+ public void onRosterItemChanged(final RosterItemChangedEvent event) {
+ setState();
}
});
+ chatInstances.roster.addRosterRetrievedHandler(new RosterRetrievedHandler() {
+ @Override
+ public void onRosterRetrieved(final RosterRetrievedEvent event) {
+ setState();
+ }
+ });
putValue(Action.NAME, i18n.t(CoreMessages.ADD_AS_A_BUDDIE));
putValue(Action.SMALL_ICON, img.addGreen());
}
@@ -79,7 +82,7 @@
@Override
public void actionPerformed(final ActionEvent event) {
chatEngine.addNewBuddie(session.getCurrentState().getGroup().getShortName());
- NotifyUser.info("Added as buddie. Waiting buddie response");
+ // NotifyUser.info("Added as buddie. Waiting buddie response");
setEnabled(false);
}
@@ -91,6 +94,13 @@
return !session.getCurrentUser().getShortName().equals(groupName);
}
+ private void setState() {
+ final StateAbstractDTO currentState = session.getCurrentState();
+ if (currentState != null) {
+ setState(currentState);
+ }
+ }
+
private void setState(final StateAbstractDTO state) {
final String groupName = state.getGroup().getShortName();
final boolean imLogged = session.isLogged();
@@ -104,7 +114,8 @@
}
@Inject
- public AddAsBuddieHeaderButton(final AddAsBuddieAction buddieAction, final EntityHeader entityHeader) {
+ public AddAsBuddieHeaderButton(final AddAsBuddieHeaderAction buddieAction,
+ final EntityHeader entityHeader) {
final ButtonDescriptor button = new ButtonDescriptor(buddieAction);
button.setVisible(false);
button.setStyles("k-chat-add-as-buddie");
Modified: trunk/src/main/java/cc/kune/common/client/tooltip/Tooltip.java
===================================================================
--- trunk/src/main/java/cc/kune/common/client/tooltip/Tooltip.java 2011-07-10 20:58:52 UTC (rev 1447)
+++ trunk/src/main/java/cc/kune/common/client/tooltip/Tooltip.java 2011-07-12 17:32:54 UTC (rev 1448)
@@ -118,6 +118,12 @@
}
@Override
+ public void hide() {
+ super.hide();
+ timers.cancel();
+ }
+
+ @Override
public boolean isVisible() {
return super.isShowing();
}
Modified: trunk/src/main/java/cc/kune/common/client/tooltip/TooltipTimers.java
===================================================================
--- trunk/src/main/java/cc/kune/common/client/tooltip/TooltipTimers.java 2011-07-10 20:58:52 UTC (rev 1447)
+++ trunk/src/main/java/cc/kune/common/client/tooltip/TooltipTimers.java 2011-07-12 17:32:54 UTC (rev 1448)
@@ -34,6 +34,12 @@
this.securityTimer = securityTimer;
}
+ public void cancel() {
+ showTimer.cancel();
+ hideTimer.cancel();
+ securityTimer.cancel();
+ }
+
public void onOut() {
if (showTimer.isScheduled()) {
showTimer.cancel();
Modified: trunk/src/main/java/cc/kune/common/client/ui/BasicThumb.java
===================================================================
--- trunk/src/main/java/cc/kune/common/client/ui/BasicThumb.java 2011-07-10 20:58:52 UTC (rev 1447)
+++ trunk/src/main/java/cc/kune/common/client/ui/BasicThumb.java 2011-07-12 17:32:54 UTC (rev 1448)
@@ -41,133 +41,143 @@
* BasicThumb.java
*/
public class BasicThumb extends Composite {
- private static final int NOSIZE = -1;
- private final Image image;
- private final Label label;
- private boolean onOverLabel;
- private final VerticalPanel panel;
+ private static final int NOSIZE = -1;
+ private final Image image;
+ private Tooltip imageTooltip;
+ private final Label label;
+ private Tooltip labelTooltip;
+ private boolean onOverLabel;
+ private final VerticalPanel panel;
- public BasicThumb(final Object imageRef, final int imgSize, final String text, final int textMaxLenght,
- final boolean crop) {
- this(imageRef, imgSize, text, textMaxLenght, crop, null);
- }
+ public BasicThumb(final Object imageRef, final int imgSize, final String text,
+ final int textMaxLenght, final boolean crop) {
+ this(imageRef, imgSize, text, textMaxLenght, crop, null);
+ }
- /**
- *
- * @param imageRef
- * This can be a ImageResource or a String Url
- * @param imgSize
- * @param text
- * @param textMaxLenght
- * @param crop
- * @param clickHandler
- */
- public BasicThumb(final Object imageRef, final int imgSize, final String text, final int textMaxLenght,
- final boolean crop, final ClickHandler clickHandler) {
- super();
- onOverLabel = false;
- panel = new VerticalPanel();
- if (imageRef instanceof String) {
- final String imageUrl = (String) imageRef;
- if (imgSize == NOSIZE) {
- image = new Image(imageUrl);
- } else {
- if (crop) {
- image = new Image(imageUrl, 0, 0, imgSize, imgSize);
- } else {
- image = new Image(imageUrl);
- image.setPixelSize(imgSize, imgSize);
- }
- }
- } else if (imageRef instanceof ImageResource) {
- image = new Image((ImageResource) imageRef);
- image.setPixelSize(imgSize, imgSize);
+ /**
+ *
+ * @param imageRef
+ * This can be a ImageResource or a String Url
+ * @param imgSize
+ * @param text
+ * @param textMaxLenght
+ * @param crop
+ * @param clickHandler
+ */
+ public BasicThumb(final Object imageRef, final int imgSize, final String text,
+ final int textMaxLenght, final boolean crop, final ClickHandler clickHandler) {
+ super();
+ onOverLabel = false;
+ panel = new VerticalPanel();
+ if (imageRef instanceof String) {
+ final String imageUrl = (String) imageRef;
+ if (imgSize == NOSIZE) {
+ image = new Image(imageUrl);
+ } else {
+ if (crop) {
+ image = new Image(imageUrl, 0, 0, imgSize, imgSize);
} else {
- // This should not happen
- image = new Image();
- image.setPixelSize(imgSize, imgSize);
- Log.info("Unrecognized icon of BasicThumb: " + imageRef);
+ image = new Image(imageUrl);
+ image.setPixelSize(imgSize, imgSize);
}
- final String title = textMaxLenght == NOSIZE ? text : TextUtils.ellipsis(text, textMaxLenght);
- label = new Label(title);
- panel.add(image);
- panel.add(label);
- panel.addStyleName("k-basic-thumb");
- panel.addStyleName("kune-Margin-Mini-trbl");
- panel.addStyleName("k-pointer");
- panel.addStyleName("k-floatleft");
- panel.setCellHorizontalAlignment(label, VerticalPanel.ALIGN_CENTER);
- if (clickHandler != null) {
- addClickHandlerImpl(clickHandler);
+ }
+ } else if (imageRef instanceof ImageResource) {
+ image = new Image((ImageResource) imageRef);
+ image.setPixelSize(imgSize, imgSize);
+ } else {
+ // This should not happen
+ image = new Image();
+ image.setPixelSize(imgSize, imgSize);
+ Log.info("Unrecognized icon of BasicThumb: " + imageRef);
+ }
+ final String title = textMaxLenght == NOSIZE ? text : TextUtils.ellipsis(text, textMaxLenght);
+ label = new Label(title);
+ panel.add(image);
+ panel.add(label);
+ panel.addStyleName("k-basic-thumb");
+ panel.addStyleName("kune-Margin-Mini-trbl");
+ panel.addStyleName("k-pointer");
+ panel.addStyleName("k-floatleft");
+ panel.setCellHorizontalAlignment(label, VerticalPanel.ALIGN_CENTER);
+ if (clickHandler != null) {
+ addClickHandlerImpl(clickHandler);
+ }
+ image.addMouseOverHandler(new MouseOverHandler() {
+
+ @Override
+ public void onMouseOver(final MouseOverEvent event) {
+ if (onOverLabel) {
+ label.setVisible(true);
}
- image.addMouseOverHandler(new MouseOverHandler() {
+ }
+ });
+ image.addMouseOutHandler(new MouseOutHandler() {
- @Override
- public void onMouseOver(final MouseOverEvent event) {
- if (onOverLabel) {
- label.setVisible(true);
- }
- }
- });
- image.addMouseOutHandler(new MouseOutHandler() {
+ @Override
+ public void onMouseOut(final MouseOutEvent event) {
+ if (onOverLabel) {
+ label.setVisible(false);
+ }
+ }
+ });
+ initWidget(panel);
+ }
- @Override
- public void onMouseOut(final MouseOutEvent event) {
- if (onOverLabel) {
- label.setVisible(false);
- }
- }
- });
- initWidget(panel);
- }
+ public BasicThumb(final Object imageRef, final String thumText, final ClickHandler clickHandler) {
+ this(imageRef, NOSIZE, thumText, NOSIZE, false, clickHandler);
+ }
- public BasicThumb(final Object imageRef, final String thumText, final ClickHandler clickHandler) {
- this(imageRef, NOSIZE, thumText, NOSIZE, false, clickHandler);
- }
+ public BasicThumb(final Object imageRef, final String text, final int textMaxLenght,
+ final ClickHandler clickHandler) {
+ this(imageRef, NOSIZE, text, textMaxLenght, false, clickHandler);
+ }
- public BasicThumb(final Object imageRef, final String text, final int textMaxLenght, final ClickHandler clickHandler) {
- this(imageRef, NOSIZE, text, textMaxLenght, false, clickHandler);
- }
+ public void addClickHandler(final ClickHandler clickHandler) {
+ addClickHandlerImpl(clickHandler);
+ }
- public void addClickHandler(final ClickHandler clickHandler) {
- addClickHandlerImpl(clickHandler);
- }
+ private void addClickHandlerImpl(final ClickHandler clickHandler) {
+ panel.addDomHandler(clickHandler, ClickEvent.getType());
+ }
- private void addClickHandlerImpl(final ClickHandler clickHandler) {
- panel.addDomHandler(clickHandler, ClickEvent.getType());
- }
+ public void addDoubleClickHandler(final DoubleClickHandler clickHandler) {
+ addDoubleClickHandlerImpl(clickHandler);
+ }
- public void addDoubleClickHandler(final DoubleClickHandler clickHandler) {
- addDoubleClickHandlerImpl(clickHandler);
- }
+ private void addDoubleClickHandlerImpl(final DoubleClickHandler clickHandler) {
+ panel.addDomHandler(clickHandler, DoubleClickEvent.getType());
+ }
- private void addDoubleClickHandlerImpl(final DoubleClickHandler clickHandler) {
- panel.addDomHandler(clickHandler, DoubleClickEvent.getType());
+ public void hideTooltip() {
+ if (imageTooltip != null) {
+ imageTooltip.hide();
+ labelTooltip.hide();
}
+ }
- public void setLabelVisible(final boolean visible) {
- label.setVisible(visible);
- }
+ public void setLabelVisible(final boolean visible) {
+ label.setVisible(visible);
+ }
- public void setOnOverLabel(final boolean onOverLabel) {
- this.onOverLabel = onOverLabel;
- }
+ public void setOnOverLabel(final boolean onOverLabel) {
+ this.onOverLabel = onOverLabel;
+ }
- public void setText(final String text) {
- label.setText(text);
- }
+ public void setText(final String text) {
+ label.setText(text);
+ }
- public void setThumbUrl(final String url) {
- image.setUrl(url);
- }
+ public void setThumbUrl(final String url) {
+ image.setUrl(url);
+ }
- public void setTooltip(final String tip) {
- Tooltip.to(image, tip);
- Tooltip.to(label, tip);
- }
+ public void setTooltip(final String tip) {
+ imageTooltip = Tooltip.to(image, tip);
+ labelTooltip = Tooltip.to(label, tip);
+ }
- public void setTooltip(final String tipTitle, final String tip) {
- Tooltip.to(image, tip);
- Tooltip.to(label, tip);
- }
+ public void setTooltip(final String tipTitle, final String tip) {
+ imageTooltip = Tooltip.to(image, tip);
+ labelTooltip = Tooltip.to(label, tip);
+ }
}
Modified: trunk/src/main/java/cc/kune/core/client/actions/xml/XMLWaveExtension.java
===================================================================
--- trunk/src/main/java/cc/kune/core/client/actions/xml/XMLWaveExtension.java 2011-07-10 20:58:52 UTC (rev 1447)
+++ trunk/src/main/java/cc/kune/core/client/actions/xml/XMLWaveExtension.java 2011-07-12 17:32:54 UTC (rev 1448)
@@ -14,19 +14,19 @@
}
public String getGadgetUrl() {
- return getFirstChild("gadgetUrl").getText();
+ return getFirstChild("gadgetUrl").getText().trim();
}
public String getIconCss() {
- return getFirstChild("iconCss").getText();
+ return getFirstChild("iconCss").getText().trim();
}
public String getIconUrl() {
- return getFirstChild("iconUrl").getText();
+ return getFirstChild("iconUrl").getText().trim();
}
public String getInstallerUrl() {
- return getFirstChild("installerUrl").getText();
+ return getFirstChild("installerUrl").getText().trim();
}
}
Modified: trunk/src/main/java/cc/kune/core/client/resources/CoreResources.java
===================================================================
--- trunk/src/main/java/cc/kune/core/client/resources/CoreResources.java 2011-07-10 20:58:52 UTC (rev 1447)
+++ trunk/src/main/java/cc/kune/core/client/resources/CoreResources.java 2011-07-12 17:32:54 UTC (rev 1448)
@@ -457,6 +457,9 @@
@Source("prefs.png")
ImageResource prefs();
+ @Source("question32.png")
+ ImageResource question32();
+
@Source("radiochecked.png")
ImageResource radiochecked();
Added: trunk/src/main/java/cc/kune/core/client/resources/question32.png
===================================================================
(Binary files differ)
Property changes on: trunk/src/main/java/cc/kune/core/client/resources/question32.png
___________________________________________________________________
Name: svn:mime-type
+ application/octet-stream
Modified: trunk/src/main/java/cc/kune/core/client/sn/AbstractSNPanel.java
===================================================================
--- trunk/src/main/java/cc/kune/core/client/sn/AbstractSNPanel.java 2011-07-10 20:58:52 UTC (rev 1447)
+++ trunk/src/main/java/cc/kune/core/client/sn/AbstractSNPanel.java 2011-07-12 17:32:54 UTC (rev 1448)
@@ -127,21 +127,27 @@
public BasicThumb createThumb(final String text, final String avatarUrl, final String tooltip,
final String tooltipTitle, final GuiActionDescCollection menuitems) {
final BasicThumb thumb = new BasicThumb(avatarUrl, AVATARSIZE, text, AVATARLABELMAXSIZE, false);
- final MenuDescriptor menu = new MenuDescriptor();
- menu.setStandalone(true);
- menu.putValue(AbstractGxtMenuGui.MENU_POSITION, AbstractGxtMenuGui.MenuPosition.bl);
- for (final GuiActionDescrip item : menuitems) {
- item.setParent(menu);
- }
+
final ClickHandler clickHand = new ClickHandler() {
+ MenuDescriptor menu;
+
@Override
public void onClick(final ClickEvent event) {
+ if (menu == null) {
+ menu = new MenuDescriptor();
+ menu.setStandalone(true);
+ menu.putValue(AbstractGxtMenuGui.MENU_POSITION, AbstractGxtMenuGui.MenuPosition.bl);
+ for (final GuiActionDescrip item : menuitems) {
+ item.setParent(menu);
+ }
+ actions.add(menu);
+ actions.add(menuitems);
+ }
+ thumb.hideTooltip();
menu.show(thumb);
}
};
thumb.addClickHandler(clickHand);
- actions.add(menu);
- actions.add(menuitems);
thumb.setTooltip(tooltipTitle, tooltip);
thumb.setLabelVisible(false);
return thumb;
1
0
r1447 - in trunk/src/main/java/cc/kune: chat/client core/client/sitebar/spaces core/client/ws/entheader
by Vicente J. Ruiz Jurado 10 Jul '11
by Vicente J. Ruiz Jurado 10 Jul '11
10 Jul '11
Author: vjrj_
Date: 2011-07-10 22:58:52 +0200 (Sun, 10 Jul 2011)
New Revision: 1447
Modified:
trunk/src/main/java/cc/kune/chat/client/AvatarDecoratorImpl.java
trunk/src/main/java/cc/kune/chat/client/ChatParts.java
trunk/src/main/java/cc/kune/core/client/sitebar/spaces/SpaceSelectorPresenter.java
trunk/src/main/java/cc/kune/core/client/ws/entheader/EntityHeaderPanel.java
trunk/src/main/java/cc/kune/core/client/ws/entheader/EntityHeaderPresenter.java
trunk/src/main/java/cc/kune/core/client/ws/entheader/EntityTextLogo.java
Log:
Some fixes in avatar on/offline status
Modified: trunk/src/main/java/cc/kune/chat/client/AvatarDecoratorImpl.java
===================================================================
--- trunk/src/main/java/cc/kune/chat/client/AvatarDecoratorImpl.java 2011-07-10 18:29:52 UTC (rev 1446)
+++ trunk/src/main/java/cc/kune/chat/client/AvatarDecoratorImpl.java 2011-07-10 20:58:52 UTC (rev 1447)
@@ -6,8 +6,12 @@
import com.calclab.emite.core.client.events.StateChangedEvent;
import com.calclab.emite.core.client.events.StateChangedHandler;
import com.calclab.emite.core.client.xmpp.session.XmppSession;
+import com.calclab.emite.core.client.xmpp.stanzas.Presence;
import com.calclab.emite.core.client.xmpp.stanzas.Presence.Show;
import com.calclab.emite.core.client.xmpp.stanzas.XmppURI;
+import com.calclab.emite.im.client.presence.PresenceManager;
+import com.calclab.emite.im.client.presence.events.OwnPresenceChangedEvent;
+import com.calclab.emite.im.client.presence.events.OwnPresenceChangedHandler;
import com.calclab.emite.im.client.roster.RosterItem;
import com.calclab.emite.im.client.roster.XmppRoster;
import com.calclab.emite.im.client.roster.events.RosterItemChangedEvent;
@@ -29,11 +33,14 @@
private final ImageResource chatDotBusy;
private final ImageResource chatDotExtendedAway;
private final ImageResource chatDotXA;
+ private final HandlerRegistration presenceHandler;
+ private final PresenceManager presenceManager;
private final XmppRoster roster;
private final HandlerRegistration rosterHandler;
private final XmppSession session;
private final HandlerRegistration sessionStateChangedHandler;
private XmppURI uri;
+ private final XmppSession xmppSession;
public AvatarDecoratorImpl(final ChatInstances chatInstances, final ChatClient chatClient,
final ImageResource chatDotBusy, final ImageResource chatDotXA, final ImageResource chatDotAway,
@@ -52,6 +59,8 @@
}
});
roster = chatInstances.roster;
+ xmppSession = chatInstances.xmppSession;
+ presenceManager = chatInstances.presenceManager;
rosterHandler = roster.addRosterItemChangedHandler(new RosterItemChangedHandler() {
@Override
public void onRosterItemChanged(final RosterItemChangedEvent event) {
@@ -61,23 +70,38 @@
}
}
});
-
+ presenceHandler = presenceManager.addOwnPresenceChangedHandler(new OwnPresenceChangedHandler() {
+ @Override
+ public void onOwnPresenceChanged(final OwnPresenceChangedEvent event) {
+ refresh();
+ }
+ });
}
private void clearDecorator() {
AvatarDecoratorImpl.this.clearImage();
}
+ protected boolean isMe() {
+ final XmppURI currentUserURI = xmppSession.getCurrentUserURI();
+ return currentUserURI != null && currentUserURI.getJID().equals(uri);
+ }
+
private void refresh() {
Scheduler.get().scheduleDeferred(new ScheduledCommand() {
@Override
public void execute() {
if (uri != null) {
- final RosterItem item = roster.getItemByJID(uri);
- if (session.isReady() && item != null) {
- setIcon(item.isAvailable(), item.getShow(), item.getStatus());
+ if (isMe()) {
+ final Presence ownPresence = presenceManager.getOwnPresence();
+ setIcon(xmppSession.isReady(), ownPresence.getShow(), ownPresence.getStatus());
} else {
- clearDecorator();
+ final RosterItem item = roster.getItemByJID(uri.getJID());
+ if (session.isReady() && item != null) {
+ setIcon(item.isAvailable(), item.getShow(), item.getStatus());
+ } else {
+ clearDecorator();
+ }
}
} else {
clearDecorator();
@@ -119,6 +143,7 @@
rosterHandler.removeHandler();
sessionStateChangedHandler.removeHandler();
attachHandler.removeHandler();
+ presenceHandler.removeHandler();
}
}
});
Modified: trunk/src/main/java/cc/kune/chat/client/ChatParts.java
===================================================================
--- trunk/src/main/java/cc/kune/chat/client/ChatParts.java 2011-07-10 18:29:52 UTC (rev 1446)
+++ trunk/src/main/java/cc/kune/chat/client/ChatParts.java 2011-07-10 20:58:52 UTC (rev 1447)
@@ -94,6 +94,7 @@
final MenuItemDescriptor item = new MenuItemDescriptor(startChatWithMemberAction.get());
item.add(isNotMe);
item.add(isPersonCondition);
+ item.add(isNotBuddieCondition);
item.add(isLogged);
return item;
}
@@ -149,6 +150,9 @@
snAdminsRegistry.get().add(startChatWithBuddieItem);
snCollabsItemsRegistry.get().add(startChatWithBuddieItem);
snPendingItemsRegistry.get().add(startChatWithBuddieItem);
+ snAdminsRegistry.get().add(addAsBuddieItem);
+ snCollabsItemsRegistry.get().add(addAsBuddieItem);
+ snPendingItemsRegistry.get().add(addAsBuddieItem);
userItemsRegistry.get().add(startChatWithBuddieItem);
userItemsRegistry.get().add(startChatWithPersonItem);
Modified: trunk/src/main/java/cc/kune/core/client/sitebar/spaces/SpaceSelectorPresenter.java
===================================================================
--- trunk/src/main/java/cc/kune/core/client/sitebar/spaces/SpaceSelectorPresenter.java 2011-07-10 18:29:52 UTC (rev 1446)
+++ trunk/src/main/java/cc/kune/core/client/sitebar/spaces/SpaceSelectorPresenter.java 2011-07-10 20:58:52 UTC (rev 1447)
@@ -150,7 +150,7 @@
@ProxyEvent
public void onAppStart(final AppStartEvent event) {
- showTooltipWithDelay();
+ // showTooltipWithDelay();
}
private void onGroupSpaceSelect() {
Modified: trunk/src/main/java/cc/kune/core/client/ws/entheader/EntityHeaderPanel.java
===================================================================
--- trunk/src/main/java/cc/kune/core/client/ws/entheader/EntityHeaderPanel.java 2011-07-10 18:29:52 UTC (rev 1446)
+++ trunk/src/main/java/cc/kune/core/client/ws/entheader/EntityHeaderPanel.java 2011-07-10 20:58:52 UTC (rev 1447)
@@ -86,14 +86,10 @@
return mainPanel;
}
- private String getAvatarDecoratorParam(final GroupDTO group) {
- return group.isPersonal() ? group.getShortName() : null;
- }
-
@Override
public void reloadImage(final GroupDTO group) {
entityTextLogo.setLogoImage(downloadProvider.get().getLogoImageUrl(group.getStateToken())
- + "&nocache=" + new Date().getTime(), getAvatarDecoratorParam(group));
+ + "&nocache=" + new Date().getTime());
}
@Deprecated
@@ -118,8 +114,7 @@
@Override
public void setLogoImage(final GroupDTO group) {
- entityTextLogo.setLogoImage(downloadProvider.get().getLogoImageUrl(group.getStateToken()),
- getAvatarDecoratorParam(group));
+ entityTextLogo.setLogoImage(downloadProvider.get().getLogoImageUrl(group.getStateToken()));
}
@Override
@@ -137,23 +132,23 @@
entityTextLogo.setMediumFont();
}
- //
- // @Override
- // public void setTheme(final WsTheme oldTheme, final WsTheme newTheme) {
- // if (oldTheme != null) {
- // entityTextLogo.removeStyleDependentName(oldTheme.toString());
- // }
- // entityTextLogo.addStyleDependentName(newTheme.toString());
- // }
+ @Override
+ public void setOnlineStatusGroup(final String group) {
+ entityTextLogo.setOnlineStatusGroup(group);
+ }
+ public void setOnlineStatusVisible(final boolean visible) {
+ entityTextLogo.setOnlineStatusVisible(visible);
+ }
+
@Override
public void setSmallFont() {
entityTextLogo.setSmallFont();
}
@Override
- public void showDefUserLogo(final GroupDTO group) {
- entityTextLogo.setLogoImage(AbstractImagePrototype.create(images.unknown60()),
- getAvatarDecoratorParam(group));
+ public void showDefUserLogo() {
+ entityTextLogo.setLogoImage(AbstractImagePrototype.create(images.unknown60()));
}
+
}
Modified: trunk/src/main/java/cc/kune/core/client/ws/entheader/EntityHeaderPresenter.java
===================================================================
--- trunk/src/main/java/cc/kune/core/client/ws/entheader/EntityHeaderPresenter.java 2011-07-10 18:29:52 UTC (rev 1446)
+++ trunk/src/main/java/cc/kune/core/client/ws/entheader/EntityHeaderPresenter.java 2011-07-10 20:58:52 UTC (rev 1447)
@@ -61,11 +61,13 @@
void setMediumFont();
+ void setOnlineStatusGroup(String group);
+
+ void setOnlineStatusVisible(boolean visible);
+
void setSmallFont();
- // void setTheme(final WsTheme oldTheme, WsTheme newTheme);
-
- void showDefUserLogo(GroupDTO group);
+ void showDefUserLogo();
}
private static final int LARGE_NAME_LIMIT = 17;
@@ -89,12 +91,6 @@
reloadGroupLogoImage();
}
});
- // theme.addOnThemeChanged(new Listener2<WsTheme, WsTheme>() {
- // @Override
- // public void onEvent(final WsTheme oldTheme, final WsTheme newTheme) {
- // // getView().setTheme(oldTheme, newTheme);
- // }
- // });
}
@Override
@@ -123,19 +119,25 @@
}
void setGroupLogo(final GroupDTO group) {
+ setLogoText(group.getLongName());
if (group.hasLogo()) {
- setLogoText(group.getLongName());
getView().setLogoImage(group);
getView().setLogoImageVisible(true);
} else {
- setLogoText(group.getLongName());
if (group.isPersonal()) {
- getView().showDefUserLogo(group);
+ getView().showDefUserLogo();
getView().setLogoImageVisible(true);
} else {
getView().setLogoImageVisible(false);
}
}
+ if (group.isPersonal()) {
+ getView().setOnlineStatusGroup(group.getShortName());
+ getView().setOnlineStatusVisible(true);
+ } else {
+ getView().setOnlineStatusGroup(null);
+ getView().setOnlineStatusVisible(false);
+ }
}
void setLogoText(final String name) {
Modified: trunk/src/main/java/cc/kune/core/client/ws/entheader/EntityTextLogo.java
===================================================================
--- trunk/src/main/java/cc/kune/core/client/ws/entheader/EntityTextLogo.java 2011-07-10 18:29:52 UTC (rev 1446)
+++ trunk/src/main/java/cc/kune/core/client/ws/entheader/EntityTextLogo.java 2011-07-10 20:58:52 UTC (rev 1447)
@@ -92,16 +92,14 @@
logoLabel.addStyleName(LOGO_LARGE_FONT_STYLE);
}
- public void setLogoImage(final AbstractImagePrototype imageProto, final String groupName) {
+ public void setLogoImage(final AbstractImagePrototype imageProto) {
imageProto.applyTo(logoImage);
- avatarDecorator.setItem(groupName);
}
- public void setLogoImage(final String url, final String groupName) {
+ public void setLogoImage(final String url) {
logoImage.setUrl("images/clear.gif");
Image.prefetch(url);
logoImage.setUrl(url);
- avatarDecorator.setItem(groupName);
}
public void setLogoText(final String text) {
@@ -114,7 +112,6 @@
public void setLogoVisible(final boolean visible) {
logoImage.setVisible(visible);
- avatarDecorator.setDecoratorVisible(visible);
}
public void setMediumFont() {
@@ -122,6 +119,14 @@
logoLabel.addStyleName(LOGO_MEDIUM_FONT_STYLE);
}
+ public void setOnlineStatusGroup(final String group) {
+ avatarDecorator.setItem(group);
+ }
+
+ public void setOnlineStatusVisible(final boolean visible) {
+ avatarDecorator.setDecoratorVisible(visible);
+ }
+
public void setSmallFont() {
resetFontSize();
logoLabel.addStyleName(LOGO_SMALL_FONT_STYLE);
1
0
Author: vjrj_
Date: 2011-07-10 20:29:52 +0200 (Sun, 10 Jul 2011)
New Revision: 1446
Added:
trunk/src/main/java/cc/kune/chat/client/AvatarDecoratorImpl.java
trunk/src/main/java/cc/kune/chat/client/ChatInstances.java
trunk/src/main/java/cc/kune/chat/client/MediumAvatarDecoratorImpl.java
trunk/src/main/java/cc/kune/chat/client/SmallAvatarDecoratorImpl.java
trunk/src/main/java/cc/kune/chat/client/actions/StartChatWithThisPersonAction.java
trunk/src/main/java/cc/kune/chat/client/actions/conditions/
trunk/src/main/java/cc/kune/chat/client/actions/conditions/IsBuddieCondition.java
trunk/src/main/java/cc/kune/chat/client/actions/conditions/IsNotBuddieCondition.java
trunk/src/main/java/cc/kune/common/client/ui/AbstractDecorator.java
trunk/src/main/java/cc/kune/common/client/ui/AbstractDecorator.ui.xml
trunk/src/main/java/cc/kune/core/client/avatar/
trunk/src/main/java/cc/kune/core/client/avatar/AvatarDecorator.java
trunk/src/main/java/cc/kune/core/client/avatar/MediumAvatarDecorator.java
trunk/src/main/java/cc/kune/core/client/avatar/SmallAvatarDecorator.java
trunk/src/main/java/cc/kune/core/client/resources/chat-dot-available-medium.png
trunk/src/main/java/cc/kune/core/client/resources/chat-dot-available-small.png
trunk/src/main/java/cc/kune/core/client/resources/chat-dot-away-medium.png
trunk/src/main/java/cc/kune/core/client/resources/chat-dot-away-small.png
trunk/src/main/java/cc/kune/core/client/resources/chat-dot-busy-medium.png
trunk/src/main/java/cc/kune/core/client/resources/chat-dot-busy-small.png
trunk/src/main/java/cc/kune/core/client/resources/chat-dot-extended-away-medium.png
trunk/src/main/java/cc/kune/core/client/resources/chat-dot-extended-away-small.png
trunk/src/main/java/cc/kune/core/client/resources/chat-dot-invisible-medium.png
trunk/src/main/java/cc/kune/core/client/resources/chat-dot-invisible-small.png
trunk/src/main/java/cc/kune/core/client/resources/chat-dot-offline-medium.png
trunk/src/main/java/cc/kune/core/client/resources/chat-dot-offline-small.png
Removed:
trunk/src/main/java/cc/kune/chat/client/actions/StartChatWithUserAction.java
Modified:
trunk/
trunk/src/main/java/cc/kune/chat/client/ChatClientDefault.java
trunk/src/main/java/cc/kune/chat/client/ChatGinModule.java
trunk/src/main/java/cc/kune/chat/client/ChatOptions.java
trunk/src/main/java/cc/kune/chat/client/ChatParts.java
trunk/src/main/java/cc/kune/chat/client/KuneHablarSignals.java
trunk/src/main/java/cc/kune/chat/client/actions/AddAsBuddieHeaderButton.java
trunk/src/main/java/cc/kune/chat/client/actions/ChatSitebarActions.java
trunk/src/main/java/cc/kune/chat/client/actions/OpenGroupPublicChatRoomAction.java
trunk/src/main/java/cc/kune/chat/client/actions/StartChatWithMemberAction.java
trunk/src/main/java/cc/kune/core/client/CoreGinModule.java
trunk/src/main/java/cc/kune/core/client/resources/CoreResources.java
trunk/src/main/java/cc/kune/core/client/sitebar/spaces/SpaceSelectorPresenter.java
trunk/src/main/java/cc/kune/core/client/sn/AbstractSNPanel.java
trunk/src/main/java/cc/kune/core/client/sn/AbstractSNPanel.ui.xml
trunk/src/main/java/cc/kune/core/client/sn/GroupSNPanel.java
trunk/src/main/java/cc/kune/core/client/sn/UserSNPanel.java
trunk/src/main/java/cc/kune/core/client/sn/actions/conditions/IsMeCondition.java
trunk/src/main/java/cc/kune/core/client/sn/actions/conditions/IsNotMeCondition.java
trunk/src/main/java/cc/kune/core/client/sn/actions/registry/UserSNMenuItemsRegistry.java
trunk/src/main/java/cc/kune/core/client/ws/entheader/EntityHeaderPanel.java
trunk/src/main/java/cc/kune/core/client/ws/entheader/EntityHeaderPresenter.java
trunk/src/main/java/cc/kune/core/client/ws/entheader/EntityTextLogo.java
trunk/src/main/java/cc/kune/gspace/client/viewers/FolderViewerPresenter.java
trunk/src/main/java/cc/kune/wave/client/WaveStatusIndicator.java
Log:
Avatar of buddies with status; Several fixes in chat
Property changes on: trunk
___________________________________________________________________
Name: svn:ignore
- pmd-eclipse.log
.pmd
www-test
screenlog.0
client
public
target
target-local
Main-compile
.settings
.gwt-cache
repository
derby.log
star-yellow-grey.png
run.sh
tomcat
gwt-out
synccss.sh
.externalToolBuilders
.wtpmodules
www
testRepository
kune-OLD-jcr
KuneApp.launch
KuneApp NOSERVER.launch
old_src
org.ourproject.kune.app.Kune
org.ourproject.kune.iml
org.ourproject.kune.ipr
org.ourproject.kune.iws
nbproject
hibernate.reveng.xml
.gwt-tmp
target-eclipse
.checkstyle
.classpath-bien
pom.xml.*
.gwt
.jdee_sources
.jdee_classpath
prj.el
.factorypath
.apt_generated
target.old
_accounts
_certificates
_deltas
logs
test-output
+ pmd-eclipse.log
.pmd
www-test
screenlog.0
client
public
target
target-local
Main-compile
.settings
.gwt-cache
repository
derby.log
star-yellow-grey.png
run.sh
tomcat
gwt-out
synccss.sh
.externalToolBuilders
.wtpmodules
www
testRepository
kune-OLD-jcr
KuneApp.launch
KuneApp NOSERVER.launch
old_src
org.ourproject.kune.app.Kune
org.ourproject.kune.iml
org.ourproject.kune.ipr
org.ourproject.kune.iws
nbproject
hibernate.reveng.xml
.gwt-tmp
target-eclipse
.checkstyle
.classpath-bien
pom.xml.*
.gwt
.jdee_sources
.jdee_classpath
prj.el
.factorypath
.apt_generated
target.old
_accounts
_certificates
_deltas
logs
test-output
.recommenders
Added: trunk/src/main/java/cc/kune/chat/client/AvatarDecoratorImpl.java
===================================================================
--- trunk/src/main/java/cc/kune/chat/client/AvatarDecoratorImpl.java (rev 0)
+++ trunk/src/main/java/cc/kune/chat/client/AvatarDecoratorImpl.java 2011-07-10 18:29:52 UTC (rev 1446)
@@ -0,0 +1,127 @@
+package cc.kune.chat.client;
+
+import cc.kune.common.client.ui.AbstractDecorator;
+import cc.kune.core.client.avatar.AvatarDecorator;
+
+import com.calclab.emite.core.client.events.StateChangedEvent;
+import com.calclab.emite.core.client.events.StateChangedHandler;
+import com.calclab.emite.core.client.xmpp.session.XmppSession;
+import com.calclab.emite.core.client.xmpp.stanzas.Presence.Show;
+import com.calclab.emite.core.client.xmpp.stanzas.XmppURI;
+import com.calclab.emite.im.client.roster.RosterItem;
+import com.calclab.emite.im.client.roster.XmppRoster;
+import com.calclab.emite.im.client.roster.events.RosterItemChangedEvent;
+import com.calclab.emite.im.client.roster.events.RosterItemChangedHandler;
+import com.google.gwt.core.client.Scheduler;
+import com.google.gwt.core.client.Scheduler.ScheduledCommand;
+import com.google.gwt.event.logical.shared.AttachEvent;
+import com.google.gwt.event.logical.shared.AttachEvent.Handler;
+import com.google.gwt.event.shared.HandlerRegistration;
+import com.google.gwt.resources.client.ImageResource;
+import com.google.gwt.user.client.ui.IsWidget;
+
+public class AvatarDecoratorImpl extends AbstractDecorator implements AvatarDecorator {
+
+ private HandlerRegistration attachHandler;
+ private final ChatClient chatClient;
+ private final ImageResource chatDotAvailable;
+ private final ImageResource chatDotAway;
+ private final ImageResource chatDotBusy;
+ private final ImageResource chatDotExtendedAway;
+ private final ImageResource chatDotXA;
+ private final XmppRoster roster;
+ private final HandlerRegistration rosterHandler;
+ private final XmppSession session;
+ private final HandlerRegistration sessionStateChangedHandler;
+ private XmppURI uri;
+
+ public AvatarDecoratorImpl(final ChatInstances chatInstances, final ChatClient chatClient,
+ final ImageResource chatDotBusy, final ImageResource chatDotXA, final ImageResource chatDotAway,
+ final ImageResource chatDotExtendedAway, final ImageResource chatDotAvailable) {
+ this.chatClient = chatClient;
+ this.chatDotBusy = chatDotBusy;
+ this.chatDotXA = chatDotXA;
+ this.chatDotAway = chatDotAway;
+ this.chatDotExtendedAway = chatDotExtendedAway;
+ this.chatDotAvailable = chatDotAvailable;
+ session = chatInstances.xmppSession;
+ sessionStateChangedHandler = session.addSessionStateChangedHandler(false, new StateChangedHandler() {
+ @Override
+ public void onStateChanged(final StateChangedEvent event) {
+ refresh();
+ }
+ });
+ roster = chatInstances.roster;
+ rosterHandler = roster.addRosterItemChangedHandler(new RosterItemChangedHandler() {
+ @Override
+ public void onRosterItemChanged(final RosterItemChangedEvent event) {
+ final RosterItem item = event.getRosterItem();
+ if (item.getJID().equals(uri)) {
+ setIcon(item.isAvailable(), item.getShow(), item.getStatus());
+ }
+ }
+ });
+
+ }
+
+ private void clearDecorator() {
+ AvatarDecoratorImpl.this.clearImage();
+ }
+
+ private void refresh() {
+ Scheduler.get().scheduleDeferred(new ScheduledCommand() {
+ @Override
+ public void execute() {
+ if (uri != null) {
+ final RosterItem item = roster.getItemByJID(uri);
+ if (session.isReady() && item != null) {
+ setIcon(item.isAvailable(), item.getShow(), item.getStatus());
+ } else {
+ clearDecorator();
+ }
+ } else {
+ clearDecorator();
+ }
+ }
+ });
+ }
+
+ private void setIcon(final boolean available, final Show show, final String status) {
+ if (show == Show.dnd) {
+ super.setImage(chatDotBusy);
+ } else if (show == Show.xa) {
+ super.setImage(chatDotXA);
+ } else if (show == Show.away) {
+ super.setImage(chatDotAway);
+ } else if (show == Show.chat) {
+ super.setImage(chatDotExtendedAway);
+ } else if (available) {
+ super.setImage(chatDotAvailable);
+ } else {
+ clearDecorator();
+ }
+ super.setImageTooltip(status);
+ }
+
+ @Override
+ public void setItem(final String name) {
+ this.uri = (name != null ? chatClient.uriFrom(name) : null);
+ refresh();
+ }
+
+ @Override
+ public void setWidget(final IsWidget widget) {
+ super.setWidget(widget);
+ attachHandler = widget.asWidget().addAttachHandler(new Handler() {
+ @Override
+ public void onAttachOrDetach(final AttachEvent event) {
+ if (!event.isAttached()) {
+ rosterHandler.removeHandler();
+ sessionStateChangedHandler.removeHandler();
+ attachHandler.removeHandler();
+ }
+ }
+ });
+ }
+
+}
Modified: trunk/src/main/java/cc/kune/chat/client/ChatClientDefault.java
===================================================================
--- trunk/src/main/java/cc/kune/chat/client/ChatClientDefault.java 2011-07-09 22:25:58 UTC (rev 1445)
+++ trunk/src/main/java/cc/kune/chat/client/ChatClientDefault.java 2011-07-10 18:29:52 UTC (rev 1446)
@@ -55,7 +55,6 @@
import com.calclab.emite.core.client.xmpp.stanzas.XmppURI;
import com.calclab.emite.im.client.chat.ChatManager;
import com.calclab.emite.im.client.roster.XmppRoster;
-import com.calclab.emite.reconnect.client.SessionReconnect;
import com.calclab.emite.xep.avatar.client.AvatarManager;
import com.calclab.emite.xep.muc.client.Room;
import com.calclab.emite.xep.muc.client.RoomManager;
@@ -69,7 +68,6 @@
import com.calclab.hablar.icons.alt.client.AltIconsBundle;
import com.calclab.hablar.login.client.HablarLogin;
import com.calclab.hablar.login.client.LoginConfig;
-import com.calclab.suco.client.Suco;
import com.extjs.gxt.ui.client.Style.Scroll;
import com.extjs.gxt.ui.client.widget.Dialog;
import com.google.gwt.core.client.GWT;
@@ -112,7 +110,9 @@
private static final String CHAT_TITLE = "Chat ;)";
private final ChatClientAction action;
+ private final AvatarManager avatarManager;
protected IconLabelDescriptor chatIcon;
+ private final ChatInstances chatInstances;
private final ChatManager chatManager;
private final ChatOptions chatOptions;
private final ChatResources chatResources;
@@ -122,7 +122,9 @@
private final RoomManager roomManager;
private final XmppRoster roster;
private final Session session;
+
private final GlobalShortcutRegister shorcutRegister;
+
private final SitebarActions siteActions;
private final XmppSession xmppSession;
@@ -131,10 +133,10 @@
public ChatClientDefault(final EventBus eventBus, final I18nTranslationService i18n,
final SitebarActions siteActions, final Session session,
final GlobalShortcutRegister shorcutRegister, final ChatOptions chatOptions,
- final ChatResources chatResources) {
-
+ final ChatResources chatResources, final ChatInstances chatInstances) {
this.eventBus = eventBus;
this.i18n = i18n;
+ this.chatInstances = chatInstances;
action = new ChatClientAction(eventBus, chatResources);
this.siteActions = siteActions;
this.session = session;
@@ -142,11 +144,13 @@
this.chatOptions = chatOptions;
this.chatResources = chatResources;
chatResources.css().ensureInjected();
- this.xmppSession = Suco.get(XmppSession.class);
- this.roster = Suco.get(XmppRoster.class);
- this.chatManager = Suco.get(ChatManager.class);
- this.roomManager = Suco.get(RoomManager.class);
- Suco.get(SessionReconnect.class);
+ this.xmppSession = chatInstances.xmppSession;
+ this.roster = chatInstances.roster;
+ this.chatManager = chatInstances.chatManager;
+ this.roomManager = chatInstances.roomManager;
+ this.avatarManager = chatInstances.avatarManager;
+ // Not necessary, in ChatInstance
+ // Suco.get(SessionReconnect.class);
session.onAppStart(true, new AppStartEvent.AppStartHandler() {
@Override
@@ -305,7 +309,7 @@
final KuneHablarWidget widget = new KuneHablarWidget(config.layout, config.tabHeaderSize);
final Hablar hablar = widget.getHablar();
HablarComplete.install(hablar, config);
- new KuneHablarSignals(eventBus, xmppSession, hablar, action);
+ new KuneHablarSignals(eventBus, xmppSession, hablar, action, chatInstances);
if (htmlConfig.hasLogger) {
new HablarConsole(hablar);
}
@@ -414,7 +418,7 @@
@Override
public void setAvatar(final String photoBinary) {
- Suco.get(AvatarManager.class).setVCardAvatar(photoBinary);
+ avatarManager.setVCardAvatar(photoBinary);
}
private void setSize(final Widget widget, final HtmlConfig htmlConfig) {
@@ -455,6 +459,6 @@
@Override
public XmppURI uriFrom(final String shortName) {
- return XmppURI.jid(shortName + "@" + chatOptions.domain);
+ return chatOptions.uriFrom(shortName);
}
}
Modified: trunk/src/main/java/cc/kune/chat/client/ChatGinModule.java
===================================================================
--- trunk/src/main/java/cc/kune/chat/client/ChatGinModule.java 2011-07-09 22:25:58 UTC (rev 1445)
+++ trunk/src/main/java/cc/kune/chat/client/ChatGinModule.java 2011-07-10 18:29:52 UTC (rev 1446)
@@ -22,11 +22,11 @@
import cc.kune.chat.client.actions.AddAsBuddieHeaderButton;
import cc.kune.chat.client.actions.ChatClientActions;
import cc.kune.chat.client.actions.ChatSitebarActions;
+import cc.kune.common.client.ExtendedGinModule;
+import cc.kune.core.client.avatar.MediumAvatarDecorator;
+import cc.kune.core.client.avatar.SmallAvatarDecorator;
-import com.google.inject.Singleton;
-import com.gwtplatform.mvp.client.gin.AbstractPresenterModule;
-
-public class ChatGinModule extends AbstractPresenterModule {
+public class ChatGinModule extends ExtendedGinModule {
/*
* (non-Javadoc)
*
@@ -34,12 +34,15 @@
*/
@Override
protected void configure() {
- bind(ChatClient.class).to(ChatClientDefault.class).in(Singleton.class);
- bind(ChatOptions.class).in(Singleton.class);
- bind(ChatSitebarActions.class).in(Singleton.class);
- bind(AddAsBuddieHeaderButton.class).in(Singleton.class);
- // bind(OpenGroupPublicChatRoomButton.class).in(Singleton.class);
- bind(ChatClientTool.class).in(Singleton.class);
- bind(ChatClientActions.class).in(Singleton.class);
+ s(ChatInstances.class);
+ bind(SmallAvatarDecorator.class).to(SmallAvatarDecoratorImpl.class);
+ bind(MediumAvatarDecorator.class).to(MediumAvatarDecoratorImpl.class);
+ s(ChatClient.class, ChatClientDefault.class);
+ s(ChatOptions.class);
+ s(ChatSitebarActions.class);
+ s(AddAsBuddieHeaderButton.class);
+ // bind(OpenGroupPublicChatRoomButton.class);
+ s(ChatClientTool.class);
+ s(ChatClientActions.class);
}
}
Added: trunk/src/main/java/cc/kune/chat/client/ChatInstances.java
===================================================================
--- trunk/src/main/java/cc/kune/chat/client/ChatInstances.java (rev 0)
+++ trunk/src/main/java/cc/kune/chat/client/ChatInstances.java 2011-07-10 18:29:52 UTC (rev 1446)
@@ -0,0 +1,34 @@
+package cc.kune.chat.client;
+
+import com.calclab.emite.core.client.xmpp.session.XmppSession;
+import com.calclab.emite.im.client.chat.ChatManager;
+import com.calclab.emite.im.client.presence.PresenceManager;
+import com.calclab.emite.im.client.roster.XmppRoster;
+import com.calclab.emite.reconnect.client.SessionReconnect;
+import com.calclab.emite.xep.avatar.client.AvatarManager;
+import com.calclab.emite.xep.muc.client.RoomManager;
+import com.calclab.emite.xep.storage.client.PrivateStorageManager;
+import com.calclab.suco.client.Suco;
+
+public class ChatInstances {
+
+ public AvatarManager avatarManager;
+ public ChatManager chatManager;
+ public PresenceManager presenceManager;
+ public PrivateStorageManager privateStorageManager;
+ public RoomManager roomManager;
+ public XmppRoster roster;
+ public SessionReconnect sessionReconnect;
+ public XmppSession xmppSession;
+
+ public ChatInstances() {
+ this.xmppSession = Suco.get(XmppSession.class);
+ this.roster = Suco.get(XmppRoster.class);
+ this.chatManager = Suco.get(ChatManager.class);
+ this.roomManager = Suco.get(RoomManager.class);
+ this.sessionReconnect = Suco.get(SessionReconnect.class);
+ this.avatarManager = Suco.get(AvatarManager.class);
+ this.presenceManager = Suco.get(PresenceManager.class);
+ this.privateStorageManager = Suco.get(PrivateStorageManager.class);
+ }
+}
Modified: trunk/src/main/java/cc/kune/chat/client/ChatOptions.java
===================================================================
--- trunk/src/main/java/cc/kune/chat/client/ChatOptions.java 2011-07-09 22:25:58 UTC (rev 1445)
+++ trunk/src/main/java/cc/kune/chat/client/ChatOptions.java 2011-07-10 18:29:52 UTC (rev 1446)
@@ -22,11 +22,15 @@
import com.calclab.emite.core.client.xmpp.stanzas.XmppURI;
public class ChatOptions {
- public String domain;
- public String httpBase;
- public String passwd;
- public String resource;
- public String roomHost;
- public String username;
- public XmppURI useruri;
+ public String domain;
+ public String httpBase;
+ public String passwd;
+ public String resource;
+ public String roomHost;
+ public String username;
+ public XmppURI useruri;
+
+ public XmppURI uriFrom(final String shortName) {
+ return XmppURI.jid(shortName + "@" + domain);
+ }
}
\ No newline at end of file
Modified: trunk/src/main/java/cc/kune/chat/client/ChatParts.java
===================================================================
--- trunk/src/main/java/cc/kune/chat/client/ChatParts.java 2011-07-09 22:25:58 UTC (rev 1445)
+++ trunk/src/main/java/cc/kune/chat/client/ChatParts.java 2011-07-10 18:29:52 UTC (rev 1446)
@@ -27,7 +27,9 @@
import cc.kune.chat.client.actions.StartAssemblyWithMembers;
import cc.kune.chat.client.actions.StartChatWithMemberAction;
import cc.kune.chat.client.actions.StartChatWithThisBuddieAction;
-import cc.kune.chat.client.actions.StartChatWithUserAction;
+import cc.kune.chat.client.actions.StartChatWithThisPersonAction;
+import cc.kune.chat.client.actions.conditions.IsBuddieCondition;
+import cc.kune.chat.client.actions.conditions.IsNotBuddieCondition;
import cc.kune.chat.shared.ChatConstants;
import cc.kune.common.client.actions.AbstractAction;
import cc.kune.common.client.actions.PropertyChangeEvent;
@@ -68,10 +70,12 @@
final Provider<UserSNMenuItemsRegistry> userItemsRegistry, final IsNotMeCondition isNotMe,
final IsCurrentStateAdministrableCondition isAdministrableCondition,
final IsCurrentStateEditableCondition isEditableCondition,
+ final IsBuddieCondition isBuddieCondition, final IsNotBuddieCondition isNotBuddieCondition,
final IsCurrentStateAGroupCondition isGroupCondition, final IsPersonCondition isPersonCondition,
final Provider<AddAsBuddieAction> addAsBuddie,
final Provider<StartChatWithMemberAction> startChatWithMemberAction,
- final IsLoggedCondition isLogged, final Provider<StartChatWithUserAction> startChatWithUserAction,
+ final IsLoggedCondition isLogged,
+ final Provider<StartChatWithThisPersonAction> startChatWithPersonAction,
final Provider<StartChatWithThisBuddieAction> startChatWithBuddieAction,
final ChatClientActions chatActions, final Provider<StartAssemblyWithMembers> startAssembly,
final Provider<OpenGroupPublicChatRoomAction> openGroupRoomAction,
@@ -99,6 +103,7 @@
public MenuItemDescriptor get() {
final MenuItemDescriptor item = new MenuItemDescriptor(startChatWithBuddieAction.get());
item.add(isLogged);
+ item.add(isBuddieCondition);
item.add(isPersonCondition);
return item;
}
@@ -109,6 +114,7 @@
final AddAsBuddieAction action = addAsBuddie.get();
final MenuItemDescriptor item = new MenuItemDescriptor(action);
item.add(isNotMe);
+ item.add(isNotBuddieCondition);
item.add(isLogged);
item.add(isPersonCondition);
/**
@@ -125,21 +131,27 @@
return item;
}
};
- final Provider<MenuItemDescriptor> startChatWithUserItem = new Provider<MenuItemDescriptor>() {
+ final Provider<MenuItemDescriptor> startChatWithPersonItem = new Provider<MenuItemDescriptor>() {
@Override
public MenuItemDescriptor get() {
- final MenuItemDescriptor item = new MenuItemDescriptor(startChatWithUserAction.get());
+ final MenuItemDescriptor item = new MenuItemDescriptor(startChatWithPersonAction.get());
item.add(isNotMe);
item.add(isLogged);
item.add(isPersonCondition);
+ item.add(isNotBuddieCondition);
return item;
}
};
snAdminsRegistry.get().add(startChatWithMemberItem);
snCollabsItemsRegistry.get().add(startChatWithMemberItem);
- snPendingItemsRegistry.get().add(startChatWithUserItem);
+ snPendingItemsRegistry.get().add(startChatWithPersonItem);
+ snAdminsRegistry.get().add(startChatWithBuddieItem);
+ snCollabsItemsRegistry.get().add(startChatWithBuddieItem);
+ snPendingItemsRegistry.get().add(startChatWithBuddieItem);
+
userItemsRegistry.get().add(startChatWithBuddieItem);
+ userItemsRegistry.get().add(startChatWithPersonItem);
userItemsRegistry.get().add(addAsBuddieItem);
groupConfActions.get().add(startAssembly.get());
buddieButton.get();
Modified: trunk/src/main/java/cc/kune/chat/client/KuneHablarSignals.java
===================================================================
--- trunk/src/main/java/cc/kune/chat/client/KuneHablarSignals.java 2011-07-09 22:25:58 UTC (rev 1445)
+++ trunk/src/main/java/cc/kune/chat/client/KuneHablarSignals.java 2011-07-10 18:29:52 UTC (rev 1446)
@@ -34,7 +34,6 @@
import com.calclab.hablar.signals.client.unattended.UnattendedPagesManager;
import com.calclab.hablar.signals.client.unattended.UnattendedPresenter;
import com.calclab.hablar.user.client.UserContainer;
-import com.calclab.suco.client.Suco;
import com.google.gwt.core.client.GWT;
import com.google.gwt.event.shared.EventBus;
import com.google.gwt.user.client.Window;
@@ -71,9 +70,9 @@
// FIXME: move to gin
@SuppressWarnings("deprecation")
public KuneHablarSignals(final EventBus kuneEventBus, final XmppSession session, final Hablar hablar,
- final ChatClientAction action) {
+ final ChatClientAction action, final ChatInstances chatInstances) {
final HablarEventBus hablarEventBus = hablar.getEventBus();
- final PrivateStorageManager storageManager = Suco.get(PrivateStorageManager.class);
+ final PrivateStorageManager storageManager = chatInstances.privateStorageManager;
final HasText titleDisplay = new HasText() {
@Override
Added: trunk/src/main/java/cc/kune/chat/client/MediumAvatarDecoratorImpl.java
===================================================================
--- trunk/src/main/java/cc/kune/chat/client/MediumAvatarDecoratorImpl.java (rev 0)
+++ trunk/src/main/java/cc/kune/chat/client/MediumAvatarDecoratorImpl.java 2011-07-10 18:29:52 UTC (rev 1446)
@@ -0,0 +1,17 @@
+package cc.kune.chat.client;
+
+import cc.kune.core.client.avatar.MediumAvatarDecorator;
+import cc.kune.core.client.resources.CoreResources;
+
+import com.google.inject.Inject;
+
+public class MediumAvatarDecoratorImpl extends AvatarDecoratorImpl implements MediumAvatarDecorator {
+
+ @Inject
+ public MediumAvatarDecoratorImpl(final CoreResources res, final ChatInstances chatInstances,
+ final ChatClient chatClient) {
+ super(chatInstances, chatClient, res.chatDotBusyMedium(), res.chatDotAwayMedium(),
+ res.chatDotAwayMedium(), res.chatDotExtendedAwayMedium(), res.chatDotAvailableMedium());
+ setImagePosition(53, -6, -10);
+ }
+}
Added: trunk/src/main/java/cc/kune/chat/client/SmallAvatarDecoratorImpl.java
===================================================================
--- trunk/src/main/java/cc/kune/chat/client/SmallAvatarDecoratorImpl.java (rev 0)
+++ trunk/src/main/java/cc/kune/chat/client/SmallAvatarDecoratorImpl.java 2011-07-10 18:29:52 UTC (rev 1446)
@@ -0,0 +1,17 @@
+package cc.kune.chat.client;
+
+import cc.kune.core.client.avatar.SmallAvatarDecorator;
+import cc.kune.core.client.resources.CoreResources;
+
+import com.google.inject.Inject;
+
+public class SmallAvatarDecoratorImpl extends AvatarDecoratorImpl implements SmallAvatarDecorator {
+
+ @Inject
+ public SmallAvatarDecoratorImpl(final CoreResources res, final ChatInstances chatInstances,
+ final ChatClient chatClient) {
+ super(chatInstances, chatClient, res.chatDotBusySmall(), res.chatDotAwaySmall(),
+ res.chatDotAwaySmall(), res.chatDotExtendedAwaySmall(), res.chatDotAvailableSmall());
+ setImagePosition(23, -9, -8);
+ }
+}
Modified: trunk/src/main/java/cc/kune/chat/client/actions/AddAsBuddieHeaderButton.java
===================================================================
--- trunk/src/main/java/cc/kune/chat/client/actions/AddAsBuddieHeaderButton.java 2011-07-09 22:25:58 UTC (rev 1445)
+++ trunk/src/main/java/cc/kune/chat/client/actions/AddAsBuddieHeaderButton.java 2011-07-10 18:29:52 UTC (rev 1446)
@@ -20,6 +20,7 @@
package cc.kune.chat.client.actions;
import cc.kune.chat.client.ChatClient;
+import cc.kune.chat.client.ChatInstances;
import cc.kune.common.client.actions.AbstractAction;
import cc.kune.common.client.actions.AbstractExtendedAction;
import cc.kune.common.client.actions.Action;
@@ -38,10 +39,8 @@
import cc.kune.core.shared.dto.StateAbstractDTO;
import cc.kune.core.shared.i18n.I18nTranslationService;
-import com.calclab.emite.im.client.roster.XmppRoster;
import com.calclab.emite.im.client.roster.events.RosterGroupChangedEvent;
import com.calclab.emite.im.client.roster.events.RosterGroupChangedHandler;
-import com.calclab.suco.client.Suco;
import com.google.inject.Inject;
public class AddAsBuddieHeaderButton {
@@ -52,7 +51,8 @@
@Inject
public AddAsBuddieAction(final ChatClient chatEngine, final Session session,
- final StateManager stateManager, final I18nTranslationService i18n, final CoreResources img) {
+ final ChatInstances chatInstances, final StateManager stateManager,
+ final I18nTranslationService i18n, final CoreResources img) {
super();
this.chatEngine = chatEngine;
this.session = session;
@@ -62,7 +62,7 @@
setState(event.getState());
}
});
- Suco.get(XmppRoster.class).addRosterGroupChangedHandler(new RosterGroupChangedHandler() {
+ chatInstances.roster.addRosterGroupChangedHandler(new RosterGroupChangedHandler() {
@Override
public void onGroupChanged(final RosterGroupChangedEvent event) {
Modified: trunk/src/main/java/cc/kune/chat/client/actions/ChatSitebarActions.java
===================================================================
--- trunk/src/main/java/cc/kune/chat/client/actions/ChatSitebarActions.java 2011-07-09 22:25:58 UTC (rev 1445)
+++ trunk/src/main/java/cc/kune/chat/client/actions/ChatSitebarActions.java 2011-07-10 18:29:52 UTC (rev 1446)
@@ -20,6 +20,7 @@
package cc.kune.chat.client.actions;
import cc.kune.chat.client.ChatClient;
+import cc.kune.chat.client.ChatInstances;
import cc.kune.chat.client.resources.ChatResources;
import cc.kune.common.client.actions.AbstractAction;
import cc.kune.common.client.actions.AbstractExtendedAction;
@@ -40,144 +41,151 @@
import com.calclab.emite.im.client.presence.PresenceManager;
import com.calclab.emite.im.client.presence.events.OwnPresenceChangedEvent;
import com.calclab.emite.im.client.presence.events.OwnPresenceChangedHandler;
-import com.calclab.suco.client.Suco;
import com.google.gwt.resources.client.ImageResource;
import com.google.inject.Inject;
public class ChatSitebarActions {
- public class ChangeOfflineStatusAction extends AbstractExtendedAction {
- public ChangeOfflineStatusAction(final ImageResource icon) {
- xmppSession.addSessionStateChangedHandler(true, new StateChangedHandler() {
- @Override
- public void onStateChanged(final StateChangedEvent event) {
- if (!xmppSession.isReady()) {
- SiteUserOptionsPresenter.LOGGED_USER_MENU.putValue(AbstractAction.SMALL_ICON, icon);
- }
- }
- });
- }
+ public class ChangeOfflineStatusAction extends AbstractExtendedAction {
+ private final XmppSession session;
+ public ChangeOfflineStatusAction(final XmppSession session, final ImageResource icon) {
+ this.session = session;
+ session.addSessionStateChangedHandler(true, new StateChangedHandler() {
@Override
- public void actionPerformed(final ActionEvent event) {
- // presenceManager.changeOwnPresence(Presence.build(NO_STATUS,
- // Show.xa));
- xmppSession.logout();
+ public void onStateChanged(final StateChangedEvent event) {
+ if (!session.isReady()) {
+ SiteUserOptionsPresenter.LOGGED_USER_MENU.putValue(AbstractAction.SMALL_ICON, icon);
+ }
}
+ });
}
- public class ChangeOnlineStatusAction extends AbstractExtendedAction {
- private final Presence thisPresence;
- public ChangeOnlineStatusAction(final String statusText, final Show show, final ImageResource icon) {
- thisPresence = Presence.build(statusText, show);
- presenceManager.addOwnPresenceChangedHandler(new OwnPresenceChangedHandler() {
+ @Override
+ public void actionPerformed(final ActionEvent event) {
+ // presenceManager.changeOwnPresence(Presence.build(NO_STATUS,
+ // Show.xa));
+ session.logout();
+ }
+ }
+ public class ChangeOnlineStatusAction extends AbstractExtendedAction {
+ private final PresenceManager manager;
+ private final Presence thisPresence;
- @Override
- public void onOwnPresenceChanged(final OwnPresenceChangedEvent event) {
- updateStatusIcon(icon, event.getCurrentPresence());
- }
+ public ChangeOnlineStatusAction(final PresenceManager presenceManager, final String statusText,
+ final Show show, final ImageResource icon) {
+ this.manager = presenceManager;
+ thisPresence = Presence.build(statusText, show);
+ presenceManager.addOwnPresenceChangedHandler(new OwnPresenceChangedHandler() {
- });
- updateStatusIcon(icon, presenceManager.getOwnPresence());
- }
-
@Override
- public void actionPerformed(final ActionEvent event) {
- if (!chatClient.loginIfNecessary()) {
- presenceManager.changeOwnPresence(thisPresence);
- }
- nextPresence = thisPresence;
+ public void onOwnPresenceChanged(final OwnPresenceChangedEvent event) {
+ updateStatusIcon(icon, event.getCurrentPresence());
}
- private void updateStatusIcon(final ImageResource icon, final Presence currentPresence) {
- if (thisPresence.getShow().equals(currentPresence.getShow())
- && ((currentPresence.getStatus() == null) || currentPresence.getStatus().equals(
- thisPresence.getStatus()))) {
- SiteUserOptionsPresenter.LOGGED_USER_MENU.putValue(AbstractAction.SMALL_ICON, icon);
- }
- }
+ });
+ updateStatusIcon(icon, presenceManager.getOwnPresence());
}
- private static final String CHAT_STATUS = "k-chat-status-group";
- private static final String GROUP_CHAT_STATUS = "k-group-chat-status";
- private static final String NO_STATUS = null;
- private final ChatClient chatClient;
- private final I18nTranslationService i18n;
- private Presence nextPresence = Presence.build(NO_STATUS, Show.notSpecified);
- private final PresenceManager presenceManager = Suco.get(PresenceManager.class);
- private final ChatResources res;
- private final Session session;
- private final SiteUserOptions userOptions;
- private final XmppSession xmppSession = Suco.get(XmppSession.class);
+ @Override
+ public void actionPerformed(final ActionEvent event) {
+ if (!chatClient.loginIfNecessary()) {
+ manager.changeOwnPresence(thisPresence);
+ }
+ nextPresence = thisPresence;
+ }
- @Inject
- public ChatSitebarActions(final Session session, final ChatClient chatClient, final SiteUserOptions userOptions,
- final I18nTranslationService i18n, final ChatResources res) {
- this.session = session;
- this.chatClient = chatClient;
- this.userOptions = userOptions;
- this.i18n = i18n;
- this.res = res;
- createActions();
+ private void updateStatusIcon(final ImageResource icon, final Presence currentPresence) {
+ if (thisPresence.getShow().equals(currentPresence.getShow())
+ && ((currentPresence.getStatus() == null) || currentPresence.getStatus().equals(
+ thisPresence.getStatus()))) {
+ SiteUserOptionsPresenter.LOGGED_USER_MENU.putValue(AbstractAction.SMALL_ICON, icon);
+ }
}
+ }
- private void createActions() {
- final MenuTitleItemDescriptor chatActionsTitle = new MenuTitleItemDescriptor(
- SiteUserOptionsPresenter.LOGGED_USER_MENU, i18n.t("Set your chat status"));
- userOptions.addAction(new MenuSeparatorDescriptor(SiteUserOptionsPresenter.LOGGED_USER_MENU));
- userOptions.addAction(chatActionsTitle);
- final MenuRadioItemDescriptor onlineItem = createChatStatusAction(res.online(), i18n.t("Available"),
- onlineAction(NO_STATUS, Show.notSpecified, res.online()));
- final MenuRadioItemDescriptor availableItem = createChatStatusAction(res.xa(), i18n.t("Available for chat"),
- onlineAction(NO_STATUS, Show.chat, res.xa()));
- final MenuRadioItemDescriptor awayItem = createChatStatusAction(res.away(), i18n.t("Away"),
- onlineAction(NO_STATUS, Show.away, res.away()));
- final MenuRadioItemDescriptor busyItem = createChatStatusAction(res.busy(), i18n.t("Busy"),
- onlineAction(NO_STATUS, Show.dnd, res.busy()));
- final MenuRadioItemDescriptor offlineItem = createChatStatusAction(res.offline(), i18n.t("Sign out of chat"),
- new ChangeOfflineStatusAction(res.offline()));
- userOptions.addAction(onlineItem);
- userOptions.addAction(availableItem);
- userOptions.addAction(awayItem);
- userOptions.addAction(busyItem);
- userOptions.addAction(offlineItem);
- xmppSession.addSessionStateChangedHandler(false, new StateChangedHandler() {
+ private static final String CHAT_STATUS = "k-chat-status-group";
+ private static final String GROUP_CHAT_STATUS = "k-group-chat-status";
+ private static final String NO_STATUS = null;
+ private final ChatClient chatClient;
+ private final I18nTranslationService i18n;
+ private Presence nextPresence = Presence.build(NO_STATUS, Show.notSpecified);
+ private final PresenceManager presenceManager;
+ private final ChatResources res;
+ private final SiteUserOptions userOptions;
+ private final XmppSession xmppSession;
- @Override
- public void onStateChanged(final StateChangedEvent event) {
- if (xmppSession.isReady()) {
- presenceManager.changeOwnPresence(nextPresence);
- switch (nextPresence.getShow()) {
- case notSpecified:
- onlineItem.setChecked(true);
- break;
- case dnd:
- busyItem.setChecked(true);
- break;
- case chat:
- availableItem.setChecked(true);
- break;
- case away:
- awayItem.setChecked(true);
- break;
- }
- } else {
- offlineItem.setChecked(true);
- }
- }
- });
- }
+ @Inject
+ public ChatSitebarActions(final Session session, final ChatClient chatClient,
+ final SiteUserOptions userOptions, final I18nTranslationService i18n, final ChatResources res,
+ final ChatInstances chatInstances) {
+ this.chatClient = chatClient;
+ this.userOptions = userOptions;
+ this.i18n = i18n;
+ this.res = res;
+ xmppSession = chatInstances.xmppSession;
+ presenceManager = chatInstances.presenceManager;
+ createActions();
+ }
- private MenuRadioItemDescriptor createChatStatusAction(final ImageResource icon, final String text,
- final AbstractAction action) {
- final MenuRadioItemDescriptor item = new MenuRadioItemDescriptor(SiteUserOptionsPresenter.LOGGED_USER_MENU,
- action, GROUP_CHAT_STATUS);
- item.putValue(AbstractAction.NAME, text);
- item.putValue(AbstractAction.SMALL_ICON, icon);
- return item;
- }
+ private void createActions() {
+ final MenuTitleItemDescriptor chatActionsTitle = new MenuTitleItemDescriptor(
+ SiteUserOptionsPresenter.LOGGED_USER_MENU, i18n.t("Set your chat status"));
+ userOptions.addAction(new MenuSeparatorDescriptor(SiteUserOptionsPresenter.LOGGED_USER_MENU));
+ userOptions.addAction(chatActionsTitle);
+ final MenuRadioItemDescriptor onlineItem = createChatStatusAction(res.online(), i18n.t("Available"),
+ onlineAction(NO_STATUS, Show.notSpecified, res.online()));
+ final MenuRadioItemDescriptor availableItem = createChatStatusAction(res.xa(),
+ i18n.t("Available for chat"), onlineAction(NO_STATUS, Show.chat, res.xa()));
+ final MenuRadioItemDescriptor awayItem = createChatStatusAction(res.away(), i18n.t("Away"),
+ onlineAction(NO_STATUS, Show.away, res.away()));
+ final MenuRadioItemDescriptor busyItem = createChatStatusAction(res.busy(), i18n.t("Busy"),
+ onlineAction(NO_STATUS, Show.dnd, res.busy()));
+ final MenuRadioItemDescriptor offlineItem = createChatStatusAction(res.offline(),
+ i18n.t("Sign out of chat"), new ChangeOfflineStatusAction(xmppSession, res.offline()));
+ userOptions.addAction(onlineItem);
+ userOptions.addAction(availableItem);
+ userOptions.addAction(awayItem);
+ userOptions.addAction(busyItem);
+ userOptions.addAction(offlineItem);
+ xmppSession.addSessionStateChangedHandler(false, new StateChangedHandler() {
- private AbstractExtendedAction onlineAction(final String statusText, final Show show, final ImageResource icon) {
- return new ChangeOnlineStatusAction(statusText, show, icon);
- }
+ @Override
+ public void onStateChanged(final StateChangedEvent event) {
+ if (xmppSession.isReady()) {
+ presenceManager.changeOwnPresence(nextPresence);
+ switch (nextPresence.getShow()) {
+ case notSpecified:
+ onlineItem.setChecked(true);
+ break;
+ case dnd:
+ busyItem.setChecked(true);
+ break;
+ case chat:
+ availableItem.setChecked(true);
+ break;
+ case away:
+ awayItem.setChecked(true);
+ break;
+ }
+ } else {
+ offlineItem.setChecked(true);
+ }
+ }
+ });
+ }
+
+ private MenuRadioItemDescriptor createChatStatusAction(final ImageResource icon, final String text,
+ final AbstractAction action) {
+ final MenuRadioItemDescriptor item = new MenuRadioItemDescriptor(
+ SiteUserOptionsPresenter.LOGGED_USER_MENU, action, GROUP_CHAT_STATUS);
+ item.putValue(AbstractAction.NAME, text);
+ item.putValue(AbstractAction.SMALL_ICON, icon);
+ return item;
+ }
+
+ private AbstractExtendedAction onlineAction(final String statusText, final Show show,
+ final ImageResource icon) {
+ return new ChangeOnlineStatusAction(presenceManager, statusText, show, icon);
+ }
}
Modified: trunk/src/main/java/cc/kune/chat/client/actions/OpenGroupPublicChatRoomAction.java
===================================================================
--- trunk/src/main/java/cc/kune/chat/client/actions/OpenGroupPublicChatRoomAction.java 2011-07-09 22:25:58 UTC (rev 1445)
+++ trunk/src/main/java/cc/kune/chat/client/actions/OpenGroupPublicChatRoomAction.java 2011-07-10 18:29:52 UTC (rev 1446)
@@ -23,6 +23,7 @@
import java.util.List;
import cc.kune.chat.client.ChatClient;
+import cc.kune.chat.client.ChatInstances;
import cc.kune.chat.client.resources.ChatResources;
import cc.kune.common.client.actions.Action;
import cc.kune.common.client.actions.ActionEvent;
@@ -43,7 +44,6 @@
import com.calclab.emite.xep.muc.client.Occupant;
import com.calclab.emite.xep.muc.client.Room;
import com.calclab.emite.xep.muc.client.RoomManager;
-import com.calclab.suco.client.Suco;
import com.google.inject.Inject;
public class OpenGroupPublicChatRoomAction extends RolActionAutoUpdated {
@@ -51,19 +51,19 @@
private final ChatClient chatClient;
private final I18nTranslationService i18n;
private boolean inviteMembers;
- private final RoomManager roomManager;
private final Session session;
@SuppressWarnings("deprecation")
@Inject
public OpenGroupPublicChatRoomAction(final Session session,
final AccessRightsClientManager accessRightsClientManager, final ChatClient chatClient,
- final StateManager stateManager, final I18nTranslationService i18n, final ChatResources res) {
+ final StateManager stateManager, final I18nTranslationService i18n, final ChatResources res,
+ final ChatInstances chatInstances) {
super(stateManager, session, accessRightsClientManager, AccessRolDTO.Editor, true, false, true);
this.session = session;
this.chatClient = chatClient;
this.i18n = i18n;
- roomManager = Suco.get(RoomManager.class);
+ final RoomManager roomManager = chatInstances.roomManager;
stateManager.onStateChanged(true, new StateChangedHandler() {
@Override
public void onStateChanged(final StateChangedEvent event) {
Modified: trunk/src/main/java/cc/kune/chat/client/actions/StartChatWithMemberAction.java
===================================================================
--- trunk/src/main/java/cc/kune/chat/client/actions/StartChatWithMemberAction.java 2011-07-09 22:25:58 UTC (rev 1445)
+++ trunk/src/main/java/cc/kune/chat/client/actions/StartChatWithMemberAction.java 2011-07-10 18:29:52 UTC (rev 1446)
@@ -26,33 +26,40 @@
import cc.kune.common.client.notify.NotifyUser;
import cc.kune.core.client.resources.CoreResources;
import cc.kune.core.shared.dto.GroupDTO;
+import cc.kune.core.shared.dto.UserSimpleDTO;
import cc.kune.core.shared.i18n.I18nTranslationService;
-import com.calclab.emite.core.client.xmpp.stanzas.XmppURI;
import com.google.inject.Inject;
import com.google.inject.Provider;
public class StartChatWithMemberAction extends AbstractExtendedAction {
- private final Provider<ChatClient> chatClient;
- private final I18nTranslationService i18n;
+ private final Provider<ChatClient> chatClient;
+ private final I18nTranslationService i18n;
- @Inject
- public StartChatWithMemberAction(final I18nTranslationService i18n, final CoreResources res,
- final Provider<ChatClient> chatClient) {
- this.i18n = i18n;
- this.chatClient = chatClient;
- putValue(NAME, i18n.t("Chat with this member"));
- putValue(Action.SMALL_ICON, res.newChat());
- }
+ @Inject
+ public StartChatWithMemberAction(final I18nTranslationService i18n, final CoreResources res,
+ final Provider<ChatClient> chatClient) {
+ this.i18n = i18n;
+ this.chatClient = chatClient;
+ putValue(NAME, i18n.t("Chat with this member"));
+ putValue(Action.SMALL_ICON, res.newChat());
+ }
- @Override
- public void actionPerformed(final ActionEvent event) {
- chatClient.get().show();
- if (chatClient.get().isLoggedIn()) {
- chatClient.get().chat(XmppURI.jid(((GroupDTO) event.getTarget()).getShortName()));
- } else {
- NotifyUser.important(i18n.t("To start a chat you need to be 'online'"));
- }
+ @Override
+ public void actionPerformed(final ActionEvent event) {
+ chatClient.get().show();
+ if (chatClient.get().isLoggedIn()) {
+ String username = null;
+ if (event.getTarget() instanceof GroupDTO) {
+ username = ((GroupDTO) event.getTarget()).getShortName();
+ } else if (event.getTarget() instanceof UserSimpleDTO) {
+ username = ((UserSimpleDTO) event.getTarget()).getShortName();
+ }
+ if (username != null) {
+ chatClient.get().chat(username);
+ }
+ } else {
+ NotifyUser.important(i18n.t("To start a chat you need to be 'online'"));
}
-
+ }
}
Added: trunk/src/main/java/cc/kune/chat/client/actions/StartChatWithThisPersonAction.java
===================================================================
--- trunk/src/main/java/cc/kune/chat/client/actions/StartChatWithThisPersonAction.java (rev 0)
+++ trunk/src/main/java/cc/kune/chat/client/actions/StartChatWithThisPersonAction.java 2011-07-10 18:29:52 UTC (rev 1446)
@@ -0,0 +1,36 @@
+/*
+ *
+ * Copyright (C) 2007-2011 The kune development team (see CREDITS for details)
+ * This file is part of kune.
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as
+ * published by the Free Software Foundation, either version 3 of the
+ * License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ *
+ */
+package cc.kune.chat.client.actions;
+
+import cc.kune.chat.client.ChatClient;
+import cc.kune.core.client.resources.CoreResources;
+import cc.kune.core.shared.i18n.I18nTranslationService;
+
+import com.google.inject.Inject;
+import com.google.inject.Provider;
+
+public class StartChatWithThisPersonAction extends StartChatWithMemberAction {
+ @Inject
+ public StartChatWithThisPersonAction(final I18nTranslationService i18n, final CoreResources res,
+ final Provider<ChatClient> chatClient) {
+ super(i18n, res, chatClient);
+ putValue(NAME, i18n.t("Chat with this person"));
+ }
+}
Deleted: trunk/src/main/java/cc/kune/chat/client/actions/StartChatWithUserAction.java
===================================================================
--- trunk/src/main/java/cc/kune/chat/client/actions/StartChatWithUserAction.java 2011-07-09 22:25:58 UTC (rev 1445)
+++ trunk/src/main/java/cc/kune/chat/client/actions/StartChatWithUserAction.java 2011-07-10 18:29:52 UTC (rev 1446)
@@ -1,36 +0,0 @@
-/*
- *
- * Copyright (C) 2007-2011 The kune development team (see CREDITS for details)
- * This file is part of kune.
- *
- * This program is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Affero General Public License as
- * published by the Free Software Foundation, either version 3 of the
- * License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU Affero General Public License for more details.
- *
- * You should have received a copy of the GNU Affero General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- *
- */
-package cc.kune.chat.client.actions;
-
-import cc.kune.chat.client.ChatClient;
-import cc.kune.core.client.resources.CoreResources;
-import cc.kune.core.shared.i18n.I18nTranslationService;
-
-import com.google.inject.Inject;
-import com.google.inject.Provider;
-
-public class StartChatWithUserAction extends StartChatWithMemberAction {
- @Inject
- public StartChatWithUserAction(final I18nTranslationService i18n, final CoreResources res,
- final Provider<ChatClient> chatClient) {
- super(i18n, res, chatClient);
- putValue(NAME, i18n.t("Chat with this person"));
- }
-}
Added: trunk/src/main/java/cc/kune/chat/client/actions/conditions/IsBuddieCondition.java
===================================================================
--- trunk/src/main/java/cc/kune/chat/client/actions/conditions/IsBuddieCondition.java (rev 0)
+++ trunk/src/main/java/cc/kune/chat/client/actions/conditions/IsBuddieCondition.java 2011-07-10 18:29:52 UTC (rev 1446)
@@ -0,0 +1,72 @@
+/*
+ *
+ * Copyright (C) 2007-2011 The kune development team (see CREDITS for details)
+ * This file is part of kune.
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as
+ * published by the Free Software Foundation, either version 3 of the
+ * License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ *
+ */
+package cc.kune.chat.client.actions.conditions;
+
+import cc.kune.chat.client.ChatClient;
+import cc.kune.common.client.actions.ui.descrip.GuiActionDescrip;
+import cc.kune.common.client.actions.ui.descrip.GuiAddCondition;
+import cc.kune.common.client.errors.UIException;
+import cc.kune.core.client.state.Session;
+import cc.kune.core.shared.dto.GroupDTO;
+import cc.kune.core.shared.dto.UserSimpleDTO;
+
+import com.google.inject.Inject;
+import com.google.inject.Singleton;
+
+@Singleton
+public class IsBuddieCondition implements GuiAddCondition {
+
+ private final ChatClient chatClient;
+ private final Session session;
+
+ @Inject
+ public IsBuddieCondition(final Session session, final ChatClient chatClient) {
+ this.chatClient = chatClient;
+ this.session = session;
+ }
+
+ private boolean isBuddie(final String targetName) {
+ return chatClient.isBuddie(targetName);
+ }
+
+ private boolean isThisGroupInRoster(final GuiActionDescrip descr) {
+ final String targetName = ((GroupDTO) descr.getTarget()).getShortName();
+ return isBuddie(targetName);
+ }
+
+ private boolean isThisPersonInRoster(final GuiActionDescrip descr) {
+ final String targetName = ((UserSimpleDTO) descr.getTarget()).getShortName();
+ return isBuddie(targetName);
+ }
+
+ @Override
+ public boolean mustBeAdded(final GuiActionDescrip descr) {
+ if (session.isNotLogged()) {
+ return false;
+ }
+ if (descr.getTarget() instanceof UserSimpleDTO) {
+ return isThisPersonInRoster(descr);
+ } else if (descr.getTarget() instanceof GroupDTO) {
+ return isThisGroupInRoster(descr);
+ } else {
+ throw new UIException("Unsupported target");
+ }
+ }
+}
Added: trunk/src/main/java/cc/kune/chat/client/actions/conditions/IsNotBuddieCondition.java
===================================================================
--- trunk/src/main/java/cc/kune/chat/client/actions/conditions/IsNotBuddieCondition.java (rev 0)
+++ trunk/src/main/java/cc/kune/chat/client/actions/conditions/IsNotBuddieCondition.java 2011-07-10 18:29:52 UTC (rev 1446)
@@ -0,0 +1,23 @@
+package cc.kune.chat.client.actions.conditions;
+
+import cc.kune.chat.client.ChatClient;
+import cc.kune.common.client.actions.ui.descrip.GuiActionDescrip;
+import cc.kune.core.client.state.Session;
+
+import com.google.inject.Inject;
+import com.google.inject.Singleton;
+
+@Singleton
+public class IsNotBuddieCondition extends IsBuddieCondition {
+
+ @Inject
+ public IsNotBuddieCondition(final Session session, final ChatClient chatClient) {
+ super(session, chatClient);
+ }
+
+ @Override
+ public boolean mustBeAdded(final GuiActionDescrip descr) {
+ return !super.mustBeAdded(descr);
+ }
+
+}
Added: trunk/src/main/java/cc/kune/common/client/ui/AbstractDecorator.java
===================================================================
--- trunk/src/main/java/cc/kune/common/client/ui/AbstractDecorator.java (rev 0)
+++ trunk/src/main/java/cc/kune/common/client/ui/AbstractDecorator.java 2011-07-10 18:29:52 UTC (rev 1446)
@@ -0,0 +1,79 @@
+package cc.kune.common.client.ui;
+
+import cc.kune.common.client.tooltip.Tooltip;
+
+import com.google.gwt.core.client.GWT;
+import com.google.gwt.dom.client.Style.Float;
+import com.google.gwt.dom.client.Style.Position;
+import com.google.gwt.dom.client.Style.Unit;
+import com.google.gwt.resources.client.ImageResource;
+import com.google.gwt.uibinder.client.UiBinder;
+import com.google.gwt.uibinder.client.UiField;
+import com.google.gwt.user.client.Element;
+import com.google.gwt.user.client.ui.Composite;
+import com.google.gwt.user.client.ui.FlowPanel;
+import com.google.gwt.user.client.ui.Image;
+import com.google.gwt.user.client.ui.IsWidget;
+import com.google.gwt.user.client.ui.SimplePanel;
+import com.google.gwt.user.client.ui.Widget;
+
+public class AbstractDecorator extends Composite {
+
+ interface Binder extends UiBinder<Widget, AbstractDecorator> {
+ }
+ private static final Binder BINDER = GWT.create(Binder.class);
+ @UiField
+ Image decorationImage;
+ private int left = 0;
+
+ @UiField
+ FlowPanel mainPanel;
+ private int offset = 0;
+ private int top = 0;
+ @UiField
+ SimplePanel widgetContainer;
+
+ public AbstractDecorator() {
+ initWidget(BINDER.createAndBindUi(this));
+ }
+
+ public void clearImage() {
+ decorationImage.setVisible(false);
+ }
+
+ public void setDecoratorVisible(final boolean visible) {
+ decorationImage.setVisible(visible);
+ }
+
+ public void setImage(final ImageResource img) {
+ decorationImage.setResource(img);
+ decorationImage.setVisible(true);
+ setPosition();
+ }
+
+ public void setImagePosition(final int top, final int left, final int offset) {
+ this.top = top;
+ this.left = left;
+ this.offset = offset;
+ setPosition();
+ }
+
+ public void setImageTooltip(final String text) {
+ Tooltip.to(decorationImage, text);
+ }
+
+ private void setPosition() {
+ final Element elem = decorationImage.getElement();
+ elem.getStyle().setPropertyPx("left", left);
+ elem.getStyle().setPropertyPx("top", top);
+ elem.getStyle().setPosition(Position.RELATIVE);
+ elem.getStyle().setFloat(Float.LEFT);
+ elem.getStyle().setMarginRight(offset, Unit.PX);
+ }
+
+ public void setWidget(final IsWidget widget) {
+ widgetContainer.clear();
+ widgetContainer.add(widget);
+ }
+
+}
Added: trunk/src/main/java/cc/kune/common/client/ui/AbstractDecorator.ui.xml
===================================================================
--- trunk/src/main/java/cc/kune/common/client/ui/AbstractDecorator.ui.xml (rev 0)
+++ trunk/src/main/java/cc/kune/common/client/ui/AbstractDecorator.ui.xml 2011-07-10 18:29:52 UTC (rev 1446)
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE ui:UiBinder SYSTEM "http://dl.google.com/gwt/DTD/xhtml.ent">
+<ui:UiBinder xmlns:ui='urn:ui:com.google.gwt.uibinder'
+ xmlns:g='urn:import:com.google.gwt.user.client.ui'>
+ <ui:style>
+ .image {
+ position: relative;
+ top: 0px;
+ left: 0px;
+ float: left;
+ }
+
+ .container {
+ float: left;
+ }
+ </ui:style>
+
+ <g:FlowPanel ui:field="mainPanel">
+ <g:SimplePanel ui:field="widgetContainer" styleName="{style.container}" />
+ <g:Image ui:field="decorationImage"
+ styleName="{style.image}" />
+ </g:FlowPanel>
+</ui:UiBinder>
Modified: trunk/src/main/java/cc/kune/core/client/CoreGinModule.java
===================================================================
--- trunk/src/main/java/cc/kune/core/client/CoreGinModule.java 2011-07-09 22:25:58 UTC (rev 1445)
+++ trunk/src/main/java/cc/kune/core/client/CoreGinModule.java 2011-07-10 18:29:52 UTC (rev 1446)
@@ -217,7 +217,7 @@
s(ErrorsDialog.class);
s(XMLActionsParser.class);
- bind(Services.class).to(GWTServices.class);
+ s(Services.class, GWTServices.class);
}
}
Added: trunk/src/main/java/cc/kune/core/client/avatar/AvatarDecorator.java
===================================================================
--- trunk/src/main/java/cc/kune/core/client/avatar/AvatarDecorator.java (rev 0)
+++ trunk/src/main/java/cc/kune/core/client/avatar/AvatarDecorator.java 2011-07-10 18:29:52 UTC (rev 1446)
@@ -0,0 +1,13 @@
+package cc.kune.core.client.avatar;
+
+import com.google.gwt.user.client.ui.IsWidget;
+
+public interface AvatarDecorator {
+
+ void setDecoratorVisible(boolean visible);
+
+ void setItem(String name);
+
+ void setWidget(IsWidget widget);
+
+}
Added: trunk/src/main/java/cc/kune/core/client/avatar/MediumAvatarDecorator.java
===================================================================
--- trunk/src/main/java/cc/kune/core/client/avatar/MediumAvatarDecorator.java (rev 0)
+++ trunk/src/main/java/cc/kune/core/client/avatar/MediumAvatarDecorator.java 2011-07-10 18:29:52 UTC (rev 1446)
@@ -0,0 +1,5 @@
+package cc.kune.core.client.avatar;
+
+public interface MediumAvatarDecorator extends AvatarDecorator {
+
+}
Added: trunk/src/main/java/cc/kune/core/client/avatar/SmallAvatarDecorator.java
===================================================================
--- trunk/src/main/java/cc/kune/core/client/avatar/SmallAvatarDecorator.java (rev 0)
+++ trunk/src/main/java/cc/kune/core/client/avatar/SmallAvatarDecorator.java 2011-07-10 18:29:52 UTC (rev 1446)
@@ -0,0 +1,5 @@
+package cc.kune.core.client.avatar;
+
+public interface SmallAvatarDecorator extends AvatarDecorator {
+
+}
Modified: trunk/src/main/java/cc/kune/core/client/resources/CoreResources.java
===================================================================
--- trunk/src/main/java/cc/kune/core/client/resources/CoreResources.java 2011-07-09 22:25:58 UTC (rev 1445)
+++ trunk/src/main/java/cc/kune/core/client/resources/CoreResources.java 2011-07-10 18:29:52 UTC (rev 1446)
@@ -271,6 +271,42 @@
@Source("charfontname.png")
ImageResource charfontname();
+ @Source("chat-dot-available-medium.png")
+ ImageResource chatDotAvailableMedium();
+
+ @Source("chat-dot-available-small.png")
+ ImageResource chatDotAvailableSmall();
+
+ @Source("chat-dot-away-medium.png")
+ ImageResource chatDotAwayMedium();
+
+ @Source("chat-dot-away-small.png")
+ ImageResource chatDotAwaySmall();
+
+ @Source("chat-dot-busy-medium.png")
+ ImageResource chatDotBusyMedium();
+
+ @Source("chat-dot-busy-small.png")
+ ImageResource chatDotBusySmall();
+
+ @Source("chat-dot-extended-away-medium.png")
+ ImageResource chatDotExtendedAwayMedium();
+
+ @Source("chat-dot-extended-away-small.png")
+ ImageResource chatDotExtendedAwaySmall();
+
+ @Source("chat-dot-invisible-medium.png")
+ ImageResource chatDotInvisibleMedium();
+
+ @Source("chat-dot-invisible-small.png")
+ ImageResource chatDotInvisibleSmall();
+
+ @Source("chat-dot-offline-medium.png")
+ ImageResource chatDotOfflineMedium();
+
+ @Source("chat-dot-offline-small.png")
+ ImageResource chatDotOfflineSmall();
+
@Source("checked.png")
ImageResource checked();
Added: trunk/src/main/java/cc/kune/core/client/resources/chat-dot-available-medium.png
===================================================================
(Binary files differ)
Property changes on: trunk/src/main/java/cc/kune/core/client/resources/chat-dot-available-medium.png
___________________________________________________________________
Name: svn:mime-type
+ application/octet-stream
Added: trunk/src/main/java/cc/kune/core/client/resources/chat-dot-available-small.png
===================================================================
(Binary files differ)
Property changes on: trunk/src/main/java/cc/kune/core/client/resources/chat-dot-available-small.png
___________________________________________________________________
Name: svn:mime-type
+ application/octet-stream
Added: trunk/src/main/java/cc/kune/core/client/resources/chat-dot-away-medium.png
===================================================================
(Binary files differ)
Property changes on: trunk/src/main/java/cc/kune/core/client/resources/chat-dot-away-medium.png
___________________________________________________________________
Name: svn:mime-type
+ application/octet-stream
Added: trunk/src/main/java/cc/kune/core/client/resources/chat-dot-away-small.png
===================================================================
(Binary files differ)
Property changes on: trunk/src/main/java/cc/kune/core/client/resources/chat-dot-away-small.png
___________________________________________________________________
Name: svn:mime-type
+ application/octet-stream
Added: trunk/src/main/java/cc/kune/core/client/resources/chat-dot-busy-medium.png
===================================================================
(Binary files differ)
Property changes on: trunk/src/main/java/cc/kune/core/client/resources/chat-dot-busy-medium.png
___________________________________________________________________
Name: svn:mime-type
+ application/octet-stream
Added: trunk/src/main/java/cc/kune/core/client/resources/chat-dot-busy-small.png
===================================================================
(Binary files differ)
Property changes on: trunk/src/main/java/cc/kune/core/client/resources/chat-dot-busy-small.png
___________________________________________________________________
Name: svn:mime-type
+ application/octet-stream
Added: trunk/src/main/java/cc/kune/core/client/resources/chat-dot-extended-away-medium.png
===================================================================
(Binary files differ)
Property changes on: trunk/src/main/java/cc/kune/core/client/resources/chat-dot-extended-away-medium.png
___________________________________________________________________
Name: svn:mime-type
+ application/octet-stream
Added: trunk/src/main/java/cc/kune/core/client/resources/chat-dot-extended-away-small.png
===================================================================
(Binary files differ)
Property changes on: trunk/src/main/java/cc/kune/core/client/resources/chat-dot-extended-away-small.png
___________________________________________________________________
Name: svn:mime-type
+ application/octet-stream
Added: trunk/src/main/java/cc/kune/core/client/resources/chat-dot-invisible-medium.png
===================================================================
(Binary files differ)
Property changes on: trunk/src/main/java/cc/kune/core/client/resources/chat-dot-invisible-medium.png
___________________________________________________________________
Name: svn:mime-type
+ application/octet-stream
Added: trunk/src/main/java/cc/kune/core/client/resources/chat-dot-invisible-small.png
===================================================================
(Binary files differ)
Property changes on: trunk/src/main/java/cc/kune/core/client/resources/chat-dot-invisible-small.png
___________________________________________________________________
Name: svn:mime-type
+ application/octet-stream
Added: trunk/src/main/java/cc/kune/core/client/resources/chat-dot-offline-medium.png
===================================================================
(Binary files differ)
Property changes on: trunk/src/main/java/cc/kune/core/client/resources/chat-dot-offline-medium.png
___________________________________________________________________
Name: svn:mime-type
+ application/octet-stream
Added: trunk/src/main/java/cc/kune/core/client/resources/chat-dot-offline-small.png
===================================================================
(Binary files differ)
Property changes on: trunk/src/main/java/cc/kune/core/client/resources/chat-dot-offline-small.png
___________________________________________________________________
Name: svn:mime-type
+ application/octet-stream
Modified: trunk/src/main/java/cc/kune/core/client/sitebar/spaces/SpaceSelectorPresenter.java
===================================================================
--- trunk/src/main/java/cc/kune/core/client/sitebar/spaces/SpaceSelectorPresenter.java 2011-07-09 22:25:58 UTC (rev 1445)
+++ trunk/src/main/java/cc/kune/core/client/sitebar/spaces/SpaceSelectorPresenter.java 2011-07-10 18:29:52 UTC (rev 1446)
@@ -142,7 +142,7 @@
@Override
public void onWindowFocus(final WindowFocusEvent event) {
if (event.isHasFocus() && !mask.isShowing()) {
- showTooltipWithDelay();
+ // showTooltipWithDelay();
}
}
});
Modified: trunk/src/main/java/cc/kune/core/client/sn/AbstractSNPanel.java
===================================================================
--- trunk/src/main/java/cc/kune/core/client/sn/AbstractSNPanel.java 2011-07-09 22:25:58 UTC (rev 1445)
+++ trunk/src/main/java/cc/kune/core/client/sn/AbstractSNPanel.java 2011-07-10 18:29:52 UTC (rev 1446)
@@ -29,6 +29,7 @@
import cc.kune.common.client.actions.ui.descrip.MenuDescriptor;
import cc.kune.common.client.tooltip.Tooltip;
import cc.kune.common.client.ui.BasicThumb;
+import cc.kune.core.client.avatar.SmallAvatarDecorator;
import cc.kune.core.shared.i18n.I18nTranslationService;
import cc.kune.gspace.client.GSpaceArmor;
@@ -43,6 +44,7 @@
import com.google.gwt.user.client.ui.Label;
import com.google.gwt.user.client.ui.ScrollPanel;
import com.google.gwt.user.client.ui.Widget;
+import com.google.inject.Provider;
import com.gwtplatform.mvp.client.ViewImpl;
public class AbstractSNPanel extends ViewImpl {
@@ -52,11 +54,11 @@
private final static int AVATARLABELMAXSIZE = 4;
private final static int AVATARSIZE = 22;
- private final static String CATEG_HEIGHT = "80px";
+ private final static String CATEG_HEIGHT = "84px";
private static AbstractSNPanelUiBinder uiBinder = GWT.create(AbstractSNPanelUiBinder.class);
-
protected final ActionSimplePanel actions;
protected final GSpaceArmor armor;
+ protected final Provider<SmallAvatarDecorator> avatarDecoratorProv;
ActionFlowPanel bottomActionsToolbar;
@UiField
FlowPanel bottomPanel;
@@ -103,8 +105,9 @@
protected final Widget widget;
public AbstractSNPanel(final I18nTranslationService i18n, final GuiProvider guiProvider,
- final GSpaceArmor armor) {
+ final GSpaceArmor armor, final Provider<SmallAvatarDecorator> avatarDecorator) {
this.armor = armor;
+ this.avatarDecoratorProv = avatarDecorator;
widget = uiBinder.createAndBindUi(this);
actions = new ActionSimplePanel(guiProvider);
}
@@ -144,6 +147,13 @@
return thumb;
}
+ public SmallAvatarDecorator decorateAvatarWithXmppStatus(final String shortname, final BasicThumb thumb) {
+ final SmallAvatarDecorator decorator = avatarDecoratorProv.get();
+ decorator.setWidget(thumb);
+ decorator.setItem(shortname);
+ return decorator;
+ }
+
public IsActionExtensible getBottomToolbar() {
return bottomActionsToolbar;
}
Modified: trunk/src/main/java/cc/kune/core/client/sn/AbstractSNPanel.ui.xml
===================================================================
--- trunk/src/main/java/cc/kune/core/client/sn/AbstractSNPanel.ui.xml 2011-07-09 22:25:58 UTC (rev 1445)
+++ trunk/src/main/java/cc/kune/core/client/sn/AbstractSNPanel.ui.xml 2011-07-10 18:29:52 UTC (rev 1446)
@@ -14,8 +14,9 @@
<g:Label ui:field="firstDeckLabel" addStyleNames="k-sn-novisible-label" />
<g:Label ui:field="sndDeckLabel" addStyleNames="k-sn-orphan-label" />
<g:FlowPanel width="100%" ui:field="categoriesFlow">
+ <!-- Seed AbstractSNPanel.CATEG_HEIGHT-->
<g:DockLayoutPanel unit="EM" width="100%" ui:field="firstCategoryPanel"
- addStyleNames="k-sn-1st-panel" height="80px">
+ addStyleNames="k-sn-1st-panel" height="84px">
<g:north size="1.2">
<g:FlowPanel>
<g:Label text="Admins" ui:field="firstCategoryLabel"
@@ -32,7 +33,7 @@
</g:DockLayoutPanel>
<g:DockLayoutPanel unit="EM" width="100%"
ui:field="sndCategoryPanel" addStyleNames="k-sn-2nd-panel"
- height="80px">
+ height="84px">
<g:north size="1.2">
<g:FlowPanel>
<g:Label text="Collabs" ui:field="sndCategoryLabel"
@@ -50,7 +51,7 @@
</g:DockLayoutPanel>
<g:DockLayoutPanel unit="EM" width="100%"
ui:field="trdCategoryPanel" addStyleNames="k-sn-3rd-panel"
- height="80px">
+ height="84px">
<g:north size="1.2">
<g:FlowPanel>
<g:Label text="Pendings" ui:field="trdCategoryLabel"
Modified: trunk/src/main/java/cc/kune/core/client/sn/GroupSNPanel.java
===================================================================
--- trunk/src/main/java/cc/kune/core/client/sn/GroupSNPanel.java 2011-07-09 22:25:58 UTC (rev 1445)
+++ trunk/src/main/java/cc/kune/core/client/sn/GroupSNPanel.java 2011-07-10 18:29:52 UTC (rev 1446)
@@ -24,19 +24,22 @@
import cc.kune.common.client.actions.ui.descrip.GuiActionDescCollection;
import cc.kune.common.client.tooltip.Tooltip;
import cc.kune.common.client.ui.BasicThumb;
+import cc.kune.core.client.avatar.SmallAvatarDecorator;
import cc.kune.core.client.sn.GroupSNPresenter.GroupSNView;
import cc.kune.core.shared.dto.GroupDTO;
import cc.kune.core.shared.i18n.I18nTranslationService;
import cc.kune.gspace.client.GSpaceArmor;
+import com.google.gwt.user.client.ui.Widget;
import com.google.inject.Inject;
+import com.google.inject.Provider;
public class GroupSNPanel extends AbstractSNPanel implements GroupSNView {
@Inject
public GroupSNPanel(final I18nTranslationService i18n, final GuiProvider guiProvider,
- final GSpaceArmor armor) {
- super(i18n, guiProvider, armor);
+ final GSpaceArmor armor, final Provider<SmallAvatarDecorator> avatarDecorator) {
+ super(i18n, guiProvider, armor, avatarDecorator);
setVisibleImpl(false);
mainTitle.setText(i18n.t("Group members"));
Tooltip.to(mainTitle, i18n.t("People and groups collaborating in this group"));
@@ -59,14 +62,16 @@
public void addAdmin(final GroupDTO group, final String avatarUrl, final String tooltip,
final String tooltipTitle, final GuiActionDescCollection menu) {
final BasicThumb thumb = createThumb(group.getShortName(), avatarUrl, tooltip, tooltipTitle, menu);
- firstCategoryFlow.add(thumb);
+ firstCategoryFlow.add(group.isPersonal() ? (Widget) decorateAvatarWithXmppStatus(
+ group.getShortName(), thumb) : thumb);
}
@Override
public void addCollab(final GroupDTO group, final String avatarUrl, final String tooltip,
final String tooltipTitle, final GuiActionDescCollection menu) {
final BasicThumb thumb = createThumb(group.getShortName(), avatarUrl, tooltip, tooltipTitle, menu);
- sndCategoryFlow.add(thumb);
+ sndCategoryFlow.add(group.isPersonal() ? (Widget) decorateAvatarWithXmppStatus(group.getShortName(),
+ thumb) : thumb);
}
@Override
Modified: trunk/src/main/java/cc/kune/core/client/sn/UserSNPanel.java
===================================================================
--- trunk/src/main/java/cc/kune/core/client/sn/UserSNPanel.java 2011-07-09 22:25:58 UTC (rev 1445)
+++ trunk/src/main/java/cc/kune/core/client/sn/UserSNPanel.java 2011-07-10 18:29:52 UTC (rev 1446)
@@ -22,6 +22,8 @@
import cc.kune.common.client.actions.ui.ActionFlowPanel;
import cc.kune.common.client.actions.ui.bind.GuiProvider;
import cc.kune.common.client.actions.ui.descrip.GuiActionDescCollection;
+import cc.kune.common.client.ui.BasicThumb;
+import cc.kune.core.client.avatar.SmallAvatarDecorator;
import cc.kune.core.client.resources.CoreMessages;
import cc.kune.core.client.sn.UserSNPresenter.UserSNView;
import cc.kune.core.shared.dto.GroupDTO;
@@ -30,7 +32,9 @@
import cc.kune.gspace.client.GSpaceArmor;
import com.google.gwt.user.client.ui.Label;
+import com.google.gwt.user.client.ui.Widget;
import com.google.inject.Inject;
+import com.google.inject.Provider;
public class UserSNPanel extends AbstractSNPanel implements UserSNView {
@@ -38,9 +42,10 @@
@Inject
public UserSNPanel(final I18nTranslationService i18n, final GuiProvider guiProvider,
- final GSpaceArmor armor) {
- super(i18n, guiProvider, armor);
+ final GSpaceArmor armor, final Provider<SmallAvatarDecorator> avatarDecorator) {
+ super(i18n, guiProvider, armor, avatarDecorator);
this.i18n = i18n;
+
setVisibleImpl(false);
mainTitle.setText(i18n.t("His/her network:"));
mainTitle.setTitle(i18n.t("This user buddies and groups where participes"));
@@ -62,7 +67,8 @@
@Override
public void addBuddie(final UserSimpleDTO user, final String avatarUrl, final String tooltip,
final String tooltipTitle, final GuiActionDescCollection menu) {
- firstCategoryFlow.add(createThumb(user.getShortName(), avatarUrl, tooltip, tooltipTitle, menu));
+ final BasicThumb thumb = createThumb(user.getShortName(), avatarUrl, tooltip, tooltipTitle, menu);
+ firstCategoryFlow.add((Widget) decorateAvatarWithXmppStatus(user.getShortName(), thumb));
}
@Override
Modified: trunk/src/main/java/cc/kune/core/client/sn/actions/conditions/IsMeCondition.java
===================================================================
--- trunk/src/main/java/cc/kune/core/client/sn/actions/conditions/IsMeCondition.java 2011-07-09 22:25:58 UTC (rev 1445)
+++ trunk/src/main/java/cc/kune/core/client/sn/actions/conditions/IsMeCondition.java 2011-07-10 18:29:52 UTC (rev 1446)
@@ -28,13 +28,16 @@
@Singleton
public class IsMeCondition extends IsNotMeCondition {
- @Inject
- public IsMeCondition(final Session session) {
- super(session);
- }
+ @Inject
+ public IsMeCondition(final Session session) {
+ super(session);
+ }
- @Override
- public boolean mustBeAdded(final GuiActionDescrip descr) {
- return !super.mustBeAdded(descr);
+ @Override
+ public boolean mustBeAdded(final GuiActionDescrip descr) {
+ if (session.isNotLogged()) {
+ return false;
}
+ return !super.mustBeAdded(descr);
+ }
}
Modified: trunk/src/main/java/cc/kune/core/client/sn/actions/conditions/IsNotMeCondition.java
===================================================================
--- trunk/src/main/java/cc/kune/core/client/sn/actions/conditions/IsNotMeCondition.java 2011-07-09 22:25:58 UTC (rev 1445)
+++ trunk/src/main/java/cc/kune/core/client/sn/actions/conditions/IsNotMeCondition.java 2011-07-10 18:29:52 UTC (rev 1446)
@@ -32,40 +32,40 @@
@Singleton
public class IsNotMeCondition implements GuiAddCondition {
- private final Session session;
+ protected final Session session;
- @Inject
- public IsNotMeCondition(final Session session) {
- this.session = session;
- }
+ @Inject
+ public IsNotMeCondition(final Session session) {
+ this.session = session;
+ }
- private String currentName() {
- return session.getCurrentUser().getShortName();
- }
+ private String currentName() {
+ return session.getCurrentUser().getShortName();
+ }
- private boolean isNotThisGroup(final GuiActionDescrip descr) {
- final String targetName = ((GroupDTO) descr.getTarget()).getShortName();
- final String currentName = currentName();
- return !currentName.equals(targetName);
- }
+ private boolean isNotThisGroup(final GuiActionDescrip descr) {
+ final String targetName = ((GroupDTO) descr.getTarget()).getShortName();
+ final String currentName = currentName();
+ return !currentName.equals(targetName);
+ }
- private boolean isNotThisPerson(final GuiActionDescrip descr) {
- final String targetName = ((UserSimpleDTO) descr.getTarget()).getShortName();
- final String currentName = currentName();
- return !currentName.equals(targetName);
- }
+ private boolean isNotThisPerson(final GuiActionDescrip descr) {
+ final String targetName = ((UserSimpleDTO) descr.getTarget()).getShortName();
+ final String currentName = currentName();
+ return !currentName.equals(targetName);
+ }
- @Override
- public boolean mustBeAdded(final GuiActionDescrip descr) {
- if (session.isNotLogged()) {
- return true;
- }
- if (descr.getTarget() instanceof UserSimpleDTO) {
- return isNotThisPerson(descr);
- } else if (descr.getTarget() instanceof GroupDTO) {
- return isNotThisGroup(descr);
- } else {
- throw new UIException("Unsupported target");
- }
+ @Override
+ public boolean mustBeAdded(final GuiActionDescrip descr) {
+ if (session.isNotLogged()) {
+ return true;
}
+ if (descr.getTarget() instanceof UserSimpleDTO) {
+ return isNotThisPerson(descr);
+ } else if (descr.getTarget() instanceof GroupDTO) {
+ return isNotThisGroup(descr);
+ } else {
+ throw new UIException("Unsupported target");
+ }
+ }
}
Modified: trunk/src/main/java/cc/kune/core/client/sn/actions/registry/UserSNMenuItemsRegistry.java
===================================================================
--- trunk/src/main/java/cc/kune/core/client/sn/actions/registry/UserSNMenuItemsRegistry.java 2011-07-09 22:25:58 UTC (rev 1445)
+++ trunk/src/main/java/cc/kune/core/client/sn/actions/registry/UserSNMenuItemsRegistry.java 2011-07-10 18:29:52 UTC (rev 1446)
@@ -43,43 +43,52 @@
@SuppressWarnings("serial")
public class UserSNMenuItemsRegistry extends AbstractSNMembersActionsRegistry {
- @Inject
- public UserSNMenuItemsRegistry(final Session session,
- final IsCurrentStateAdministrableCondition isAdministrableCondition,
- final IsPersonCondition isPersonCondition, final IsGroupCondition isGroupCondition,
- final IsLoggedCondition isLoggedCondition, final IsMeCondition isMe, final IsNotMeCondition isNotMe,
- final ChangeToCollabAction changeToCollabAction, final ChangeToAdminAction changeToAdminAction,
- final RemoveMemberAction removeMemberAction, final AcceptJoinGroupAction acceptJoinGroupAction,
- final DenyJoinGroupAction denyJoinGroupAction, final GotoGroupAction gotoGroupAction,
- final GotoPersonAction gotoPersonAction, final UnJoinGroupAction unjoinAction,
- final GotoYourHomePageAction gotoYourHomePageAction) {
- add(new Provider<MenuItemDescriptor>() {
- @Override
- public MenuItemDescriptor get() {
- final MenuItemDescriptor item = new MenuItemDescriptor(gotoPersonAction);
- item.add(isPersonCondition);
- item.add(isNotMe);
- return item;
- }
- });
- add(new Provider<MenuItemDescriptor>() {
- @Override
- public MenuItemDescriptor get() {
- final MenuItemDescriptor item = new MenuItemDescriptor(gotoGroupAction);
- item.add(isGroupCondition);
- return item;
- }
- });
- // This doesn't works, because its unregister from current state not
- // from target group
- // add(new Provider<MenuItemDescriptor>() {
- // @Override
- // public MenuItemDescriptor get() {
- // final MenuItemDescriptor item = new MenuItemDescriptor(unjoinAction);
- // item.add(isLoggedCondition);
- // item.add(isGroupCondition);
- // return item;
- // }
- // });
- }
+ @Inject
+ public UserSNMenuItemsRegistry(final Session session,
+ final IsCurrentStateAdministrableCondition isAdministrableCondition,
+ final IsPersonCondition isPersonCondition, final IsGroupCondition isGroupCondition,
+ final IsLoggedCondition isLoggedCondition, final IsMeCondition isMe,
+ final IsNotMeCondition isNotMe, final ChangeToCollabAction changeToCollabAction,
+ final ChangeToAdminAction changeToAdminAction, final RemoveMemberAction removeMemberAction,
+ final AcceptJoinGroupAction acceptJoinGroupAction, final DenyJoinGroupAction denyJoinGroupAction,
+ final GotoGroupAction gotoGroupAction, final GotoPersonAction gotoPersonAction,
+ final UnJoinGroupAction unjoinAction, final GotoYourHomePageAction gotoYourHomePageAction) {
+ add(new Provider<MenuItemDescriptor>() {
+ @Override
+ public MenuItemDescriptor get() {
+ final MenuItemDescriptor item = new MenuItemDescriptor(gotoPersonAction);
+ item.add(isPersonCondition);
+ item.add(isNotMe);
+ return item;
+ }
+ });
+ add(new Provider<MenuItemDescriptor>() {
+ @Override
+ public MenuItemDescriptor get() {
+ final MenuItemDescriptor item = new MenuItemDescriptor(gotoGroupAction);
+ item.add(isGroupCondition);
+ return item;
+ }
+ });
+ add(new Provider<MenuItemDescriptor>() {
+ @Override
+ public MenuItemDescriptor get() {
+ final MenuItemDescriptor item = new MenuItemDescriptor(gotoYourHomePageAction);
+ item.add(isPersonCondition);
+ item.add(isMe);
+ return item;
+ }
+ });
+ // This doesn't works, because its unregister from current state not
+ // from target group
+ // add(new Provider<MenuItemDescriptor>() {
+ // @Override
+ // public MenuItemDescriptor get() {
+ // final MenuItemDescriptor item = new MenuItemDescriptor(unjoinAction);
+ // item.add(isLoggedCondition);
+ // item.add(isGroupCondition);
+ // return item;
+ // }
+ // });
+ }
}
Modified: trunk/src/main/java/cc/kune/core/client/ws/entheader/EntityHeaderPanel.java
===================================================================
--- trunk/src/main/java/cc/kune/core/client/ws/entheader/EntityHeaderPanel.java 2011-07-09 22:25:58 UTC (rev 1445)
+++ trunk/src/main/java/cc/kune/core/client/ws/entheader/EntityHeaderPanel.java 2011-07-10 18:29:52 UTC (rev 1446)
@@ -44,109 +44,116 @@
public class EntityHeaderPanel extends ViewImpl implements EntityHeaderView {
- private final Provider<FileDownloadUtils> downloadProvider;
- private final EntityTextLogo entityTextLogo;
- private final CoreResources images;
- private final HorizontalPanel mainPanel;
- private final ActionFlowPanel toolbar;
- private final VerticalPanel vpanel;
+ private final Provider<FileDownloadUtils> downloadProvider;
+ private final EntityTextLogo entityTextLogo;
+ private final CoreResources images;
+ private final HorizontalPanel mainPanel;
+ private final ActionFlowPanel toolbar;
+ private final VerticalPanel vpanel;
- @Inject
- public EntityHeaderPanel(final Provider<FileDownloadUtils> downloadProvider, final CoreResources images,
- final GuiProvider bindings, final GSpaceArmor armor) {
- mainPanel = new HorizontalPanel();
- mainPanel.setWidth("100%");
- this.downloadProvider = downloadProvider;
- this.images = images;
- vpanel = new VerticalPanel();
- vpanel.setWidth("100%");
- vpanel.setHorizontalAlignment(HorizontalPanel.ALIGN_RIGHT);
- entityTextLogo = new EntityTextLogo();
- mainPanel.add(entityTextLogo);
- toolbar = new ActionFlowPanel(bindings);
- vpanel.add(toolbar);
- mainPanel.add(vpanel);
- armor.getEntityHeader().add(mainPanel);
- }
+ @Inject
+ public EntityHeaderPanel(final Provider<FileDownloadUtils> downloadProvider,
+ final CoreResources images, final GuiProvider bindings, final GSpaceArmor armor,
+ final EntityTextLogo entityTextLogo) {
+ this.entityTextLogo = entityTextLogo;
+ mainPanel = new HorizontalPanel();
+ mainPanel.setWidth("100%");
+ this.downloadProvider = downloadProvider;
+ this.images = images;
+ vpanel = new VerticalPanel();
+ vpanel.setWidth("100%");
+ vpanel.setHorizontalAlignment(HorizontalPanel.ALIGN_RIGHT);
+ mainPanel.add(entityTextLogo);
+ toolbar = new ActionFlowPanel(bindings);
+ vpanel.add(toolbar);
+ mainPanel.add(vpanel);
+ armor.getEntityHeader().add(mainPanel);
+ }
- @Override
- public void addAction(final GuiActionDescrip descriptor) {
- toolbar.add(descriptor);
- }
+ @Override
+ public void addAction(final GuiActionDescrip descriptor) {
+ toolbar.add(descriptor);
+ }
- @Override
- public void addWidget(final IsWidget view) {
- final Widget widget = (Widget) view;
- vpanel.add(widget);
- }
+ @Override
+ public void addWidget(final IsWidget view) {
+ final Widget widget = (Widget) view;
+ vpanel.add(widget);
+ }
- @Override
- public Widget asWidget() {
- return mainPanel;
- }
+ @Override
+ public Widget asWidget() {
+ return mainPanel;
+ }
- @Override
- public void reloadImage(final GroupDTO group) {
- entityTextLogo.setLogoImage(downloadProvider.get().getLogoImageUrl(group.getStateToken()) + "&nocache="
- + new Date().getTime());
- }
+ private String getAvatarDecoratorParam(final GroupDTO group) {
+ return group.isPersonal() ? group.getShortName() : null;
+ }
- @Deprecated
- public void setFullLogo(final StateToken stateToken, final boolean clipped) {
- mainPanel.clear();
- final String imageUrl = downloadProvider.get().getImageUrl(stateToken);
- Image logo;
- if (clipped) {
- logo = new Image(imageUrl, 0, 0, FileConstants.LOGO_DEF_WIDTH, FileConstants.LOGO_DEF_HEIGHT);
- } else {
- logo = new Image(imageUrl);
- logo.setWidth(String.valueOf(FileConstants.LOGO_DEF_WIDTH));
- logo.setHeight(String.valueOf(FileConstants.LOGO_DEF_HEIGHT));
- }
- mainPanel.add(logo);
- }
+ @Override
+ public void reloadImage(final GroupDTO group) {
+ entityTextLogo.setLogoImage(downloadProvider.get().getLogoImageUrl(group.getStateToken())
+ + "&nocache=" + new Date().getTime(), getAvatarDecoratorParam(group));
+ }
- @Override
- public void setLargeFont() {
- entityTextLogo.setLargeFont();
+ @Deprecated
+ public void setFullLogo(final StateToken stateToken, final boolean clipped) {
+ mainPanel.clear();
+ final String imageUrl = downloadProvider.get().getImageUrl(stateToken);
+ Image logo;
+ if (clipped) {
+ logo = new Image(imageUrl, 0, 0, FileConstants.LOGO_DEF_WIDTH, FileConstants.LOGO_DEF_HEIGHT);
+ } else {
+ logo = new Image(imageUrl);
+ logo.setWidth(String.valueOf(FileConstants.LOGO_DEF_WIDTH));
+ logo.setHeight(String.valueOf(FileConstants.LOGO_DEF_HEIGHT));
}
+ mainPanel.add(logo);
+ }
- @Override
- public void setLogoImage(final StateToken stateToken) {
- entityTextLogo.setLogoImage(downloadProvider.get().getLogoImageUrl(stateToken));
- }
+ @Override
+ public void setLargeFont() {
+ entityTextLogo.setLargeFont();
+ }
- @Override
- public void setLogoImageVisible(final boolean visible) {
- entityTextLogo.setLogoVisible(visible);
- }
+ @Override
+ public void setLogoImage(final GroupDTO group) {
+ entityTextLogo.setLogoImage(downloadProvider.get().getLogoImageUrl(group.getStateToken()),
+ getAvatarDecoratorParam(group));
+ }
- @Override
- public void setLogoText(final String groupName) {
- entityTextLogo.setLogoText(groupName);
- }
+ @Override
+ public void setLogoImageVisible(final boolean visible) {
+ entityTextLogo.setLogoVisible(visible);
+ }
- @Override
- public void setMediumFont() {
- entityTextLogo.setMediumFont();
- }
+ @Override
+ public void setLogoText(final String groupName) {
+ entityTextLogo.setLogoText(groupName);
+ }
- //
- // @Override
- // public void setTheme(final WsTheme oldTheme, final WsTheme newTheme) {
- // if (oldTheme != null) {
- // entityTextLogo.removeStyleDependentName(oldTheme.toString());
- // }
- // entityTextLogo.addStyleDependentName(newTheme.toString());
- // }
+ @Override
+ public void setMediumFont() {
+ entityTextLogo.setMediumFont();
+ }
- @Override
- public void setSmallFont() {
- entityTextLogo.setSmallFont();
- }
+ //
+ // @Override
+ // public void setTheme(final WsTheme oldTheme, final WsTheme newTheme) {
+ // if (oldTheme != null) {
+ // entityTextLogo.removeStyleDependentName(oldTheme.toString());
+ // }
+ // entityTextLogo.addStyleDependentName(newTheme.toString());
+ // }
- @Override
- public void showDefUserLogo() {
- entityTextLogo.setLogoImage(AbstractImagePrototype.create(images.unknown60()));
- }
+ @Override
+ public void setSmallFont() {
+ entityTextLogo.setSmallFont();
+ }
+
+ @Override
+ public void showDefUserLogo(final GroupDTO group) {
+ entityTextLogo.setLogoImage(AbstractImagePrototype.create(images.unknown60()),
+ getAvatarDecoratorParam(group));
+ }
}
Modified: trunk/src/main/java/cc/kune/core/client/ws/entheader/EntityHeaderPresenter.java
===================================================================
--- trunk/src/main/java/cc/kune/core/client/ws/entheader/EntityHeaderPresenter.java 2011-07-09 22:25:58 UTC (rev 1445)
+++ trunk/src/main/java/cc/kune/core/client/ws/entheader/EntityHeaderPresenter.java 2011-07-10 18:29:52 UTC (rev 1446)
@@ -24,7 +24,6 @@
import cc.kune.core.client.state.GroupChangedEvent.GroupChangedHandler;
import cc.kune.core.client.state.Session;
import cc.kune.core.client.state.StateManager;
-import cc.kune.core.shared.domain.utils.StateToken;
import cc.kune.core.shared.dto.GroupDTO;
import cc.kune.gspace.client.options.logo.CurrentLogoChangedEvent;
import cc.kune.gspace.client.options.logo.CurrentLogoChangedEvent.CurrentLogoChangedHandler;
@@ -54,7 +53,7 @@
void setLargeFont();
- void setLogoImage(StateToken stateToken);
+ void setLogoImage(GroupDTO group);
void setLogoImageVisible(boolean visible);
@@ -66,7 +65,7 @@
// void setTheme(final WsTheme oldTheme, WsTheme newTheme);
- void showDefUserLogo();
+ void showDefUserLogo(GroupDTO group);
}
private static final int LARGE_NAME_LIMIT = 17;
@@ -126,12 +125,12 @@
void setGroupLogo(final GroupDTO group) {
if (group.hasLogo()) {
setLogoText(group.getLongName());
- getView().setLogoImage(group.getStateToken());
+ getView().setLogoImage(group);
getView().setLogoImageVisible(true);
} else {
setLogoText(group.getLongName());
if (group.isPersonal()) {
- getView().showDefUserLogo();
+ getView().showDefUserLogo(group);
getView().setLogoImageVisible(true);
} else {
getView().setLogoImageVisible(false);
Modified: trunk/src/main/java/cc/kune/core/client/ws/entheader/EntityTextLogo.java
===================================================================
--- trunk/src/main/java/cc/kune/core/client/ws/entheader/EntityTextLogo.java 2011-07-09 22:25:58 UTC (rev 1445)
+++ trunk/src/main/java/cc/kune/core/client/ws/entheader/EntityTextLogo.java 2011-07-10 18:29:52 UTC (rev 1446)
@@ -19,11 +19,15 @@
*/
package cc.kune.core.client.ws.entheader;
+import cc.kune.core.client.avatar.MediumAvatarDecorator;
+
import com.google.gwt.user.client.ui.AbstractImagePrototype;
import com.google.gwt.user.client.ui.HorizontalPanel;
import com.google.gwt.user.client.ui.Image;
import com.google.gwt.user.client.ui.Label;
import com.google.gwt.user.client.ui.VerticalPanel;
+import com.google.gwt.user.client.ui.Widget;
+import com.google.inject.Inject;
public class EntityTextLogo extends VerticalPanel {
@@ -34,16 +38,20 @@
private static final String LOGO_MEDIUM_FONT_STYLE = "k-elogo-l-m";
public static final String LOGO_NAME = "k-elogop-ln";
private static final String LOGO_SMALL_FONT_STYLE = "k-elogo-l-s";
+ private final MediumAvatarDecorator avatarDecorator;
private final Image logoImage;
private final Label logoLabel;
- public EntityTextLogo() {
+ @Inject
+ public EntityTextLogo(final MediumAvatarDecorator avatarDecorator) {
// Initialize
super();
+ this.avatarDecorator = avatarDecorator;
final HorizontalPanel generalHP = new HorizontalPanel();
final VerticalPanel logoTextVP = new VerticalPanel();
logoImage = new Image();
logoLabel = new Label();
+ avatarDecorator.setWidget(logoImage);
final Label expandCell = new Label("");
logoImage.ensureDebugId(LOGO_IMAGE);
@@ -51,7 +59,7 @@
// Layout
add(generalHP);
- generalHP.add(logoImage);
+ generalHP.add((Widget) avatarDecorator);
generalHP.add(logoTextVP);
logoTextVP.add(logoLabel);
@@ -84,14 +92,16 @@
logoLabel.addStyleName(LOGO_LARGE_FONT_STYLE);
}
- public void setLogoImage(final AbstractImagePrototype imageProto) {
+ public void setLogoImage(final AbstractImagePrototype imageProto, final String groupName) {
imageProto.applyTo(logoImage);
+ avatarDecorator.setItem(groupName);
}
- public void setLogoImage(final String url) {
+ public void setLogoImage(final String url, final String groupName) {
logoImage.setUrl("images/clear.gif");
Image.prefetch(url);
logoImage.setUrl(url);
+ avatarDecorator.setItem(groupName);
}
public void setLogoText(final String text) {
@@ -104,6 +114,7 @@
public void setLogoVisible(final boolean visible) {
logoImage.setVisible(visible);
+ avatarDecorator.setDecoratorVisible(visible);
}
public void setMediumFont() {
Modified: trunk/src/main/java/cc/kune/gspace/client/viewers/FolderViewerPresenter.java
===================================================================
--- trunk/src/main/java/cc/kune/gspace/client/viewers/FolderViewerPresenter.java 2011-07-09 22:25:58 UTC (rev 1445)
+++ trunk/src/main/java/cc/kune/gspace/client/viewers/FolderViewerPresenter.java 2011-07-10 18:29:52 UTC (rev 1446)
@@ -81,8 +81,6 @@
void attach();
- void highlightTitle();
-
void clear();
void detach();
@@ -91,6 +89,8 @@
HasEditHandler getEditTitle();
+ void highlightTitle();
+
void setActions(GuiActionDescCollection actions);
void setContainer(StateContainerDTO state);
@@ -176,10 +176,6 @@
}
}
- public void highlightTitle() {
- getView().highlightTitle();
- }
-
String calculateStyle(final int pos, final int length) {
if (length == 1) {
return CSSBTN;
@@ -205,6 +201,7 @@
}
// Other contents (docs, etc)
for (final ContentSimpleDTO content : container.getContents()) {
+ assert content != null;
addItem(content, content.getMimeType(), content.getStatus(),
content.getStateToken().copy().clearDocument(), content.getRights(), content.getModifiedOn());
}
@@ -284,6 +281,10 @@
}
}
+ public void highlightTitle() {
+ getView().highlightTitle();
+ }
+
public void refreshState() {
setContent((HasContent) session.getCurrentState());
}
Modified: trunk/src/main/java/cc/kune/wave/client/WaveStatusIndicator.java
===================================================================
--- trunk/src/main/java/cc/kune/wave/client/WaveStatusIndicator.java 2011-07-09 22:25:58 UTC (rev 1445)
+++ trunk/src/main/java/cc/kune/wave/client/WaveStatusIndicator.java 2011-07-10 18:29:52 UTC (rev 1446)
@@ -45,7 +45,7 @@
super(session, true);
ClientEvents.get().addNetworkStatusEventHandler(new NetworkStatusEventHandler() {
private void goOnline() {
- putValue(Action.NAME, i18n.t("Online"));
+ putValue(Action.NAME, ""); // i18n.t("Online"));
putValue(AbstractAction.STYLES, "k-sitebar-wave-status, k-sitebar-wave-status-online");
NotifyUser.hideProgress();
}
1
0
r1445 - in trunk: . src/main/java/cc/kune/core/client/sitebar/spaces
by Vicente J. Ruiz Jurado 09 Jul '11
by Vicente J. Ruiz Jurado 09 Jul '11
09 Jul '11
Author: vjrj_
Date: 2011-07-10 00:25:58 +0200 (Sun, 10 Jul 2011)
New Revision: 1445
Modified:
trunk/.classpath
trunk/pom.xml
trunk/src/main/java/cc/kune/core/client/sitebar/spaces/SpaceSelectorPresenter.java
Log:
Closed issue #44 (SpaceSelector clicked twice) and #47 (updated to Guice 3.0)
Modified: trunk/.classpath
===================================================================
--- trunk/.classpath 2011-07-09 21:39:54 UTC (rev 1444)
+++ trunk/.classpath 2011-07-09 22:25:58 UTC (rev 1445)
@@ -44,10 +44,10 @@
<classpathentry kind="var" path="M2_REPO/net/sf/ezmorph/ezmorph/1.0.3/ezmorph-1.0.3.jar" sourcepath="M2_REPO/net/sf/ezmorph/ezmorph/1.0.3/ezmorph-1.0.3-sources.jar"/>
<classpathentry kind="var" path="M2_REPO/freemarker/freemarker/2.3.8/freemarker-2.3.8.jar"/>
<classpathentry kind="var" path="M2_REPO/com/google/guava/guava-gwt/r09/guava-gwt-r09.jar"/>
- <classpathentry kind="var" path="M2_REPO/com/google/inject/guice/3.0-rc2/guice-3.0-rc2.jar" sourcepath="M2_REPO/com/google/inject/guice/3.0-rc2/guice-3.0-rc2-sources.jar"/>
+ <classpathentry kind="var" path="M2_REPO/com/google/inject/guice/3.0/guice-3.0.jar" sourcepath="M2_REPO/com/google/inject/guice/3.0/guice-3.0-sources.jar"/>
<classpathentry kind="var" path="M2_REPO/com/google/inject/extensions/guice-assisted-inject/2.0/guice-assisted-inject-2.0.jar"/>
- <classpathentry kind="var" path="M2_REPO/com/google/inject/extensions/guice-persist/3.0-rc2/guice-persist-3.0-rc2.jar" sourcepath="M2_REPO/com/google/inject/extensions/guice-persist/3.0-rc2/guice-persist-3.0-rc2-sources.jar"/>
- <classpathentry kind="var" path="M2_REPO/com/google/inject/extensions/guice-servlet/3.0-rc2/guice-servlet-3.0-rc2.jar" sourcepath="M2_REPO/com/google/inject/extensions/guice-servlet/3.0-rc2/guice-servlet-3.0-rc2-sources.jar"/>
+ <classpathentry kind="var" path="M2_REPO/com/google/inject/extensions/guice-persist/3.0/guice-persist-3.0.jar" sourcepath="M2_REPO/com/google/inject/extensions/guice-persist/3.0/guice-persist-3.0-sources.jar"/>
+ <classpathentry kind="var" path="M2_REPO/com/google/inject/extensions/guice-servlet/3.0/guice-servlet-3.0.jar" sourcepath="M2_REPO/com/google/inject/extensions/guice-servlet/3.0/guice-servlet-3.0-sources.jar"/>
<classpathentry kind="var" path="M2_REPO/org/adamtacy/gwt-fx/r464/gwt-fx-r464.jar"/>
<classpathentry kind="var" path="M2_REPO/com/google/gwt/gwt-gin/1.0-r137/gwt-gin-1.0-r137.jar"/>
<classpathentry kind="var" path="M2_REPO/com/allen_sauer/gwt/log/gwt-log/gwt-log/3.0.1/gwt-log-3.0.1.jar"/>
Modified: trunk/pom.xml
===================================================================
--- trunk/pom.xml 2011-07-09 21:39:54 UTC (rev 1444)
+++ trunk/pom.xml 2011-07-09 22:25:58 UTC (rev 1445)
@@ -213,19 +213,19 @@
<groupId>com.google.inject</groupId>
<artifactId>guice</artifactId>
<!-- <version>2.1-SNAPSHOT-r1160</version> -->
- <version>3.0-rc2</version>
+ <version>3.0</version>
</dependency>
<!-- <dependency> <groupId>com.googlecode.gwt.inject</groupId> <artifactId>gin</artifactId>
<version>gin-1.1-SNAPSHOT</version> </dependency> -->
<dependency>
<groupId>com.google.inject.extensions</groupId>
<artifactId>guice-servlet</artifactId>
- <version>3.0-rc2</version>
+ <version>3.0</version>
</dependency>
<dependency>
<groupId>com.google.inject.extensions</groupId>
<artifactId>guice-persist</artifactId>
- <version>3.0-rc2</version>
+ <version>3.0</version>
</dependency>
<dependency>
<groupId>com.extjs</groupId>
Modified: trunk/src/main/java/cc/kune/core/client/sitebar/spaces/SpaceSelectorPresenter.java
===================================================================
--- trunk/src/main/java/cc/kune/core/client/sitebar/spaces/SpaceSelectorPresenter.java 2011-07-09 21:39:54 UTC (rev 1444)
+++ trunk/src/main/java/cc/kune/core/client/sitebar/spaces/SpaceSelectorPresenter.java 2011-07-09 22:25:58 UTC (rev 1445)
@@ -114,24 +114,28 @@
@Override
public void onClick(final ClickEvent event) {
stateManager.gotoHistoryToken(homeToken);
+ setDown(Space.homeSpace);
}
});
view.getUserBtn().addClickHandler(new ClickHandler() {
@Override
public void onClick(final ClickEvent event) {
stateManager.gotoHistoryToken(userToken);
+ setDown(Space.userSpace);
}
});
view.getGroupBtn().addClickHandler(new ClickHandler() {
@Override
public void onClick(final ClickEvent event) {
stateManager.gotoHistoryToken(groupToken);
+ setDown(Space.groupSpace);
}
});
view.getPublicBtn().addClickHandler(new ClickHandler() {
@Override
public void onClick(final ClickEvent event) {
stateManager.gotoHistoryToken(publicToken);
+ setDown(Space.publicSpace);
}
});
eventBus.addHandler(WindowFocusEvent.getType(), new WindowFocusEvent.WindowFocusHandler() {
@@ -152,30 +156,21 @@
private void onGroupSpaceSelect() {
armor.selectGroupSpace();
backManager.restoreBackImage();
- getView().setHomeBtnDown(false);
- getView().setUserBtnDown(false);
- getView().setGroupBtnDown(true);
- getView().setPublicBtnDown(false);
+ setDown(Space.groupSpace);
currentSpace = Space.groupSpace;
}
private void onHomeSpaceSelect() {
armor.selectHomeSpace();
backManager.clearBackImage();
- getView().setHomeBtnDown(true);
- getView().setUserBtnDown(false);
- getView().setGroupBtnDown(false);
- getView().setPublicBtnDown(false);
+ setDown(Space.homeSpace);
currentSpace = Space.homeSpace;
}
private void onPublicSpaceSelect() {
armor.selectPublicSpace();
backManager.restoreBackImage();
- getView().setHomeBtnDown(false);
- getView().setUserBtnDown(false);
- getView().setGroupBtnDown(false);
- getView().setPublicBtnDown(true);
+ setDown(Space.publicSpace);
currentSpace = Space.publicSpace;
}
@@ -234,10 +229,7 @@
if (session.isLogged()) {
armor.selectUserSpace();
backManager.clearBackImage();
- getView().setHomeBtnDown(false);
- getView().setUserBtnDown(true);
- getView().setGroupBtnDown(false);
- getView().setPublicBtnDown(false);
+ setDown(Space.userSpace);
currentSpace = Space.userSpace;
} else {
signIn.get().setErrorMessage(i18n.t("Sign in or create an account to access to your inbox"),
@@ -252,6 +244,13 @@
RevealRootContentEvent.fire(this, this);
}
+ private void setDown(final Space space) {
+ getView().setHomeBtnDown(space.equals(Space.homeSpace));
+ getView().setUserBtnDown(space.equals(Space.userSpace));
+ getView().setGroupBtnDown(space.equals(Space.groupSpace));
+ getView().setPublicBtnDown(space.equals(Space.publicSpace));
+ }
+
private void showTooltipNow() {
if (currentSpace != null) {
switch (currentSpace) {
1
0
r1444 - in trunk/src/main/java/cc/kune: common/client/tooltip core/client/groups/newgroup core/client/sitebar/spaces core/client/ui core/client/ws/entheader core/public
by Vicente J. Ruiz Jurado 09 Jul '11
by Vicente J. Ruiz Jurado 09 Jul '11
09 Jul '11
Author: vjrj_
Date: 2011-07-09 23:39:54 +0200 (Sat, 09 Jul 2011)
New Revision: 1444
Modified:
trunk/src/main/java/cc/kune/common/client/tooltip/Tooltip.java
trunk/src/main/java/cc/kune/core/client/groups/newgroup/NewGroupPanel.java
trunk/src/main/java/cc/kune/core/client/sitebar/spaces/SpaceSelectorViewImpl.java
trunk/src/main/java/cc/kune/core/client/ui/DefaultFormUtils.java
trunk/src/main/java/cc/kune/core/client/ws/entheader/EntityHeaderPresenter.java
trunk/src/main/java/cc/kune/core/public/ws.css
Log:
Some fixes/improvements in tooltips, new group creation...
Modified: trunk/src/main/java/cc/kune/common/client/tooltip/Tooltip.java
===================================================================
--- trunk/src/main/java/cc/kune/common/client/tooltip/Tooltip.java 2011-07-09 20:52:00 UTC (rev 1443)
+++ trunk/src/main/java/cc/kune/common/client/tooltip/Tooltip.java 2011-07-09 21:39:54 UTC (rev 1444)
@@ -50,6 +50,8 @@
private static TooltipUiBinder uiBinder = GWT.create(TooltipUiBinder.class);
+ private static final int WIDTH_NOT_DEFINED = -1;
+
public static Tooltip to(final Widget widget, final String text) {
if (TextUtils.notEmpty(text)) {
final Tooltip tip = new Tooltip();
@@ -80,6 +82,7 @@
InlineLabel title;
@UiField
HTMLPanel tooltip;
+ private int width = WIDTH_NOT_DEFINED;
public Tooltip() {
super.add(uiBinder.createAndBindUi(this));
@@ -129,6 +132,10 @@
content.add(new Label(text));
}
+ public void setWidth(final int width) {
+ this.width = width;
+ }
+
@Override
public void show() {
if (!Tooltip.this.isShowing() && ofWidget.isVisible()) {
@@ -137,7 +144,9 @@
Window.getClientHeight(), ofWidget.getAbsoluteLeft(), ofWidget.getAbsoluteTop(),
ofWidget.getOffsetWidth(), ofWidget.getOffsetHeight(), Tooltip.this.getWidth(),
Tooltip.this.getHeight()));
- if (tooltip.getOffsetWidth() > 430) {
+ if (width != WIDTH_NOT_DEFINED) {
+ tooltip.getElement().getStyle().setWidth(width, Unit.PX);
+ } else if (tooltip.getOffsetWidth() > 430) {
tooltip.getElement().getStyle().setWidth(430, Unit.PX);
} else {
tooltip.getElement().getStyle().clearWidth();
Modified: trunk/src/main/java/cc/kune/core/client/groups/newgroup/NewGroupPanel.java
===================================================================
--- trunk/src/main/java/cc/kune/core/client/groups/newgroup/NewGroupPanel.java 2011-07-09 20:52:00 UTC (rev 1443)
+++ trunk/src/main/java/cc/kune/core/client/groups/newgroup/NewGroupPanel.java 2011-07-09 21:39:54 UTC (rev 1444)
@@ -133,7 +133,7 @@
shortNameField.setName(SHORTNAME_FIELD);
shortNameField.setWidth(175);
shortNameField.setMinLength(3);
- shortNameField.setMaxLength(15);
+ shortNameField.setMaxLength(15); /* Same in Group.java/shortName */
shortNameField.setAllowBlank(false);
shortNameField.setRegex("^[a-z0-9]+$");
shortNameField.getMessages().setMinLengthText(i18n.t(CoreMessages.FIELD_MUST_BE_BETWEEN_3_AND_15));
@@ -150,7 +150,7 @@
longNameField.setWidth(BIG_FIELD_WIDTH);
longNameField.setAllowBlank(false);
longNameField.setMinLength(3);
- longNameField.setMaxLength(50);
+ longNameField.setMaxLength(50); /* Same in Group.java/longName */
longNameField.setValidationDelay(1000);
form.add(longNameField);
Modified: trunk/src/main/java/cc/kune/core/client/sitebar/spaces/SpaceSelectorViewImpl.java
===================================================================
--- trunk/src/main/java/cc/kune/core/client/sitebar/spaces/SpaceSelectorViewImpl.java 2011-07-09 20:52:00 UTC (rev 1443)
+++ trunk/src/main/java/cc/kune/core/client/sitebar/spaces/SpaceSelectorViewImpl.java 2011-07-09 21:39:54 UTC (rev 1444)
@@ -68,6 +68,10 @@
publicSpaceTooltip = Tooltip.to(publicButton,
i18n.t("Public space: In this space you can see a preview of how the Personal o"
+ "r Group Space looks like on the web, outside this site"));
+ // homeSpaceTooltip.setWidth(0);
+ userSpaceTooltip.setWidth(190);
+ groupSpaceTooltip.setWidth(170);
+ publicSpaceTooltip.setWidth(150);
}
@Override
@@ -115,18 +119,22 @@
userButton.setDown(down);
}
+ @Override
public void showGroupSpaceTooltip() {
groupSpaceTooltip.showTemporally();
}
+ @Override
public void showHomeSpaceTooltip() {
homeSpaceTooltip.showTemporally();
}
+ @Override
public void showPublicSpaceTooltip() {
publicSpaceTooltip.showTemporally();
}
+ @Override
public void showUserSpaceTooltip() {
userSpaceTooltip.showTemporally();
}
Modified: trunk/src/main/java/cc/kune/core/client/ui/DefaultFormUtils.java
===================================================================
--- trunk/src/main/java/cc/kune/core/client/ui/DefaultFormUtils.java 2011-07-09 20:52:00 UTC (rev 1443)
+++ trunk/src/main/java/cc/kune/core/client/ui/DefaultFormUtils.java 2011-07-09 21:39:54 UTC (rev 1444)
@@ -43,6 +43,7 @@
public void handleEvent(final BaseEvent be) {
if (radioTip != null && tooltip == null) {
tooltip = Tooltip.to(radio, radioTip);
+ tooltip.setWidth(300);
tooltip.show();
tooltip.hide();
}
Modified: trunk/src/main/java/cc/kune/core/client/ws/entheader/EntityHeaderPresenter.java
===================================================================
--- trunk/src/main/java/cc/kune/core/client/ws/entheader/EntityHeaderPresenter.java 2011-07-09 20:52:00 UTC (rev 1443)
+++ trunk/src/main/java/cc/kune/core/client/ws/entheader/EntityHeaderPresenter.java 2011-07-09 21:39:54 UTC (rev 1444)
@@ -70,7 +70,7 @@
}
private static final int LARGE_NAME_LIMIT = 17;
- private static final int MEDIUM_NAME_LIMIT = 90;
+ private static final int MEDIUM_NAME_LIMIT = 80;
private final Session session;
@Inject
Modified: trunk/src/main/java/cc/kune/core/public/ws.css
===================================================================
--- trunk/src/main/java/cc/kune/core/public/ws.css 2011-07-09 20:52:00 UTC (rev 1443)
+++ trunk/src/main/java/cc/kune/core/public/ws.css 2011-07-09 21:39:54 UTC (rev 1444)
@@ -1,4 +1,4 @@
-CHARSET "UTF-8 "; body {
+CHARSET "UTF-8 "; body {
background-color: transparent;
color: black;
font-family: 'Ubuntu', Arial;
@@ -1065,13 +1065,17 @@
.k-elogo-l-l {
font-size: 46px;
+ line-height: 1em;
}
.k-elogo-l-m {
- font-size: 167%;
+ /* Right now the limit of size is 50 chars see EntityHeaderPresenter */
+ font-size: 181%;
+ line-height: 1.2em;
}
.k-elogo-l-s {
+ /* Not used because the limit is 50 chars (see Group.java) */
font-size: 108%;
}
@@ -1202,7 +1206,7 @@
-webkit-border-bottom-left-radius: 5px;
-moz-border-radius-bottomleft: 5px;
border-bottom-left-radius: 5px;
- kfilter: alpha(opacity = 90);
+ kfilter: alpha(opacity = 90);
-moz-opacity: 0.90;
-khtml-opacity: 0.90;
opacity: 0.90;
1
0
Author: vjrj_
Date: 2011-07-09 22:52:00 +0200 (Sat, 09 Jul 2011)
New Revision: 1443
Modified:
trunk/src/main/java/cc/kune/common/client/tooltip/Tooltip.java
trunk/src/main/java/cc/kune/common/client/ui/EditableLabel.java
trunk/src/main/java/cc/kune/common/client/ui/MaskWidget.java
trunk/src/main/java/cc/kune/common/client/ui/MaskWidgetView.java
trunk/src/main/java/cc/kune/core/client/errors/ErrorHandler.java
trunk/src/main/java/cc/kune/core/client/groups/newgroup/NewGroupPanel.java
trunk/src/main/java/cc/kune/core/client/groups/newgroup/NewGroupPresenter.java
trunk/src/main/java/cc/kune/core/client/groups/newgroup/NewGroupView.java
trunk/src/main/java/cc/kune/core/client/sitebar/spaces/SpaceSelectorPresenter.java
trunk/src/main/java/cc/kune/core/client/sn/actions/registry/GroupSNConfActions.java
trunk/src/main/java/cc/kune/core/client/ui/DefaultFormUtils.java
trunk/src/main/java/cc/kune/core/server/manager/impl/GroupManagerDefault.java
trunk/src/main/java/cc/kune/core/server/manager/impl/SocialNetworkManagerDefault.java
trunk/src/main/java/cc/kune/core/shared/dto/GroupType.java
trunk/src/main/java/cc/kune/gspace/client/actions/NewContainerBtn.java
trunk/src/main/java/cc/kune/gspace/client/actions/NewContainerMenuItem.java
trunk/src/main/java/cc/kune/gspace/client/viewers/AbstractFolderViewerPanel.java
trunk/src/main/java/cc/kune/gspace/client/viewers/ContentTitleWidget.java
trunk/src/main/java/cc/kune/gspace/client/viewers/ContentViewerPanel.java
trunk/src/main/java/cc/kune/gspace/client/viewers/FolderViewerPresenter.java
trunk/src/main/webapp/others/kune-client-actions.xml
trunk/src/test/java/cc/kune/core/server/integration/kuneservice/GroupServiceTest.java
Log:
Closed groups; Rename title tooltip; Tooltip fixed
Modified: trunk/src/main/java/cc/kune/common/client/tooltip/Tooltip.java
===================================================================
--- trunk/src/main/java/cc/kune/common/client/tooltip/Tooltip.java 2011-07-09 16:44:34 UTC (rev 1442)
+++ trunk/src/main/java/cc/kune/common/client/tooltip/Tooltip.java 2011-07-09 20:52:00 UTC (rev 1443)
@@ -176,6 +176,7 @@
}
public void showTemporally() {
+ show();
timers.showTemporally();
}
Modified: trunk/src/main/java/cc/kune/common/client/ui/EditableLabel.java
===================================================================
--- trunk/src/main/java/cc/kune/common/client/ui/EditableLabel.java 2011-07-09 16:44:34 UTC (rev 1442)
+++ trunk/src/main/java/cc/kune/common/client/ui/EditableLabel.java 2011-07-09 20:52:00 UTC (rev 1443)
@@ -53,13 +53,15 @@
InlineLabel label;
@UiField
TextBox textbox;
- private String tooltip;
+ private Tooltip tooltip;
+ private String tooltipText;
+
public EditableLabel() {
initWidget(uiBinder.createAndBindUi(this));
label.setStylePrimaryName("k-editableLabel");
editable = false;
- tooltip = "";
+ tooltipText = "";
}
@Override
@@ -67,32 +69,6 @@
return addHandler(handler, EditEvent.getType());
}
- public void blink() {
- if (editable) {
- blinkTimer(true, new SimpleCallback() {
- @Override
- public void onCallback() {
- blinkTimer(false, new SimpleCallback() {
- @Override
- public void onCallback() {
- blinkTimer(true, new SimpleCallback() {
- @Override
- public void onCallback() {
- blinkTimer(false, new SimpleCallback() {
- @Override
- public void onCallback() {
- // nothing
- }
- });
- }
- });
- }
- });
- }
- });
- }
- }
-
private void blinkTimer(final boolean add, final SimpleCallback callback) {
new Timer() {
@Override
@@ -130,6 +106,32 @@
}
}
+ public void highlightTitle() {
+ if (editable) {
+ blinkTimer(true, new SimpleCallback() {
+ @Override
+ public void onCallback() {
+ blinkTimer(false, new SimpleCallback() {
+ @Override
+ public void onCallback() {
+ blinkTimer(true, new SimpleCallback() {
+ @Override
+ public void onCallback() {
+ blinkTimer(false, new SimpleCallback() {
+ @Override
+ public void onCallback() {
+ tooltip.showTemporally();
+ }
+ });
+ }
+ });
+ }
+ });
+ }
+ });
+ }
+ }
+
@UiHandler("textbox")
void onBlur(final BlurEvent event) {
finishEdit();
@@ -156,7 +158,7 @@
public void setEditable(final boolean editable) {
this.editable = editable;
- Tooltip.to(label, editable ? tooltip : "");
+ tooltip = Tooltip.to(label, editable ? tooltipText : "");
}
public void setText(final String text) {
@@ -165,7 +167,7 @@
}
public void setTooltip(final String tooltip) {
- this.tooltip = tooltip;
+ this.tooltipText = tooltip;
}
}
Modified: trunk/src/main/java/cc/kune/common/client/ui/MaskWidget.java
===================================================================
--- trunk/src/main/java/cc/kune/common/client/ui/MaskWidget.java 2011-07-09 16:44:34 UTC (rev 1442)
+++ trunk/src/main/java/cc/kune/common/client/ui/MaskWidget.java 2011-07-09 20:52:00 UTC (rev 1443)
@@ -35,53 +35,58 @@
public class MaskWidget extends PopupPanel implements MaskWidgetView {
- interface MaskWidgetUiBinder extends UiBinder<Widget, MaskWidget> {
- }
- private static MaskWidgetUiBinder uiBinder = GWT.create(MaskWidgetUiBinder.class);
- @UiField
- FlowPanel flow;
- @UiField
- Image icon;
- @UiField
- Label label;
+ interface MaskWidgetUiBinder extends UiBinder<Widget, MaskWidget> {
+ }
+ private static MaskWidgetUiBinder uiBinder = GWT.create(MaskWidgetUiBinder.class);
+ @UiField
+ FlowPanel flow;
+ @UiField
+ Image icon;
+ @UiField
+ Label label;
- @UiField
- SimplePanel mainPanel;
+ @UiField
+ SimplePanel mainPanel;
- public MaskWidget() {
- super(false, false);
- add(uiBinder.createAndBindUi(this));
- setStyleName("k-mask");
- }
+ public MaskWidget() {
+ super(false, false);
+ add(uiBinder.createAndBindUi(this));
+ setStyleName("k-mask");
+ }
- @Override
- @Nonnull
- public void mask(final IsWidget widget) {
- mask(widget, "");
- }
+ @Override
+ public boolean isShowing() {
+ return super.isShowing();
+ }
- @Override
- @Nonnull
- public void mask(final IsWidget widget, final String message) {
- label.setText(message);
- setPopupPositionAndShow(new PositionCallback() {
- @Override
- public void setPosition(final int offsetWidth, final int offsetHeight) {
- final Widget asWidget = widget.asWidget();
- final int w = asWidget.getOffsetWidth();
- final int h = asWidget.getOffsetHeight();
- MaskWidget.this.setPopupPosition(asWidget.getAbsoluteLeft(), asWidget.getAbsoluteTop());
- getElement().getStyle().setWidth(w, Unit.PX);
- getElement().getStyle().setHeight(h, Unit.PX);
- flow.getElement().getStyle().setTop((h - flow.getOffsetHeight()) / 2d, Unit.PX);
- flow.getElement().getStyle().setLeft((w - flow.getOffsetWidth()) / 2d, Unit.PX);
- }
- });
- }
+ @Override
+ @Nonnull
+ public void mask(final IsWidget widget) {
+ mask(widget, "");
+ }
- @Override
- public void unMask() {
- hide();
- }
+ @Override
+ @Nonnull
+ public void mask(final IsWidget widget, final String message) {
+ label.setText(message);
+ setPopupPositionAndShow(new PositionCallback() {
+ @Override
+ public void setPosition(final int offsetWidth, final int offsetHeight) {
+ final Widget asWidget = widget.asWidget();
+ final int w = asWidget.getOffsetWidth();
+ final int h = asWidget.getOffsetHeight();
+ MaskWidget.this.setPopupPosition(asWidget.getAbsoluteLeft(), asWidget.getAbsoluteTop());
+ getElement().getStyle().setWidth(w, Unit.PX);
+ getElement().getStyle().setHeight(h, Unit.PX);
+ flow.getElement().getStyle().setTop((h - flow.getOffsetHeight()) / 2d, Unit.PX);
+ flow.getElement().getStyle().setLeft((w - flow.getOffsetWidth()) / 2d, Unit.PX);
+ }
+ });
+ }
+ @Override
+ public void unMask() {
+ hide();
+ }
+
}
Modified: trunk/src/main/java/cc/kune/common/client/ui/MaskWidgetView.java
===================================================================
--- trunk/src/main/java/cc/kune/common/client/ui/MaskWidgetView.java 2011-07-09 16:44:34 UTC (rev 1442)
+++ trunk/src/main/java/cc/kune/common/client/ui/MaskWidgetView.java 2011-07-09 20:52:00 UTC (rev 1443)
@@ -23,10 +23,12 @@
public interface MaskWidgetView {
- void mask(IsWidget widget);
+ boolean isShowing();
- void mask(IsWidget widget, String message);
+ void mask(IsWidget widget);
- void unMask();
+ void mask(IsWidget widget, String message);
+ void unMask();
+
}
Modified: trunk/src/main/java/cc/kune/core/client/errors/ErrorHandler.java
===================================================================
--- trunk/src/main/java/cc/kune/core/client/errors/ErrorHandler.java 2011-07-09 16:44:34 UTC (rev 1442)
+++ trunk/src/main/java/cc/kune/core/client/errors/ErrorHandler.java 2011-07-09 20:52:00 UTC (rev 1443)
@@ -81,6 +81,7 @@
logException(caught);
eventBus.fireEvent(new UserNotifyEvent(NotifyLevel.error,
i18n.t("You do not have rights to perform that action")));
+ goHome();
} else if (caught instanceof SessionExpiredException) {
logException(caught);
doSessionExpired();
Modified: trunk/src/main/java/cc/kune/core/client/groups/newgroup/NewGroupPanel.java
===================================================================
--- trunk/src/main/java/cc/kune/core/client/groups/newgroup/NewGroupPanel.java 2011-07-09 16:44:34 UTC (rev 1442)
+++ trunk/src/main/java/cc/kune/core/client/groups/newgroup/NewGroupPanel.java 2011-07-09 20:52:00 UTC (rev 1443)
@@ -46,6 +46,7 @@
public class NewGroupPanel extends ViewImpl implements NewGroupView {
private static final int BIG_FIELD_WIDTH = 280;
public static final String CANCEL_BUTTON = "k-ngp-cancel-bt";
+ public static final String CLOSED_GROUP_TYPE_ID = "k-ngp-type_of_group_closed";
public static final String COMM_GROUP_TYPE_ID = "k-ngp-type_of_group_comm";
public static final String ERROR_MSG_BAR = "k-ngp-error-mb";
private static final int LABEL_WIDTH = 100;
@@ -60,10 +61,11 @@
public static final String TAGS_FIELD = "k-ngp-tags";
public static final String TYPEOFGROUP_FIELD = "k-ngp-type_of_group";
+ private Radio closedRadio;
private Radio communityRadio;
private final BasicTopDialog dialog;
+
private final FormPanel form;
-
private final I18nTranslationService i18n;
private TextField<String> longNameField;
private final MaskWidgetView mask;
@@ -81,11 +83,11 @@
public NewGroupPanel(final I18nTranslationService i18n, final NotifyLevelImages img,
final MaskWidgetView mask) {
final Builder builder = new BasicTopDialog.Builder(NEWGROUP_WIZARD, false, true).autoscroll(true).height(
- "300px").title(i18n.t("Register a new group"));
+ "340px").title(i18n.t("Register a new group"));
builder.icon("k-newgroup-icon");
builder.firstButtonTitle(i18n.t("Register")).firstButtonId(REGISTER_BUTTON);
builder.sndButtonTitle(i18n.t("Cancel")).sndButtonId(CANCEL_BUTTON);
- builder.tabIndexStart(9);
+ builder.tabIndexStart(10);
dialog = builder.build();
this.i18n = i18n;
this.mask = mask;
@@ -195,12 +197,18 @@
+ "but organizations must be a legal entity."), ORG_GROUP_TYPE_ID);
orgRadio.setTabIndex(7);
+ closedRadio = DefaultFormUtils.createRadio(groupTypeFieldSet, i18n.t("Closed"), TYPEOFGROUP_FIELD,
+ i18n.t("Closed groups are social groups of persons "
+ + "like family, friends, buddies, etc, which are moderated to new members "
+ + "and with private contents (by default)"), CLOSED_GROUP_TYPE_ID);
+ closedRadio.setTabIndex(8);
+
communityRadio = DefaultFormUtils.createRadio(groupTypeFieldSet, i18n.t("Community"),
TYPEOFGROUP_FIELD, i18n.t("Communities are social groups of persons "
+ "with shared interests, which are open to new members "
+ "(for instance the environmental community or the LGBT community). "
+ "They rarely are a legal entity."), COMM_GROUP_TYPE_ID);
- communityRadio.setTabIndex(8);
+ communityRadio.setTabIndex(9);
return form;
}
@@ -257,6 +265,11 @@
}
@Override
+ public boolean isClosed() {
+ return closedRadio.getValue();
+ }
+
+ @Override
public boolean isCommunity() {
return communityRadio.getValue();
}
Modified: trunk/src/main/java/cc/kune/core/client/groups/newgroup/NewGroupPresenter.java
===================================================================
--- trunk/src/main/java/cc/kune/core/client/groups/newgroup/NewGroupPresenter.java 2011-07-09 16:44:34 UTC (rev 1442)
+++ trunk/src/main/java/cc/kune/core/client/groups/newgroup/NewGroupPresenter.java 2011-07-09 20:52:00 UTC (rev 1443)
@@ -114,6 +114,8 @@
return GroupType.PROJECT;
} else if (getView().isOrganization()) {
return GroupType.ORGANIZATION;
+ } else if (getView().isClosed()) {
+ return GroupType.CLOSED;
} else {
return GroupType.COMMUNITY;
}
Modified: trunk/src/main/java/cc/kune/core/client/groups/newgroup/NewGroupView.java
===================================================================
--- trunk/src/main/java/cc/kune/core/client/groups/newgroup/NewGroupView.java 2011-07-09 16:44:34 UTC (rev 1442)
+++ trunk/src/main/java/cc/kune/core/client/groups/newgroup/NewGroupView.java 2011-07-09 20:52:00 UTC (rev 1443)
@@ -28,42 +28,44 @@
public interface NewGroupView extends View {
- void clearData();
+ void clearData();
- void focusOnShorName();
+ void focusOnShorName();
- HasCloseHandlers<PopupPanel> getClose();
+ HasCloseHandlers<PopupPanel> getClose();
- HasClickHandlers getFirstBtn();
+ HasClickHandlers getFirstBtn();
- String getLongName();
+ String getLongName();
- String getPublicDesc();
+ String getPublicDesc();
- HasClickHandlers getSecondBtn();
+ HasClickHandlers getSecondBtn();
- String getShortName();
+ String getShortName();
- String getTags();
+ String getTags();
- void hide();
+ void hide();
- void hideMessage();
+ void hideMessage();
- boolean isCommunity();
+ boolean isClosed();
- boolean isFormValid();
+ boolean isCommunity();
- boolean isOrganization();
+ boolean isFormValid();
- boolean isProject();
+ boolean isOrganization();
- void maskProcessing();
+ boolean isProject();
- void setMessage(String message, NotifyLevel level);
+ void maskProcessing();
- void show();
+ void setMessage(String message, NotifyLevel level);
- void unMask();
+ void show();
+ void unMask();
+
}
Modified: trunk/src/main/java/cc/kune/core/client/sitebar/spaces/SpaceSelectorPresenter.java
===================================================================
--- trunk/src/main/java/cc/kune/core/client/sitebar/spaces/SpaceSelectorPresenter.java 2011-07-09 16:44:34 UTC (rev 1442)
+++ trunk/src/main/java/cc/kune/core/client/sitebar/spaces/SpaceSelectorPresenter.java 2011-07-09 20:52:00 UTC (rev 1443)
@@ -20,6 +20,7 @@
package cc.kune.core.client.sitebar.spaces;
import cc.kune.common.client.notify.NotifyLevel;
+import cc.kune.common.client.ui.MaskWidgetView;
import cc.kune.core.client.auth.SignIn;
import cc.kune.core.client.events.WindowFocusEvent;
import cc.kune.core.client.init.AppStartEvent;
@@ -96,7 +97,7 @@
public SpaceSelectorPresenter(final EventBus eventBus, final StateManager stateManager,
final SpaceSelectorView view, final SpaceSelectorProxy proxy, final GSpaceArmor armor,
final Session session, final Provider<SignIn> signIn, final GSpaceBackManager backManager,
- final I18nTranslationService i18n) {
+ final I18nTranslationService i18n, final MaskWidgetView mask) {
super(eventBus, view, proxy);
this.stateManager = stateManager;
this.armor = armor;
@@ -136,7 +137,7 @@
eventBus.addHandler(WindowFocusEvent.getType(), new WindowFocusEvent.WindowFocusHandler() {
@Override
public void onWindowFocus(final WindowFocusEvent event) {
- if (event.isHasFocus()) {
+ if (event.isHasFocus() && !mask.isShowing()) {
showTooltipWithDelay();
}
}
@@ -252,19 +253,21 @@
}
private void showTooltipNow() {
- switch (currentSpace) {
- case homeSpace:
- getView().showHomeSpaceTooltip();
- break;
- case userSpace:
- getView().showUserSpaceTooltip();
- break;
- case groupSpace:
- getView().showGroupSpaceTooltip();
- break;
- case publicSpace:
- getView().showPublicSpaceTooltip();
- break;
+ if (currentSpace != null) {
+ switch (currentSpace) {
+ case homeSpace:
+ getView().showHomeSpaceTooltip();
+ break;
+ case userSpace:
+ getView().showUserSpaceTooltip();
+ break;
+ case groupSpace:
+ getView().showGroupSpaceTooltip();
+ break;
+ case publicSpace:
+ getView().showPublicSpaceTooltip();
+ break;
+ }
}
}
@@ -274,6 +277,6 @@
public void run() {
showTooltipNow();
}
- }.schedule(500);
+ }.schedule(200);
}
}
\ No newline at end of file
Modified: trunk/src/main/java/cc/kune/core/client/sn/actions/registry/GroupSNConfActions.java
===================================================================
--- trunk/src/main/java/cc/kune/core/client/sn/actions/registry/GroupSNConfActions.java 2011-07-09 16:44:34 UTC (rev 1442)
+++ trunk/src/main/java/cc/kune/core/client/sn/actions/registry/GroupSNConfActions.java 2011-07-09 20:52:00 UTC (rev 1443)
@@ -81,6 +81,7 @@
final MenuRadioItemDescriptor moderatedItem = membersModeration.get().withModeration(
AdmissionType.Moderated);
final MenuRadioItemDescriptor openItem = membersModeration.get().withModeration(AdmissionType.Open);
+
addImpl(OPTIONS_MENU);
addImpl(optionsTitle);
addImpl(VISIBILITY_SUBMENU.withText(i18n.t("Those who can view this member list")).withParent(
@@ -91,8 +92,7 @@
addImpl(onlyAdminsItem.withParent(VISIBILITY_SUBMENU).withText(i18n.t("only admins")));
addImpl(moderatedItem.withParent(MODERATION_SUBMENU).withText(i18n.t("moderate request to join")));
addImpl(openItem.withParent(MODERATION_SUBMENU).withText(i18n.t("auto accept request to join")));
- // add(closedItem.withParent(MODERATION_SUBMENU).withText(
- // i18n.t("closed for new members")));
+ addImpl(closedItem.withParent(MODERATION_SUBMENU).withText(i18n.t("closed for new members")));
final ButtonDescriptor joinBtn = new ButtonDescriptor(joinGroupAction);
final ButtonDescriptor unJoinBtn = new ButtonDescriptor(unJoinGroupAction);
Modified: trunk/src/main/java/cc/kune/core/client/ui/DefaultFormUtils.java
===================================================================
--- trunk/src/main/java/cc/kune/core/client/ui/DefaultFormUtils.java 2011-07-09 16:44:34 UTC (rev 1442)
+++ trunk/src/main/java/cc/kune/core/client/ui/DefaultFormUtils.java 2011-07-09 20:52:00 UTC (rev 1443)
@@ -21,6 +21,9 @@
import cc.kune.common.client.tooltip.Tooltip;
+import com.extjs.gxt.ui.client.event.BaseEvent;
+import com.extjs.gxt.ui.client.event.Events;
+import com.extjs.gxt.ui.client.event.Listener;
import com.extjs.gxt.ui.client.widget.form.FieldSet;
import com.extjs.gxt.ui.client.widget.form.Radio;
@@ -33,9 +36,18 @@
radio.setId(id);
fieldSet.add(radio);
- if (radioTip != null) {
- Tooltip.to(radio, radioTip);
- }
+ radio.addListener(Events.OnMouseOver, new Listener<BaseEvent>() {
+ private Tooltip tooltip;
+
+ @Override
+ public void handleEvent(final BaseEvent be) {
+ if (radioTip != null && tooltip == null) {
+ tooltip = Tooltip.to(radio, radioTip);
+ tooltip.show();
+ tooltip.hide();
+ }
+ }
+ });
radio.setBoxLabel(radioLabel);
return radio;
}
Modified: trunk/src/main/java/cc/kune/core/server/manager/impl/GroupManagerDefault.java
===================================================================
--- trunk/src/main/java/cc/kune/core/server/manager/impl/GroupManagerDefault.java 2011-07-09 16:44:34 UTC (rev 1442)
+++ trunk/src/main/java/cc/kune/core/server/manager/impl/GroupManagerDefault.java 2011-07-09 20:52:00 UTC (rev 1443)
@@ -47,6 +47,7 @@
import cc.kune.core.shared.SearcherConstants;
import cc.kune.core.shared.domain.AdmissionType;
import cc.kune.core.shared.domain.GroupListMode;
+import cc.kune.core.shared.domain.SocialNetworkVisibility;
import cc.kune.core.shared.dto.GroupType;
import cc.kune.core.shared.i18n.I18nTranslationService;
import cc.kune.domain.AccessLists;
@@ -129,8 +130,14 @@
throws GroupNameInUseException, UserMustBeLoggedException {
final String defaultSiteWorkspaceTheme = kuneProperties.get(KuneProperties.WS_THEMES_DEF);
if (User.isKnownUser(user)) {
+ GroupListMode publicVisibility = GroupListMode.EVERYONE;
+ SocialNetworkVisibility snVisibility = SocialNetworkVisibility.anyone;
if (group.getGroupType().equals(GroupType.COMMUNITY)) {
group.setAdmissionType(AdmissionType.Open);
+ } else if (group.getGroupType().equals(GroupType.CLOSED)) {
+ group.setAdmissionType(AdmissionType.Closed);
+ publicVisibility = GroupListMode.NORMAL;
+ snVisibility = SocialNetworkVisibility.onlymembers;
} else if (group.getGroupType().equals(GroupType.ORGANIZATION)) {
group.setAdmissionType(AdmissionType.Moderated);
} else if (group.getGroupType().equals(GroupType.PROJECT)) {
@@ -142,7 +149,7 @@
final License license = licenseFinder.findByShortName(licName);
group.setDefaultLicense(license);
group.setWorkspaceTheme(defaultSiteWorkspaceTheme);
- initSocialNetwork(group, user.getUserGroup());
+ initSocialNetwork(group, user.getUserGroup(), publicVisibility, snVisibility);
final String title = i18n.t("About [%s]", group.getLongName());
initGroup(user, group, serverToolRegistry.getToolsForGroupsKeys(), title, publicDescrip);
return group;
@@ -177,7 +184,7 @@
userGroup.setWorkspaceTheme(defaultSiteWorkspaceTheme);
userGroup.setDefaultContent(null);
user.setUserGroup(userGroup);
- initSocialNetwork(userGroup, userGroup);
+ initSocialNetwork(userGroup, userGroup, GroupListMode.EVERYONE, SocialNetworkVisibility.anyone);
final String title = i18n.t("[%s] Bio", user.getName());
final String body = i18n.t("This user has not written its biography yet");
@@ -244,14 +251,16 @@
}
}
- private void initSocialNetwork(final Group group, final Group userGroup) {
+ private void initSocialNetwork(final Group group, final Group userGroup,
+ final GroupListMode publicVisibility, final SocialNetworkVisibility snVisibility) {
final SocialNetwork network = group.getSocialNetwork();
final AccessLists lists = network.getAccessLists();
lists.getEditors().setMode(GroupListMode.NOBODY);
- lists.getViewers().setMode(GroupListMode.EVERYONE);
+ lists.getViewers().setMode(publicVisibility);
if (!group.getGroupType().equals(GroupType.ORPHANED_PROJECT)) {
network.addAdmin(userGroup);
}
+ network.setVisibility(snVisibility);
}
@Override
Modified: trunk/src/main/java/cc/kune/core/server/manager/impl/SocialNetworkManagerDefault.java
===================================================================
--- trunk/src/main/java/cc/kune/core/server/manager/impl/SocialNetworkManagerDefault.java 2011-07-09 16:44:34 UTC (rev 1442)
+++ trunk/src/main/java/cc/kune/core/server/manager/impl/SocialNetworkManagerDefault.java 2011-07-09 20:52:00 UTC (rev 1443)
@@ -23,7 +23,6 @@
import javax.persistence.EntityManager;
-
import cc.kune.core.client.errors.AccessViolationException;
import cc.kune.core.client.errors.AlreadyGroupMemberException;
import cc.kune.core.client.errors.AlreadyUserMemberException;
@@ -54,302 +53,311 @@
import com.google.inject.Singleton;
@Singleton
-public class SocialNetworkManagerDefault extends DefaultManager<SocialNetwork, Long> implements SocialNetworkManager {
+public class SocialNetworkManagerDefault extends DefaultManager<SocialNetwork, Long> implements
+ SocialNetworkManager {
- private final AccessRightsService accessRightsService;
- private final GroupFinder finder;
- private final UserManager userManager;
+ private final AccessRightsService accessRightsService;
+ private final GroupFinder finder;
+ private final UserManager userManager;
- @Inject
- public SocialNetworkManagerDefault(final Provider<EntityManager> provider, final GroupFinder finder,
- final AccessRightsService accessRightsService, final UserManager userManager) {
- super(provider, SocialNetwork.class);
- this.finder = finder;
- this.accessRightsService = accessRightsService;
- this.userManager = userManager;
- }
+ @Inject
+ public SocialNetworkManagerDefault(final Provider<EntityManager> provider, final GroupFinder finder,
+ final AccessRightsService accessRightsService, final UserManager userManager) {
+ super(provider, SocialNetwork.class);
+ this.finder = finder;
+ this.accessRightsService = accessRightsService;
+ this.userManager = userManager;
+ }
- @Override
- public void acceptJoinGroup(final User userLogged, final Group group, final Group inGroup) throws DefaultException,
- AccessViolationException {
- final SocialNetwork sn = inGroup.getSocialNetwork();
- checkUserLoggedIsAdmin(userLogged, sn);
- final List<Group> pendingCollabs = sn.getPendingCollaborators().getList();
- if (pendingCollabs.contains(group)) {
- sn.addCollaborator(group);
- sn.removePendingCollaborator(group);
- } else {
- throw new DefaultException("User is not a pending collaborator");
- }
+ @Override
+ public void acceptJoinGroup(final User userLogged, final Group group, final Group inGroup)
+ throws DefaultException, AccessViolationException {
+ final SocialNetwork sn = inGroup.getSocialNetwork();
+ checkUserLoggedIsAdmin(userLogged, sn);
+ final List<Group> pendingCollabs = sn.getPendingCollaborators().getList();
+ if (pendingCollabs.contains(group)) {
+ sn.addCollaborator(group);
+ sn.removePendingCollaborator(group);
+ } else {
+ throw new DefaultException("User is not a pending collaborator");
}
+ }
- void addAdmin(final User newAdmin, final Group group) {
- final SocialNetwork sn = group.getSocialNetwork();
- sn.addAdmin(newAdmin.getUserGroup());
- }
+ void addAdmin(final User newAdmin, final Group group) {
+ final SocialNetwork sn = group.getSocialNetwork();
+ sn.addAdmin(newAdmin.getUserGroup());
+ }
- @Override
- public void addGroupToAdmins(final User userLogged, final Group group, final Group inGroup) throws DefaultException {
- checkGroupAddingToSelf(group, inGroup);
- final SocialNetwork sn = inGroup.getSocialNetwork();
- checkUserLoggedIsAdmin(userLogged, sn);
- checkGroupIsNotAlreadyAMember(group, sn);
- sn.addAdmin(group);
- if (sn.isPendingCollab(group)) {
- sn.removePendingCollaborator(group);
- }
+ @Override
+ public void addGroupToAdmins(final User userLogged, final Group group, final Group inGroup)
+ throws DefaultException {
+ checkGroupAddingToSelf(group, inGroup);
+ final SocialNetwork sn = inGroup.getSocialNetwork();
+ checkUserLoggedIsAdmin(userLogged, sn);
+ checkGroupIsNotAlreadyAMember(group, sn);
+ sn.addAdmin(group);
+ if (sn.isPendingCollab(group)) {
+ sn.removePendingCollaborator(group);
}
+ }
- @Override
- public void addGroupToCollabs(final User userLogged, final Group group, final Group inGroup)
- throws DefaultException {
- checkGroupAddingToSelf(group, inGroup);
- final SocialNetwork sn = inGroup.getSocialNetwork();
- checkUserLoggedIsAdmin(userLogged, sn);
- checkGroupIsNotAlreadyAMember(group, sn);
- sn.addCollaborator(group);
- if (sn.isPendingCollab(group)) {
- sn.removePendingCollaborator(group);
- }
+ @Override
+ public void addGroupToCollabs(final User userLogged, final Group group, final Group inGroup)
+ throws DefaultException {
+ checkGroupAddingToSelf(group, inGroup);
+ final SocialNetwork sn = inGroup.getSocialNetwork();
+ checkUserLoggedIsAdmin(userLogged, sn);
+ checkGroupIsNotAlreadyAMember(group, sn);
+ sn.addCollaborator(group);
+ if (sn.isPendingCollab(group)) {
+ sn.removePendingCollaborator(group);
}
+ }
- @Override
- public void addGroupToViewers(final User userLogged, final Group group, final Group inGroup)
- throws DefaultException {
- checkGroupAddingToSelf(group, inGroup);
- final SocialNetwork sn = inGroup.getSocialNetwork();
- checkUserLoggedIsAdmin(userLogged, sn);
- checkGroupIsNotAlreadyAMember(group, sn);
- sn.addViewer(group);
- if (sn.isPendingCollab(group)) {
- sn.removePendingCollaborator(group);
- }
+ @Override
+ public void addGroupToViewers(final User userLogged, final Group group, final Group inGroup)
+ throws DefaultException {
+ checkGroupAddingToSelf(group, inGroup);
+ final SocialNetwork sn = inGroup.getSocialNetwork();
+ checkUserLoggedIsAdmin(userLogged, sn);
+ checkGroupIsNotAlreadyAMember(group, sn);
+ sn.addViewer(group);
+ if (sn.isPendingCollab(group)) {
+ sn.removePendingCollaborator(group);
}
+ }
- private void checkGroupAddingToSelf(final Group group, final Group inGroup) throws DefaultException {
- if (group.equals(inGroup)) {
- throwGroupMemberException(group);
- }
+ private void checkGroupAddingToSelf(final Group group, final Group inGroup) throws DefaultException {
+ if (group.equals(inGroup)) {
+ throwGroupMemberException(group);
}
+ }
- private void checkGroupIsNotAlreadyAMember(final Group group, final SocialNetwork sn) throws DefaultException {
- if (sn.isAdmin(group) || sn.isCollab(group) || sn.isViewer(group) && notEveryOneCanView(sn)) {
- throwGroupMemberException(group);
- }
+ private void checkGroupIsNotAlreadyAMember(final Group group, final SocialNetwork sn)
+ throws DefaultException {
+ if (sn.isAdmin(group) || sn.isCollab(group) || sn.isViewer(group) && notEveryOneCanView(sn)) {
+ throwGroupMemberException(group);
}
+ }
- private void checkUserLoggedIsAdmin(final User userLogged, final SocialNetwork sn) throws AccessViolationException {
- if (!accessRightsService.get(userLogged, sn.getAccessLists()).isAdministrable()) {
- throw new AccessViolationException();
- }
+ private void checkUserLoggedIsAdmin(final User userLogged, final SocialNetwork sn)
+ throws AccessViolationException {
+ if (!accessRightsService.get(userLogged, sn.getAccessLists()).isAdministrable()) {
+ throw new AccessViolationException();
}
+ }
- @Override
- public void deleteMember(final User userLogged, final Group group, final Group inGroup) throws DefaultException,
- AccessViolationException {
- final SocialNetwork sn = inGroup.getSocialNetwork();
+ @Override
+ public void deleteMember(final User userLogged, final Group group, final Group inGroup)
+ throws DefaultException, AccessViolationException {
+ final SocialNetwork sn = inGroup.getSocialNetwork();
- checkUserLoggedIsAdmin(userLogged, sn);
- unJoinGroup(group, inGroup);
- }
+ checkUserLoggedIsAdmin(userLogged, sn);
+ unJoinGroup(group, inGroup);
+ }
- @Override
- public void denyJoinGroup(final User userLogged, final Group group, final Group inGroup) throws DefaultException {
- final SocialNetwork sn = inGroup.getSocialNetwork();
- checkUserLoggedIsAdmin(userLogged, sn);
- final List<Group> pendingCollabs = sn.getPendingCollaborators().getList();
- if (pendingCollabs.contains(group)) {
- sn.removePendingCollaborator(group);
- } else {
- throw new DefaultException("Person/Group is not a pending collaborator");
- }
+ @Override
+ public void denyJoinGroup(final User userLogged, final Group group, final Group inGroup)
+ throws DefaultException {
+ final SocialNetwork sn = inGroup.getSocialNetwork();
+ checkUserLoggedIsAdmin(userLogged, sn);
+ final List<Group> pendingCollabs = sn.getPendingCollaborators().getList();
+ if (pendingCollabs.contains(group)) {
+ sn.removePendingCollaborator(group);
+ } else {
+ throw new DefaultException("Person/Group is not a pending collaborator");
}
+ }
- @Override
- public ParticipationData findParticipation(final User userLogged, final Group group)
- throws AccessViolationException {
- get(userLogged, group); // check access
- final Long groupId = group.getId();
- final List<Group> adminInGroups = finder.findAdminInGroups(groupId);
- // Don't show self user group
- if (group.isPersonal()) {
- adminInGroups.remove(group);
- }
- // adminInGroups.remove(userLogged.getUserGroup());
- final List<Group> collabInGroups = finder.findCollabInGroups(groupId);
- return new ParticipationData(adminInGroups, collabInGroups);
+ @Override
+ public ParticipationData findParticipation(final User userLogged, final Group group)
+ throws AccessViolationException {
+ get(userLogged, group); // check access
+ final Long groupId = group.getId();
+ final List<Group> adminInGroups = finder.findAdminInGroups(groupId);
+ // Don't show self user group
+ if (group.isPersonal()) {
+ adminInGroups.remove(group);
}
+ // adminInGroups.remove(userLogged.getUserGroup());
+ final List<Group> collabInGroups = finder.findCollabInGroups(groupId);
+ return new ParticipationData(adminInGroups, collabInGroups);
+ }
- @Override
- public SocialNetwork get(final User petitioner, final Group group) throws AccessViolationException {
- final SocialNetwork sn = group.getSocialNetwork();
- if (!sn.getAccessLists().getViewers().includes(petitioner.getUserGroup())) {
- throw new AccessViolationException();
- }
- return sn;
+ @Override
+ public SocialNetwork get(final User petitioner, final Group group) throws AccessViolationException {
+ final SocialNetwork sn = group.getSocialNetwork();
+ if (!sn.getAccessLists().getViewers().includes(petitioner.getUserGroup())
+ && !sn.getAccessLists().getEditors().includes(petitioner.getUserGroup())
+ && !sn.getAccessLists().getAdmins().includes(petitioner.getUserGroup())) {
+ throw new AccessViolationException();
}
+ return sn;
+ }
- @Override
- public SocialNetworkData getSocialNetworkData(final User userLogged, final Group group) {
- final SocialNetworkData socialNetData = new SocialNetworkData();
- socialNetData.setGroupMembers(get(userLogged, group));
- final AccessRights groupRights = accessRightsService.get(userLogged, group.getAccessLists());
- socialNetData.setGroupRights(groupRights);
- socialNetData.setUserParticipation(findParticipation(userLogged, group));
- socialNetData.setGroupMembers(get(userLogged, group));
- if (group.isPersonal()) {
- final UserBuddiesData userBuddies = userManager.getUserBuddies(group.getShortName());
- final User userGroup = userManager.findByShortname(group.getShortName());
- socialNetData.setUserBuddies(userBuddies);
- final UserSNetVisibility buddiesVisibility = userGroup.getSNetVisibility();
- socialNetData.setIsBuddiesVisible(true);
- switch (buddiesVisibility) {
- case anyone:
- break;
- case onlyyou:
- if (userLogged.equals(User.UNKNOWN_USER) || !userLogged.getUserGroup().equals(group)) {
- socialNetData.setIsBuddiesVisible(false);
- socialNetData.setUserBuddies(UserBuddiesData.EMPTY);
- }
- break;
- case yourbuddies:
- final boolean notMe = !userLogged.equals(userGroup);
- final boolean notABuddie = !userBuddies.contains(userLogged.getShortName());
- if (notMe && notABuddie) {
- socialNetData.setIsBuddiesVisible(false);
- socialNetData.setUserBuddies(UserBuddiesData.EMPTY);
- }
- break;
- }
- socialNetData.setUserBuddiesVisibility(buddiesVisibility);
- } else {
- final SocialNetworkVisibility visibility = group.getSocialNetwork().getVisibility();
- socialNetData.setIsMembersVisible(true);
- switch (visibility) {
- case anyone:
- break;
- case onlyadmins:
- if (!groupRights.isAdministrable()) {
- socialNetData.setIsMembersVisible(false);
- socialNetData.setGroupMembers(SocialNetwork.EMPTY);
- }
- break;
- case onlymembers:
- if (!groupRights.isEditable()) {
- socialNetData.setIsMembersVisible(false);
- socialNetData.setGroupMembers(SocialNetwork.EMPTY);
- }
- break;
- }
- socialNetData.setSocialNetworkVisibility(visibility);
- socialNetData.setUserBuddies(UserBuddiesData.EMPTY);
+ @Override
+ public SocialNetworkData getSocialNetworkData(final User userLogged, final Group group) {
+ final SocialNetworkData socialNetData = new SocialNetworkData();
+ socialNetData.setGroupMembers(get(userLogged, group));
+ final AccessRights groupRights = accessRightsService.get(userLogged, group.getAccessLists());
+ socialNetData.setGroupRights(groupRights);
+ socialNetData.setUserParticipation(findParticipation(userLogged, group));
+ socialNetData.setGroupMembers(get(userLogged, group));
+ if (group.isPersonal()) {
+ final UserBuddiesData userBuddies = userManager.getUserBuddies(group.getShortName());
+ final User userGroup = userManager.findByShortname(group.getShortName());
+ socialNetData.setUserBuddies(userBuddies);
+ final UserSNetVisibility buddiesVisibility = userGroup.getSNetVisibility();
+ socialNetData.setIsBuddiesVisible(true);
+ switch (buddiesVisibility) {
+ case anyone:
+ break;
+ case onlyyou:
+ if (userLogged.equals(User.UNKNOWN_USER) || !userLogged.getUserGroup().equals(group)) {
+ socialNetData.setIsBuddiesVisible(false);
+ socialNetData.setUserBuddies(UserBuddiesData.EMPTY);
}
- return socialNetData;
+ break;
+ case yourbuddies:
+ final boolean notMe = !userLogged.equals(userGroup);
+ final boolean notABuddie = !userBuddies.contains(userLogged.getShortName());
+ if (notMe && notABuddie) {
+ socialNetData.setIsBuddiesVisible(false);
+ socialNetData.setUserBuddies(UserBuddiesData.EMPTY);
+ }
+ break;
+ }
+ socialNetData.setUserBuddiesVisibility(buddiesVisibility);
+ } else {
+ final SocialNetworkVisibility visibility = group.getSocialNetwork().getVisibility();
+ socialNetData.setIsMembersVisible(true);
+ switch (visibility) {
+ case anyone:
+ break;
+ case onlyadmins:
+ if (!groupRights.isAdministrable()) {
+ socialNetData.setIsMembersVisible(false);
+ socialNetData.setGroupMembers(SocialNetwork.EMPTY);
+ }
+ break;
+ case onlymembers:
+ if (!groupRights.isEditable()) {
+ socialNetData.setIsMembersVisible(false);
+ socialNetData.setGroupMembers(SocialNetwork.EMPTY);
+ }
+ break;
+ }
+ socialNetData.setSocialNetworkVisibility(visibility);
+ socialNetData.setUserBuddies(UserBuddiesData.EMPTY);
}
+ return socialNetData;
+ }
- private boolean isClosed(final AdmissionType admissionType) {
- return admissionType.equals(AdmissionType.Closed);
- }
+ private boolean isClosed(final AdmissionType admissionType) {
+ return admissionType.equals(AdmissionType.Closed);
+ }
- private boolean isModerated(final AdmissionType admissionType) {
- return admissionType.equals(AdmissionType.Moderated);
- }
+ private boolean isModerated(final AdmissionType admissionType) {
+ return admissionType.equals(AdmissionType.Moderated);
+ }
- private boolean isOpen(final AdmissionType admissionType) {
- return admissionType.equals(AdmissionType.Open);
- }
+ private boolean isOpen(final AdmissionType admissionType) {
+ return admissionType.equals(AdmissionType.Open);
+ }
- private boolean notEveryOneCanView(final SocialNetwork sn) {
- return !sn.getAccessLists().getViewers().getMode().equals(GroupListMode.EVERYONE);
- }
+ private boolean notEveryOneCanView(final SocialNetwork sn) {
+ return !sn.getAccessLists().getViewers().getMode().equals(GroupListMode.EVERYONE);
+ }
- @Override
- public SocialNetworkRequestResult requestToJoin(final User userLogged, final Group inGroup)
- throws DefaultException, UserMustBeLoggedException {
- final SocialNetwork sn = inGroup.getSocialNetwork();
- if (!User.isKnownUser(userLogged)) {
- throw new UserMustBeLoggedException();
- }
- final AdmissionType admissionType = inGroup.getAdmissionType();
- if (admissionType == null) {
- throw new ServerException("No admissionType");
- }
- final Group userGroup = userLogged.getUserGroup();
- checkGroupIsNotAlreadyAMember(userGroup, sn);
- if (isModerated(admissionType)) {
- sn.addPendingCollaborator(userGroup);
- return SocialNetworkRequestResult.moderated;
- } else if (isOpen(admissionType)) {
- if (inGroup.getGroupType().equals(GroupType.ORPHANED_PROJECT)) {
- sn.addAdmin(userGroup);
- inGroup.setGroupType(GroupType.PROJECT);
- inGroup.setAdmissionType(AdmissionType.Moderated);
- persist(inGroup, Group.class);
- } else {
- sn.addCollaborator(userGroup);
- }
- return SocialNetworkRequestResult.accepted;
- } else if (isClosed(admissionType)) {
- return SocialNetworkRequestResult.denied;
- } else {
- throw new DefaultException("State not expected in SocialNetworkManagerDefault class");
- }
+ @Override
+ public SocialNetworkRequestResult requestToJoin(final User userLogged, final Group inGroup)
+ throws DefaultException, UserMustBeLoggedException {
+ final SocialNetwork sn = inGroup.getSocialNetwork();
+ if (!User.isKnownUser(userLogged)) {
+ throw new UserMustBeLoggedException();
}
+ final AdmissionType admissionType = inGroup.getAdmissionType();
+ if (admissionType == null) {
+ throw new ServerException("No admissionType");
+ }
+ final Group userGroup = userLogged.getUserGroup();
+ checkGroupIsNotAlreadyAMember(userGroup, sn);
+ if (isModerated(admissionType)) {
+ sn.addPendingCollaborator(userGroup);
+ return SocialNetworkRequestResult.moderated;
+ } else if (isOpen(admissionType)) {
+ if (inGroup.getGroupType().equals(GroupType.ORPHANED_PROJECT)) {
+ sn.addAdmin(userGroup);
+ inGroup.setGroupType(GroupType.PROJECT);
+ inGroup.setAdmissionType(AdmissionType.Moderated);
+ persist(inGroup, Group.class);
+ } else {
+ sn.addCollaborator(userGroup);
+ }
+ return SocialNetworkRequestResult.accepted;
+ } else if (isClosed(admissionType)) {
+ return SocialNetworkRequestResult.denied;
+ } else {
+ throw new DefaultException("State not expected in SocialNetworkManagerDefault class");
+ }
+ }
- @Override
- public void setAdminAsCollab(final User userLogged, final Group group, final Group inGroup) throws DefaultException {
- final SocialNetwork sn = inGroup.getSocialNetwork();
- checkUserLoggedIsAdmin(userLogged, sn);
- if (sn.isAdmin(group)) {
- if (sn.getAccessLists().getAdmins().getList().size() == 1) {
- throw new LastAdminInGroupException();
- }
- sn.removeAdmin(group);
- sn.addCollaborator(group);
- } else {
- throw new DefaultException("Person/Group is not an admin");
- }
+ @Override
+ public void setAdminAsCollab(final User userLogged, final Group group, final Group inGroup)
+ throws DefaultException {
+ final SocialNetwork sn = inGroup.getSocialNetwork();
+ checkUserLoggedIsAdmin(userLogged, sn);
+ if (sn.isAdmin(group)) {
+ if (sn.getAccessLists().getAdmins().getList().size() == 1) {
+ throw new LastAdminInGroupException();
+ }
+ sn.removeAdmin(group);
+ sn.addCollaborator(group);
+ } else {
+ throw new DefaultException("Person/Group is not an admin");
}
+ }
- @Override
- public void setCollabAsAdmin(final User userLogged, final Group group, final Group inGroup) throws DefaultException {
- final SocialNetwork sn = inGroup.getSocialNetwork();
- checkUserLoggedIsAdmin(userLogged, sn);
- if (sn.isCollab(group)) {
- sn.removeCollaborator(group);
- sn.addAdmin(group);
- } else {
- throw new DefaultException("Person/Group is not a collaborator");
- }
+ @Override
+ public void setCollabAsAdmin(final User userLogged, final Group group, final Group inGroup)
+ throws DefaultException {
+ final SocialNetwork sn = inGroup.getSocialNetwork();
+ checkUserLoggedIsAdmin(userLogged, sn);
+ if (sn.isCollab(group)) {
+ sn.removeCollaborator(group);
+ sn.addAdmin(group);
+ } else {
+ throw new DefaultException("Person/Group is not a collaborator");
}
+ }
- private void throwGroupMemberException(final Group group) throws DefaultException {
- if (group.isPersonal()) {
- throw new AlreadyUserMemberException();
- } else {
- throw new AlreadyGroupMemberException();
- }
+ private void throwGroupMemberException(final Group group) throws DefaultException {
+ if (group.isPersonal()) {
+ throw new AlreadyUserMemberException();
+ } else {
+ throw new AlreadyGroupMemberException();
}
+ }
- @Override
- public void unJoinGroup(final Group groupToUnJoin, final Group inGroup) throws DefaultException {
- final SocialNetwork sn = inGroup.getSocialNetwork();
+ @Override
+ public void unJoinGroup(final Group groupToUnJoin, final Group inGroup) throws DefaultException {
+ final SocialNetwork sn = inGroup.getSocialNetwork();
- if (sn.isAdmin(groupToUnJoin)) {
- if (sn.getAccessLists().getAdmins().getList().size() == 1) {
- if (sn.getAccessLists().getEditors().getList().size() > 0) {
- throw new LastAdminInGroupException();
- } else {
- inGroup.setGroupType(GroupType.ORPHANED_PROJECT);
- inGroup.setAdmissionType(AdmissionType.Open);
- }
- }
- sn.removeAdmin(groupToUnJoin);
- } else if (sn.isCollab(groupToUnJoin)) {
- sn.removeCollaborator(groupToUnJoin);
+ if (sn.isAdmin(groupToUnJoin)) {
+ if (sn.getAccessLists().getAdmins().getList().size() == 1) {
+ if (sn.getAccessLists().getEditors().getList().size() > 0) {
+ throw new LastAdminInGroupException();
} else {
- throw new DefaultException("Person/Group is not a collaborator");
+ inGroup.setGroupType(GroupType.ORPHANED_PROJECT);
+ inGroup.setAdmissionType(AdmissionType.Open);
}
+ }
+ sn.removeAdmin(groupToUnJoin);
+ } else if (sn.isCollab(groupToUnJoin)) {
+ sn.removeCollaborator(groupToUnJoin);
+ } else {
+ throw new DefaultException("Person/Group is not a collaborator");
}
+ }
}
Modified: trunk/src/main/java/cc/kune/core/shared/dto/GroupType.java
===================================================================
--- trunk/src/main/java/cc/kune/core/shared/dto/GroupType.java 2011-07-09 16:44:34 UTC (rev 1442)
+++ trunk/src/main/java/cc/kune/core/shared/dto/GroupType.java 2011-07-09 20:52:00 UTC (rev 1443)
@@ -22,5 +22,5 @@
import com.google.gwt.user.client.rpc.IsSerializable;
public enum GroupType implements IsSerializable {
- ORGANIZATION, COMMUNITY, PROJECT, ORPHANED_PROJECT, PERSONAL
+ CLOSED, COMMUNITY, ORGANIZATION, ORPHANED_PROJECT, PERSONAL, PROJECT
}
Modified: trunk/src/main/java/cc/kune/gspace/client/actions/NewContainerBtn.java
===================================================================
--- trunk/src/main/java/cc/kune/gspace/client/actions/NewContainerBtn.java 2011-07-09 16:44:34 UTC (rev 1442)
+++ trunk/src/main/java/cc/kune/gspace/client/actions/NewContainerBtn.java 2011-07-09 20:52:00 UTC (rev 1443)
@@ -75,7 +75,7 @@
stateManager.setRetrievedStateAndGo(state);
NotifyUser.hideProgress();
NotifyUser.info(i18n.tWithNT("[%s] created", "New folder created, for instance", newName));
- folderViewer.blinkTitle();
+ folderViewer.highlightTitle();
}
});
cache.removeContent(session.getCurrentStateToken());
Modified: trunk/src/main/java/cc/kune/gspace/client/actions/NewContainerMenuItem.java
===================================================================
--- trunk/src/main/java/cc/kune/gspace/client/actions/NewContainerMenuItem.java 2011-07-09 16:44:34 UTC (rev 1442)
+++ trunk/src/main/java/cc/kune/gspace/client/actions/NewContainerMenuItem.java 2011-07-09 20:52:00 UTC (rev 1443)
@@ -78,7 +78,7 @@
stateManager.setRetrievedStateAndGo(state);
NotifyUser.hideProgress();
NotifyUser.info(i18n.tWithNT("[%s] created", "New folder created, for instance", newName));
- folderViewer.blinkTitle();
+ folderViewer.highlightTitle();
}
});
cache.removeContent(session.getCurrentStateToken());
Modified: trunk/src/main/java/cc/kune/gspace/client/viewers/AbstractFolderViewerPanel.java
===================================================================
--- trunk/src/main/java/cc/kune/gspace/client/viewers/AbstractFolderViewerPanel.java 2011-07-09 16:44:34 UTC (rev 1442)
+++ trunk/src/main/java/cc/kune/gspace/client/viewers/AbstractFolderViewerPanel.java 2011-07-09 20:52:00 UTC (rev 1443)
@@ -70,8 +70,8 @@
}
@Override
- public void blinkTitle() {
- contentTitle.blink();
+ public void highlightTitle() {
+ contentTitle.highlightTitle();
}
@Override
Modified: trunk/src/main/java/cc/kune/gspace/client/viewers/ContentTitleWidget.java
===================================================================
--- trunk/src/main/java/cc/kune/gspace/client/viewers/ContentTitleWidget.java 2011-07-09 16:44:34 UTC (rev 1442)
+++ trunk/src/main/java/cc/kune/gspace/client/viewers/ContentTitleWidget.java 2011-07-09 20:52:00 UTC (rev 1443)
@@ -53,10 +53,6 @@
initWidget(flow);
}
- public void blink() {
- editableTitle.blink();
- }
-
public void edit() {
editableTitle.edit();
}
@@ -65,6 +61,10 @@
return editableTitle;
}
+ public void highlightTitle() {
+ editableTitle.highlightTitle();
+ }
+
public void setText(final String text) {
editableTitle.setText(text);
}
@@ -83,7 +83,7 @@
titleIcon.setVisible(hasIcon);
editableTitle.setText(title);
if (editable) {
- editableTitle.setTooltip(i18n.t("Click to edit"));
+ editableTitle.setTooltip(i18n.t("Click to rename"));
} else {
editableTitle.setTooltip("");
}
Modified: trunk/src/main/java/cc/kune/gspace/client/viewers/ContentViewerPanel.java
===================================================================
--- trunk/src/main/java/cc/kune/gspace/client/viewers/ContentViewerPanel.java 2011-07-09 16:44:34 UTC (rev 1442)
+++ trunk/src/main/java/cc/kune/gspace/client/viewers/ContentViewerPanel.java 2011-07-09 20:52:00 UTC (rev 1443)
@@ -125,7 +125,7 @@
@Override
public void blinkTitle() {
- contentTitle.blink();
+ contentTitle.highlightTitle();
}
@Override
Modified: trunk/src/main/java/cc/kune/gspace/client/viewers/FolderViewerPresenter.java
===================================================================
--- trunk/src/main/java/cc/kune/gspace/client/viewers/FolderViewerPresenter.java 2011-07-09 16:44:34 UTC (rev 1442)
+++ trunk/src/main/java/cc/kune/gspace/client/viewers/FolderViewerPresenter.java 2011-07-09 20:52:00 UTC (rev 1443)
@@ -81,7 +81,7 @@
void attach();
- void blinkTitle();
+ void highlightTitle();
void clear();
@@ -176,8 +176,8 @@
}
}
- public void blinkTitle() {
- getView().blinkTitle();
+ public void highlightTitle() {
+ getView().highlightTitle();
}
String calculateStyle(final int pos, final int length) {
Modified: trunk/src/main/webapp/others/kune-client-actions.xml
===================================================================
--- trunk/src/main/webapp/others/kune-client-actions.xml 2011-07-09 16:44:34 UTC (rev 1442)
+++ trunk/src/main/webapp/others/kune-client-actions.xml 2011-07-09 20:52:00 UTC (rev 1443)
@@ -14,10 +14,10 @@
</iconUrl>
<iconCss></iconCss>
</extension>
-
+
<extension>
<name>Quick Notify</name>
- <installerUrl>http://code.google.com/p/wave-projects/source/browse/gadgets/wave-quick-not…
+ <installerUrl>http://code.google.com/p/wave-projects/source/browse/gadgets/wave-quick-not…
</installerUrl>
<gadgetUrl>http://wave-projects.googlecode.com/hg/gadgets/wave-quick-notify.xml
</gadgetUrl>
@@ -25,10 +25,10 @@
</iconUrl>
<iconCss></iconCss>
</extension>
-
+
<extension>
<name>tasklistbot</name>
- <installerUrl>http://tasklistbot.appspot.com/TaskList.xml
+ <installerUrl>http://tasklistbot.appspot.com/TaskList.xml
</installerUrl>
<gadgetUrl>http://everybodywave.appspot.com/gadget/foobar/main.xml
</gadgetUrl>
@@ -39,7 +39,7 @@
<extension>
<name>Yes/No/Mini</name>
- <installerUrl>http://mysite.verizon.net/zmyaro/mystuff/wave/ynmini.xml
+ <installerUrl>http://mysite.verizon.net/zmyaro/mystuff/wave/ynmini.xml
</installerUrl>
<gadgetUrl>http://mysite.verizon.net/zmyaro/projects/wave/gadgets/ynmini.xml
</gadgetUrl>
@@ -47,10 +47,10 @@
</iconUrl>
<iconCss></iconCss>
</extension>
-
+
<extension>
<name>Yes/No/Maybe/+</name>
- <installerUrl>http://everybodywave.appspot.com/gadget/foobar/xt.xml
+ <installerUrl>http://everybodywave.appspot.com/gadget/foobar/xt.xml
</installerUrl>
<gadgetUrl>http://everybodywave.appspot.com/gadget/foobar/main.xml
</gadgetUrl>
@@ -58,10 +58,10 @@
</iconUrl>
<iconCss></iconCss>
</extension>
-
+
<extension>
<name>Shorten URL with goo.gl</name>
- <installerUrl>http://haru1ban-wave.googlecode.com/svn/trunk/goo_gl/manifest.xml
+ <installerUrl>http://haru1ban-wave.googlecode.com/svn/trunk/goo_gl/manifest.xml
</installerUrl>
<gadgetUrl>http://haru1ban-wave.googlecode.com/svn/trunk/goo_gl/goo_gl.xml
</gadgetUrl>
@@ -69,10 +69,10 @@
</iconUrl>
<iconCss></iconCss>
</extension>
-
+
<extension>
<name>Poll</name>
- <installerUrl>http://wave.samuirai.de/install_poll.xml
+ <installerUrl>http://wave.samuirai.de/install_poll.xml
</installerUrl>
<gadgetUrl>http://wave.samuirai.de/poll.xml
</gadgetUrl>
@@ -80,10 +80,10 @@
</iconUrl>
<iconCss></iconCss>
</extension>
-
+
<extension>
<name>TaskToDo</name>
- <installerUrl>http://www.voizle.com/ToDoInstaller.xml
+ <installerUrl>http://www.voizle.com/ToDoInstaller.xml
</installerUrl>
<gadgetUrl>http://www.voizle.com/ToDo.xml
</gadgetUrl>
@@ -94,7 +94,7 @@
<extension>
<name>Picasa Gadget</name>
- <installerUrl>http://wave-picasa.googlecode.com/svn/trunk/manifest_wave_picasa.xml
+ <installerUrl>http://wave-picasa.googlecode.com/svn/trunk/manifest_wave_picasa.xml
</installerUrl>
<gadgetUrl>http://wave-picasa.googlecode.com/svn/trunk/picasa.xml
</gadgetUrl>
@@ -102,10 +102,10 @@
</iconUrl>
<iconCss></iconCss>
</extension>
-
+
<extension>
<name>Map</name>
- <installerUrl>http://google-wave-resources.googlecode.com/svn/trunk/samples/extensions/ga…
+ <installerUrl>http://google-wave-resources.googlecode.com/svn/trunk/samples/extensions/ga…
</installerUrl>
<gadgetUrl>http://google-wave-resources.googlecode.com/svn/trunk/samples/extensions/ga…
</gadgetUrl>
@@ -113,10 +113,10 @@
</iconUrl>
<iconCss></iconCss>
</extension>
-
+
<extension>
<name>MindMap</name>
- <installerUrl>http://cactus-wave.appspot.com/mindmap.xml
+ <installerUrl>http://cactus-wave.appspot.com/mindmap.xml
</installerUrl>
<gadgetUrl>http://cactus-wave.appspot.com/net.brucecooper.mindmapgadget.MindMapGadget/…
</gadgetUrl>
@@ -135,7 +135,7 @@
</iconUrl>
<iconCss></iconCss>
</extension>
-
+
<extension>
<name>waffle</name>
<installerUrl>http://www.waffle.dk/install.xml
@@ -186,12 +186,14 @@
<guiActionDescriptors>
- <guiActionDescriptor>
+ <guiActionDescriptor>
<type>wave-gadget</type>
<extensionName>Map</extensionName>
<name>New Map</name>
<path>Gadget»Media</path>
- <description>Collaborate on a map of placemarks, paths, and shapes with other participants. Great for planning events and trips.</description>
+ <description>Collaborate on a map of placemarks, paths, and shapes
+ with other participants. Great for planning events and trips.
+ </description>
<new-content-title>New Map</new-content-title>
<new-content-textintro></new-content-textintro>
<enabled>true</enabled>
@@ -209,7 +211,7 @@
used yet) -->
<participants>ask</participants>
</guiActionDescriptor>
-
+
<guiActionDescriptor>
<type>wave-gadget</type>
<extensionName>Picasa Gadget</extensionName>
@@ -233,13 +235,14 @@
used yet) -->
<participants>ask</participants>
</guiActionDescriptor>
-
+
<guiActionDescriptor>
<type>wave-gadget</type>
<extensionName>TaskToDo</extensionName>
<name>New To-Do list</name>
<path>Gadget»Tasks</path>
- <description>Make your To-Do list and mark your progress.</description>
+ <description>Make your To-Do list and mark your progress.
+ </description>
<new-content-title>New To-Do list</new-content-title>
<new-content-textintro></new-content-textintro>
<enabled>true</enabled>
@@ -257,13 +260,14 @@
used yet) -->
<participants>ask</participants>
</guiActionDescriptor>
-
+
<guiActionDescriptor>
<type>wave-gadget</type>
<extensionName>Shorten URL with goo.gl</extensionName>
<name>New Shorten URL</name>
<path>Gadget»Links</path>
- <description>Shorten url with goo.gl, the new Google url shortener.(http://goo.gl/)</description>
+ <description>Shorten url with goo.gl, the new Google url
+ shortener.(http://goo.gl/)</description>
<new-content-title>New Shorten URL</new-content-title>
<new-content-textintro></new-content-textintro>
<enabled>true</enabled>
@@ -281,14 +285,16 @@
used yet) -->
<participants>ask</participants>
</guiActionDescriptor>
-
-
+
+
<guiActionDescriptor>
<type>wave-gadget</type>
<extensionName>Poll</extensionName>
<name>New Advanced Poll</name>
<path>Gadget»Voting</path>
- <description>You can add a poll to your Wave. Accordingly you can embed the result with the Google Chart API into your Wave.</description>
+ <description>You can add a poll to your Wave. Accordingly you can
+ embed the result with the Google Chart API into your Wave.
+ </description>
<new-content-title>New Advanced Poll</new-content-title>
<new-content-textintro></new-content-textintro>
<enabled>true</enabled>
@@ -306,14 +312,15 @@
used yet) -->
<participants>ask</participants>
</guiActionDescriptor>
-
-
+
+
<guiActionDescriptor>
<type>wave-gadget</type>
<extensionName>Yes/No/Maybe/+</extensionName>
<name>New Yes/No/Maybe/+ Voting</name>
<path>Gadget»Voting</path>
- <description>Same as Google's Yes/No/Maybe, only you can edit the titles and add new ones.</description>
+ <description>Same as Google's Yes/No/Maybe, only you can edit the
+ titles and add new ones.</description>
<new-content-title>New Yes/No/Maybe/+ Voting</new-content-title>
<new-content-textintro></new-content-textintro>
<enabled>true</enabled>
@@ -331,13 +338,14 @@
used yet) -->
<participants>ask</participants>
</guiActionDescriptor>
-
+
<guiActionDescriptor>
<type>wave-gadget</type>
<extensionName>Yes/No/Mini</extensionName>
<name>New Yes/no/Mini Voting</name>
<path>Gadget»Voting</path>
- <description>A miniature version of the Yes/No/Maybe gadget.</description>
+ <description>A miniature version of the Yes/No/Maybe gadget.
+ </description>
<new-content-title>New Yes/no/Mini Voting</new-content-title>
<new-content-textintro></new-content-textintro>
<enabled>true</enabled>
@@ -355,7 +363,7 @@
used yet) -->
<participants>ask</participants>
</guiActionDescriptor>
-
+
<guiActionDescriptor>
<type>wave-gadget</type>
<extensionName>tasklistbot</extensionName>
@@ -379,13 +387,14 @@
used yet) -->
<participants>ask</participants>
</guiActionDescriptor>
-
+
<guiActionDescriptor>
<type>wave-gadget</type>
<extensionName>Quick Notify</extensionName>
<name>New Notification</name>
<path>Gadget»Organization</path>
- <description>Quickly send a short email with a custom message to all participants.</description>
+ <description>Quickly send a short email with a custom message to
+ all participants.</description>
<new-content-title>New Notification</new-content-title>
<new-content-textintro></new-content-textintro>
<enabled>true</enabled>
@@ -403,14 +412,15 @@
used yet) -->
<participants>ask</participants>
</guiActionDescriptor>
-
-
+
+
<guiActionDescriptor>
<type>wave-gadget</type>
<extensionName>MindMap</extensionName>
<name>New MindMap</name>
<path>Gadget»Organization</path>
- <description>Collaborate using a hierarchical mind map.</description>
+ <description>Collaborate using a hierarchical mind map.
+ </description>
<new-content-title>New MindMap</new-content-title>
<new-content-textintro></new-content-textintro>
<enabled>true</enabled>
@@ -428,13 +438,14 @@
used yet) -->
<participants>ask</participants>
</guiActionDescriptor>
-
+
<guiActionDescriptor>
<type>wave-gadget</type>
<extensionName>Image</extensionName>
<name>New Image</name>
<path>Gadget»Media</path>
- <description>Lets you insert, resize and annotate any image from the web.</description>
+ <description>Lets you insert, resize and annotate any image from
+ the web.</description>
<new-content-title>New image</new-content-title>
<new-content-textintro></new-content-textintro>
<enabled>true</enabled>
Modified: trunk/src/test/java/cc/kune/core/server/integration/kuneservice/GroupServiceTest.java
===================================================================
--- trunk/src/test/java/cc/kune/core/server/integration/kuneservice/GroupServiceTest.java 2011-07-09 16:44:34 UTC (rev 1442)
+++ trunk/src/test/java/cc/kune/core/server/integration/kuneservice/GroupServiceTest.java 2011-07-09 20:52:00 UTC (rev 1443)
@@ -30,6 +30,7 @@
import cc.kune.core.server.integration.IntegrationTest;
import cc.kune.core.server.integration.IntegrationTestHelper;
import cc.kune.core.shared.domain.AdmissionType;
+import cc.kune.core.shared.domain.GroupListMode;
import cc.kune.core.shared.dto.GroupDTO;
import cc.kune.core.shared.dto.GroupType;
import cc.kune.core.shared.dto.LicenseDTO;
@@ -40,108 +41,134 @@
public class GroupServiceTest extends IntegrationTest {
- @Inject
- GroupFinder groupFinder;
+ @Inject
+ GroupFinder groupFinder;
- @Inject
- GroupService service;
+ @Inject
+ GroupService service;
- @Inject
- UserSession session;
+ @Inject
+ UserSession session;
- @Test
- public void createCommunity() throws Exception {
- doLogin();
+ @Test
+ public void createClosed() throws Exception {
+ doLogin();
- final GroupDTO group = new GroupDTO("ysei", "Yellow Submarine Environmental Initiative", GroupType.COMMUNITY);
+ final GroupDTO group = new GroupDTO("ysei", "Yellow Submarine Environmental Initiative",
+ GroupType.CLOSED);
- final LicenseDTO license = new LicenseDTO();
- license.setShortName("by-sa-v3.0");
- group.setDefaultLicense(license);
- service.createNewGroup(session.getHash(), group, "Public desc", "tag1 tag2", null);
+ final LicenseDTO license = new LicenseDTO();
+ license.setShortName("by-sa-v3.0");
+ group.setDefaultLicense(license);
+ service.createNewGroup(session.getHash(), group, "Public desc", "tag1 tag2", null);
- final Group groupCreated = groupFinder.findByShortName("ysei");
- assertEquals(groupCreated.getShortName(), group.getShortName());
- assertEquals(groupCreated.getLongName(), group.getLongName());
+ final Group groupCreated = groupFinder.findByShortName("ysei");
+ assertEquals(groupCreated.getShortName(), group.getShortName());
+ assertEquals(groupCreated.getLongName(), group.getLongName());
+ assertEquals(groupCreated.getAdmissionType(), AdmissionType.Closed);
+ assertEquals(groupCreated.getGroupType(), GroupType.CLOSED);
+ assertEquals(GroupListMode.NORMAL,
+ groupCreated.getSocialNetwork().getAccessLists().getViewers().getMode());
+ }
- assertEquals(groupCreated.getAdmissionType(), AdmissionType.Open);
- assertEquals(groupCreated.getGroupType(), GroupType.COMMUNITY);
- }
+ @Test
+ public void createCommunity() throws Exception {
+ doLogin();
- @Test(expected = Exception.class)
- public void createGroupNotLogged() throws Exception {
- final GroupDTO group = new GroupDTO("ysei", "Yellow Submarine Environmental Initiative", GroupType.PROJECT);
- service.createNewGroup(session.getHash(), group, "Public desc", "tag1 tag2", null);
- }
+ final GroupDTO group = new GroupDTO("ysei", "Yellow Submarine Environmental Initiative",
+ GroupType.COMMUNITY);
- @Test(expected = UserMustBeLoggedException.class)
- public void createGroupNullUserHash() throws Exception {
- doLogin();
- final GroupDTO group = new GroupDTO("ysei", "Yellow Submarine Environmental Initiative", GroupType.PROJECT);
- service.createNewGroup(null, group, "Public desc", "tag1 tag2", null);
- }
+ final LicenseDTO license = new LicenseDTO();
+ license.setShortName("by-sa-v3.0");
+ group.setDefaultLicense(license);
+ service.createNewGroup(session.getHash(), group, "Public desc", "tag1 tag2", null);
- @Test
- public void createGroupUserLogged() throws Exception {
- doLogin();
+ final Group groupCreated = groupFinder.findByShortName("ysei");
+ assertEquals(groupCreated.getShortName(), group.getShortName());
+ assertEquals(groupCreated.getLongName(), group.getLongName());
- final GroupDTO group = new GroupDTO("ysei", "Yellow Submarine Environmental Initiative", GroupType.PROJECT);
+ assertEquals(groupCreated.getAdmissionType(), AdmissionType.Open);
+ assertEquals(groupCreated.getGroupType(), GroupType.COMMUNITY);
+ }
- final LicenseDTO license = new LicenseDTO();
- license.setShortName("by-sa-v3.0");
- group.setDefaultLicense(license);
- service.createNewGroup(session.getHash(), group, "Public desc", "tag1 tag2", null);
+ @Test(expected = Exception.class)
+ public void createGroupNotLogged() throws Exception {
+ final GroupDTO group = new GroupDTO("ysei", "Yellow Submarine Environmental Initiative",
+ GroupType.PROJECT);
+ service.createNewGroup(session.getHash(), group, "Public desc", "tag1 tag2", null);
+ }
- final Group groupCreated = groupFinder.findByShortName("ysei");
- assertEquals(groupCreated.getShortName(), group.getShortName());
- assertEquals(groupCreated.getLongName(), group.getLongName());
+ @Test(expected = UserMustBeLoggedException.class)
+ public void createGroupNullUserHash() throws Exception {
+ doLogin();
+ final GroupDTO group = new GroupDTO("ysei", "Yellow Submarine Environmental Initiative",
+ GroupType.PROJECT);
+ service.createNewGroup(null, group, "Public desc", "tag1 tag2", null);
+ }
- assertEquals(groupCreated.getAdmissionType(), AdmissionType.Moderated);
- assertEquals(groupCreated.getGroupType(), GroupType.PROJECT);
- }
+ @Test
+ public void createGroupUserLogged() throws Exception {
+ doLogin();
- @Test
- public void createOrganization() throws Exception {
- doLogin();
+ final GroupDTO group = new GroupDTO("ysei", "Yellow Submarine Environmental Initiative",
+ GroupType.PROJECT);
- final GroupDTO group = new GroupDTO("ysei", "Yellow Submarine Environmental Initiative", GroupType.ORGANIZATION);
+ final LicenseDTO license = new LicenseDTO();
+ license.setShortName("by-sa-v3.0");
+ group.setDefaultLicense(license);
+ service.createNewGroup(session.getHash(), group, "Public desc", "tag1 tag2", null);
- final LicenseDTO license = new LicenseDTO();
- license.setShortName("by-sa-v3.0");
- group.setDefaultLicense(license);
- service.createNewGroup(session.getHash(), group, "Public desc", "tag1 tag2", null);
+ final Group groupCreated = groupFinder.findByShortName("ysei");
+ assertEquals(groupCreated.getShortName(), group.getShortName());
+ assertEquals(groupCreated.getLongName(), group.getLongName());
- final Group groupCreated = groupFinder.findByShortName("ysei");
- assertEquals(groupCreated.getShortName(), group.getShortName());
- assertEquals(groupCreated.getLongName(), group.getLongName());
- assertEquals(groupCreated.getAdmissionType(), AdmissionType.Moderated);
- assertEquals(groupCreated.getGroupType(), GroupType.ORGANIZATION);
- }
+ assertEquals(groupCreated.getAdmissionType(), AdmissionType.Moderated);
+ assertEquals(groupCreated.getGroupType(), GroupType.PROJECT);
+ }
- @Test
- public void createOrphanedProject() throws Exception {
- doLogin();
+ @Test
+ public void createOrganization() throws Exception {
+ doLogin();
- final GroupDTO group = new GroupDTO("ysei", "Yellow Submarine Environmental Initiative",
- GroupType.ORPHANED_PROJECT);
+ final GroupDTO group = new GroupDTO("ysei", "Yellow Submarine Environmental Initiative",
+ GroupType.ORGANIZATION);
- final LicenseDTO license = new LicenseDTO();
- license.setShortName("by-sa-v3.0");
- group.setDefaultLicense(license);
- service.createNewGroup(session.getHash(), group, "Public desc", "tag1 tag2", null);
+ final LicenseDTO license = new LicenseDTO();
+ license.setShortName("by-sa-v3.0");
+ group.setDefaultLicense(license);
+ service.createNewGroup(session.getHash(), group, "Public desc", "tag1 tag2", null);
- final Group groupCreated = groupFinder.findByShortName("ysei");
- assertEquals(groupCreated.getShortName(), group.getShortName());
- assertEquals(groupCreated.getLongName(), group.getLongName());
- assertEquals(groupCreated.getAdmissionType(), AdmissionType.Open);
- assertEquals(groupCreated.getGroupType(), GroupType.ORPHANED_PROJECT);
- assertEquals(0, groupCreated.getSocialNetwork().getAccessLists().getAdmins().getList().size());
- assertEquals(0, groupCreated.getSocialNetwork().getAccessLists().getEditors().getList().size());
- }
+ final Group groupCreated = groupFinder.findByShortName("ysei");
+ assertEquals(groupCreated.getShortName(), group.getShortName());
+ assertEquals(groupCreated.getLongName(), group.getLongName());
+ assertEquals(groupCreated.getAdmissionType(), AdmissionType.Moderated);
+ assertEquals(groupCreated.getGroupType(), GroupType.ORGANIZATION);
+ }
- @Before
- public void init() {
- new IntegrationTestHelper(this);
- }
+ @Test
+ public void createOrphanedProject() throws Exception {
+ doLogin();
+ final GroupDTO group = new GroupDTO("ysei", "Yellow Submarine Environmental Initiative",
+ GroupType.ORPHANED_PROJECT);
+
+ final LicenseDTO license = new LicenseDTO();
+ license.setShortName("by-sa-v3.0");
+ group.setDefaultLicense(license);
+ service.createNewGroup(session.getHash(), group, "Public desc", "tag1 tag2", null);
+
+ final Group groupCreated = groupFinder.findByShortName("ysei");
+ assertEquals(groupCreated.getShortName(), group.getShortName());
+ assertEquals(groupCreated.getLongName(), group.getLongName());
+ assertEquals(groupCreated.getAdmissionType(), AdmissionType.Open);
+ assertEquals(groupCreated.getGroupType(), GroupType.ORPHANED_PROJECT);
+ assertEquals(0, groupCreated.getSocialNetwork().getAccessLists().getAdmins().getList().size());
+ assertEquals(0, groupCreated.getSocialNetwork().getAccessLists().getEditors().getList().size());
+ }
+
+ @Before
+ public void init() {
+ new IntegrationTestHelper(this);
+ }
+
}
1
0
Author: vjrj_
Date: 2011-07-09 18:44:34 +0200 (Sat, 09 Jul 2011)
New Revision: 1442
Added:
trunk/src/main/java/cc/kune/chat/client/KuneBrowserFocusManager.java
trunk/src/main/java/cc/kune/core/client/events/WindowFocusEvent.java
trunk/src/main/java/cc/kune/wave/server/AbstractBaseRobotAgent.java
trunk/src/main/java/cc/kune/wave/server/KuneAgent.java
trunk/src/main/java/com/google/wave/splash/text/ContentNewUnrenderer.java
trunk/src/main/java/com/google/wave/splash/text/HtmlRawViewImpl.java
trunk/src/main/java/com/google/wave/splash/text/UnrenderUtils.java
trunk/src/test/java/cc/kune/wave/server/KuneAgentTest.java
trunk/src/test/java/com/
trunk/src/test/java/com/google/
trunk/src/test/java/com/google/wave/
trunk/src/test/java/com/google/wave/splash/
trunk/src/test/java/com/google/wave/splash/text/
trunk/src/test/java/com/google/wave/splash/text/ContentNewUnrendererTest.java
trunk/src/test/java/com/google/wave/splash/text/ContentUnrendererTest.java
Modified:
trunk/src/main/java/cc/kune/chat/client/KuneHablarSignals.java
trunk/src/main/java/cc/kune/chat/client/actions/OpenChatAction.java
trunk/src/main/java/cc/kune/chat/public/kune-hablar.css
trunk/src/main/java/cc/kune/common/client/actions/gwtui/AbstractGwtButtonGui.java
trunk/src/main/java/cc/kune/common/client/actions/gwtui/GwtMenuGui.java
trunk/src/main/java/cc/kune/common/client/actions/ui/AbstractGuiItem.java
trunk/src/main/java/cc/kune/common/client/actions/ui/descrip/AbstractGuiActionDescrip.java
trunk/src/main/java/cc/kune/common/client/actions/ui/descrip/GuiActionDescrip.java
trunk/src/main/java/cc/kune/common/client/tooltip/Tooltip.java
trunk/src/main/java/cc/kune/common/client/tooltip/TooltipTimers.java
trunk/src/main/java/cc/kune/core/client/groups/newgroup/NewGroupPresenter.java
trunk/src/main/java/cc/kune/core/client/sitebar/spaces/SpaceSelectorPresenter.java
trunk/src/main/java/cc/kune/core/client/sitebar/spaces/SpaceSelectorViewImpl.java
trunk/src/main/java/cc/kune/core/client/state/StateManagerDefault.java
trunk/src/main/java/cc/kune/core/public/ws.css
trunk/src/main/java/cc/kune/gspace/client/GSpaceArmorImpl.ui.xml
trunk/src/main/java/cc/kune/gspace/client/options/GroupOptions.java
trunk/src/main/java/cc/kune/gspace/client/options/GroupOptionsPresenter.java
trunk/src/main/java/cc/kune/gspace/client/resources/GSpaceArmorResources.java
trunk/src/main/java/cc/kune/gspace/client/resources/gSpaceArmor.css
trunk/src/main/java/cc/kune/gspace/client/resources/gSpaceArmorTheme.css
trunk/src/main/java/cc/kune/gspace/client/style/GSpaceBackManagerImpl.java
trunk/src/main/java/cc/kune/wave/server/KuneWaveManagerDefault.java
trunk/src/main/java/com/google/wave/splash/text/ContentRenderer.java
trunk/src/main/java/com/google/wave/splash/text/ContentUnrenderer.java
trunk/src/test/java/cc/kune/wave/server/KuneWaveManagerDefaultTest.java
Log:
Unrender wave revisited; Tooltips show on demand; css fixes; chatroom message when not logged; On window focus tooltip; Background fix
Added: trunk/src/main/java/cc/kune/chat/client/KuneBrowserFocusManager.java
===================================================================
--- trunk/src/main/java/cc/kune/chat/client/KuneBrowserFocusManager.java (rev 0)
+++ trunk/src/main/java/cc/kune/chat/client/KuneBrowserFocusManager.java 2011-07-09 16:44:34 UTC (rev 1442)
@@ -0,0 +1,58 @@
+package cc.kune.chat.client;
+
+import cc.kune.core.client.events.WindowFocusEvent;
+
+import com.calclab.hablar.chat.client.ui.ChatPresenter;
+import com.calclab.hablar.chat.client.ui.PairChatPresenter;
+import com.calclab.hablar.core.client.browser.BrowserFocusHandler;
+import com.calclab.hablar.core.client.browser.BrowserFocusHandler.BrowserFocusListener;
+import com.calclab.hablar.core.client.mvp.HablarEventBus;
+import com.calclab.hablar.core.client.page.Page;
+import com.calclab.hablar.core.client.page.PagePresenter.Visibility;
+import com.calclab.hablar.core.client.page.events.VisibilityChangedEvent;
+import com.calclab.hablar.core.client.page.events.VisibilityChangedHandler;
+import com.calclab.hablar.rooms.client.room.RoomPresenter;
+import com.calclab.hablar.signals.client.unattended.UnattendedPagesManager;
+import com.google.gwt.event.shared.EventBus;
+
+/**
+ * This class is a workaround to clear the focus on the active chat page FIXME:
+ * workaround to clear the focus <br/>
+ *
+ * <br/>
+ * TODO: change the page/header visibility system... quite a big job
+ *
+ *
+ */
+public class KuneBrowserFocusManager {
+
+ protected ChatPresenter currentFocused;
+
+ public KuneBrowserFocusManager(final EventBus kuneEventBus, final HablarEventBus eventBus,
+ final UnattendedPagesManager unattendedManager, final BrowserFocusHandler handler) {
+
+ eventBus.addHandler(VisibilityChangedEvent.TYPE, new VisibilityChangedHandler() {
+ @Override
+ public void onVisibilityChanged(final VisibilityChangedEvent event) {
+ if (event.getVisibility() == Visibility.focused) {
+ final Page<?> page = event.getPage();
+ if (PairChatPresenter.TYPE.equals(page.getType()) || RoomPresenter.TYPE.equals(page.getType())) {
+ currentFocused = (ChatPresenter) page;
+ }
+ }
+ }
+ });
+
+ handler.setFocusListener(new BrowserFocusListener() {
+ @Override
+ public void onBrowserFocusChanged(final boolean hasFocus) {
+ kuneEventBus.fireEvent(new WindowFocusEvent(hasFocus));
+ if (currentFocused != null) {
+ if (hasFocus == false) {
+ currentFocused.getDisplay().setTextBoxFocus(false);
+ }
+ }
+ }
+ });
+ }
+}
Modified: trunk/src/main/java/cc/kune/chat/client/KuneHablarSignals.java
===================================================================
--- trunk/src/main/java/cc/kune/chat/client/KuneHablarSignals.java 2011-07-08 00:00:41 UTC (rev 1441)
+++ trunk/src/main/java/cc/kune/chat/client/KuneHablarSignals.java 2011-07-09 16:44:34 UTC (rev 1442)
@@ -28,7 +28,6 @@
import com.calclab.hablar.core.client.mvp.HablarEventBus;
import com.calclab.hablar.signals.client.SignalMessages;
import com.calclab.hablar.signals.client.SignalPreferences;
-import com.calclab.hablar.signals.client.browserfocus.BrowserFocusManager;
import com.calclab.hablar.signals.client.notifications.NotificationManager;
import com.calclab.hablar.signals.client.preferences.SignalsPreferencesPresenter;
import com.calclab.hablar.signals.client.preferences.SignalsPreferencesWidget;
@@ -46,65 +45,64 @@
*/
public class KuneHablarSignals {
- public static SignalMessages signalMessages;
+ public static SignalMessages signalMessages;
- /**
- * Gets the {@link SignalMessages} object containing the internationalised
- * messages
- *
- * @return the SignalMessages object containing the internationalised
- * messages
- */
- public static SignalMessages i18n() {
- return signalMessages;
- }
+ /**
+ * Gets the {@link SignalMessages} object containing the internationalised
+ * messages
+ *
+ * @return the SignalMessages object containing the internationalised messages
+ */
+ public static SignalMessages i18n() {
+ return signalMessages;
+ }
- /**
- * Sets the {@link SignalMessages} object containing the internationalised
- * messages
- *
- * @param t
- * the messages object
- */
- public static void setMessages(final SignalMessages t) {
- KuneHablarSignals.signalMessages = t;
- }
+ /**
+ * Sets the {@link SignalMessages} object containing the internationalised
+ * messages
+ *
+ * @param t
+ * the messages object
+ */
+ public static void setMessages(final SignalMessages t) {
+ KuneHablarSignals.signalMessages = t;
+ }
- // FIXME: move to gin
- @SuppressWarnings("deprecation")
- public KuneHablarSignals(final EventBus eventBus, final XmppSession session, final Hablar hablar,
- final ChatClientAction action) {
- final HablarEventBus hablarEventBus = hablar.getEventBus();
- final PrivateStorageManager storageManager = Suco.get(PrivateStorageManager.class);
+ // FIXME: move to gin
+ @SuppressWarnings("deprecation")
+ public KuneHablarSignals(final EventBus kuneEventBus, final XmppSession session, final Hablar hablar,
+ final ChatClientAction action) {
+ final HablarEventBus hablarEventBus = hablar.getEventBus();
+ final PrivateStorageManager storageManager = Suco.get(PrivateStorageManager.class);
- final HasText titleDisplay = new HasText() {
- @Override
- public String getText() {
- return Window.getTitle();
- }
+ final HasText titleDisplay = new HasText() {
+ @Override
+ public String getText() {
+ return Window.getTitle();
+ }
- @Override
- public void setText(final String text) {
- Window.setTitle(text);
- }
- };
- final SignalPreferences preferences = new SignalPreferences();
+ @Override
+ public void setText(final String text) {
+ Window.setTitle(text);
+ }
+ };
+ final SignalPreferences preferences = new SignalPreferences();
- final UnattendedPagesManager manager = new UnattendedPagesManager(hablarEventBus,
- BrowserFocusHandler.getInstance());
- new BrowserFocusManager(hablarEventBus, manager, BrowserFocusHandler.getInstance());
- new UnattendedPresenter(hablarEventBus, preferences, manager, titleDisplay);
- new KuneUnattendedPresenter(eventBus, hablarEventBus, preferences, manager, action);
- final NotificationManager notificationManager = new NotificationManager(hablarEventBus, preferences);
+ final UnattendedPagesManager manager = new UnattendedPagesManager(hablarEventBus,
+ BrowserFocusHandler.getInstance());
+ new KuneBrowserFocusManager(kuneEventBus, hablarEventBus, manager, BrowserFocusHandler.getInstance());
+ new UnattendedPresenter(hablarEventBus, preferences, manager, titleDisplay);
+ new KuneUnattendedPresenter(kuneEventBus, hablarEventBus, preferences, manager, action);
+ final NotificationManager notificationManager = new NotificationManager(hablarEventBus, preferences);
- // notificationManager.addNotifier((BrowserPopupHablarNotifier)
- // GWT.create(BrowserPopupHablarNotifier.class),
- // true);
- notificationManager.addNotifier((KuneChatNotifier) GWT.create(KuneChatNotifier.class), true);
+ // notificationManager.addNotifier((BrowserPopupHablarNotifier)
+ // GWT.create(BrowserPopupHablarNotifier.class),
+ // true);
+ notificationManager.addNotifier((KuneChatNotifier) GWT.create(KuneChatNotifier.class), true);
- final SignalsPreferencesPresenter preferencesPage = new SignalsPreferencesPresenter(session, storageManager,
- hablarEventBus, preferences, new SignalsPreferencesWidget(), notificationManager);
- hablar.addPage(preferencesPage, UserContainer.ROL);
- }
+ final SignalsPreferencesPresenter preferencesPage = new SignalsPreferencesPresenter(session,
+ storageManager, hablarEventBus, preferences, new SignalsPreferencesWidget(), notificationManager);
+ hablar.addPage(preferencesPage, UserContainer.ROL);
+ }
}
Modified: trunk/src/main/java/cc/kune/chat/client/actions/OpenChatAction.java
===================================================================
--- trunk/src/main/java/cc/kune/chat/client/actions/OpenChatAction.java 2011-07-08 00:00:41 UTC (rev 1441)
+++ trunk/src/main/java/cc/kune/chat/client/actions/OpenChatAction.java 2011-07-09 16:44:34 UTC (rev 1442)
@@ -2,11 +2,17 @@
import cc.kune.chat.client.ChatClient;
import cc.kune.common.client.actions.ActionEvent;
+import cc.kune.common.client.notify.NotifyLevel;
import cc.kune.core.client.actions.RolAction;
+import cc.kune.core.client.auth.SignIn;
import cc.kune.core.client.state.Session;
+import cc.kune.core.client.state.SiteTokens;
+import cc.kune.core.client.state.StateManager;
+import cc.kune.core.client.state.TokenUtils;
import cc.kune.core.shared.dto.AbstractContentSimpleDTO;
import cc.kune.core.shared.dto.AccessRolDTO;
import cc.kune.core.shared.dto.StateContainerDTO;
+import cc.kune.core.shared.i18n.I18nTranslationService;
import com.google.inject.Inject;
import com.google.inject.Provider;
@@ -14,22 +20,36 @@
public class OpenChatAction extends RolAction {
private final Provider<ChatClient> chatClient;
+ private final I18nTranslationService i18n;
private final Session session;
+ private final Provider<SignIn> signIn;
+ private final StateManager stateManager;
@Inject
- public OpenChatAction(final Provider<ChatClient> chatClient, final Session session) {
- super(AccessRolDTO.Viewer, true);
+ public OpenChatAction(final Provider<ChatClient> chatClient, final Session session,
+ final StateManager stateManager, final Provider<SignIn> signIn, final I18nTranslationService i18n) {
+ super(AccessRolDTO.Viewer, false);
this.chatClient = chatClient;
this.session = session;
+ this.stateManager = stateManager;
+ this.signIn = signIn;
+ this.i18n = i18n;
}
@Override
public void actionPerformed(final ActionEvent event) {
- final ChatClient chat = chatClient.get();
- final Object target = event.getTarget();
- final String roomName = (target instanceof AbstractContentSimpleDTO) ? ((AbstractContentSimpleDTO) target).getName()
- : ((StateContainerDTO) session.getCurrentState()).getTitle();
- chat.joinRoom(roomName, session.getCurrentUserInfo().getShortName());
- chat.show();
+ if (session.isLogged()) {
+ final ChatClient chat = chatClient.get();
+ final Object target = event.getTarget();
+ final String roomName = (target instanceof AbstractContentSimpleDTO) ? ((AbstractContentSimpleDTO) target).getName()
+ : ((StateContainerDTO) session.getCurrentState()).getTitle();
+ chat.joinRoom(roomName, session.getCurrentUserInfo().getShortName());
+ chat.show();
+ } else {
+ signIn.get().setErrorMessage(i18n.t("Sign in or create an account to access to this room"),
+ NotifyLevel.info);
+ stateManager.gotoHistoryToken(TokenUtils.addRedirect(SiteTokens.SIGNIN,
+ session.getCurrentStateToken().toString()));
+ }
}
}
\ No newline at end of file
Modified: trunk/src/main/java/cc/kune/chat/public/kune-hablar.css
===================================================================
--- trunk/src/main/java/cc/kune/chat/public/kune-hablar.css 2011-07-08 00:00:41 UTC (rev 1441)
+++ trunk/src/main/java/cc/kune/chat/public/kune-hablar.css 2011-07-09 16:44:34 UTC (rev 1442)
@@ -99,7 +99,6 @@
border-right: 1px solid #e9e9e9;
}
*/
-
input[disabled] {
background-color: #e9e9e9;
color: black;
@@ -231,8 +230,8 @@
}
/** IE6 ZINDEX BUG **/
-.hablar-HablarWidget {
- /* z-index: 1; */
+.hablar-HablarWidget { /* z-index: 1; */
+
}
html {
@@ -599,4 +598,14 @@
.gwt-TextArea {
border: 1px solid #bbbbbb;
-}
\ No newline at end of file
+}
+
+#gwt-debug-DoubleList-selectAll,#gwt-debug-DoubleList-selectSome,#gwt-debug-DoubleList-deselectAll,#gwt-debug-DoubleList-deselectSome
+ {
+ margin-left: -6px;
+}
+
+.hablar-RosterGroupWidget {
+ -moz-user-select: none;
+ -khtml-user-select: none;
+}
Modified: trunk/src/main/java/cc/kune/common/client/actions/gwtui/AbstractGwtButtonGui.java
===================================================================
--- trunk/src/main/java/cc/kune/common/client/actions/gwtui/AbstractGwtButtonGui.java 2011-07-08 00:00:41 UTC (rev 1441)
+++ trunk/src/main/java/cc/kune/common/client/actions/gwtui/AbstractGwtButtonGui.java 2011-07-09 16:44:34 UTC (rev 1442)
@@ -43,6 +43,7 @@
protected boolean enableTongle;
private IconLabel iconLabel;
private boolean isChild;
+ private Tooltip tooltip;
public AbstractGwtButtonGui() {
this(null, false);
@@ -154,10 +155,10 @@
}
@Override
- public void setToolTipText(final String tooltip) {
- if (tooltip != null && !tooltip.isEmpty()) {
+ public void setToolTipText(final String tooltipText) {
+ if (tooltipText != null && !tooltipText.isEmpty()) {
final KeyStroke key = (KeyStroke) descriptor.getValue(Action.ACCELERATOR_KEY);
- Tooltip.to(button, key == null ? tooltip : tooltip + key.toString());
+ tooltip = Tooltip.to(button, key == null ? tooltipText : tooltipText + key.toString());
}
}
@@ -171,4 +172,15 @@
return !descriptor.isChild();
}
+ @Override
+ protected void toogleTooltipVisible() {
+ if (tooltip != null) {
+ if (tooltip.isVisible()) {
+ tooltip.hide();
+ } else {
+ tooltip.showTemporally();
+ }
+ }
+ }
+
}
Modified: trunk/src/main/java/cc/kune/common/client/actions/gwtui/GwtMenuGui.java
===================================================================
--- trunk/src/main/java/cc/kune/common/client/actions/gwtui/GwtMenuGui.java 2011-07-08 00:00:41 UTC (rev 1441)
+++ trunk/src/main/java/cc/kune/common/client/actions/gwtui/GwtMenuGui.java 2011-07-09 16:44:34 UTC (rev 1442)
@@ -56,7 +56,7 @@
notStandAlone = !((MenuDescriptor) descriptor).isStandalone();
if (notStandAlone) {
button = new Button();
- // button.setStylePrimaryName("oc-button");
+ button.removeStyleName("gwt-Button");
iconLabel = new IconLabel("");
final ImageResource rightIcon = ((MenuDescriptor) descriptor).getRightIcon();
if (rightIcon != null) {
Modified: trunk/src/main/java/cc/kune/common/client/actions/ui/AbstractGuiItem.java
===================================================================
--- trunk/src/main/java/cc/kune/common/client/actions/ui/AbstractGuiItem.java 2011-07-08 00:00:41 UTC (rev 1441)
+++ trunk/src/main/java/cc/kune/common/client/actions/ui/AbstractGuiItem.java 2011-07-09 16:44:34 UTC (rev 1442)
@@ -99,6 +99,8 @@
setToolTipText((String) newValue);
} else if (event.getPropertyName().equals(GuiActionDescrip.VISIBLE)) {
setVisible((Boolean) newValue);
+ } else if (event.getPropertyName().equals(GuiActionDescrip.TOOGLE_TOOLTIP_VISIBLE)) {
+ toogleTooltipVisible();
} else if (event.getPropertyName().equals(Action.STYLES)) {
setStyles((String) newValue);
}
@@ -160,6 +162,11 @@
protected abstract void setText(String text);
+ protected void toogleTooltipVisible() {
+ // do nothing by default
+ return;
+ }
+
protected abstract void setToolTipText(String text);
private void setVisible(final Boolean visible) {
Modified: trunk/src/main/java/cc/kune/common/client/actions/ui/descrip/AbstractGuiActionDescrip.java
===================================================================
--- trunk/src/main/java/cc/kune/common/client/actions/ui/descrip/AbstractGuiActionDescrip.java 2011-07-08 00:00:41 UTC (rev 1441)
+++ trunk/src/main/java/cc/kune/common/client/actions/ui/descrip/AbstractGuiActionDescrip.java 2011-07-09 16:44:34 UTC (rev 1442)
@@ -33,244 +33,255 @@
*/
public abstract class AbstractGuiActionDescrip extends ChangeableObject implements GuiActionDescrip {
- /** The action. */
- private final AbstractAction action;
+ /** The action. */
+ private final AbstractAction action;
- private final List<GuiAddCondition> addConditions;
+ private final List<GuiAddCondition> addConditions;
- /** The item DOM id. */
- private String id;
+ /** The item DOM id. */
+ private String id;
- /** The item location. */
- private String location;
+ /** The item location. */
+ private String location;
- protected GuiActionDescrip parent = NO_PARENT;
+ protected GuiActionDescrip parent = NO_PARENT;
- /** The position where the item will be inserted. */
- private int position;
+ /** The position where the item will be inserted. */
+ private int position;
- /**
- * Instantiates a new abstract ui action descriptor. This is used for
- * describe UI button, menus, menu items and so on
- *
- * @param action
- * the action
- */
- public AbstractGuiActionDescrip(final AbstractAction action) {
- this.action = action;
- putValue(Action.ENABLED, Boolean.TRUE);
- putValue(VISIBLE, Boolean.TRUE);
- position = NO_POSITION;
- parent = NO_PARENT;
- addConditions = new ArrayList<GuiAddCondition>();
- }
+ /**
+ * Instantiates a new abstract ui action descriptor. This is used for describe
+ * UI button, menus, menu items and so on
+ *
+ * @param action
+ * the action
+ */
+ public AbstractGuiActionDescrip(final AbstractAction action) {
+ this.action = action;
+ putValue(Action.ENABLED, Boolean.TRUE);
+ putValue(VISIBLE, Boolean.TRUE);
+ position = NO_POSITION;
+ parent = NO_PARENT;
+ addConditions = new ArrayList<GuiAddCondition>();
+ }
- @Override
- public void add(final GuiAddCondition addCondition) {
- addConditions.add(addCondition);
- }
+ @Override
+ public void add(final GuiAddCondition addCondition) {
+ addConditions.add(addCondition);
+ }
- @Override
- public void fire(final ActionEvent event) {
- action.actionPerformed(event);
- }
+ @Override
+ public void fire(final ActionEvent event) {
+ action.actionPerformed(event);
+ }
- @Override
- public AbstractAction getAction() {
- return action;
- }
+ @Override
+ public AbstractAction getAction() {
+ return action;
+ }
- @Override
- public String getId() {
- return id;
- }
+ @Override
+ public String getId() {
+ return id;
+ }
- /**
- * Gets the location, a string used to group actions with locations (top
- * bar, bottom bar, user bar...).
- *
- * @return the location
- */
- @Override
- public String getLocation() {
- return location;
- }
+ /**
+ * Gets the location, a string used to group actions with locations (top bar,
+ * bottom bar, user bar...).
+ *
+ * @return the location
+ */
+ @Override
+ public String getLocation() {
+ return location;
+ }
- @Override
- public GuiActionDescrip getParent() {
- return parent;
- }
+ @Override
+ public GuiActionDescrip getParent() {
+ return parent;
+ }
- /**
- * Gets the position.
- *
- * @return the position
- */
- @Override
- public int getPosition() {
- return position;
- }
+ /**
+ * Gets the position.
+ *
+ * @return the position
+ */
+ @Override
+ public int getPosition() {
+ return position;
+ }
- @Override
- public Object getTarget() {
- return getValue(TARGET);
- }
+ @Override
+ public Object getTarget() {
+ return getValue(TARGET);
+ }
- @Override
- public abstract Class<?> getType();
+ @Override
+ public abstract Class<?> getType();
- @Override
- /**
- * We try to get the gui property (for instance the name) and if it's empty we try to get the same property in actions. This permit to have several gui items with the same action but different gui properties (like text descriptions) if necessary.
- */
- public Object getValue(final String key) {
- final Object guiValue = super.getValue(key);
- if (guiValue == null) {
- return action.getValue(key);
- } else {
- return guiValue;
- }
+ @Override
+ /**
+ * We try to get the gui property (for instance the name) and if it's empty we try to get the same property in actions. This permit to have several gui items with the same action but different gui properties (like text descriptions) if necessary.
+ */
+ public Object getValue(final String key) {
+ final Object guiValue = super.getValue(key);
+ if (guiValue == null) {
+ return action.getValue(key);
+ } else {
+ return guiValue;
}
+ }
- @Override
- public boolean hasTarget() {
- return getValue(TARGET) != null;
- }
+ @Override
+ public boolean hasTarget() {
+ return getValue(TARGET) != null;
+ }
- @Override
- public boolean isChild() {
- return !parent.equals(NO_PARENT);
- }
+ @Override
+ public boolean isChild() {
+ return !parent.equals(NO_PARENT);
+ }
- @Override
- public boolean isEnabled() {
- return (Boolean) getValue(Action.ENABLED);
- }
+ @Override
+ public boolean isEnabled() {
+ return (Boolean) getValue(Action.ENABLED);
+ }
- @Override
- public boolean isVisible() {
- return (Boolean) getValue(VISIBLE);
- }
+ @Override
+ public boolean isVisible() {
+ return (Boolean) getValue(VISIBLE);
+ }
- @Override
- public boolean mustBeAdded() {
- final boolean result = true;
- for (final GuiAddCondition addCondition : addConditions) {
- if (!addCondition.mustBeAdded(this)) {
- return false;
- }
- }
- return result;
+ @Override
+ public boolean mustBeAdded() {
+ final boolean result = true;
+ for (final GuiAddCondition addCondition : addConditions) {
+ if (!addCondition.mustBeAdded(this)) {
+ return false;
+ }
}
+ return result;
+ }
- @Override
- public void setEnabled(final boolean enabled) {
- putValue(Action.ENABLED, enabled);
- }
+ @Override
+ public void setEnabled(final boolean enabled) {
+ putValue(Action.ENABLED, enabled);
+ }
- @Override
- public void setId(final String id) {
- this.id = id;
- }
+ @Override
+ public void setId(final String id) {
+ this.id = id;
+ }
- /**
- * If we have several toolbars, we can group with the "location" string key
- * actions that must be in the same location (ex: top bar, bottom bar, and
- * so on).
- *
- * @param location
- * the new location
- */
- @Override
- public void setLocation(final String location) {
- this.location = location;
- }
+ /**
+ * If we have several toolbars, we can group with the "location" string key
+ * actions that must be in the same location (ex: top bar, bottom bar, and so
+ * on).
+ *
+ * @param location
+ * the new location
+ */
+ @Override
+ public void setLocation(final String location) {
+ this.location = location;
+ }
- @Override
- public void setParent(final GuiActionDescrip parent) {
- this.parent = parent;
- }
+ @Override
+ public void setParent(final GuiActionDescrip parent) {
+ this.parent = parent;
+ }
- /**
- * Sets the position (where the UI element will be positioned, for instance
- * in a toolbar or in a menu).
- *
- * @param position
- * the new position
- */
- @Override
- public void setPosition(final int position) {
- this.position = position;
- }
+ /**
+ * Sets the position (where the UI element will be positioned, for instance in
+ * a toolbar or in a menu).
+ *
+ * @param position
+ * the new position
+ */
+ @Override
+ public void setPosition(final int position) {
+ this.position = position;
+ }
- @Override
- public void setStyles(final String styles) {
- putValue(Action.STYLES, styles);
- }
+ @Override
+ public void setStyles(final String styles) {
+ putValue(Action.STYLES, styles);
+ }
- @Override
- public void setTarget(final Object object) {
- putValue(TARGET, object);
- }
+ @Override
+ public void setTarget(final Object object) {
+ putValue(TARGET, object);
+ }
- @Override
- public void setVisible(final boolean visible) {
- putValue(VISIBLE, visible);
- }
+ @Override
+ public void setVisible(final boolean visible) {
+ putValue(VISIBLE, visible);
+ }
- @Override
- public String toString() {
- final String name = (String) getValue(Action.NAME);
- final String tooltip = (String) getValue(Action.SHORT_DESCRIPTION);
- return "[GuiActionDescrip: " + getClass().getName() + (name == null ? "" : " " + name)
- + (tooltip == null ? "" : " " + tooltip) + "]";
- }
+ @Override
+ public void toggleTooltipVisible() {
+ final Object value = getValue(TOOGLE_TOOLTIP_VISIBLE);
+ putValue(TOOGLE_TOOLTIP_VISIBLE, value == null ? true : !(Boolean) value);
+ }
- @Override
- public GuiActionDescrip withIcon(final Object icon) {
- super.putValue(Action.SMALL_ICON, icon);
- return this;
- }
+ @Override
+ public void toogleVisible() {
+ putValue(VISIBLE, !isVisible());
+ }
- @Override
- public GuiActionDescrip withIconCls(final String icon) {
- putValue(Action.SMALL_ICON, icon);
- return this;
- }
+ @Override
+ public String toString() {
+ final String name = (String) getValue(Action.NAME);
+ final String tooltip = (String) getValue(Action.SHORT_DESCRIPTION);
+ return "[GuiActionDescrip: " + getClass().getName() + (name == null ? "" : " " + name)
+ + (tooltip == null ? "" : " " + tooltip) + "]";
+ }
- @Override
- public GuiActionDescrip withId(final String id) {
- setId(id);
- return this;
- }
+ @Override
+ public GuiActionDescrip withIcon(final Object icon) {
+ super.putValue(Action.SMALL_ICON, icon);
+ return this;
+ }
- @Override
- public GuiActionDescrip withParent(final GuiActionDescrip parent) {
- setParent(parent);
- return this;
- }
+ @Override
+ public GuiActionDescrip withIconCls(final String icon) {
+ putValue(Action.SMALL_ICON, icon);
+ return this;
+ }
- @Override
- public GuiActionDescrip withShortcut(final KeyStroke shortcut) {
- putValue(Action.ACCELERATOR_KEY, shortcut);
- return this;
- }
+ @Override
+ public GuiActionDescrip withId(final String id) {
+ setId(id);
+ return this;
+ }
- @Override
- public GuiActionDescrip withStyles(final String styles) {
- setStyles(styles);
- return this;
- }
+ @Override
+ public GuiActionDescrip withParent(final GuiActionDescrip parent) {
+ setParent(parent);
+ return this;
+ }
- @Override
- public GuiActionDescrip withText(final String text) {
- putValue(Action.NAME, text);
- return this;
- }
+ @Override
+ public GuiActionDescrip withShortcut(final KeyStroke shortcut) {
+ putValue(Action.ACCELERATOR_KEY, shortcut);
+ return this;
+ }
- @Override
- public GuiActionDescrip withToolTip(final String tooltip) {
- putValue(Action.SHORT_DESCRIPTION, tooltip);
- return this;
- }
+ @Override
+ public GuiActionDescrip withStyles(final String styles) {
+ setStyles(styles);
+ return this;
+ }
+
+ @Override
+ public GuiActionDescrip withText(final String text) {
+ putValue(Action.NAME, text);
+ return this;
+ }
+
+ @Override
+ public GuiActionDescrip withToolTip(final String tooltip) {
+ putValue(Action.SHORT_DESCRIPTION, tooltip);
+ return this;
+ }
}
Modified: trunk/src/main/java/cc/kune/common/client/actions/ui/descrip/GuiActionDescrip.java
===================================================================
--- trunk/src/main/java/cc/kune/common/client/actions/ui/descrip/GuiActionDescrip.java 2011-07-08 00:00:41 UTC (rev 1441)
+++ trunk/src/main/java/cc/kune/common/client/actions/ui/descrip/GuiActionDescrip.java 2011-07-09 16:44:34 UTC (rev 1442)
@@ -26,88 +26,94 @@
public interface GuiActionDescrip {
- public static final AbstractGuiActionDescrip NO_PARENT = new NoParentGuiActionDescriptor();
+ public static final AbstractGuiActionDescrip NO_PARENT = new NoParentGuiActionDescriptor();
- public static final int NO_POSITION = -1;
+ public static final int NO_POSITION = -1;
- /**
- * {@link #TARGET} is used to associate a {@link #AbstractGuiActionDescrip}
- * with an object like groups, group names, users, and so on, and used to
- * execute actions against these targets
- */
- public static final String TARGET = "target";
+ /**
+ * {@link #TARGET} is used to associate a {@link #AbstractGuiActionDescrip}
+ * with an object like groups, group names, users, and so on, and used to
+ * execute actions against these targets
+ */
+ public static final String TARGET = "target";
- public static final String VISIBLE = "visibleprop";
+ public static final String TOOGLE_TOOLTIP_VISIBLE = "toogle-tooltip-visible";
- void add(final GuiAddCondition addCondition);
+ public static final String VISIBLE = "visibleprop";
- void addPropertyChangeListener(final PropertyChangeListener listener);
+ void add(final GuiAddCondition addCondition);
- void fire(final ActionEvent event);
+ void addPropertyChangeListener(final PropertyChangeListener listener);
- AbstractAction getAction();
+ void fire(final ActionEvent event);
- String getId();
+ AbstractAction getAction();
- Object[] getKeys();
+ String getId();
- String getLocation();
+ Object[] getKeys();
- GuiActionDescrip getParent();
+ String getLocation();
- int getPosition();
+ GuiActionDescrip getParent();
- PropertyChangeListener[] getPropertyChangeListeners();
+ int getPosition();
- Object getTarget();
+ PropertyChangeListener[] getPropertyChangeListeners();
- Class<?> getType();
+ Object getTarget();
- Object getValue(final String key);
+ Class<?> getType();
- boolean hasTarget();
+ Object getValue(final String key);
- boolean isChild();
+ boolean hasTarget();
- boolean isEnabled();
+ boolean isChild();
- boolean isVisible();
+ boolean isEnabled();
- boolean mustBeAdded();
+ boolean isVisible();
- public void putValue(final String key, final Object value);
+ boolean mustBeAdded();
- void removePropertyChangeListener(final PropertyChangeListener listener);
+ public void putValue(final String key, final Object value);
- void setEnabled(final boolean enabled);
+ void removePropertyChangeListener(final PropertyChangeListener listener);
- void setId(final String id);
+ void setEnabled(final boolean enabled);
- void setLocation(final String location);
+ void setId(final String id);
- void setParent(final GuiActionDescrip parent);
+ void setLocation(final String location);
- void setPosition(final int position);
+ void setParent(final GuiActionDescrip parent);
- void setStyles(final String styles);
+ void setPosition(final int position);
- void setTarget(final Object object);
+ void setStyles(final String styles);
- void setVisible(final boolean visible);
+ void setTarget(final Object object);
- GuiActionDescrip withIcon(Object icon);
+ void setVisible(final boolean visible);
- GuiActionDescrip withIconCls(String icon);
+ void toggleTooltipVisible();
- GuiActionDescrip withId(String id);
+ void toogleVisible();
- GuiActionDescrip withParent(GuiActionDescrip parent);
+ GuiActionDescrip withIcon(Object icon);
- GuiActionDescrip withShortcut(KeyStroke keystroke);
+ GuiActionDescrip withIconCls(String icon);
- GuiActionDescrip withStyles(String styles);
+ GuiActionDescrip withId(String id);
- GuiActionDescrip withText(String text);
+ GuiActionDescrip withParent(GuiActionDescrip parent);
- GuiActionDescrip withToolTip(String tooltip);
+ GuiActionDescrip withShortcut(KeyStroke keystroke);
+
+ GuiActionDescrip withStyles(String styles);
+
+ GuiActionDescrip withText(String text);
+
+ GuiActionDescrip withToolTip(String tooltip);
}
Modified: trunk/src/main/java/cc/kune/common/client/tooltip/Tooltip.java
===================================================================
--- trunk/src/main/java/cc/kune/common/client/tooltip/Tooltip.java 2011-07-08 00:00:41 UTC (rev 1441)
+++ trunk/src/main/java/cc/kune/common/client/tooltip/Tooltip.java 2011-07-09 16:44:34 UTC (rev 1442)
@@ -45,155 +45,165 @@
public class Tooltip extends PopupPanel {
- interface TooltipUiBinder extends UiBinder<Widget, Tooltip> {
- }
+ interface TooltipUiBinder extends UiBinder<Widget, Tooltip> {
+ }
- private static TooltipUiBinder uiBinder = GWT.create(TooltipUiBinder.class);
+ private static TooltipUiBinder uiBinder = GWT.create(TooltipUiBinder.class);
- public static Tooltip to(final Widget widget, final String text) {
- if (TextUtils.notEmpty(text)) {
- final Tooltip tip = new Tooltip();
- tip.to(widget);
- tip.setText(text);
- return tip;
- }
- return null;
+ public static Tooltip to(final Widget widget, final String text) {
+ if (TextUtils.notEmpty(text)) {
+ final Tooltip tip = new Tooltip();
+ tip.to(widget);
+ tip.setText(text);
+ return tip;
}
+ return null;
+ }
- public static Tooltip to(final Widget widget, final Widget withContent) {
- final Tooltip tip = new Tooltip();
- tip.to(widget);
- tip.setContent(withContent);
- return tip;
- }
- @UiField
- HTMLPanel arrow;
- @UiField
- HTMLPanel arrowBorder;
- @UiField
- FlowPanel content;
- @UiField
- FlowPanel flow;
- private Widget ofWidget;
- private final TooltipTimers timers;
- @UiField
- InlineLabel title;
- @UiField
- HTMLPanel tooltip;
+ public static Tooltip to(final Widget widget, final Widget withContent) {
+ final Tooltip tip = new Tooltip();
+ tip.to(widget);
+ tip.setContent(withContent);
+ return tip;
+ }
+ @UiField
+ HTMLPanel arrow;
+ @UiField
+ HTMLPanel arrowBorder;
+ @UiField
+ FlowPanel content;
+ @UiField
+ FlowPanel flow;
+ private Widget ofWidget;
+ private final TooltipTimers timers;
+ @UiField
+ InlineLabel title;
+ @UiField
+ HTMLPanel tooltip;
- public Tooltip() {
- super.add(uiBinder.createAndBindUi(this));
- super.setStyleName("k-tooltip-no-chrome");
- super.setAutoHideEnabled(false);
- super.setAnimationEnabled(false);
- final TimerWrapper overTimer = new TimerWrapper();
- overTimer.configure(new Executer() {
- @Override
- public void execute() {
- show();
- }
- });
- final Executer hideExecuter = new Executer() {
- @Override
- public void execute() {
- hide();
- }
- };
- final TimerWrapper outTimer = new TimerWrapper();
- final TimerWrapper securityTimer = new TimerWrapper();
- outTimer.configure(hideExecuter);
- securityTimer.configure(hideExecuter);
- timers = new TooltipTimers(overTimer, outTimer, securityTimer);
- }
+ public Tooltip() {
+ super.add(uiBinder.createAndBindUi(this));
+ super.setStyleName("k-tooltip-no-chrome");
+ super.setAutoHideEnabled(false);
+ super.setAnimationEnabled(false);
+ final TimerWrapper overTimer = new TimerWrapper();
+ overTimer.configure(new Executer() {
+ @Override
+ public void execute() {
+ show();
+ }
+ });
+ final Executer hideExecuter = new Executer() {
+ @Override
+ public void execute() {
+ hide();
+ }
+ };
+ final TimerWrapper outTimer = new TimerWrapper();
+ final TimerWrapper securityTimer = new TimerWrapper();
+ outTimer.configure(hideExecuter);
+ securityTimer.configure(hideExecuter);
+ timers = new TooltipTimers(overTimer, outTimer, securityTimer);
+ }
- protected int getHeight() {
- return tooltip.getElement().getOffsetHeight();
- }
+ protected int getHeight() {
+ return tooltip.getElement().getOffsetHeight();
+ }
- protected int getWidth() {
- return tooltip.getElement().getOffsetWidth();
- }
+ protected int getWidth() {
+ return tooltip.getElement().getOffsetWidth();
+ }
- private void setContent(final Widget widget) {
- content.clear();
- content.add(widget);
- }
+ @Override
+ public boolean isVisible() {
+ return super.isShowing();
+ }
- public void setText(final String text) {
- content.clear();
- content.add(new Label(text));
- }
+ private void setContent(final Widget widget) {
+ content.clear();
+ content.add(widget);
+ }
- @Override
- public void show() {
- if (!Tooltip.this.isShowing() && ofWidget.isVisible()) {
- Tooltip.super.show();
- Tooltip.this.showAt(TooltipPositionCalculator.calculate(Window.getClientWidth(), Window.getClientHeight(),
- ofWidget.getAbsoluteLeft(), ofWidget.getAbsoluteTop(), ofWidget.getOffsetWidth(),
- ofWidget.getOffsetHeight(), Tooltip.this.getWidth(), Tooltip.this.getHeight()));
- if (tooltip.getOffsetWidth() > 430) {
- tooltip.getElement().getStyle().setWidth(430, Unit.PX);
- } else {
- tooltip.getElement().getStyle().clearWidth();
- }
- }
+ public void setText(final String text) {
+ content.clear();
+ content.add(new Label(text));
+ }
+
+ @Override
+ public void show() {
+ if (!Tooltip.this.isShowing() && ofWidget.isVisible()) {
+ Tooltip.super.show();
+ Tooltip.this.showAt(TooltipPositionCalculator.calculate(Window.getClientWidth(),
+ Window.getClientHeight(), ofWidget.getAbsoluteLeft(), ofWidget.getAbsoluteTop(),
+ ofWidget.getOffsetWidth(), ofWidget.getOffsetHeight(), Tooltip.this.getWidth(),
+ Tooltip.this.getHeight()));
+ if (tooltip.getOffsetWidth() > 430) {
+ tooltip.getElement().getStyle().setWidth(430, Unit.PX);
+ } else {
+ tooltip.getElement().getStyle().clearWidth();
+ }
}
+ }
- protected void showAt(final TooltipPosition position) {
- this.setPopupPosition(position.getLeft(), position.getTop());
- switch (position.getArrowPosition()) {
- case N:
- case NW:
- case NE:
- arrow.getElement().getStyle().setLeft(position.getArrowLeft(), Unit.PX);
- arrow.getElement().getStyle().setTop(position.getArrowTop() + 3, Unit.PX);
- arrowBorder.getElement().getStyle().setLeft(position.getArrowLeft(), Unit.PX);
- arrowBorder.getElement().getStyle().setTop(position.getArrowTop() + 1, Unit.PX);
- arrow.getElement().removeClassName("k-tooltip-arrow-s");
- arrow.getElement().addClassName("k-tooltip-arrow-n");
- arrowBorder.getElement().removeClassName("k-tooltip-arrow-border-s");
- arrowBorder.getElement().addClassName("k-tooltip-arrow-border-n");
- break;
- case S:
- case SE:
- case SW:
- arrow.getElement().getStyle().setLeft(position.getArrowLeft(), Unit.PX);
- arrow.getElement().getStyle().setBottom(position.getArrowTop() + 2, Unit.PX);
- arrowBorder.getElement().getStyle().setLeft(position.getArrowLeft(), Unit.PX);
- arrowBorder.getElement().getStyle().setBottom(position.getArrowTop(), Unit.PX);
- arrow.getElement().addClassName("k-tooltip-arrow-s");
- arrow.getElement().removeClassName("k-tooltip-arrow-n");
- arrowBorder.getElement().addClassName("k-tooltip-arrow-border-s");
- arrowBorder.getElement().removeClassName("k-tooltip-arrow-border-n");
- break;
- }
+ protected void showAt(final TooltipPosition position) {
+ this.setPopupPosition(position.getLeft(), position.getTop());
+ switch (position.getArrowPosition()) {
+ case N:
+ case NW:
+ case NE:
+ arrow.getElement().getStyle().setLeft(position.getArrowLeft(), Unit.PX);
+ arrow.getElement().getStyle().setTop(position.getArrowTop() + 3, Unit.PX);
+ arrowBorder.getElement().getStyle().setLeft(position.getArrowLeft(), Unit.PX);
+ arrowBorder.getElement().getStyle().setTop(position.getArrowTop() + 1, Unit.PX);
+ arrow.getElement().removeClassName("k-tooltip-arrow-s");
+ arrow.getElement().addClassName("k-tooltip-arrow-n");
+ arrowBorder.getElement().removeClassName("k-tooltip-arrow-border-s");
+ arrowBorder.getElement().addClassName("k-tooltip-arrow-border-n");
+ break;
+ case S:
+ case SE:
+ case SW:
+ arrow.getElement().getStyle().setLeft(position.getArrowLeft(), Unit.PX);
+ arrow.getElement().getStyle().setBottom(position.getArrowTop() + 2, Unit.PX);
+ arrowBorder.getElement().getStyle().setLeft(position.getArrowLeft(), Unit.PX);
+ arrowBorder.getElement().getStyle().setBottom(position.getArrowTop(), Unit.PX);
+ arrow.getElement().addClassName("k-tooltip-arrow-s");
+ arrow.getElement().removeClassName("k-tooltip-arrow-n");
+ arrowBorder.getElement().addClassName("k-tooltip-arrow-border-s");
+ arrowBorder.getElement().removeClassName("k-tooltip-arrow-border-n");
+ break;
}
+ }
- private void to(final Widget ofWidget) {
- this.ofWidget = ofWidget;
- ofWidget.addDomHandler(new MouseOverHandler() {
- @Override
- public void onMouseOver(final MouseOverEvent event) {
- timers.onOver();
- }
- }, MouseOverEvent.getType());
- ofWidget.addDomHandler(new FocusHandler() {
- @Override
- public void onFocus(final FocusEvent event) {
- timers.onOut();
- }
- }, FocusEvent.getType());
- ofWidget.addDomHandler(new BlurHandler() {
- @Override
- public void onBlur(final BlurEvent event) {
- timers.onOut();
- }
- }, BlurEvent.getType());
- ofWidget.addDomHandler(new MouseOutHandler() {
- @Override
- public void onMouseOut(final MouseOutEvent event) {
- timers.onOut();
- }
- }, MouseOutEvent.getType());
- }
+ public void showTemporally() {
+ timers.showTemporally();
+ }
+
+ private void to(final Widget ofWidget) {
+ this.ofWidget = ofWidget;
+ ofWidget.addDomHandler(new MouseOverHandler() {
+ @Override
+ public void onMouseOver(final MouseOverEvent event) {
+ timers.onOver();
+ }
+ }, MouseOverEvent.getType());
+ ofWidget.addDomHandler(new FocusHandler() {
+ @Override
+ public void onFocus(final FocusEvent event) {
+ timers.onOut();
+ }
+ }, FocusEvent.getType());
+ ofWidget.addDomHandler(new BlurHandler() {
+ @Override
+ public void onBlur(final BlurEvent event) {
+ timers.onOut();
+ }
+ }, BlurEvent.getType());
+ ofWidget.addDomHandler(new MouseOutHandler() {
+ @Override
+ public void onMouseOut(final MouseOutEvent event) {
+ timers.onOut();
+ }
+ }, MouseOutEvent.getType());
+ }
}
Modified: trunk/src/main/java/cc/kune/common/client/tooltip/TooltipTimers.java
===================================================================
--- trunk/src/main/java/cc/kune/common/client/tooltip/TooltipTimers.java 2011-07-08 00:00:41 UTC (rev 1441)
+++ trunk/src/main/java/cc/kune/common/client/tooltip/TooltipTimers.java 2011-07-09 16:44:34 UTC (rev 1442)
@@ -23,37 +23,48 @@
public class TooltipTimers {
- private final TimerWrapper hideTimer;
- private final TimerWrapper securityTimer;
- private final TimerWrapper showTimer;
+ private final TimerWrapper hideTimer;
+ private final TimerWrapper securityTimer;
+ private final TimerWrapper showTimer;
- public TooltipTimers(final TimerWrapper showTimer, final TimerWrapper hideTimer, final TimerWrapper securityTimer) {
- this.showTimer = showTimer;
- this.hideTimer = hideTimer;
- this.securityTimer = securityTimer;
+ public TooltipTimers(final TimerWrapper showTimer, final TimerWrapper hideTimer,
+ final TimerWrapper securityTimer) {
+ this.showTimer = showTimer;
+ this.hideTimer = hideTimer;
+ this.securityTimer = securityTimer;
+ }
+
+ public void onOut() {
+ if (showTimer.isScheduled()) {
+ showTimer.cancel();
}
+ if (!hideTimer.isScheduled()) {
+ hideTimer.schedule(650);
+ }
+ if (!securityTimer.isScheduled()) {
+ securityTimer.cancel();
+ }
+ }
- public void onOut() {
- if (showTimer.isScheduled()) {
- showTimer.cancel();
- }
- if (!hideTimer.isScheduled()) {
- hideTimer.schedule(650);
- }
- if (!securityTimer.isScheduled()) {
- securityTimer.cancel();
- }
+ public void onOver() {
+ if (!showTimer.isScheduled()) {
+ showTimer.schedule(700);
}
+ if (hideTimer.isScheduled()) {
+ hideTimer.cancel();
+ }
+ if (!securityTimer.isScheduled()) {
+ securityTimer.schedule(7000);
+ }
+ }
- public void onOver() {
- if (!showTimer.isScheduled()) {
- showTimer.schedule(700);
- }
- if (hideTimer.isScheduled()) {
- hideTimer.cancel();
- }
- if (!securityTimer.isScheduled()) {
- securityTimer.schedule(7000);
- }
+ public void showTemporally() {
+ if (showTimer.isScheduled()) {
+ showTimer.cancel();
}
+ if (hideTimer.isScheduled()) {
+ hideTimer.cancel();
+ }
+ securityTimer.schedule(5000);
+ }
}
Added: trunk/src/main/java/cc/kune/core/client/events/WindowFocusEvent.java
===================================================================
--- trunk/src/main/java/cc/kune/core/client/events/WindowFocusEvent.java (rev 0)
+++ trunk/src/main/java/cc/kune/core/client/events/WindowFocusEvent.java 2011-07-09 16:44:34 UTC (rev 1442)
@@ -0,0 +1,81 @@
+package cc.kune.core.client.events;
+
+import com.google.gwt.event.shared.EventHandler;
+import com.google.gwt.event.shared.GwtEvent;
+import com.google.gwt.event.shared.HandlerRegistration;
+import com.google.gwt.event.shared.HasHandlers;
+
+public class WindowFocusEvent extends GwtEvent<WindowFocusEvent.WindowFocusHandler> {
+
+ public interface HasWindowFocusHandlers extends HasHandlers {
+ HandlerRegistration addWindowFocusHandler(WindowFocusHandler handler);
+ }
+
+ public interface WindowFocusHandler extends EventHandler {
+ public void onWindowFocus(WindowFocusEvent event);
+ }
+
+ private static final Type<WindowFocusHandler> TYPE = new Type<WindowFocusHandler>();
+
+ public static void fire(final HasHandlers source, final boolean hasFocus) {
+ source.fireEvent(new WindowFocusEvent(hasFocus));
+ }
+
+ public static Type<WindowFocusHandler> getType() {
+ return TYPE;
+ }
+
+ boolean hasFocus;
+
+ protected WindowFocusEvent() {
+ // Possibly for serialization.
+ }
+
+ public WindowFocusEvent(final boolean hasFocus) {
+ this.hasFocus = hasFocus;
+ }
+
+ @Override
+ protected void dispatch(final WindowFocusHandler handler) {
+ handler.onWindowFocus(this);
+ }
+
+ @Override
+ public boolean equals(final Object obj) {
+ if (this == obj) {
+ return true;
+ }
+ if (obj == null) {
+ return false;
+ }
+ if (getClass() != obj.getClass()) {
+ return false;
+ }
+ final WindowFocusEvent other = (WindowFocusEvent) obj;
+ if (hasFocus != other.hasFocus) {
+ return false;
+ }
+ return true;
+ }
+
+ @Override
+ public Type<WindowFocusHandler> getAssociatedType() {
+ return TYPE;
+ }
+
+ @Override
+ public int hashCode() {
+ int hashCode = 23;
+ hashCode = (hashCode * 37) + Boolean.valueOf(hasFocus).hashCode();
+ return hashCode;
+ }
+
+ public boolean isHasFocus() {
+ return hasFocus;
+ }
+
+ @Override
+ public String toString() {
+ return "WindowFocusEvent[" + hasFocus + "]";
+ }
+}
Modified: trunk/src/main/java/cc/kune/core/client/groups/newgroup/NewGroupPresenter.java
===================================================================
--- trunk/src/main/java/cc/kune/core/client/groups/newgroup/NewGroupPresenter.java 2011-07-08 00:00:41 UTC (rev 1441)
+++ trunk/src/main/java/cc/kune/core/client/groups/newgroup/NewGroupPresenter.java 2011-07-09 16:44:34 UTC (rev 1442)
@@ -36,7 +36,10 @@
import cc.kune.core.shared.dto.GroupType;
import cc.kune.core.shared.dto.LicenseDTO;
import cc.kune.core.shared.i18n.I18nTranslationService;
+import cc.kune.gspace.client.options.GroupOptions;
+import com.google.gwt.core.client.Scheduler;
+import com.google.gwt.core.client.Scheduler.ScheduledCommand;
import com.google.gwt.event.dom.client.ClickEvent;
import com.google.gwt.event.dom.client.ClickHandler;
import com.google.gwt.event.logical.shared.CloseEvent;
@@ -51,145 +54,156 @@
import com.gwtplatform.mvp.client.proxy.Proxy;
import com.gwtplatform.mvp.client.proxy.RevealRootContentEvent;
-public class NewGroupPresenter extends Presenter<NewGroupView, NewGroupPresenter.NewGroupProxy> implements NewGroup {
+public class NewGroupPresenter extends Presenter<NewGroupView, NewGroupPresenter.NewGroupProxy>
+ implements NewGroup {
- @ProxyCodeSplit
- public interface NewGroupProxy extends Proxy<NewGroupPresenter> {
- }
+ @ProxyCodeSplit
+ public interface NewGroupProxy extends Proxy<NewGroupPresenter> {
+ }
- private final Provider<GroupServiceAsync> groupService;
+ private final GroupOptions groupOptions;
- private final I18nTranslationService i18n;
- private final Session session;
- private final Provider<SignIn> signIn;
- private final StateManager stateManager;
+ private final Provider<GroupServiceAsync> groupService;
+ private final I18nTranslationService i18n;
+ private final Session session;
+ private final Provider<SignIn> signIn;
- @Inject
- public NewGroupPresenter(final EventBus eventBus, final NewGroupView view, final NewGroupProxy proxy,
- final I18nTranslationService i18n, final Session session, final StateManager stateManager,
- final Provider<GroupServiceAsync> groupService, final Provider<SignIn> signIn) {
- super(eventBus, view, proxy);
- this.i18n = i18n;
- this.session = session;
- this.stateManager = stateManager;
- this.groupService = groupService;
- this.signIn = signIn;
- stateManager.addSiteToken(SiteTokens.NEWGROUP, new HistoryTokenCallback() {
- @Override
- public void onHistoryToken() {
- doNewGroup();
- }
- });
- }
+ private final StateManager stateManager;
- @Override
- public void doNewGroup() {
- session.check(new AsyncCallbackSimple<Void>() {
- @Override
- public void onSuccess(final Void result) {
- if (session.isLogged()) {
- NotifyUser.showProgressProcessing();
- getView().show();
- getView().focusOnShorName();
- NotifyUser.hideProgress();
- } else {
- // stateManager.restorePreviousToken();
- NotifyUser.info(i18n.t(CoreMessages.REGISTER_TO_CREATE_A_GROUP));
- signIn.get().showSignInDialog();
- }
- }
- });
- }
+ @Inject
+ public NewGroupPresenter(final EventBus eventBus, final NewGroupView view, final NewGroupProxy proxy,
+ final I18nTranslationService i18n, final Session session, final StateManager stateManager,
+ final Provider<GroupServiceAsync> groupService, final Provider<SignIn> signIn,
+ final GroupOptions groupOptions) {
+ super(eventBus, view, proxy);
+ this.i18n = i18n;
+ this.session = session;
+ this.stateManager = stateManager;
+ this.groupService = groupService;
+ this.signIn = signIn;
+ this.groupOptions = groupOptions;
+ stateManager.addSiteToken(SiteTokens.NEWGROUP, new HistoryTokenCallback() {
+ @Override
+ public void onHistoryToken() {
+ doNewGroup();
+ }
+ });
+ }
- private GroupType getTypeOfGroup() {
- if (getView().isProject()) {
- return GroupType.PROJECT;
- } else if (getView().isOrganization()) {
- return GroupType.ORGANIZATION;
+ @Override
+ public void doNewGroup() {
+ session.check(new AsyncCallbackSimple<Void>() {
+ @Override
+ public void onSuccess(final Void result) {
+ if (session.isLogged()) {
+ NotifyUser.showProgressProcessing();
+ getView().show();
+ getView().focusOnShorName();
+ NotifyUser.hideProgress();
} else {
- return GroupType.COMMUNITY;
+ // stateManager.restorePreviousToken();
+ signIn.get().setErrorMessage(i18n.t(CoreMessages.REGISTER_TO_CREATE_A_GROUP), NotifyLevel.info);
+ signIn.get().showSignInDialog();
}
+ }
+ });
+ }
+
+ private GroupType getTypeOfGroup() {
+ if (getView().isProject()) {
+ return GroupType.PROJECT;
+ } else if (getView().isOrganization()) {
+ return GroupType.ORGANIZATION;
+ } else {
+ return GroupType.COMMUNITY;
}
+ }
- @Override
- protected void onBind() {
- super.onBind();
- getView().getFirstBtn().addClickHandler(new ClickHandler() {
- @Override
- public void onClick(final ClickEvent event) {
- onRegister();
- }
- });
- getView().getSecondBtn().addClickHandler(new ClickHandler() {
- @Override
- public void onClick(final ClickEvent event) {
- onCancel();
- }
- });
- getView().getClose().addCloseHandler(new CloseHandler<PopupPanel>() {
+ @Override
+ protected void onBind() {
+ super.onBind();
+ getView().getFirstBtn().addClickHandler(new ClickHandler() {
+ @Override
+ public void onClick(final ClickEvent event) {
+ onRegister();
+ }
+ });
+ getView().getSecondBtn().addClickHandler(new ClickHandler() {
+ @Override
+ public void onClick(final ClickEvent event) {
+ onCancel();
+ }
+ });
+ getView().getClose().addCloseHandler(new CloseHandler<PopupPanel>() {
- @Override
- public void onClose(final CloseEvent<PopupPanel> event) {
- NewGroupPresenter.this.onClose();
- }
- });
- }
+ @Override
+ public void onClose(final CloseEvent<PopupPanel> event) {
+ NewGroupPresenter.this.onClose();
+ }
+ });
+ }
- public void onCancel() {
- getView().hide();
- }
+ public void onCancel() {
+ getView().hide();
+ }
- public void onClose() {
- reset();
- stateManager.redirectOrRestorePreviousToken();
- }
+ public void onClose() {
+ reset();
+ stateManager.redirectOrRestorePreviousToken();
+ }
- public void onRegister() {
- if (getView().isFormValid()) {
- getView().maskProcessing();
- final String shortName = getView().getShortName();
- final String longName = getView().getLongName();
- final String publicDesc = getView().getPublicDesc();
- final LicenseDTO license = session.getDefLicense();
- final GroupDTO group = new GroupDTO(shortName, longName, getTypeOfGroup());
- group.setDefaultLicense(license);
+ public void onRegister() {
+ if (getView().isFormValid()) {
+ getView().maskProcessing();
+ final String shortName = getView().getShortName();
+ final String longName = getView().getLongName();
+ final String publicDesc = getView().getPublicDesc();
+ final LicenseDTO license = session.getDefLicense();
+ final GroupDTO group = new GroupDTO(shortName, longName, getTypeOfGroup());
+ group.setDefaultLicense(license);
- final AsyncCallback<StateToken> callback = new AsyncCallback<StateToken>() {
- @Override
- public void onFailure(final Throwable caught) {
- if (caught instanceof GroupNameInUseException) {
- getView().unMask();
- setMessage(i18n.t(CoreMessages.NAME_IN_ALREADY_IN_USE), NotifyLevel.error);
- } else {
- getView().unMask();
- setMessage(i18n.t("Error creating group"), NotifyLevel.error);
- throw new UIException("Other kind of exception in group registration", caught);
- }
- }
+ final AsyncCallback<StateToken> callback = new AsyncCallback<StateToken>() {
+ @Override
+ public void onFailure(final Throwable caught) {
+ if (caught instanceof GroupNameInUseException) {
+ getView().unMask();
+ setMessage(i18n.t(CoreMessages.NAME_IN_ALREADY_IN_USE), NotifyLevel.error);
+ } else {
+ getView().unMask();
+ setMessage(i18n.t("Error creating group"), NotifyLevel.error);
+ throw new UIException("Other kind of exception in group registration", caught);
+ }
+ }
- @Override
- public void onSuccess(final StateToken token) {
- getView().hide();
- stateManager.gotoStateToken(token);
- reset();
- getView().unMask();
- }
- };
- groupService.get().createNewGroup(session.getUserHash(), group, publicDesc, getView().getTags(), null,
- callback);
+ @Override
+ public void onSuccess(final StateToken token) {
+ getView().hide();
+ Scheduler.get().scheduleDeferred(new ScheduledCommand() {
+ @Override
+ public void execute() {
+ stateManager.gotoStateToken(token);
+ groupOptions.showTooltip();
+ }
+ });
+ reset();
+ getView().unMask();
}
+ };
+ groupService.get().createNewGroup(session.getUserHash(), group, publicDesc, getView().getTags(),
+ null, callback);
}
+ }
- private void reset() {
- getView().clearData();
- }
+ private void reset() {
+ getView().clearData();
+ }
- @Override
- protected void revealInParent() {
- RevealRootContentEvent.fire(this, this);
- }
+ @Override
+ protected void revealInParent() {
+ RevealRootContentEvent.fire(this, this);
+ }
- public void setMessage(final String message, final NotifyLevel level) {
- getView().setMessage(message, level);
- }
+ public void setMessage(final String message, final NotifyLevel level) {
+ getView().setMessage(message, level);
+ }
}
Modified: trunk/src/main/java/cc/kune/core/client/sitebar/spaces/SpaceSelectorPresenter.java
===================================================================
--- trunk/src/main/java/cc/kune/core/client/sitebar/spaces/SpaceSelectorPresenter.java 2011-07-08 00:00:41 UTC (rev 1441)
+++ trunk/src/main/java/cc/kune/core/client/sitebar/spaces/SpaceSelectorPresenter.java 2011-07-09 16:44:34 UTC (rev 1442)
@@ -21,12 +21,14 @@
import cc.kune.common.client.notify.NotifyLevel;
import cc.kune.core.client.auth.SignIn;
+import cc.kune.core.client.events.WindowFocusEvent;
import cc.kune.core.client.init.AppStartEvent;
import cc.kune.core.client.state.Session;
import cc.kune.core.client.state.SiteTokens;
import cc.kune.core.client.state.StateManager;
import cc.kune.core.client.state.TokenUtils;
import cc.kune.core.client.state.UserSignOutEvent;
+import cc.kune.core.shared.i18n.I18nTranslationService;
import cc.kune.gspace.client.GSpaceArmor;
import cc.kune.gspace.client.style.GSpaceBackManager;
@@ -34,6 +36,7 @@
import com.google.gwt.event.dom.client.ClickHandler;
import com.google.gwt.event.dom.client.HasClickHandlers;
import com.google.gwt.event.shared.EventBus;
+import com.google.gwt.user.client.Timer;
import com.google.inject.Inject;
import com.google.inject.Provider;
import com.gwtplatform.mvp.client.Presenter;
@@ -67,6 +70,14 @@
void setPublicBtnDown(boolean down);
void setUserBtnDown(boolean down);
+
+ void showGroupSpaceTooltip();
+
+ void showHomeSpaceTooltip();
+
+ void showPublicSpaceTooltip();
+
+ void showUserSpaceTooltip();
}
private final GSpaceArmor armor;
@@ -74,6 +85,7 @@
private Space currentSpace;
private String groupToken;
private String homeToken;
+ private final I18nTranslationService i18n;
private String publicToken;
private final Session session;
private final Provider<SignIn> signIn;
@@ -83,13 +95,15 @@
@Inject
public SpaceSelectorPresenter(final EventBus eventBus, final StateManager stateManager,
final SpaceSelectorView view, final SpaceSelectorProxy proxy, final GSpaceArmor armor,
- final Session session, final Provider<SignIn> signIn, final GSpaceBackManager backManager) {
+ final Session session, final Provider<SignIn> signIn, final GSpaceBackManager backManager,
+ final I18nTranslationService i18n) {
super(eventBus, view, proxy);
this.stateManager = stateManager;
this.armor = armor;
this.session = session;
this.signIn = signIn;
this.backManager = backManager;
+ this.i18n = i18n;
currentSpace = null;
homeToken = SiteTokens.HOME;
userToken = SiteTokens.WAVEINBOX;
@@ -119,10 +133,19 @@
stateManager.gotoHistoryToken(publicToken);
}
});
+ eventBus.addHandler(WindowFocusEvent.getType(), new WindowFocusEvent.WindowFocusHandler() {
+ @Override
+ public void onWindowFocus(final WindowFocusEvent event) {
+ if (event.isHasFocus()) {
+ showTooltipWithDelay();
+ }
+ }
+ });
}
@ProxyEvent
public void onAppStart(final AppStartEvent event) {
+ showTooltipWithDelay();
}
private void onGroupSpaceSelect() {
@@ -195,7 +218,6 @@
default:
break;
}
- // getView().hideTooltip();
}
}
@@ -217,10 +239,10 @@
getView().setPublicBtnDown(false);
currentSpace = Space.userSpace;
} else {
- signIn.get().setErrorMessage("Sign in to access to your inbox", NotifyLevel.info);
+ signIn.get().setErrorMessage(i18n.t("Sign in or create an account to access to your inbox"),
+ NotifyLevel.info);
stateManager.gotoHistoryToken(TokenUtils.addRedirect(SiteTokens.SIGNIN, userToken));
getView().setUserBtnDown(false);
- // NotifyUser.info("Sign in to access to your workspace");
}
}
@@ -228,4 +250,30 @@
protected void revealInParent() {
RevealRootContentEvent.fire(this, this);
}
+
+ private void showTooltipNow() {
+ switch (currentSpace) {
+ case homeSpace:
+ getView().showHomeSpaceTooltip();
+ break;
+ case userSpace:
+ getView().showUserSpaceTooltip();
+ break;
+ case groupSpace:
+ getView().showGroupSpaceTooltip();
+ break;
+ case publicSpace:
+ getView().showPublicSpaceTooltip();
+ break;
+ }
+ }
+
+ protected void showTooltipWithDelay() {
+ new Timer() {
+ @Override
+ public void run() {
+ showTooltipNow();
+ }
+ }.schedule(500);
+ }
}
\ No newline at end of file
Modified: trunk/src/main/java/cc/kune/core/client/sitebar/spaces/SpaceSelectorViewImpl.java
===================================================================
--- trunk/src/main/java/cc/kune/core/client/sitebar/spaces/SpaceSelectorViewImpl.java 2011-07-08 00:00:41 UTC (rev 1441)
+++ trunk/src/main/java/cc/kune/core/client/sitebar/spaces/SpaceSelectorViewImpl.java 2011-07-09 16:44:34 UTC (rev 1442)
@@ -41,26 +41,31 @@
private static SpaceSelectorViewImplUiBinder uiBinder = GWT.create(SpaceSelectorViewImplUiBinder.class);
@UiField
ToggleButton groupButton;
+ private final Tooltip groupSpaceTooltip;
@UiField
ToggleButton homeButton;
+ private final Tooltip homeSpaceTooltip;
@UiField
HorizontalPanel panel;
@UiField
ToggleButton publicButton;
+ private final Tooltip publicSpaceTooltip;
@UiField
ToggleButton userButton;
+ private final Tooltip userSpaceTooltip;
@Inject
public SpaceSelectorViewImpl(final GSpaceArmor armor, final I18nTranslationService i18n,
final GSpaceArmorResources res) {
armor.getSitebar().insert(uiBinder.createAndBindUi(this), 0);
// homeButton.setVisible(false);
- Tooltip.to(homeButton, i18n.t("Your home page in this site"));
- Tooltip.to(userButton, i18n.t("User space: it shows a list of all your documents and contents "
- + "in which you participate"));
- Tooltip.to(groupButton, i18n.t("Group and personal space: Where you can create "
+ homeSpaceTooltip = Tooltip.to(homeButton, i18n.t("Your home page in this site"));
+ userSpaceTooltip = Tooltip.to(userButton,
+ i18n.t("User space: it shows a list of all your documents and contents "
+ + "in which you participate"));
+ groupSpaceTooltip = Tooltip.to(groupButton, i18n.t("Group and personal space: Where you can create "
+ "and publish contents for your personal or group web spaces"));
- Tooltip.to(publicButton,
+ publicSpaceTooltip = Tooltip.to(publicButton,
i18n.t("Public space: In this space you can see a preview of how the Personal o"
+ "r Group Space looks like on the web, outside this site"));
}
@@ -109,4 +114,20 @@
public void setUserBtnDown(final boolean down) {
userButton.setDown(down);
}
+
+ public void showGroupSpaceTooltip() {
+ groupSpaceTooltip.showTemporally();
+ }
+
+ public void showHomeSpaceTooltip() {
+ homeSpaceTooltip.showTemporally();
+ }
+
+ public void showPublicSpaceTooltip() {
+ publicSpaceTooltip.showTemporally();
+ }
+
+ public void showUserSpaceTooltip() {
+ userSpaceTooltip.showTemporally();
+ }
}
Modified: trunk/src/main/java/cc/kune/core/client/state/StateManagerDefault.java
===================================================================
--- trunk/src/main/java/cc/kune/core/client/state/StateManagerDefault.java 2011-07-08 00:00:41 UTC (rev 1441)
+++ trunk/src/main/java/cc/kune/core/client/state/StateManagerDefault.java 2011-07-09 16:44:34 UTC (rev 1442)
@@ -415,7 +415,7 @@
// history.newItem(newToken.toString(), false);
StateChangedEvent.fire(eventBus, newState);
checkGroupAndToolChange(newState);
- previousToken = newToken;
+ previousToken = newToken.copy();
eventBus.fireEvent(new ProgressHideEvent());
}
Modified: trunk/src/main/java/cc/kune/core/public/ws.css
===================================================================
--- trunk/src/main/java/cc/kune/core/public/ws.css 2011-07-08 00:00:41 UTC (rev 1441)
+++ trunk/src/main/java/cc/kune/core/public/ws.css 2011-07-09 16:44:34 UTC (rev 1442)
@@ -1,4 +1,4 @@
-CHARSET "UTF-8 "; body {
+CHARSET "UTF-8 "; body {
background-color: transparent;
color: black;
font-family: 'Ubuntu', Arial;
@@ -728,6 +728,7 @@
background: #FFB380 none repeat scroll 0% 50%;
/* color: #250; */
padding: 10px;
+ margin: 16px -20px -20px -20px;
}
.k-error-tb img {
@@ -832,7 +833,7 @@
white-space: nowrap;
}
*/
-.k-sn-mainpanel .x-btn button,.k-sn-mainpanel button,button.k-button,.gwt-FileUpload
+.k-sn-mainpanel .x-btn button,.k-sn-mainpanel button,button.k-button,.gwt-FileUpload,button.gwt-Button
{
font: 13px 'Ubuntu', arial;
border: 2px solid #CCCCCC;
@@ -854,7 +855,7 @@
height: 28px;
}
-.k-sn-mainpanel .x-btn button:hover,.k-sn-mainpanel button:hover,button.k-button:hover
+.k-sn-mainpanel .x-btn button:hover,.k-sn-mainpanel button:hover,button.k-button:hover,button.gwt-Button:hover
{
border: 2px orange solid;
outline: 0 none;
@@ -1201,7 +1202,7 @@
-webkit-border-bottom-left-radius: 5px;
-moz-border-radius-bottomleft: 5px;
border-bottom-left-radius: 5px;
- kfilter: alpha(opacity = 90);
+ kfilter: alpha(opacity = 90);
-moz-opacity: 0.90;
-khtml-opacity: 0.90;
opacity: 0.90;
@@ -1411,4 +1412,4 @@
.bullet-type-2 {
list-style-type: square;
-}
+}
\ No newline at end of file
Modified: trunk/src/main/java/cc/kune/gspace/client/GSpaceArmorImpl.ui.xml
===================================================================
--- trunk/src/main/java/cc/kune/gspace/client/GSpaceArmorImpl.ui.xml 2011-07-08 00:00:41 UTC (rev 1441)
+++ trunk/src/main/java/cc/kune/gspace/client/GSpaceArmorImpl.ui.xml 2011-07-09 16:44:34 UTC (rev 1442)
@@ -38,7 +38,7 @@
<g:SplitLayoutPanel width="100%" height="100%" styleName="k-space"
ui:field="groupSpace">
<g:center size="1.0">
- <g:DockLayoutPanel unit="PX" ui:field="splitCenter">
+ <g:DockLayoutPanel unit="PX" ui:field="splitCenter" styleName="{res.style.entityCentralContainer}">
<g:north size="168">
<g:VerticalPanel width="100%" height="168px">
<g:FlowPanel height="70px" width="100%"
Modified: trunk/src/main/java/cc/kune/gspace/client/options/GroupOptions.java
===================================================================
--- trunk/src/main/java/cc/kune/gspace/client/options/GroupOptions.java 2011-07-08 00:00:41 UTC (rev 1441)
+++ trunk/src/main/java/cc/kune/gspace/client/options/GroupOptions.java 2011-07-09 16:44:34 UTC (rev 1442)
@@ -20,4 +20,6 @@
package cc.kune.gspace.client.options;
public interface GroupOptions extends EntityOptions {
+
+ void showTooltip();
}
Modified: trunk/src/main/java/cc/kune/gspace/client/options/GroupOptionsPresenter.java
===================================================================
--- trunk/src/main/java/cc/kune/gspace/client/options/GroupOptionsPresenter.java 2011-07-08 00:00:41 UTC (rev 1441)
+++ trunk/src/main/java/cc/kune/gspace/client/options/GroupOptionsPresenter.java 2011-07-09 16:44:34 UTC (rev 1442)
@@ -60,10 +60,12 @@
// groupPrefsAction.putValue(Action.NAME, i18n.t("Group options"));
groupPrefsAction.putValue(Action.SMALL_ICON, img.prefs());
prefsItem = new ButtonDescriptor(groupPrefsAction);
- prefsItem.withStyles("k-ent-header-btn, k-btn-min"); // , k-noborder,
- // k-nobackcolor,
- // k-btn-min");
+ prefsItem.withStyles("k-ent-header-btn, k-btn-min");
+ // k-noborder,
+ // k-nobackcolor,
+ // k-btn-min");
prefsItem.setId(GROUP_OPTIONS_ICON);
+ prefsItem.withToolTip(i18n.t("Set your group preferences here"));
prefsItem.setVisible(false);
view.addAction(prefsItem);
}
@@ -85,4 +87,9 @@
}
});
}
+
+ @Override
+ public void showTooltip() {
+ prefsItem.toggleTooltipVisible();
+ }
}
Modified: trunk/src/main/java/cc/kune/gspace/client/resources/GSpaceArmorResources.java
===================================================================
--- trunk/src/main/java/cc/kune/gspace/client/resources/GSpaceArmorResources.java 2011-07-08 00:00:41 UTC (rev 1441)
+++ trunk/src/main/java/cc/kune/gspace/client/resources/GSpaceArmorResources.java 2011-07-09 16:44:34 UTC (rev 1442)
@@ -42,6 +42,8 @@
String docSubheaderLeft();
+ String entityCentralContainer();
+
String entityFooter();
String entityHeader();
Modified: trunk/src/main/java/cc/kune/gspace/client/resources/gSpaceArmor.css
===================================================================
--- trunk/src/main/java/cc/kune/gspace/client/resources/gSpaceArmor.css 2011-07-08 00:00:41 UTC (rev 1441)
+++ trunk/src/main/java/cc/kune/gspace/client/resources/gSpaceArmor.css 2011-07-09 16:44:34 UTC (rev 1442)
@@ -34,6 +34,9 @@
opacity: 0.38 !important; */
}
+.entityCentralContainer {
+
+}
.entityHeader {
-webkit-border-top-right-radius: 7px;
-moz-border-radius-topright: 7px;
Modified: trunk/src/main/java/cc/kune/gspace/client/resources/gSpaceArmorTheme.css
===================================================================
--- trunk/src/main/java/cc/kune/gspace/client/resources/gSpaceArmorTheme.css 2011-07-08 00:00:41 UTC (rev 1441)
+++ trunk/src/main/java/cc/kune/gspace/client/resources/gSpaceArmorTheme.css 2011-07-09 16:44:34 UTC (rev 1442)
@@ -25,7 +25,7 @@
color: c5;
}
-.entityToolsNorth span ,.k-sn-deck div {
+.entityToolsNorth span,.k-sn-deck div {
color: c1;
}
@@ -54,6 +54,7 @@
}
.k-tool-item {
+
}
.k-tool-item span {
@@ -69,6 +70,7 @@
}
.k-tool-item-nofocus {
+
}
.k-tool-item-nofocus span {
@@ -101,11 +103,15 @@
color: c4;
}
+.entityCentralContainer {
+ border-left: 2px solid bc1;
+}
+
.entityHeader {
background-color: bc5;
}
-.entityHeader span, .entityHeader div {
+.entityHeader span,.entityHeader div {
color: c5;
}
@@ -142,7 +148,7 @@
background-color: bc7;
}
-.k-empty-msg span, .k-folder-viewer span {
+.k-empty-msg span,.k-folder-viewer span {
color: c7;
}
Modified: trunk/src/main/java/cc/kune/gspace/client/style/GSpaceBackManagerImpl.java
===================================================================
--- trunk/src/main/java/cc/kune/gspace/client/style/GSpaceBackManagerImpl.java 2011-07-08 00:00:41 UTC (rev 1441)
+++ trunk/src/main/java/cc/kune/gspace/client/style/GSpaceBackManagerImpl.java 2011-07-09 16:44:34 UTC (rev 1442)
@@ -43,10 +43,7 @@
@Override
public void clearBackImage() {
- if (!lastToken.equals(NO_TOKEN)) {
- gSpaceArmor.clearBackImage();
- lastToken = NO_TOKEN;
- }
+ gSpaceArmor.clearBackImage();
}
@Override
@@ -61,7 +58,7 @@
final StateToken tokenNoGroup = token.clearDocument().clearDocument();
if (!tokenNoGroup.equals(lastToken)) {
gSpaceArmor.setBackImage(downloadUtils.getBackgroundImageUrl(tokenNoGroup));
- lastToken = tokenNoGroup;
+ lastToken = tokenNoGroup.copy();
}
}
Added: trunk/src/main/java/cc/kune/wave/server/AbstractBaseRobotAgent.java
===================================================================
--- trunk/src/main/java/cc/kune/wave/server/AbstractBaseRobotAgent.java (rev 0)
+++ trunk/src/main/java/cc/kune/wave/server/AbstractBaseRobotAgent.java 2011-07-09 16:44:34 UTC (rev 1442)
@@ -0,0 +1,162 @@
+/**
+ * Copyright 2011 Google Inc.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+package cc.kune.wave.server;
+
+import java.util.List;
+import java.util.logging.Level;
+import java.util.logging.Logger;
+
+import org.waveprotocol.box.server.CoreSettings;
+import org.waveprotocol.box.server.account.AccountData;
+import org.waveprotocol.box.server.persistence.AccountStore;
+import org.waveprotocol.box.server.persistence.PersistenceException;
+import org.waveprotocol.box.server.robots.util.RobotsUtil;
+import org.waveprotocol.box.server.robots.util.RobotsUtil.RobotRegistrationException;
+import org.waveprotocol.wave.model.id.TokenGenerator;
+import org.waveprotocol.wave.model.wave.InvalidParticipantAddress;
+import org.waveprotocol.wave.model.wave.ParticipantId;
+
+import com.google.inject.Inject;
+import com.google.inject.Injector;
+import com.google.inject.Key;
+import com.google.inject.name.Named;
+import com.google.inject.name.Names;
+import com.google.wave.api.AbstractRobot;
+
+/**
+ * The base for robot agents that run on the WIAB server.
+ *
+ * @author yurize(a)apache.org (Yuri Zelikov)
+ */
+@SuppressWarnings("serial")
+public abstract class AbstractBaseRobotAgent extends AbstractRobot {
+
+ static class ServerFrontendAddressHolder {
+
+ private final List<String> addresses;
+
+ @Inject
+ ServerFrontendAddressHolder((a)Named(CoreSettings.HTTP_FRONTEND_ADDRESSES) final List<String> addresses) {
+ this.addresses = addresses;
+ }
+
+ List<String> getAddresses() {
+ return addresses;
+ }
+ }
+
+ public static final String AGENT_PREFIX_URI = "/agent";
+ private static final Logger LOG = Logger.getLogger(AbstractBaseRobotAgent.class.getName());
+
+ /** Account store with user and robot accounts. */
+ private final AccountStore accountStore;
+
+ private final ServerFrontendAddressHolder frontendAddressHolder;
+
+ /** The wave server domain. */
+ private final String waveDomain;
+
+ /**
+ * Constructor. Initializes the agent to serve on the URI provided by
+ * {@link #getRobotUri()} and ensures that the agent is registered in the
+ * Account store.
+ *
+ * @param injector
+ * the injector instance.
+ */
+ public AbstractBaseRobotAgent(final Injector injector) {
+ this(injector.getInstance(Key.get(String.class, Names.named(CoreSettings.WAVE_SERVER_DOMAIN))),
+ injector.getInstance(AccountStore.class), injector.getInstance(TokenGenerator.class),
+ injector.getInstance(ServerFrontendAddressHolder.class));
+ }
+
+ /**
+ * Constructor. Initializes the agent to serve on the URI provided by
+ * {@link #getRobotUri()} and ensures that the agent is registered in the
+ * Account store.
+ */
+ AbstractBaseRobotAgent(final String waveDomain, final AccountStore accountStore,
+ final TokenGenerator tokenGenerator, final ServerFrontendAddressHolder frontendAddressHolder) {
+ this.waveDomain = waveDomain;
+ this.accountStore = accountStore;
+ this.frontendAddressHolder = frontendAddressHolder;
+ ensureRegistered(tokenGenerator, getFrontEndAddress()); // NOPMD by vjrj on
+ // 6/07/11 21:15
+ }
+
+ /**
+ * Ensures that the robot agent is registered in the {@link AccountStore}.
+ */
+ private void ensureRegistered(final TokenGenerator tokenGenerator, final String serverFrontendAddress) {
+ ParticipantId robotId = null;
+ try {
+ robotId = ParticipantId.of(getRobotId() + "@" + waveDomain);
+ } catch (final InvalidParticipantAddress e) {
+ LOG.log(Level.SEVERE, "Failed to register the agent:" + getRobotId(), e);
+ return;
+ }
+ try {
+ final String location = "http://" + serverFrontendAddress + getRobotUri();
+ // Register this agent in the account store. The registration is forced
+ // in order to re-register the agents if the server frontend address has
+ // changed.
+ final AccountData account = accountStore.getAccount(robotId);
+ if ((account == null || (account != null && !account.asRobot().getUrl().equals(location)))) {
+ RobotsUtil.registerRobotUri(location, robotId, accountStore, tokenGenerator, true);
+ }
+
+ } catch (final RobotRegistrationException e) {
+ LOG.log(Level.SEVERE, "Failed to register the agent:" + getRobotId(), e);
+ } catch (final PersistenceException e) {
+ LOG.log(Level.SEVERE, "Failed to register the agent:" + getRobotId(), e);
+ }
+ }
+
+ /**
+ * Returns the account store.
+ */
+ protected AccountStore getAccountStore() {
+ return accountStore;
+ }
+
+ public String getFrontEndAddress() {
+ return frontendAddressHolder.getAddresses().get(0);
+ }
+
+ /**
+ * Returns the robot participant id.
+ */
+ public abstract String getRobotId();
+
+ @Override
+ protected String getRobotProfilePageUrl() { // NOPMD by vjrj on 6/07/11 21:15
+ return null;
+ }
+
+ /**
+ * Returns the robot URI.
+ */
+ public abstract String getRobotUri();
+
+ /**
+ * Returns the wave domain.
+ */
+ public String getWaveDomain() {
+ return waveDomain;
+ }
+}
\ No newline at end of file
Added: trunk/src/main/java/cc/kune/wave/server/KuneAgent.java
===================================================================
--- trunk/src/main/java/cc/kune/wave/server/KuneAgent.java (rev 0)
+++ trunk/src/main/java/cc/kune/wave/server/KuneAgent.java 2011-07-09 16:44:34 UTC (rev 1442)
@@ -0,0 +1,140 @@
+package cc.kune.wave.server;
+
+import java.io.IOException;
+import java.net.URL;
+import java.util.HashSet;
+import java.util.logging.Level;
+import java.util.logging.Logger;
+
+import javax.annotation.Nonnull;
+
+import org.waveprotocol.box.server.account.RobotAccountData;
+import org.waveprotocol.box.server.persistence.AccountStore;
+import org.waveprotocol.box.server.persistence.PersistenceException;
+import org.waveprotocol.wave.model.id.TokenGenerator;
+import org.waveprotocol.wave.model.wave.ParticipantId;
+import org.waveprotocol.wave.model.waveref.WaveRef;
+
+import com.google.inject.Inject;
+import com.google.inject.Injector;
+import com.google.inject.Singleton;
+import com.google.wave.api.Wavelet;
+
+@SuppressWarnings("serial")
+@Singleton
+public class KuneAgent extends AbstractBaseRobotAgent implements KuneWaveManager {
+
+ private static final Logger LOG = Logger.getLogger(KuneAgent.class.getName());
+
+ private static final String NO_TITLE = "";
+ public static final String ROBOT_URI = AGENT_PREFIX_URI + "/kune-agent";
+
+ @Inject
+ public KuneAgent(final Injector injector) {
+ super(injector);
+ }
+
+ public KuneAgent(final String waveDomain, final AccountStore accountStore,
+ final TokenGenerator tokenGenerator, final ServerFrontendAddressHolder frontendAddressHolder) {
+ super(waveDomain, accountStore, tokenGenerator, frontendAddressHolder);
+ }
+
+ @Override
+ public void addGadget(final WaveRef waveName, final String author, final String gadgetUrl) {
+ // TODO Auto-generated method stub
+
+ }
+
+ @Override
+ public void addParticipant(final WaveRef waveName, final String author, final String userWhoAdd,
+ final String newParticipant) {
+ // TODO Auto-generated method stub
+
+ }
+
+ @Override
+ public WaveRef createWave(final String message, final ParticipantId participant) {
+ return createWave(NO_TITLE, message, participant);
+ }
+
+ @Override
+ public WaveRef createWave(@Nonnull final String title, final String message,
+ @Nonnull final ParticipantId... participantsArray) {
+ return createWave(title, message, WITHOUT_GADGET, participantsArray);
+ }
+
+ @Override
+ public WaveRef createWave(final String title, final String message, final URL gadgetUrl,
+ final ParticipantId... participantsArray) {
+ // super.newWave(getWaveDomain(), participantsArray);
+ final HashSet<String> parts = new HashSet<String>();
+ for (final ParticipantId part : participantsArray) {
+ parts.add(part.getAddress());
+ }
+ final Wavelet wave = newWave(getWaveDomain(), parts);
+ return WaveRef.of(wave.getWaveId(), wave.getWaveletId());
+ }
+
+ @Override
+ public Wavelet fetchWavelet(final WaveRef waveRef, final String author) {
+ // Preconditions.checkNotNull(author);
+ RobotAccountData account = null;
+ final String rpcUrl = "http://" + getFrontEndAddress() + "/robot/rpc";
+ try {
+ account = getAccountStore().getAccount(
+ ParticipantId.ofUnsafe(getRobotId() + "@" + getWaveDomain())).asRobot();
+ } catch (final PersistenceException e) {
+ LOG.log(Level.WARNING, "Cannot fetch account data for robot id: " + getRobotId(), e);
+ }
+ if (account != null) {
+ setupOAuth(account.getId().getAddress(), account.getConsumerSecret(), rpcUrl);
+ try {
+ return super.fetchWavelet(waveRef.getWaveId(), waveRef.getWaveletId(), "http://"
+ + getFrontEndAddress() + "/robot/rpc");
+ } catch (final IOException e) {
+ e.printStackTrace();
+ return null;
+ }
+ }
+ return null;
+ }
+
+ @Override
+ public String getRobotId() {
+ return "kune-agent";
+ }
+
+ @Override
+ protected String getRobotName() {
+ return "Kune Agent";
+ }
+
+ @Override
+ public String getRobotUri() {
+ return ROBOT_URI;
+ }
+
+ @Override
+ public boolean isParticipant(final Wavelet wavelet, final String user) {
+ // TODO Auto-generated method stub
+ return false;
+ }
+
+ @Override
+ public String render(final Wavelet wavelet) {
+ // TODO Auto-generated method stub
+ return null;
+ }
+
+ @Override
+ public String render(final WaveRef waveRef, final String author) {
+ // TODO Auto-generated method stub
+ return null;
+ }
+
+ @Override
+ public void setTitle(final WaveRef waveName, final String title, final String author) {
+ // TODO Auto-generated method stub
+
+ }
+}
Modified: trunk/src/main/java/cc/kune/wave/server/KuneWaveManagerDefault.java
===================================================================
--- trunk/src/main/java/cc/kune/wave/server/KuneWaveManagerDefault.java 2011-07-08 00:00:41 UTC (rev 1441)
+++ trunk/src/main/java/cc/kune/wave/server/KuneWaveManagerDefault.java 2011-07-09 16:44:34 UTC (rev 1442)
@@ -77,6 +77,7 @@
// See: DocumentModifyServiceTest
private static final String NO_ANNOTATION_KEY = null;
private static final List<BundledAnnotation> NO_BUNDLED_ANNOTATIONS = Collections.emptyList();
+ private static final List<Element> NO_ELEMENTS = Collections.emptyList();
private static final String NO_TITLE = "";
private static final List<String> NO_VALUES = Collections.<String> emptyList();
@@ -163,8 +164,26 @@
final Wavelet newWavelet = opQueue.createWavelet(domain, participants);
opQueue.setTitleOfWavelet(newWavelet, title);
final Blip rootBlip = newWavelet.getRootBlip();
- // rootBlip.append(new com.google.wave.api.Markup(message).getText());
- rootBlip.appendMarkup(message);
+ rootBlip.append(new com.google.wave.api.Markup(message).getText());
+ // rootBlip.all().delete();
+ // rootBlip.appendMarkup(message);
+ // opQueue.appendMarkupToDocument(rootBlip,
+ // ContentNewUnrenderer.unrender(message).toXmlString());
+
+ // final OperationRequest modifyDocument = opQueue.modifyDocument(rootBlip);
+ // ImmutableList<String> of =
+ // ImmutableList.of(ContentNewUnrenderer.unrender(message).toXmlString());
+ // rootBlip.getContent().hackConsume(
+ // Nindo.fromDocOp(ContentNewUnrenderer.unrender(message).asOperation(),
+ // false));
+ // modifyDocument.addParameter(Parameter.of(ParamsProperty.MODIFY_ACTION,
+ // new DocumentModifyAction(
+ // ModifyHow.REPLACE,
+ // ImmutableList.of(ContentNewUnrenderer.unrender(message).toXmlString()),
+ // null,
+ // null, null, false)));
+ // NO_ANNOTATION_KEY, NO_ELEMENTS, NO_BUNDLED_ANNOTATIONS, false)));
+ // rootBlip.appendMarkup(message);
if (gadgetUrl != WITHOUT_GADGET) {
final Gadget gadget = new Gadget(gadgetUrl.toString());
rootBlip.append(gadget);
Added: trunk/src/main/java/com/google/wave/splash/text/ContentNewUnrenderer.java
===================================================================
--- trunk/src/main/java/com/google/wave/splash/text/ContentNewUnrenderer.java (rev 0)
+++ trunk/src/main/java/com/google/wave/splash/text/ContentNewUnrenderer.java 2011-07-09 16:44:34 UTC (rev 1442)
@@ -0,0 +1,77 @@
+/**
+ * Copyright 2010 Google Inc.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+package com.google.wave.splash.text;
+
+import java.util.logging.Logger;
+
+import org.waveprotocol.wave.model.document.indexed.IndexedDocument;
+import org.waveprotocol.wave.model.document.operation.Nindo;
+import org.waveprotocol.wave.model.document.raw.RawDocumentProviderImpl;
+import org.waveprotocol.wave.model.document.raw.impl.Element;
+import org.waveprotocol.wave.model.document.raw.impl.Node;
+import org.waveprotocol.wave.model.document.raw.impl.RawDocumentImpl;
+import org.waveprotocol.wave.model.document.raw.impl.Text;
+import org.waveprotocol.wave.model.document.util.DocProviders;
+import org.waveprotocol.wave.model.document.util.Point;
+import org.waveprotocol.wave.model.document.util.RawElementStyleView;
+import org.waveprotocol.wave.model.operation.OperationException;
+import org.waveprotocol.wave.model.richtext.RichTextMutationBuilder;
+import org.waveprotocol.wave.model.richtext.RichTextTokenizer;
+import org.waveprotocol.wave.model.richtext.RichTextTokenizerImpl;
+import org.waveprotocol.wave.model.util.Pair;
+import org.waveprotocol.wave.model.util.ReadableStringSet;
+
+import cc.kune.core.client.errors.DefaultException;
+
+public class ContentNewUnrenderer {
+
+ private static final Logger LOG = Logger.getLogger(ContentNewUnrenderer.class.getName());
+
+ private static Pair<Nindo, IndexedDocument<Node, Element, Text>> applyTokensToEmptyDoc(
+ final RichTextTokenizer tokens) {
+ // final IndexedDocument<Node, Element, Text> doc =
+ // DocProviders.POJO.parse("<body><line/></body>");
+ final IndexedDocument<Node, Element, Text> doc = DocProviders.POJO.parse("<line/>");
+ // final Point<Node> insertAt = doc.locate(3);
+ final Point<Node> insertAt = doc.locate(1);
+
+ final Nindo.Builder builder = new Nindo.Builder();
+ builder.skip(1);
+ // builder.skip(3);
+ final ReadableStringSet mutations = new RichTextMutationBuilder().applyMutations(tokens, builder,
+ doc, insertAt.getContainer());
+
+ final Nindo nindo = builder.build();
+ try {
+ doc.consumeAndReturnInvertible(nindo);
+ } catch (final OperationException e) {
+ throw new DefaultException("Operation Exception " + e);
+ }
+ doc.asOperation();
+ return new Pair<Nindo, IndexedDocument<Node, Element, Text>>(nindo, doc);
+ }
+
+ public static IndexedDocument<Node, Element, Text> unrender(final String content) {
+ final RawElementStyleView rawEl = new RawElementStyleView(RawDocumentProviderImpl.create(
+ RawDocumentImpl.BUILDER).parse("<div>" + content + "</div>"));
+ final RichTextTokenizerImpl<Node, Element, Text> tokenizer = new RichTextTokenizerImpl<Node, Element, Text>(
+ rawEl);
+ final Pair<Nindo, IndexedDocument<Node, Element, Text>> result = applyTokensToEmptyDoc(tokenizer);
+ return result.getSecond();
+ }
+
+}
Modified: trunk/src/main/java/com/google/wave/splash/text/ContentRenderer.java
===================================================================
--- trunk/src/main/java/com/google/wave/splash/text/ContentRenderer.java 2011-07-08 00:00:41 UTC (rev 1441)
+++ trunk/src/main/java/com/google/wave/splash/text/ContentRenderer.java 2011-07-09 16:44:34 UTC (rev 1442)
@@ -149,7 +149,8 @@
final String d = element.getProperty(Line.DIRECTION);
final Integer ident = i != null ? Integer.valueOf(i) : 0;
if (inheader) {
- builder.append("</div>");
+ // New line, we close previous header
+ builder.append("</div> <!-- end h1/h2... header -->");
inheader = false;
}
if (t != null && t.equals(Paragraph.LIST_TYPE)) {
Modified: trunk/src/main/java/com/google/wave/splash/text/ContentUnrenderer.java
===================================================================
--- trunk/src/main/java/com/google/wave/splash/text/ContentUnrenderer.java 2011-07-08 00:00:41 UTC (rev 1441)
+++ trunk/src/main/java/com/google/wave/splash/text/ContentUnrenderer.java 2011-07-09 16:44:34 UTC (rev 1442)
@@ -16,52 +16,54 @@
*/
package com.google.wave.splash.text;
+import java.util.Map;
+import java.util.logging.Logger;
-import com.google.common.collect.Maps;
-import com.google.wave.api.Annotations;
-import com.google.wave.api.Line;
-
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.nodes.Node;
import org.jsoup.nodes.TextNode;
+import org.jsoup.safety.Whitelist;
+import com.google.wave.api.Annotation;
+import com.google.common.collect.Maps;
+import com.google.wave.api.Annotations;
+import com.google.wave.api.Line;
-import java.util.Map;
-import java.util.logging.Logger;
-
-/**
- * @author anthonybaxter(a)gmail.com (Anthony Baxter)
- */
public class ContentUnrenderer {
- private static final Logger LOG = Logger.getLogger(ContentUnrenderer.class.getName());
-
/**
- * Turns a HTML document back into a set of text, elements, annotations.
+ * Container for the output of the unrender method.
*/
- public static UnrenderedBlip unrender(String content) {
- StringBuilder sb = new StringBuilder();
- Map<Integer, com.google.wave.api.Element> elements = Maps.newHashMap();
+ public static class UnrenderedBlip {
Annotations annotations = new Annotations();
- Document doc = Jsoup.parse(content);
- unrender(doc.body(), sb, elements, annotations);
- return new UnrenderedBlip(sb.toString(), elements, annotations);
+ public String contents;
+ Map<Integer, com.google.wave.api.Element> elements;
+
+ UnrenderedBlip(final String contents, final Map<Integer, com.google.wave.api.Element> elements,
+ final Annotations annotations) {
+ this.contents = contents;
+ this.elements = elements;
+ this.annotations = annotations;
+ }
}
+ private static final Logger LOG = Logger.getLogger(ContentUnrenderer.class.getName());
+
/**
- * Helper method to recursively parse a HTML element and construct a wave document.
+ * Helper method to recursively parse a HTML element and construct a wave
+ * document.
*/
- private static void unrender(Node parent, StringBuilder output, Map<Integer,
- com.google.wave.api.Element> elements, Annotations annotations) {
- for (Node node : parent.childNodes()) {
+ private static void unrender(final Node parent, final StringBuilder output,
+ final Map<Integer, com.google.wave.api.Element> elements, final Annotations annotations) {
+ for (final Node node : parent.childNodes()) {
if (node instanceof TextNode) {
- output.append(((TextNode)node).text());
- }
- else if (node instanceof Element) {
- int position = output.length();
- Element element = (Element)node;
- if ("p".equals(element.tag().getName())) {
+ output.append(((TextNode) node).text());
+ } else if (node instanceof Element) {
+ final int position = output.length();
+ final Element element = (Element) node;
+ final String name = element.tag().getName();
+ if ("p".equalsIgnoreCase(name)) {
elements.put(position, new Line());
// handle any attributes?
}
@@ -73,18 +75,16 @@
}
/**
- * Container for the output of the unrender method.
+ * Turns a HTML document back into a set of text, elements, annotations.
*/
- public static class UnrenderedBlip {
- public String contents;
- Map<Integer, com.google.wave.api.Element> elements;
- Annotations annotations = new Annotations();
-
- UnrenderedBlip(String contents, Map<Integer, com.google.wave.api.Element> elements,
- Annotations annotations) {
- this.contents = contents;
- this.elements = elements;
- this.annotations = annotations;
- }
+ public static UnrenderedBlip unrender(final String content) {
+ final StringBuilder sb = new StringBuilder();
+ final Map<Integer, com.google.wave.api.Element> elements = Maps.newHashMap();
+ final Annotations annotations = new Annotations();
+ // Sanitized
+ final String safe = Jsoup.clean(content, Whitelist.basic());
+ final Document doc = Jsoup.parse(safe);
+ unrender(doc.body(), sb, elements, annotations);
+ return new UnrenderedBlip(sb.toString(), elements, annotations);
}
}
Added: trunk/src/main/java/com/google/wave/splash/text/HtmlRawViewImpl.java
===================================================================
--- trunk/src/main/java/com/google/wave/splash/text/HtmlRawViewImpl.java (rev 0)
+++ trunk/src/main/java/com/google/wave/splash/text/HtmlRawViewImpl.java 2011-07-09 16:44:34 UTC (rev 1442)
@@ -0,0 +1,207 @@
+/**
+ * Copyright 2008 Google Inc.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+package com.google.wave.splash.text;
+
+import java.util.Collections;
+import java.util.Map;
+
+import org.waveprotocol.wave.model.document.raw.impl.Element;
+import org.waveprotocol.wave.model.document.raw.impl.Node;
+import org.waveprotocol.wave.model.document.raw.impl.Text;
+import org.waveprotocol.wave.model.document.util.ElementStyleView;
+import org.waveprotocol.wave.model.document.util.Point;
+
+/**
+ * Presents a simple view of a HTML document where you can walk through every
+ * node. It is rooted at a specific element (i.e. it can be a subtree of a full
+ * document). However the results of attempting to traverse outside the document
+ * are undefined.
+ *
+ * @author danilatos(a)google.com (Daniel Danilatos)
+ *
+ * Adapted to be used in served side by vjrj(a)ourproject.org
+ *
+ */
+public class HtmlRawViewImpl implements ElementStyleView<Node, Element, Text> { // HTMLView
+
+ /**
+ * Singleton instance, if you don't care about not having a document element
+ * defined.
+ */
+ public static final HtmlRawViewImpl INSTANCE = new HtmlRawViewImpl(null);
+
+ Element documentElement;
+
+ /**
+ * @param documentElement
+ * Root element for this "document"
+ */
+ public HtmlRawViewImpl(final Element documentElement) {
+ this.documentElement = documentElement;
+ }
+
+ /** {@inheritDoc} */
+ @Override
+ public Element asElement(final Node node) {
+ return node.asElement();
+ }
+
+ /** {@inheritDoc} */
+ @Override
+ public Text asText(final Node node) {
+ return node.asText();
+ }
+
+ /** {@inheritDoc} */
+ @Override
+ public String getAttribute(final Element element, final String name) {
+ // FIXME: test!
+ return element.getAttribute(name);
+ // return name.equals("class") ? element.getClassName() :
+ // element.getAttribute(name);
+ }
+
+ /** {@inheritDoc} */
+ @Override
+ public Map<String, String> getAttributes(final Element element) {
+ return Collections.emptyMap();
+ }
+
+ /** {@inheritDoc} */
+ @Override
+ public String getData(final Text textNode) {
+ return textNode.getData();
+ }
+
+ /** {@inheritDoc} */
+ @Override
+ public Element getDocumentElement() {
+ return documentElement;
+ }
+
+ /** {@inheritDoc} */
+ @Override
+ public Node getFirstChild(final Node node) {
+ return node.getFirstChild();
+ }
+
+ /** {@inheritDoc} */
+ @Override
+ public Node getLastChild(final Node node) {
+ return node.getLastChild();
+ }
+
+ /** {@inheritDoc} */
+ @Override
+ public int getLength(final Text textNode) {
+ return textNode.getLength();
+ }
+
+ /** {@inheritDoc} */
+ @Override
+ public Node getNextSibling(final Node node) {
+ return node.getNextSibling();
+ }
+
+ /** {@inheritDoc} */
+ @Override
+ public short getNodeType(final Node node) { // NOPMD by vjrj on 4/07/11 20:55
+ return node.getNodeType();
+ }
+
+ /** {@inheritDoc} */
+ @Override
+ public Element getParentElement(final Node node) {
+ return node.getParentElement();
+ }
+
+ /** {@inheritDoc} */
+ @Override
+ public Node getPreviousSibling(final Node node) {
+ return node.getPreviousSibling();
+ }
+
+ /** {@inheritDoc} */
+ @Override
+ public String getStylePropertyValue(final Element element, final String name) {
+ return getStylePropertyValue(element.getAttribute("style"), name);
+ }
+
+ private String getStylePropertyValue(final String styles, final String name) {
+ if (styles != null && styles.contains(name)) {
+ for (final String stylePair : styles.split(";")) {
+ final int index = stylePair.indexOf(':');
+ if (index >= 0 && index < stylePair.length() - 1) {
+ final String key = stylePair.substring(0, index).trim();
+ final String value = stylePair.substring(index + 1);
+ if (key.equalsIgnoreCase(name)) {
+ return value.trim();
+ }
+ }
+ }
+ }
+ return null;
+ }
+
+ /** {@inheritDoc} */
+ @Override
+ public String getTagName(final Element element) {
+ return element.getTagName();
+ }
+
+ /** {@inheritDoc} */
+ @Override
+ public Node getVisibleNode(final Node node) {
+ return node;
+ }
+
+ /** {@inheritDoc} */
+ @Override
+ public Node getVisibleNodeFirst(final Node node) {
+ return node;
+ }
+
+ /** {@inheritDoc} */
+ @Override
+ public Node getVisibleNodeLast(final Node node) {
+ return node;
+ }
+
+ /** {@inheritDoc} */
+ @Override
+ public Node getVisibleNodeNext(final Node node) {
+ return node;
+ }
+
+ /** {@inheritDoc} */
+ @Override
+ public Node getVisibleNodePrevious(final Node node) {
+ return node;
+ }
+
+ /** {@inheritDoc} */
+ @Override
+ public boolean isSameNode(final Node node, final Node other) {
+ // TODO(danilatos): Use .equals or isSameNode for nodelets in nodemanager,
+ // typing extractor, etc.
+ return node == other || (node != null && node.equals(other));
+ }
+
+ @Override
+ public void onBeforeFilter(final Point<Node> at) {
+ }
+}
Added: trunk/src/main/java/com/google/wave/splash/text/UnrenderUtils.java
===================================================================
--- trunk/src/main/java/com/google/wave/splash/text/UnrenderUtils.java (rev 0)
+++ trunk/src/main/java/com/google/wave/splash/text/UnrenderUtils.java 2011-07-09 16:44:34 UTC (rev 1442)
@@ -0,0 +1,123 @@
+/**
+ * Copyright 2009 Google Inc.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+package com.google.wave.splash.text;
+
+import org.jsoup.nodes.Element;
+
+/**
+ * Adaptation from Wave RichTextTokenizer.
+ *
+ * Not used yet, so deprecated
+ */
+@Deprecated
+public class UnrenderUtils {
+
+ public static boolean isBlockElement(final String tagName) {
+ return "p".equalsIgnoreCase(tagName) || "div".equalsIgnoreCase(tagName) || isListItem(tagName);
+ }
+
+ public static boolean isHeading(final String tagName) {
+ if (tagName.length() == 2) {
+ if (tagName.charAt(0) == 'h' || tagName.charAt(0) == 'H') {
+ final int size = tagName.charAt(1) - '0';
+ if (size >= 1 && size <= 4) {
+ return true;
+ }
+ }
+ }
+ return false;
+ }
+
+ public static boolean isLink(final String tagName) {
+ return "a".equalsIgnoreCase(tagName);
+ }
+
+ public static boolean isList(final String tagName) {
+ return isOrderedList(tagName) || isUnorderedList(tagName);
+ }
+
+ public static boolean isListItem(final String tagName) {
+ return "li".equalsIgnoreCase(tagName);
+ }
+
+ public static boolean isNewline(final String tagName) {
+ return "br".equalsIgnoreCase(tagName);
+ }
+
+ public static boolean isOrderedList(final String tagName) {
+ return "ol".equalsIgnoreCase(tagName);
+ }
+
+ public static boolean isTable(final String tagName) {
+ return "table".equalsIgnoreCase(tagName);
+ }
+
+ public static boolean isTableCell(final String tagName) {
+ return "th".equalsIgnoreCase(tagName) || "td".equalsIgnoreCase(tagName);
+ }
+
+ public static boolean isTableRelated(final String tagName) {
+ // TODO(patcoleman): fix up table implementation once tables supported in
+ // the editor.
+ // When this happens, also extract out strings into symbolic constants.
+ return isTable(tagName) || isTableRow(tagName) || isTableCell(tagName)
+ || "thead".equalsIgnoreCase(tagName) || "tbody".equalsIgnoreCase(tagName);
+ }
+
+ public static boolean isTableRow(final String tagName) {
+ return "tr".equalsIgnoreCase(tagName);
+ }
+
+ public static boolean isUnorderedList(final String tagName) {
+ return "ul".equalsIgnoreCase(tagName);
+ }
+
+ private String getStylePropertyValue(final String styles, final String name) {
+ if (styles != null && styles.contains(name)) {
+ for (final String stylePair : styles.split(";")) {
+ final int index = stylePair.indexOf(':');
+ if (index >= 0 && index < stylePair.length() - 1) {
+ final String key = stylePair.substring(0, index).trim();
+ final String value = stylePair.substring(index + 1);
+ if (key.equalsIgnoreCase(name)) {
+ return value.trim();
+ }
+ }
+ }
+ }
+ return null;
+ }
+
+ public boolean isBackgroundColor(final Element el) {
+ return isStylePropertySet(el, "backgroundColor");
+ }
+
+ public boolean isColor(final Element el) {
+ return isStylePropertySet(el, "color");
+ }
+
+ public boolean isFontFamily(final Element el) {
+ return isStylePropertySet(el, "fontFamily");
+ }
+
+ public boolean isStylePropertySet(final Element el, final String property) {
+ final String value = getStylePropertyValue(el.attr("style"), property);
+ return value != null && !value.isEmpty();
+ }
+
+}
Added: trunk/src/test/java/cc/kune/wave/server/KuneAgentTest.java
===================================================================
--- trunk/src/test/java/cc/kune/wave/server/KuneAgentTest.java (rev 0)
+++ trunk/src/test/java/cc/kune/wave/server/KuneAgentTest.java 2011-07-09 16:44:34 UTC (rev 1442)
@@ -0,0 +1,72 @@
+package cc.kune.wave.server;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertTrue;
+
+import org.junit.Before;
+import org.junit.Ignore;
+import org.junit.Test;
+import org.mockito.Mockito;
+import org.waveprotocol.box.server.account.AccountData;
+import org.waveprotocol.box.server.account.RobotAccountData;
+import org.waveprotocol.box.server.persistence.AccountStore;
+import org.waveprotocol.box.server.persistence.PersistenceException;
+import org.waveprotocol.wave.model.id.TokenGenerator;
+import org.waveprotocol.wave.model.wave.InvalidParticipantAddress;
+import org.waveprotocol.wave.model.wave.ParticipantId;
+import org.waveprotocol.wave.model.waveref.WaveRef;
+
+import cc.kune.wave.server.AbstractBaseRobotAgent.ServerFrontendAddressHolder;
+
+import com.google.common.collect.Lists;
+import com.google.wave.api.Wavelet;
+
+public class KuneAgentTest {
+ private static final String MESSAGE = "testing";
+ private static final String NEW_PARTICIPANT = "newparti";
+ private static final String RICHTEXT_MESSAGE = "<b>" + MESSAGE + "</b>";
+ private static final String TEST_GADGET = "http://wave-api.appspot.com/public/gadgets/areyouin/gadget.xml";
+ private static final String TITLE = "title";
+ private static final String TITLENEW = "titleNew";
+
+ KuneAgent manager;
+
+ @Before
+ public void before() throws PersistenceException, InvalidParticipantAddress {
+ final ServerFrontendAddressHolder frontendAddressHolder = Mockito.mock(ServerFrontendAddressHolder.class);
+ Mockito.when(frontendAddressHolder.getAddresses()).thenReturn(Lists.newArrayList("localhost:9898"));
+ final TokenGenerator tokenGenerator = Mockito.mock(TokenGenerator.class);
+ Mockito.when(tokenGenerator.generateToken(Mockito.anyInt())).thenReturn("abcde");
+ final AccountStore accountStore = Mockito.mock(AccountStore.class);
+ final AccountData accountData = Mockito.mock(AccountData.class);
+ final RobotAccountData accountRobotData = Mockito.mock(RobotAccountData.class);
+ final ParticipantId participantId = ParticipantId.of("kune-agent(a)example.com");
+
+ Mockito.when(accountStore.getAccount((ParticipantId) Mockito.anyObject())).thenReturn(accountData);
+ Mockito.when(accountData.asRobot()).thenReturn(accountRobotData);
+ Mockito.when(accountRobotData.getUrl()).thenReturn(KuneAgent.ROBOT_URI);
+ Mockito.when(accountRobotData.getId()).thenReturn(participantId);
+ Mockito.when(accountRobotData.getConsumerSecret()).thenReturn("someconsumer");
+ manager = new KuneAgent("example.com", accountStore, tokenGenerator, frontendAddressHolder);
+ }
+
+ private String getSiteAdminShortName() {
+ // TODO Auto-generated method stub
+
+ return "admin(a)example.com";
+ }
+
+ @Ignore
+ @Test
+ public void testBasicCreation() throws InvalidParticipantAddress {
+ final WaveRef waveletName = manager.createWave(RICHTEXT_MESSAGE,
+ ParticipantId.of(getSiteAdminShortName()));
+ assertNotNull(waveletName);
+ final Wavelet fetchWavelet = manager.fetchWavelet(waveletName, getSiteAdminShortName());
+ assertNotNull(fetchWavelet);
+ assertTrue(fetchWavelet.getRootBlip().getAnnotations().size() > 0);
+ assertEquals("", fetchWavelet.getRootBlip().getContent());
+ assertTrue(fetchWavelet.getRootBlip().getContent().contains(MESSAGE));
+ }
+}
Modified: trunk/src/test/java/cc/kune/wave/server/KuneWaveManagerDefaultTest.java
===================================================================
--- trunk/src/test/java/cc/kune/wave/server/KuneWaveManagerDefaultTest.java 2011-07-08 00:00:41 UTC (rev 1441)
+++ trunk/src/test/java/cc/kune/wave/server/KuneWaveManagerDefaultTest.java 2011-07-09 16:44:34 UTC (rev 1442)
@@ -41,11 +41,12 @@
private static final String MESSAGE = "testing";
private static final String NEW_PARTICIPANT = "newparti";
+ private static final String RICHTEXT_MESSAGE = "<b>" + MESSAGE + "</b>";
private static final String TEST_GADGET = "http://wave-api.appspot.com/public/gadgets/areyouin/gadget.xml";
private static final String TITLE = "title";
private static final String TITLENEW = "titleNew";
@Inject
- KuneWaveManagerDefault manager;
+ KuneWaveManager manager;
@Inject
ParticipantUtils participantUtils;
@@ -78,27 +79,28 @@
@Before
public void before() {
new IntegrationTestHelper(this);
-
}
private WaveRef createTestWave() {
- return manager.createWave(TITLE, MESSAGE, participantUtils.of(getSiteAdminShortName()));
+ return manager.createWave(TITLE, RICHTEXT_MESSAGE, participantUtils.of(getSiteAdminShortName()));
}
@Test
public void createWave() throws DefaultException, IOException {
doLogin();
- final WaveRef waveletName = manager.createWave(MESSAGE, participantUtils.of(getSiteAdminShortName()));
+ final WaveRef waveletName = manager.createWave(RICHTEXT_MESSAGE,
+ participantUtils.of(getSiteAdminShortName()));
assertNotNull(waveletName);
final Wavelet fetchWavelet = manager.fetchWavelet(waveletName, getSiteAdminShortName());
assertNotNull(fetchWavelet);
+ assertTrue(fetchWavelet.getRootBlip().getAnnotations().size() > 0);
assertTrue(fetchWavelet.getRootBlip().getContent().contains(MESSAGE));
}
@Test
public void createWaveWithGadget() throws DefaultException, IOException {
doLogin();
- final WaveRef waveletName = manager.createWave(TITLE, MESSAGE, new URL(TEST_GADGET),
+ final WaveRef waveletName = manager.createWave(TITLE, RICHTEXT_MESSAGE, new URL(TEST_GADGET),
participantUtils.of(getSiteAdminShortName()));
assertNotNull(waveletName);
final Wavelet fetchWavelet = manager.fetchWavelet(waveletName, getSiteAdminShortName());
Added: trunk/src/test/java/com/google/wave/splash/text/ContentNewUnrendererTest.java
===================================================================
--- trunk/src/test/java/com/google/wave/splash/text/ContentNewUnrendererTest.java (rev 0)
+++ trunk/src/test/java/com/google/wave/splash/text/ContentNewUnrendererTest.java 2011-07-09 16:44:34 UTC (rev 1442)
@@ -0,0 +1,20 @@
+package com.google.wave.splash.text;
+
+import static org.junit.Assert.assertEquals;
+
+import org.junit.Ignore;
+import org.junit.Test;
+
+import com.google.wave.splash.text.ContentUnrenderer.UnrenderedBlip;
+
+public class ContentNewUnrendererTest {
+
+ @Ignore
+ @Test
+ public void testBasicUnrender() {
+ // final IndexedDocument<Node, Element, Text> result =
+ // ContentNewUnrenderer.unrender("<b>Some <em>bold</em></b>");
+ final UnrenderedBlip result = ContentUnrenderer.unrender("<p></p><p><b>Some <em>bold</em></b></p>");
+ assertEquals("", result.elements.toString());
+ }
+}
Added: trunk/src/test/java/com/google/wave/splash/text/ContentUnrendererTest.java
===================================================================
--- trunk/src/test/java/com/google/wave/splash/text/ContentUnrendererTest.java (rev 0)
+++ trunk/src/test/java/com/google/wave/splash/text/ContentUnrendererTest.java 2011-07-09 16:44:34 UTC (rev 1442)
@@ -0,0 +1,22 @@
+package com.google.wave.splash.text;
+
+import static org.junit.Assert.assertEquals;
+
+import org.junit.Ignore;
+import org.junit.Test;
+import org.waveprotocol.wave.model.document.indexed.IndexedDocument;
+import org.waveprotocol.wave.model.document.raw.impl.Element;
+import org.waveprotocol.wave.model.document.raw.impl.Node;
+import org.waveprotocol.wave.model.document.raw.impl.Text;
+
+public class ContentUnrendererTest {
+
+ @Ignore
+ @Test
+ public void testBasicUnrender() {
+ final IndexedDocument<Node, Element, Text> unrender = ContentNewUnrenderer.unrender("<b>foo</b>");
+ assertEquals("", unrender.toXmlString());
+ // assertTrue(blip.annotations.size() > 0);
+ }
+
+}
1
0