/*******************************************************************************
 * Copyright (c) 2012, 2020 Original authors and others.
 *
 * This program and the accompanying materials are made
 * available under the terms of the Eclipse Public License 2.0
 * which is available at https://www.eclipse.org/legal/epl-2.0/
 *
 * SPDX-License-Identifier: EPL-2.0
 *
 * Contributors:
 *     Original authors and others - initial API and implementation
 ******************************************************************************/
package org.eclipse.nebula.widgets.nattable.examples.fixtures;

import java.util.Map;

import org.eclipse.nebula.widgets.nattable.config.IConfigRegistry;
import org.eclipse.nebula.widgets.nattable.data.IColumnPropertyAccessor;
import org.eclipse.nebula.widgets.nattable.data.IDataProvider;
import org.eclipse.nebula.widgets.nattable.extension.glazedlists.GlazedListsSortModel;
import org.eclipse.nebula.widgets.nattable.grid.data.DefaultColumnHeaderDataProvider;
import org.eclipse.nebula.widgets.nattable.grid.layer.ColumnHeaderLayer;
import org.eclipse.nebula.widgets.nattable.grid.layer.DefaultColumnHeaderDataLayer;
import org.eclipse.nebula.widgets.nattable.layer.AbstractLayerTransform;
import org.eclipse.nebula.widgets.nattable.layer.DataLayer;
import org.eclipse.nebula.widgets.nattable.layer.stack.DefaultBodyLayerStack;
import org.eclipse.nebula.widgets.nattable.sort.SortHeaderLayer;
import org.eclipse.nebula.widgets.nattable.util.IClientAreaProvider;

import ca.odell.glazedlists.SortedList;

/**
 * Column header layer stack, with a {@link SortHeaderLayer}. Utilizes
 * {@link GlazedListsSortModel} for sorting
 */
public class GlazedListsColumnHeaderLayerStack<T> extends
        AbstractLayerTransform {
    private IDataProvider dataProvider;
    private DefaultColumnHeaderDataLayer dataLayer;
    private ColumnHeaderLayer columnHeaderLayer;

    public GlazedListsColumnHeaderLayerStack(String[] propertyNames,
            Map<String, String> propertyToLabelMap, SortedList<T> sortedList,
            IColumnPropertyAccessor<T> columnPropertyAccessor,
            IConfigRegistry configRegistry, DefaultBodyLayerStack bodyLayerStack) {

        this(new DefaultColumnHeaderDataProvider(propertyNames,
                propertyToLabelMap), sortedList, columnPropertyAccessor,
                configRegistry, bodyLayerStack);
    }

    public GlazedListsColumnHeaderLayerStack(IDataProvider dataProvider,
            SortedList<T> sortedList,
            IColumnPropertyAccessor<T> columnPropertyAccessor,
            IConfigRegistry configRegistry, DefaultBodyLayerStack bodyLayerStack) {

        this.dataProvider = dataProvider;
        this.dataLayer = new DefaultColumnHeaderDataLayer(dataProvider);
        this.columnHeaderLayer = new ColumnHeaderLayer(this.dataLayer, bodyLayerStack,
                bodyLayerStack.getSelectionLayer());

        SortHeaderLayer<T> sortHeaderLayer = new SortHeaderLayer<>(
                this.columnHeaderLayer, new GlazedListsSortModel<>(sortedList,
                        columnPropertyAccessor, configRegistry, this.dataLayer),
                false);

        setUnderlyingLayer(sortHeaderLayer);
    }

    @Override
    public void setClientAreaProvider(IClientAreaProvider clientAreaProvider) {
        super.setClientAreaProvider(clientAreaProvider);
    }

    public DataLayer getDataLayer() {
        return this.dataLayer;
    }

    public IDataProvider getDataProvider() {
        return this.dataProvider;
    }

    public ColumnHeaderLayer getColumnHeaderLayer() {
        return this.columnHeaderLayer;
    }
}
