/*=============================================================================#
 # 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.ui.mode;

import org.eclipse.swt.events.KeyEvent;
import org.eclipse.swt.events.MouseEvent;

import org.eclipse.statet.ecommons.waltable.NatTable;
import org.eclipse.statet.ecommons.waltable.edit.EditUtils;
import org.eclipse.statet.ecommons.waltable.ui.NatEventData;
import org.eclipse.statet.ecommons.waltable.ui.action.IDragMode;
import org.eclipse.statet.ecommons.waltable.ui.action.IKeyAction;
import org.eclipse.statet.ecommons.waltable.ui.action.IMouseAction;
import org.eclipse.statet.ecommons.waltable.ui.binding.UiBindingRegistry;


public class ConfigurableModeEventHandler extends AbstractModeEventHandler {

	private final NatTable natTable;
		
	public ConfigurableModeEventHandler(final ModeSupport modeSupport, final NatTable natTable) {
		super(modeSupport);
		
		this.natTable= natTable;
	}
	
	// Event handling /////////////////////////////////////////////////////////
	
	@Override
	public void keyPressed(final KeyEvent event) {
		final IKeyAction keyAction= this.natTable.getUiBindingRegistry().getKeyEventAction(event);
		if (keyAction != null) {
			this.natTable.forceFocus();
			keyAction.run(this.natTable, event);
		}
	}
	
	@Override
	public void mouseDown(final MouseEvent event) {
		if (EditUtils.commitAndCloseActiveEditor()) {
			final IMouseAction mouseDownAction= this.natTable.getUiBindingRegistry().getMouseDownAction(event);
			if (mouseDownAction != null) {
				event.data= NatEventData.createInstanceFromEvent(event);
				mouseDownAction.run(this.natTable, event);
			}
			
			final IMouseAction singleClickAction= getUiBindingRegistry().getSingleClickAction(event);
			final IMouseAction doubleClickAction= getUiBindingRegistry().getDoubleClickAction(event);
			final IDragMode dragMode= this.natTable.getUiBindingRegistry().getDragMode(event);
			
			if (singleClickAction != null || doubleClickAction != null || dragMode != null) {
				switchMode(new MouseModeEventHandler(getModeSupport(), this.natTable, event, singleClickAction, doubleClickAction, dragMode));
			}
		}
	}

	@Override
	public synchronized void mouseMove(final MouseEvent event) {
		if (event.x >= 0 && event.y >= 0) {
			final IMouseAction mouseMoveAction= getUiBindingRegistry().getMouseMoveAction(event);
			if (mouseMoveAction != null) {
				event.data= NatEventData.createInstanceFromEvent(event);
				mouseMoveAction.run(this.natTable, event);
			} else {
				this.natTable.setCursor(null);
			}
		}
	}

	@Override
	public synchronized void mouseHover(final MouseEvent event) {
		if (event.x >= 0 && event.y >= 0) {
			final IMouseAction mouseHoverAction= getUiBindingRegistry().getMouseHoverAction(event);
			if (mouseHoverAction != null) {
				event.data= NatEventData.createInstanceFromEvent(event);
				mouseHoverAction.run(this.natTable, event);
			}
		}
	}

	@Override
	public synchronized void mouseEnter(final MouseEvent event) {
		if (event.x >= 0 && event.y >= 0) {
			final IMouseAction mouseEnterAction= getUiBindingRegistry().getMouseEnterAction(event);
			if (mouseEnterAction != null) {
				event.data= NatEventData.createInstanceFromEvent(event);
				mouseEnterAction.run(this.natTable, event);
			} else {
				this.natTable.setCursor(null);
			}
		}
	}

	@Override
	public synchronized void mouseExit(final MouseEvent event) {
		if (event.x >= 0 && event.y >= 0) {
			final IMouseAction mouseExitAction= getUiBindingRegistry().getMouseExitAction(event);
			if (mouseExitAction != null) {
				event.data= NatEventData.createInstanceFromEvent(event);
				mouseExitAction.run(this.natTable, event);
			} else {
				this.natTable.setCursor(null);
			}
		}
	}
	
	private UiBindingRegistry getUiBindingRegistry() {
		return this.natTable.getUiBindingRegistry();
	}

}
