/*
* 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.smartfaces.client.panel;
import org.cruxframework.crux.core.client.event.SelectHandler;
import org.cruxframework.crux.core.client.select.SelectableWidget;
import org.cruxframework.crux.core.shared.Experimental;
import com.google.gwt.dom.client.Element;
import com.google.gwt.event.dom.client.BlurEvent;
import com.google.gwt.event.dom.client.BlurHandler;
import com.google.gwt.event.dom.client.FocusEvent;
import com.google.gwt.event.dom.client.FocusHandler;
import com.google.gwt.event.dom.client.HasAllFocusHandlers;
import com.google.gwt.event.shared.HandlerRegistration;
import com.google.gwt.user.client.ui.FlowPanel;
import com.google.gwt.user.client.ui.Focusable;
import com.google.gwt.user.client.ui.HasEnabled;
import com.google.gwt.user.client.ui.IndexedPanel;
import com.google.gwt.user.client.ui.InsertPanel;
import com.google.gwt.user.client.ui.IsWidget;
import com.google.gwt.user.client.ui.Widget;
import com.google.gwt.user.client.ui.WidgetCollection;
import com.google.gwt.user.client.ui.impl.FocusImpl;
/**
* @author Thiago da Rosa de Bustamante
*
* - EXPERIMENTAL -
* THIS CLASS IS NOT READY TO BE USED IN PRODUCTION. IT CAN CHANGE FOR NEXT RELEASES
*/
@Experimental
public class SelectableFlowPanel extends SelectableWidget implements HasAllFocusHandlers,
IndexedPanel.ForIsWidget, InsertPanel.ForIsWidget, HasEnabled,
Focusable
{
private static final String DEFAULT_STYLE_NAME = "faces-SelectableFlowPanel";
private static FocusImpl focusImpl = FocusImpl.getFocusImplForPanel();
private InternalFlowPanel panel;
public SelectableFlowPanel()
{
this(new InternalFlowPanel());
}
public SelectableFlowPanel(SelectHandler buttonSelectHandler)
{
this();
addSelectHandler(buttonSelectHandler);
}
protected SelectableFlowPanel(InternalFlowPanel panel)
{
this.panel = panel;
makeFocusable(panel.getElement());
initWidget(this.panel);
setStyleName(DEFAULT_STYLE_NAME);
}
public void add(IsWidget w)
{
panel.add(w);
}
@Override
public void add(Widget w)
{
panel.add(w);
}
@Override
public HandlerRegistration addBlurHandler(BlurHandler handler)
{
return addDomHandler(handler, BlurEvent.getType());
}
@Override
public HandlerRegistration addFocusHandler(FocusHandler handler)
{
return addDomHandler(handler, FocusEvent.getType());
}
public int getTabIndex()
{
return focusImpl.getTabIndex(getElement());
}
@Override
public Widget getWidget(int index)
{
return panel.getWidget(index);
}
@Override
public int getWidgetCount()
{
return panel.getWidgetCount();
}
@Override
public int getWidgetIndex(IsWidget child)
{
return panel.getWidgetIndex(child);
}
@Override
public int getWidgetIndex(Widget child)
{
return panel.getWidgetIndex(child);
}
@Override
public void insert(IsWidget w, int beforeIndex)
{
panel.insert(w, beforeIndex);
}
@Override
public void insert(Widget w, int beforeIndex)
{
panel.insert(w, beforeIndex);
}
@Override
public boolean isEnabled()
{
return getSelectEventsHandler().isEnabled();
}
@Override
public boolean remove(int index)
{
return panel.remove(index);
}
public boolean remove(IsWidget w)
{
return panel.remove(w);
}
public void select()
{
setFocus(true);
super.select();
}
public void setAccessKey(char key)
{
focusImpl.setAccessKey(getElement(), key);
}
@Override
public void setEnabled(boolean enabled)
{
getSelectEventsHandler().setEnabled(enabled);
if (enabled)
{
removeStyleDependentName("disabled");
}
else
{
addStyleDependentName("disabled");
}
}
public void setFocus(boolean focused)
{
if (focused)
{
focusImpl.focus(getElement());
}
else
{
focusImpl.blur(getElement());
}
}
public void setTabIndex(int index)
{
focusImpl.setTabIndex(getElement(), index);
}
/**
* @return
*/
protected WidgetCollection getChildren()
{
return panel.getChildren();
}
protected void makeFocusable(Element e)
{
e.setTabIndex(0);
}
private static class InternalFlowPanel extends FlowPanel
{
@Override
protected WidgetCollection getChildren()
{
return super.getChildren();
}
}
}