edu.ku.brc.af.tasks.subpane.formeditor.EditorPropPanel.java Source code

Java tutorial

Introduction

Here is the source code for edu.ku.brc.af.tasks.subpane.formeditor.EditorPropPanel.java

Source

/* Copyright (C) 2015, University of Kansas Center for Research
 * 
 * Specify Software Project, specify@ku.edu, Biodiversity Institute,
 * 1345 Jayhawk Boulevard, Lawrence, Kansas, 66045, USA
 * 
 * This program is free software; you can redistribute it and/or
 * modify it under the terms of the GNU General Public License
 * as published by the Free Software Foundation; either version 2
 * of the License, or (at your option) any later version.
 * 
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even 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, write to the Free Software
 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
*/
package edu.ku.brc.af.tasks.subpane.formeditor;

import static edu.ku.brc.ui.UIRegistry.getResourceString;

import java.awt.BorderLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;
import java.util.Hashtable;
import java.util.Iterator;
import java.util.List;
import java.util.Vector;

import javax.swing.DefaultComboBoxModel;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JPanel;
import javax.swing.JTextField;

import org.apache.commons.lang.StringUtils;
import org.apache.log4j.Logger;

import com.jgoodies.forms.builder.PanelBuilder;
import com.jgoodies.forms.layout.CellConstraints;
import com.jgoodies.forms.layout.FormLayout;

import edu.ku.brc.af.core.db.DBFieldInfo;
import edu.ku.brc.af.core.db.DBRelationshipInfo;
import edu.ku.brc.af.core.db.DBTableIdMgr;
import edu.ku.brc.af.core.db.DBTableInfo;
import edu.ku.brc.af.ui.db.ViewBasedDisplayPanel;
import edu.ku.brc.af.ui.forms.FormViewObj;
import edu.ku.brc.af.ui.forms.MultiView;
import edu.ku.brc.af.ui.forms.ViewFactory;
import edu.ku.brc.af.ui.forms.persist.AltView;
import edu.ku.brc.af.ui.forms.persist.AltViewIFace;
import edu.ku.brc.af.ui.forms.persist.FormCell;
import edu.ku.brc.af.ui.forms.persist.FormCellField;
import edu.ku.brc.af.ui.forms.persist.FormCellFieldIFace;
import edu.ku.brc.af.ui.forms.persist.FormCellIFace;
import edu.ku.brc.af.ui.forms.persist.FormCellLabel;
import edu.ku.brc.af.ui.forms.persist.FormRowIFace;
import edu.ku.brc.af.ui.forms.persist.FormViewDef;
import edu.ku.brc.af.ui.forms.persist.ViewDefIFace;
import edu.ku.brc.af.ui.forms.validation.FormValidator;
import edu.ku.brc.af.ui.forms.validation.ValCheckBox;
import edu.ku.brc.af.ui.forms.validation.ValComboBox;
import edu.ku.brc.af.ui.forms.validation.ValTextArea;
import edu.ku.brc.af.ui.forms.validation.ValTextField;
import edu.ku.brc.dbsupport.DataProviderFactory;
import edu.ku.brc.dbsupport.DataProviderSessionIFace;
import edu.ku.brc.specify.datamodel.PickList;
import edu.ku.brc.ui.IconManager;
import edu.ku.brc.ui.UIHelper;
import edu.ku.brc.util.Pair;

/**
 * @author rod
 *
 * @code_status Alpha
 *
 * Oct 22, 2007
 *
 */
public class EditorPropPanel extends JPanel {
    private static final Logger log = Logger.getLogger(EditorPropPanel.class);

    protected Hashtable<String, ViewBasedDisplayPanel> propPanelHash = new Hashtable<String, ViewBasedDisplayPanel>();

    protected ViewBasedDisplayPanel viewPanel = null;
    protected FormViewObj formViewObj = null;
    protected DBTableInfo tableInfo;

    protected FormCell currentFC = null;
    protected Object data;

    protected Hashtable<String, Control> controlHash;
    protected Hashtable<String, SubControl> subcontrolHash;
    protected Vector<FormCellField> fieldsNotUsedByLabels;
    protected FormViewDef formViewDef;

    protected MultiView multiView;

    protected JButton saveBtn = null;
    protected JButton valBtn = null;

    protected PropertyChangeListener pcl = null;

    protected Hashtable<String, String> pickList = new Hashtable<String, String>();

    /**
     * @param controlHash
     * @param subcontrolHash
     * @param fieldsNotUsedByLabels
     * @param addSaveBtn
     * @param pcl
     */
    public EditorPropPanel(final Hashtable<String, Control> controlHash,
            final Hashtable<String, SubControl> subcontrolHash, final Vector<FormCellField> fieldsNotUsedByLabels,
            final boolean addSaveBtn, final PropertyChangeListener pcl) {
        setLayout(new BorderLayout());

        this.controlHash = controlHash;
        this.subcontrolHash = subcontrolHash;
        this.fieldsNotUsedByLabels = fieldsNotUsedByLabels;

        if (addSaveBtn) {
            saveBtn = UIHelper.createButton("Accept");
            saveBtn.addActionListener(new ActionListener() {
                public void actionPerformed(ActionEvent e) {
                    if (currentFC instanceof FormCellField) {
                        getDataFromUI((FormCellField) currentFC);
                    } else {
                        getDataFromUI(currentFC);
                    }
                    if (pcl != null) {
                        pcl.propertyChange(new PropertyChangeEvent(EditorPropPanel.this, "accept", data, data)); //$NON-NLS-1$
                    }
                }
            });
        }
    }

    /**
     * @param fieldsNotUsedByLabels
     */
    public void setFieldsNotUsedByLabels(Vector<FormCellField> fieldsNotUsedByLabels) {
        this.fieldsNotUsedByLabels = fieldsNotUsedByLabels;
    }

    /**
     * @param id
     * @return
     */
    protected String getNameForId(final String id) {
        for (FormRowIFace row : formViewDef.getRows()) {
            for (FormCellIFace cell : row.getCells()) {
                if (cell.getIdent().equals(id)) {
                    return cell.getName();
                }
            }
        }
        return null;
    }

    /**
     * @param data
     */
    public void setData(final Object data) {
        currentFC = null;
        this.data = data;

        if (multiView != null) {
            multiView.setData(data);

            if (data != null) {
                if (data instanceof ViewDefIFace) {
                    JTextField typeLabel = (JTextField) formViewObj.getControlByName("type"); //$NON-NLS-1$
                    typeLabel.setText(UIHelper.makeNamePretty(data.getClass().getSimpleName()));

                } else if (data instanceof AltView) {
                    setDataIntoUI((AltView) data);
                }
            }
        }
    }

    /**
     * @param altView
     */
    protected void setDataIntoUI(final AltView altView) {
        ValComboBox cbx = (ValComboBox) formViewObj.getControlByName("defaultMode"); //$NON-NLS-1$
        DefaultComboBoxModel model = (DefaultComboBoxModel) cbx.getModel();
        model.removeAllElements();

        int cnt = 0;
        int inx = 0;
        for (AltViewIFace.CreationMode mode : AltViewIFace.CreationMode.values()) {
            model.addElement(mode);
            if (mode == altView.getMode()) {
                inx = cnt;
            }
            cnt++;
        }
        cbx.getComboBox().setSelectedIndex(inx);
    }

    /**
     * @return
     */
    public Object getData() {
        if (multiView != null) {
            multiView.getDataFromUI();

            if (data != null) {
                if (data instanceof AltView) {
                    getDataFromUI((AltView) data);
                }
            }
        }
        return data;
    }

    /**
     * @param dataObj
     */
    protected void getDataFromUI(final AltView altView) {
        ValComboBox cbx = (ValComboBox) formViewObj.getControlByName("defaultMode"); //$NON-NLS-1$
        altView.setMode((AltViewIFace.CreationMode) cbx.getComboBox().getSelectedItem());
    }

    /**
     * @param name
     * @return
     */
    protected String getIdForName(final String name) {
        for (FormRowIFace row : formViewDef.getRows()) {
            for (FormCellIFace cell : row.getCells()) {
                if (StringUtils.isNotEmpty(cell.getName()) && cell.getName().equals(name)) {
                    return cell.getIdent();
                }
            }
        }
        return null;
    }

    /**
     * 
     */
    protected void addSaveBtn(final MultiView mv) {
        CellConstraints cc = new CellConstraints();
        PanelBuilder pb = new PanelBuilder(new FormLayout("f:p:g,p" + (saveBtn != null ? ",5px,p" : ""), "p")); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$

        int x = 2;

        valBtn = FormViewObj.createValidationIndicator(mv.getCurrentView().getUIComponent(),
                mv.getCurrentView().getValidator());
        pb.add(valBtn, cc.xy(x, 1));
        x += 2;

        if (saveBtn != null) {
            pb.add(saveBtn, cc.xy(x, 1));
            mv.getCurrentView().getValidator().addEnableItem(saveBtn,
                    FormValidator.EnableType.ValidAndChangedItems);
        }

        add(pb.getPanel(), BorderLayout.SOUTH);
    }

    /**
     * @param viewName
     * @param className
     */
    public void loadView(final String viewName, final String className) {
        viewPanel = propPanelHash.get(viewName);
        if (viewPanel == null) {
            ViewFactory.setDoFixLabels(false);
            viewPanel = new ViewBasedDisplayPanel(null, "Editor", viewName, null, null, null, true, 0);
            propPanelHash.put(viewName, viewPanel);
            ViewFactory.setDoFixLabels(true);
        }

        removeAll();

        multiView = viewPanel.getMultiView();

        multiView.getCurrentView().getValidator().setEnabled(true);
        multiView.getCurrentView().getValidator().addEnableItem(saveBtn,
                FormValidator.EnableType.ValidAndChangedItems);

        if (viewPanel != null && multiView != null) {
            add(viewPanel, BorderLayout.CENTER);

            addSaveBtn(multiView);

            validate();

            formViewObj = (FormViewObj) multiView.getCurrentView();
            formViewObj.setFormEnabled(true);
            tableInfo = className != null ? DBTableIdMgr.getInstance().getByClassName(className) : null;

        } else {
            log.error("Couldn't load panel for [" + viewName + "]"); //$NON-NLS-1$ //$NON-NLS-2$
        }
        validate();
        repaint();
    }

    /**
     * @param fc
     * @param rows
     * @param rowInx
     * @param cols
     * @param colInx
     */
    public void setDataIntoUI(final FormViewDef fvd, final FormCell fc, final int rows, final int rowDefs,
            final int rowInx, final int cols, final int colDefs, final int colInx) {
        if (formViewObj == null) {
            return;
        }

        formViewDef = fvd;

        currentFC = fc;
        data = fc;

        setDataIntoBase(fc, rows, rowDefs, rowInx, cols, colDefs, colInx, false);

        JTextField typeLabel = (JTextField) formViewObj.getControlByName("type"); //$NON-NLS-1$
        typeLabel.setText(fc.getType().toString());

        if (fc instanceof FormCellLabel) {
            FormCellLabel fcl = (FormCellLabel) fc;

            getIdCombobox(fcl.getLabelFor());

            processImageNameCBX(fcl.getIconName());

            ValCheckBox chkbx = (ValCheckBox) formViewObj.getControlByName("isRecordObj"); //$NON-NLS-1$
            chkbx.setSelected(fcl.isRecordObj());

            ((ValTextField) formViewObj.getControlByName("label")).setText(((FormCellLabel) fc).getLabel()); //$NON-NLS-1$
        }

        multiView.validateAll();

    }

    /**
     * @param imageName
     * @return
     */
    protected ValComboBox processImageNameCBX(final String imageName) {
        List<Pair<String, ImageIcon>> icons = IconManager.getListByType("datamodel", IconManager.IconSize.Std16); //$NON-NLS-1$

        ValComboBox cbx = (ValComboBox) formViewObj.getControlByName("imageNameCBX"); //$NON-NLS-1$
        DefaultComboBoxModel model = (DefaultComboBoxModel) cbx.getModel();
        model.addElement(getResourceString("EditorPropPanel.NONE")); //$NON-NLS-1$
        int inx = 0;
        int cnt = 1;
        for (Pair<String, ImageIcon> iconPair : icons) {
            model.addElement(iconPair.first);
            if (StringUtils.isNotEmpty(imageName) && iconPair.first.equals(imageName)) {
                inx = cnt;
            }
            cnt++;
        }
        cbx.getComboBox().setSelectedIndex(inx);
        return cbx;
    }

    /**
     * @param labelFor
     * @return
     */
    protected ValComboBox getIdCombobox(final String labelFor) {
        ValComboBox cbx = (ValComboBox) formViewObj.getControlByName("labelForCBX"); //$NON-NLS-1$

        DefaultComboBoxModel model = (DefaultComboBoxModel) cbx.getModel();
        model.addElement(getResourceString("EditorPropPanel.NONE")); //$NON-NLS-1$
        int inx = 0;
        if (StringUtils.isNotEmpty(labelFor)) {
            model.addElement(getNameForId(labelFor));
            inx = 1;
        }

        for (FormCellField fcf : fieldsNotUsedByLabels) {
            model.addElement(fcf.getName());
        }
        cbx.getComboBox().setSelectedIndex(inx);
        return cbx;
    }

    /**
     * @param fc
     * @param rows
     * @param rowInx
     * @param cols
     * @param colInx
     * @param enableNaming
     */
    protected void setDataIntoBase(final FormCell fc, final int rows, final int rowDefs, final int rowInx,
            final int cols, final int colDefs, final int colInx, final boolean enableNaming) {
        if (formViewObj == null) {
            return;
        }

        int inx;
        int cnt;

        String fName = fc.getName();
        ValComboBox nameCBX = (ValComboBox) formViewObj.getControlByName("namecbx"); //$NON-NLS-1$
        if (StringUtils.isNotEmpty(fName) || enableNaming) {
            DefaultComboBoxModel model = (DefaultComboBoxModel) nameCBX.getModel();
            inx = -1;
            cnt = 0;
            for (DBFieldInfo fi : tableInfo.getFields()) {
                model.addElement(fi.getTitle());
                //System.out.println("["+fi.getName()+"]["+fName+"]"); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
                if (fi.getTitle().equals(fName) || fi.getName().equals(fName)) {
                    inx = cnt;
                }
                cnt++;
            }
            for (DBRelationshipInfo ri : tableInfo.getRelationships()) {
                if (ri.getType() == DBRelationshipInfo.RelationshipType.ManyToOne) {
                    model.addElement(ri.getTitle());
                    if (inx == -1) {
                        //System.out.println("*["+ri.getTitle()+"]["+fName+"]");
                        if (ri.getTitle().equals(fName) || ri.getName().equals(fName)) {
                            inx = cnt;
                        }
                    }
                    cnt++;
                }
            }
            nameCBX.getComboBox().setSelectedIndex(inx);
            nameCBX.setEnabled(true);

        } else {
            nameCBX.setEnabled(false);
        }

        if (true) {
            int rowDefsLeft = rowDefs - rows;

            ValComboBox rowSpanCBX = (ValComboBox) formViewObj.getControlByName("rowspancbx"); //$NON-NLS-1$
            DefaultComboBoxModel model = (DefaultComboBoxModel) rowSpanCBX.getModel();
            if (rowDefsLeft == 0) {
                model.addElement("1"); //$NON-NLS-1$
                inx = 0;
                rowSpanCBX.setEnabled(false);

            } else {
                inx = 0;
                cnt = 0;
                for (int i = 1; i <= rowDefsLeft; i++) {
                    model.addElement(Integer.toString(i));
                    if (i == fc.getRowspan()) {
                        inx = cnt;
                    }
                }
                rowSpanCBX.setEnabled(rowDefsLeft > 1);
                rowSpanCBX.getComboBox().setSelectedIndex(inx);
            }

            ValComboBox colSpanCBX = (ValComboBox) formViewObj.getControlByName("colspancbx"); //$NON-NLS-1$
            model = (DefaultComboBoxModel) colSpanCBX.getModel();
            int colDefsLeft = colDefs - cols;
            if (colDefsLeft == 0) {
                model.addElement("1"); //$NON-NLS-1$
                inx = 1;
                colSpanCBX.setEnabled(false);

            } else {
                inx = 0;
                cnt = 0;
                for (int i = 1; i <= colDefsLeft; i++) {
                    model.addElement(Integer.toString(i));
                    if (i == fc.getColspan()) {
                        inx = cnt;
                    }
                }
                colSpanCBX.setEnabled(colDefsLeft > 1);
                colSpanCBX.getComboBox().setSelectedIndex(inx);
            }
        }

        ValCheckBox chkbx = (ValCheckBox) formViewObj.getControlByName("ignoreSetGet"); //$NON-NLS-1$
        chkbx.setSelected(fc.isIgnoreSetGet());

        chkbx = (ValCheckBox) formViewObj.getControlByName("changeListenerOnly"); //$NON-NLS-1$
        chkbx.setSelected(fc.isChangeListenerOnly());
    }

    /**
     * @param fcf
     */
    public void setDataIntoBase(final FormCellField fcf) {
        ValCheckBox chkbx = (ValCheckBox) formViewObj.getControlByName("isRequired"); //$NON-NLS-1$
        chkbx.setSelected(fcf.isRequired());

        chkbx = (ValCheckBox) formViewObj.getControlByName("isReadOnly"); //$NON-NLS-1$
        chkbx.setSelected(fcf.isReadOnly());
    }

    /**
     * @param fcf
     * @param rows
     * @param rowInx
     * @param cols
     * @param colInx
     */
    public void setDataIntoUI(final FormViewDef fvd, final FormCellField fcf, final int rows, final int rowDefs,
            final int rowInx, final int cols, final int colDefs, final int colInx) {
        if (formViewObj == null) {
            return;
        }

        formViewDef = fvd;
        currentFC = fcf;
        data = fcf;

        //viewPanel.getMultiView().setData(fcf);
        int inx;
        int cnt;

        setDataIntoBase(fcf, rows, rowDefs, rowInx, cols, colDefs, colInx, true);
        setDataIntoBase(fcf);

        JTextField typeLabel = (JTextField) formViewObj.getControlByName("type"); //$NON-NLS-1$
        typeLabel.setText(fcf.getUiType().toString());

        /*
        ValComboBox typeCBX = (ValComboBox)formViewObj.getControlByName("typecbx");
        DefaultComboBoxModel model = (DefaultComboBoxModel)typeCBX.getModel();
        inx = -1;
        cnt = 0;
        for (String type : subcontrolHash.keySet())
        {
        model.addElement(type);
        if (type.equals(fcf.getUiType().toString()))
        {
            inx = cnt;
        }
        cnt++;
        }
        typeCBX.getComboBox().setSelectedIndex(inx);*/

        if (fcf.getUiType() == FormCellFieldIFace.FieldType.combobox) {
            DataProviderSessionIFace session = DataProviderFactory.getInstance().createSession();
            List<?> pickLists = session.getDataList(PickList.class);
            ValComboBox pickListCBX = (ValComboBox) formViewObj.getControlByName("picklistcbx"); //$NON-NLS-1$
            DefaultComboBoxModel model = (DefaultComboBoxModel) pickListCBX.getModel();
            inx = 0;
            cnt = 1;

            String dataPickListName = fcf.getPickListName();

            pickList.clear();
            model.addElement(getResourceString("EditorPropPanel.NONE")); //$NON-NLS-1$
            for (Iterator<?> iter = pickLists.iterator(); iter.hasNext();) {
                PickList pl = (PickList) iter.next();
                String name = pl.getName();
                pickList.put(pl.getName(), pl.getIdentityTitle());
                model.addElement(name);
                if (StringUtils.isNotEmpty(dataPickListName) && dataPickListName.equals(name)) {
                    inx = cnt;
                }
                cnt++;
            }
            session.close();
            pickListCBX.getComboBox().setSelectedIndex(inx);

            ValTextArea textArea = (ValTextArea) formViewObj.getControlByName("list"); //$NON-NLS-1$
            String list = fcf.getProperty("list"); //$NON-NLS-1$
            if (list != null) {
                textArea.setText(list);
            }
        }

        multiView.validateAll();
    }

    /**
     * @param fc
     */
    protected void getDataFromUIBase(final FormCell fc) {
        ValComboBox cbx = (ValComboBox) formViewObj.getControlByName("namecbx"); //$NON-NLS-1$
        String fName = (String) cbx.getComboBox().getSelectedItem();
        if (StringUtils.isNotEmpty(fName)) {
            boolean fnd = false;
            for (DBFieldInfo fi : tableInfo.getFields()) {
                System.out.println("[" + fi.getName() + "][" + fName + "]"); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
                if (fi.getTitle().equals(fName) || fi.getName().equals(fName)) {
                    fc.setName(fi.getName());
                    fnd = true;
                }
            }

            if (!fnd) {
                for (DBRelationshipInfo ri : tableInfo.getRelationships()) {
                    if (ri.getType() == DBRelationshipInfo.RelationshipType.ManyToOne) {
                        //System.out.println("*["+ri.getTitle()+"]["+fName+"]");
                        if (ri.getTitle().equals(fName) || ri.getName().equals(fName)) {
                            fc.setName(ri.getName());
                        }
                    }
                }
            }
        }
    }

    /**
     * @param fcf
     */
    protected void getDataFromUIBase(final FormCellField fcf) {
        ValCheckBox chkbx = (ValCheckBox) formViewObj.getControlByName("isRequired"); //$NON-NLS-1$
        fcf.setRequired(chkbx.isSelected());

        chkbx = (ValCheckBox) formViewObj.getControlByName("isReadOnly"); //$NON-NLS-1$
        fcf.setReadOnly(chkbx.isSelected());

    }

    /**
     * @param fc
     */
    protected void getDataFromUI(final FormCell fc) {
        getDataFromUIBase(fc);

        if (fc instanceof FormCellLabel) {
            FormCellLabel fcl = (FormCellLabel) fc;

            ValComboBox cbx = (ValComboBox) formViewObj.getControlByName("labelForCBX"); //$NON-NLS-1$
            int inx = cbx.getComboBox().getSelectedIndex();
            if (inx == 0) {
                fcl.setLabelFor(""); //$NON-NLS-1$
            } else {
                fcl.setLabelFor(getIdForName((String) cbx.getComboBox().getSelectedItem()));
            }

            cbx = (ValComboBox) formViewObj.getControlByName("imageNameCBX"); //$NON-NLS-1$
            inx = cbx.getComboBox().getSelectedIndex();
            if (inx == 0) {
                fcl.setIconName(""); //$NON-NLS-1$
            } else {
                String imgName = (String) cbx.getComboBox().getSelectedItem();
                if (StringUtils.isNotEmpty(imgName)) {
                    fcl.setIconName(getIdForName(imgName));
                } else {
                    fcl.setIconName(getIdForName("")); //$NON-NLS-1$
                }
            }
            ValCheckBox chkbx = (ValCheckBox) formViewObj.getControlByName("isRecordObj"); //$NON-NLS-1$
            fcl.setRecordObj(chkbx.isSelected());

            fcl.setLabel(((ValTextField) formViewObj.getControlByName("label")).getText()); //$NON-NLS-1$
        }

    }

    /**
     * @param fcf
     */
    protected void getDataFromUI(final FormCellField fcf) {
        getDataFromUIBase((FormCell) fcf);
        getDataFromUIBase(fcf);

        if (fcf.getUiType() == FormCellFieldIFace.FieldType.combobox) {
            ValComboBox cbx = (ValComboBox) formViewObj.getControlByName("picklistcbx"); //$NON-NLS-1$
            int inx = cbx.getComboBox().getSelectedIndex();
            if (inx == 0) {
                fcf.setPickListName(""); //$NON-NLS-1$
            } else {
                fcf.setPickListName((String) cbx.getComboBox().getSelectedItem());
            }

            ValTextArea textArea = (ValTextArea) formViewObj.getControlByName("list"); //$NON-NLS-1$
            fcf.getProperties().put("list", textArea.getText()); //$NON-NLS-1$
        }

    }

}