/*
* Copyright 2011 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.smartfaces.client.rollingpanel;
import java.util.HashMap;
import org.cruxframework.crux.smartfaces.client.backbone.common.FacesBackboneResourcesCommon;
import com.google.gwt.core.client.Scheduler;
import com.google.gwt.core.client.Scheduler.ScheduledCommand;
import com.google.gwt.user.client.ui.FlowPanel;
import com.google.gwt.user.client.ui.ScrollPanel;
import com.google.gwt.user.client.ui.Widget;
/**
* @author Thiago da Rosa de Bustamante
* @author Samuel Almeida Cardoso
*
*/
class RollingPanelTouchImpl extends ScrollPanel implements RollingPanel.PanelImplementation
{
static final String DEFAULT_ITEM_STYLE_NAME = "faces-itemRollingPanel";
static final String DEFAULT_ITEM_WRAPPER_STYLE_NAME = "faces-itemWrapperRollingPanel";
private HashMap<Widget,WrappedWidget> items = new HashMap<Widget,WrappedWidget>();
private FlowPanel itemsContainer = new FlowPanel();
private boolean scrollToAddedWidgets = false;
public RollingPanelTouchImpl()
{
itemsContainer.setStyleName(DEFAULT_ITEM_WRAPPER_STYLE_NAME);
itemsContainer.addStyleName(FacesBackboneResourcesCommon.INSTANCE.css().flexBoxHorizontalContainer());
super.add(itemsContainer);
}
@Override
public void add(final Widget child)
{
itemsContainer.add(createItem(child));
if (scrollToAddedWidgets)
{
Scheduler.get().scheduleDeferred(new ScheduledCommand()
{
public void execute()
{
scrollToWidget(child);
}
});
}
}
@Override
public int getScrollPosition()
{
return getElement().getScrollLeft();
}
@Override
public Widget getWidget(int index)
{
if(items.values() != null)
{
for (WrappedWidget wrappedWidget : items.values())
{
if(wrappedWidget.index == index)
{
return wrappedWidget.widget;
}
}
}
return null;
}
@Override
public int getWidgetCount()
{
return items.size();
}
@Override
public int getWidgetIndex(Widget child)
{
return items.get(child).index;
}
@Override
public void insert(final Widget widget, int i)
{
itemsContainer.insert(createItem(widget), i);
if (scrollToAddedWidgets)
{
Scheduler.get().scheduleDeferred(new ScheduledCommand()
{
public void execute()
{
scrollToWidget(widget);
}
});
}
}
@Override
public boolean isScrollToAddedWidgets()
{
return scrollToAddedWidgets;
}
@Override
public boolean remove(int index)
{
items.remove(index);
return itemsContainer.remove(index);
}
@Override
public boolean remove(Widget w)
{
items.remove(w);
return itemsContainer.remove(w);
}
@Override
public void scrollToWidget(Widget widget)
{
ensureVisible(items.get(widget).wrappedWidget);
}
@Override
public void setScrollPosition(int position)
{
setHorizontalScrollPosition(position);
}
@Override
public void setScrollToAddedWidgets(boolean scrollToAddedWidgets)
{
this.scrollToAddedWidgets = scrollToAddedWidgets;
}
private FlowPanel createItem(Widget child)
{
FlowPanel wrapper = new FlowPanel();
wrapper.setStyleName(DEFAULT_ITEM_STYLE_NAME);
wrapper.add(child);
items.put(child,new WrappedWidget(child, wrapper, itemsContainer.getWidgetCount()));
return wrapper;
}
private static class WrappedWidget
{
protected int index;
protected Widget widget;
protected FlowPanel wrappedWidget;
public WrappedWidget(Widget widget, FlowPanel wrappedWidget, int index)
{
this.widget = widget;
this.index = index;
this.wrappedWidget = wrappedWidget;
}
@Override
public boolean equals(Object obj)
{
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
WrappedWidget other = (WrappedWidget) obj;
if (widget == null) {
if (other.widget != null)
return false;
} else if (!widget.equals(other.widget))
return false;
return true;
}
@Override
public int hashCode()
{
final int prime = 31;
int result = 1;
result = prime * result
+ ((widget == null) ? 0 : widget.hashCode());
return result;
}
}
}