<?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>ambitz&#039;s blog</title>
	<atom:link href="http://ambitz.com/feed/" rel="self" type="application/rss+xml" />
	<link>http://ambitz.com</link>
	<description>Developer blog of spood.me</description>
	<lastBuildDate>Sun, 02 Oct 2011 13:50:47 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.1</generator>
		<item>
		<title>Thumbnail Chooser</title>
		<link>http://ambitz.com/2011/10/02/thumbnail-chooser/</link>
		<comments>http://ambitz.com/2011/10/02/thumbnail-chooser/#comments</comments>
		<pubDate>Sun, 02 Oct 2011 13:50:47 +0000</pubDate>
		<dc:creator>z00bs</dc:creator>
				<category><![CDATA[development]]></category>
		<category><![CDATA[google web toolkit]]></category>
		<category><![CDATA[GWT]]></category>
		<category><![CDATA[thumbnail]]></category>

		<guid isPermaLink="false">http://ambitz.com/?p=140</guid>
		<description><![CDATA[Whenever users can upload their own profile picture they should be able to choose a fixed sized thumbnail of it. Thinking of a news feed or protocol like list with user images in it, the images should all have the same size, they should be proportionally scaled and the user should select the section of <a href="http://ambitz.com/2011/10/02/thumbnail-chooser/"> read more <span class="meta-nav">&#187;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Whenever users can upload their own profile picture they should be able to choose a fixed sized thumbnail of it. Thinking of a news feed or protocol like list with user images in it, the images should all have the same size, they should be proportionally scaled and the user should select the section of the image to show. </p>
<p><a href="http://ambitz.com/wp-content/uploads/2011/10/Screen-Shot-2011-10-02-at-15.47.151.png"><img src="http://ambitz.com/wp-content/uploads/2011/10/Screen-Shot-2011-10-02-at-15.47.151.png" alt="" title="Thumbnail Chooser" width="114" height="93" class="alignleft size-full wp-image-161" /></a>Therefore, we implemented a Facebook like thumbnail chooser where the user can drag her image in a frame to adjust the visible section. We then create the thumbnail on the server (i.e., we first proportionally scale the original image and extract the selected aperture).</p>
<p>The chooser is initialized with the url of the previously selected thumbnail (if none exists we display a placeholder). After the user clicks on it we show a proportionally scaled version of the original image. The smaller dimension of the image (height or width) is scaled to fit the size of the frame (called <code>thumbnailBox</code> in the code) plus a given overlap. This is done in <code>scaleToFit(Image, int)</code>:</p>

<div class="wp_syntax"><div class="code"><pre class="java"><span class="kw1">private</span> <span class="kw4">void</span> scaleToFit<span class="br0">&#40;</span><a href="http://www.google.com/search?hl=en&amp;q=allinurl%3Aimage+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">Image</span></a> imageToScale, <span class="kw4">int</span> overlap<span class="br0">&#41;</span> <span class="br0">&#123;</span>
    <span class="kw1">if</span> <span class="br0">&#40;</span>imageToScale.<span class="me1">getWidth</span><span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="sy0">&lt;</span> imageToScale.<span class="me1">getHeight</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span>
        <span class="kw4">int</span> height <span class="sy0">=</span> imageToScale.<span class="me1">getHeight</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span>
        <span class="kw4">double</span> percent <span class="sy0">=</span> <span class="br0">&#40;</span><span class="kw4">double</span><span class="br0">&#41;</span> <span class="br0">&#40;</span>fBoxWidth <span class="sy0">+</span> overlap<span class="br0">&#41;</span> <span class="sy0">/</span> imageToScale.<span class="me1">getWidth</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span>
        imageToScale.<span class="me1">setWidth</span><span class="br0">&#40;</span>fBoxWidth <span class="sy0">+</span> overlap <span class="sy0">+</span> Unit.<span class="me1">PX</span>.<span class="me1">getType</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="sy0">;</span>
        imageToScale.<span class="me1">setHeight</span><span class="br0">&#40;</span><span class="br0">&#40;</span>height <span class="sy0">*</span> percent<span class="br0">&#41;</span> <span class="sy0">+</span> Unit.<span class="me1">PX</span>.<span class="me1">getType</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="sy0">;</span>
    <span class="br0">&#125;</span> <span class="kw1">else</span> <span class="br0">&#123;</span>
        <span class="kw4">int</span> width <span class="sy0">=</span> imageToScale.<span class="me1">getWidth</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span>
        <span class="kw4">double</span> percent <span class="sy0">=</span> <span class="br0">&#40;</span><span class="kw4">double</span><span class="br0">&#41;</span> <span class="br0">&#40;</span>fBoxHeight <span class="sy0">+</span> overlap<span class="br0">&#41;</span> <span class="sy0">/</span> imageToScale.<span class="me1">getHeight</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span>
        imageToScale.<span class="me1">setHeight</span><span class="br0">&#40;</span>fBoxHeight <span class="sy0">+</span> overlap <span class="sy0">+</span> Unit.<span class="me1">PX</span>.<span class="me1">getType</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="sy0">;</span>
        imageToScale.<span class="me1">setWidth</span><span class="br0">&#40;</span><span class="br0">&#40;</span>width <span class="sy0">*</span> percent<span class="br0">&#41;</span> <span class="sy0">+</span> Unit.<span class="me1">PX</span>.<span class="me1">getType</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="sy0">;</span>
    <span class="br0">&#125;</span>
<span class="br0">&#125;</span></pre></div></div>

<p>This method is called in a <code>LoadHandler</code> attached to the <code>thumbnail</code></p>

<div class="wp_syntax"><div class="code"><pre class="java">@UiHandler<span class="br0">&#40;</span><span class="st0">&quot;thumbnail&quot;</span><span class="br0">&#41;</span>
<span class="kw4">void</span> onImageLoad<span class="br0">&#40;</span>LoadEvent event<span class="br0">&#41;</span> <span class="br0">&#123;</span>
    <span class="co1">// scheduler needed for Chrome, otherwise width/height of image is always 0 (see</span>
    <span class="co1">// http://code.google.com/p/google-web-toolkit/issues/detail?id=6848)</span>
    Scheduler.<span class="me1">get</span><span class="br0">&#40;</span><span class="br0">&#41;</span>.<span class="me1">scheduleDeferred</span><span class="br0">&#40;</span><span class="kw1">new</span> ScheduledCommand<span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span>
&nbsp;
        @Override
        <span class="kw1">public</span> <span class="kw4">void</span> execute<span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span>
            scaleToFit<span class="br0">&#40;</span>thumbnail, fSourceLoaded <span class="sy0">?</span> fOverlap <span class="sy0">:</span> <span class="nu0">0</span><span class="br0">&#41;</span><span class="sy0">;</span>
        <span class="br0">&#125;</span>
    <span class="br0">&#125;</span><span class="br0">&#41;</span><span class="sy0">;</span>
<span class="br0">&#125;</span></pre></div></div>

<p>that is invoked after changing the source of <code>thumbnail</code>:</p>

<div class="wp_syntax"><div class="code"><pre class="java">@UiHandler<span class="br0">&#40;</span><span class="st0">&quot;thumbnailBox&quot;</span><span class="br0">&#41;</span>
<span class="kw4">void</span> onMouseDownBox<span class="br0">&#40;</span>MouseDownEvent event<span class="br0">&#41;</span> <span class="br0">&#123;</span>
    <span class="kw1">if</span> <span class="br0">&#40;</span><span class="sy0">!</span>fSourceLoaded<span class="br0">&#41;</span> <span class="br0">&#123;</span>
        fMover <span class="sy0">=</span> <span class="kw1">new</span> ImageMover<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span>
        fSourceLoaded <span class="sy0">=</span> <span class="kw2">true</span><span class="sy0">;</span>
        thumbnail.<span class="me1">setUrl</span><span class="br0">&#40;</span>fSourceUrl<span class="br0">&#41;</span><span class="sy0">;</span>
    <span class="br0">&#125;</span>
    fMover.<span class="me1">setStartPoints</span><span class="br0">&#40;</span>event.<span class="me1">getClientX</span><span class="br0">&#40;</span><span class="br0">&#41;</span>, event.<span class="me1">getClientY</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="sy0">;</span>
    fMouseUpRegistration <span class="sy0">=</span> <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3Aevent+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">Event</span></a>.<span class="me1">addNativePreviewHandler</span><span class="br0">&#40;</span>fMouseUpHandler<span class="br0">&#41;</span><span class="sy0">;</span>
    fPressed <span class="sy0">=</span> <span class="kw2">true</span><span class="sy0">;</span>
<span class="br0">&#125;</span></pre></div></div>

<p>Here we first check whether the original image is already loaded or not. If not we set the new url (which causes a <code>LoadEvent</code> to be fired). When the user drags the image <code>fMover</code> adjusts the <code>top</code> and <code>left</code> CSS properties of the image. The movement is triggered upon receiving <code>MouseMoveEvents</code> on the <code>thumbnailBox</code>. As soon as the user releases the mouse button the movement should stop. This one was a bit trickier since listening to <code>MouseUpEvent</code> on the <code>thumbnailBox</code> is not sufficient. What if the mouse pointer is outside the box? We therefore add a <code>NativePreviewHandler</code> (<code>fMouseUpHandler</code>) and listen for all native <code>Event.ONMOUSEUP</code> events:</p>

<div class="wp_syntax"><div class="code"><pre class="java"><span class="kw1">private</span> <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3Aevent+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">Event</span></a>.<span class="me1">NativePreviewHandler</span> fMouseUpHandler <span class="sy0">=</span> <span class="kw1">new</span> NativePreviewHandler<span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span>
&nbsp;
    @Override
    <span class="kw1">public</span> <span class="kw4">void</span> onPreviewNativeEvent<span class="br0">&#40;</span>NativePreviewEvent event<span class="br0">&#41;</span> <span class="br0">&#123;</span>
        <span class="kw1">if</span> <span class="br0">&#40;</span>event.<span class="me1">getTypeInt</span><span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="sy0">==</span> <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3Aevent+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">Event</span></a>.<span class="me1">ONMOUSEUP</span><span class="br0">&#41;</span> <span class="br0">&#123;</span>
            fPressed <span class="sy0">=</span> <span class="kw2">false</span><span class="sy0">;</span>
            fMouseUpRegistration.<span class="me1">removeHandler</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span>
        <span class="br0">&#125;</span>
    <span class="br0">&#125;</span>
<span class="br0">&#125;</span><span class="sy0">;</span></pre></div></div>

<p>Here&#8217;s the complete code:<br />
<code>ThumbnailChooser.ui.xml</code></p>

<div class="wp_syntax"><div class="code"><pre class="xml"><span class="sc0">&lt;!DOCTYPE ui:UiBinder SYSTEM &quot;http://dl.google.com/gwt/DTD/xhtml.ent&quot;&gt;</span>
<span class="sc3"><span class="re1">&lt;ui:UiBinder</span> <span class="re0">xmlns:ui</span>=<span class="st0">&quot;urn:ui:com.google.gwt.uibinder&quot;</span> <span class="re0">xmlns:g</span>=<span class="st0">&quot;urn:import:com.google.gwt.user.client.ui&quot;</span><span class="re2">&gt;</span></span>
    <span class="sc3"><span class="re1">&lt;ui:style<span class="re2">&gt;</span></span></span>
        .box {
            border: solid 1px orange;
            cursor: move;
       	    float: left;
            overflow: hidden;
        }
&nbsp;
        .box img {
            position: relative;
        }
    <span class="sc3"><span class="re1">&lt;/ui:style<span class="re2">&gt;</span></span></span>
&nbsp;
    <span class="sc3"><span class="re1">&lt;g:FocusPanel</span> <span class="re0">ui:field</span>=<span class="st0">&quot;thumbnailBox&quot;</span> <span class="re0">styleName</span>=<span class="st0">&quot;{style.box}&quot;</span><span class="re2">&gt;</span></span>
        <span class="sc3"><span class="re1">&lt;g:Image</span> <span class="re0">ui:field</span>=<span class="st0">&quot;thumbnail&quot;</span> <span class="re2">/&gt;</span></span>
    <span class="sc3"><span class="re1">&lt;/g:FocusPanel<span class="re2">&gt;</span></span></span>
<span class="sc3"><span class="re1">&lt;/ui:UiBinder<span class="re2">&gt;</span></span></span></pre></div></div>

<p><code>ThumbnailChooser.java</code></p>

<div class="wp_syntax"><div class="code"><pre class="java"><span class="kw1">import</span> <span class="co2">com.google.gwt.core.client.GWT</span><span class="sy0">;</span>
<span class="kw1">import</span> <span class="co2">com.google.gwt.core.client.Scheduler</span><span class="sy0">;</span>
<span class="kw1">import</span> <span class="co2">com.google.gwt.core.client.Scheduler.ScheduledCommand</span><span class="sy0">;</span>
<span class="kw1">import</span> <span class="co2">com.google.gwt.dom.client.Style.Unit</span><span class="sy0">;</span>
<span class="kw1">import</span> <span class="co2">com.google.gwt.event.dom.client.LoadEvent</span><span class="sy0">;</span>
<span class="kw1">import</span> <span class="co2">com.google.gwt.event.dom.client.MouseDownEvent</span><span class="sy0">;</span>
<span class="kw1">import</span> <span class="co2">com.google.gwt.event.dom.client.MouseMoveEvent</span><span class="sy0">;</span>
<span class="kw1">import</span> <span class="co2">com.google.gwt.event.dom.client.MouseUpEvent</span><span class="sy0">;</span>
<span class="kw1">import</span> <span class="co2">com.google.gwt.event.shared.HandlerRegistration</span><span class="sy0">;</span>
<span class="kw1">import</span> <span class="co2">com.google.gwt.uibinder.client.UiBinder</span><span class="sy0">;</span>
<span class="kw1">import</span> <span class="co2">com.google.gwt.uibinder.client.UiField</span><span class="sy0">;</span>
<span class="kw1">import</span> <span class="co2">com.google.gwt.uibinder.client.UiHandler</span><span class="sy0">;</span>
<span class="kw1">import</span> <span class="co2">com.google.gwt.user.client.Event</span><span class="sy0">;</span>
<span class="kw1">import</span> <span class="co2">com.google.gwt.user.client.Event.NativePreviewEvent</span><span class="sy0">;</span>
<span class="kw1">import</span> <span class="co2">com.google.gwt.user.client.Event.NativePreviewHandler</span><span class="sy0">;</span>
<span class="kw1">import</span> <span class="co2">com.google.gwt.user.client.ui.Composite</span><span class="sy0">;</span>
<span class="kw1">import</span> <span class="co2">com.google.gwt.user.client.ui.FocusPanel</span><span class="sy0">;</span>
<span class="kw1">import</span> <span class="co2">com.google.gwt.user.client.ui.Image</span><span class="sy0">;</span>
<span class="kw1">import</span> <span class="co2">com.google.gwt.user.client.ui.Widget</span><span class="sy0">;</span>
&nbsp;
<span class="co3">/**
 * This widget allows for selecting a sized area (i.e., a thumbnail) from a given picture.
 * &lt;p&gt;
 * It draws a box with the size of the thumbnail and displays the image of which the thumbnail is to be made in it. The
 * user can now drag the picture with the mouse and place it in the box as she likes.
 * 
 * @author zubi
 * 
 */</span>
<span class="kw1">public</span> <span class="kw1">class</span> ThumbnailChooser <span class="kw1">extends</span> <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3Acomposite+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">Composite</span></a> <span class="br0">&#123;</span>
&nbsp;
    <span class="kw1">private</span> <span class="kw1">static</span> ThumbnailChooserUiBinder sUiBinder <span class="sy0">=</span> GWT.<span class="me1">create</span><span class="br0">&#40;</span>ThumbnailChooserUiBinder.<span class="kw1">class</span><span class="br0">&#41;</span><span class="sy0">;</span>
&nbsp;
    <span class="kw1">interface</span> ThumbnailChooserUiBinder <span class="kw1">extends</span> UiBinder<span class="sy0">&lt;</span>Widget, ThumbnailChooser<span class="sy0">&gt;</span> <span class="br0">&#123;</span> <span class="br0">&#125;</span>
&nbsp;
    @UiField
    FocusPanel thumbnailBox<span class="sy0">;</span>
    @UiField
    <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3Aimage+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">Image</span></a> thumbnail<span class="sy0">;</span>
    <span class="kw1">private</span> <span class="kw1">final</span> <span class="kw4">int</span> fBoxHeight<span class="sy0">;</span>
    <span class="kw1">private</span> <span class="kw1">final</span> <span class="kw4">int</span> fBoxWidth<span class="sy0">;</span>
    <span class="kw1">private</span> <span class="kw1">final</span> <span class="kw4">int</span> fOverlap<span class="sy0">;</span>
    <span class="kw1">private</span> <span class="kw4">int</span> fLeft<span class="sy0">;</span>
    <span class="kw1">private</span> <span class="kw4">int</span> fTop<span class="sy0">;</span>
    <span class="kw1">private</span> <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3Astring+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">String</span></a> fThumbnailUrl<span class="sy0">;</span>
    <span class="kw1">private</span> <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3Astring+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">String</span></a> fSourceUrl<span class="sy0">;</span>
    <span class="kw1">private</span> <span class="kw4">boolean</span> fSourceLoaded<span class="sy0">;</span>
    <span class="kw1">private</span> ImageMover fMover<span class="sy0">;</span>
    <span class="kw1">private</span> <span class="kw4">boolean</span> fPressed<span class="sy0">;</span>
    <span class="kw1">private</span> HandlerRegistration fMouseUpRegistration<span class="sy0">;</span>
    <span class="kw1">private</span> <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3Aevent+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">Event</span></a>.<span class="me1">NativePreviewHandler</span> fMouseUpHandler <span class="sy0">=</span> <span class="kw1">new</span> NativePreviewHandler<span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span>
&nbsp;
        @Override
        <span class="kw1">public</span> <span class="kw4">void</span> onPreviewNativeEvent<span class="br0">&#40;</span>NativePreviewEvent event<span class="br0">&#41;</span> <span class="br0">&#123;</span>
            <span class="kw1">if</span> <span class="br0">&#40;</span>event.<span class="me1">getTypeInt</span><span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="sy0">==</span> <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3Aevent+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">Event</span></a>.<span class="me1">ONMOUSEUP</span><span class="br0">&#41;</span> <span class="br0">&#123;</span>
                fPressed <span class="sy0">=</span> <span class="kw2">false</span><span class="sy0">;</span>
                fMouseUpRegistration.<span class="me1">removeHandler</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span>
            <span class="br0">&#125;</span>
        <span class="br0">&#125;</span>
    <span class="br0">&#125;</span><span class="sy0">;</span>
&nbsp;
    <span class="co3">/**
     * Creates new thumbnail chooser.
     * 
     * @param thumbnailHeight
     *            height of thumbnail
     * @param thumbnailWidth
     *            width of thumbnail
     * @param thumbnailUrl
     *            url of existing thumbnail
     * @param sourceUrl
     *            url of the image of which a thumbnail is to be selected
     * @param overlap
     *            the amount in pixels the source image overlaps the thumbnail box in its shorter dimension (the image
     *            gets scaled to just fit the thumbnail box plus the given overlap)
     */</span>
    <span class="kw1">public</span> ThumbnailChooser<span class="br0">&#40;</span><span class="kw4">int</span> thumbnailHeight, <span class="kw4">int</span> thumbnailWidth, <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3Astring+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">String</span></a> thumbnailUrl, <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3Astring+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">String</span></a> sourceUrl, <span class="kw4">int</span> overlap<span class="br0">&#41;</span> <span class="br0">&#123;</span>
        initWidget<span class="br0">&#40;</span>sUiBinder.<span class="me1">createAndBindUi</span><span class="br0">&#40;</span><span class="kw1">this</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="sy0">;</span>
        fBoxHeight <span class="sy0">=</span> thumbnailHeight<span class="sy0">;</span>
        fBoxWidth <span class="sy0">=</span> thumbnailWidth<span class="sy0">;</span>
        fThumbnailUrl <span class="sy0">=</span> thumbnailUrl<span class="sy0">;</span>
        fSourceUrl <span class="sy0">=</span> sourceUrl<span class="sy0">;</span>
        fOverlap <span class="sy0">=</span> overlap<span class="sy0">;</span>
        init<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span>
    <span class="br0">&#125;</span>
&nbsp;
    <span class="kw1">private</span> <span class="kw4">void</span> init<span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span>
        thumbnailBox.<span class="me1">setPixelSize</span><span class="br0">&#40;</span>fBoxWidth, fBoxHeight<span class="br0">&#41;</span><span class="sy0">;</span>
        <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3Aimage+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">Image</span></a>.<span class="me1">prefetch</span><span class="br0">&#40;</span>fSourceUrl<span class="br0">&#41;</span><span class="sy0">;</span>
        thumbnail.<span class="me1">setUrl</span><span class="br0">&#40;</span>fThumbnailUrl<span class="br0">&#41;</span><span class="sy0">;</span>
    <span class="br0">&#125;</span>
&nbsp;
    <span class="kw1">private</span> <span class="kw4">void</span> scaleToFit<span class="br0">&#40;</span><a href="http://www.google.com/search?hl=en&amp;q=allinurl%3Aimage+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">Image</span></a> imageToScale, <span class="kw4">int</span> overlap<span class="br0">&#41;</span> <span class="br0">&#123;</span>
        <span class="kw1">if</span> <span class="br0">&#40;</span>imageToScale.<span class="me1">getWidth</span><span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="sy0">&lt;</span> imageToScale.<span class="me1">getHeight</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span>
            <span class="kw4">int</span> height <span class="sy0">=</span> imageToScale.<span class="me1">getHeight</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span>
            <span class="kw4">double</span> percent <span class="sy0">=</span> <span class="br0">&#40;</span><span class="kw4">double</span><span class="br0">&#41;</span> <span class="br0">&#40;</span>fBoxWidth <span class="sy0">+</span> overlap<span class="br0">&#41;</span> <span class="sy0">/</span> imageToScale.<span class="me1">getWidth</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span>
            imageToScale.<span class="me1">setWidth</span><span class="br0">&#40;</span>fBoxWidth <span class="sy0">+</span> overlap <span class="sy0">+</span> Unit.<span class="me1">PX</span>.<span class="me1">getType</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="sy0">;</span>
            imageToScale.<span class="me1">setHeight</span><span class="br0">&#40;</span><span class="br0">&#40;</span>height <span class="sy0">*</span> percent<span class="br0">&#41;</span> <span class="sy0">+</span> Unit.<span class="me1">PX</span>.<span class="me1">getType</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="sy0">;</span>
        <span class="br0">&#125;</span> <span class="kw1">else</span> <span class="br0">&#123;</span>
            <span class="kw4">int</span> width <span class="sy0">=</span> imageToScale.<span class="me1">getWidth</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span>
            <span class="kw4">double</span> percent <span class="sy0">=</span> <span class="br0">&#40;</span><span class="kw4">double</span><span class="br0">&#41;</span> <span class="br0">&#40;</span>fBoxHeight <span class="sy0">+</span> overlap<span class="br0">&#41;</span> <span class="sy0">/</span> imageToScale.<span class="me1">getHeight</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span>
            imageToScale.<span class="me1">setHeight</span><span class="br0">&#40;</span>fBoxHeight <span class="sy0">+</span> overlap <span class="sy0">+</span> Unit.<span class="me1">PX</span>.<span class="me1">getType</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="sy0">;</span>
            imageToScale.<span class="me1">setWidth</span><span class="br0">&#40;</span><span class="br0">&#40;</span>width <span class="sy0">*</span> percent<span class="br0">&#41;</span> <span class="sy0">+</span> Unit.<span class="me1">PX</span>.<span class="me1">getType</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="sy0">;</span>
        <span class="br0">&#125;</span>
    <span class="br0">&#125;</span>
&nbsp;
    @UiHandler<span class="br0">&#40;</span><span class="st0">&quot;thumbnail&quot;</span><span class="br0">&#41;</span>
    <span class="kw4">void</span> onImageLoad<span class="br0">&#40;</span>LoadEvent event<span class="br0">&#41;</span> <span class="br0">&#123;</span>
        <span class="co1">// scheduler needed for Chrome, otherwise width/height of image is always 0 (see</span>
        <span class="co1">// http://code.google.com/p/google-web-toolkit/issues/detail?id=6848)</span>
        Scheduler.<span class="me1">get</span><span class="br0">&#40;</span><span class="br0">&#41;</span>.<span class="me1">scheduleDeferred</span><span class="br0">&#40;</span><span class="kw1">new</span> ScheduledCommand<span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span>
&nbsp;
            @Override
            <span class="kw1">public</span> <span class="kw4">void</span> execute<span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span>
                scaleToFit<span class="br0">&#40;</span>thumbnail, fSourceLoaded <span class="sy0">?</span> fOverlap <span class="sy0">:</span> <span class="nu0">0</span><span class="br0">&#41;</span><span class="sy0">;</span>
            <span class="br0">&#125;</span>
        <span class="br0">&#125;</span><span class="br0">&#41;</span><span class="sy0">;</span>
    <span class="br0">&#125;</span>
&nbsp;
    @UiHandler<span class="br0">&#40;</span><span class="st0">&quot;thumbnail&quot;</span><span class="br0">&#41;</span>
    <span class="kw4">void</span> onMouseDown<span class="br0">&#40;</span>MouseDownEvent event<span class="br0">&#41;</span> <span class="br0">&#123;</span>
        <span class="co1">// prevent dragging of image</span>
        event.<span class="me1">preventDefault</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span>
    <span class="br0">&#125;</span>
&nbsp;
    @UiHandler<span class="br0">&#40;</span><span class="st0">&quot;thumbnailBox&quot;</span><span class="br0">&#41;</span>
    <span class="kw4">void</span> onMouseDownBox<span class="br0">&#40;</span>MouseDownEvent event<span class="br0">&#41;</span> <span class="br0">&#123;</span>
        <span class="kw1">if</span> <span class="br0">&#40;</span><span class="sy0">!</span>fSourceLoaded<span class="br0">&#41;</span> <span class="br0">&#123;</span>
            fMover <span class="sy0">=</span> <span class="kw1">new</span> ImageMover<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span>
            fSourceLoaded <span class="sy0">=</span> <span class="kw2">true</span><span class="sy0">;</span>
            thumbnail.<span class="me1">setUrl</span><span class="br0">&#40;</span>fSourceUrl<span class="br0">&#41;</span><span class="sy0">;</span>
        <span class="br0">&#125;</span>
        fMover.<span class="me1">setStartPoints</span><span class="br0">&#40;</span>event.<span class="me1">getClientX</span><span class="br0">&#40;</span><span class="br0">&#41;</span>, event.<span class="me1">getClientY</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="sy0">;</span>
        fMouseUpRegistration <span class="sy0">=</span> <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3Aevent+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">Event</span></a>.<span class="me1">addNativePreviewHandler</span><span class="br0">&#40;</span>fMouseUpHandler<span class="br0">&#41;</span><span class="sy0">;</span>
        fPressed <span class="sy0">=</span> <span class="kw2">true</span><span class="sy0">;</span>
    <span class="br0">&#125;</span>
&nbsp;
    @UiHandler<span class="br0">&#40;</span><span class="st0">&quot;thumbnailBox&quot;</span><span class="br0">&#41;</span>
    <span class="kw4">void</span> onMouseMoveBox<span class="br0">&#40;</span>MouseMoveEvent event<span class="br0">&#41;</span> <span class="br0">&#123;</span>
        <span class="kw1">if</span> <span class="br0">&#40;</span>fSourceLoaded <span class="sy0">&amp;&amp;</span> fPressed<span class="br0">&#41;</span> <span class="br0">&#123;</span>
            fMover.<span class="me1">move</span><span class="br0">&#40;</span>event.<span class="me1">getClientX</span><span class="br0">&#40;</span><span class="br0">&#41;</span>, event.<span class="me1">getClientY</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="sy0">;</span>
        <span class="br0">&#125;</span>
    <span class="br0">&#125;</span>
&nbsp;
    @UiHandler<span class="br0">&#40;</span><span class="st0">&quot;thumbnailBox&quot;</span><span class="br0">&#41;</span>
    <span class="kw4">void</span> onMouseUpBox<span class="br0">&#40;</span>MouseUpEvent event<span class="br0">&#41;</span> <span class="br0">&#123;</span>
        fPressed <span class="sy0">=</span> <span class="kw2">false</span><span class="sy0">;</span>
    <span class="br0">&#125;</span>
&nbsp;
    <span class="co3">/**
     * Returns width of the thumbnail box.
     * 
     * @return thumbnail width
     */</span>
    <span class="kw1">public</span> <span class="kw4">int</span> getThumbnailWidth<span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span>
        <span class="kw1">return</span> fBoxWidth<span class="sy0">;</span>
    <span class="br0">&#125;</span>
&nbsp;
    <span class="co3">/**
     * Returns height of thumbnail box.
     * 
     * @return thumbnail height
     */</span>
    <span class="kw1">public</span> <span class="kw4">int</span> getThumbnailHeight<span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span>
        <span class="kw1">return</span> fBoxHeight<span class="sy0">;</span>
    <span class="br0">&#125;</span>
&nbsp;
    <span class="co3">/**
     * Returns the new x coordinate of the upper left corner of the selected thumbnail. Add {@link #getThumbnailWidth()}
     * to get the new horizontal viewport.
     * 
     * @return x coordinate of the upper left corner of the viewport
     */</span>
    <span class="kw1">public</span> <span class="kw4">int</span> getX<span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span>
        <span class="kw1">return</span> fLeft <span class="sy0">*</span> <span class="sy0">-</span><span class="nu0">1</span><span class="sy0">;</span>
    <span class="br0">&#125;</span>
&nbsp;
    <span class="co3">/**
     * Returns the new y coordinate of the upper left corner of the selected thumbnail. Add
     * {@link #getThumbnailHeight()} to get the new vertical viewport.
     * 
     * @return y coordinate of the upper left corner of the viewport
     */</span>
    <span class="kw1">public</span> <span class="kw4">int</span> getY<span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span>
        <span class="kw1">return</span> fTop <span class="sy0">*</span> <span class="sy0">-</span><span class="nu0">1</span><span class="sy0">;</span>
    <span class="br0">&#125;</span>
&nbsp;
    <span class="kw1">private</span> <span class="kw1">class</span> ImageMover <span class="br0">&#123;</span>
&nbsp;
        <span class="kw1">private</span> <span class="kw4">int</span> startX<span class="sy0">;</span>
        <span class="kw1">private</span> <span class="kw4">int</span> startY<span class="sy0">;</span>
&nbsp;
        <span class="kw1">public</span> <span class="kw4">void</span> setStartPoints<span class="br0">&#40;</span><span class="kw4">int</span> clientX, <span class="kw4">int</span> clientY<span class="br0">&#41;</span> <span class="br0">&#123;</span>
            startX <span class="sy0">=</span> clientX<span class="sy0">;</span>
            startY <span class="sy0">=</span> clientY<span class="sy0">;</span>
        <span class="br0">&#125;</span>
&nbsp;
        <span class="kw1">public</span> <span class="kw4">void</span> move<span class="br0">&#40;</span><span class="kw4">int</span> clientX, <span class="kw4">int</span> clientY<span class="br0">&#41;</span> <span class="br0">&#123;</span>
            <span class="co1">// horizontal movement</span>
            <span class="kw4">int</span> hDiff <span class="sy0">=</span> startX <span class="sy0">-</span> clientX<span class="sy0">;</span>
            <span class="kw4">int</span> left <span class="sy0">=</span> getLeft<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span>
            startX <span class="sy0">=</span> clientX<span class="sy0">;</span>
            <span class="kw1">if</span> <span class="br0">&#40;</span>hDiff <span class="sy0">&gt;=</span> <span class="nu0">0</span><span class="br0">&#41;</span> <span class="br0">&#123;</span>
                fLeft <span class="sy0">=</span> <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3Amath+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">Math</span></a>.<span class="me1">max</span><span class="br0">&#40;</span>left <span class="sy0">-</span> hDiff, fBoxWidth <span class="sy0">-</span> thumbnail.<span class="me1">getWidth</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="sy0">;</span>
            <span class="br0">&#125;</span> <span class="kw1">else</span> <span class="br0">&#123;</span>
                fLeft <span class="sy0">=</span> <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3Amath+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">Math</span></a>.<span class="me1">min</span><span class="br0">&#40;</span>left <span class="sy0">+</span> <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3Amath+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">Math</span></a>.<span class="me1">abs</span><span class="br0">&#40;</span>hDiff<span class="br0">&#41;</span>, <span class="nu0">0</span><span class="br0">&#41;</span><span class="sy0">;</span>
            <span class="br0">&#125;</span>
&nbsp;
            <span class="co1">// vertical movement</span>
            <span class="kw4">int</span> vDiff <span class="sy0">=</span> startY <span class="sy0">-</span> clientY<span class="sy0">;</span>
            startY <span class="sy0">=</span> clientY<span class="sy0">;</span>
            <span class="kw4">int</span> top <span class="sy0">=</span> getTop<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span>
            <span class="kw1">if</span> <span class="br0">&#40;</span>vDiff <span class="sy0">&gt;=</span> <span class="nu0">0</span><span class="br0">&#41;</span> <span class="br0">&#123;</span>
                fTop <span class="sy0">=</span> <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3Amath+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">Math</span></a>.<span class="me1">max</span><span class="br0">&#40;</span>top <span class="sy0">-</span> vDiff, fBoxHeight <span class="sy0">-</span> thumbnail.<span class="me1">getHeight</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="sy0">;</span>
            <span class="br0">&#125;</span> <span class="kw1">else</span> <span class="br0">&#123;</span>
                fTop <span class="sy0">=</span> <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3Amath+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">Math</span></a>.<span class="me1">min</span><span class="br0">&#40;</span>top <span class="sy0">+</span> <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3Amath+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">Math</span></a>.<span class="me1">abs</span><span class="br0">&#40;</span>vDiff<span class="br0">&#41;</span>, <span class="nu0">0</span><span class="br0">&#41;</span><span class="sy0">;</span>
            <span class="br0">&#125;</span>
            thumbnail.<span class="me1">getElement</span><span class="br0">&#40;</span><span class="br0">&#41;</span>.<span class="me1">getStyle</span><span class="br0">&#40;</span><span class="br0">&#41;</span>.<span class="me1">setLeft</span><span class="br0">&#40;</span>fLeft, Unit.<span class="me1">PX</span><span class="br0">&#41;</span><span class="sy0">;</span>
            thumbnail.<span class="me1">getElement</span><span class="br0">&#40;</span><span class="br0">&#41;</span>.<span class="me1">getStyle</span><span class="br0">&#40;</span><span class="br0">&#41;</span>.<span class="me1">setTop</span><span class="br0">&#40;</span>fTop, Unit.<span class="me1">PX</span><span class="br0">&#41;</span><span class="sy0">;</span>
        <span class="br0">&#125;</span>
&nbsp;
        <span class="kw1">private</span> <span class="kw4">int</span> getTop<span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span>
            <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3Astring+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">String</span></a> top <span class="sy0">=</span> thumbnail.<span class="me1">getElement</span><span class="br0">&#40;</span><span class="br0">&#41;</span>.<span class="me1">getStyle</span><span class="br0">&#40;</span><span class="br0">&#41;</span>.<span class="me1">getTop</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span>
            <span class="kw1">if</span> <span class="br0">&#40;</span>top.<span class="me1">isEmpty</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span>
                <span class="kw1">return</span> <span class="nu0">0</span><span class="sy0">;</span>
            <span class="br0">&#125;</span>
            <span class="kw1">return</span> <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3Ainteger+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">Integer</span></a>.<span class="me1">parseInt</span><span class="br0">&#40;</span>top.<span class="me1">replaceAll</span><span class="br0">&#40;</span>Unit.<span class="me1">PX</span>.<span class="me1">getType</span><span class="br0">&#40;</span><span class="br0">&#41;</span>, <span class="st0">&quot;&quot;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="sy0">;</span>
        <span class="br0">&#125;</span>
&nbsp;
        <span class="kw1">private</span> <span class="kw4">int</span> getLeft<span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span>
            <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3Astring+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">String</span></a> left <span class="sy0">=</span> thumbnail.<span class="me1">getElement</span><span class="br0">&#40;</span><span class="br0">&#41;</span>.<span class="me1">getStyle</span><span class="br0">&#40;</span><span class="br0">&#41;</span>.<span class="me1">getLeft</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span>
            <span class="kw1">if</span> <span class="br0">&#40;</span>left.<span class="me1">isEmpty</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span>
                <span class="kw1">return</span> <span class="nu0">0</span><span class="sy0">;</span>
            <span class="br0">&#125;</span>
            <span class="kw1">return</span> <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3Ainteger+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">Integer</span></a>.<span class="me1">parseInt</span><span class="br0">&#40;</span>left.<span class="me1">replaceAll</span><span class="br0">&#40;</span>Unit.<span class="me1">PX</span>.<span class="me1">getType</span><span class="br0">&#40;</span><span class="br0">&#41;</span>, <span class="st0">&quot;&quot;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="sy0">;</span>
        <span class="br0">&#125;</span>
    <span class="br0">&#125;</span>
<span class="br0">&#125;</span></pre></div></div>

]]></content:encoded>
			<wfw:commentRss>http://ambitz.com/2011/10/02/thumbnail-chooser/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>OS X Lion: Re-enabling Key Repeat</title>
		<link>http://ambitz.com/2011/07/28/os-x-lion-re-enabling-key-repeat/</link>
		<comments>http://ambitz.com/2011/07/28/os-x-lion-re-enabling-key-repeat/#comments</comments>
		<pubDate>Thu, 28 Jul 2011 19:32:32 +0000</pubDate>
		<dc:creator>z00bs</dc:creator>
				<category><![CDATA[infrastructure]]></category>
		<category><![CDATA[Mac]]></category>
		<category><![CDATA[OS X Lion]]></category>
		<category><![CDATA[terminal]]></category>

		<guid isPermaLink="false">http://ambitz.com/?p=121</guid>
		<description><![CDATA[We think the new key press-and-hold feature of Mac OS Lion is pretty annoying. Thanks to belchak.com for showing how to disable it and re-enable key repeat. In your Terminal enter the following command and restart your Mac: defaults write -g ApplePressAndHoldEnabled -bool false]]></description>
			<content:encoded><![CDATA[<p>We think the new key press-and-hold feature of Mac OS Lion is pretty annoying. Thanks to belchak.com for showing how to disable it and re-enable key repeat.</p>
<p>In your Terminal enter the following command and restart your Mac:</p>

<div class="wp_syntax"><div class="code"><pre class="bash">defaults <span class="kw2">write</span> <span class="re5">-g</span> ApplePressAndHoldEnabled <span class="re5">-bool</span> <span class="kw2">false</span></pre></div></div>

]]></content:encoded>
			<wfw:commentRss>http://ambitz.com/2011/07/28/os-x-lion-re-enabling-key-repeat/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Parse URL with GWT</title>
		<link>http://ambitz.com/2011/07/18/parse-url-with-gwt/</link>
		<comments>http://ambitz.com/2011/07/18/parse-url-with-gwt/#comments</comments>
		<pubDate>Mon, 18 Jul 2011 12:05:11 +0000</pubDate>
		<dc:creator>z00bs</dc:creator>
				<category><![CDATA[development]]></category>
		<category><![CDATA[GWT]]></category>
		<category><![CDATA[parse]]></category>
		<category><![CDATA[RegEx]]></category>
		<category><![CDATA[URL]]></category>

		<guid isPermaLink="false">http://ambitz.com/?p=103</guid>
		<description><![CDATA[We&#8217;ve implemented a simple rich text editor that supports basic text formatting like bold, italic, lists and so on. We also wanted to provide the functionality to enter URLs that automatically are truncated and afterwards transformed into anchor elements. For example the URL http://www.youtube.com/watch?v=T0X9BcBd-I0 should be transformed into &#60;a href="http://www.youtube.com/watch?v=T0X9BcBd-I0"&#62;www.youtube.com&#60;/a&#62;. This improves the reading as <a href="http://ambitz.com/2011/07/18/parse-url-with-gwt/"> read more <span class="meta-nav">&#187;</span></a>]]></description>
			<content:encoded><![CDATA[<p>We&#8217;ve implemented a simple rich text editor that supports basic text formatting like bold, italic, lists and so on. We also wanted to provide the functionality to enter URLs that automatically are truncated and afterwards transformed into anchor elements. For example the URL <code>http://www.youtube.com/watch?v=T0X9BcBd-I0</code> should be transformed into <code>&lt;a href="http://www.youtube.com/watch?v=T0X9BcBd-I0"&gt;www.youtube.com&lt;/a&gt;</code>. This improves the reading as well as the look of an user post or comment.</p>
<p>Since we can&#8217;t use any of the classes of <code>java.util.regex</code> the solution below only relies on the regex methods of <code>String</code>. In our editor the parsing is done continuously while the user types. Meaning it is possible that <code>toMarkup</code> already contains an anchor element that was replaced previously. Therefore, we must not replace that URL again or more general, we must not parse any URL already contained in an anchor tag. The last part of <code>PATTERN</code> accounts for that situation.</p>

<div class="wp_syntax"><div class="code"><pre class="java"><span class="co3">/**
 * Converts URLs into &lt;a href=&quot;url&quot;&gt;short form of url&lt;/a&gt; elements.
 * 
 * The shorter form of the URL will contain the subdomain, domain and top domain. Protocol (http(s) or
 * ftp) and path will be removed.
 * 
 * @author zubi
 * 
 */</span>
<span class="kw1">public</span> <span class="kw1">class</span> LinkParser <span class="kw1">implements</span> RichTextHTMLParser <span class="br0">&#123;</span>
&nbsp;
    <span class="kw1">private</span> <span class="kw1">static</span> <span class="kw1">final</span> <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3Astring+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">String</span></a> BEFORE_DOMAIN <span class="sy0">=</span> <span class="st0">&quot;<span class="es0">\\</span>b((https?|ftp)://)&quot;</span><span class="sy0">;</span>
    <span class="kw1">private</span> <span class="kw1">static</span> <span class="kw1">final</span> <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3Astring+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">String</span></a> PATH <span class="sy0">=</span> <span class="st0">&quot;(:<span class="es0">\\</span>d+)?(/[-a-z0-9A-Z_:@&amp;?=+,.!/~*'%#$]*)*&quot;</span><span class="sy0">;</span>
    <span class="kw1">private</span> <span class="kw1">static</span> <span class="kw1">final</span> <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3Astring+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">String</span></a> PATTERN <span class="sy0">=</span>
            BEFORE_DOMAIN
                    <span class="sy0">+</span> <span class="st0">&quot;?([a-z0-9](?:[-a-z0-9A-Z]*[a-z0-9])?<span class="es0">\\</span>.)+(com<span class="es0">\\</span>b|edu<span class="es0">\\</span>b|biz<span class="es0">\\</span>b|gov<span class="es0">\\</span>b|in(?:t|fo)<span class="es0">\\</span>b|mil<span class="es0">\\</span>b|net<span class="es0">\\</span>b|org<span class="es0">\\</span>b|[a-z][a-z]<span class="es0">\\</span>b)&quot;</span>
                    <span class="sy0">+</span> PATH <span class="sy0">+</span> <span class="st0">&quot;(?!((?!(?:&lt;a )).)*?(?:&lt;/a&gt;))&quot;</span><span class="sy0">;</span>
&nbsp;
    @Override
    <span class="kw1">public</span> <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3Astring+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">String</span></a> getHTML<span class="br0">&#40;</span><a href="http://www.google.com/search?hl=en&amp;q=allinurl%3Astring+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">String</span></a> toMarkup<span class="br0">&#41;</span> <span class="br0">&#123;</span>
        <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3Astring+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">String</span></a><span class="br0">&#91;</span><span class="br0">&#93;</span> splits <span class="sy0">=</span> toMarkup.<span class="me1">split</span><span class="br0">&#40;</span>PATTERN, <span class="nu0">2</span><span class="br0">&#41;</span><span class="sy0">;</span>
        <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3Astring+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">String</span></a> result <span class="sy0">=</span> toMarkup<span class="sy0">;</span>
        <span class="kw1">while</span> <span class="br0">&#40;</span>splits.<span class="me1">length</span> <span class="sy0">&gt;</span> <span class="nu0">1</span><span class="br0">&#41;</span> <span class="br0">&#123;</span>
            result <span class="sy0">=</span> replaceUrl<span class="br0">&#40;</span>result, splits<span class="br0">&#41;</span><span class="sy0">;</span>
            splits <span class="sy0">=</span> result.<span class="me1">split</span><span class="br0">&#40;</span>PATTERN<span class="br0">&#41;</span><span class="sy0">;</span>
        <span class="br0">&#125;</span>
        <span class="kw1">if</span> <span class="br0">&#40;</span>result.<span class="me1">matches</span><span class="br0">&#40;</span><span class="st0">&quot;.+?&quot;</span> <span class="sy0">+</span> PATTERN<span class="br0">&#41;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span>
            <span class="kw4">int</span> start <span class="sy0">=</span> splits<span class="br0">&#91;</span><span class="nu0">0</span><span class="br0">&#93;</span>.<span class="me1">length</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span>
            result <span class="sy0">=</span> result.<span class="me1">replaceAll</span><span class="br0">&#40;</span>PATTERN, getLink<span class="br0">&#40;</span>result.<span class="me1">substring</span><span class="br0">&#40;</span>start<span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="sy0">;</span>
        <span class="br0">&#125;</span>
        <span class="kw1">return</span> result<span class="sy0">;</span>
    <span class="br0">&#125;</span>
&nbsp;
    <span class="kw1">private</span> <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3Astring+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">String</span></a> replaceUrl<span class="br0">&#40;</span><a href="http://www.google.com/search?hl=en&amp;q=allinurl%3Astring+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">String</span></a> text, <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3Astring+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">String</span></a><span class="br0">&#91;</span><span class="br0">&#93;</span> parts<span class="br0">&#41;</span> <span class="br0">&#123;</span>
        <span class="kw4">int</span> start <span class="sy0">=</span> parts<span class="br0">&#91;</span><span class="nu0">0</span><span class="br0">&#93;</span>.<span class="me1">length</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span>
        <span class="kw4">int</span> end <span class="sy0">=</span> parts<span class="br0">&#91;</span><span class="nu0">0</span><span class="br0">&#93;</span>.<span class="me1">length</span><span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="sy0">+</span> text.<span class="me1">substring</span><span class="br0">&#40;</span>parts<span class="br0">&#91;</span><span class="nu0">0</span><span class="br0">&#93;</span>.<span class="me1">length</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span>.<span class="me1">lastIndexOf</span><span class="br0">&#40;</span>parts<span class="br0">&#91;</span><span class="nu0">1</span><span class="br0">&#93;</span><span class="br0">&#41;</span><span class="sy0">;</span>
        <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3Astring+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">String</span></a> url <span class="sy0">=</span> text.<span class="me1">substring</span><span class="br0">&#40;</span>start, end<span class="br0">&#41;</span><span class="sy0">;</span>
        <span class="kw1">return</span> text.<span class="me1">replaceFirst</span><span class="br0">&#40;</span>PATTERN, getLink<span class="br0">&#40;</span>url<span class="br0">&#41;</span><span class="br0">&#41;</span><span class="sy0">;</span>
    <span class="br0">&#125;</span>
&nbsp;
    <span class="kw1">private</span> <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3Astring+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">String</span></a> getLink<span class="br0">&#40;</span><a href="http://www.google.com/search?hl=en&amp;q=allinurl%3Astring+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">String</span></a> url<span class="br0">&#41;</span> <span class="br0">&#123;</span>
        <span class="kw1">if</span> <span class="br0">&#40;</span><span class="sy0">!</span>url.<span class="me1">matches</span><span class="br0">&#40;</span>BEFORE_DOMAIN <span class="sy0">+</span> <span class="st0">&quot;.*&quot;</span><span class="br0">&#41;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span>
            url <span class="sy0">=</span> <span class="st0">&quot;http://&quot;</span> <span class="sy0">+</span> url<span class="sy0">;</span>
        <span class="br0">&#125;</span>
        <span class="kw1">return</span> <span class="st0">&quot;&lt;a target=<span class="es0">\&quot;</span>_blank<span class="es0">\&quot;</span> href=<span class="es0">\&quot;</span>&quot;</span> <span class="sy0">+</span> url <span class="sy0">+</span> <span class="st0">&quot;<span class="es0">\&quot;</span>&gt;&quot;</span> <span class="sy0">+</span> getDomain<span class="br0">&#40;</span>url<span class="br0">&#41;</span> <span class="sy0">+</span> <span class="st0">&quot;&lt;/a&gt;&quot;</span><span class="sy0">;</span>
    <span class="br0">&#125;</span>
&nbsp;
    <span class="kw1">private</span> <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3Astring+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">String</span></a> getDomain<span class="br0">&#40;</span><a href="http://www.google.com/search?hl=en&amp;q=allinurl%3Astring+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">String</span></a> url<span class="br0">&#41;</span> <span class="br0">&#123;</span>
        <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3Astring+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">String</span></a> domain <span class="sy0">=</span> url.<span class="me1">replaceAll</span><span class="br0">&#40;</span>BEFORE_DOMAIN, <span class="st0">&quot;&quot;</span><span class="br0">&#41;</span>.<span class="me1">replaceAll</span><span class="br0">&#40;</span>PATH, <span class="st0">&quot;&quot;</span><span class="br0">&#41;</span><span class="sy0">;</span>
        <span class="kw1">return</span> domain<span class="sy0">;</span>
    <span class="br0">&#125;</span>
<span class="br0">&#125;</span></pre></div></div>

]]></content:encoded>
			<wfw:commentRss>http://ambitz.com/2011/07/18/parse-url-with-gwt/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Adding a gitolite-controlled repository to Redmine</title>
		<link>http://ambitz.com/2011/03/07/adding-a-gitolite-controlled-repository-to-redmine/</link>
		<comments>http://ambitz.com/2011/03/07/adding-a-gitolite-controlled-repository-to-redmine/#comments</comments>
		<pubDate>Mon, 07 Mar 2011 12:18:20 +0000</pubDate>
		<dc:creator>kraftan</dc:creator>
				<category><![CDATA[infrastructure]]></category>
		<category><![CDATA[Git]]></category>
		<category><![CDATA[gitolite]]></category>
		<category><![CDATA[Redmine]]></category>

		<guid isPermaLink="false">http://ambitz.com/?p=80</guid>
		<description><![CDATA[Currently, we use gitolite to access control our Git repositories. In addition, we use Redmine to manage our projects. The standard installation of Redmine can only access a local Git repository via direct access to the file system. Unfortunately, Redmine is not able to show Git repositories via the Git protocol. The latter approach is <a href="http://ambitz.com/2011/03/07/adding-a-gitolite-controlled-repository-to-redmine/"> read more <span class="meta-nav">&#187;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Currently, we use <a title="gitolite" href="https://github.com/sitaramc/gitolite">gitolite</a> to access control our Git repositories. In addition, we use <a title="Redmine" href="http://redmine.org">Redmine</a> to manage our projects.</p>
<p>The standard installation of Redmine can only access a local Git repository via direct access to the file system. Unfortunately, Redmine is not able to show Git repositories via the Git protocol. The latter approach is preferable since gitolite allows access to Git repositories via the Git daemon. By using gitolite as intended, Redmine cannot access bare gitolite-controlled repositories because the Redmine user does not have read permissions on the corresponding directories.</p>
<p>Since Version 1.6 Git provides a <code>clone</code> option to create a bare repository of an existing one. So the first step to let Redmine show a gitolite-controlled repository is to make a mirror clone of it in a directory that Redmine can access, for instance in <code>/var/git-mirrors</code></p>

<div class="wp_syntax"><div class="code"><pre class="sh">$ git clone --mirror /home/git/repositories/my-repo.git</pre></div></div>

<p>Since the <code>git</code> user will keep the two repositories via <code>post-receive</code> hook in sync, <code>git</code> needs to have read/write permissions on the mirror clone:</p>

<div class="wp_syntax"><div class="code"><pre class="bash">$ <span class="kw3">cd</span> <span class="sy0">/</span>var<span class="sy0">/</span>git-mirrors<span class="sy0">/</span>
$ <span class="kw2">chown</span> <span class="re5">-R</span> <span class="kw2">git</span>:<span class="kw2">git</span> my-repo.git</pre></div></div>

<p>To keep the repositories in sync, you need to install a <code>post-receive</code> hook in the gitolite-controlled repositories that mirror-pushes each change to the mirror repository in <code>/var/git-mirrors</code>:</p>

<div class="wp_syntax"><div class="code"><pre class="bash">$ <span class="kw3">cd</span> <span class="sy0">/</span>home<span class="sy0">/</span>git<span class="sy0">/</span>repositories<span class="sy0">/</span>my-repo.git<span class="sy0">/</span>hooks
$ <span class="kw2">cat</span> <span class="sy0">&gt;&gt;</span> post-receive <span class="sy0">&lt;&lt;</span> EOF
<span class="sy0">&gt;</span> <span class="co0">#!/bin/sh</span>
<span class="sy0">&gt;</span> <span class="sy0">/</span>usr<span class="sy0">/</span>bin<span class="sy0">/</span><span class="kw2">git</span> push <span class="re5">--mirror</span> <span class="sy0">/</span>var<span class="sy0">/</span>git-mirrors<span class="sy0">/</span>my-repo.git
<span class="sy0">&gt;</span> EOF
$ <span class="kw2">chown</span> <span class="kw2">git</span>:<span class="kw2">git</span> post-receive
$ <span class="kw2">chmod</span> <span class="nu0">700</span> post-receive</pre></div></div>

<p>When Git mirror-pushes changes to a repository, it keeps the file/directory permissions from the mirrored repository. Since gitolite maintains the repositories, only the owner of the repository has read and write access. After a mirror-push, the mirror repository cannot by read by anyone else anymore. Therefore, you have to tell the mirror repository that its shared and what file/directory permission it should have:</p>

<div class="wp_syntax"><div class="code"><pre class="bash">$ <span class="kw3">cd</span> <span class="sy0">/</span>var<span class="sy0">/</span>git-mirrors<span class="sy0">/</span>my-repo.git
$ <span class="kw2">git</span> config <span class="re5">--add</span> core.sharedRepository 0644</pre></div></div>

<p>That&#8217;s it. You should be able to integrate the bare mirror repository <code>/var/git-mirrors/my-repo.git</code> into Redmine and keep it automatically in sync whenever you push to the gitolite-controlled, original repository.</p>
]]></content:encoded>
			<wfw:commentRss>http://ambitz.com/2011/03/07/adding-a-gitolite-controlled-repository-to-redmine/feed/</wfw:commentRss>
		<slash:comments>11</slash:comments>
		</item>
		<item>
		<title>Autogrow TextArea with GWT</title>
		<link>http://ambitz.com/2010/12/11/autogrow-textarea-with-gwt/</link>
		<comments>http://ambitz.com/2010/12/11/autogrow-textarea-with-gwt/#comments</comments>
		<pubDate>Sat, 11 Dec 2010 16:31:45 +0000</pubDate>
		<dc:creator>z00bs</dc:creator>
				<category><![CDATA[development]]></category>
		<category><![CDATA[autogrow]]></category>
		<category><![CDATA[google web toolkit]]></category>
		<category><![CDATA[GWT]]></category>
		<category><![CDATA[textarea]]></category>

		<guid isPermaLink="false">http://ambitz.com/?p=29</guid>
		<description><![CDATA[GWT implementation of an autogrow texrtarea]]></description>
			<content:encoded><![CDATA[<p>This post is about a GWT only implementation of an autogrow textarea. That is, a textarea that automatically grows and shrinks vertically according to it&#8217;s content (best known of Facebook when writing comments or messages).</p>
<p>In our solution we calculate the needed height of the textarea upon every <code>KeyUpEvent</code> and <code>KeyDownEvent</code>. The <code>KeyDownEvent</code> is needed if a user keeps pressing a button. In this case only one <code>KeyUpEvent</code> is fired at the time when the key is released. Though the textarea won&#8217;t adjust its size during the pressing.</p>
<p>To calculate the size to fit the current content we use the following<br />
<code>shrink()</code> and <code>grow()</code> methods:</p>

<div class="wp_syntax"><div class="code"><pre class="java"><span class="kw1">private</span> <span class="kw4">void</span> grow<span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span>
    <span class="kw1">while</span> <span class="br0">&#40;</span>getElement<span class="br0">&#40;</span><span class="br0">&#41;</span>.<span class="me1">getScrollHeight</span><span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="sy0">&gt;</span> getElement<span class="br0">&#40;</span><span class="br0">&#41;</span>.<span class="me1">getClientHeight</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span>
        setVisibleLines<span class="br0">&#40;</span>getVisibleLines<span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="sy0">+</span> fGrowLines<span class="br0">&#41;</span><span class="sy0">;</span>
    <span class="br0">&#125;</span>
<span class="br0">&#125;</span>
&nbsp;
<span class="kw1">private</span> <span class="kw4">void</span> shrink<span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span>
    <span class="kw4">int</span> rows <span class="sy0">=</span> getVisibleLines<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span>
    <span class="kw1">while</span> <span class="br0">&#40;</span>rows <span class="sy0">&gt;</span> fInitialLines<span class="br0">&#41;</span> <span class="br0">&#123;</span>
        setVisibleLines<span class="br0">&#40;</span><span class="sy0">--</span>rows<span class="br0">&#41;</span><span class="sy0">;</span>
    <span class="br0">&#125;</span>
<span class="br0">&#125;</span></pre></div></div>

<p>Where <code>fInitialLines</code> is the minimum size (in lines) of the textarea and <code>fGrowLines</code> are the number of lines the textarea will grow. Whenever one of the mentioned key events occurs we run both methods to adjust the size.</p>
<p>One last thing we took account of was cutting and pasting when triggered via right mouse click or the menu. We therefore sink two more events: <code>ONPASTE</code> and <code>ONCUT</code>. Whereas <code>ONPASTE</code> is already supported by GWT we have to use JSNI to register for <code>ONCUT</code> events (there&#8217;s an open <a href="http://code.google.com/p/google-web-toolkit/issues/detail?id=4030">issue</a> for it).</p>

<div class="wp_syntax"><div class="code"><pre class="java"><span class="kw1">private</span> <span class="kw1">native</span> <span class="kw4">void</span> registerOnCut<span class="br0">&#40;</span><a href="http://www.google.com/search?hl=en&amp;q=allinurl%3Aelement+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">Element</span></a> element<span class="br0">&#41;</span> <span class="coMULTI">/*-{
    var that = this.@com.ambitz.everest.gwt.client.widget.autogrowtextarea.AutoGrowTextArea::fSizeHandler;
    element.oncut = $entry(function() {
    that.@com.ambitz.everest.gwt.client.widget.autogrowtextarea.AutoGrowTextArea.SizeHandler::shrink()();
    return false;
    });
}-*/</span><span class="sy0">;</span></pre></div></div>

<p>Here&#8217;s the complete class:</p>

<div class="wp_syntax"><div class="code"><pre class="java"><span class="kw1">import</span> <span class="co2">com.google.gwt.dom.client.Style.Overflow</span><span class="sy0">;</span>
<span class="kw1">import</span> <span class="co2">com.google.gwt.event.dom.client.KeyPressEvent</span><span class="sy0">;</span>
<span class="kw1">import</span> <span class="co2">com.google.gwt.event.dom.client.KeyPressHandler</span><span class="sy0">;</span>
<span class="kw1">import</span> <span class="co2">com.google.gwt.event.dom.client.KeyUpEvent</span><span class="sy0">;</span>
<span class="kw1">import</span> <span class="co2">com.google.gwt.event.dom.client.KeyUpHandler</span><span class="sy0">;</span>
<span class="kw1">import</span> <span class="co2">com.google.gwt.user.client.Command</span><span class="sy0">;</span>
<span class="kw1">import</span> <span class="co2">com.google.gwt.user.client.DOM</span><span class="sy0">;</span>
<span class="kw1">import</span> <span class="co2">com.google.gwt.user.client.DeferredCommand</span><span class="sy0">;</span>
<span class="kw1">import</span> <span class="co2">com.google.gwt.user.client.Element</span><span class="sy0">;</span>
<span class="kw1">import</span> <span class="co2">com.google.gwt.user.client.Event</span><span class="sy0">;</span>
<span class="kw1">import</span> <span class="co2">com.google.gwt.user.client.ui.TextArea</span><span class="sy0">;</span>
&nbsp;
<span class="co3">/**
 * A {@link TextArea} that automatically grows and shrinks depending on its content.
 * 
 * @author zubi
 * 
 */</span>
<span class="kw1">public</span> <span class="kw1">class</span> AutoGrowTextArea <span class="kw1">extends</span> <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3Atextarea+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">TextArea</span></a> <span class="br0">&#123;</span>
&nbsp;
    <span class="kw1">private</span> <span class="kw1">class</span> SizeHandler <span class="kw1">implements</span> KeyUpHandler, KeyPressHandler, BlurHandler <span class="br0">&#123;</span>
&nbsp;
        @Override
        <span class="kw1">public</span> <span class="kw4">void</span> onKeyUp<span class="br0">&#40;</span>KeyUpEvent event<span class="br0">&#41;</span> <span class="br0">&#123;</span>
            size<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span>
        <span class="br0">&#125;</span>
&nbsp;
        <span class="kw1">public</span> <span class="kw4">void</span> size<span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span>
            shrink<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span>
            grow<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span>
        <span class="br0">&#125;</span>
&nbsp;
        <span class="kw1">private</span> <span class="kw4">void</span> grow<span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span>
            <span class="kw1">while</span> <span class="br0">&#40;</span>getElement<span class="br0">&#40;</span><span class="br0">&#41;</span>.<span class="me1">getScrollHeight</span><span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="sy0">&gt;</span> getElement<span class="br0">&#40;</span><span class="br0">&#41;</span>.<span class="me1">getClientHeight</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span>
                setVisibleLines<span class="br0">&#40;</span>getVisibleLines<span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="sy0">+</span> fGrowLines<span class="br0">&#41;</span><span class="sy0">;</span>
            <span class="br0">&#125;</span>
        <span class="br0">&#125;</span>
&nbsp;
        <span class="kw1">private</span> <span class="kw4">void</span> shrink<span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span>
            <span class="kw4">int</span> rows <span class="sy0">=</span> getVisibleLines<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span>
            <span class="kw1">while</span> <span class="br0">&#40;</span>rows <span class="sy0">&gt;</span> fInitialLines<span class="br0">&#41;</span> <span class="br0">&#123;</span>
                setVisibleLines<span class="br0">&#40;</span><span class="sy0">--</span>rows<span class="br0">&#41;</span><span class="sy0">;</span>
            <span class="br0">&#125;</span>
        <span class="br0">&#125;</span>
&nbsp;
        @Override
        <span class="kw1">public</span> <span class="kw4">void</span> onKeyPress<span class="br0">&#40;</span>KeyPressEvent event<span class="br0">&#41;</span> <span class="br0">&#123;</span>
            size<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span>
        <span class="br0">&#125;</span>
&nbsp;
        @Override
        <span class="kw1">public</span> <span class="kw4">void</span> onBlur<span class="br0">&#40;</span>BlurEvent event<span class="br0">&#41;</span> <span class="br0">&#123;</span>
            size<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span>
        <span class="br0">&#125;</span>
    <span class="br0">&#125;</span>
&nbsp;
    <span class="kw1">private</span> <span class="kw4">int</span> fInitialLines<span class="sy0">;</span>
    <span class="kw1">private</span> <span class="kw4">int</span> fGrowLines<span class="sy0">;</span>
    <span class="kw1">private</span> SizeHandler fSizeHandler<span class="sy0">;</span>
&nbsp;
    <span class="co3">/**
     * Creates new text area. Initial number of lines is set to 2, grow lines is set to 1 (see
     * {@link #AutoGrowTextArea(int, int)}.
     */</span>
    <span class="kw1">public</span> AutoGrowTextArea<span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span>
        <span class="kw1">this</span><span class="br0">&#40;</span><span class="nu0">2</span>, <span class="nu0">1</span><span class="br0">&#41;</span><span class="sy0">;</span>
    <span class="br0">&#125;</span>
&nbsp;
    <span class="co3">/**
     * Creates new text area.
     * 
     * @param initialLines
     *            how high in terms of visible lines the initial text box is (the height will never go below this
     *            number)
     * @param growLines
     *            how many lines the text box grows when content reaches the current last line
     */</span>
    <span class="kw1">public</span> AutoGrowTextArea<span class="br0">&#40;</span><span class="kw4">int</span> initialLines, <span class="kw4">int</span> growLines<span class="br0">&#41;</span> <span class="br0">&#123;</span>
        <span class="kw1">super</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span>
        registerHandlers<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span>
        adjustStyle<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span>
        setVisibleLines<span class="br0">&#40;</span>initialLines<span class="br0">&#41;</span><span class="sy0">;</span>
        fInitialLines <span class="sy0">=</span> initialLines<span class="sy0">;</span>
        fGrowLines <span class="sy0">=</span> growLines<span class="sy0">;</span>
    <span class="br0">&#125;</span>
&nbsp;
    <span class="kw1">private</span> <span class="kw4">void</span> adjustStyle<span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span>
        getElement<span class="br0">&#40;</span><span class="br0">&#41;</span>.<span class="me1">getStyle</span><span class="br0">&#40;</span><span class="br0">&#41;</span>.<span class="me1">setOverflow</span><span class="br0">&#40;</span>Overflow.<span class="me1">HIDDEN</span><span class="br0">&#41;</span><span class="sy0">;</span>
        getElement<span class="br0">&#40;</span><span class="br0">&#41;</span>.<span class="me1">getStyle</span><span class="br0">&#40;</span><span class="br0">&#41;</span>.<span class="me1">setProperty</span><span class="br0">&#40;</span><span class="st0">&quot;resize&quot;</span>, <span class="st0">&quot;none&quot;</span><span class="br0">&#41;</span><span class="sy0">;</span>
    <span class="br0">&#125;</span>
&nbsp;
    <span class="kw1">private</span> <span class="kw4">void</span> registerHandlers<span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span>
        fSizeHandler <span class="sy0">=</span> <span class="kw1">new</span> SizeHandler<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span>
        addKeyUpHandler<span class="br0">&#40;</span>fSizeHandler<span class="br0">&#41;</span><span class="sy0">;</span>
        addKeyPressHandler<span class="br0">&#40;</span>fSizeHandler<span class="br0">&#41;</span><span class="sy0">;</span>
        addBlurHandler<span class="br0">&#40;</span>fSizeHandler<span class="br0">&#41;</span><span class="sy0">;</span>
        sinkEvents<span class="br0">&#40;</span><a href="http://www.google.com/search?hl=en&amp;q=allinurl%3Aevent+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">Event</span></a>.<span class="me1">ONPASTE</span><span class="br0">&#41;</span><span class="sy0">;</span>
        registerOnCut<span class="br0">&#40;</span>getElement<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="sy0">;</span>
    <span class="br0">&#125;</span>
&nbsp;
    <span class="kw1">private</span> <span class="kw1">native</span> <span class="kw4">void</span> registerOnCut<span class="br0">&#40;</span><a href="http://www.google.com/search?hl=en&amp;q=allinurl%3Aelement+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">Element</span></a> element<span class="br0">&#41;</span> <span class="coMULTI">/*-{
        var that = this.@com.ambitz.everest.gwt.client.widget.autogrowtextarea.AutoGrowTextArea::fSizeHandler;
        element.oncut = $entry(function() {
        that.@com.ambitz.everest.gwt.client.widget.autogrowtextarea.AutoGrowTextArea.SizeHandler::shrink()();
        return false;
        });
    }-*/</span><span class="sy0">;</span>
&nbsp;
    @Override
    <span class="kw1">public</span> <span class="kw4">void</span> onBrowserEvent<span class="br0">&#40;</span><a href="http://www.google.com/search?hl=en&amp;q=allinurl%3Aevent+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">Event</span></a> event<span class="br0">&#41;</span> <span class="br0">&#123;</span>
        <span class="kw1">super</span>.<span class="me1">onBrowserEvent</span><span class="br0">&#40;</span>event<span class="br0">&#41;</span><span class="sy0">;</span>
        <span class="kw1">switch</span> <span class="br0">&#40;</span>DOM.<span class="me1">eventGetType</span><span class="br0">&#40;</span>event<span class="br0">&#41;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span>
            <span class="kw1">case</span> <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3Aevent+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">Event</span></a>.<span class="me1">ONPASTE</span><span class="sy0">:</span>
                Scheduler.<span class="me1">get</span><span class="br0">&#40;</span><span class="br0">&#41;</span>.<span class="me1">scheduleDeferred</span><span class="br0">&#40;</span><span class="kw1">new</span> ScheduledCommand<span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span>
&nbsp;
                    @Override
                    <span class="kw1">public</span> <span class="kw4">void</span> execute<span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span>
                        fSizeHandler.<span class="me1">size</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span>
                    <span class="br0">&#125;</span>
&nbsp;
                <span class="br0">&#125;</span><span class="br0">&#41;</span><span class="sy0">;</span>
                <span class="kw1">break</span><span class="sy0">;</span>
        <span class="br0">&#125;</span>
    <span class="br0">&#125;</span>
<span class="br0">&#125;</span></pre></div></div>

<p><strong>Edit:</strong><br />
As mentioned by Mike (thanks for that!) you shouldn&#8217;t set a height on the textarea. Otherwise <code>setVisibleLines()</code> won&#8217;t work.</p>
]]></content:encoded>
			<wfw:commentRss>http://ambitz.com/2010/12/11/autogrow-textarea-with-gwt/feed/</wfw:commentRss>
		<slash:comments>12</slash:comments>
		</item>
		<item>
		<title>Finally&#8230;</title>
		<link>http://ambitz.com/2010/11/19/finally/</link>
		<comments>http://ambitz.com/2010/11/19/finally/#comments</comments>
		<pubDate>Fri, 19 Nov 2010 17:24:03 +0000</pubDate>
		<dc:creator>z00bs</dc:creator>
				<category><![CDATA[general]]></category>
		<category><![CDATA[spood.me]]></category>

		<guid isPermaLink="false">http://ambitz.com/?p=9</guid>
		<description><![CDATA[Hello World!]]></description>
			<content:encoded><![CDATA[<p>&#8230; we have our tech blog up and running! We will here publish all our findings, lessons learned and g33k related stuff  – most of it concerning the development of our baby <a title="spood.me" href="http://spood.me" target="_blank">spood.me</a>.</p>
<p>Stay tuned and let the bloggin&#8217; begin!</p>
<p>Beat Fluri aka &#8216;kraftan&#8217;<br />
and<br />
Jonas Zuberbuehler aka &#8216;z00bs&#8217;</p>
]]></content:encoded>
			<wfw:commentRss>http://ambitz.com/2010/11/19/finally/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

