package com.smartgwt.sample.showcase.client; import com.google.gwt.user.client.History; import com.smartgwt.client.data.Record; import com.smartgwt.client.types.OperatorId; import com.smartgwt.client.types.TreeModelType; import com.smartgwt.client.widgets.Canvas; import com.smartgwt.client.widgets.Window; import com.smartgwt.client.widgets.events.*; 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.*; 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.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.client.widgets.viewer.DetailFormatter; import com.smartgwt.client.widgets.viewer.DetailViewerField; import com.smartgwt.sample.showcase.client.data.CommandTreeNode; import com.smartgwt.sample.showcase.client.data.ExplorerTreeNode; import com.smartgwt.sample.showcase.client.data.ShowcaseData; import java.util.ArrayList; import java.util.HashSet; import java.util.List; import java.util.Set; public class TileView extends VLayout { private TileGrid tileGrid; private String idSuffix = "_tileView"; private TreeNode[] showcaseData = ShowcaseData.getData(idSuffix); private Canvas parentPanel; private SliderItem numSamplesItem; private DynamicForm filterForm; 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 accordionCB; private CheckboxItem buttonsCB; private CheckboxItem menusCB; private CheckboxItem otherControlsCB; private CheckboxItem dataIntegrationCB; private CheckboxItem dragDropCB; private CheckboxItem basicsCB; private CheckboxItem effectsCB; private CheckboxItem ascendingItem; private CheckboxItem disabledModeCB; private TextItem searchItem; private Tree tree; public TileView(Canvas parentPanel) { setMargin(3); 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); this.parentPanel = parentPanel; setMembersMargin(10); setWidth100(); tileGrid = new TileGrid(); tileGrid.setShowEdges(true); tileGrid.setTileWidth(140); tileGrid.setTileHeight(120); tileGrid.setWidth100(); tileGrid.setHeight100(); tileGrid.setShowAllRecords(true); tileGrid.setAutoFetchData(false); tileGrid.setAnimateTileChange(true); DetailViewerField nameField = new DetailViewerField("nodeTitle"); nameField.setDetailFormatter(new DetailFormatter() { public String format(Object value, Record record, DetailViewerField field) { return value.toString(); } }); nameField.setCellStyle("thumbnailTitle"); DetailViewerField iconField = new DetailViewerField("thumbnail"); iconField.setType("image"); iconField.setImageHeight(89); iconField.setImageWidth(119); iconField.setCellStyle("thumbnail"); tileGrid.setFields(iconField, nameField); tileGrid.addRecordClickHandler(new RecordClickHandler() { public void onRecordClick(RecordClickEvent event) { Record record = event.getRecord(); showSample(record); } }); filterForm = new DynamicForm(); filterForm.setBorder("1px solid #9C9C9C"); filterForm.setNumCols(8); filterForm.setAutoFocus(false); filterForm.setPadding(5); addDrawHandler(new DrawHandler() { public void onDraw(DrawEvent event) { updateTiles(); } }); searchItem = new TextItem("description", "Search"); searchItem.addKeyPressHandler(new KeyPressHandler() { public void onKeyPress(KeyPressEvent event) { if("enter".equalsIgnoreCase(event.getKeyName())) { updateTiles(); } } }); final PickerIcon findIcon = new PickerIcon(PickerIcon.SEARCH); final PickerIcon cancelIcon = new PickerIcon(PickerIcon.CLEAR); searchItem.setIcons(findIcon, cancelIcon); searchItem.addIconClickHandler(new IconClickHandler() { public void onIconClick(IconClickEvent event) { FormItemIcon icon = event.getIcon(); if(icon.getSrc().equals(cancelIcon.getSrc())) { filterForm.reset(); featuredCB.setValue(true); } updateTiles(); } }); numSamplesItem = new SliderItem("numSamples"); numSamplesItem.setTitle("# of Samples"); numSamplesItem.setMinValue(1); numSamplesItem.setMaxValue(100); numSamplesItem.setDefaultValue(100); numSamplesItem.setHeight(50); numSamplesItem.setOperator(OperatorId.LESS_THAN); featuredCB = new CheckboxItem("featuredCB", "Featured Samples"); featuredCB.setValue(true); newSamplesCB = new CheckboxItem("newSamplesCB", "New Samples"); comboBoxCB = new CheckboxItem("comboBoxCB", "ComboBox & Family"); gridsCB = new CheckboxItem("gridsCB", "Grids"); treeCB = new CheckboxItem("treeCB", "Tree"); calendarCB = new CheckboxItem("calendarCB", "Calendar"); tilesCB = new CheckboxItem("tilesCB", "Data View / Tiling"); formsCB = new CheckboxItem("formsCB", "Forms"); layoutCB = new CheckboxItem("layoutCB", "Layouts"); windowsCB = new CheckboxItem("windowsCB", "Windows"); tabsCB = new CheckboxItem("tabsCB", "Tabs"); accordionCB = new CheckboxItem("accordionCB", "Accordion / Sections"); buttonsCB = new CheckboxItem("buttonsCB", "Buttons"); menusCB = new CheckboxItem("menusCB", "Menus"); otherControlsCB = new CheckboxItem("otherControlsCB", "Other Controls"); dataIntegrationCB = new CheckboxItem("dataIntegrationCB", "Data Integration"); dragDropCB = new CheckboxItem("dragDropCB", "Drag & Drop"); basicsCB = new CheckboxItem("basicsCB", "Basics"); effectsCB = new CheckboxItem("effectsCB", "Effects & Animation"); ascendingItem = new CheckboxItem("chkSortDir"); ascendingItem.setTitle("Ascending"); disabledModeCB = new CheckboxItem("disabledModeCB", "Disabled Mode"); filterForm.setFields(searchItem, numSamplesItem, ascendingItem, disabledModeCB, featuredCB, newSamplesCB, comboBoxCB, gridsCB, treeCB, calendarCB, tilesCB, formsCB, layoutCB, windowsCB, tabsCB, accordionCB, buttonsCB, menusCB, otherControlsCB, dataIntegrationCB, dragDropCB, basicsCB, effectsCB); filterForm.addItemChangedHandler(new ItemChangedHandler() { public void onItemChanged(ItemChangedEvent event) { FormItem item = event.getItem(); if (item instanceof CheckboxItem || item instanceof SliderItem) { updateTiles(); } } }); addMember(filterForm); addMember(tileGrid); } private void updateTiles() { String searchText = (String) searchItem.getValue(); List<String> categories = new ArrayList<String>(); 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 (accordionCB.getValueAsBoolean()) categories.add("layout_sections_category"); if (buttonsCB.getValueAsBoolean()) categories.add("buttons_category"); if (menusCB.getValueAsBoolean()) categories.add("menus_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 (effectsCB.getValueAsBoolean()) categories.add("effects_category"); showTiles(searchText, categories); Boolean sortDir = ascendingItem.getValueAsBoolean(); tileGrid.sortByProperty("name", sortDir); } 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; PanelFactory factory = explorerTreeNode.getFactory(); if (factory != null) { Canvas panel = factory.create(); panel.setDisabled(disabledModeCB.getValueAsBoolean()); String sampleName = explorerTreeNode.getName(); String icon = explorerTreeNode.getIcon(); if (icon == null) { icon = "silk/plugin.png"; } final Window window = new Window(); window.setKeepInParentRect(true); window.setHeaderIcon(icon, 16, 16); window.setTitle(sampleName); window.setWidth100(); window.setHeight100(); window.setShowMinimizeButton(false); window.setShowCloseButton(true); window.setCanDragReposition(false); window.setCanDragResize(false); window.setShowShadow(false); window.addItem(panel); window.setParentElement(parentPanel); String nodeID = explorerTreeNode.getNodeID(); String historyToken = nodeID.substring(0, nodeID.indexOf(idSuffix)); History.newItem(historyToken, false); window.addCloseClickHandler(new CloseClickHandler() { public void onCloseClick(CloseClickEvent event) { History.newItem("", false); window.destroy(); } }); window.show(); } } } private void showTiles(String searchText, List<String> categories) { Set data = new HashSet(); int maxResults = ((Number)numSamplesItem.getValue()).intValue(); if(searchText != null) { TreeNode[] children = tree.getAllNodes(); applyFilter(tree, children, data, searchText, maxResults, true); } else { for (String category : categories) { TreeNode categoryNode = tree.find("nodeID", category + idSuffix); TreeNode[] children = tree.getChildren(categoryNode); applyFilter(tree, children, data, searchText, maxResults, false); } } tileGrid.setData((Record[]) data.toArray(new Record[data.size()])); } private void applyFilter(Tree tree, TreeNode[] children, Set data, String searchText,int maxResults, boolean skipCategories) { for (int i = 0; i < children.length; i++) { if(data.size() == maxResults) return; TreeNode child = children[i]; if (!tree.hasChildren(child)) { if (searchText != null) { searchText = searchText.toLowerCase(); boolean isExplorerTreeNode = child instanceof ExplorerTreeNode; if (isExplorerTreeNode) { ExplorerTreeNode explorerTreeNode = (ExplorerTreeNode) child; //when searching through all nodes, skip the featured section to avoid duplicates if(explorerTreeNode.getNodeID().contains("featured")) continue; if (explorerTreeNode.getName().toLowerCase().contains(searchText)) { data.add(child); } else { PanelFactory factory = explorerTreeNode.getFactory(); if (factory != null) { String description = factory.getDescription(); if (description != null && description.toLowerCase().contains(searchText)) { data.add(child); } } } } } else { 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, maxResults, skipCategories); } } } }