package org.hy.hbase.event;

import java.awt.Color;
import java.awt.event.ActionEvent;
import java.util.Hashtable;
import java.util.Iterator;
import java.util.Map;

import javax.swing.JComponent;
import javax.swing.JTable;
import javax.swing.text.JTextComponent;

import org.hy.common.JavaHelp;
import org.hy.common.hbase.HData;
import org.hy.common.ui.JButton;
import org.hy.common.ui.JButtonOnClickTransaction;
import org.hy.common.ui.JComboBox;
import org.hy.common.xml.XJava;





/**
 * 结果集编辑面板中的提交按钮事件
 *
 * @author   ZhengWei(HY)
 * @version  V1.0  2014-06-02
 */
public class EditSubmitActionListener extends BaseEvent implements JButtonOnClickTransaction
{
    private Map<String ,Object>        editDatas;
    
    private JComponent                 myself;
    
    
    
    public EditSubmitActionListener()
    {
        this.editDatas = new Hashtable<String ,Object>();
    }
    
    

    @Override
    public void onClick(ActionEvent arg0)
    {
        HData v_HData = new HData();
        
        v_HData.setRowKey(    ((JTextComponent)XJava.getObject("Edit_RowKey"))     .getText().trim());
        v_HData.setFamilyName(((JComboBox)     XJava.getObject("Edit_FamilyName")) .getSelectedItem().toString().trim());
        v_HData.setColumnName(((JComboBox)     XJava.getObject("Edit_ColumnName")) .getSelectedItem().toString().trim());
        v_HData.setValue(     ((JTextComponent)XJava.getObject("Edit_ColumnValue")).getText().trim());
        
        if ( JavaHelp.isNull(v_HData.getRowKey()) )
        {
            this.getAppFrame().showHintInfo("提交时,行主键不能为空!" ,Color.RED);
            ((JComponent)XJava.getObject("Edit_RowKey")).requestFocus();
            return;
        }
        
        if ( JavaHelp.isNull(v_HData.getFamilyName()) )
        {
            this.getAppFrame().showHintInfo("提交时,列族名不能为空!" ,Color.RED);
            ((JComponent)XJava.getObject("Edit_FamilyName")).requestFocus();
            return;
        }
        
        if ( JavaHelp.isNull(v_HData.getColumnName()) )
        {
            this.getAppFrame().showHintInfo("提交时,字段名不能为空!" ,Color.RED);
            ((JComponent)XJava.getObject("Edit_ColumnName")).requestFocus();
            return;
        }
        
        try
        {
            HData v_OldHData = (HData)this.getHBase().getValue(this.getTableName() ,v_HData);
            
            this.getHBase().update(this.getTableName() ,v_HData);
            
            // 重新从数据库是查询一次,主要想获取时间戳
            HData v_NewHData = (HData)this.getHBase().getValue(this.getTableName() ,v_HData);
            
            JTable  v_JTable  = (JTable)XJava.getObject("xtDataList");
            int     v_RowNo   = v_JTable.getSelectedRow();
            int     v_OptType = 1; // 操作类型(0:修改   1:添加)
            
            if ( v_JTable.getSelectedRowCount() == 1 )
            {
                if ( v_NewHData.getRowKey().equals(v_JTable.getValueAt(v_RowNo ,1)) )
                {
                    if ( v_NewHData.getFamilyName().equals(v_JTable.getValueAt(v_RowNo ,2)) )
                    {
                        if ( v_NewHData.getColumnName().equals(v_JTable.getValueAt(v_RowNo ,3)) )
                        {
                            v_OptType = 0;
                        }
                    }
                }
            }
            
            if ( v_OptType == 0 )
            {
                v_JTable.setValueAt(v_NewHData.getValue().toString()    ,v_RowNo ,4);
                v_JTable.setValueAt(v_NewHData.getTimestamp()           ,v_RowNo ,5);
                v_JTable.setValueAt(v_NewHData.getTime().getFullMilli() ,v_RowNo ,6);
                this.getAppFrame().showHintInfo("修改完成!" ,Color.BLUE);
            }
            else
            {
                this.getAppFrame().setRowCount(this.getAppFrame().getRowCount() + 1);
                this.getAppFrame().getTableModel().addRow(SubmitActionListener.$MY.toObjects(this.getAppFrame().getRowCount() ,v_NewHData));
                
                if ( v_OldHData != null )
                {
                    this.getAppFrame().showHintInfo("修改完成,请刷新查询结果。" ,Color.BLUE);
                }
                else
                {
                    this.getAppFrame().showHintInfo("添加完成!" ,Color.BLUE);
                }
            }
            
        }
        catch (Exception exce)
        {
            this.getAppFrame().showHintInfo("修改异常:" + exce.getMessage() ,Color.RED);
        }
    }

    
    
    @Override
    public void transactionBefore(ActionEvent i_ActionEvent)
    {
        this.myself = ((JComponent)(i_ActionEvent.getSource()));
        
        // 所有编码控件及按钮本身都失效
        this.setEditDatasEnabled(false);
        
        this.getAppFrame().setTables_Tools_Edit_Enabled(false);
        
        ((JComponent)XJava.getObject("xpResultInfo")).setEnabled(false);
    }

    
    
    @Override
    public void transactionAfter(ActionEvent i_ActionEvent)
    {
        // 所有编码控件及按钮本身都有效
        this.setEditDatasEnabled(true);
        
        this.getAppFrame().setTables_Tools_Edit_Enabled(true);
        
        if ( this.getHPage().getRowKey() == null )
        {
            ((JButton) XJava.getObject("xbNextPage")).setEnabled(false);
            ((JButton) XJava.getObject("xbLastPage")).setEnabled(false);
        }
        
        ((JComponent)XJava.getObject("xpResultInfo")).setEnabled(true);
    }
    
    
    
    /**
     * 设置所有查询条件控件是否有效
     * 
     * @param i_Visible
     */
    public void setEditDatasEnabled(boolean i_Enabled)
    {
        // 先设置事情源本身
        this.myself.setEnabled(i_Enabled);
        
        Iterator<?> v_Iterator = this.editDatas.values().iterator();
        
        while ( v_Iterator.hasNext() )
        {
            Object v_QueryCondition = v_Iterator.next();
            
            if ( v_QueryCondition instanceof JComponent )
            {
                JComponent v_QC = (JComponent)v_QueryCondition;
                
                v_QC.setEnabled(i_Enabled);
            }
        }
    }



    public Map<String ,Object> getEditDatas()
    {
        return editDatas;
    }



    public void setEditDatas(Map<String ,Object> editDatas)
    {
        this.editDatas = editDatas;
    }
    
}