001: package org.drools.brms.client.categorynav;
002:
003: /*
004: * Copyright 2005 JBoss Inc
005: *
006: * Licensed under the Apache License, Version 2.0 (the "License");
007: * you may not use this file except in compliance with the License.
008: * You may obtain a copy of the License at
009: *
010: * http://www.apache.org/licenses/LICENSE-2.0
011: *
012: * Unless required by applicable law or agreed to in writing, software
013: * distributed under the License is distributed on an "AS IS" BASIS,
014: * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
015: * See the License for the specific language governing permissions and
016: * limitations under the License.
017: */
018:
019: import org.drools.brms.client.common.ErrorPopup;
020: import org.drools.brms.client.rpc.RepositoryServiceAsync;
021: import org.drools.brms.client.rpc.RepositoryServiceFactory;
022:
023: import com.google.gwt.user.client.rpc.AsyncCallback;
024: import com.google.gwt.user.client.ui.AbsolutePanel;
025: import com.google.gwt.user.client.ui.Button;
026: import com.google.gwt.user.client.ui.ClickListener;
027: import com.google.gwt.user.client.ui.Composite;
028: import com.google.gwt.user.client.ui.HTML;
029: import com.google.gwt.user.client.ui.Panel;
030: import com.google.gwt.user.client.ui.ScrollPanel;
031: import com.google.gwt.user.client.ui.Tree;
032: import com.google.gwt.user.client.ui.TreeItem;
033: import com.google.gwt.user.client.ui.TreeListener;
034: import com.google.gwt.user.client.ui.VerticalPanel;
035: import com.google.gwt.user.client.ui.Widget;
036:
037: /**
038: * This is a rule/resource navigator that uses the server side categories to
039: * navigate the repository.
040: * Uses the the {@link com.google.gwt.user.client.ui.Tree} widget.
041: */
042: public class CategoryExplorerWidget extends Composite implements
043: TreeListener {
044:
045: private Tree navTreeWidget = new Tree();
046: private VerticalPanel panel = new VerticalPanel();
047: private RepositoryServiceAsync service = RepositoryServiceFactory
048: .getService();
049: private CategorySelectHandler categorySelectHandler;
050: private String selectedPath;
051: private Panel emptyCategories;
052:
053: public void setTreeSize(String width) {
054: navTreeWidget.setWidth(width);
055: }
056:
057: /**
058: * Create a new cat explorer.
059: * @param handler
060: */
061: public CategoryExplorerWidget(CategorySelectHandler handler) {
062: panel.add(navTreeWidget);
063:
064: this .categorySelectHandler = handler;
065: loadInitialTree();
066:
067: initWidget(panel);
068: navTreeWidget.addTreeListener(this );
069: this .setStyleName("category-explorer-Tree");
070: }
071:
072: /**
073: * This refreshes the view.
074: */
075: public void refresh() {
076: navTreeWidget.removeItems();
077: selectedPath = null;
078: loadInitialTree();
079: }
080:
081: public void showEmptyTree() {
082:
083: if (this .emptyCategories == null) {
084: AbsolutePanel p = new AbsolutePanel();
085: p
086: .add(new HTML(
087: "No categories created yet. Add some categories from the administration screen."));
088: Button b = new Button("Refresh");
089: b.addClickListener(new ClickListener() {
090: public void onClick(Widget w) {
091: refresh();
092: }
093: });
094: p.add(b);
095: p.setStyleName("small-Text");
096: this .emptyCategories = p;
097: this .panel.add(this .emptyCategories);
098: }
099: emptyCategories.setVisible(true);
100:
101: }
102:
103: /** This will refresh the tree and restore it back to the original state */
104: private void loadInitialTree() {
105: navTreeWidget.addItem("Please wait...");
106: service.loadChildCategories("/", new AsyncCallback() {
107:
108: public void onFailure(Throwable caught) {
109: ErrorPopup
110: .showMessage("A server error occurred loading categories.");
111: navTreeWidget.removeItems();
112: navTreeWidget.addItem("Unable to load categories.");
113: }
114:
115: public void onSuccess(Object result) {
116: selectedPath = null;
117: navTreeWidget.removeItems();
118: String[] categories = (String[]) result;
119:
120: if (categories.length == 0) {
121: showEmptyTree();
122: } else {
123: hideEmptyTree();
124: }
125: for (int i = 0; i < categories.length; i++) {
126: TreeItem it = new TreeItem();
127: it
128: .setHTML("<img src=\"images/category_small.gif\"/>"
129: + categories[i]);
130: it.setUserObject(categories[i]);
131: it.addItem(new PendingItem());
132: navTreeWidget.addItem(it);
133: }
134:
135: }
136:
137: });
138:
139: }
140:
141: private void hideEmptyTree() {
142: if (this .emptyCategories != null) {
143: this .emptyCategories.setVisible(false);
144: }
145:
146: }
147:
148: public void onTreeItemSelected(TreeItem item) {
149: this .selectedPath = getPath(item);
150: this .categorySelectHandler.selected(selectedPath);
151: }
152:
153: public void onTreeItemStateChanged(TreeItem item) {
154:
155: if (hasBeenLoaded(item)) {
156: return;
157: }
158:
159: final TreeItem root = item;
160:
161: //walk back up to build a tree
162: this .selectedPath = getPath(item);
163:
164: //item.setUserObject( new Boolean( true ) );
165:
166: service.loadChildCategories(selectedPath, new AsyncCallback() {
167:
168: public void onFailure(Throwable caught) {
169: ErrorPopup
170: .showMessage("Unable to load categories for ["
171: + selectedPath + "]");
172: }
173:
174: public void onSuccess(Object result) {
175: TreeItem child = root.getChild(0);
176: if (child instanceof PendingItem) {
177: root.removeItem(child);
178: }
179: String[] list = (String[]) result;
180: for (int i = 0; i < list.length; i++) {
181: TreeItem it = new TreeItem();
182: it
183: .setHTML("<img src=\"images/category_small.gif\"/>"
184: + list[i]);
185: it.setUserObject(list[i]);
186: it.addItem(new PendingItem());
187:
188: root.addItem(it);
189: }
190: }
191:
192: });
193:
194: }
195:
196: private boolean hasBeenLoaded(TreeItem item) {
197: if (item.getChildCount() == 1
198: && item.getChild(0) instanceof PendingItem) {
199: return false;
200: }
201: return true;
202: }
203:
204: private String getPath(TreeItem item) {
205: String categoryPath = (String) item.getUserObject();
206: TreeItem parent = item.getParentItem();
207: while (parent != null) {
208: categoryPath = ((String) parent.getUserObject()) + "/"
209: + categoryPath;
210: parent = parent.getParentItem();
211: }
212: return categoryPath;
213: }
214:
215: private static class PendingItem extends TreeItem {
216: public PendingItem() {
217: super ("Please wait...");
218: }
219: }
220:
221: public String getSelectedPath() {
222: return this.selectedPath;
223: }
224:
225: }
|