/*
- * Copyright 2007, 2008, 2009 Electronic Business Systems Ltd. This file is part
- * of GSS. GSS is free software: you can redistribute it and/or modify it under
- * the terms of the GNU General Public License as published by the Free Software
- * Foundation, either version 3 of the License, or (at your option) any later
- * version. GSS is distributed in the hope that it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
- * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more
- * details. You should have received a copy of the GNU General Public License
- * along with GSS. If not, see <http://www.gnu.org/licenses/>.
+ * Copyright 2007, 2008, 2009, 2010 Electronic Business Systems Ltd.
+ *
+ * This file is part of GSS.
+ *
+ * GSS is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * GSS is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with GSS. If not, see <http://www.gnu.org/licenses/>.
*/
package gr.ebs.gss.client;
import gr.ebs.gss.client.clipboard.Clipboard;
+import gr.ebs.gss.client.commands.GetUserCommand;
import gr.ebs.gss.client.dnd.DnDFocusPanel;
import gr.ebs.gss.client.dnd.DnDSimpleFocusPanel;
import gr.ebs.gss.client.rest.GetCommand;
import gr.ebs.gss.client.rest.resource.TrashResource;
import gr.ebs.gss.client.rest.resource.UserResource;
+import java.util.Arrays;
+import java.util.Date;
+import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import com.google.gwt.event.logical.shared.ResizeHandler;
import com.google.gwt.event.logical.shared.SelectionEvent;
import com.google.gwt.event.logical.shared.SelectionHandler;
+import com.google.gwt.event.logical.shared.ValueChangeEvent;
+import com.google.gwt.event.logical.shared.ValueChangeHandler;
+import com.google.gwt.i18n.client.DateTimeFormat;
import com.google.gwt.resources.client.ClientBundle;
import com.google.gwt.resources.client.ImageResource;
import com.google.gwt.user.client.Command;
private PickupDragController dragController;
+ public HashMap<String, String> userFullNameMap = new HashMap<String, String>();
+
+ @Override
public void onModuleLoad() {
// Initialize the singleton before calling the constructors of the
// various widgets that might call GSS.get().
@Override
public void previewDragStart() throws VetoDragException {
- super.previewDragStart();
- if (context.selectedWidgets.isEmpty())
+ super.previewDragStart();
+ if (context.selectedWidgets.isEmpty())
throw new VetoDragException();
- if (context.draggable != null)
- if (context.draggable instanceof DnDFocusPanel) {
+ if(context.draggable != null)
+ if(context.draggable instanceof DnDFocusPanel){
DnDFocusPanel toDrop = (DnDFocusPanel) context.draggable;
// prevent drag and drop for trashed files and for
// unselected tree items
- if (toDrop.getFiles() != null && folders.isTrashItem(folders.getCurrent()))
+ if(toDrop.getFiles() != null && folders.isTrashItem(folders.getCurrent()))
throw new VetoDragException();
- else if (toDrop.getItem() != null && !toDrop.getItem().equals(folders.getCurrent()))
+ else if(toDrop.getItem() != null && !toDrop.getItem().equals(folders.getCurrent()))
throw new VetoDragException();
- else if (toDrop.getItem() != null && !toDrop.getItem().isDraggable())
+ else if(toDrop.getItem() != null && !toDrop.getItem().isDraggable())
throw new VetoDragException();
} else if (context.draggable instanceof DnDSimpleFocusPanel) {
- DnDSimpleFocusPanel toDrop = (DnDSimpleFocusPanel) context.draggable;
+ DnDSimpleFocusPanel toDrop = (DnDSimpleFocusPanel) context.draggable;
// prevent drag and drop for trashed files and for
// unselected tree items
- if (toDrop.getFiles() != null && folders.isTrashItem(folders.getCurrent()))
+ if(toDrop.getFiles() != null && folders.isTrashItem(folders.getCurrent()))
throw new VetoDragException();
- }
- }
+ }
+ }
@Override
protected Widget newDragProxy(DragContext aContext) {
AbsolutePanel container = new AbsolutePanel();
+ HTML html = null;
DOM.setStyleAttribute(container.getElement(), "overflow", "visible");
+ if(aContext.draggable!=null && aContext.draggable.getParent()!= null && aContext.draggable.getParent() instanceof FileTable){
+ if(getFileList().getSelectedFiles().size()>1){
+ html=new HTML(getFileList().getSelectedFiles().size()+ " files");
+ container.add(html);
+ return container;
+ }
+ FileTable proxy;
+ proxy = new FileTable(1,8);
+ proxy.addStyleName("gss-List");
+ FileTable draggableTable = (FileTable) context.draggable.getParent();
+ int dragRow = FileTable.getWidgetRow(context.draggable, draggableTable);
+ FileTable.copyRow(draggableTable, proxy, dragRow, 0);
+ return proxy;
+
+ }
for (Iterator iterator = aContext.selectedWidgets.iterator(); iterator.hasNext();) {
- HTML html = null;
Widget widget = (Widget) iterator.next();
if (widget instanceof DnDFocusPanel) {
DnDFocusPanel book = (DnDFocusPanel) widget;
DnDSimpleFocusPanel book = (DnDSimpleFocusPanel) widget;
html = book.cloneHTML();
}
- if (html == null)
+ if(html == null)
container.add(new Label("Drag ME"));
else
container.add(html);
+ return container;
}
return container;
}
@Override
public void onSelection(SelectionEvent<Integer> event) {
int tabIndex = event.getSelectedItem();
+// TreeItem treeItem = GSS.get().getFolders().getCurrent();
switch (tabIndex) {
case 0:
+// Files tab selected
fileList.clearSelectedRows();
fileList.updateCurrentlyShowingStats();
- History.newItem("Files");
break;
case 1:
+// Groups tab selected
groups.updateCurrentlyShowingStats();
- History.newItem("Groups");
+ updateHistory("Groups");
break;
case 2:
+// Search tab selected
searchResults.clearSelectedRows();
searchResults.updateCurrentlyShowingStats();
- History.newItem("Search");
+ updateHistory("Search");
break;
}
}
});
-// History.addValueChangeHandler(new ValueChangeHandler<String>() {
-//
-// public void onValueChange(ValueChangeEvent<String> event) {
-// String historyToken = event.getValue();
-// try {
-// if (historyToken.equals("Files"))
-// inner.selectTab(1);
-// else if (historyToken.equals("Groups"))
-// inner.selectTab(2);
-// else if (historyToken.equals("Search Results"))
-// inner.selectTab(3);
-// else
-// inner.selectTab(0);
-// } catch (IndexOutOfBoundsException e) {
-// inner.selectTab(0);
-// }
-// }
-// });
+// If the application starts with no history token, redirect to a new "Files" state
+ String initToken = History.getToken();
+ if(initToken.length() == 0)
+ History.newItem("Files");
+// Add history listener to handle any history events
+ History.addValueChangeHandler(new ValueChangeHandler<String>() {
+ @Override
+ public void onValueChange(ValueChangeEvent<String> event) {
+ String tokenInput = event.getValue();
+ String historyToken = handleSpecialFolderNames(tokenInput);
+ try {
+ if(historyToken.equals("Search"))
+ inner.selectTab(2);
+ else if(historyToken.equals("Groups"))
+ inner.selectTab(1);
+ else if(historyToken.equals("Files")|| historyToken.length()==0)
+ inner.selectTab(0);
+ else {
+ PopupTree popupTree = GSS.get().getFolders().getPopupTree();
+ TreeItem treeObj = GSS.get().getFolders().getPopupTree().getTreeItem(historyToken);
+ SelectionEvent.fire(popupTree, treeObj);
+ }
+ } catch (IndexOutOfBoundsException e) {
+ inner.selectTab(0);
+ }
+ }
+ });
// Add the left and right panels to the split panel.
splitPanel.setLeftWidget(folders);
// sizes have been computed by the browser.
DeferredCommand.addCommand(new Command() {
+ @Override
public void execute() {
onWindowResized(Window.getClientHeight());
}
if (announcement != null)
DeferredCommand.addCommand(new Command() {
+ @Override
public void execute() {
displayInformation(announcement);
}
Configuration conf = (Configuration) GWT.create(Configuration.class);
String cookie = conf.authCookie();
String auth = Cookies.getCookie(cookie);
- String domain = Window.Location.getHostName();
- String path = Window.Location.getPath();
- Cookies.setCookie(cookie, "", null, domain, path, false);
if (auth == null) {
authenticateUser();
// Redundant, but silences warnings about possible auth NPE, below.
int sepIndex = auth.indexOf(conf.cookieSeparator());
if (sepIndex == -1)
authenticateUser();
- token = auth.substring(sepIndex + 1, auth.length());
+ token = auth.substring(sepIndex + 1);
final String username = auth.substring(0, sepIndex);
if (username == null)
authenticateUser();
DeferredCommand.addCommand(new Command() {
+ @Override
public void execute() {
fetchUser(username);
}
}
/**
- * Redirect the user to the logout page.
+ * Clear the cookie and redirect the user to the logout page.
*/
void logout() {
Configuration conf = (Configuration) GWT.create(Configuration.class);
+ String cookie = conf.authCookie();
+ String domain = Window.Location.getHostName();
+ String path = Window.Location.getPath();
+ Cookies.setCookie(cookie, "", null, domain, path, false);
Window.Location.assign(conf.logoutUrl());
}
* @param y the new height
*/
public static native void resizeTo(int x, int y) /*-{
- $wnd.resizeTo(x,y);
- }-*/;
+ $wnd.resizeTo(x,y);
+ }-*/;
/**
* A helper method that returns true if the user's list is currently visible
}
public static native void preventIESelection() /*-{
- $doc.body.onselectstart = function () { return false; };
- }-*/;
+ $doc.body.onselectstart = function () { return false; };
+ }-*/;
public static native void enableIESelection() /*-{
- if ($doc.body.onselectstart != null)
- $doc.body.onselectstart = null;
- }-*/;
+ if ($doc.body.onselectstart != null)
+ $doc.body.onselectstart = null;
+ }-*/;
/**
* @return the absolute path of the API root URL
Cookies.setCookie(cookie, "", null, domain, path, false);
}
+ /**
+ * Convert server date to local time according to browser timezone
+ * and format it according to localized pattern.
+ * Time is always formatted to 24hr format.
+ * NB: This assumes that server runs in UTC timezone. Otherwise
+ * we would need to adjust for server time offset as well.
+ *
+ * @param date
+ * @return String
+ */
+ public static String formatLocalDateTime(Date date) {
+ Date convertedDate = new Date(date.getTime() - date.getTimezoneOffset());
+ final DateTimeFormat dateFormatter = DateTimeFormat.getShortDateFormat();
+ final DateTimeFormat timeFormatter = DateTimeFormat.getFormat("HH:mm");
+ String datePart = dateFormatter.format(convertedDate);
+ String timePart = timeFormatter.format(convertedDate);
+ return datePart + " " + timePart;
+ }
+
+ /**
+ * History support for folder navigation
+ * adds a new browser history entry
+ *
+ * @param key
+ */
+ public void updateHistory(String key){
+// Replace any whitespace of the initial string to "+"
+// String result = key.replaceAll("\\s","+");
+// Add a new browser history entry.
+// History.newItem(result);
+ History.newItem(key);
+ }
+
+ /**
+ * This method examines the token input and add a "/" at the end in case it's omitted.
+ * This happens only in Files/trash/, Files/shared/, Files/others.
+ *
+ * @param tokenInput
+ * @return the formated token with a "/" at the end or the same tokenInput parameter
+ */
+
+ private String handleSpecialFolderNames(String tokenInput){
+ List<String> pathsToCheck = Arrays.asList("Files/trash", "Files/shared", "Files/others");
+ if(pathsToCheck.contains(tokenInput))
+ return tokenInput + "/";
+ return tokenInput;
+
+ }
+
+ /**
+ * Reject illegal resource names, like '.' or '..' or slashes '/'.
+ */
+ static boolean isValidResourceName(String name) {
+ if (".".equals(name) || "..".equals(name) || name.contains("/"))
+ return false;
+ return true;
+ }
+
+ public void putUserToMap(String _userName, String _userFullName){
+ userFullNameMap.put(_userName, _userFullName);
+ }
+
+ public String findUserFullName(String _userName){
+ return userFullNameMap.get(_userName);
+ }
+
+ public String getUserFullName(String _userName) {
+ if (GSS.get().findUserFullName(_userName) == null)
+ //if there is no userFullName found then the map fills with the given _userName,
+ //so userFullName = _userName
+ GSS.get().putUserToMap(_userName, _userName);
+ else if(GSS.get().findUserFullName(_userName).indexOf('@') != -1){
+ //if the userFullName = _userName the GetUserCommand updates the userFullName in the map
+ GetUserCommand guc = new GetUserCommand(_userName);
+ guc.execute();
+ }
+ return GSS.get().findUserFullName(_userName);
+ }
}