mirror of
https://github.com/eclipse-sailing-analytics/sailing-analytics.git
synced 2026-10-27 06:17:27 +00:00
Race/Regatta list filter - Implementation of list dropdown filter
This commit is contained in:
1 parent
2b6f253b9a
commit
0afc915049
2 files changed
+114
No files matched your search
+96
@@ -0,0 +1,96 @@
|
||||
package com.sap.sailing.gwt.home.client.place.event.partials.listNavigation;
|
||||
|
||||
import java.util.Collection;
|
||||
|
||||
import com.google.gwt.core.client.GWT;
|
||||
import com.google.gwt.dom.client.DivElement;
|
||||
import com.google.gwt.event.dom.client.ClickEvent;
|
||||
import com.google.gwt.event.dom.client.ClickHandler;
|
||||
import com.google.gwt.uibinder.client.UiBinder;
|
||||
import com.google.gwt.uibinder.client.UiField;
|
||||
import com.google.gwt.user.client.DOM;
|
||||
import com.google.gwt.user.client.Event;
|
||||
import com.google.gwt.user.client.ui.Composite;
|
||||
import com.google.gwt.user.client.ui.FlowPanel;
|
||||
import com.google.gwt.user.client.ui.Widget;
|
||||
import com.sap.sailing.gwt.common.client.LinkUtil;
|
||||
import com.sap.sailing.gwt.home.client.place.event.partials.listNavigation.RegattaNavigationResources.LocalCss;
|
||||
import com.sap.sailing.gwt.home.client.shared.DropdownHandler;
|
||||
|
||||
public class ListDropdownFilter<T> extends Composite {
|
||||
|
||||
private static final LocalCss CSS = RegattaNavigationResources.INSTANCE.css();
|
||||
private static ListDropdownFilterUiBinder uiBinder = GWT.create(ListDropdownFilterUiBinder.class);
|
||||
|
||||
interface ListDropdownFilterUiBinder extends UiBinder<Widget, ListDropdownFilter<?>> {
|
||||
}
|
||||
|
||||
@UiField DivElement dropdownContainerUi;
|
||||
@UiField DivElement currentValueUi;
|
||||
@UiField FlowPanel filterItemContainerUi;
|
||||
private final SelectionCallback<T> selectionCallback;
|
||||
private final DropdownHandler dropdownHandler;
|
||||
|
||||
public ListDropdownFilter(T defaultValue, SelectionCallback<T> selectionCallback) {
|
||||
this.selectionCallback = selectionCallback;
|
||||
CSS.ensureInjected();
|
||||
initWidget(uiBinder.createAndBindUi(this));
|
||||
this.dropdownHandler = new ListFilterDropdownHandler();
|
||||
ListDropdownFilterItem filterItem = new ListDropdownFilterItem(defaultValue);
|
||||
filterItemContainerUi.add(filterItem);
|
||||
filterItem.select(defaultValue);
|
||||
}
|
||||
|
||||
public void setSelectableValues(Collection<T> selectableValues) {
|
||||
for (T value : selectableValues) {
|
||||
filterItemContainerUi.add(new ListDropdownFilterItem(value));
|
||||
}
|
||||
}
|
||||
|
||||
public interface SelectionCallback<T> {
|
||||
void onSelectFilter(T value);
|
||||
}
|
||||
|
||||
private class ListFilterDropdownHandler extends DropdownHandler {
|
||||
private ListFilterDropdownHandler() {
|
||||
super(dropdownContainerUi, filterItemContainerUi.getElement());
|
||||
}
|
||||
@Override
|
||||
protected void dropdownStateChanged(boolean dropdownShown) {
|
||||
if (dropdownShown) dropdownContainerUi.addClassName(CSS.jsdropdownactive());
|
||||
else dropdownContainerUi.removeClassName(CSS.jsdropdownactive());
|
||||
}
|
||||
}
|
||||
|
||||
private class ListDropdownFilterItem extends Widget {
|
||||
private ListDropdownFilterItem(T value) {
|
||||
DivElement element = DOM.createDiv().<DivElement>cast();
|
||||
element.setInnerText(String.valueOf(value));
|
||||
this.setElement(element);
|
||||
this.addStyleName(CSS.regattanavigation_filter_dropdown_link());
|
||||
this.initClickHandler(value);
|
||||
}
|
||||
|
||||
private void initClickHandler(final T value) {
|
||||
this.addDomHandler(new ClickHandler() {
|
||||
@Override
|
||||
public void onClick(ClickEvent event) {
|
||||
if(LinkUtil.handleLinkClick((Event) event.getNativeEvent())) {
|
||||
event.preventDefault();
|
||||
dropdownHandler.setVisible(false);
|
||||
ListDropdownFilterItem.this.select(value);
|
||||
selectionCallback.onSelectFilter(value);
|
||||
}
|
||||
}
|
||||
}, ClickEvent.getType());
|
||||
}
|
||||
|
||||
private void select(T value) {
|
||||
currentValueUi.setInnerText(String.valueOf(value));
|
||||
for (int i=0; i < filterItemContainerUi.getWidgetCount(); i++) {
|
||||
filterItemContainerUi.getWidget(i).removeStyleName(CSS.regattanavigation_filter_dropdown_linkactive());
|
||||
}
|
||||
this.addStyleName(CSS.regattanavigation_filter_dropdown_linkactive());
|
||||
}
|
||||
}
|
||||
}
|
||||
+18
@@ -0,0 +1,18 @@
|
||||
<!DOCTYPE ui:UiBinder SYSTEM "http://dl.google.com/gwt/DTD/xhtml.ent">
|
||||
<ui:UiBinder xmlns:ui="urn:ui:com.google.gwt.uibinder" xmlns:g="urn:import:com.google.gwt.user.client.ui">
|
||||
<ui:with field="i18n" type="com.sap.sailing.gwt.ui.client.StringMessages" />
|
||||
<ui:with field="i18n_ubi" type="com.sap.sailing.gwt.common.client.i18n.TextMessages"/>
|
||||
<ui:with field="res" type="com.sap.sailing.gwt.common.client.SharedResources" />
|
||||
<ui:with field="local_res" type="com.sap.sailing.gwt.home.client.place.event.partials.listNavigation.RegattaNavigationResources" />
|
||||
<g:HTMLPanel>
|
||||
<div class="{local_res.css.regattanavigation_filter} {local_res.css.jsdropdown}" ui:field="dropdownContainerUi">
|
||||
<div class="{local_res.css.jsdropdown_head}">
|
||||
<div class="{local_res.css.regattanavigation_filter_text}">
|
||||
Filter TODO:
|
||||
</div>
|
||||
<div class="{local_res.css.regattanavigation_filter_current}" ui:field="currentValueUi"></div>
|
||||
</div>
|
||||
<g:FlowPanel addStyleNames="{local_res.css.regattanavigation_filter_dropdown} {local_res.css.jsdropdown_content}" ui:field="filterItemContainerUi" />
|
||||
</div>
|
||||
</g:HTMLPanel>
|
||||
</ui:UiBinder>
|
||||
Reference in new issue
Block a user