30 aprile 2011

GWT currency & number textbox widget (per valuta e numeri)

english version


Indice dei tutorials: http://gheryd.blogspot.com/2011/06/javascript-gwt-tutorials.html



E possibile configurare nel modulo GWT il paese per la corretta formattazione del numero.

<?xml version="1.0" encoding="UTF-8"?>
<module>

    <extend-property name="locale" values="it_IT" />
    <set-property-fallback name="locale" value="it_IT" />

</module>

Per i formati con virgola ho addottato il valore

public static final NumberFormat nfFloat = NumberFormat.getFormat("#,##0.00");
mentre per i valori interi:

public static final NumberFormat nfInt = NumberFormat.getFormat("#,##0");

Comunque i formati  possono essere essere usati formati "custom" con il metodo "setNumberFormat" a cui occorre passare un oggetto NumberFormat. Per disabilitare la formattazione usare il metodo disableFormatting.


import com.google.gwt.event.dom.client.BlurEvent;
import com.google.gwt.event.dom.client.BlurHandler;
import com.google.gwt.event.dom.client.FocusEvent;
import com.google.gwt.event.dom.client.FocusHandler;
import com.google.gwt.event.dom.client.KeyCodes;
import com.google.gwt.event.dom.client.KeyPressEvent;
import com.google.gwt.event.dom.client.KeyPressHandler;
import com.google.gwt.i18n.client.NumberFormat;
import com.google.gwt.user.client.Window;
import com.google.gwt.user.client.ui.TextBox;


public class CurrencyTextBox extends TextBox {
    
    
    public static final NumberFormat nfFloat = NumberFormat.getFormat("#,##0.00");
    public static final NumberFormat nfInt = NumberFormat.getFormat("#,##0");
    
    
    public static interface CurrencyTextBoxHandler {
        public void onChange(CurrencyTextBox currencyTextBox);
    }
    
    private int decimals = 2;
    private int integers = 10;
    
    private NumberFormat nf;
    
    private float cifra = 0f;
    private char inputSeparator = '.';
    private char currencySumbol = '€';
    private boolean enableNegative = false;
    
    private boolean enableDecimal;
    private CurrencyTextBoxHandler handler = null;
    
    private String suffix = "";
    
    
    public CurrencyTextBox() {
        this(true, true);
    }
    
    
    public CurrencyTextBox(boolean showCurrencySimbol, boolean enableDecimal) {
        
        super.setTextAlignment(TextBox.ALIGN_RIGHT);
        
        if(!showCurrencySimbol) {
            currencySumbol = ' ';
        }
        
        this.enableDecimal = enableDecimal;
        if(enableDecimal) {
            nf = nfFloat;
        }else {
            nf = nfInt;
        }
        
        addKeyPressHandler(keyPressHandler);
        addBlurHandler(new BlurHandler() {
            
            @Override
            public void onBlur(BlurEvent event) {
                if(CurrencyTextBox.this.isReadOnly()) {
                    return;
                }
                parse();
                showFormatted();
                if(handler!=null) {
                    handler.onChange(CurrencyTextBox.this);
                }
            }
        });
        
        addFocusHandler(new FocusHandler() {
            
            @Override
            public void onFocus(FocusEvent event) {
                if(CurrencyTextBox.this.isReadOnly()) {
                    return;
                }
                if(CurrencyTextBox.this.enableDecimal) {
                    CurrencyTextBox.super.setText( (cifra==0f?"":cifra)+"" );
                }else {
                    int n = (int)cifra;
                    CurrencyTextBox.super.setText( (n==0?"":n)+"" );
                }
                
            }
        });
        
        showFormatted();
        
    }
    
    
    @Override
    public void setValue(String value) {
        setText(value);
    }
    
    
    @Override
    public String getValue() {
        return getText();
    }
    
    
    @Override
    public void setText(String text) {
        float n = 0f;
        try {
            n = Float.parseFloat( text );
        }catch(Exception e){}
        setNumber(n);
    }
    
    
    @Override
    public String getText() {
        if(enableDecimal) {
            Float n = getNumber();
            return "" + (n==null ? "" : n);
        }else {
            Integer n = getNumberAsInteger();
            return "" + (n==null ? "" : n);
        }
    }
    
    
    public void setNumberFormat(NumberFormat nf) {
        this.nf = nf;
        showFormatted();
    }
    
    
    public void disableFormatting() {
        this.nf = null;
    }
    
    public void setEnableNegative(boolean enableNegative) {
        this.enableNegative = enableNegative;
    }
    
    
    public void setCurrencyTextBoxHandler(CurrencyTextBoxHandler handler) {
        this.handler = handler;
    }
    
    
    public void setDecimals(int decimals) {
        this.decimals = decimals;
    }
    
    
    public void setIntegers(int integers) {
        this.integers = integers;
    }
    
    
    public void setCurrencySymbol(char symbol) {
        this.currencySumbol = symbol;
        showFormatted();
    }
    
    
    public float getNumber() {
        return cifra;
    }
    
    
    public int getNumberAsInteger() {
        return (int)cifra;
    }
    
    
    public void setNumber(Integer cifra) {
        if (cifra!=null){
            setNumber(cifra.floatValue());
        }else {
            setNumber(0f);
        }
    }
    
    
    public void setNumber(Float cifra) {
        if (cifra!=null){
            if(enableDecimal) {
                this.cifra = cifra;
            }else {
                this.cifra = cifra.intValue();
            }
            
        }else {
            this.cifra = 0f;
        }
        showFormatted();
    }
    
    
    private KeyPressHandler keyPressHandler = new KeyPressHandler(){
        
        @Override
        public void onKeyPress(KeyPressEvent event) {
            
            char c = event.getCharCode();
            
            if(c==KeyCodes.KEY_ENTER || c==KeyCodes.KEY_TAB) {
                CurrencyTextBox.this.setFocus(false);
                return;
            }
            
            String text = CurrencyTextBox.super.getText();
            int curPos = CurrencyTextBox.this.getCursorPos();
            if(c==KeyCodes.KEY_BACKSPACE || c==KeyCodes.KEY_DELETE || c==KeyCodes.KEY_RIGHT || c==KeyCodes.KEY_LEFT) {
                return;
            }else if( c==KeyCodes.KEY_UP ) {
                parse();
                cifra++;
                CurrencyTextBox.super.setText(cifra+"");
            }else if( c==KeyCodes.KEY_DOWN ) {
                parse();
                cifra--;
                CurrencyTextBox.super.setText(cifra+"");
            }else if(curPos == 0 && enableNegative && c == '-' && !text.startsWith("c")) {
                
            }else if(c==inputSeparator) {
                if(enableDecimal) {
                    int index = CurrencyTextBox.super.getText().indexOf(inputSeparator);
                    if(index>-1 &&  text.length()>=index) {
                        CurrencyTextBox.this.cancelKey();
                    }
                }else {
                    CurrencyTextBox.this.cancelKey();
                }
                
             }else if(  !Character.isDigit(c) ) {
                
                CurrencyTextBox.this.cancelKey();
            }
            
            int posSep = -1;
            
            if(enableDecimal)
            posSep = text.indexOf(inputSeparator);
            
            if(Character.isDigit(c) && posSep>-1) {
                // c'è il punto
                if(  curPos>posSep && (text.length()-posSep)>decimals ) {
                    CurrencyTextBox.this.cancelKey();
                    }else if(curPos<=posSep && posSep>integers ) {
                    CurrencyTextBox.this.cancelKey();
                }
             }else if(posSep==-1 && text.length()>=integers) {
                // non c'è il punto
                CurrencyTextBox.this.cancelKey();
            }
            
            
        }
        
    };
    
    
    private void parse() {
        cifra = 0f;
        try {
            cifra= Float.parseFloat(CurrencyTextBox.super.getText());
        }catch(Exception e) {
            cifra = 0f;
        }
    }
    
    
    private void showFormatted() {
        CurrencyTextBox.super.setText(  (currencySumbol!=' '?currencySumbol:"")+" "+ getFormatted() + suffix );
    }
    
    
    private String getFormatted() {
        if(nf!=null) {
            return nf.format(cifra);
        }else {
            if(enableDecimal) {
                return cifra+"";
            }else {
                return getNumberAsInteger()+"";
            }
            
        }
    }
    
    
    public void setSuffix(String suffix) {
        this.suffix = suffix;
        showFormatted();
    }
}

Esempio:
CurrencyTextBox ctb = new CurrencyTextBox();
ctb.setNumber(1000);
RootPanel.get().add(ctb);

Ubuntu 11.04 desktop bloccato

Dopo aver aggiornato ubuntu 10.10 con la nuova release 11.04, ho avuto l'infelice idea di installare compiz config.
Il nuovo deskop unity utilizzato nella versione 11.04 è scomparso :(
Ho provato a riavviare, niente.
Cercando in giro consigliavano il comando "unity --reset", ma non avevo installato questo comando, quindi ho fatto un bel apt-get install e dopo sono riuscito a eseguire il comando.
Tutto e' ritornato a posto :)
Nota: potete eseguire i comandi avviando ubuntu in modalità provvisoria oppure premendo ctrl+alt+f1 per accedere alla console (blocco permettendo ;) )

gheryd@gheryd-laptop:~$ sudo apt-get install unity

gheryd@gheryd-laptop:~$ unity --reset

Se preferite utilizzare il vecchio buon desktop gnome potete seguire le instruzioni in questo post:
http://gheryd.blogspot.com/2011/05/ubuntu-1104-attivare-desktop-classico.html

Ricordo che per installare il configuratore di compiz basta fare il comando:

gheryd@gheryd-laptop:~$ sudo apt-get install compizconfig-settings-manager