package Tabellen;

import java.awt.Color;
import java.awt.Component;
import java.awt.FlowLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import javax.swing.AbstractCellEditor;
import javax.swing.Action;
import javax.swing.Icon;
import javax.swing.JButton;
import javax.swing.JPanel;
import javax.swing.JTable;
import javax.swing.UIManager;
import javax.swing.border.Border;
import javax.swing.border.LineBorder;
import javax.swing.table.TableCellEditor;
import javax.swing.table.TableCellRenderer;
import javax.swing.table.TableColumnModel;

/**
 * Ein Editor und Renderer für mehrere Buttons in einer Splate einer Tabelle
 * übernommen und angepasst von 
 * Nach diversen Ideen aus dem Netz
 * @author Mag. Stefan Hagmann
 */
class ButtonsInColumn extends AbstractCellEditor
	implements TableCellRenderer, TableCellEditor, ActionListener, MouseListener{
    private final JTable table;
    private final Border border;
    private Border fborder;
    private int mnemonic;
    private Object editorValue;
    private boolean isButtonColumnEditor;
    //die Buttons sind in diesem Container
    private JPanel container;
    private final Action[] actions;
    private final JButton[] btns;

    /**
     * Erzeugt einen Button in einer Spalte
     * @param table die Tabelle
     * @param btns alle Buttons
     * @param actions die ausglösten Aktionen beim klicken
     * @param column die Spalte
     */
    public ButtonsInColumn(JTable table, JButton[] btns, Action[] actions, int column)
    {
        this.table = table;
        this.actions = actions;
        this.btns = btns;

        //Buttons mit Listener belegen
        for(JButton btn:btns){
          btn.setFocusPainted( false );
          btn.addActionListener(this);
        }
        border = btns[0].getBorder();
        setFocusBorder( new LineBorder(Color.BLUE) );

        TableColumnModel columnModel = table.getColumnModel();
        columnModel.getColumn(column).setCellRenderer( this );
        columnModel.getColumn(column).setCellEditor( this );
        table.addMouseListener( this );
        
        //Buttons zum Panel adden
        container = new JPanel(new FlowLayout(FlowLayout.CENTER, 0, 0));
        for(JButton btn:btns){
          container.add(btn);
        }
    }

    /**
     *  Border wenn Focus 
     *  @param focusBorder der Border
     */
    private void setFocusBorder(Border focusBorder)
    {
        this.fborder = focusBorder;
        for(JButton btn:btns){
          btn.setBorder( focusBorder );
        }
    }
    
    /**
     * Welche Tastenkombination darf es sein
     * buttonColumn.setMnemonic(KeyEvent.VK_D);
     * @return 
     */
    public int getMnemonic()
    {
        return mnemonic;
    }

    /**
     *  The mnemonic to activate the button when the cell has focus
     *  buttonColumn.setMnemonic(KeyEvent.VK_D);
     *  @param mnemonic the mnemonic
     */
    public void setMnemonic(int mnemonic)
    {
        this.mnemonic = mnemonic;
        for(JButton btn:btns){
            btn.setMnemonic(mnemonic);
        }
    }

    @Override
    public Object getCellEditorValue() {
        return editorValue;
    }

    @Override
    public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) {
        for(JButton btn:btns){
        if (isSelected)
        {
            btn.setForeground(table.getSelectionForeground());
            btn.setBackground(table.getSelectionBackground());
        }
        else
        {
            btn.setForeground(table.getForeground());
            btn.setBackground(UIManager.getColor("Button.background"));
        }

        if (hasFocus)
        {
            btn.setBorder(fborder);
        }
        else
        {
            btn.setBorder(border);
        }
        }

        //Panel zum Rendern zurückgeben
        return container;
    }

    @Override
    public Component getTableCellEditorComponent(JTable table, Object value, boolean isSelected, int row, int column) {
        this.editorValue = value;
        //Panel zurückgeben
        return container;
    }

    @Override
    public void actionPerformed(ActionEvent e)
    {
        int row = table.convertRowIndexToModel( table.getEditingRow() );
        fireEditingStopped();
        //  Invoke the Action
        ActionEvent event = new ActionEvent(
                table,
                ActionEvent.ACTION_PERFORMED,
                "" + row);
        //Welche Aktion von welchem Button?
        for(int i=0; i<btns.length; i++){
            if(e.getSource().equals(btns[i])){
                actions[i].actionPerformed(event);
            }
        }
    }

    /*
     *  When the mouse is pressed the editor is invoked. If you then then drag
     *  the mouse to another cell before releasing it, the editor is still
     *  active. Make sure editing is stopped when the mouse is released.
     */
    @Override
    public void mousePressed(MouseEvent e) {
        if (table.isEditing()
                &&  table.getCellEditor() == this)
            isButtonColumnEditor = true;
    }

    @Override
    public void mouseReleased(MouseEvent e) {
        if (isButtonColumnEditor
    	&&  table.isEditing())
            table.getCellEditor().stopCellEditing();
        isButtonColumnEditor = false;
    }
    
    @Override
    public void mouseClicked(MouseEvent e) {}

    @Override
    public void mouseEntered(MouseEvent e) {}

    @Override
    public void mouseExited(MouseEvent e) {}

}

