/*
* This is part of Geomajas, a GIS framework, http://www.geomajas.org/.
*
* Copyright 2008-2015 Geosparc nv, http://www.geosparc.com/, Belgium.
*
* The program is available in open source according to the GNU Affero
* General Public License. All contributions in this program are covered
* by the Geomajas Contributors License Agreement. For full licensing
* details, see LICENSE.txt in the project root.
*/
package org.geomajas.gwt2.example.base.client.page.overview;
import com.google.gwt.core.client.GWT;
import com.google.gwt.dom.client.SpanElement;
import com.google.gwt.event.dom.client.ChangeEvent;
import com.google.gwt.event.dom.client.ChangeHandler;
import com.google.gwt.event.dom.client.ClickEvent;
import com.google.gwt.event.dom.client.ClickHandler;
import com.google.gwt.event.dom.client.KeyUpEvent;
import com.google.gwt.event.dom.client.KeyUpHandler;
import com.google.gwt.event.logical.shared.ValueChangeEvent;
import com.google.gwt.event.logical.shared.ValueChangeHandler;
import com.google.gwt.uibinder.client.UiBinder;
import com.google.gwt.uibinder.client.UiFactory;
import com.google.gwt.uibinder.client.UiField;
import com.google.gwt.user.client.ui.Anchor;
import com.google.gwt.user.client.ui.CheckBox;
import com.google.gwt.user.client.ui.Composite;
import com.google.gwt.user.client.ui.ListBox;
import com.google.gwt.user.client.ui.ResizeLayoutPanel;
import com.google.gwt.user.client.ui.TextBox;
import com.google.gwt.user.client.ui.Widget;
import org.geomajas.gwt2.example.base.client.ExampleBase;
import org.geomajas.gwt2.example.base.client.resource.ShowcaseResource;
import org.geomajas.gwt2.example.base.client.sample.SamplePanelRegistry;
import org.geomajas.gwt2.example.base.client.sample.ShowcaseSampleDefinition;
import org.geomajas.gwt2.example.base.client.widget.ClickableImage;
import java.util.ArrayList;
import java.util.List;
/**
* Samples overview page. Here you can search within all samples. You can also switch between block and list view.
*
* @author Pieter De Graef
*/
public class SampleOverviewPage extends Composite {
private static final String CATEGORY_ALL = "All";
/**
* UI binder interface this widget.
*
* @author Pieter De Graef
*/
interface MyUiBinder extends UiBinder<Widget, SampleOverviewPage> {
}
private static final MyUiBinder UIBINDER = GWT.create(MyUiBinder.class);
private HasSamples samplesView;
private List<ShowcaseSampleDefinition> factories;
@UiField
protected ListBox categoryBox;
@UiField
protected TextBox searchBox;
@UiField
protected Anchor showAllAnchor;
@UiField
protected SpanElement countElement;
@UiField
protected ClickableImage listViewImg;
@UiField
protected ClickableImage blockViewImg;
@UiField
protected CheckBox sampleInNewTab;
@UiField
protected ResizeLayoutPanel sampleOverviewPanel;
public SampleOverviewPage() {
initWidget(UIBINDER.createAndBindUi(this));
listViewImg.addClickHandler(new ClickHandler() {
public void onClick(ClickEvent event) {
applyView(false);
}
});
blockViewImg.addClickHandler(new ClickHandler() {
public void onClick(ClickEvent event) {
applyView(true);
}
});
sampleInNewTab.addValueChangeHandler(new ValueChangeHandler<Boolean>() {
@Override
public void onValueChange(ValueChangeEvent<Boolean> event) {
ExampleBase.setSampleInNewTab(event.getValue());
}
});
}
@Override
protected void onAttach() {
super.onAttach();
setSize("100%", "100%");
if (sampleOverviewPanel.getWidget() == null) {
factories = SamplePanelRegistry.getFactories();
applyView(true);
// Initialize the category ListBox:
for (String category : SamplePanelRegistry.getCategories()) {
categoryBox.addItem(category);
}
categoryBox.addChangeHandler(new ChangeHandler() {
public void onChange(ChangeEvent event) {
applyFilters();
}
});
// Initialize searchBox:
searchBox.addKeyUpHandler(new KeyUpHandler() {
public void onKeyUp(KeyUpEvent event) {
applyFilters();
}
});
// Initialize the ShowAll anchor:
showAllAnchor.addClickHandler(new ClickHandler() {
public void onClick(ClickEvent event) {
searchBox.setValue("");
applyFilters();
}
});
applyFilters();
}
}
private void applyView(boolean blockView) {
sampleOverviewPanel.clear();
if (blockView) {
samplesView = new SampleBlockView(factories, this);
} else {
samplesView = new SampleListView(factories, this);
}
sampleOverviewPanel.add(samplesView);
}
@UiFactory
protected ShowcaseResource getResourceBundle() {
return ExampleBase.getShowcaseResource();
}
// ------------------------------------------------------------------------
// Private methods:
// ------------------------------------------------------------------------
private void applyCountTxt(int count) {
countElement.setInnerText("(" + count + " / " + factories.size() + ")");
}
private void applyFilters() {
List<ShowcaseSampleDefinition> filtered = new ArrayList<ShowcaseSampleDefinition>();
for (ShowcaseSampleDefinition sampleFactory : factories) {
boolean accepted = isInCategory(sampleFactory) && acceptSearchString(sampleFactory);
if (accepted) {
filtered.add(sampleFactory);
}
}
applyCountTxt(filtered.size());
samplesView.setData(filtered);
}
private boolean isInCategory(ShowcaseSampleDefinition sampleFactory) {
int index = categoryBox.getSelectedIndex();
String categoryFilter = categoryBox.getItemText(index);
return CATEGORY_ALL.equalsIgnoreCase(categoryFilter) || categoryFilter.equals(sampleFactory.getCategory());
}
private boolean acceptSearchString(ShowcaseSampleDefinition sampleFactory) {
String searchTxt = searchBox.getValue();
if (searchTxt == null || searchTxt.length() == 0) {
return true;
}
String temp = searchTxt.toLowerCase();
if (sampleFactory.getTitle().toLowerCase().contains(temp)) {
return true;
}
if (sampleFactory.getCategory().toLowerCase().contains(temp)) {
return true;
}
if (sampleFactory.getDescription().toLowerCase().contains(temp)) {
return true;
}
return false;
}
}