/*******************************************************************************
 * Copyright (c) 2017 Pegasystems Inc. All rights reserved.
 *
 * Contributors:
 *     Manu Varghese
 *******************************************************************************/

package com.pega.gcs.tracerviewer;

import javax.swing.JTable;
import javax.swing.border.EmptyBorder;
import javax.swing.table.DefaultTableColumnModel;
import javax.swing.table.TableCellRenderer;
import javax.swing.table.TableColumn;
import javax.swing.table.TableColumnModel;

import com.pega.gcs.fringecommon.guiutilities.treetable.AbstractTreeTable;
import com.pega.gcs.fringecommon.guiutilities.treetable.AbstractTreeTableTreeModel;
import com.pega.gcs.fringecommon.guiutilities.treetable.DefaultTreeTableTree;
import com.pega.gcs.fringecommon.guiutilities.treetable.DefaultTreeTableTreeCellRenderer;
import com.pega.gcs.fringecommon.guiutilities.treetable.DefaultTreeTableTreeModel;
import com.pega.gcs.fringecommon.guiutilities.treetable.TreeTableCellEditor;
import com.pega.gcs.fringecommon.guiutilities.treetable.TreeTableColumn;
import com.pega.gcs.fringecommon.guiutilities.treetable.TreeTableModelAdapter;

public class TraceTreeTable extends AbstractTreeTable {

    private static final long serialVersionUID = -7613230824104399834L;

    public TraceTreeTable(DefaultTreeTableTreeModel traceTreeTableModel, TraceTableModel traceTableModel) {

        super(traceTreeTableModel, 20, 30);

        initialize(traceTreeTableModel, traceTableModel);

    }

    private void initialize(DefaultTreeTableTreeModel traceTreeTableModel, TraceTableModel traceTableModel) {
        TraceTreeTableModelAdapter traceTreeTableModelAdapter;

        traceTreeTableModelAdapter = (TraceTreeTableModelAdapter) getModel();
        traceTreeTableModelAdapter.setTraceTableModel(traceTableModel);

        setAutoResizeMode(JTable.AUTO_RESIZE_OFF);
    }

    @Override
    protected DefaultTreeTableTree constructTree(AbstractTreeTableTreeModel abstractTreeTableModel) {

        DefaultTreeTableTreeCellRenderer defaultTreeTableTreeCellRenderer;

        defaultTreeTableTreeCellRenderer = new DefaultTreeTableTreeCellRenderer(this);
        defaultTreeTableTreeCellRenderer.setOpenIcon(null);
        defaultTreeTableTreeCellRenderer.setClosedIcon(null);
        defaultTreeTableTreeCellRenderer.setLeafIcon(null);

        TraceTreeTableTree defaultTreeTableTree = new TraceTreeTableTree(this, abstractTreeTableModel,
                defaultTreeTableTreeCellRenderer);

        defaultTreeTableTree.setRootVisible(false);
        defaultTreeTableTree.setShowsRootHandles(true);

        return defaultTreeTableTree;
    }

    @Override
    protected TreeTableModelAdapter getTreeTableModelAdapter(DefaultTreeTableTree tree) {

        TraceTreeTableModelAdapter traceTreeTableModelAdapter;
        traceTreeTableModelAdapter = new TraceTreeTableModelAdapter(tree);

        return traceTreeTableModelAdapter;
    }

    @Override
    protected void setTreeTableColumnModel() {

        TreeTableModelAdapter model = (TreeTableModelAdapter) getModel();
        TableColumnModel tableColumnModel = new DefaultTableColumnModel();

        for (int i = 0; i < model.getColumnCount(); i++) {

            TableColumn tableColumn = new TableColumn(i);

            TreeTableColumn treeTableColumn = model.getColumn(i);

            String text = treeTableColumn.getDisplayName();

            Class<?> columnClass = treeTableColumn.getColumnClass();

            int preferredWidth = treeTableColumn.getPrefColumnWidth();

            tableColumn.setHeaderValue(text);
            tableColumn.setPreferredWidth(preferredWidth);

            TableCellRenderer tcr = null;

            if (TreeTableColumn.TREE_COLUMN_CLASS.equals(columnClass)) {

                DefaultTreeTableTree treeTableTree = getTree();
                tcr = treeTableTree;
                tableColumn.setCellEditor(new TreeTableCellEditor(treeTableTree));
            } else {

                TraceTreeTableCellRenderer ltcr = new TraceTreeTableCellRenderer();
                ltcr.setBorder(new EmptyBorder(1, 3, 1, 1));
                ltcr.setHorizontalAlignment(treeTableColumn.getHorizontalAlignment());

                tableColumn.setCellEditor(new TreeTableCellEditor(ltcr));

                tcr = ltcr;
            }

            tableColumn.setCellRenderer(tcr);

            tableColumn.setResizable(true);

            tableColumnModel.addColumn(tableColumn);
        }

        setColumnModel(tableColumnModel);
    }

}