/*=============================================================================#
 # Copyright (c) 2012, 2021 Original NatTable 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 NatTable authors and others - initial API and implementation
 #=============================================================================*/

package org.eclipse.statet.ecommons.waltable.config;

import java.util.Collection;
import java.util.LinkedList;

import org.eclipse.statet.ecommons.waltable.layer.ILayer;
import org.eclipse.statet.ecommons.waltable.ui.binding.UiBindingRegistry;


/**
 * Aggregates {@link IConfiguration} objects and invokes configure methods on all its members.
 */
public class AggregateConfiguration implements IConfiguration {

	private final Collection<IConfiguration> configurations= new LinkedList<>();

	public void addConfiguration(final IConfiguration configuration) {
		this.configurations.add(configuration);
	}

	@Override
	public void configureLayer(final ILayer layer) {
		for (final IConfiguration configuration : this.configurations) {
			configuration.configureLayer(layer);
		}
	}

	@Override
	public void configureRegistry(final IConfigRegistry configRegistry) {
		for (final IConfiguration configuration : this.configurations) {
			configuration.configureRegistry(configRegistry);
		}
	}

	@Override
	public void configureUiBindings(final UiBindingRegistry uiBindingRegistry) {
		for (final IConfiguration configuration : this.configurations) {
			configuration.configureUiBindings(uiBindingRegistry);
		}
	}

}
