<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Blog @ SIB Visions &#187; CSS</title>
	<atom:link href="http://blog.sibvisions.com/tag/css/feed/" rel="self" type="application/rss+xml" />
	<link>https://blog.sibvisions.com</link>
	<description>Blog @ SIB Visions</description>
	<lastBuildDate>Mon, 30 Mar 2026 11:14:36 +0000</lastBuildDate>
		<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>VisionX CSS Styling feature</title>
		<link>https://blog.sibvisions.com/2018/02/20/visionx-css-styling-feature/</link>
		<comments>https://blog.sibvisions.com/2018/02/20/visionx-css-styling-feature/#comments</comments>
		<pubDate>Tue, 20 Feb 2018 11:27:09 +0000</pubDate>
		<dc:creator>rjahn</dc:creator>
				<category><![CDATA[Development]]></category>
		<category><![CDATA[News]]></category>
		<category><![CDATA[CSS]]></category>
		<category><![CDATA[VisionX]]></category>

		<guid isPermaLink="false">https://blog.sibvisions.com/?p=7811</guid>
		<description><![CDATA[The upcoming release of VisionX will support CSS styling. We'll show you a first impression with a short video:

The editor supports autocompletion and syntax highlighting:
We did integrat the RSyntaxTextArea for this. If you want to know how this works, check the documentation.
]]></description>
			<content:encoded><![CDATA[<p>The upcoming release of VisionX will support CSS styling. We'll show you a first impression with a short video:</p>
<p><center><div class="wp-caption aligncenter nomargin" style="width: 570px"><iframe width="560" height="315" src="https://www.youtube.com/embed/AJX1JwBVdNo" frameborder="0" allowfullscreen></iframe><p class="wp-caption-text">Vaadin AddOn for VisionX</p></div></center></p>
<p>The editor supports autocompletion and syntax highlighting:</p>
<div id="attachment_7813" class="wp-caption aligncenter nomargin" style="width: 310px"><a href="https://blog.sibvisions.com/wp-content/uploads/2018/02/visionx_css.png" rel="lightbox[7811]"><img src="https://blog.sibvisions.com/wp-content/uploads/2018/02/visionx_css-300x243.png" alt="VisionX CSS Editor" title="visionx_css" width="300" height="243" class="size-medium wp-image-7813" /></a><p class="wp-caption-text">VisionX CSS Editor</p></div>
<p>We did integrat the <a href="https://github.com/bobbylight/RSyntaxTextArea">RSyntaxTextArea</a> for this. If you want to know how this works, check the <a href="https://doc.sibvisions.com/applications/external_editor">documentation</a>.</p>
]]></content:encoded>
			<wfw:commentRss>https://blog.sibvisions.com/2018/02/20/visionx-css-styling-feature/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Details about LIVE css hacking</title>
		<link>https://blog.sibvisions.com/2015/10/28/details-about-live-css-hacking/</link>
		<comments>https://blog.sibvisions.com/2015/10/28/details-about-live-css-hacking/#comments</comments>
		<pubDate>Wed, 28 Oct 2015 13:55:27 +0000</pubDate>
		<dc:creator>rjahn</dc:creator>
				<category><![CDATA[Development]]></category>
		<category><![CDATA[CSS]]></category>
		<category><![CDATA[JavaFX]]></category>
		<category><![CDATA[JVx]]></category>

		<guid isPermaLink="false">http://blog.sibvisions.com/?p=5134</guid>
		<description><![CDATA[We have a short video about our LIVE css hacking feature for mobile JavaFX applications on YouTube:
]]></description>
			<content:encoded><![CDATA[<p>We have a <a href="https://www.youtube.com/watch?v=fnooIzGUxFk">short video about our LIVE css hacking</a> feature for mobile JavaFX applications on YouTube:</p>
<p><center><div class="wp-caption aligncenter nomargin" style="width: 570px"><iframe width="560" height="315" src="https://www.youtube.com/embed/fnooIzGUxFk" frameborder="0" allowfullscreen></iframe><p class="wp-caption-text">JavaFX mobile LIVE CSS hacking</p></div><br />
</center></p>
<p>We demonstrate a mobile JavaFX application, running on a Nexus 9 Tablet. It's a pure JavaFX application with our mobile application frame and it was deployed with JavaFXPorts. In the video, we change some styles on our Laptop and the application updates its styles on demand. This is really useful because resolution/screen size can be different. Sometimes the background color looks different than on a Desktop, ... And it's easy to try out new styles without application restarts - same principle as developer tools for Chrome or FireBug for Firefox.</p>
<p><strong>But how did we implement this feature?</strong></p>
<p>It was too easy <img src='https://blog.sibvisions.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p>Here are the "secrets":</p>
<ul>
<li>A simple socket server for the application</li>
<li>A custom URL handler for loading remote-retrieved styles</li>
<li>A simple File watcher for the client</li>
</ul>
<p>That's it!</p>
<p>But to be honest, the custom URL handler was very tricky, because we tried to find a very smart, non-static, solution. And every platform has its specific handling and URL loading mechanism. But one step after another.</p>
<p>I guess you know that a socket server isn't a real problem. We wrote our own "generic" socket server some years ago, for JVx and it's not tricky. In principle, it works like this snippet:</p>
<div class="codesnip-container" >
<div class="java codesnip" style="font-family:monospace;"><span class="kw3">ServerSocket</span> serverSocket <span class="sy0">=</span> <span class="kw1">new</span> <span class="kw3">ServerSocket</span><span class="br0">&#40;</span>9999<span class="br0">&#41;</span><span class="sy0">;</span><br />
<span class="kw3">Socket</span> clientSocket <span class="sy0">=</span> serverSocket.<span class="me1">accept</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span></p>
<p><span class="kw3">PrintWriter</span> out <span class="sy0">=</span> <span class="kw1">new</span> <span class="kw3">PrintWriter</span><span class="br0">&#40;</span>clientSocket.<span class="me1">getOutputStream</span><span class="br0">&#40;</span><span class="br0">&#41;</span>, <span class="kw2">true</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
<span class="kw3">BufferedReader</span> in <span class="sy0">=</span> <span class="kw1">new</span> <span class="kw3">BufferedReader</span><span class="br0">&#40;</span><span class="kw1">new</span> <span class="kw3">InputStreamReader</span><span class="br0">&#40;</span>clientSocket.<span class="me1">getInputStream</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</div>
<p>The problem is that you need a sort of protocol for the content. We've used our UniversalSerializer and send simple POJOs. The stylesheet POJO contains the css file as byte[]. Here's our server code:</p>
<div class="codesnip-container" >
<div class="java codesnip" style="font-family:monospace;">CommunicationServer server <span class="sy0">=</span> <span class="kw1">new</span> CommunicationServer<span class="br0">&#40;</span>findHost<span class="br0">&#40;</span><span class="br0">&#41;</span>, 9999<span class="br0">&#41;</span><span class="sy0">;</span><br />
server.<span class="me1">addReceiver</span><span class="br0">&#40;</span>r <span class="sy0">-&gt;</span> <br />
<span class="br0">&#123;</span><br />
&nbsp; &nbsp; javafx.<span class="me1">application</span>.<span class="me1">Platform</span>.<span class="me1">runLater</span><span class="br0">&#40;</span><span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="sy0">-&gt;</span><br />
&nbsp; &nbsp; <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">synchronized</span> <span class="br0">&#40;</span>oSync<span class="br0">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span>sLastCss <span class="sy0">!=</span> <span class="kw2">null</span><span class="br0">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; logger.<span class="me1">info</span><span class="br0">&#40;</span><span class="st0">&quot;Remove remote CSS file &quot;</span>, sLastCss<span class="br0">&#41;</span><span class="sy0">;</span></p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; launcher.<span class="me1">getScene</span><span class="br0">&#40;</span><span class="br0">&#41;</span>.<span class="me1">getStylesheets</span><span class="br0">&#40;</span><span class="br0">&#41;</span>.<span class="me1">remove</span><span class="br0">&#40;</span><span class="st0">&quot;remotecss://&quot;</span> <span class="sy0">+</span> sLastCss<span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; ObjectCache.<span class="me1">remove</span><span class="br0">&#40;</span>sLastCss<span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span></p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; sLastCss <span class="sy0">=</span> ObjectCache.<span class="me1">createKey</span><span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="sy0">+</span> <span class="st0">&quot;.css&quot;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; ObjectCache.<span class="me1">put</span><span class="br0">&#40;</span>sLastCss, r.<span class="me1">getObject</span><span class="br0">&#40;</span><span class="br0">&#41;</span>, <span class="sy0">-</span>1<span class="br0">&#41;</span><span class="sy0">;</span></p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; logger.<span class="me1">info</span><span class="br0">&#40;</span><span class="st0">&quot;Install remote CSS file &quot;</span>, sLastCss<span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; launcher.<span class="me1">getScene</span><span class="br0">&#40;</span><span class="br0">&#41;</span>.<span class="me1">getStylesheets</span><span class="br0">&#40;</span><span class="br0">&#41;</span>.<span class="me1">add</span><span class="br0">&#40;</span><span class="st0">&quot;remotecss://&quot;</span> <span class="sy0">+</span> sLastCss<span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span><br />
&nbsp; &nbsp; <span class="br0">&#125;</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; <br />
&nbsp; &nbsp; <span class="kw1">return</span> <span class="kw2">null</span><span class="sy0">;</span><br />
<span class="br0">&#125;</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
server.<span class="me1">start</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</div>
<p>We add custom stylesheets with <em>remotecss</em> as protocol. The resource loading mechanism of Java(FX) tries to load the URL automatically. The protocol isn't a standard protocol and so we had to create a custom URL handler. The problem wasn't the handler itself because it's straight forward:</p>
<div class="codesnip-container" >
<div class="java codesnip" style="font-family:monospace;"><span class="kw1">public</span> <span class="kw1">class</span> Handler <span class="kw1">extends</span> <span class="kw3">URLStreamHandler</span><br />
<span class="br0">&#123;</span><br />
&nbsp; &nbsp; @Override<br />
&nbsp; &nbsp; <span class="kw1">protected</span> <span class="kw3">URLConnection</span> openConnection<span class="br0">&#40;</span><span class="kw3">URL</span> url<span class="br0">&#41;</span> <span class="kw1">throws</span> <span class="kw3">IOException</span><br />
&nbsp; &nbsp; <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span>url.<span class="me1">toString</span><span class="br0">&#40;</span><span class="br0">&#41;</span>.<span class="me1">toLowerCase</span><span class="br0">&#40;</span><span class="br0">&#41;</span>.<span class="me1">endsWith</span><span class="br0">&#40;</span><span class="st0">&quot;.css&quot;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">return</span> <span class="kw1">new</span> CssURLConnection<span class="br0">&#40;</span>url<span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">throw</span> <span class="kw1">new</span> <span class="kw3">FileNotFoundException</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; <span class="br0">&#125;</span><br />
<span class="br0">&#125;</span></div>
</div>
<p>And the <em>CssURLConnection</em> also wasn't a problem:</p>
<div class="codesnip-container" >
<div class="java codesnip" style="font-family:monospace;"><span class="kw1">private</span> <span class="kw1">class</span> CssURLConnection <span class="kw1">extends</span> <span class="kw3">URLConnection</span><br />
<span class="br0">&#123;</span><br />
&nbsp; &nbsp; <span class="kw1">public</span> CssURLConnection<span class="br0">&#40;</span><span class="kw3">URL</span> pUrl<span class="br0">&#41;</span><br />
&nbsp; &nbsp; <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">super</span><span class="br0">&#40;</span>pUrl<span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; <span class="br0">&#125;</span></p>
<p>&nbsp; &nbsp; @Override<br />
&nbsp; &nbsp; <span class="kw1">public</span> <span class="kw4">void</span> connect<span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="kw1">throws</span> <span class="kw3">IOException</span><br />
&nbsp; &nbsp; <span class="br0">&#123;</span><br />
&nbsp; &nbsp; <span class="br0">&#125;</span></p>
<p>&nbsp; &nbsp; @Override<br />
&nbsp; &nbsp; <span class="kw1">public</span> <span class="kw3">InputStream</span> getInputStream<span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="kw1">throws</span> <span class="kw3">IOException</span><br />
&nbsp; &nbsp; <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw3">Object</span> oCss <span class="sy0">=</span> ObjectCache.<span class="me1">get</span><span class="br0">&#40;</span>getURL<span class="br0">&#40;</span><span class="br0">&#41;</span>.<span class="me1">getHost</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span>oCss <span class="kw1">instanceof</span> <span class="kw3">String</span><span class="br0">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">return</span> <span class="kw1">new</span> <span class="kw3">ByteArrayInputStream</span><span class="br0">&#40;</span><span class="br0">&#40;</span><span class="br0">&#40;</span><span class="kw3">String</span><span class="br0">&#41;</span>oCss<span class="br0">&#41;</span>.<span class="me1">getBytes</span><span class="br0">&#40;</span><span class="st0">&quot;UTF-8&quot;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">else</span> <span class="kw1">if</span> <span class="br0">&#40;</span>oCss <span class="kw1">instanceof</span> <span class="kw4">byte</span><span class="br0">&#91;</span><span class="br0">&#93;</span><span class="br0">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">return</span> <span class="kw1">new</span> <span class="kw3">ByteArrayInputStream</span><span class="br0">&#40;</span><span class="br0">&#40;</span><span class="kw4">byte</span><span class="br0">&#91;</span><span class="br0">&#93;</span><span class="br0">&#41;</span>oCss<span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">throw</span> <span class="kw1">new</span> <span class="kw3">FileNotFoundException</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; <span class="br0">&#125;</span> &nbsp; &nbsp;<br />
<span class="br0">&#125;</span></div>
</div>
<p>The problem was that the JVM didn't know how to load <em>remotecss://</em> URLs because it doesn't have a default handler. The JVM offers different solutions for this problem and the well known is:</p>
<div class="codesnip-container" >URL.setURLStreamHandlerFactory(factory);</div>
<p>But this is a static mechanism and we didn't know if another library uses the same method. There's no getURLStreamHandlerFactory in URL and the solution wasn't good enough for us. For a simple test application this restriction shouldn't be a problem, but we didn't like it because we're framework developers.</p>
<p>There's another solution for the problem, because the source code of URL contains the static method:</p>
<div class="codesnip-container" >
<div class="java codesnip" style="font-family:monospace;"><span class="kw1">static</span> <span class="kw3">URLStreamHandler</span> getURLStreamHandler<span class="br0">&#40;</span><span class="kw3">String</span> protocol<span class="br0">&#41;</span></div>
</div>
<p>This method tries to load protocol handlers automatically, if definded via system property <em><strong>java.protocol.handler.pkgs</strong></em> or from package: sun.net.www.protocol.<strong>protocolname</strong>.<strong>Handler</strong></p>
<p>After reading the source code, we found a blogpost about this feature, <a href="http://mjremijan.blogspot.co.at/2012/02/create-your-own-java-url-handlers.html">read more</a>. It was easy to search with the right keyword after we knew the solution.</p>
<p>...be careful with security manager, but this shouldn't matter.</p>
<p>The URL implementation for Android is a little bit different because but if you set the system property, it'll work as expected.</p>
<p>The hardest parts were done and the last thing was the file watcher client because we planned to send the changed CSS file(s) to the app automatically. Here's our solution (Java8 style):</p>
<div class="codesnip-container" >
<div class="java codesnip" style="font-family:monospace;">thWatcher <span class="sy0">=</span> <span class="kw1">new</span> <span class="kw3">Thread</span><span class="br0">&#40;</span><span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="sy0">-&gt;</span> <br />
<span class="br0">&#123;</span><br />
&nbsp; &nbsp; <span class="kw3">File</span> fi <span class="sy0">=</span> ResourceUtil.<span class="me1">getFileForClass</span><span class="br0">&#40;</span><span class="st0">&quot;/live.css&quot;</span><span class="br0">&#41;</span>.<span class="me1">getParentFile</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span></p>
<p>&nbsp; &nbsp; FileSystem fsys <span class="sy0">=</span> FileSystems.<span class="me1">getDefault</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span></p>
<p>&nbsp; &nbsp; Path pathCss <span class="sy0">=</span> fsys.<span class="me1">getPath</span><span class="br0">&#40;</span>fi.<span class="me1">getAbsolutePath</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="sy0">;</span></p>
<p>&nbsp; &nbsp; <span class="kw1">try</span><br />
&nbsp; &nbsp; <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">try</span> <span class="br0">&#40;</span><span class="kw1">final</span> WatchService service <span class="sy0">=</span> fsys.<span class="me1">newWatchService</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; WatchKey wkey <span class="sy0">=</span> pathCss.<span class="me1">register</span><span class="br0">&#40;</span>service, StandardWatchEventKinds.<span class="me1">ENTRY_MODIFY</span><span class="br0">&#41;</span><span class="sy0">;</span></p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">while</span> <span class="br0">&#40;</span><span class="sy0">!</span>ThreadHandler.<span class="me1">isStopped</span><span class="br0">&#40;</span>thWatcher<span class="br0">&#41;</span><span class="br0">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; WatchKey key <span class="sy0">=</span> service.<span class="me1">take</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span></p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">for</span> <span class="br0">&#40;</span>WatchEvent<span class="sy0">&lt;?&gt;</span> event <span class="sy0">:</span> key.<span class="me1">pollEvents</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Kind<span class="sy0">&lt;?&gt;</span> kind <span class="sy0">=</span> event.<span class="me1">kind</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span></p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span>kind <span class="sy0">==</span> StandardWatchEventKinds.<span class="me1">ENTRY_MODIFY</span><span class="br0">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Path changed <span class="sy0">=</span> <span class="br0">&#40;</span>Path<span class="br0">&#41;</span>event.<span class="me1">context</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span></p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span>changed.<span class="me1">toString</span><span class="br0">&#40;</span><span class="br0">&#41;</span>.<span class="me1">equals</span><span class="br0">&#40;</span>FileUtil.<span class="me1">getName</span><span class="br0">&#40;</span><span class="kw3">CSS</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw3">File</span> fiModified <span class="sy0">=</span> <span class="kw1">new</span> <span class="kw3">File</span><span class="br0">&#40;</span>fi, changed.<span class="me1">toString</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="sy0">;</span></p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span>fiModified.<span class="me1">lastModified</span><span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="sy0">&gt;</span> 0<span class="br0">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span>lLastModified <span class="sy0">!=</span> fiModified.<span class="me1">lastModified</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">try</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; client <span class="sy0">=</span> getClient<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; client.<span class="me1">send</span><span class="br0">&#40;</span>FileUtil.<span class="me1">getContent</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="br0">&#40;</span>ResourceUtil.<span class="me1">getResourceAsStream</span><span class="br0">&#40;</span><span class="st0">&quot;/live.css&quot;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="sy0">;</span></p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; lLastModified <span class="sy0">=</span> fiModified.<span class="me1">lastModified</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span></p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw3">System</span>.<span class="me1">out</span>.<span class="me1">println</span><span class="br0">&#40;</span><span class="st0">&quot;Sent CSS to application&quot;</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">catch</span> <span class="br0">&#40;</span><span class="kw3">Exception</span> e<span class="br0">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">// next try</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; client <span class="sy0">=</span> CommonUtil.<span class="me1">close</span><span class="br0">&#40;</span>client<span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">else</span> <span class="kw1">if</span> <span class="br0">&#40;</span>kind <span class="sy0">==</span> StandardWatchEventKinds.<span class="me1">OVERFLOW</span><span class="br0">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">continue</span><span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span></p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span><span class="sy0">!</span>key.<span class="me1">reset</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; thWatcher <span class="sy0">=</span> ThreadHandler.<span class="me1">stop</span><span class="br0">&#40;</span>thWatcher<span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span></p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; wkey.<span class="me1">reset</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span><br />
&nbsp; &nbsp; <span class="br0">&#125;</span><br />
&nbsp; &nbsp; <span class="kw1">catch</span> <span class="br0">&#40;</span><span class="kw3">Exception</span> e<span class="br0">&#41;</span><br />
&nbsp; &nbsp; <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; e.<span class="me1">printStackTrace</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span></p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">synchronized</span> <span class="br0">&#40;</span>TestCommunication.<span class="kw1">this</span><span class="br0">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; TestCommunication.<span class="kw1">this</span>.<span class="me1">notify</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span><br />
&nbsp; &nbsp; <span class="br0">&#125;</span><br />
<span class="br0">&#125;</span><span class="br0">&#41;</span><span class="sy0">;</span></p>
<p>thWatcher.<span class="me1">start</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
ThreadHandler.<span class="me1">add</span><span class="br0">&#40;</span>thWatcher<span class="br0">&#41;</span><span class="sy0">;</span></div>
</div>
<p>The source code examples aren't complete but I guess you can implement your own solution based on them. We made tests with iOS,  Android and Desktop applications and didn't have any problems. The CSS editing feature would be a very useful extension for ScenicView but it's not available right now.</p>
<p>Our test devices:</p>
<div id="attachment_5145" class="wp-caption aligncenter" style="width: 310px"><a href="http://blog.sibvisions.com/wp-content/uploads/2015/10/ERP_different_devices.jpg" rel="lightbox[5134]"><img src="http://blog.sibvisions.com/wp-content/uploads/2015/10/ERP_different_devices-300x225.jpg" alt="Test devices" title="ERP_different_devices" width="300" height="225" class="size-medium wp-image-5145" /></a><p class="wp-caption-text">CSS hacking - test devices</p></div>
]]></content:encoded>
			<wfw:commentRss>https://blog.sibvisions.com/2015/10/28/details-about-live-css-hacking/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
