/*
* Copyright 2014 cruxframework.org.
*
* Licensed under the Apache License, Version 2.0 (the "License"); you may not
* use this file except in compliance with the License. You may obtain a copy of
* the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
* License for the specific language governing permissions and limitations under
* the License.
*/
package org.cruxframework.crux.core.client.select;
import java.util.HashMap;
import org.cruxframework.crux.core.client.event.SelectEndEvent;
import org.cruxframework.crux.core.client.event.SelectEvent;
import org.cruxframework.crux.core.client.event.SelectStartEvent;
import org.cruxframework.crux.core.client.screen.Screen;
import com.google.gwt.event.dom.client.ClickEvent;
import com.google.gwt.event.dom.client.ClickHandler;
import com.google.gwt.event.dom.client.MouseDownEvent;
import com.google.gwt.event.dom.client.MouseDownHandler;
import com.google.gwt.event.dom.client.TouchStartEvent;
/**
* SelectEventsHanler Implementation for touch devices that may have mouse support
* @author Thiago da Rosa de Bustamante
* @author Samuel Almeida Cardoso
*
*/
public class SelectEventsHandlerTouchAndMouseImpl extends SelectEventsHandlerTouchImpl implements ClickHandler, MouseDownHandler
{
//Map events to widgets
public static HashMap<SelectableWidget, Boolean> eventProcessed = new HashMap<SelectableWidget, Boolean>();
@Override
public void handleWidget()
{
super.handleWidget();
//iPad handles onTouchStart and onMouseMove as the same event
if(!Screen.isIPad())
{
selectableWidget.addClickHandler(this);
selectableWidget.addMouseDownHandler(this);
}
}
@Override
public void onMouseDown(MouseDownEvent event)
{
Boolean boolEventProcessed = eventProcessed.get(selectableWidget);
if(
//if the event was not processed
boolEventProcessed == null || !boolEventProcessed)
{
SelectStartEvent.fire(selectableWidget);
}
}
@Override
public void onClick(final ClickEvent event)
{
if(!Screen.isIPad())
{
Boolean boolEventProcessed = eventProcessed.get(selectableWidget);
if(
//if the event is already processed
boolEventProcessed != null && boolEventProcessed)
{
eventProcessed.remove(selectableWidget);
return;
}
}
handleClickEvent(event);
}
private void handleClickEvent(ClickEvent event)
{
SelectEndEvent.fire(selectableWidget);
SelectEvent selectEvent = SelectEvent.fire(selectableWidget);
if (selectEvent.isCanceled())
{
event.preventDefault();
}
if (selectEvent.isStopped())
{
event.stopPropagation();
}
}
@Override
public void onTouchStart(TouchStartEvent event)
{
if(!Screen.isIPad())
{
eventProcessed.put(selectableWidget, true);
}
super.onTouchStart(event);
}
}