2 * Copyright 2011-2013 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.
35 package gr.grnet.pithos.web.client;
37 import gr.grnet.pithos.web.client.commands.CopyCommand;
38 import gr.grnet.pithos.web.client.commands.CutCommand;
39 import gr.grnet.pithos.web.client.commands.DeleteCommand;
40 import gr.grnet.pithos.web.client.commands.PasteCommand;
41 import gr.grnet.pithos.web.client.commands.PropertiesCommand;
42 import gr.grnet.pithos.web.client.commands.RestoreTrashCommand;
43 import gr.grnet.pithos.web.client.commands.ToTrashCommand;
44 import gr.grnet.pithos.web.client.commands.UploadFileCommand;
45 import gr.grnet.pithos.web.client.foldertree.File;
46 import gr.grnet.pithos.web.client.foldertree.Folder;
48 import java.util.List;
50 import com.google.gwt.resources.client.ClientBundle;
51 import com.google.gwt.resources.client.ImageResource;
52 import com.google.gwt.user.client.Command;
53 import com.google.gwt.user.client.Window;
54 import com.google.gwt.user.client.ui.AbstractImagePrototype;
55 import com.google.gwt.user.client.ui.MenuBar;
56 import com.google.gwt.user.client.ui.MenuItem;
57 import com.google.gwt.user.client.ui.PopupPanel;
60 * The 'File Context' menu implementation.
62 public class FileContextMenu extends PopupPanel {
65 * The widget's images.
67 private final Images images;
69 private MenuItem cutItem;
71 private MenuItem copyItem;
73 private MenuItem pasteItem;
75 private MenuItem updateItem;
77 private MenuItem sharingItem;
79 private MenuItem propItem;
81 private MenuItem trashItem;
83 private MenuItem deleteItem;
85 private MenuItem downloadItem;
87 private MenuItem saveAsItem;
90 * The image bundle for this widget's images that reuses images defined in
93 public interface Images extends ClientBundle {
95 @Source("gr/grnet/pithos/resources/mimetypes/document.png")
96 ImageResource fileContextMenu();
98 @Source("gr/grnet/pithos/resources/doc_versions.png")
99 ImageResource versions();
101 @Source("gr/grnet/pithos/resources/groups22.png")
102 ImageResource sharing();
104 @Source("gr/grnet/pithos/resources/border_remove.png")
105 ImageResource unselectAll();
107 @Source("gr/grnet/pithos/resources/demo.png")
108 ImageResource viewImage();
110 @Source("gr/grnet/pithos/resources/folder_new.png")
111 ImageResource folderNew();
113 @Source("gr/grnet/pithos/resources/folder_outbox.png")
114 ImageResource fileUpdate();
116 @Source("gr/grnet/pithos/resources/view_text.png")
117 ImageResource viewText();
119 @Source("gr/grnet/pithos/resources/folder_inbox.png")
120 ImageResource download();
122 @Source("gr/grnet/pithos/resources/trash.png")
123 ImageResource emptyTrash();
125 @Source("gr/grnet/pithos/resources/refresh.png")
126 ImageResource refresh();
129 * Will bundle the file 'editcut.png' residing in the package
130 * 'gr.grnet.pithos.web.resources'.
132 * @return the image prototype
134 @Source("gr/grnet/pithos/resources/editcut.png")
138 * Will bundle the file 'editcopy.png' residing in the package
139 * 'gr.grnet.pithos.web.resources'.
141 * @return the image prototype
143 @Source("gr/grnet/pithos/resources/editcopy.png")
144 ImageResource copy();
147 * Will bundle the file 'editpaste.png' residing in the package
148 * 'gr.grnet.pithos.web.resources'.
150 * @return the image prototype
152 @Source("gr/grnet/pithos/resources/editpaste.png")
153 ImageResource paste();
156 * Will bundle the file 'editdelete.png' residing in the package
157 * 'gr.grnet.pithos.web.resources'.
159 * @return the image prototype
161 @Source("gr/grnet/pithos/resources/editdelete.png")
162 ImageResource delete();
165 * Will bundle the file 'translate.png' residing in the package
166 * 'gr.grnet.pithos.web.resources'.
168 * @return the image prototype
170 @Source("gr/grnet/pithos/resources/translate.png")
171 ImageResource selectAll();
173 @Source("gr/grnet/pithos/resources/internet.png")
174 ImageResource internet();
177 public static native String getDate()/*-{
178 return (new Date()).toUTCString();
182 * The widget's constructor.
184 * @param newImages the image bundle passed on by the parent object
186 public FileContextMenu(final Pithos app, Images newImages, TreeView selectedTree, Folder selectedFolder, final List<File> selectedFiles) {
187 // The popup's constructor's argument is a boolean specifying that it
188 // auto-close itself when the user clicks outside of it.
191 MenuBar contextMenu = new MenuBar(true);
192 Boolean[] permissions = null;
193 boolean canWrite = true;
194 if (selectedFolder != null) {
195 permissions = selectedFolder.getPermissions().get(app.getUserID());
196 canWrite = selectedFolder.getOwnerID().equals(app.getUserID()) || (permissions!= null && permissions[1] != null && permissions[1]);
199 for (File f : selectedFiles) {
200 permissions = f.getPermissions().get(app.getUserID());
201 canWrite &= (f.getOwnerID().equals(app.getUserID()) || (permissions!= null && permissions[1] != null && permissions[1]));
204 boolean isFolderTreeSelected = selectedTree.equals(app.getFolderTreeView());
205 boolean isMysharedSelected = selectedTree.equals(app.getMySharedTreeView());
206 if (selectedFolder != null) {
207 if (!selectedFolder.isInTrash()) {
208 if (canWrite && app.getClipboard().hasFiles() && !isMysharedSelected) {
209 pasteItem = new MenuItem("<span>" + AbstractImagePrototype.create(images.paste()).getHTML() + " Paste</span>", true, new PasteCommand(app, this, selectedFolder));
210 contextMenu.addItem(pasteItem);
213 if (canWrite && !isMysharedSelected) {
214 MenuItem upload = new MenuItem("<span>" + AbstractImagePrototype.create(images.fileUpdate()).getHTML() + " Upload</span>", true, new UploadFileCommand(app, this, selectedFolder));
215 contextMenu.addItem(upload);
217 if (isFolderTreeSelected || isMysharedSelected) {
218 cutItem = new MenuItem("<span id='fileContextMenu.cut'>" + AbstractImagePrototype.create(newImages.cut()).getHTML() + " Cut</span>", true, new CutCommand(app, this, selectedFiles));
219 contextMenu.addItem(cutItem);
222 copyItem = new MenuItem("<span>" + AbstractImagePrototype.create(newImages.copy()).getHTML() + " Copy</span>", true, new CopyCommand(app, this, selectedFiles));
223 contextMenu.addItem(copyItem);
225 if (isFolderTreeSelected || isMysharedSelected) {
226 trashItem = new MenuItem("<span>" + AbstractImagePrototype.create(newImages.emptyTrash()).getHTML() + " Move to Trash</span>", true, new ToTrashCommand(app, this, selectedFiles));
227 contextMenu.addItem(trashItem);
231 MenuItem restore = new MenuItem("<span>" + AbstractImagePrototype.create(images.versions()).getHTML() + " Restore</span>", true, new RestoreTrashCommand(app, this, selectedFiles));
232 contextMenu.addItem(restore);
236 if (isFolderTreeSelected || isMysharedSelected) {
237 deleteItem = new MenuItem("<span>" + AbstractImagePrototype.create(newImages.delete()).getHTML() + " Delete</span>", true, new DeleteCommand(app, this, selectedFiles, MessagePanel.images));
238 contextMenu.addItem(deleteItem);
241 if (selectedFolder != null && !selectedFolder.isInTrash()) {
242 if ((isFolderTreeSelected || isMysharedSelected) && selectedFiles.size() == 1) {
243 contextMenu.addItem(new MenuItem("<span>" + AbstractImagePrototype.create(newImages.viewText()).getHTML() + " Properties</span>", true, new PropertiesCommand(app, this, selectedFiles, PropertiesCommand.PROPERTIES)));
244 contextMenu.addItem(new MenuItem("<span>" + AbstractImagePrototype.create(newImages.sharing()).getHTML() + " Share</span>", true, new PropertiesCommand(app, this, selectedFiles, PropertiesCommand.PERMISSIONS)));
245 contextMenu.addItem(new MenuItem("<span>" + AbstractImagePrototype.create(newImages.versions()).getHTML() + " Versions</span>", true, new PropertiesCommand(app, this, selectedFiles, PropertiesCommand.VERSIONS)));
249 contextMenu.addItem(new MenuItem("<span>" + AbstractImagePrototype.create(newImages.download()).getHTML() + " Download</span>", true, new Command() {
252 public void execute() {
253 for (File f : selectedFiles)
254 Window.open(app.getApiPath() + f.getOwnerID() + f.getUri(), "_blank", "");