<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="ru">
		<id>http://www.jexp.ru/index.php?action=history&amp;feed=atom&amp;title=Java%2FGWT%2FUtility</id>
		<title>Java/GWT/Utility - История изменений</title>
		<link rel="self" type="application/atom+xml" href="http://www.jexp.ru/index.php?action=history&amp;feed=atom&amp;title=Java%2FGWT%2FUtility"/>
		<link rel="alternate" type="text/html" href="http://www.jexp.ru/index.php?title=Java/GWT/Utility&amp;action=history"/>
		<updated>2026-04-22T21:12:23Z</updated>
		<subtitle>История изменений этой страницы в вики</subtitle>
		<generator>MediaWiki 1.30.0</generator>

	<entry>
		<id>http://www.jexp.ru/index.php?title=Java/GWT/Utility&amp;diff=7071&amp;oldid=prev</id>
		<title>Admin: 1 версия</title>
		<link rel="alternate" type="text/html" href="http://www.jexp.ru/index.php?title=Java/GWT/Utility&amp;diff=7071&amp;oldid=prev"/>
				<updated>2010-06-01T06:35:42Z</updated>
		
		<summary type="html">&lt;p&gt;1 версия&lt;/p&gt;
&lt;table class=&quot;diff diff-contentalign-left&quot; data-mw=&quot;interface&quot;&gt;
				&lt;tr style=&quot;vertical-align: top;&quot; lang=&quot;ru&quot;&gt;
				&lt;td colspan=&quot;1&quot; style=&quot;background-color: white; color:black; text-align: center;&quot;&gt;← Предыдущая&lt;/td&gt;
				&lt;td colspan=&quot;1&quot; style=&quot;background-color: white; color:black; text-align: center;&quot;&gt;Версия 06:35, 1 июня 2010&lt;/td&gt;
				&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;2&quot; style=&quot;text-align: center;&quot; lang=&quot;ru&quot;&gt;&lt;div class=&quot;mw-diff-empty&quot;&gt;(нет различий)&lt;/div&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;</summary>
		<author><name>Admin</name></author>	</entry>

	<entry>
		<id>http://www.jexp.ru/index.php?title=Java/GWT/Utility&amp;diff=7070&amp;oldid=prev</id>
		<title> в 18:01, 31 мая 2010</title>
		<link rel="alternate" type="text/html" href="http://www.jexp.ru/index.php?title=Java/GWT/Utility&amp;diff=7070&amp;oldid=prev"/>
				<updated>2010-05-31T18:01:44Z</updated>
		
		<summary type="html">&lt;p&gt;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Новая страница&lt;/b&gt;&lt;/p&gt;&lt;div&gt;== Array Utils for client side GWT ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
   &lt;br /&gt;
  &amp;lt;!-- start source code --&amp;gt;&lt;br /&gt;
   &lt;br /&gt;
    &amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
/*&lt;br /&gt;
 * Copyright 2006 Robert Hanson &amp;lt;iamroberthanson AT gmail.ru&amp;gt;&lt;br /&gt;
 * &lt;br /&gt;
 * Licensed under the Apache License, Version 2.0 (the &amp;quot;License&amp;quot;);&lt;br /&gt;
 * you may not use this file except in compliance with the License.&lt;br /&gt;
 * You may obtain a copy of the License at&lt;br /&gt;
 * &lt;br /&gt;
 *    http://www.apache.org/licenses/LICENSE-2.0&lt;br /&gt;
 * &lt;br /&gt;
 * Unless required by applicable law or agreed to in writing, software&lt;br /&gt;
 * distributed under the License is distributed on an &amp;quot;AS IS&amp;quot; BASIS,&lt;br /&gt;
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.&lt;br /&gt;
 * See the License for the specific language governing permissions and&lt;br /&gt;
 * limitations under the License.&lt;br /&gt;
 */&lt;br /&gt;
package org.gwtwidgets.client.util;&lt;br /&gt;
import com.google.gwt.core.client.JavaScriptObject;&lt;br /&gt;
public class ArrayUtils&lt;br /&gt;
{&lt;br /&gt;
&lt;br /&gt;
    public static JavaScriptObject toJsArray (int[] array)&lt;br /&gt;
    {&lt;br /&gt;
        JavaScriptObject result = createArray();&lt;br /&gt;
        for (int i = 0; i &amp;lt; array.length; i++) {&lt;br /&gt;
            pushArray(result, array[i]);&lt;br /&gt;
        }&lt;br /&gt;
        return result;&lt;br /&gt;
    };&lt;br /&gt;
&lt;br /&gt;
    public static JavaScriptObject toJsArray (double[] array)&lt;br /&gt;
    {&lt;br /&gt;
        JavaScriptObject result = createArray();&lt;br /&gt;
        for (int i = 0; i &amp;lt; array.length; i++) {&lt;br /&gt;
            pushArray(result, array[i]);&lt;br /&gt;
        }&lt;br /&gt;
        return result;&lt;br /&gt;
    };&lt;br /&gt;
    &lt;br /&gt;
    public static JavaScriptObject toJsArray (Object[] array)&lt;br /&gt;
    {&lt;br /&gt;
        JavaScriptObject result = createArray();&lt;br /&gt;
        for (int i = 0; i &amp;lt; array.length; i++) {&lt;br /&gt;
            pushArray(result, array[i]);&lt;br /&gt;
        }&lt;br /&gt;
        return result;&lt;br /&gt;
    };&lt;br /&gt;
    &lt;br /&gt;
    &lt;br /&gt;
    private native static JavaScriptObject createArray () /*-{&lt;br /&gt;
        return new Array();&lt;br /&gt;
    }-*/;&lt;br /&gt;
    private native static void pushArray (JavaScriptObject array, int i) /*-{&lt;br /&gt;
        array.push(i);&lt;br /&gt;
    }-*/;&lt;br /&gt;
    private native static void pushArray (JavaScriptObject array, double d) /*-{&lt;br /&gt;
        array.push(d);&lt;br /&gt;
    }-*/;&lt;br /&gt;
    private native static void pushArray (JavaScriptObject array, Object o) /*-{&lt;br /&gt;
        array.push(o);&lt;br /&gt;
    }-*/;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
           &lt;br /&gt;
       &amp;lt;/source&amp;gt;&lt;br /&gt;
    &lt;br /&gt;
   &lt;br /&gt;
  &amp;lt;!-- end source code --&amp;gt;&lt;br /&gt;
   &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== A simple number formatting/ parsing class ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
   &lt;br /&gt;
  &amp;lt;!-- start source code --&amp;gt;&lt;br /&gt;
   &lt;br /&gt;
    &amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
/*&lt;br /&gt;
 * Copyright 2006 Robert Hanson &amp;lt;iamroberthanson AT gmail.ru&amp;gt;&lt;br /&gt;
 * &lt;br /&gt;
 * Licensed under the Apache License, Version 2.0 (the &amp;quot;License&amp;quot;);&lt;br /&gt;
 * you may not use this file except in compliance with the License.&lt;br /&gt;
 * You may obtain a copy of the License at&lt;br /&gt;
 * &lt;br /&gt;
 *    http://www.apache.org/licenses/LICENSE-2.0&lt;br /&gt;
 * &lt;br /&gt;
 * Unless required by applicable law or agreed to in writing, software&lt;br /&gt;
 * distributed under the License is distributed on an &amp;quot;AS IS&amp;quot; BASIS,&lt;br /&gt;
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.&lt;br /&gt;
 * See the License for the specific language governing permissions and&lt;br /&gt;
 * limitations under the License.&lt;br /&gt;
 */&lt;br /&gt;
package org.gwtwidgets.client.util;&lt;br /&gt;
/**&lt;br /&gt;
 * &amp;lt;dl&amp;gt;&lt;br /&gt;
 * &amp;lt;dt&amp;gt;&amp;lt;b&amp;gt;Title: &amp;lt;/b&amp;gt;&amp;lt;dd&amp;gt;Decimal Format&amp;lt;/dd&amp;gt;&lt;br /&gt;
 * &amp;lt;p&amp;gt;&lt;br /&gt;
 * &amp;lt;dt&amp;gt;&amp;lt;b&amp;gt;Description: &amp;lt;/b&amp;gt;&amp;lt;dd&amp;gt;This is a simple number formatting/ parsing class. Besides the simple number formatting&lt;br /&gt;
 * it also interprets shortcuts for thousand (k) million (m) and billion (b).&amp;lt;p/&amp;gt;&lt;br /&gt;
 * This Number Format class was adapted from the public domain javascript class found at &lt;br /&gt;
 * http://www.mredkj.ru/javascript/nfdocs.html &amp;lt;/dd&amp;gt;&lt;br /&gt;
 * &amp;lt;p&amp;gt;&lt;br /&gt;
 * &amp;lt;/dl&amp;gt;&lt;br /&gt;
 * @author &lt;br /&gt;
 * @version $Revision: 0.0 $&lt;br /&gt;
 */&lt;br /&gt;
public class NumberFormat&lt;br /&gt;
{&lt;br /&gt;
    public static final String COMMA = &amp;quot;,&amp;quot;;&lt;br /&gt;
    public static final String PERIOD = &amp;quot;.&amp;quot;;&lt;br /&gt;
    public static final char DASH = &amp;quot;-&amp;quot;;&lt;br /&gt;
    public static final char LEFT_PAREN = &amp;quot;(&amp;quot;;&lt;br /&gt;
    public static final char RIGHT_PAREN = &amp;quot;)&amp;quot;;&lt;br /&gt;
    // k/m/b Shortcuts&lt;br /&gt;
    public static final String THOUSAND = &amp;quot;k&amp;quot;;&lt;br /&gt;
    public static final String MILLION = &amp;quot;m&amp;quot;;&lt;br /&gt;
    public static final String BILLION = &amp;quot;b&amp;quot;;&lt;br /&gt;
    &lt;br /&gt;
    // currency position constants&lt;br /&gt;
    public static final int CUR_POS_LEFT_OUTSIDE = 0;&lt;br /&gt;
    public static final int CUR_POS_LEFT_INSIDE = 1;&lt;br /&gt;
    public static final int CUR_POS_RIGHT_INSIDE = 2;&lt;br /&gt;
    public static final int CUR_POS_RIGHT_OUTSIDE = 3;&lt;br /&gt;
    // negative format constants&lt;br /&gt;
    public static final int NEG_LEFT_DASH = 0;&lt;br /&gt;
    public static final int NEG_RIGHT_DASH = 1;&lt;br /&gt;
    public static final int NEG_PARENTHESIS = 2;&lt;br /&gt;
    // constant to signal that fixed precision is not to be used&lt;br /&gt;
    public static final int ARBITRARY_PRECISION = -1;&lt;br /&gt;
    private String inputDecimalSeparator = PERIOD; // decimal character used on the original string&lt;br /&gt;
    private boolean showGrouping = true;&lt;br /&gt;
    private String groupingSeparator = COMMA; // thousands grouping character&lt;br /&gt;
    private String decimalSeparator = PERIOD; // decimal point character&lt;br /&gt;
    private boolean showCurrencySymbol = false;&lt;br /&gt;
    private String currencySymbol = &amp;quot;$&amp;quot;;&lt;br /&gt;
    private int currencySymbolPosition = CUR_POS_LEFT_OUTSIDE;&lt;br /&gt;
    private int negativeFormat = NEG_LEFT_DASH;&lt;br /&gt;
    private boolean isNegativeRed = false; // wrap the output in html that will display red?&lt;br /&gt;
    private int decimalPrecision = 0;&lt;br /&gt;
    private boolean useFixedPrecision = false;&lt;br /&gt;
    private boolean truncate = false; // truncate to decimalPrecision rather than rounding? &lt;br /&gt;
    private boolean isPercentage = false; // should the result be displayed as a percentage?&lt;br /&gt;
    private NumberFormat()&lt;br /&gt;
    {&lt;br /&gt;
    }&lt;br /&gt;
    /**&lt;br /&gt;
     * returns the default instance of NumberFormat&lt;br /&gt;
     * @return&lt;br /&gt;
     */&lt;br /&gt;
    public static NumberFormat getInstance ()&lt;br /&gt;
    {&lt;br /&gt;
        NumberFormat nf = new NumberFormat();&lt;br /&gt;
        return nf;&lt;br /&gt;
    }&lt;br /&gt;
    /**&lt;br /&gt;
     * Returns a currency instance of number format&lt;br /&gt;
     * @return&lt;br /&gt;
     */&lt;br /&gt;
    public static NumberFormat getCurrencyInstance ()&lt;br /&gt;
    {&lt;br /&gt;
        return getCurrencyInstance(&amp;quot;$&amp;quot;, true);&lt;br /&gt;
    }&lt;br /&gt;
    /**&lt;br /&gt;
     * Returns a currency instance of number format that uses curSymbol as the currency symbol&lt;br /&gt;
     * @param curSymbol&lt;br /&gt;
     * @return&lt;br /&gt;
     */&lt;br /&gt;
    public static NumberFormat getCurrencyInstance (String curSymbol)&lt;br /&gt;
    {&lt;br /&gt;
        return getCurrencyInstance(curSymbol, true);&lt;br /&gt;
    }&lt;br /&gt;
    /**&lt;br /&gt;
     * Returns a currency instance of number format that uses curSymbol as the currency symbol &lt;br /&gt;
     * and either commas or periods as the thousands separator.&lt;br /&gt;
     * @param curSymbol Currency Symbol&lt;br /&gt;
     * @param useCommas true, uses commas as the thousands separator, false uses periods&lt;br /&gt;
     * @return&lt;br /&gt;
     */&lt;br /&gt;
    public static NumberFormat getCurrencyInstance (String curSymbol, boolean useCommas)&lt;br /&gt;
    {&lt;br /&gt;
        NumberFormat nf = new NumberFormat();&lt;br /&gt;
        nf.isCurrency(true);&lt;br /&gt;
        nf.setCurrencySymbol(curSymbol);&lt;br /&gt;
        if (!useCommas) {&lt;br /&gt;
            nf.setDecimalSeparator(COMMA);&lt;br /&gt;
            nf.setGroupingSeparator(PERIOD);&lt;br /&gt;
        }&lt;br /&gt;
        nf.setFixedPrecision(2);&lt;br /&gt;
        return nf;&lt;br /&gt;
    }&lt;br /&gt;
    /**&lt;br /&gt;
     * Returns an instance that formats numbers as integers.&lt;br /&gt;
     * @return&lt;br /&gt;
     */&lt;br /&gt;
    public static NumberFormat getIntegerInstance ()&lt;br /&gt;
    {&lt;br /&gt;
        NumberFormat nf = new NumberFormat();&lt;br /&gt;
        nf.setShowGrouping(false);&lt;br /&gt;
        nf.setFixedPrecision(0);&lt;br /&gt;
        return nf;&lt;br /&gt;
    }&lt;br /&gt;
    public static NumberFormat getPercentInstance ()&lt;br /&gt;
    {&lt;br /&gt;
        NumberFormat nf = new NumberFormat();&lt;br /&gt;
        nf.isPercentage(true);&lt;br /&gt;
        nf.setFixedPrecision(2);&lt;br /&gt;
        nf.setShowGrouping(false);&lt;br /&gt;
        return nf;&lt;br /&gt;
    }&lt;br /&gt;
    public String format (String num)&lt;br /&gt;
    {&lt;br /&gt;
        return toFormatted(parse(num));&lt;br /&gt;
    }&lt;br /&gt;
    public double parse (String num)&lt;br /&gt;
    {&lt;br /&gt;
        return asNumber(num, inputDecimalSeparator);&lt;br /&gt;
    }&lt;br /&gt;
    /**&lt;br /&gt;
     * Static routine that attempts to create a double out of the&lt;br /&gt;
     * supplied text. This routine is a bit smarter than Double.parseDouble()&lt;br /&gt;
     * @param num&lt;br /&gt;
     * @return&lt;br /&gt;
     */&lt;br /&gt;
    public static double parseDouble (String num, String decimalChar)&lt;br /&gt;
    {&lt;br /&gt;
        return asNumber(num, decimalChar);&lt;br /&gt;
    }&lt;br /&gt;
    public static double parseDouble (String num)&lt;br /&gt;
    {&lt;br /&gt;
        return parseDouble(num, PERIOD);&lt;br /&gt;
    }&lt;br /&gt;
    public void setInputDecimalSeparator (String val)&lt;br /&gt;
    {&lt;br /&gt;
        inputDecimalSeparator = val == null ? PERIOD : val;&lt;br /&gt;
    }&lt;br /&gt;
    public void setNegativeFormat (int format)&lt;br /&gt;
    {&lt;br /&gt;
        negativeFormat = format;&lt;br /&gt;
    }&lt;br /&gt;
    public void setNegativeRed (boolean isRed)&lt;br /&gt;
    {&lt;br /&gt;
        isNegativeRed = isRed;&lt;br /&gt;
    }&lt;br /&gt;
    public void setShowGrouping (boolean show)&lt;br /&gt;
    {&lt;br /&gt;
        showGrouping = show;&lt;br /&gt;
    }&lt;br /&gt;
    public void setDecimalSeparator (String separator)&lt;br /&gt;
    {&lt;br /&gt;
        decimalSeparator = separator;&lt;br /&gt;
    }&lt;br /&gt;
    public void setGroupingSeparator (String separator)&lt;br /&gt;
    {&lt;br /&gt;
        groupingSeparator = separator;&lt;br /&gt;
    }&lt;br /&gt;
    public void isCurrency (boolean isC)&lt;br /&gt;
    {&lt;br /&gt;
        showCurrencySymbol = isC;&lt;br /&gt;
    }&lt;br /&gt;
    public void setCurrencySymbol (String symbol)&lt;br /&gt;
    {&lt;br /&gt;
        currencySymbol = symbol;&lt;br /&gt;
    }&lt;br /&gt;
    public void setCurrencyPosition (int cp)&lt;br /&gt;
    {&lt;br /&gt;
        currencySymbolPosition = cp;&lt;br /&gt;
    }&lt;br /&gt;
    public void isPercentage (boolean pct)&lt;br /&gt;
    {&lt;br /&gt;
        isPercentage = pct;&lt;br /&gt;
    }&lt;br /&gt;
    /**&lt;br /&gt;
     * Sets the number of fixed precision decimal places should be displayed.&lt;br /&gt;
     * To use arbitrary precision, setFixedPrecision(NumberFormat.ARBITRARY_PRECISION)&lt;br /&gt;
     * @param places &lt;br /&gt;
     */&lt;br /&gt;
    public void setFixedPrecision (int places)&lt;br /&gt;
    {&lt;br /&gt;
        useFixedPrecision = places != ARBITRARY_PRECISION;&lt;br /&gt;
        this.decimalPrecision = places &amp;lt; 0 ? 0 : places;&lt;br /&gt;
    }&lt;br /&gt;
    /**&lt;br /&gt;
     * Causes the number to be truncated rather than rounded to its fixed precision.&lt;br /&gt;
     * @param trunc&lt;br /&gt;
     */&lt;br /&gt;
    public void setTruncate (boolean trunc)&lt;br /&gt;
    {&lt;br /&gt;
        truncate = trunc;&lt;br /&gt;
    }&lt;br /&gt;
    /**&lt;br /&gt;
     * &lt;br /&gt;
     * @param preSep raw number as text&lt;br /&gt;
     * @param PERIOD incoming decimal point&lt;br /&gt;
     * @param decimalSeparator outgoing decimal point&lt;br /&gt;
     * @param groupingSeparator thousands separator&lt;br /&gt;
     * @return&lt;br /&gt;
     */&lt;br /&gt;
    private String addSeparators (String preSep)&lt;br /&gt;
    {&lt;br /&gt;
        String nStr = preSep;&lt;br /&gt;
        int dpos = nStr.indexOf(PERIOD);&lt;br /&gt;
        String nStrEnd = &amp;quot;&amp;quot;;&lt;br /&gt;
        if (dpos != -1) {&lt;br /&gt;
            nStrEnd = decimalSeparator + nStr.substring(dpos + 1, nStr.length());&lt;br /&gt;
            nStr = nStr.substring(0, dpos);&lt;br /&gt;
        }&lt;br /&gt;
        int l = nStr.length();&lt;br /&gt;
        for (int i = l; i &amp;gt; 0; i--) {&lt;br /&gt;
            nStrEnd = nStr.charAt(i - 1) + nStrEnd;&lt;br /&gt;
            if (i != 1 &amp;amp;&amp;amp; ((l - i + 1) % 3) == 0) nStrEnd = groupingSeparator + nStrEnd;&lt;br /&gt;
        }&lt;br /&gt;
        return nStrEnd;&lt;br /&gt;
    }&lt;br /&gt;
    protected String toFormatted(double num)&lt;br /&gt;
    {&lt;br /&gt;
        String nStr;&lt;br /&gt;
        if (isPercentage) num = num * 100;&lt;br /&gt;
        nStr = useFixedPrecision ? toFixed(Math.abs(getRounded(num)), decimalPrecision) : Double.toString(num);&lt;br /&gt;
        nStr = showGrouping ? addSeparators(nStr) : nStr.replaceAll(&amp;quot;\\&amp;quot; + PERIOD, decimalSeparator);&lt;br /&gt;
        String c0 = &amp;quot;&amp;quot;;&lt;br /&gt;
        String n0 = &amp;quot;&amp;quot;;&lt;br /&gt;
        String c1 = &amp;quot;&amp;quot;;&lt;br /&gt;
        String n1 = &amp;quot;&amp;quot;;&lt;br /&gt;
        String n2 = &amp;quot;&amp;quot;;&lt;br /&gt;
        String c2 = &amp;quot;&amp;quot;;&lt;br /&gt;
        String n3 = &amp;quot;&amp;quot;;&lt;br /&gt;
        String c3 = &amp;quot;&amp;quot;;&lt;br /&gt;
        String negSignL = &amp;quot;&amp;quot; + ((negativeFormat == NEG_PARENTHESIS) ? LEFT_PAREN : DASH);&lt;br /&gt;
        String negSignR = &amp;quot;&amp;quot; + ((negativeFormat == NEG_PARENTHESIS) ? RIGHT_PAREN : DASH);&lt;br /&gt;
        &lt;br /&gt;
        if (currencySymbolPosition == CUR_POS_LEFT_OUTSIDE) {&lt;br /&gt;
            if (num &amp;lt; 0) {&lt;br /&gt;
                if (negativeFormat == NEG_LEFT_DASH || negativeFormat == NEG_PARENTHESIS)&lt;br /&gt;
                    n1 = negSignL;&lt;br /&gt;
                if (negativeFormat == NEG_RIGHT_DASH || negativeFormat == NEG_PARENTHESIS)&lt;br /&gt;
                    n2 = negSignR;&lt;br /&gt;
            }&lt;br /&gt;
            if (showCurrencySymbol) c0 = currencySymbol;&lt;br /&gt;
        }&lt;br /&gt;
        else if (currencySymbolPosition == CUR_POS_LEFT_INSIDE) {&lt;br /&gt;
            if (num &amp;lt; 0) {&lt;br /&gt;
                if (negativeFormat == NEG_LEFT_DASH || negativeFormat == NEG_PARENTHESIS)&lt;br /&gt;
                    n0 = negSignL;&lt;br /&gt;
                if (negativeFormat == NEG_RIGHT_DASH || negativeFormat == NEG_PARENTHESIS)&lt;br /&gt;
                    n3 = negSignR;&lt;br /&gt;
            }&lt;br /&gt;
            if (showCurrencySymbol) c1 = currencySymbol;&lt;br /&gt;
        }&lt;br /&gt;
        else if (currencySymbolPosition == CUR_POS_RIGHT_INSIDE) {&lt;br /&gt;
            if (num &amp;lt; 0) {&lt;br /&gt;
                if (negativeFormat == NEG_LEFT_DASH || negativeFormat == NEG_PARENTHESIS)&lt;br /&gt;
                    n0 = negSignL;&lt;br /&gt;
                if (negativeFormat == NEG_RIGHT_DASH || negativeFormat == NEG_PARENTHESIS)&lt;br /&gt;
                    n3 = negSignR;&lt;br /&gt;
            }&lt;br /&gt;
            if (showCurrencySymbol) c2 = currencySymbol;&lt;br /&gt;
        }&lt;br /&gt;
        else if (currencySymbolPosition == CUR_POS_RIGHT_OUTSIDE) {&lt;br /&gt;
            if (num &amp;lt; 0) {&lt;br /&gt;
                if (negativeFormat == NEG_LEFT_DASH || negativeFormat == NEG_PARENTHESIS)&lt;br /&gt;
                    n1 = negSignL;&lt;br /&gt;
                if (negativeFormat == NEG_RIGHT_DASH || negativeFormat == NEG_PARENTHESIS)&lt;br /&gt;
                    n2 = negSignR;&lt;br /&gt;
            }&lt;br /&gt;
            if (showCurrencySymbol) c3 = currencySymbol;&lt;br /&gt;
        }&lt;br /&gt;
        nStr = c0 + n0 + c1 + n1 + nStr + n2 + c2 + n3 + c3 + (isPercentage ? &amp;quot;%&amp;quot; : &amp;quot;&amp;quot;);&lt;br /&gt;
        if (isNegativeRed &amp;amp;&amp;amp; num &amp;lt; 0) {&lt;br /&gt;
            nStr = &amp;quot;&amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;&amp;quot; + nStr + &amp;quot;&amp;lt;/font&amp;gt;&amp;quot;;&lt;br /&gt;
        }&lt;br /&gt;
        return nStr;&lt;br /&gt;
   }&lt;br /&gt;
    /**&lt;br /&gt;
     * javascript only rounds to whole numbers, so we need to shift our decimal right, &lt;br /&gt;
     * then round, then shift the decimal back left.&lt;br /&gt;
     * @param val&lt;br /&gt;
     * @return&lt;br /&gt;
     */&lt;br /&gt;
    private double getRounded (double val)&lt;br /&gt;
    {&lt;br /&gt;
        double exp = Math.pow(10, decimalPrecision);&lt;br /&gt;
        double rounded = val * exp;&lt;br /&gt;
        if (truncate)&lt;br /&gt;
            rounded = rounded &amp;gt;= 0 ? Math.floor(rounded) : Math.ceil(rounded);&lt;br /&gt;
        else&lt;br /&gt;
            rounded = Math.round(rounded);&lt;br /&gt;
        return rounded / exp;&lt;br /&gt;
    }&lt;br /&gt;
    private static native String toFixed(double val, int places) /*-{&lt;br /&gt;
        return val.toFixed(places);&lt;br /&gt;
    }-*/;&lt;br /&gt;
    private static double asNumber(String val, String inputDecimalValue)&lt;br /&gt;
    {&lt;br /&gt;
        String newVal = val;&lt;br /&gt;
        boolean isPercentage = false;&lt;br /&gt;
        // remove % if there is one&lt;br /&gt;
        if (newVal.indexOf(&amp;quot;%&amp;quot;) != -1) {&lt;br /&gt;
            newVal = newVal.replaceAll(&amp;quot;\\%&amp;quot;, &amp;quot;&amp;quot;);&lt;br /&gt;
            isPercentage = true;&lt;br /&gt;
        }&lt;br /&gt;
        // convert abbreviations for thousand, million and billion&lt;br /&gt;
        newVal = newVal.toLowerCase().replaceAll(BILLION, &amp;quot;000000000&amp;quot;);&lt;br /&gt;
        newVal = newVal.replaceAll(MILLION, &amp;quot;000000&amp;quot;);&lt;br /&gt;
        newVal = newVal.replaceAll(THOUSAND, &amp;quot;000&amp;quot;);&lt;br /&gt;
        // remove any characters that are not digit, decimal separator, +, -, (, ), e, or E      &lt;br /&gt;
        String re = &amp;quot;[^\\&amp;quot; + inputDecimalValue + &amp;quot;\\d\\-\\+\\(\\)eE]&amp;quot;;&lt;br /&gt;
        newVal = newVal.replaceAll(re, &amp;quot;&amp;quot;);&lt;br /&gt;
        // ensure that the first decimal separator is a . and remove the rest.&lt;br /&gt;
        int index = newVal.indexOf(inputDecimalValue);&lt;br /&gt;
        if (index != -1) {&lt;br /&gt;
            newVal = newVal.substring(0, index)&lt;br /&gt;
                    + PERIOD&lt;br /&gt;
                    + (newVal.substring(index + inputDecimalValue.length()).replaceAll(&amp;quot;\\&amp;quot;&lt;br /&gt;
                            + inputDecimalValue, &amp;quot;&amp;quot;));&lt;br /&gt;
        }&lt;br /&gt;
        // convert right dash and paren negatives to left dash negative&lt;br /&gt;
        if (newVal.charAt(newVal.length() - 1) == DASH) {&lt;br /&gt;
            newVal = newVal.substring(0, newVal.length() - 1);&lt;br /&gt;
            newVal = DASH + newVal;&lt;br /&gt;
        }&lt;br /&gt;
        else if (newVal.charAt(0) == LEFT_PAREN&lt;br /&gt;
                &amp;amp;&amp;amp; newVal.charAt(newVal.length() - 1) == RIGHT_PAREN) {&lt;br /&gt;
            newVal = newVal.substring(1, newVal.length() - 1);&lt;br /&gt;
            newVal = DASH + newVal;&lt;br /&gt;
        }&lt;br /&gt;
        Double parsed;&lt;br /&gt;
        try {&lt;br /&gt;
            parsed = new Double(newVal);&lt;br /&gt;
            if (parsed.isInfinite() || parsed.isNaN()) parsed = new Double(0);&lt;br /&gt;
        }&lt;br /&gt;
        catch (NumberFormatException e) {&lt;br /&gt;
            parsed = new Double(0);&lt;br /&gt;
        }&lt;br /&gt;
        return isPercentage ? parsed.doubleValue() / 100 : parsed.doubleValue();&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
           &lt;br /&gt;
       &amp;lt;/source&amp;gt;&lt;br /&gt;
    &lt;br /&gt;
   &lt;br /&gt;
  &amp;lt;!-- end source code --&amp;gt;&lt;br /&gt;
   &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== GWT color class ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
   &lt;br /&gt;
  &amp;lt;!-- start source code --&amp;gt;&lt;br /&gt;
   &lt;br /&gt;
    &amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
/*&lt;br /&gt;
 * Copyright 2006 Robert Hanson &amp;lt;iamroberthanson AT gmail.ru&amp;gt;&lt;br /&gt;
 * &lt;br /&gt;
 * Licensed under the Apache License, Version 2.0 (the &amp;quot;License&amp;quot;);&lt;br /&gt;
 * you may not use this file except in compliance with the License.&lt;br /&gt;
 * You may obtain a copy of the License at&lt;br /&gt;
 * &lt;br /&gt;
 *    http://www.apache.org/licenses/LICENSE-2.0&lt;br /&gt;
 * &lt;br /&gt;
 * Unless required by applicable law or agreed to in writing, software&lt;br /&gt;
 * distributed under the License is distributed on an &amp;quot;AS IS&amp;quot; BASIS,&lt;br /&gt;
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.&lt;br /&gt;
 * See the License for the specific language governing permissions and&lt;br /&gt;
 * limitations under the License.&lt;br /&gt;
 */&lt;br /&gt;
package org.gwtwidgets.client.style;&lt;br /&gt;
/**&lt;br /&gt;
 * This class is under consideration for removal,&lt;br /&gt;
 * if you have an opion please comment on http://gwtwidgets.blogspot.ru.&lt;br /&gt;
 */&lt;br /&gt;
public class Color&lt;br /&gt;
{&lt;br /&gt;
    public final static Color WHITE = new Color(255, 255, 255);&lt;br /&gt;
    public final static Color LIGHT_GRAY = new Color(192, 192, 192);&lt;br /&gt;
    public final static Color GRAY = new Color(128, 128, 128);&lt;br /&gt;
    public final static Color DARK_GRAY = new Color(64, 64, 64);&lt;br /&gt;
    public final static Color BLACK = new Color(0, 0, 0);&lt;br /&gt;
    public final static Color RED = new Color(255, 0, 0);&lt;br /&gt;
    public final static Color PINK = new Color(255, 175, 175);&lt;br /&gt;
    public final static Color ORANGE = new Color(255, 200, 0);&lt;br /&gt;
    public final static Color YELLOW = new Color(255, 255, 0);&lt;br /&gt;
    public final static Color GREEN = new Color(0, 255, 0);&lt;br /&gt;
    public final static Color MAGENTA = new Color(255, 0, 255);&lt;br /&gt;
    public final static Color CYAN = new Color(0, 255, 255);&lt;br /&gt;
    public final static Color BLUE = new Color(0, 0, 255);&lt;br /&gt;
    public static final Color NONE = new Color(&amp;quot;&amp;quot;);&lt;br /&gt;
    &lt;br /&gt;
    private int r, g, b;&lt;br /&gt;
    &lt;br /&gt;
    // only for special cases, like no color, or maybe named colors&lt;br /&gt;
    private String colorText = null;&lt;br /&gt;
    private Color (String colorText) {&lt;br /&gt;
        this.colorText = colorText;&lt;br /&gt;
    }&lt;br /&gt;
    public Color (int r, int g, int b)&lt;br /&gt;
    {&lt;br /&gt;
        this.r = r;&lt;br /&gt;
        this.g = g;&lt;br /&gt;
        this.b = b;&lt;br /&gt;
    }&lt;br /&gt;
    public int getRed ()&lt;br /&gt;
    {&lt;br /&gt;
        return r;&lt;br /&gt;
    }&lt;br /&gt;
    public int getGreen ()&lt;br /&gt;
    {&lt;br /&gt;
        return g;&lt;br /&gt;
    }&lt;br /&gt;
    public int getBlue ()&lt;br /&gt;
    {&lt;br /&gt;
        return b;&lt;br /&gt;
    }&lt;br /&gt;
    public String getHexValue ()&lt;br /&gt;
    {&lt;br /&gt;
        if (colorText != null) {&lt;br /&gt;
            return colorText;&lt;br /&gt;
        }&lt;br /&gt;
        return &amp;quot;#&amp;quot;&lt;br /&gt;
            + pad(Integer.toHexString(r))&lt;br /&gt;
            + pad(Integer.toHexString(g))&lt;br /&gt;
            + pad(Integer.toHexString(b));&lt;br /&gt;
    }&lt;br /&gt;
    private String pad (String in)&lt;br /&gt;
    {&lt;br /&gt;
        if (in.length() == 0) {&lt;br /&gt;
            return &amp;quot;00&amp;quot;;&lt;br /&gt;
        }&lt;br /&gt;
        if (in.length() == 1) {&lt;br /&gt;
            return &amp;quot;0&amp;quot; + in;&lt;br /&gt;
        }&lt;br /&gt;
        return in;&lt;br /&gt;
    }&lt;br /&gt;
    public String toString ()&lt;br /&gt;
    {&lt;br /&gt;
        if (colorText != null) {&lt;br /&gt;
            return colorText;&lt;br /&gt;
        }&lt;br /&gt;
        return &amp;quot;red=&amp;quot; + r + &amp;quot;, green=&amp;quot; + g + &amp;quot;, blue=&amp;quot; + b;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
           &lt;br /&gt;
       &amp;lt;/source&amp;gt;&lt;br /&gt;
    &lt;br /&gt;
   &lt;br /&gt;
  &amp;lt;!-- end source code --&amp;gt;&lt;br /&gt;
   &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== GWT window utility ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
   &lt;br /&gt;
  &amp;lt;!-- start source code --&amp;gt;&lt;br /&gt;
   &lt;br /&gt;
    &amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
/*&lt;br /&gt;
 * Copyright 2006 Robert Hanson &amp;lt;iamroberthanson AT gmail.ru&amp;gt;&lt;br /&gt;
 * &lt;br /&gt;
 * Licensed under the Apache License, Version 2.0 (the &amp;quot;License&amp;quot;);&lt;br /&gt;
 * you may not use this file except in compliance with the License.&lt;br /&gt;
 * You may obtain a copy of the License at&lt;br /&gt;
 * &lt;br /&gt;
 *    http://www.apache.org/licenses/LICENSE-2.0&lt;br /&gt;
 * &lt;br /&gt;
 * Unless required by applicable law or agreed to in writing, software&lt;br /&gt;
 * distributed under the License is distributed on an &amp;quot;AS IS&amp;quot; BASIS,&lt;br /&gt;
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.&lt;br /&gt;
 * See the License for the specific language governing permissions and&lt;br /&gt;
 * limitations under the License.&lt;br /&gt;
 */&lt;br /&gt;
package org.gwtwidgets.client.util;&lt;br /&gt;
public class WindowUtils&lt;br /&gt;
{&lt;br /&gt;
    public static Location getLocation ()&lt;br /&gt;
    {&lt;br /&gt;
        Location result = new Location();&lt;br /&gt;
        result.setHash(getHash());&lt;br /&gt;
        result.setHost(getHost());&lt;br /&gt;
        result.setHostName(getHostName());&lt;br /&gt;
        result.setHref(getHref());&lt;br /&gt;
        result.setPath(getPath());&lt;br /&gt;
        result.setPort(getPort());&lt;br /&gt;
        result.setProtocol(getProtocol());&lt;br /&gt;
        result.setQueryString(getQueryString());&lt;br /&gt;
        return result;&lt;br /&gt;
    }&lt;br /&gt;
    private static native String getQueryString () /*-{&lt;br /&gt;
        return $wnd.location.search;&lt;br /&gt;
    }-*/;&lt;br /&gt;
    private static native String getProtocol () /*-{&lt;br /&gt;
        return $wnd.location.protocol;&lt;br /&gt;
    }-*/;&lt;br /&gt;
    private static native String getPort () /*-{&lt;br /&gt;
        return $wnd.location.port;&lt;br /&gt;
    }-*/;&lt;br /&gt;
    private static native String getPath () /*-{&lt;br /&gt;
        return $wnd.location.pathname;&lt;br /&gt;
    }-*/;&lt;br /&gt;
    private static native String getHref () /*-{&lt;br /&gt;
        return $wnd.location.href;&lt;br /&gt;
    }-*/;&lt;br /&gt;
    private static native String getHostName () /*-{&lt;br /&gt;
        return $wnd.location.hostname;&lt;br /&gt;
    }-*/;&lt;br /&gt;
    private static native String getHost () /*-{&lt;br /&gt;
        return $wnd.location.host;&lt;br /&gt;
    }-*/;&lt;br /&gt;
    private static native String getHash () /*-{&lt;br /&gt;
        return $wnd.location.hash;&lt;br /&gt;
    }-*/;&lt;br /&gt;
    &lt;br /&gt;
}&lt;br /&gt;
/////////////////////////////////&lt;br /&gt;
/*&lt;br /&gt;
 * Copyright 2006 Robert Hanson &amp;lt;iamroberthanson AT gmail.ru&amp;gt;&lt;br /&gt;
 * &lt;br /&gt;
 * Licensed under the Apache License, Version 2.0 (the &amp;quot;License&amp;quot;);&lt;br /&gt;
 * you may not use this file except in compliance with the License.&lt;br /&gt;
 * You may obtain a copy of the License at&lt;br /&gt;
 * &lt;br /&gt;
 *    http://www.apache.org/licenses/LICENSE-2.0&lt;br /&gt;
 * &lt;br /&gt;
 * Unless required by applicable law or agreed to in writing, software&lt;br /&gt;
 * distributed under the License is distributed on an &amp;quot;AS IS&amp;quot; BASIS,&lt;br /&gt;
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.&lt;br /&gt;
 * See the License for the specific language governing permissions and&lt;br /&gt;
 * limitations under the License.&lt;br /&gt;
 */&lt;br /&gt;
package org.gwtwidgets.client.util;&lt;br /&gt;
import java.util.HashMap;&lt;br /&gt;
import java.util.Map;&lt;br /&gt;
public class Location&lt;br /&gt;
{&lt;br /&gt;
    private String hash;&lt;br /&gt;
    private String host;&lt;br /&gt;
    private String hostName;&lt;br /&gt;
    private String href;&lt;br /&gt;
    private String path;&lt;br /&gt;
    private String port;&lt;br /&gt;
    private String protocol;&lt;br /&gt;
    private String queryString;&lt;br /&gt;
    private HashMap paramMap;&lt;br /&gt;
&lt;br /&gt;
    public String getHash ()&lt;br /&gt;
    {&lt;br /&gt;
        return hash;&lt;br /&gt;
    }&lt;br /&gt;
    public String getHost ()&lt;br /&gt;
    {&lt;br /&gt;
        return host;&lt;br /&gt;
    }&lt;br /&gt;
    public String getHostName ()&lt;br /&gt;
    {&lt;br /&gt;
        return hostName;&lt;br /&gt;
    }&lt;br /&gt;
    public String getHref ()&lt;br /&gt;
    {&lt;br /&gt;
        return href;&lt;br /&gt;
    }&lt;br /&gt;
    public String getPath ()&lt;br /&gt;
    {&lt;br /&gt;
        return path;&lt;br /&gt;
    }&lt;br /&gt;
    public String getPort ()&lt;br /&gt;
    {&lt;br /&gt;
        return port;&lt;br /&gt;
    }&lt;br /&gt;
    public String getProtocol ()&lt;br /&gt;
    {&lt;br /&gt;
        return protocol;&lt;br /&gt;
    }&lt;br /&gt;
    public String getQueryString ()&lt;br /&gt;
    {&lt;br /&gt;
        return queryString;&lt;br /&gt;
    }&lt;br /&gt;
    protected void setHash (String hash)&lt;br /&gt;
    {&lt;br /&gt;
        this.hash = hash;&lt;br /&gt;
    }&lt;br /&gt;
    protected void setHost (String host)&lt;br /&gt;
    {&lt;br /&gt;
        this.host = host;&lt;br /&gt;
    }&lt;br /&gt;
    protected void setHostName (String hostName)&lt;br /&gt;
    {&lt;br /&gt;
        this.hostName = hostName;&lt;br /&gt;
    }&lt;br /&gt;
    protected void setHref (String href)&lt;br /&gt;
    {&lt;br /&gt;
        this.href = href;&lt;br /&gt;
    }&lt;br /&gt;
    protected void setPath (String path)&lt;br /&gt;
    {&lt;br /&gt;
        this.path = path;&lt;br /&gt;
    }&lt;br /&gt;
    protected void setPort (String port)&lt;br /&gt;
    {&lt;br /&gt;
        this.port = port;&lt;br /&gt;
    }&lt;br /&gt;
    protected void setProtocol (String protocol)&lt;br /&gt;
    {&lt;br /&gt;
        this.protocol = protocol;&lt;br /&gt;
    }&lt;br /&gt;
    protected void setQueryString (String queryString)&lt;br /&gt;
    {&lt;br /&gt;
        this.queryString = queryString;&lt;br /&gt;
        paramMap = new HashMap();&lt;br /&gt;
        &lt;br /&gt;
        if (queryString != null &amp;amp;&amp;amp; queryString.length() &amp;gt; 1) {&lt;br /&gt;
            String qs = queryString.substring(1);&lt;br /&gt;
            String[] kvPairs = qs.split(&amp;quot;&amp;amp;&amp;quot;);&lt;br /&gt;
            for (int i = 0; i &amp;lt; kvPairs.length; i++) {&lt;br /&gt;
                String[] kv = kvPairs[i].split(&amp;quot;=&amp;quot;);&lt;br /&gt;
                if (kv.length &amp;gt; 1) {&lt;br /&gt;
                    paramMap.put(kv[0], unescape(kv[1]));&lt;br /&gt;
                }&lt;br /&gt;
                else {&lt;br /&gt;
                    paramMap.put(kv[0], &amp;quot;&amp;quot;);&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    private native String unescape (String val) /*-{&lt;br /&gt;
        return unescape(val);&lt;br /&gt;
    }-*/;&lt;br /&gt;
    public String getParameter (String name)&lt;br /&gt;
    {&lt;br /&gt;
        return (String) paramMap.get(name);&lt;br /&gt;
    }&lt;br /&gt;
    public Map getParameterMap ()&lt;br /&gt;
    {&lt;br /&gt;
        return paramMap;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
           &lt;br /&gt;
       &amp;lt;/source&amp;gt;&lt;br /&gt;
    &lt;br /&gt;
   &lt;br /&gt;
  &amp;lt;!-- end source code --&amp;gt;&lt;br /&gt;
   &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Implement java.util.regex.Pattern with Javascript RegExp object ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
   &lt;br /&gt;
  &amp;lt;!-- start source code --&amp;gt;&lt;br /&gt;
   &lt;br /&gt;
    &amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
/*&lt;br /&gt;
 * Copyright 2006 Robert Hanson &amp;lt;iamroberthanson AT gmail.ru&amp;gt;&lt;br /&gt;
 * &lt;br /&gt;
 * Licensed under the Apache License, Version 2.0 (the &amp;quot;License&amp;quot;);&lt;br /&gt;
 * you may not use this file except in compliance with the License.&lt;br /&gt;
 * You may obtain a copy of the License at&lt;br /&gt;
 * &lt;br /&gt;
 *    http://www.apache.org/licenses/LICENSE-2.0&lt;br /&gt;
 * &lt;br /&gt;
 * Unless required by applicable law or agreed to in writing, software&lt;br /&gt;
 * distributed under the License is distributed on an &amp;quot;AS IS&amp;quot; BASIS,&lt;br /&gt;
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.&lt;br /&gt;
 * See the License for the specific language governing permissions and&lt;br /&gt;
 * limitations under the License.&lt;br /&gt;
 */&lt;br /&gt;
package org.gwtwidgets.client.util.regex;&lt;br /&gt;
import java.util.ArrayList;&lt;br /&gt;
import java.util.List;&lt;br /&gt;
import com.google.gwt.core.client.JavaScriptObject;&lt;br /&gt;
/**&lt;br /&gt;
 * &amp;lt;p&amp;gt;&lt;br /&gt;
 * Implementation of the {@link java.util.regex.Pattern} class with a&lt;br /&gt;
 * wrapper aroung the Javascript  object.&lt;br /&gt;
 * As most of the methods delegate to the JavaScript RegExp object, certain differences in the &lt;br /&gt;
 * declaration and behaviour of regular expressions must be expected.&lt;br /&gt;
 * &amp;lt;/p&amp;gt;&lt;br /&gt;
 * &amp;lt;p&amp;gt;&lt;br /&gt;
 * Please note that neither the {@link java.util.regex.Pattern#compile(String)} method nor&lt;br /&gt;
 * {@link Matcher} instances are supported. For the later, consider using {@link Pattern#match(String)}.&lt;br /&gt;
 * &amp;lt;/p&amp;gt;&lt;br /&gt;
 * &lt;br /&gt;
 * @author George Georgovassilis&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
public class Pattern {&lt;br /&gt;
  /**&lt;br /&gt;
   * Declares that regular expressions should be matched across line borders.&lt;br /&gt;
   */&lt;br /&gt;
  public final static int MULTILINE = 1;&lt;br /&gt;
  /**&lt;br /&gt;
   * Declares that characters are matched reglardless of case.&lt;br /&gt;
   */&lt;br /&gt;
  public final static int CASE_INSENSITIVE = 2;&lt;br /&gt;
  private JavaScriptObject regExp;&lt;br /&gt;
  private static JavaScriptObject createExpression(String pattern, int flags) {&lt;br /&gt;
    String sFlags = &amp;quot;&amp;quot;;&lt;br /&gt;
    if ((flags &amp;amp; MULTILINE) != 0)&lt;br /&gt;
      sFlags += &amp;quot;m&amp;quot;;&lt;br /&gt;
    if ((flags &amp;amp; CASE_INSENSITIVE) != 0)&lt;br /&gt;
      sFlags += &amp;quot;i&amp;quot;;&lt;br /&gt;
    return _createExpression(pattern, sFlags);&lt;br /&gt;
  }&lt;br /&gt;
  private static native JavaScriptObject _createExpression(String pattern,&lt;br /&gt;
      String flags)/*-{&lt;br /&gt;
   return new RegExp(pattern, flags);&lt;br /&gt;
   }-*/;&lt;br /&gt;
  private native void _match(String text, List matches)/*-{&lt;br /&gt;
   var regExp = this.@org.gwtwidgets.client.util.regex.Pattern::regExp;&lt;br /&gt;
   var result = text.match(regExp);&lt;br /&gt;
   if (result == null) return;&lt;br /&gt;
   for (var i=0;i&amp;lt;result.length;i++)&lt;br /&gt;
   matches.@java.util.ArrayList::add(Ljava/lang/Object;)(result[i]);&lt;br /&gt;
   }-*/;&lt;br /&gt;
  /**&lt;br /&gt;
   * Determines wether the specified regular expression is validated by the &lt;br /&gt;
   * provided input.&lt;br /&gt;
   * @param regex Regular expression&lt;br /&gt;
   * @param input String to validate&lt;br /&gt;
   * @return &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt; if matched.&lt;br /&gt;
   */&lt;br /&gt;
  public static boolean matches(String regex, String input) {&lt;br /&gt;
    return new Pattern(regex).matches(input);&lt;br /&gt;
  }&lt;br /&gt;
  /**&lt;br /&gt;
   * Escape a provided string so that it will be interpreted as a literal&lt;br /&gt;
   * in regular expressions.&lt;br /&gt;
   * The current implementation does escape each character even if not neccessary,&lt;br /&gt;
   * generating verbose literals.&lt;br /&gt;
   * @param input&lt;br /&gt;
   * @return&lt;br /&gt;
   */&lt;br /&gt;
  public static String quote(String input) {&lt;br /&gt;
    String output = &amp;quot;&amp;quot;;&lt;br /&gt;
    for (int i = 0; i &amp;lt; input.length(); i++) {&lt;br /&gt;
      output += &amp;quot;\\&amp;quot; + input.charAt(i);&lt;br /&gt;
    }&lt;br /&gt;
    return output;&lt;br /&gt;
  }&lt;br /&gt;
  /**&lt;br /&gt;
   * Class constructor&lt;br /&gt;
   * @param pattern Regular expression&lt;br /&gt;
   */&lt;br /&gt;
  public Pattern(String pattern) {&lt;br /&gt;
    this(pattern, 0);&lt;br /&gt;
  }&lt;br /&gt;
  /**&lt;br /&gt;
   * Class constructor&lt;br /&gt;
   * @param pattern Regular expression&lt;br /&gt;
   * @param flags &lt;br /&gt;
   */&lt;br /&gt;
  public Pattern(String pattern, int flags) {&lt;br /&gt;
    regExp = createExpression(pattern, flags);&lt;br /&gt;
  }&lt;br /&gt;
  /**&lt;br /&gt;
   * This method is borrowed from the JavaScript RegExp object.&lt;br /&gt;
   * It parses a string and returns as an array any assignments to parenthesis groups&lt;br /&gt;
   * in the pattern&amp;quot;s regular expression&lt;br /&gt;
   * @param text&lt;br /&gt;
   * @return Array of strings following java&amp;quot;s Pattern convention for groups:&lt;br /&gt;
   * Group 0 is the entire input string and the remaining groups are the matched parenthesis.&lt;br /&gt;
   * In case nothing was matched an empty array is returned.&lt;br /&gt;
   */&lt;br /&gt;
  public String[] match(String text) {&lt;br /&gt;
    List matches = new ArrayList();&lt;br /&gt;
    _match(text, matches);&lt;br /&gt;
    String arr[] = new String[matches.size()];&lt;br /&gt;
    for (int i = 0; i &amp;lt; matches.size(); i++)&lt;br /&gt;
      arr[i] = matches.get(i).toString();&lt;br /&gt;
    return arr;&lt;br /&gt;
  }&lt;br /&gt;
  /**&lt;br /&gt;
   * Determines wether a provided text matches the regular expression&lt;br /&gt;
   * @param text&lt;br /&gt;
   * @return&lt;br /&gt;
   */&lt;br /&gt;
  public native boolean matches(String text)/*-{&lt;br /&gt;
   var regExp = this.@org.gwtwidgets.client.util.regex.Pattern::regExp;&lt;br /&gt;
   return regExp.test(text);&lt;br /&gt;
   }-*/;&lt;br /&gt;
  /**&lt;br /&gt;
   * Returns the regular expression for this pattern&lt;br /&gt;
   * @return&lt;br /&gt;
   */&lt;br /&gt;
  public native String pattern()/*-{&lt;br /&gt;
   var regExp = this.@org.gwtwidgets.client.util.regex.Pattern::regExp;&lt;br /&gt;
   return regExp.source;&lt;br /&gt;
   }-*/;&lt;br /&gt;
  private native void _split(String input, List results)/*-{&lt;br /&gt;
   var regExp = this.@org.gwtwidgets.client.util.regex.Pattern::regExp;&lt;br /&gt;
   var parts = input.split(regExp);&lt;br /&gt;
   for (var i=0;i&amp;lt;parts.length;i++)&lt;br /&gt;
   results.@java.util.ArrayList::add(Ljava/lang/Object;)(parts[i]  );&lt;br /&gt;
   }-*/;&lt;br /&gt;
  &lt;br /&gt;
  /**&lt;br /&gt;
   * Split an input string by the pattern&amp;quot;s regular expression&lt;br /&gt;
   * @param input&lt;br /&gt;
   * @return Array of strings&lt;br /&gt;
   */&lt;br /&gt;
  public String[] split(String input){&lt;br /&gt;
    List results = new ArrayList(); &lt;br /&gt;
    _split(input, results);&lt;br /&gt;
    String[] parts = new String[results.size()];&lt;br /&gt;
    for (int i=0;i&amp;lt;results.size();i++)&lt;br /&gt;
      parts[i] = (String)results.get(i);&lt;br /&gt;
    return parts;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
           &lt;br /&gt;
       &amp;lt;/source&amp;gt;&lt;br /&gt;
    &lt;br /&gt;
   &lt;br /&gt;
  &amp;lt;!-- end source code --&amp;gt;&lt;br /&gt;
   &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Use reflection to generate the async interface from the Service interface as per GWT standard ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
   &lt;br /&gt;
  &amp;lt;!-- start source code --&amp;gt;&lt;br /&gt;
   &lt;br /&gt;
    &amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
package org.drools.brms.gwtutil;&lt;br /&gt;
/*&lt;br /&gt;
 * Copyright 2005 JBoss Inc&lt;br /&gt;
 * &lt;br /&gt;
 * Licensed under the Apache License, Version 2.0 (the &amp;quot;License&amp;quot;);&lt;br /&gt;
 * you may not use this file except in compliance with the License.&lt;br /&gt;
 * You may obtain a copy of the License at&lt;br /&gt;
 * &lt;br /&gt;
 *      http://www.apache.org/licenses/LICENSE-2.0&lt;br /&gt;
 * &lt;br /&gt;
 * Unless required by applicable law or agreed to in writing, software&lt;br /&gt;
 * distributed under the License is distributed on an &amp;quot;AS IS&amp;quot; BASIS,&lt;br /&gt;
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.&lt;br /&gt;
 * See the License for the specific language governing permissions and&lt;br /&gt;
 * limitations under the License.&lt;br /&gt;
 */&lt;br /&gt;
&lt;br /&gt;
import java.lang.reflect.Method;&lt;br /&gt;
import org.drools.brms.client.rpc.RepositoryService;&lt;br /&gt;
/**&lt;br /&gt;
 * This utility uses reflection to generate the async interface from the &lt;br /&gt;
 * Service interface as per GWT standard.&lt;br /&gt;
 * &lt;br /&gt;
 * @author Michael Neale&lt;br /&gt;
 */&lt;br /&gt;
public class AsyncInterfaceGenerator {&lt;br /&gt;
    public static void main(String[] args) throws Exception {&lt;br /&gt;
        Class cls = RepositoryService.class;&lt;br /&gt;
        String line = &amp;quot;&amp;quot;;&lt;br /&gt;
        Method[] methods = cls.getMethods();&lt;br /&gt;
        for ( int i = 0; i &amp;lt; methods.length; i++ ) {&lt;br /&gt;
            Method meth = methods[i];&lt;br /&gt;
            if (meth.getDeclaringClass() == cls) {&lt;br /&gt;
                line += &amp;quot;public void &amp;quot; + meth.getName() + &amp;quot;(&amp;quot;;&lt;br /&gt;
                Class params[] = meth.getParameterTypes();&lt;br /&gt;
                for ( int j = 0; j &amp;lt; params.length; j++ ) {&lt;br /&gt;
                    String type = params[j].getName();&lt;br /&gt;
                    if (type.equals( &amp;quot;[Ljava.lang.String;&amp;quot; )) {&lt;br /&gt;
                        type = &amp;quot;String[]&amp;quot;;&lt;br /&gt;
                    }&lt;br /&gt;
                    line += type;&lt;br /&gt;
                    line += &amp;quot; p&amp;quot; + j;&lt;br /&gt;
                    if (j &amp;lt; params.length -1) {&lt;br /&gt;
                        line += &amp;quot;, &amp;quot;;&lt;br /&gt;
                    }&lt;br /&gt;
                }&lt;br /&gt;
                if (line.endsWith( &amp;quot;(&amp;quot; )) {&lt;br /&gt;
                    line += &amp;quot;AsyncCallback cb&amp;quot;;&lt;br /&gt;
                } else {&lt;br /&gt;
                    line += &amp;quot;, AsyncCallback cb&amp;quot;;&lt;br /&gt;
                }&lt;br /&gt;
                line += &amp;quot;);\n&amp;quot;;&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
        System.out.println(&amp;quot;/** Generated by AsyncInterfaceGenerator hackery */&amp;quot;);&lt;br /&gt;
        System.out.println(line);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
           &lt;br /&gt;
       &amp;lt;/source&amp;gt;&lt;br /&gt;
    &lt;br /&gt;
   &lt;br /&gt;
  &amp;lt;!-- end source code --&amp;gt;&lt;/div&gt;</summary>
			</entry>

	</feed>