package com.smartgwt.sample.showcase.client;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import java.util.HashSet;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import java.util.Set;
import com.google.gwt.core.client.GWT;
import com.google.gwt.user.client.History;
import com.smartgwt.client.bean.BeanFactory;
import com.smartgwt.client.data.Record;
import com.smartgwt.client.types.Alignment;
import com.smartgwt.client.types.MultipleAppearance;
import com.smartgwt.client.types.OperatorId;
import com.smartgwt.client.types.Overflow;
import com.smartgwt.client.types.TitleOrientation;
import com.smartgwt.client.types.TreeModelType;
import com.smartgwt.client.util.Browser;
import com.smartgwt.client.widgets.Canvas;
import com.smartgwt.client.widgets.form.DynamicForm;
import com.smartgwt.client.widgets.form.events.ItemChangedEvent;
import com.smartgwt.client.widgets.form.events.ItemChangedHandler;
import com.smartgwt.client.widgets.form.fields.CheckboxItem;
import com.smartgwt.client.widgets.form.fields.FormItem;
import com.smartgwt.client.widgets.form.fields.FormItemIcon;
import com.smartgwt.client.widgets.form.fields.SelectItem;
import com.smartgwt.client.widgets.form.fields.SliderItem;
import com.smartgwt.client.widgets.form.fields.SpacerItem;
import com.smartgwt.client.widgets.form.fields.TextItem;
import com.smartgwt.client.widgets.form.fields.events.IconClickEvent;
import com.smartgwt.client.widgets.form.fields.events.IconClickHandler;
import com.smartgwt.client.widgets.form.fields.events.KeyPressEvent;
import com.smartgwt.client.widgets.form.fields.events.KeyPressHandler;
import com.smartgwt.client.widgets.form.fields.events.ChangedEvent;
import com.smartgwt.client.widgets.form.fields.events.ChangedHandler;
import com.smartgwt.client.widgets.layout.VLayout;
import com.smartgwt.client.widgets.tile.TileGrid;
import com.smartgwt.client.widgets.tile.events.RecordClickEvent;
import com.smartgwt.client.widgets.tile.events.RecordClickHandler;
import com.smartgwt.client.widgets.tree.Tree;
import com.smartgwt.client.widgets.tree.TreeNode;
import com.smartgwt.sample.showcase.client.data.CommandTreeNode;
import com.smartgwt.sample.showcase.client.data.ExplorerTreeNode;
public class TileView extends VLayout {
private static final ShowcaseMessages M = ShowcaseMessages.INSTANCE;
private static final native boolean _useRoundedSearchItem() /*-{
var isc = $wnd.isc;
return (!isc.Browser.isIE || isc.Browser.isIE9);
}-*/;
private final boolean useDesktopMode;
private final ShowcaseNavigator navigator;
private Map<String, Integer> rankOfSamples;
private boolean considerForRanking;
private Integer maxResults;
private TileGrid tileGrid;
private final String idSuffix = SideNavTree.ID_SUFFIX;
private DynamicForm filterForm;
private TextItem searchItem;
private SliderItem numSamplesItem;
private CheckboxItem ascendingItem;
//private CheckboxItem disabledModeCB;
private CheckboxItem featuredCB;
private CheckboxItem newSamplesCB;
private CheckboxItem comboBoxCB;
private CheckboxItem gridsCB;
private CheckboxItem treeCB;
private CheckboxItem calendarCB;
private CheckboxItem tilesCB;
private CheckboxItem formsCB;
private CheckboxItem layoutCB;
private CheckboxItem windowsCB;
private CheckboxItem tabsCB;
private CheckboxItem sectionsCB;
private CheckboxItem portalLayoutCB;
private CheckboxItem buttonsCB;
private CheckboxItem menusCB;
private CheckboxItem toolStripCB;
private CheckboxItem otherControlsCB;
private CheckboxItem dataIntegrationCB;
private CheckboxItem dragDropCB;
private CheckboxItem basicsCB;
private CheckboxItem drawingCB;
private CheckboxItem effectsCB;
private CheckboxItem betaSamplesCB;
// ---- OR ----
private SelectItem categoriesItem;
private Tree tree;
public interface ShowcaseCustomTileMetaFactory extends BeanFactory.MetaFactory {
BeanFactory<ShowcaseCustomTile> getShowcaseCustomTileFactory();
}
public TileView(final TreeNode[] showcaseData, final boolean useDesktopMode,
final boolean hasBetaSamples, final ShowcaseNavigator navigator)
{
this.navigator = navigator;
this.useDesktopMode = useDesktopMode;
tree = new Tree();
tree.setModelType(TreeModelType.PARENT);
tree.setNameProperty("name");
tree.setOpenProperty("isOpen");
tree.setIdField("nodeID");
tree.setParentIdField("parentNodeID");
tree.setRootValue("root" + idSuffix);
tree.setData(showcaseData);
setMembersMargin(10);
setWidth100();
setOverflow(Overflow.HIDDEN);
GWT.create(ShowcaseCustomTileMetaFactory.class);
tileGrid = new TileGrid() {
@Override
public Canvas getTile(int recordNum) {
ShowcaseCustomTile customTile = (ShowcaseCustomTile) super.getTile(recordNum);
customTile.applyRecord();
return customTile;
}
};
if (useDesktopMode) tileGrid.setStyleName("showcaseTileGrid");
tileGrid.setShowEdges(false);
tileGrid.setTileWidth(useDesktopMode ? 140 : 70);
tileGrid.setTileHeight(useDesktopMode ? 120 : 90); // not half of "normal" because there needs to be room for the label,
// especially since the labels tend to wrap, so they require 2-3 lines
tileGrid.setWidth100();
tileGrid.setHeight100();
tileGrid.setShowAllRecords(true);
tileGrid.setTileConstructor(ShowcaseCustomTile.class.getName());
tileGrid.setAutoFetchData(false);
tileGrid.setAnimateTileChange(true);
tileGrid.setEmptyMessage("No samples match your criteria.");
tileGrid.addRecordClickHandler(new RecordClickHandler() {
public void onRecordClick(RecordClickEvent event) {
Record record = event.getRecord();
showSample(record);
}
});
filterForm = new DynamicForm();
filterForm.setFixedColWidths(true);
filterForm.setBorder("1px solid #9C9C9C");
if (useDesktopMode) {
filterForm.setNumCols(8);
filterForm.setColWidths(16, "*", 16, "*", 16, "*", 16, "*");
} else {
filterForm.setNumCols(3);
filterForm.setColWidths("*", 10, "*");
}
filterForm.setAutoFocus(false);
filterForm.setPadding(5);
searchItem = new TextItem("description_search", M.searchTitle().asString());
searchItem.setWidth("*");
searchItem.setTitleOrientation(TitleOrientation.TOP);
searchItem.setColSpan(useDesktopMode ? 2 : 1);
searchItem.setTitleAlign(Alignment.LEFT);
searchItem.setBrowserAutoCorrect(false);
searchItem.addKeyPressHandler(new KeyPressHandler() {
public void onKeyPress(KeyPressEvent event) {
String searchText = (String)searchItem.getValue();
if (searchText == null) return;
// hitting enter searches for the next match in the SideNavTree
if ("Enter".equals(event.getKeyName()) && useDesktopMode) {
if (navigator.iterateCurrentMatch(searchText)) event.cancel();
}
}
});
searchItem.addChangedHandler(new ChangedHandler() {
public void onChanged(ChangedEvent event) {
navigator.incrementalSearch((String)event.getValue());
updateTilesOnPause();
}
});
final FormItemIcon searchIcon = new FormItemIcon();
searchIcon.setName("search");
searchIcon.setInline(true);
searchIcon.setAttribute("imgOnly", true);
searchIcon.setSrc("[SKINIMG]actions/view.png");
searchIcon.setWidth(16);
searchIcon.setHeight(16);
searchIcon.setShowRTL(true);
searchIcon.setHspace(5);
final FormItemIcon clearIcon = new FormItemIcon();
clearIcon.setName("clear");
clearIcon.setInline(true);
clearIcon.setAttribute("imgOnly", true);
clearIcon.setSrc("[SKINIMG]actions/close.png");
clearIcon.setWidth(10);
clearIcon.setHeight(10);
clearIcon.setHspace(3);
searchItem.setIcons(searchIcon, clearIcon);
if (_useRoundedSearchItem()) searchItem.setTextBoxStyle("explorerSearchItem");
searchItem.addIconClickHandler(new IconClickHandler() {
public void onIconClick(IconClickEvent event) {
if ("clear".equals(event.getIcon().getName())) {
filterForm.reset();
if (useDesktopMode) {
featuredCB.setValue(true);
ascendingItem.setValue(true);
} else {
categoriesItem.setValue(new String[] {"featured_category"});
}
navigator.incrementalSearch(null);
}
updateTiles();
}
});
if (useDesktopMode) {
numSamplesItem = new SliderItem("numSamples");
numSamplesItem.setTitle(M.numSamplesTitle().asString());
numSamplesItem.setTitleOrientation(TitleOrientation.TOP);
numSamplesItem.setColSpan(1);
numSamplesItem.setTitleAlign(Alignment.LEFT);
numSamplesItem.setMinValue(1.0);
// grep '^ *new ExplorerTreeNode' ShowcaseData.java | grep -o 'new [^.,]*\.Factory()' | sort | uniq | wc
numSamplesItem.setMaxValue(341.0);
numSamplesItem.setDefaultValue(100);
numSamplesItem.setHeight(50);
numSamplesItem.setOperator(OperatorId.LESS_THAN);
ascendingItem = new CheckboxItem("chkSortDir");
ascendingItem.setTitle(M.ascendingTitle().asString());
ascendingItem.setValue(true);
}
//disabledModeCB = new CheckboxItem("disabledModeCB", M.disabledModeTitle().asString());
if (useDesktopMode) {
featuredCB = new CheckboxItem("featuredCB", M.featuredCategoryName().asString());
featuredCB.setValue(true);
newSamplesCB = new CheckboxItem("newSamplesCB", M.newSamplesCategoryName().asString());
comboBoxCB = new CheckboxItem("comboBoxCB", M.comboBoxCategoryName().asString());
gridsCB = new CheckboxItem("gridsCB", M.gridsCategoryName().asString());
treeCB = new CheckboxItem("treeCB", M.treeCategoryName().asString());
calendarCB = new CheckboxItem("calendarCB", M.calendarCategoryName().asString());
tilesCB = new CheckboxItem("tilesCB", M.tilesCategoryName().asString());
formsCB = new CheckboxItem("formsCB", M.formsCategoryName().asString());
layoutCB = new CheckboxItem("layoutCB", M.layoutCategoryName().asString());
windowsCB = new CheckboxItem("windowsCB", M.windowsCategoryName().asString());
tabsCB = new CheckboxItem("tabsCB", M.tabsCategoryName().asString());
sectionsCB = new CheckboxItem("accordionCB", M.sectionsCategoryName().asString());
portalLayoutCB = new CheckboxItem("portalLayoutCB", M.portalLayoutCategoryName().asString());
buttonsCB = new CheckboxItem("buttonsCB", M.buttonsCategoryName().asString());
menusCB = new CheckboxItem("menusCB", M.menusCategoryName().asString());
toolStripCB = new CheckboxItem("toolStripCB", M.toolStripCategoryName().asString());
otherControlsCB = new CheckboxItem("otherControlsCB", M.otherControlsCategoryName().asString());
dataIntegrationCB = new CheckboxItem("dataIntegrationCB", M.dataIntegrationCategoryName().asString());
dragDropCB = new CheckboxItem("dragDropCB", M.dragDropCategoryName().asString());
basicsCB = new CheckboxItem("basicsCB", M.basicsCategoryName().asString());
drawingCB = new CheckboxItem("drawingCB", M.drawingCategoryName().asString());
effectsCB = new CheckboxItem("effectsCB", M.effectsCategoryName().asString());
betaSamplesCB = new CheckboxItem("betaSamplesCB", M.betaSamplesName().asString());
} else {
categoriesItem = new SelectItem("categories", M.categoriesTitle().asString());
categoriesItem.setTitleOrientation(TitleOrientation.TOP);
categoriesItem.setColSpan(1);
categoriesItem.setMultiple(true);
categoriesItem.setMultipleAppearance(MultipleAppearance.PICKLIST);
final LinkedHashMap<String, String> valueMap = new LinkedHashMap<String, String>();
valueMap.put("layout_sections_category", M.sectionsCategoryName().asString());
valueMap.put("basics_category", M.basicsCategoryName().asString());
if (hasBetaSamples) valueMap.put("beta_samples", M.betaSamplesName().asString());
valueMap.put("buttons_category", M.buttonsCategoryName().asString());
valueMap.put("calendar_category", M.calendarCategoryName().asString());
valueMap.put("combobox_category", M.comboBoxCategoryName().asString());
valueMap.put("data_integration_category", M.dataIntegrationCategoryName().asString());
valueMap.put("tiling_category", M.tilesCategoryName().asString());
valueMap.put("effects_dd_category", M.dragDropCategoryName().asString());
valueMap.put("drawing", M.drawingCategoryName().asString());
valueMap.put("effects_category", M.effectsCategoryName().asString());
valueMap.put("featured_category", M.featuredCategoryName().asString());
valueMap.put("form_category", M.formsCategoryName().asString());
valueMap.put("grid_category", M.gridsCategoryName().asString());
valueMap.put("layout_category", M.layoutCategoryName().asString());
valueMap.put("menus_category", M.menusCategoryName().asString());
valueMap.put("new_category", M.newSamplesCategoryName().asString());
valueMap.put("controls_category", M.otherControlsCategoryName().asString());
valueMap.put("portal_layout_category", M.portalLayoutCategoryName().asString());
valueMap.put("layout_tabs_category", M.tabsCategoryName().asString());
valueMap.put("toolstrip_category", M.toolStripCategoryName().asString());
valueMap.put("tree_category", M.treeCategoryName().asString());
valueMap.put("layout_windows_category", M.windowsCategoryName().asString());
categoriesItem.setValueMap(valueMap);
categoriesItem.setDefaultValue(new String[] {"featured_category"});
final LinkedHashMap<String, String> valueMapIcons = new LinkedHashMap<String, String>();
valueMapIcons.put("featured_category", ((ExplorerTreeNode)tree.find("nodeID", "featured_category"+ idSuffix)).getIcon());
valueMapIcons.put("new_category", ((ExplorerTreeNode)tree.find("nodeID", "new_category"+ idSuffix)).getIcon());
valueMapIcons.put("combobox_category", ((ExplorerTreeNode)tree.find("nodeID", "combobox_category"+ idSuffix)).getIcon());
valueMapIcons.put("grid_category", ((ExplorerTreeNode)tree.find("nodeID", "grid_category"+ idSuffix)).getIcon());
valueMapIcons.put("tree_category", ((ExplorerTreeNode)tree.find("nodeID", "tree_category"+ idSuffix)).getIcon());
valueMapIcons.put("calendar_category", ((ExplorerTreeNode)tree.find("nodeID", "calendar_category"+ idSuffix)).getIcon());
valueMapIcons.put("tiling_category", ((ExplorerTreeNode)tree.find("nodeID", "tiling_category"+ idSuffix)).getIcon());
valueMapIcons.put("form_category", ((ExplorerTreeNode)tree.find("nodeID", "form_category"+ idSuffix)).getIcon());
valueMapIcons.put("layout_category", ((ExplorerTreeNode)tree.find("nodeID", "layout_category"+ idSuffix)).getIcon());
valueMapIcons.put("layout_windows_category", ((ExplorerTreeNode)tree.find("nodeID", "layout_windows_category"+ idSuffix)).getIcon());
valueMapIcons.put("layout_tabs_category", ((ExplorerTreeNode)tree.find("nodeID", "layout_tabs_category"+ idSuffix)).getIcon());
valueMapIcons.put("layout_sections_category", ((ExplorerTreeNode)tree.find("nodeID", "layout_sections_category"+ idSuffix)).getIcon());
valueMapIcons.put("portal_layout_category", ((ExplorerTreeNode)tree.find("nodeID", "portal_layout_category"+ idSuffix)).getIcon());
valueMapIcons.put("buttons_category", ((ExplorerTreeNode)tree.find("nodeID", "buttons_category"+ idSuffix)).getIcon());
valueMapIcons.put("menus_category", ((ExplorerTreeNode)tree.find("nodeID", "menus_category"+ idSuffix)).getIcon());
valueMapIcons.put("toolstrip_category", ((ExplorerTreeNode)tree.find("nodeID", "toolstrip_category"+ idSuffix)).getIcon());
valueMapIcons.put("controls_category", ((ExplorerTreeNode)tree.find("nodeID", "controls_category"+ idSuffix)).getIcon());
valueMapIcons.put("data_integration_category", ((ExplorerTreeNode)tree.find("nodeID", "data_integration_category"+ idSuffix)).getIcon());
valueMapIcons.put("effects_dd_category", ((ExplorerTreeNode)tree.find("nodeID", "effects_dd_category"+ idSuffix)).getIcon());
valueMapIcons.put("basics_category", ((ExplorerTreeNode)tree.find("nodeID", "basics_category"+ idSuffix)).getIcon());
valueMapIcons.put("drawing", ((ExplorerTreeNode)tree.find("nodeID", "drawing"+ idSuffix)).getIcon());
valueMapIcons.put("effects_category", ((ExplorerTreeNode)tree.find("nodeID", "effects_category"+ idSuffix)).getIcon());
categoriesItem.setValueIcons(valueMapIcons);
}
final List<FormItem> filterFormItems = new ArrayList<FormItem>();
filterFormItems.add(searchItem);
{
final SpacerItem spacerItem = new SpacerItem();
spacerItem.setWidth(1);
filterFormItems.add(spacerItem);
}
if (useDesktopMode) {
filterFormItems.add(numSamplesItem);
filterFormItems.add(ascendingItem);
filterFormItems.add(new SpacerItem());
//filterFormItems.add(disabledModeCB);
filterFormItems.addAll(Arrays.asList(
sectionsCB, basicsCB, betaSamplesCB, buttonsCB, calendarCB, comboBoxCB, dataIntegrationCB,
tilesCB, dragDropCB, drawingCB, effectsCB, featuredCB, formsCB, gridsCB, layoutCB,
menusCB, newSamplesCB, otherControlsCB, portalLayoutCB, tabsCB, toolStripCB,
treeCB, windowsCB));
if (!hasBetaSamples) filterFormItems.remove(betaSamplesCB);
} else {
filterFormItems.add(categoriesItem);
}
filterForm.setItems(filterFormItems.toArray(new FormItem[filterFormItems.size()]));
filterForm.addItemChangedHandler(new ItemChangedHandler() {
public void onItemChanged(ItemChangedEvent event) {
FormItem item = event.getItem();
if (item instanceof CheckboxItem || item instanceof SliderItem || item == categoriesItem) {
updateTiles();
}
}
});
addMember(filterForm);
addMember(tileGrid);
updateTiles();
}
public native void updateTilesOnPause() /*-{
var searchItemJ = this.@com.smartgwt.sample.showcase.client.TileView::searchItem,
formItem = searchItemJ.@com.smartgwt.client.core.JsObject::getJsObj()();
if (formItem.pendingActionOnPause("tileSearch")) return;
var selfJ = this;
formItem.fireOnPause("tileSearch", $entry(function() {
selfJ.@com.smartgwt.sample.showcase.client.TileView::updateTiles()();
}));
}-*/;
public void updateTiles(String searchText) {
searchItem.setValue(searchText);
updateTiles();
// Don't focusInItem() on mobile because the browser will attempt to scroll the newly-focused
// searchItem into view, as the SplitPane page transition is underway.
if (useDesktopMode) filterForm.focusInItem(searchItem);
}
private void updateTiles() {
final String searchText = (String)searchItem.getValue();
this.considerForRanking = searchText != null && searchText.length() > 0;
final List<String> categories = new ArrayList<String>();
if (useDesktopMode) {
if (featuredCB.getValueAsBoolean()) categories.add("featured_category");
if (newSamplesCB.getValueAsBoolean()) categories.add("new_category");
if (comboBoxCB.getValueAsBoolean()) categories.add("combobox_category");
if (gridsCB.getValueAsBoolean()) categories.add("grid_category");
if (treeCB.getValueAsBoolean()) categories.add("tree_category");
if (calendarCB.getValueAsBoolean()) categories.add("calendar_category");
if (tilesCB.getValueAsBoolean()) categories.add("tiling_category");
if (formsCB.getValueAsBoolean()) categories.add("form_category");
if (layoutCB.getValueAsBoolean()) categories.add("layout_category");
if (windowsCB.getValueAsBoolean()) categories.add("layout_windows_category");
if (tabsCB.getValueAsBoolean()) categories.add("layout_tabs_category");
if (sectionsCB.getValueAsBoolean()) categories.add("layout_sections_category");
if (portalLayoutCB.getValueAsBoolean()) categories.add("portal_layout_category");
if (buttonsCB.getValueAsBoolean()) categories.add("buttons_category");
if (menusCB.getValueAsBoolean()) categories.add("menus_category");
if (toolStripCB.getValueAsBoolean()) categories.add("toolstrip_category");
if (otherControlsCB.getValueAsBoolean()) categories.add("controls_category");
if (dataIntegrationCB.getValueAsBoolean()) categories.add("data_integration_category");
if (dragDropCB.getValueAsBoolean()) categories.add("effects_dd_category");
if (basicsCB.getValueAsBoolean()) categories.add("basics_category");
if (drawingCB.getValueAsBoolean()) categories.add("drawing");
if (effectsCB.getValueAsBoolean()) categories.add("effects_category");
if (betaSamplesCB.getValueAsBoolean()) categories.add("beta_samples");
} else {
categories.addAll(Arrays.asList(categoriesItem.getValues()));
}
showTiles(searchText, categories);
// truncate the node list _after_ sorting it so the most meaningful nodes are kept
maxResults = useDesktopMode ? numSamplesItem.getValueAsFloat().intValue() : null;
if (this.considerForRanking) {
sortAndTruncateNodeList("position", false, maxResults);
} else {
boolean sortDir = useDesktopMode ? ascendingItem.getValueAsBoolean() : true;
sortAndTruncateNodeList("nodeTitle", sortDir, maxResults);
}
}
private void showSample(Record node) {
boolean isExplorerTreeNode = node instanceof ExplorerTreeNode;
if (node instanceof CommandTreeNode) {
CommandTreeNode commandTreeNode = (CommandTreeNode) node;
commandTreeNode.getCommand().execute();
} else if (isExplorerTreeNode) {
ExplorerTreeNode explorerTreeNode = (ExplorerTreeNode)node;
History.newItem(explorerTreeNode.getNodeID(), true);
}
}
private void showTiles(String searchText, List<String> categories) {
// sample will be replaced now by the tile search results
navigator.clearSelectedSamples();
// clear any existing ranking from previous search
rankOfSamples = new HashMap<String, Integer>();
final Set<TreeNode> data = new HashSet<TreeNode>();
if (searchText != null) {
TreeNode[] children = tree.getAllNodes();
applyFilterAccordingToRanking(tree, children, data, searchText);
} else {
for (final String category : categories) {
if (category.equalsIgnoreCase("beta_samples")) {
TreeNode[] children = tree.getAllNodes();
searchBetaSamples(tree, children, data, searchText, false);
} else {
TreeNode categoryNode = tree.find("nodeID", category + idSuffix);
if (categoryNode == null) continue;
TreeNode[] children = tree.getChildren(categoryNode);
applyFilter(tree, children, data, searchText, false);
}
}
}
tileGrid.setData((Record[])data.toArray(new Record[data.size()]));
}
private void searchBetaSamples(Tree tree, TreeNode[] children, Set<TreeNode> data,
String searchText, boolean skipCategories)
{
for (int i = 0; i < children.length; i++) {
final TreeNode child = children[i];
if (!tree.hasChildren(child)) {
boolean isExplorerTreeNode = child instanceof ExplorerTreeNode;
if (isExplorerTreeNode) {
final ExplorerTreeNode explorerTreeNode = (ExplorerTreeNode) child;
// note that BETA tag is only in HTML
if (explorerTreeNode.getHTML().contains("BETA")) {
children[i].setAttribute("description",
explorerTreeNode.getFactory().getDescription());
data.add(children[i]);
}
}
} else if(!skipCategories) {
searchBetaSamples(tree, tree.getChildren(child), data, searchText,
skipCategories);
}
}
}
private void applyFilterAccordingToRanking(Tree tree, TreeNode[] children,
Set<TreeNode> data, String searchText)
{
String[] arraySearchText = searchText.trim().split(" ");
for (int j = 0; j < arraySearchText.length; j++) {
if (arraySearchText[j] == null || arraySearchText[j].length() == 0) continue;
searchText = arraySearchText[j].toLowerCase();
for (int i = 0; i < children.length; i++) {
TreeNode child = children[i];
if (!tree.hasChildren(child) && child.getClass() == ExplorerTreeNode.class) {
ExplorerTreeNode explorerTreeNode = (ExplorerTreeNode) child;
String canonicalName = explorerTreeNode.getName().toLowerCase();
if (canonicalName.contains(searchText)) {
int rank = rankSamples(canonicalName, 5);
child.setAttribute("position", rank);
data.add(child);
} else {
PanelFactory factory = explorerTreeNode.getFactory();
if (factory != null) {
String description = factory.getDescription();
if (description != null &&
description.toLowerCase().contains(searchText))
{
int rank = rankSamples(canonicalName, 1);
child.setAttribute("position", rank);
data.add(child);
}
}
}
}
}
}
}
private void applyFilter(Tree tree, TreeNode[] children, Set<TreeNode> data,
String searchText, boolean skipCategories)
{
for (int i = 0; i < children.length; i++) {
TreeNode child = children[i];
if (!tree.hasChildren(child)) {
if (searchText == null) data.add(child);
} else if(!skipCategories) {
// skip categories when searching all nodes so that duplicates that exist in
// featured section and category are both not included
applyFilter(tree, tree.getChildren(child), data, searchText, skipCategories);
}
}
}
private int rankSamples(String name, int amount) {
if (!this.considerForRanking) return 0;
if (rankOfSamples.get(name) == null) {
rankOfSamples.put(name, amount);
} else {
rankOfSamples.put(name, (Integer)rankOfSamples.get(name) + amount);
}
return (Integer)rankOfSamples.get(name);
}
// truncating the sorted array can be done in JSNI without having to copy the nodes
private native void sortAndTruncateNodeList(String property, boolean ascending,
Integer maxLength)
/*-{
var tileGridJ = this.@com.smartgwt.sample.showcase.client.TileView::tileGrid,
tileGridJS = tileGridJ.@com.smartgwt.client.widgets.BaseWidget::getOrCreateJsObj()(),
data = tileGridJS.data;
if (data) {
if (property && property != "") data.sortByProperty(property, ascending);
if (maxLength != null && data.length > maxLength) data.length = maxLength;
}
}-*/;
}