/*******************************************************************************
 * Copyright (c) 2016 ALL4TEC & CEA LIST.
 * All rights reserved. This program and the accompanying materials
 * are made available under the terms of the Eclipse Public License 2.0
 * which accompanies this distribution, and is available at
 * https://www.eclipse.org/legal/epl-2.0/
 *
 * SPDX-License-Identifier: EPL-2.0
 * 
 * Contributors:
 *     ALL4TEC & CEA LIST - initial API and implementation
 ******************************************************************************/
package org.polarsys.esf.core.common.ui.view;

import org.apache.commons.lang3.StringUtils;
import org.eclipse.jface.viewers.ColumnLabelProvider;
import org.eclipse.jface.viewers.EditingSupport;
import org.eclipse.jface.viewers.TreeViewer;
import org.eclipse.jface.viewers.TreeViewerColumn;
import org.eclipse.swt.SWT;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.ui.views.properties.PropertyColumnLabelProvider;
import org.polarsys.esf.core.common.ui.editingsupport.ValidatedPropertyEditingSupport;

/**
 * Abstract base of all the Pages to use in a PageBookView,
 * and which contains a tree table as viewer.
 * 
 * This page inherits of all the standard mechanisms like the filters, the editing domain mechanisms, etc.
 * 
 * @author  $Author: jdumont $
 * @version $Revision: 83 $
 */
public abstract class AbstractTreeTablePage
    extends AbstractTreePage {

    /**
     * A constructor that takes the array of columns name to create in the tree table. 
     * This constructor is used in the case of adding of the columns visibility action.
     * 
     * @param pRequiredColumnName The name of the required column name that can't be hidden
     * @param pColumnsName The column names list. This list must not contain the requiredColumnName
     * @param pReadOnlyMode <code>true</code>if this view is in mode read only <code>false</code> otherwise
     */
    public AbstractTreeTablePage(
        final String pRequiredColumnName,
        final String[] pColumnsName,
        final boolean pReadOnlyMode) {
        super(pRequiredColumnName, pColumnsName, pReadOnlyMode);
    }

    /**
     * {@inheritDoc}
     */
    @Override
    protected TreeViewerColumn createRequiredViewerColumn() {
        // Get the name of the required column
        String vColumnName = getRequiredColumnName();
        
        // If the name is not valid, set a default empty value
        if (StringUtils.isEmpty(vColumnName)) {
            vColumnName = StringUtils.EMPTY;
        }
        
        // Create the required column at the beginning, and set its width
        final TreeViewerColumn vTreeViewerColumn = createViewerColumn(vColumnName, 0);
        vTreeViewerColumn.getColumn().setWidth(150);
        
        return vTreeViewerColumn;
    }

    /**
     * {@inheritDoc}
     */
    @Override
    protected TreeViewer createViewer(final Composite pParent) {
        
        // Create a tree viewer allowing multiple selection 
        final TreeViewer vTreeViewer = new TreeViewer(pParent, SWT.MULTI | SWT.FULL_SELECTION);

        // Set the tree lines and header visible
        // NB : Don't call directly the methods 'setLinesVisible' and 'setHeaderVisible' 
        //      of this instance as the tree is not already created and initialised 
        vTreeViewer.getTree().setLinesVisible(true);
        vTreeViewer.getTree().setHeaderVisible(true);
        return vTreeViewer;
    }

    /**
     * {@inheritDoc}
     */
    @Override
    protected TreeViewerColumn createViewerColumn(final String pColumnName, final int pIndex) {
        
        // Create a new column at the given index
        final TreeViewerColumn vTreeViewerColumn = new TreeViewerColumn(getViewer(), SWT.LEFT, pIndex);
        vTreeViewerColumn.getColumn().setText(pColumnName);
        vTreeViewerColumn.getColumn().pack();
        
        return vTreeViewerColumn;
    }

    /**
     * {@inheritDoc}
     */
    @Override
    protected TreeViewerColumn createViewerColumn(final String pColumnName) {
        return createViewerColumn(pColumnName, getViewer().getTree().getColumnCount());
    }

    /**
     * {@inheritDoc}
     */
    @Override
    protected TreeViewerColumn createViewerColumn(
        final String pColumnName, 
        final ColumnLabelProvider pColumnLabelProvider) {
        
        // Create a new column
        final TreeViewerColumn vTreeViewerColumn = createViewerColumn(pColumnName);
        
        // Set the column label provider with the instance given in parameter
        vTreeViewerColumn.setLabelProvider(pColumnLabelProvider);
        
        return vTreeViewerColumn;
    }

    /**
     * {@inheritDoc}
     */
    @Override
    protected TreeViewerColumn createViewerColumn(
        final String pColumnName,
        final ColumnLabelProvider pColumnLabelProvider,
        final EditingSupport pEditingSupport) {
        
        // Create a new column
        final TreeViewerColumn vTreeViewerColumn = createViewerColumn(pColumnName);
        
        // Set the column label provider and editing support
        // with the instance given in parameter
        vTreeViewerColumn.setLabelProvider(pColumnLabelProvider);
        vTreeViewerColumn.setEditingSupport(pEditingSupport);
        return vTreeViewerColumn;
    }

    /**
     * {@inheritDoc}
     */
    @Override
    protected TreeViewerColumn createViewerColumn(final String pColumnName, final String pPropertyID) {
        
        // Create a new column
        final TreeViewerColumn vTreeViewerColumn = createViewerColumn(pColumnName);
        
        // Set the column label provider and editing support based on the property whose
        // id is given in parameter
        vTreeViewerColumn.setLabelProvider(new PropertyColumnLabelProvider(getPropertySourceProvider(), pPropertyID));
        vTreeViewerColumn.setEditingSupport(
            new ValidatedPropertyEditingSupport(
                getViewer(), 
                getPropertySourceProvider(), 
                pPropertyID,
                getActionBars().getStatusLineManager()));
        
        return vTreeViewerColumn;
    }
}
