/*=============================================================================#
 # Copyright (c) 2013, 2021 Dirk Fauth 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:
 #     Dirk Fauth <dirk.fauth@gmail.com> - initial API and implementation
 #=============================================================================*/

package org.eclipse.statet.ecommons.waltable.ui.menu;

import org.eclipse.swt.SWT;
import org.eclipse.swt.events.DisposeEvent;
import org.eclipse.swt.events.DisposeListener;
import org.eclipse.swt.widgets.Menu;

import org.eclipse.statet.ecommons.waltable.NatTable;
import org.eclipse.statet.ecommons.waltable.config.AbstractUiBindingConfiguration;
import org.eclipse.statet.ecommons.waltable.grid.GridRegion;
import org.eclipse.statet.ecommons.waltable.ui.binding.UiBindingRegistry;
import org.eclipse.statet.ecommons.waltable.ui.matcher.MouseEventMatcher;


/**
 * Abstract implementation for adding header menus to a NatTable.
 * There will be header menus attached to the column header, the row header
 * and the corner region. By default empty menus will be attached, which will
 * result in not showing a menu. On creating a specialized header menu configuration
 * you can choose for which header region you want to add a menu.
 */
public class AbstractHeaderMenuConfiguration extends AbstractUiBindingConfiguration {

	/**
	 * The column header menu.
	 */
	private final Menu colHeaderMenu;
	/**
	 * The row header menu
	 */
	private final Menu rowHeaderMenu;
	/**
	 * The corner region menu
	 */
	private final Menu cornerMenu;

	/**
	 * Creates a header menu configuration that attaches menus to the row header,
	 * the column header and the corner region.
	 */
	public AbstractHeaderMenuConfiguration(final NatTable natTable) {
		this.colHeaderMenu= createColumnHeaderMenu(natTable).build();
		this.rowHeaderMenu= createRowHeaderMenu(natTable).build();
		this.cornerMenu= createCornerMenu(natTable).build();
		
		//ensure that the menus will be disposed when the NatTable is disposed
		natTable.addDisposeListener(new DisposeListener() {

			@Override
			public void widgetDisposed(final DisposeEvent e) {
				if (AbstractHeaderMenuConfiguration.this.colHeaderMenu != null) {
					AbstractHeaderMenuConfiguration.this.colHeaderMenu.dispose();
				}
				
				if (AbstractHeaderMenuConfiguration.this.rowHeaderMenu != null) {
					AbstractHeaderMenuConfiguration.this.rowHeaderMenu.dispose();
				}
				
				if (AbstractHeaderMenuConfiguration.this.cornerMenu != null) {
					AbstractHeaderMenuConfiguration.this.cornerMenu.dispose();
				}
			}

		});
	}

	/**
	 * Creates the {@link PopupMenuBuilder} for the column header menu with the menu 
	 * items that should be added to the menu.
	 * @param natTable The NatTable where the menu should be attached.
	 * @return The {@link PopupMenuBuilder} that is used to build the column 
	 * 			header menu.
	 */
	protected PopupMenuBuilder createColumnHeaderMenu(final NatTable natTable) {
		return new PopupMenuBuilder(natTable);
	}

	/**
	 * Creates the {@link PopupMenuBuilder} for the row header menu with the menu 
	 * items that should be added to the menu.
	 * @param natTable The NatTable where the menu should be attached.
	 * @return The {@link PopupMenuBuilder} that is used to build the row 
	 * 			header menu.
	 */
	protected PopupMenuBuilder createRowHeaderMenu(final NatTable natTable) {
		return new PopupMenuBuilder(natTable);
	}
	
	/**
	 * Creates the {@link PopupMenuBuilder} for the corner menu with the menu 
	 * items that should be added to the menu.
	 * @param natTable The NatTable where the menu should be attached.
	 * @return The {@link PopupMenuBuilder} that is used to build the corner menu. 
	 */
	protected PopupMenuBuilder createCornerMenu(final NatTable natTable) {
		return new PopupMenuBuilder(natTable);
	}
	
	/* (non-Javadoc)
	 * @see org.eclipse.statet.ecommons.waltable.config.IConfiguration#configureUiBindings(org.eclipse.statet.ecommons.waltable.ui.binding.UiBindingRegistry)
	 */
	@Override
	public void configureUiBindings(final UiBindingRegistry uiBindingRegistry) {
		if (this.colHeaderMenu != null) {
			uiBindingRegistry.registerMouseDownBinding(
					new MouseEventMatcher(SWT.NONE, GridRegion.COLUMN_HEADER, MouseEventMatcher.RIGHT_BUTTON),
					new PopupMenuAction(this.colHeaderMenu));
		}

		if (this.rowHeaderMenu != null) {
			uiBindingRegistry.registerMouseDownBinding(
					new MouseEventMatcher(SWT.NONE, GridRegion.ROW_HEADER, MouseEventMatcher.RIGHT_BUTTON),
					new PopupMenuAction(this.rowHeaderMenu));
		}

		if (this.cornerMenu != null) {
			uiBindingRegistry.registerMouseDownBinding(
					new MouseEventMatcher(SWT.NONE, GridRegion.CORNER, MouseEventMatcher.RIGHT_BUTTON),
					new PopupMenuAction(this.cornerMenu));
		}
	}

}
