2 * Copyright 2011 GRNET S.A. All rights reserved.
4 * Redistribution and use in source and binary forms, with or
5 * without modification, are permitted provided that the following
8 * 1. Redistributions of source code must retain the above
9 * copyright notice, this list of conditions and the following
12 * 2. Redistributions in binary form must reproduce the above
13 * copyright notice, this list of conditions and the following
14 * disclaimer in the documentation and/or other materials
15 * provided with the distribution.
17 * THIS SOFTWARE IS PROVIDED BY GRNET S.A. ``AS IS'' AND ANY EXPRESS
18 * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
19 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
20 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL GRNET S.A OR
21 * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
22 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
23 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
24 * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
25 * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
26 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
27 * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
28 * POSSIBILITY OF SUCH DAMAGE.
30 * The views and conclusions contained in the software and
31 * documentation are those of the authors and should not be
32 * interpreted as representing official policies, either expressed
33 * or implied, of GRNET S.A.
36 package gr.grnet.pithos.web.client.tagtree;
38 import com.google.gwt.cell.client.AbstractCell;
39 import com.google.gwt.cell.client.Cell;
40 import com.google.gwt.cell.client.TextCell;
41 import com.google.gwt.event.dom.client.ContextMenuEvent;
42 import com.google.gwt.safehtml.shared.SafeHtml;
43 import com.google.gwt.safehtml.shared.SafeHtmlBuilder;
44 import com.google.gwt.text.shared.SafeHtmlRenderer;
45 import com.google.gwt.user.client.ui.AbstractImagePrototype;
46 import com.google.gwt.view.client.ListDataProvider;
47 import com.google.gwt.view.client.SingleSelectionModel;
48 import com.google.gwt.view.client.TreeViewModel;
49 import gr.grnet.pithos.web.client.tagtree.TagTreeView.Templates;
51 public class TagTreeViewModel implements TreeViewModel {
53 private Cell<Tag> tagCell = new AbstractCell<Tag>(ContextMenuEvent.getType().getName()) {
56 public void render(Context context, Tag tag, SafeHtmlBuilder safeHtmlBuilder) {
57 String html = AbstractImagePrototype.create(TagTreeView.images.info()).getHTML();
58 safeHtmlBuilder.appendHtmlConstant(html);
59 safeHtmlBuilder.append(Templates.INSTANCE.nameSpan(tag.getName()));
63 public void onBrowserEvent(Context context, com.google.gwt.dom.client.Element parent, Tag tag, com.google.gwt.dom.client.NativeEvent event, com.google.gwt.cell.client.ValueUpdater<Tag> valueUpdater) {
64 if (event.getType().equals(com.google.gwt.event.dom.client.ContextMenuEvent.getType().getName())) {
65 TagTreeViewModel.this.selectionModel.setSelected(tag, true);
70 private ListDataProvider<String> rootDataProvider = new ListDataProvider<String>();
71 private ListDataProvider<Tag> tagDataProvider = new ListDataProvider<Tag>();
73 private SingleSelectionModel<Tag> selectionModel;
75 public TagTreeViewModel(SingleSelectionModel<Tag> selectionModel) {
76 this.selectionModel = selectionModel;
80 public <T> NodeInfo<?> getNodeInfo(T value) {
82 rootDataProvider.getList().add("Tags");
83 return new DefaultNodeInfo<String>(rootDataProvider, new TextCell(new SafeHtmlRenderer<String>() {
85 public SafeHtml render(String object) {
86 SafeHtmlBuilder builder = new SafeHtmlBuilder();
87 String html = AbstractImagePrototype.create(TagTreeView.images.tag()).getHTML();
88 builder.appendHtmlConstant(html);
89 builder.append(Templates.INSTANCE.nameSpan(object));
90 return builder.toSafeHtml();
94 public void render(String object, SafeHtmlBuilder builder) {
95 String html = AbstractImagePrototype.create(TagTreeView.images.tag()).getHTML();
96 builder.appendHtmlConstant(html);
97 builder.append(Templates.INSTANCE.nameSpan(object));
99 }), new SingleSelectionModel<String>(), null);
101 else if (value instanceof String) {
103 return new DefaultNodeInfo<Tag>(tagDataProvider, tagCell, selectionModel, null);
110 public boolean isLeaf(Object o) {
113 if (o instanceof String)
119 // private void fetchFolder(final Iterator<Tag> iter, final ListDataProvider<Tag> dataProvider, final Set<Tag> tags) {
120 // final GSS app = GSS.get();
121 // if (iter.hasNext()) {
122 // final Tag f = iter.next();
124 // String path = app.getApiPath() + app.getUsername() + "/" + f.getContainer() + "?format=json&delimiter=/&prefix=" + f.getPrefix();
125 // GetRequest<Tag> getFolder = new GetRequest<Tag>(Tag.class, path, f) {
127 // public void onSuccess(Tag result) {
128 // fetchFolder(iter, dataProvider, tags);
132 // public void onError(Throwable t) {
133 // GWT.log("Error getting folder", t);
134 // if (t instanceof RestException)
135 // GSS.get().displayError("Error getting folder: " + ((RestException) t).getHttpStatusText());
137 // GSS.get().displayError("System error fetching folder: " + t.getMessage());
140 // getFolder.setHeader("X-Auth-Token", app.getToken());
141 // Scheduler.get().scheduleDeferred(getFolder);
144 // dataProvider.getList().clear();
145 // dataProvider.getList().addAll(tags);
146 // if (dataProvider.equals(rootDataProvider)) {
147 // selectionModel.setSelected(dataProvider.getList().get(0), true);
149 // Tag f = new Tag("Trash");
151 // f.setContainer("trash");
152 // dataProvider.getList().add(f);
154 // f = new Tag("Shared");
155 // f.setContainer("shared");
156 // dataProvider.getList().add(f);
158 // f = new Tag("Others");
159 // f.setContainer("others");
160 // dataProvider.getList().add(f);
162 // f = new Tag("Tags");
163 // f.setContainer("tags");
164 // dataProvider.getList().add(f);
166 // f = new Tag("Groups");
167 // f.setContainer("groups");
168 // dataProvider.getList().add(f);
173 // public void initialize(AccountResource account) {
174 // Iterator<Tag> iter = account.getContainers().iterator();
175 // fetchFolder(iter, rootDataProvider, account.getContainers());
178 public Tag getSelection() {
179 return selectionModel.getSelectedObject();
182 public void updateTag(Tag tag) {
183 // if (dataProviderMap.get(tag) == null) {
184 // dataProviderMap.put(tag, new ListDataProvider<Tag>());
186 // final ListDataProvider<Tag> dataProvider = dataProviderMap.get(tag);
187 // if (!tag.isTrash())
188 // fetchFolder(tag, dataProvider);
190 // GSS.get().showFiles(tag);
193 // public void fetchFolder(final Tag f, final ListDataProvider<Tag> dataProvider) {
194 // dataProvider.flush();
195 // Scheduler.get().scheduleDeferred(new ScheduledCommand() {
197 // public void execute() {
198 // final GSS app = GSS.get();
199 // String path = app.getApiPath() + app.getUsername() + "/" + f.getContainer() + "?format=json&delimiter=/&prefix=" + f.getPrefix();
200 // GetRequest<Tag> getFolder = new GetRequest<Tag>(Tag.class, path, f) {
202 // public void onSuccess(Tag result) {
203 // app.showFiles(result);
204 // Iterator<Tag> iter = result.getSubfolders().iterator();
205 // fetchFolder(iter, dataProvider, result.getSubfolders());
209 // public void onError(Throwable t) {
210 // GWT.log("Error getting folder", t);
211 // if (t instanceof RestException)
212 // GSS.get().displayError("Error getting folder: " + ((RestException) t).getHttpStatusText());
214 // GSS.get().displayError("System error fetching folder: " + t.getMessage());
217 // getFolder.setHeader("X-Auth-Token", app.getToken());
218 // Scheduler.get().scheduleDeferred(getFolder);