
package turgen.config;

import javax.swing.JComponent;

    
/* Konfiguracni zaznam, ktery je mozne registrovat si u manazera
 * konfiguraci a tak se take dozvedet o zmenach konfigurace.
 * Manazer take muze sestavit dialog pro nastaveni konfigurace
 *
 */
public abstract class AbstractConfigEntry {

    
    
    private ConfigEntryListener listener=null;
    
    
    /**Identifikacni klic*/
    private String entryKey=null;
    
    /**Podrobnejsi popis*/
    private String entryDescription=null;
    
    /**Hodnota, pristup jen pomoci metod*/
    private String internalValue=null;

    /**Human readable name*/
    protected String name;
    
    /**Dotazy hodnotu jako cele cislo*/
    abstract public int getAsInt();
        
    /**Dotaz na hodnotu jako boolean*/
    abstract public boolean getAsBoolean();
    
    /**Dotaz na hodnotu jako retezec*/
    abstract public String getAsString();
        
    /**Dotaz na hodnotu jako Double*/
    abstract public double getAsDouble();
    
    /**Nastavi klic*/
    public final void setEntryKey(String key) {
        
        this.entryKey=key;
    }
    
    /**Nastavi hodnotu*/
    public final void setEntryValue(String value) {
        this.internalValue=value;
        if (listener!=null) listener.onConfigEntryChange(this);
    }
    
    /**Nastavi popisek*/
    public final void setEntryDescription(String description) {
        this.entryDescription=description;
    }
    
    /**Vrati klic*/
    public final String getEntryKey() {
        return entryKey;
    }
    
    /**Vrati hodnotu*/
    public final String getEntryValue() {
        return internalValue;
    }
    
    /**Vrati popisek*/
    public final String getEntryDescription() {
        if (entryDescription!=null) return entryDescription;
        if (entryKey!=null) return entryKey;
        return this.toString();
    }
    
    /**Vrati komponentu urcenou k editaci*/
    public abstract JComponent createEntryEditor();
    
    /**Vyplni obsah komponenty urcene k editaci*/
    public abstract void fillEntryEditor(JComponent c);
    
    /**Nastavi hodnotu danou komponentou, vrati chybove hlaseni
       nebo null, kdyz to dopadlo dobre*/
    public abstract void flushValueFromEditor(JComponent c);
    
    /**Kontrola spravnosti zadane hodnoty, vraci null kdyz OK,
     * jinak chybove hlaseni
     * @param c Koponenta
     * @return null kdyz OK, jinak chybove hlaseni
     */
    public abstract String verifyEntry(JComponent c);
    
    
    /**Nastavi posluchace*/
    public final void setListener(ConfigEntryListener l) {
        listener=l;
    }
    
    /**Return entry human readable name
     * 
     * @return human readable name
     */
    public String getName() {
        return name;
    }
    
    public boolean isComponentUnderCaption() {
        return false;
    }
    
}
