it.businesslogic.ireport.gui.sheet.SheetProperty.java Source code

Java tutorial

Introduction

Here is the source code for it.businesslogic.ireport.gui.sheet.SheetProperty.java

Source

/*
 * Copyright (C) 2005 - 2008 JasperSoft Corporation.  All rights reserved. 
 * http://www.jaspersoft.com.
 *
 * Unless you have purchased a commercial license agreement from JasperSoft,
 * the following license terms apply:
 *
 * This program is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License version 2 as published by
 * the Free Software Foundation.
 *
 * This program is distributed WITHOUT ANY WARRANTY; and without the
 * implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
 * See the GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program; if not, see http://www.gnu.org/licenses/gpl.txt
 * or write to:
 *
 * Free Software Foundation, Inc.,
 * 59 Temple Place - Suite 330,
 * Boston, MA  USA  02111-1307
 *
 *
 *
 *
 * SheetProperty.java
 * 
 * Created on 4 ottobre 2004, 22.08
 *
 */

package it.businesslogic.ireport.gui.sheet;

import com.lowagie.text.Font;
import java.awt.event.FocusEvent;
import java.util.*;
import javax.swing.*;
import it.businesslogic.ireport.gui.event.*;
import java.awt.Color;
import java.awt.event.FocusListener;

/**
 *
 * @author  Administrator
 */
public class SheetProperty implements java.awt.event.ActionListener {

    public static final int STRING = 0;
    public static final int NUMBER = 1;
    public static final int INTEGER = 6;
    public static final int COMBOBOX = 2;
    public static final int COLOR = 3;
    public static final int BOOLEAN = 4;
    public static final int COMBOBOX_NK = 5; // Combobox number key
    public static final int PASSWORD = 7;
    public static final int CATEGORY_LABEL = 99;
    public static final int TEXT = 8;

    protected String name = "";
    protected String keyName = "";
    protected String group = "";
    protected int type;
    private java.util.Vector tags = null;
    protected Object defaultValue = null;
    protected Object value = null;

    private boolean readOnly = false;

    private boolean setting = false;

    protected JComponent component = null;

    private JComponent labelComponent = null;

    private boolean showResetButton = true;

    private java.awt.Color labelColor = java.awt.Color.BLACK;

    private Vector currentSelection = new Vector();

    private String labelError = null;
    private static final Color errorColor = Color.RED.darker();
    private static final ImageIcon errorIcon = new javax.swing.ImageIcon(
            SheetProperty.class.getResource("/it/businesslogic/ireport/icons/problems/error.png"));

    /**
     * Utility field used by event firing mechanism.
     */
    private javax.swing.event.EventListenerList listenerList = null;

    public SheetProperty(String keyName, String name, int type) {
        this(keyName, name, type, null);
    }

    /** Creates a new instance of SheetProperty */
    public SheetProperty(String keyName, String name, int type, Object defaultValue) {
        this.setName(name);
        this.setKeyName(keyName);
        this.setDefaultValue(defaultValue);
        setType(type);
        tags = new Vector();
    }

    public SheetProperty(String keyName, String name, String groupname, int type, Object defaultValue) {
        this.setName(name);
        this.setKeyName(keyName);
        this.setDefaultValue(defaultValue);
        setType(type);
        tags = new Vector();
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getType() {
        return type;
    }

    public void setType(int type) {
        this.type = type;
    }

    public java.util.Vector getTags() {
        return tags;
    }

    public void setTags(java.util.Vector tags) {
        this.tags = tags;
    }

    public void setTags(Tag[] tags_array) {

        this.tags = new Vector();

        for (int i = 0; i < tags_array.length; ++i) {
            tags.add(tags_array[i]);
        }
    }

    public JComponent getEditor() {

        if (component != null)
            return component;

        if (this.getType() == NUMBER) {
            component = new it.businesslogic.ireport.gui.JNumberField();
            component.setBorder(null);

            ((it.businesslogic.ireport.gui.JNumberField) component).addActionListener(this);

        } else if (this.getType() == INTEGER) {
            component = new it.businesslogic.ireport.gui.JNumberField();
            component.setBorder(null);
            try {
                ((it.businesslogic.ireport.gui.JNumberField) component).setInteger(true);
            } catch (Exception ex) {
            }

            ((it.businesslogic.ireport.gui.JNumberField) component).addActionListener(this);

        } else if (this.getType() == COMBOBOX || this.getType() == COMBOBOX_NK) {
            component = new JComboBox(this.getTags());
            component.setBorder(null);

            //((JComboBox)component).setEditor(new SimpleComboBoxEditor() );

            for (int i = 0; i < component.getComponentCount(); ++i) {
                try {
                    Object obj = component.getComponent(i);
                    //System.out.println( obj );                    
                    if (obj != null && obj.getClass().getMethod("setBorder",
                            new Class[] { javax.swing.border.Border.class }) != null) {
                        java.lang.reflect.Method mtd = obj.getClass().getMethod("setBorder",
                                new Class[] { javax.swing.border.Border.class });
                        mtd.invoke(obj, new Object[] { null });
                    }
                } catch (Exception ex) {
                }
            }

            ((JComboBox) component).addActionListener(this);
        } else if (this.getType() == BOOLEAN) {
            component = new JCheckBox("");
            ((JCheckBox) component).addActionListener(this);
        } else if (this.getType() == COLOR) {
            component = new ColorSelectorPanel();
            ((ColorSelectorPanel) component).addActionListener(this);
        } else if (this.getType() == CATEGORY_LABEL) {
            component = new JPanel();
            component.setBackground(java.awt.Color.LIGHT_GRAY);
        } else if (this.getType() == PASSWORD) {
            component = new JPasswordField();
            component.setBorder(null);
            ((JTextField) component).getDocument().addDocumentListener(new javax.swing.event.DocumentListener() {
                public void changedUpdate(javax.swing.event.DocumentEvent evt) {
                    actionPerformed(null);
                }

                public void insertUpdate(javax.swing.event.DocumentEvent evt) {
                    actionPerformed(null);
                }

                public void removeUpdate(javax.swing.event.DocumentEvent evt) {
                    actionPerformed(null);
                }
            });
        } else if (this.getType() == TEXT) {
            component = new JTextField();
            component.setBorder(null);
            // Value changed of return and focusLost...
            ((JTextField) component).addActionListener(this);
            ((JTextField) component).addFocusListener(new FocusListener() {
                public void focusGained(FocusEvent e) {
                    ((JTextField) e.getComponent()).selectAll();
                }

                public void focusLost(FocusEvent e) {
                    actionPerformed(null);
                }
            });

        } else {
            // default (STRING)
            component = new JTextField();
            component.setBorder(null);
            ((JTextField) component).getDocument().addDocumentListener(new javax.swing.event.DocumentListener() {
                public void changedUpdate(javax.swing.event.DocumentEvent evt) {
                    actionPerformed(null);
                }

                public void insertUpdate(javax.swing.event.DocumentEvent evt) {
                    actionPerformed(null);
                }

                public void removeUpdate(javax.swing.event.DocumentEvent evt) {
                    actionPerformed(null);
                }
            });
        }

        return component;

    }

    public Object getEditorValue(JComponent component) {
        if (this.getType() == NUMBER) {
            return new Double(((it.businesslogic.ireport.gui.JNumberField) component).getValue());
        } else if (this.getType() == INTEGER) {
            return new Integer((int) ((it.businesslogic.ireport.gui.JNumberField) component).getValue());
        } else if (this.getType() == COMBOBOX) {
            Object obj = ((JComboBox) component).getSelectedItem();
            if (obj != null) {
                if (obj instanceof Tag) {
                    return ((Tag) obj).getValue();
                } else {
                    return obj;
                }
            }
            return null;
        } else if (this.getType() == COMBOBOX_NK) {
            Object obj = ((JComboBox) component).getSelectedItem();
            if (obj != null) {
                return new Integer(((Tag) obj).getValue() + "");
            }
            return null;
        } else if (this.getType() == BOOLEAN) {
            return new Boolean(((JCheckBox) component).isSelected());
        } else if (this.getType() == BOOLEAN) {
            return new String(((JPasswordField) component).getPassword());
        } else if (this.getType() == COLOR) {
            return ((ColorSelectorPanel) component).getValue();
        }

        return ((JTextField) component).getText();
    }

    public synchronized void setEditorValue(JComponent component, Object obj) {

        String str = "" + obj;

        component.setForeground(Color.BLACK);

        try {

            setSetting(true);
            if (this.getType() == NUMBER) {
                if (obj == null)
                    str = "0";
                ((it.businesslogic.ireport.gui.JNumberField) component).setValue(Double.parseDouble(str));

                if (obj == null)
                    ((it.businesslogic.ireport.gui.JNumberField) component).setForeground(Color.LIGHT_GRAY);

            } else if (this.getType() == INTEGER) {
                if (obj == null)
                    str = "0";
                ((it.businesslogic.ireport.gui.JNumberField) component).setValue(Integer.parseInt(str));
                if (obj == null)
                    ((it.businesslogic.ireport.gui.JNumberField) component).setForeground(Color.LIGHT_GRAY);
            } else if (this.getType() == COMBOBOX) {
                if (obj == null) {
                    setSetting(false);
                    if (getTags().size() > 0 && ((Tag) getTags().elementAt(0)).getValue() == null) {
                        ((JComboBox) component).setSelectedIndex(0);
                    }
                    return;
                }
                boolean found = false;
                for (int i = 0; i < getTags().size(); ++i) {

                    Tag t = (Tag) getTags().elementAt(i);
                    if (t.getValue() != null && t.getValue().equals(str)) {
                        found = true;
                        ((JComboBox) component).setSelectedIndex(i);
                        break;
                    }
                }
                if (!found && ((JComboBox) component).isEditable()) {
                    ((JComboBox) component).setSelectedItem(obj);
                }
            } else if (this.getType() == COMBOBOX_NK) {
                if (obj == null) {
                    setSetting(false);
                    if (getTags().size() > 0) {
                        ((JComboBox) component).setSelectedIndex(0);
                    }
                    return;
                }
                for (int i = 0; i < getTags().size(); ++i) {
                    Tag t = (Tag) getTags().elementAt(i);
                    if ((t.getValue() + "").equals(str)) {
                        ((JComboBox) component).setSelectedIndex(i);
                        break;
                    }
                }
            } else if (this.getType() == BOOLEAN) {
                if (obj == null) {
                    ((JCheckBox) component).setSelected(false);
                    setSetting(false);
                    return;
                }
                ((JCheckBox) component).setSelected(str.equals("true"));
            } else if (this.getType() == COLOR) {
                ((ColorSelectorPanel) component).setValue(obj);
            } else if (this.getType() == PASSWORD) {
                if (obj == null) {
                    ((JPasswordField) component).setText("");
                    setSetting(false);
                    return;
                }
                ((JPasswordField) component).setText(str);
            } else {
                if (obj == null) {
                    ((JTextField) component).setText("");
                    setSetting(false);
                    return;
                }
                ((JTextField) component).setText(str);
            }
        } catch (Exception ex) {
            ex.printStackTrace();
        } finally {
            setSetting(false);
        }

    }

    public String getKeyName() {
        return keyName;
    }

    public void setKeyName(String keyName) {
        this.keyName = keyName;
    }

    public Object getDefaultValue() {
        return defaultValue;
    }

    public void setDefaultValue(Object defaultValue) {
        this.defaultValue = defaultValue;
    }

    public String getGroup() {
        return group;
    }

    public void setGroup(String group) {
        this.group = group;
    }

    public Object getValue() {
        return value;
    }

    public void setValue(Object value) {

        this.value = value;
        this.setEditorValue(getEditor(), (value == null) ? getDefaultValue() : value);
        //updateLabel();

    }

    public void updateLabel() {

        if (this.getType() != CATEGORY_LABEL) {
            try {
                if (getLabelComponent() != null) {

                    //String bold = (value == null || this.isReadOnly() || !isShowResetButton()) ? "" : "<html><b>";

                    boolean needBold = !(value == null || this.isReadOnly() || !isShowResetButton());

                    java.awt.Font f = getLabelComponent().getFont();

                    if (f.isBold() && !needBold) {
                        ((JLabel) getLabelComponent()).setFont(f.deriveFont(Font.NORMAL));
                    } else if (!f.isBold() && needBold) {
                        ((JLabel) getLabelComponent()).setFont(f.deriveFont(Font.BOLD));
                    }

                    // The table is used to avoid word wrap
                    //((JLabel)getLabelComponent()).setText("<html><table><tr><td nowrap>" + bold + this.getName() + "</td></tr></table></html>");
                    ((JLabel) getLabelComponent()).setText(this.getName());

                    if (this.isReadOnly()) {
                        getLabelComponent().setEnabled(false);
                    } else {
                        getLabelComponent().setEnabled(true);
                    }

                    if (labelError != null) {
                        ((JLabel) getLabelComponent()).setIcon(errorIcon);
                        getLabelComponent().setForeground(errorColor);
                        getLabelComponent().setToolTipText(labelError);
                    } else {
                        ((JLabel) getLabelComponent()).setIcon(null);
                        getLabelComponent().setForeground(getLabelColor());
                        getLabelComponent().setToolTipText(getName());
                    }

                    getLabelComponent().updateUI();
                }
            } catch (Exception ex) {

            }
        }
    }

    public void actionPerformed(java.awt.event.ActionEvent event) {
        if (isSetting())
            return;
        getEditor().setForeground(Color.BLACK);
        Object new_value = getEditorValue(this.getEditor());
        if (new_value != null && new_value.equals(value))
            return;

        Object oldValue = value;
        value = new_value;

        if (oldValue == null || new_value == null) {
            updateLabel();
        }

        fireSheetPropertyValueChangedListenerSheetPropertyValueChanged(
                new SheetPropertyValueChangedEvent(getKeyName(), oldValue, new_value, this));

        if (getType() == TEXT || getType() == NUMBER) {
            FocusManager.getCurrentManager().clearGlobalFocusOwner();
        }
    }

    /**
     * Registers SheetPropertyValueChangedListener to receive events.
     * @param listener The listener to register.
     */
    public synchronized void addSheetPropertyValueChangedListener(
            it.businesslogic.ireport.gui.event.SheetPropertyValueChangedListener listener) {

        if (listenerList == null) {
            listenerList = new javax.swing.event.EventListenerList();
        }
        listenerList.add(it.businesslogic.ireport.gui.event.SheetPropertyValueChangedListener.class, listener);
    }

    /**
     * Removes SheetPropertyValueChangedListener from the list of listeners.
     * @param listener The listener to remove.
     */
    public synchronized void removeSheetPropertyValueChangedListener(
            it.businesslogic.ireport.gui.event.SheetPropertyValueChangedListener listener) {

        listenerList.remove(it.businesslogic.ireport.gui.event.SheetPropertyValueChangedListener.class, listener);
    }

    /**
     * Notifies all registered listeners about the event.
     * 
     * @param event The event to be fired
     */
    public void fireSheetPropertyValueChangedListenerSheetPropertyValueChanged(
            it.businesslogic.ireport.gui.event.SheetPropertyValueChangedEvent event) {

        if (listenerList == null)
            return;
        Object[] listeners = listenerList.getListenerList();
        for (int i = listeners.length - 2; i >= 0; i -= 2) {
            if (listeners[i] == it.businesslogic.ireport.gui.event.SheetPropertyValueChangedListener.class) {
                ((it.businesslogic.ireport.gui.event.SheetPropertyValueChangedListener) listeners[i + 1])
                        .sheetPropertyValueChanged(event);
            }
        }
    }

    public boolean isReadOnly() {
        return readOnly;
    }

    public void setReadOnly(boolean readOnly) {
        this.readOnly = readOnly;
        getEditor().setEnabled(!readOnly);
    }

    public JComponent getLabelComponent() {
        return labelComponent;
    }

    public void setLabelComponent(JComponent labelComponent) {
        this.labelComponent = labelComponent;
    }

    public boolean isSetting() {
        return setting;
    }

    public void setSetting(boolean setting) {
        this.setting = setting;
    }

    public boolean isShowResetButton() {
        return showResetButton;
    }

    public void setShowResetButton(boolean showResetButton) {
        this.showResetButton = showResetButton;
    }

    public java.awt.Color getLabelColor() {
        return labelColor;
    }

    public void setLabelColor(java.awt.Color labelColor) {
        this.labelColor = labelColor;
    }

    public Vector getCurrentSelection() {
        return currentSelection;
    }

    public void setCurrentSelection(Vector currentSelection) {
        this.currentSelection = currentSelection;
    }

    public String getLabelError() {
        return labelError;
    }

    public void setLabelError(String labelError) {
        this.labelError = labelError;
    }
}