/**
* OpenKM, Open Document Management System (http://www.openkm.com)
* Copyright (c) 2006-2011 Paco Avila & Josep Llort
*
* No bytes were intentionally harmed during the development of this application.
*
* This program 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 2 of the License, or
* (at your option) any later version.
*
* This program 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 this program; if not, write to the Free Software Foundation, Inc.,
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
*/
package com.openkm.frontend.client.widget.foldertree;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import com.google.gwt.core.client.GWT;
import com.google.gwt.event.logical.shared.SelectionEvent;
import com.google.gwt.event.logical.shared.SelectionHandler;
import com.google.gwt.user.client.Element;
import com.google.gwt.user.client.rpc.AsyncCallback;
import com.google.gwt.user.client.rpc.ServiceDefTarget;
import com.google.gwt.user.client.ui.Composite;
import com.google.gwt.user.client.ui.TreeItem;
import com.openkm.frontend.client.Main;
import com.openkm.frontend.client.OKMException;
import com.openkm.frontend.client.bean.GWTFolder;
import com.openkm.frontend.client.bean.GWTPermission;
import com.openkm.frontend.client.contants.service.ErrorCode;
import com.openkm.frontend.client.contants.service.RPCService;
import com.openkm.frontend.client.contants.ui.UIDesktopConstants;
import com.openkm.frontend.client.service.OKMDocumentService;
import com.openkm.frontend.client.service.OKMDocumentServiceAsync;
import com.openkm.frontend.client.service.OKMFolderService;
import com.openkm.frontend.client.service.OKMFolderServiceAsync;
import com.openkm.frontend.client.service.OKMNotifyService;
import com.openkm.frontend.client.service.OKMNotifyServiceAsync;
import com.openkm.frontend.client.service.OKMRepositoryService;
import com.openkm.frontend.client.service.OKMRepositoryServiceAsync;
import com.openkm.frontend.client.util.Util;
import com.openkm.frontend.client.widget.ConfirmPopup;
import com.openkm.frontend.client.widget.MenuPopup;
import com.openkm.frontend.client.widget.OriginPanel;
import com.openkm.frontend.client.widget.startup.StartUp;
/**
* Folder tree
*
* @author jllort
*
*/
public class FolderTree extends Composite implements OriginPanel {
// Definitions of folder actions
public static final int ACTION_NONE = -1;
public static final int ACTION_CREATE = 0;
public static final int ACTION_RENAME = 1;
public static final int ACTION_SECURITY_REFRESH = 2;
private final OKMFolderServiceAsync folderService = (OKMFolderServiceAsync) GWT
.create(OKMFolderService.class);
private final OKMNotifyServiceAsync notifyService = (OKMNotifyServiceAsync) GWT
.create(OKMNotifyService.class);
private final OKMDocumentServiceAsync documentService = (OKMDocumentServiceAsync) GWT
.create(OKMDocumentService.class);
private final OKMRepositoryServiceAsync repositoryService = (OKMRepositoryServiceAsync) GWT
.create(OKMRepositoryService.class);
private ExtendedTree tree;
public TreeItem actualItem;
public FolderSelectPopup folderSelectPopup;
public MenuPopup menuPopup;
private boolean panelSelected = true; // Indicates if panel is selected
public TreeItem tmpFolder; // Used temporary to create new folder
private FolderTextBox renFolder; // Used temporary to rename a new folder
public GWTFolder folderRoot; // To preserve folder root value
public TreeItem rootItem;
ArrayList<String> tmpAllPathFolder = new ArrayList<String>(); // Used to
// preserve
// all node
// path
// route of
// a path
public int folderAction = ACTION_NONE; // To control rename and create
// folder actions
private TreeItem otherTreeItemSelected = null;
private String tmpRenameHtmlFolder;
private String tmpFldPath; // Used to refreshing from parameter url
private boolean refreshFileBrowser = false;
private boolean setTabFolderAfterRefresh = false;
/**
* Directory Tree
*/
public FolderTree() {
tree = new ExtendedTree();
tmpFolder = new TreeItem("");
tmpFolder.setStyleName("okm-TreeItem");
folderSelectPopup = new FolderSelectPopup();
folderSelectPopup.setWidth("300");
folderSelectPopup.setHeight("240");
folderSelectPopup.setStyleName("okm-Popup");
TreeItem rootItem = new TreeItem(Util.imageItemHTML("img/menuitem_childs.gif", "root_schema", "top"));
rootItem.setStyleName("okm-TreeItem");
rootItem.setUserObject(new GWTFolder());
rootItem.setSelected(true);
rootItem.setState(true);
rootItem.addStyleName("okm-DisableSelect"); // Disables drag and drop
// browser text selection
tree.setStyleName("okm-Tree");
tree.addStyleName("okm-PanelSelected");
tree.addItem(rootItem);
tree.addSelectionHandler(new SelectionHandler<TreeItem>() {
@Override
public void onSelection(SelectionEvent<TreeItem> event) {
onTreeItemSelected(event.getSelectedItem());
}
});
actualItem = tree.getItem(0);
initWidget(tree);
}
/**
* Inits on first load
*/
public void init() {
}
/**
* Refresh language values
*/
public void langRefresh() {
menuPopup.langRefresh();
folderSelectPopup.langRefresh();
}
/**
* Refresh asyncronous subtree branch
*/
final AsyncCallback<List<GWTFolder>> callbackGetChilds = new AsyncCallback<List<GWTFolder>>() {
public void onSuccess(List<GWTFolder> result) {
boolean directAdd = true;
List<GWTFolder> folderList = result;
// If has no childs directly add values is permited
if (actualItem.getChildCount() > 0) {
directAdd = false;
// to prevent remote folder remove it disables all tree
// branch items and after sequentially activate
hideAllBranch(actualItem);
}
// On refreshing not refreshed the actual item values but must
// ensure that has childs value is consistent
if (folderList.isEmpty()) {
((GWTFolder) actualItem.getUserObject()).setHasChilds(false);
} else {
((GWTFolder) actualItem.getUserObject()).setHasChilds(true);
}
// Ads folders childs if exists
for (Iterator<GWTFolder> it = folderList.iterator(); it.hasNext();) {
GWTFolder folder = it.next();
TreeItem folderItem = new TreeItem(folder.getName());
folderItem.setUserObject(folder);
folderItem.setStyleName("okm-TreeItem");
// If has no childs directly add values is permited, else
// evalues
// each node to refresh, remove or add
if (directAdd) {
evaluesFolderIcon(folderItem);
actualItem.addItem(folderItem);
} else {
// sequentially activate items and refreshes values
addFolder(actualItem, folderItem);
}
}
actualItem.setState(true);
evaluesFolderIcon(actualItem);
// while tmpAllPathFolder is not empty must refresh path array
// values on inverse order
if (!tmpAllPathFolder.isEmpty()) {
int index = tmpAllPathFolder.size() - 1;
String tmpPath = tmpAllPathFolder.get(index);
tmpAllPathFolder.remove(index);
if (index > 0) {
setActiveNode(tmpPath, false);
} else if (tmpFldPath != null && !tmpFldPath.equals("")) {
// Sets tmpFldPath at the last folder node to open
if (tmpFldPath.equals(tmpPath)) {
tmpFldPath = null;
}
setActiveNode(tmpPath, refreshFileBrowser);
}
} else if (setTabFolderAfterRefresh) {
// Refresh tab properties values on the last node
showTabFolderProperties();
setTabFolderAfterRefresh = false;
}
GWTFolder folderParent;
// Case actualItem is root then folder parent is actualItem folder
if (actualItem == rootItem) {
folderParent = (GWTFolder) actualItem.getUserObject();
} else {
folderParent = (GWTFolder) actualItem.getParentItem().getUserObject();
}
Main.get().mainPanel.topPanel.toolBar.checkToolButtonPermissions((GWTFolder) actualItem
.getUserObject(), folderParent, TREE_ROOT);
Main.get().mainPanel.desktop.navigator.status.unsetFlagChilds();
// Opens a document passed by url param
openDocumentByBrowserURLParam();
}
public void onFailure(Throwable caught) {
Main.get().mainPanel.desktop.navigator.status.unsetFlagChilds();
Main.get().showError("GetChilds", caught);
}
};
/**
* Refresh asyncronous subtree branch
*/
final AsyncCallback<List<GWTFolder>> callbackGetOnlyChilds = new AsyncCallback<List<GWTFolder>>() {
public void onSuccess(List<GWTFolder> result) {
boolean directAdd = true;
List<GWTFolder> folderList = result;
// If has no childs directly add values is permited
if (actualItem.getChildCount() > 0) {
directAdd = false;
// to prevent remote folder remove it disables all tree
// branch items and after sequentially activate
hideAllBranch(actualItem);
}
// On refreshing not refreshed the actual item values but must
// ensure that has childs value is consistent
if (folderList.isEmpty()) {
((GWTFolder) actualItem.getUserObject()).setHasChilds(false);
} else {
((GWTFolder) actualItem.getUserObject()).setHasChilds(true);
}
// Ads folders childs if exists
for (Iterator<GWTFolder> it = folderList.iterator(); it.hasNext();) {
GWTFolder folder = it.next();
TreeItem folderItem = new TreeItem(folder.getName());
folderItem.setUserObject(folder);
folderItem.setStyleName("okm-TreeItem");
// If has no childs directly add values is permited, else
// evalues
// each node to refresh, remove or add
if (directAdd) {
evaluesFolderIcon(folderItem);
actualItem.addItem(folderItem);
} else {
// sequentially activate items and refreshes values
addFolder(actualItem, folderItem);
}
}
actualItem.setState(true);
evaluesFolderIcon(actualItem);
}
public void onFailure(Throwable caught) {
Main.get().showError("GetOnlyChilds", caught);
}
};
/**
* Refresh asyncronous subtree branch after an item menu is deleted
*/
final AsyncCallback<Object> callbackDelete = new AsyncCallback<Object>() {
public void onSuccess(Object result) {
TreeItem tmpItem = actualItem;
actualItem = actualItem.getParentItem();
actualItem.setSelected(true);
actualItem.setState(true);
actualItem.removeItem(tmpItem);
evaluesFolderIcon(actualItem);
showTabFolderProperties();
Main.get().mainPanel.desktop.navigator.status.unsetFlagDelete();
refresh(true);
}
public void onFailure(Throwable caught) {
Main.get().mainPanel.desktop.navigator.status.unsetFlagDelete();
Main.get().showError("Delete", caught);
}
};
/**
* Gets actual foler node
*/
final AsyncCallback<GWTFolder> callbackGet = new AsyncCallback<GWTFolder>() {
public void onSuccess(GWTFolder result) {
actualItem.setUserObject(result);
evaluesFolderIcon(actualItem);
if (folderAction == ACTION_SECURITY_REFRESH) {
Main.get().mainPanel.desktop.browser.tabMultiple.tabFolder.setProperties((GWTFolder) actualItem
.getUserObject());
folderAction = ACTION_NONE;
}
Main.get().mainPanel.desktop.navigator.status.unsetFlagGet();
}
public void onFailure(Throwable caught) {
folderAction = ACTION_NONE; // Ensures on error folder action be
// restores
Main.get().mainPanel.desktop.navigator.status.unsetFlagGet();
Main.get().showError("Get", caught);
}
};
/**
* Call back create
*/
final AsyncCallback<GWTFolder> callbackCreate = new AsyncCallback<GWTFolder>() {
public void onSuccess(GWTFolder result) {
actualItem = actualItem.getParentItem(); // Restores the real
// actualItem
tmpFolder.setSelected(false);
actualItem.setSelected(true);
actualItem.setState(true);
GWTFolder folder = result;
GWTFolder folderItem = (GWTFolder) actualItem.getUserObject();
folderItem.setHasChilds(true);
actualItem.removeItem(tmpFolder);
TreeItem newFolder = new TreeItem(Util.imageItemHTML("img/menuitem_empty.gif", folder.getName(),
"top"));
newFolder.setUserObject(folder);
newFolder.setStyleName("okm-TreeItem");
actualItem.addItem(newFolder);
evaluesFolderIcon(newFolder);
evaluesFolderIcon(actualItem);
Main.get().mainPanel.desktop.navigator.status.unsetFlagCreate();
Main.get().mainPanel.desktop.browser.fileBrowser.status.setFlagFolderChilds();
Main.get().mainPanel.desktop.browser.fileBrowser.addFolder(folder);
// Special case when we are creating a folder and selects other tree
// item before removing tmp folder
// must changing to the real item selected
if (otherTreeItemSelected != null) {
onTreeItemSelected(otherTreeItemSelected);
otherTreeItemSelected = null;
}
folderAction = ACTION_NONE;
}
public void onFailure(Throwable caught) {
// On error remove tmp folder
removeTmpFolderCreate();
folderAction = ACTION_NONE;
Main.get().mainPanel.desktop.navigator.status.unsetFlagCreate();
Main.get().showError("Create", caught);
}
};
/**
* Call back rename
*/
final AsyncCallback<GWTFolder> callbackRename = new AsyncCallback<GWTFolder>() {
public void onSuccess(GWTFolder result) {
GWTFolder folder = result;
String oldPath = ((GWTFolder) actualItem.getUserObject()).getPath();
actualItem.setUserObject(folder);
evaluesFolderIcon(actualItem);
showTabFolderProperties();
String path = ((GWTFolder) actualItem.getUserObject()).getPath();
Main.get().mainPanel.desktop.browser.fileBrowser.refresh(path);
Main.get().mainPanel.desktop.navigator.status.unsetFlagRename();
path = path.substring(1); // deletes first character "/" because
// parent path not has
oldPath = oldPath.substring(1); // deletes first character "/"
// because parent path not has
changePathBeforeRenaming(oldPath, path, actualItem);
folderAction = ACTION_NONE;
}
public void onFailure(Throwable caught) {
folderAction = ACTION_NONE;
Main.get().mainPanel.desktop.navigator.status.unsetFlagRename();
Main.get().showError("Rename", caught);
cancelRename(); // Cancel renaming on error
}
};
/**
* Callback add subscription
*/
final AsyncCallback<Object> callbackAddSubscription = new AsyncCallback<Object>() {
public void onSuccess(Object result) {
((GWTFolder) actualItem.getUserObject()).setSubscribed(true);
((GWTFolder) actualItem.getUserObject()).getSubscriptors().add(
Main.get().workspaceUserProperties.getUser()); // Adds user
// on
// subscribed
// list
GWTFolder folderParent;
// Case actualItem is root then folder parent is actualItem folder
if (actualItem == rootItem) {
folderParent = (GWTFolder) actualItem.getUserObject();
} else {
folderParent = (GWTFolder) actualItem.getParentItem().getUserObject();
}
Main.get().mainPanel.topPanel.toolBar.checkToolButtonPermissions((GWTFolder) actualItem
.getUserObject(), folderParent, TREE_ROOT);
evaluesFolderIcon(actualItem);
Main.get().mainPanel.desktop.navigator.status.unsetFlagAddSubscription();
showTabFolderProperties(); // Refresh folder properties
Main.get().mainPanel.dashboard.userDashboard.getUserSubscribedFolders();
}
public void onFailure(Throwable caught) {
Main.get().mainPanel.desktop.navigator.status.unsetFlagAddSubscription();
Main.get().showError("AddSubscription", caught);
}
};
/**
* Callback remove subscription
*/
final AsyncCallback<Object> callbackRemoveSubscription = new AsyncCallback<Object>() {
public void onSuccess(Object result) {
((GWTFolder) actualItem.getUserObject()).setSubscribed(false);
((GWTFolder) actualItem.getUserObject()).getSubscriptors().remove(
Main.get().workspaceUserProperties.getUser()); // Remove
// user from
// subscription
// list
GWTFolder folderParent;
// Case actualItem is root then folder parent is actualItem folder
if (actualItem == rootItem) {
folderParent = (GWTFolder) actualItem.getUserObject();
} else {
folderParent = (GWTFolder) actualItem.getParentItem().getUserObject();
}
Main.get().mainPanel.topPanel.toolBar.checkToolButtonPermissions((GWTFolder) actualItem
.getUserObject(), folderParent, TREE_ROOT);
evaluesFolderIcon(actualItem);
Main.get().mainPanel.desktop.navigator.status.unsetFlagRemoveSubscription();
showTabFolderProperties(); // Refresh folder properties
Main.get().mainPanel.dashboard.userDashboard.getUserSubscribedFolders();
}
public void onFailure(Throwable caught) {
Main.get().mainPanel.desktop.navigator.status.unsetFlagRemoveSubscription();
Main.get().showError("AddSubscription", caught);
}
};
/**
* Call back opens document passed by url param
*/
final AsyncCallback<Boolean> callbackIsValidDocument = new AsyncCallback<Boolean>() {
public void onSuccess(Boolean result) {
if (result.booleanValue()) {
// Opens folder passed by parameter
tmpFldPath = Main.get().fldPath; // Solve problems on refreshing
// folder and not refreshing
// file browser
openAllPathFolder(tmpFldPath, Main.get().docPath);
}
// Always initializing variables
Main.get().docPath = null;
Main.get().fldPath = null;
}
public void onFailure(Throwable caught) {
// On error must reset variables too
Main.get().docPath = null;
Main.get().fldPath = null;
Main.get().showError("isValid", caught);
}
};
/**
* Call back opens folder passed by url param
*/
final AsyncCallback<Boolean> callbackIsValidFolder = new AsyncCallback<Boolean>() {
public void onSuccess(Boolean result) {
if (result.booleanValue()) {
// Opens folder passed by parameter
tmpFldPath = Main.get().fldPath; // Solve problems on refreshing
// folder and not refreshing
// file browser
openAllPathFolder(tmpFldPath, "");
}
// Always initializing variables
Main.get().docPath = null;
Main.get().fldPath = null;
}
public void onFailure(Throwable caught) {
// On error must reset variables too
Main.get().docPath = null;
Main.get().fldPath = null;
Main.get().showError("isValid", caught);
}
};
/**
* Refresh the folders on a item node
*
* @param path
* The folder path selected to list items
*/
public void getChilds(String path) {
ServiceDefTarget endPoint = (ServiceDefTarget) folderService;
endPoint.setServiceEntryPoint(RPCService.FolderService);
folderService.getChilds(path, callbackGetChilds);
Main.get().mainPanel.desktop.navigator.status.setFlagChilds();
}
/**
* Refresh the folders on a item node Used on firstTime loading for
* personal, trash and templates. Only loads tree folders not refresh
* filebrowser
*
* @param path
* The folder path selected to list items
*/
public void getOnlyChilds(String path) {
ServiceDefTarget endPoint = (ServiceDefTarget) folderService;
endPoint.setServiceEntryPoint(RPCService.FolderService);
folderService.getChilds(path, callbackGetOnlyChilds);
}
/**
* Creates a new folder on actual item
*
* @param path
* The folder subpath selected by user = name
*/
public void create(String path) {
ServiceDefTarget endPoint = (ServiceDefTarget) folderService;
endPoint.setServiceEntryPoint(RPCService.FolderService);
// On creation the actualItem is tmpFolder and must create from the
// parent of tmpFolder ( the real actualItem )
folderService.create(path, ((GWTFolder) actualItem.getParentItem().getUserObject()).getPath(),
callbackCreate);
Main.get().mainPanel.desktop.navigator.status.setFlagCreate();
hideMenuPopup();
}
/**
* Rename a folder on actual item
*
* @param path
* The folder subpath selected by user = name
*/
public void rename(String path) {
ServiceDefTarget endPoint = (ServiceDefTarget) folderService;
endPoint.setServiceEntryPoint(RPCService.FolderService);
folderService.rename(((GWTFolder) actualItem.getUserObject()).getPath(), path, callbackRename);
Main.get().mainPanel.desktop.navigator.status.setFlagRename();
hideMenuPopup();
}
/**
* Show a previos message to confirm delete
*/
public void confirmDelete() {
// In categories stack view, must not fire deleting if user view some
// document
if (!(Main.get().mainPanel.desktop.navigator.getStackIndex() == UIDesktopConstants.NAVIGATOR_CATEGORIES && Main
.get().mainPanel.desktop.browser.fileBrowser.hasRows())) {
Main.get().confirmPopup.setConfirm(ConfirmPopup.CONFIRM_DELETE_FOLDER);
Main.get().confirmPopup.show();
} else {
String msg = Main.i18n("categories.folder.error.delete");
OKMException exception = new OKMException(ErrorCode.get(ErrorCode.ORIGIN_OKMFolderService,
ErrorCode.CAUSE_AccessDenied), msg);
Main.get().showError("delete", exception);
}
}
/**
* Deletes a folder, the folder deleted is the actual item and refresh the
* parent
*/
public void delete() {
ServiceDefTarget endPoint = (ServiceDefTarget) folderService;
endPoint.setServiceEntryPoint(RPCService.FolderService);
String path = ((GWTFolder) actualItem.getUserObject()).getPath();
folderService.delete(path, callbackDelete);
Main.get().mainPanel.desktop.navigator.status.setFlagDelete();
hideMenuPopup();
}
/**
* Deletes folder on trash after is moved
*/
public void deleteMovedOrRestored() {
TreeItem tmpItem = actualItem;
actualItem = actualItem.getParentItem();
actualItem.setSelected(true);
actualItem.setState(true);
actualItem.removeItem(tmpItem);
evaluesFolderIcon(actualItem);
showTabFolderProperties();
refresh(true);
}
/**
* Move folder on file browser ( only trash mode )
*/
public void move() {
GWTFolder folderToRestore = (GWTFolder) actualItem.getUserObject();
folderSelectPopup.setEntryPoint(FolderSelectPopup.ENTRYPOINT_TAXONOMY);
folderSelectPopup.setToMove(folderToRestore);
showDirectorySelectPopup();
}
/**
* Copy folder on file browser ( only trash mode )
*/
public void copy() {
GWTFolder folderToCopy = (GWTFolder) actualItem.getUserObject();
folderSelectPopup.setEntryPoint(FolderSelectPopup.ENTRYPOINT_TAXONOMY);
folderSelectPopup.setToCopy(folderToCopy);
showDirectorySelectPopup();
}
/**
* Remove folder from tree after deleted from repository ( normaly deleted
* on file browser )
*
* @param path
* The folder
*/
public void removeDeleted(String path) {
boolean found = false;
int i = 0;
while (!found && actualItem.getChildCount() > i) {
TreeItem tmp = actualItem.getChild(i);
if (((GWTFolder) tmp.getUserObject()).getPath().equals(path)) {
actualItem.removeItem(tmp);
found = true;
}
i++;
}
// Looks if must change icon on parent if now has no childs and
// properties
if (actualItem.getChildCount() < 1) {
GWTFolder folderItem = (GWTFolder) actualItem.getUserObject();
folderItem.setHasChilds(false);
}
evaluesFolderIcon(actualItem);
}
/**
* Adds a subscription
*/
public void addSubscription() {
ServiceDefTarget endPoint = (ServiceDefTarget) notifyService;
endPoint.setServiceEntryPoint(RPCService.NotifyService);
Main.get().mainPanel.desktop.navigator.status.setFlagAddSubscription();
notifyService.subscribe(((GWTFolder) actualItem.getUserObject()).getPath(), callbackAddSubscription);
}
/**
* Removes a subscription
*/
public void removeSubscription() {
ServiceDefTarget endPoint = (ServiceDefTarget) notifyService;
endPoint.setServiceEntryPoint(RPCService.NotifyService);
Main.get().mainPanel.desktop.navigator.status.setFlagRemoveSubscription();
notifyService.unsubscribe(((GWTFolder) actualItem.getUserObject()).getPath(),
callbackRemoveSubscription);
}
/**
* Opens a document destination passed by url parameter
*/
private void openDocumentByBrowserURLParam() {
Main.get().startUp.nextStatus(StartUp.STARTUP_LOADING_TAXONOMY_EVAL_PARAMS);
// Opens folder passed by parameter
if (Main.get().fldPath != null && !Main.get().fldPath.equals("") && Main.get().docPath != null
&& !Main.get().docPath.equals("")) {
// Evalues if document passed by parameter is valid
ServiceDefTarget endPoint = (ServiceDefTarget) documentService;
endPoint.setServiceEntryPoint(RPCService.DocumentService);
documentService.isValid(Main.get().docPath, callbackIsValidDocument);
} else if (Main.get().fldPath != null && !Main.get().fldPath.equals("")) {
ServiceDefTarget endPoint = (ServiceDefTarget) folderService;
endPoint.setServiceEntryPoint(RPCService.FolderService);
folderService.isValid(Main.get().fldPath, callbackIsValidFolder);
}
}
/**
* Get the child folder if folder child path exists on actual tree Item
* selected
*
* @param path
* The path
* @return
*/
public TreeItem getChildFolder(String path) {
boolean found = false;
int i = 0;
TreeItem tmp;
while (!found && actualItem.getChildCount() > i) {
tmp = actualItem.getChild(i);
if (((GWTFolder) tmp.getUserObject()).getPath().equals(path)) {
found = true;
return tmp;
}
i++;
}
return null;
}
/**
* Refreshing when folder is renamed remotelly For example on file browser
* view
*
* @param path
* The tree path ( last value )
* @param newFolder
* The new object value
*/
public void renameRenamed(String path, GWTFolder newFolder) {
boolean found = false;
int i = 0;
while (!found && actualItem.getChildCount() > i) {
TreeItem tmp = actualItem.getChild(i);
if (((GWTFolder) tmp.getUserObject()).getPath().equals(path)) {
tmp.setUserObject(newFolder);
// Evalues Folder Icon puts name and icon correct values from
// object
evaluesFolderIcon(tmp);
found = true;
String oldPath = path.substring(1); // deletes first character
// "/" because parent path
// not has and replace not
// runs properly
path = newFolder.getPath().substring(1); // deletes first
// character "/"
// because parent
// path not has and
// replace not runs
// properly
changePathBeforeRenaming(oldPath, path, tmp);
}
i++;
}
}
/**
* Gets the actual folder (actualItem) and refresh all information on it
*/
private void get() {
ServiceDefTarget endPoint = (ServiceDefTarget) folderService;
endPoint.setServiceEntryPoint(RPCService.FolderService);
Main.get().mainPanel.desktop.navigator.status.setFlagGet();
folderService.getProperties(((GWTFolder) actualItem.getUserObject()).getPath(), callbackGet);
}
/**
* Opens all path since folder path
*
* @param fldId
* The folder path
* @param docPath
* The document path
*/
public void openAllPathFolder(String fldId, String docPath) {
Main.get().startUp.nextStatus(StartUp.STARTUP_LOADING_OPEN_PATH);
refreshFileBrowser = true;
String rootPath = folderRoot.getPath();
String actualPath = fldId;
tmpFldPath = actualPath; // Sets the last folder to be opened (
// getChilds method needs it for last
// folder)
// Set the selected document to file browser
// The browser is only called on the last child node refreshing and
// restores selected row id
if (refreshFileBrowser && docPath != null && !docPath.equals("")) {
Main.get().mainPanel.desktop.browser.fileBrowser.setSelectedRowId(docPath);
} else {
Main.get().mainPanel.desktop.browser.fileBrowser.setSelectedRowId(""); // We remove the selectedRowID
if (!rootPath.equals(actualPath)) { // Only if rootPath != actualPath ( case must open folders )
setTabFolderAfterRefresh = true; // We must set tab folder properties on the last node
}
}
while (!rootPath.equals(actualPath)) {
tmpAllPathFolder.add(actualPath);
actualPath = actualPath.substring(0, actualPath.lastIndexOf("/"));
}
// The last path value is root path, is not added on tmpPath
// Selects root node
actualItem.setState(true);
actualItem.setSelected(false);
actualItem = rootItem;
actualItem.setSelected(true);
if (!tmpAllPathFolder.isEmpty()) {
int index = tmpAllPathFolder.size() - 1;
String tmpPath = tmpAllPathFolder.get(index);
tmpAllPathFolder.remove(index);
if (index > 0) {
setActiveNode(tmpPath, false);
} else {
setActiveNode(tmpPath, refreshFileBrowser);
}
} else {
centerActualItemOnScroll(actualItem); // Centers the actualItem
// selected if scroll is
// showed
if (refreshFileBrowser) {
// && docPath!=null && !docPath.equals("")
// Refreshing false and docPath="" special case parameter path
// pased on browser uri to open
// panels
Main.get().mainPanel.desktop.browser.fileBrowser.refresh(rootPath);
}
}
}
private void onTreeItemSelected(TreeItem item) {
boolean refresh = true;
boolean refreshType = true;
// Always mark panel as selected
setSelectedPanel(true);
// Evalutate especial cases rename and creating folder refreshing
switch (folderAction) {
case ACTION_CREATE:
refresh = false;
if (!actualItem.equals(item)) {
// Special case when we are creating a folder and selects other
// tree item
FolderTextBox folder = (FolderTextBox) tmpFolder.getWidget();
// Ensures is text writen before create folder on other case
// eliminates
if (folder.getText().length() > 0) {
otherTreeItemSelected = item; // Used to save item selected
create(folder.getText());
} else {
otherTreeItemSelected = item; // Used to save item selected
removeTmpFolderCreate();
}
}
break;
case ACTION_RENAME:
if (actualItem.equals(item)) {
refresh = false;
}
break;
default:
// Case that not refreshing tree and file browser ( right click )
if (actualItem.equals(item) && tree.isShowPopUP()) {
refresh = false; // On right click must not refresh browser but
// must change properties view
showTabFolderProperties(); // an removes browser selected file
// or document if any is selected to
// change perspective
Main.get().mainPanel.desktop.browser.fileBrowser.deselecSelectedRow();
} else {
// Disables actual item because on changing active node by
// application this it's not changed
// automatically
if (!actualItem.equals(item)) {
actualItem.setSelected(false);
actualItem = item;
refresh = true;
// refreshType = false;
} else {
// When the same node is selected must refresh without
// mantaining selected filebrowser row
refresh = false;
if (!isActualItemRoot()) {
GWTFolder folderParent = (GWTFolder) actualItem.getParentItem().getUserObject();
Main.get().mainPanel.topPanel.toolBar.checkToolButtonPermissions(
(GWTFolder) actualItem.getUserObject(), folderParent, TREE_ROOT);
} else {
Main.get().mainPanel.topPanel.toolBar.checkToolButtonPermissions(
(GWTFolder) actualItem.getUserObject(), folderRoot, TREE_ROOT);
}
showTabFolderProperties(); // On this special case
// refreshing tab folder
// properties
Main.get().mainPanel.desktop.browser.fileBrowser.deselecSelectedRow();
}
}
break;
}
if (refresh) {
refresh(refreshType);
}
// Only Shows menu popup if flag is enable and selected node is not root
if (tree.isShowPopUP()) {
if (isActualItemRoot()) {
menuPopup.enableRootMenuOptions();
} else {
menuPopup.enableAllMenuOptions();
}
GWTFolder folderParent;
// tes case actualItem is root then folder parent is the same folder
if (actualItem == rootItem) {
folderParent = (GWTFolder) actualItem.getUserObject();
} else {
folderParent = (GWTFolder) actualItem.getParentItem().getUserObject();
}
menuPopup.checkMenuOptionPermissions((GWTFolder) actualItem.getUserObject(), folderParent);
menuPopup.evaluateMenuOptions();
menuPopup.setPopupPosition(tree.mouseX, tree.mouseY);
// In thesaurus view must not be showed the menu popup
if (Main.get().mainPanel.desktop.navigator.getStackIndex() != UIDesktopConstants.NAVIGATOR_THESAURUS ) {
menuPopup.show();
}
}
// Enables dragged if is tree dragged and none action is started like
// rename or folder creation
// and root item is not dragable
// On trash drag and drop is always disabled
if (tree.isDragged() && folderAction == ACTION_NONE && !actualItem.equals(rootItem) &&
Main.get().mainPanel.desktop.navigator.getStackIndex() != UIDesktopConstants.NAVIGATOR_CATEGORIES &&
Main.get().mainPanel.desktop.navigator.getStackIndex() != UIDesktopConstants.NAVIGATOR_THESAURUS &&
Main.get().mainPanel.desktop.navigator.getStackIndex() != UIDesktopConstants.NAVIGATOR_TRASH) {
Main.get().dragable.show(actualItem.getHTML(), OriginPanel.TREE_ROOT);
tree.unsetDraged();
}
}
/**
* Refresh the tree node
*/
public void refresh(boolean reset) {
hideMenuPopup();
evaluesFolderIcon(actualItem); // Ensures to contemplate any security
// folder privileges change refresh
String path = ((GWTFolder) actualItem.getUserObject()).getPath();
getChilds(path);
// Case not resets always must show tabfolder properties
if (!reset) {
// Case exists a selected row must mantain other case mus show
// folder properties on tab
if (Main.get().mainPanel.desktop.browser.fileBrowser.isSelectedRow()) {
Main.get().mainPanel.desktop.browser.fileBrowser.mantainSelectedRow();
} else {
showTabFolderProperties();
}
} else {
showTabFolderProperties();
}
Main.get().mainPanel.desktop.browser.fileBrowser.refresh(path);
}
/**
* Set a new tree node
*
* @param path
* Foder Path
*/
public void setActiveNode(String path, boolean refreshFileBrowser) {
// Actually the refresh node only can be called on a subnode on upper
// version
// must be contempled non subnode ubication
if (actualItem.getChildCount() > 0) {
int i = 0;
boolean found = false;
while (i < actualItem.getChildCount() && !found) {
if (((GWTFolder) actualItem.getChild(i).getUserObject()).getPath().equals(path)) {
found = true;
actualItem.setState(true);
actualItem.setSelected(false);
actualItem = actualItem.getChild(i);
actualItem.setSelected(true);
getChilds(path);
if (refreshFileBrowser) {
Main.get().mainPanel.desktop.browser.fileBrowser.refresh(path);
refreshFileBrowser = false;
}
centerActualItemOnScroll(actualItem); // Centers the
// actualItem
// selected on
// scroll
}
i++;
}
}
setSelectedPanel(true); // Select this panel
}
/**
* Add temporary folder on creation
*/
public void addTmpFolderCreate() {
if (folderAction == ACTION_NONE) {
folderAction = ACTION_CREATE;
FolderTextBox newFolder = new FolderTextBox();
tmpFolder = new TreeItem();
tmpFolder.setWidget(newFolder);
tmpFolder.setStyleName("okm-TreeItem");
newFolder.reset();
newFolder.setText(Main.i18n("tree.folder.new"));
actualItem.addItem(tmpFolder);
actualItem.setState(true);
actualItem.setSelected(false);
tmpFolder.setSelected(true);
actualItem = tmpFolder;
// When we create a new folder we enables selection ( after it,
// we'll return to disable) for a normal
// use of the input (if not, cursor and selections not runs
// propertly )
rootItem.removeStyleName("okm-DisableSelect"); // Disables drag and
// drop browser text
// selection)
newFolder.setFocus();
}
}
/**
* Remove temporary folder on creation Only executed when user closes popup
* name and
*/
public void removeTmpFolderCreate() {
actualItem = tmpFolder.getParentItem();
tmpFolder.setSelected(false);
actualItem.setSelected(true);
actualItem.removeItem(tmpFolder);
folderAction = ACTION_NONE;
// Special case when we are creating a folder and selects other tree
// item before removing tmp folder
// must changing to the real item selected
if (otherTreeItemSelected != null) {
onTreeItemSelected(otherTreeItemSelected);
otherTreeItemSelected = null;
}
}
/**
* Hides all items on a brach
*
* @param actualItem
* The actual item active
*/
public void hideAllBranch(TreeItem actualItem) {
int i = 0;
int count = actualItem.getChildCount();
for (i = 0; i < count; i++) {
actualItem.getChild(i).setVisible(false);
}
}
/**
* Adds folders to actual item if not exists or refreshes it values
*
* @param actualItem
* The actual item active
* @param newItem
* New item to be added, or refreshed
*/
public void addFolder(TreeItem actualItem, TreeItem newItem) {
int i = 0;
boolean found = false;
int count = actualItem.getChildCount();
GWTFolder folder;
GWTFolder newFolder = (GWTFolder) newItem.getUserObject();
String folderPath = newFolder.getPath();
for (i = 0; i < count; i++) {
folder = (GWTFolder) actualItem.getChild(i).getUserObject();
// If item is found actualizate values
if ((folder).getPath().equals(folderPath)) {
found = true;
actualItem.getChild(i).setVisible(true);
actualItem.getChild(i).setUserObject(newFolder);
evaluesFolderIcon(actualItem.getChild(i));
}
}
if (!found) {
evaluesFolderIcon(newItem);
actualItem.addItem(newItem);
}
}
/**
* Gets the actual path of the selected directory tree
*
* @return The actual path of selected directory
*/
public String getActualPath() {
return ((GWTFolder) actualItem.getUserObject()).getPath();
}
/**
* Gets the actual tree item of the selected directory tree
*
* @return The actual tree item of selected directory
*/
public TreeItem getActualItem() {
return actualItem;
}
/**
* Shows input text to rename selected folder
*/
public void rename() {
if (folderAction == ACTION_NONE) {
Main.get().mainPanel.disableKeyShorcuts(); // Disables key shortcuts
// while renaming
folderAction = ACTION_RENAME;
renFolder = new FolderTextBox();
renFolder.reset();
renFolder.setText(actualItem.getText());
tmpRenameHtmlFolder = actualItem.getHTML();
actualItem.setWidget(renFolder);
// When we create a new folder we enables selection ( after it,
// we'll return to disable) for a normal
// use of the input (if not, cursor and selections not runs
// propertly )
rootItem.removeStyleName("okm-DisableSelect"); // Disables drag and
// drop browser text
// selection)
renFolder.setFocus();
}
}
/**
* Cancels the renaming folder
*/
public void cancelRename() {
actualItem.setHTML(tmpRenameHtmlFolder); // Restores initial icon and name values
folderAction = ACTION_NONE;
}
/**
* Show Tab Folder Properties
*/
public void showTabFolderProperties() {
Main.get().mainPanel.desktop.browser.tabMultiple.enableTabFolder();
Main.get().mainPanel.desktop.browser.tabMultiple.tabFolder.setProperties((GWTFolder) actualItem.getUserObject());
}
/**
* Evalues actual folder icon to prevent other user interaction with the
* same folder this ensures icon and object hasChildsValue are consistent
*/
public void evaluesFolderIcon(TreeItem item) {
GWTFolder folderItem = (GWTFolder) item.getUserObject();
preventFolderInconsitences(item);
// On case folder is subscribed mus change icon
String subscribed = "";
if (folderItem.isSubscribed()) {
subscribed = "_subscribed";
}
// Looks if must change icon on parent if now has no childs and
// properties with user security atention
if ((folderItem.getPermissions() & GWTPermission.WRITE) == GWTPermission.WRITE) {
if (folderItem.getHasChilds()) {
item.setHTML(Util.imageItemHTML("img/menuitem_childs" + subscribed + ".gif", folderItem
.getName(), "top"));
} else {
item.setHTML(Util.imageItemHTML("img/menuitem_empty" + subscribed + ".gif", folderItem
.getName(), "top"));
}
} else {
if (folderItem.getHasChilds()) {
item.setHTML(Util.imageItemHTML("img/menuitem_childs_ro" + subscribed + ".gif", folderItem
.getName(), "top"));
} else {
item.setHTML(Util.imageItemHTML("img/menuitem_empty_ro" + subscribed + ".gif", folderItem
.getName(), "top"));
}
}
}
/**
* Prevents folder incosistences between server ( multi user deletes folder
* ) and tree nodes drawed
*
* @param item
* The tree node
*/
public void preventFolderInconsitences(TreeItem item) {
GWTFolder folderItem = (GWTFolder) item.getUserObject();
// Case that must remove all items node
if (item.getChildCount() > 0 && !folderItem.getHasChilds()) {
while (item.getChildCount() > 0) {
item.getChild(0).remove();
}
}
if (item.getChildCount() < 1 && !folderItem.getHasChilds()) {
folderItem.setHasChilds(false);
}
}
/**
* Shows the directory select popup
*/
public void showDirectorySelectPopup() {
hideMenuPopup();
folderSelectPopup.show();
}
/**
* Return true if actualItem selected is root node, other case false
*
* @return value true or false on actualItem to root node comparation
*/
public boolean isActualItemRoot() {
if (((GWTFolder) actualItem.getUserObject()).getPath().equals(folderRoot.getPath())) {
return true;
} else {
return false;
}
}
/**
* Indicates if panel is selected
*
* @return The value of panel ( selected )
*/
public boolean isPanelSelected() {
return panelSelected;
}
/**
* Sets the selected panel value
*
* @param selected
* The selected panel value
*/
public void setSelectedPanel(boolean selected) {
// Case panel is not still selected and must enable this and disable
// browser panel
if (!isPanelSelected() && selected) {
Main.get().mainPanel.desktop.browser.fileBrowser.setSelectedPanel(false);
}
// Before making other operation must change value of panel selected
panelSelected = selected;
if (selected) {
addStyleName("okm-PanelSelected");
} else {
removeStyleName("okm-PanelSelected");
}
}
/**
* Used only on changing stack
*/
public void forceSetSelectedPanel() {
panelSelected = false;
setSelectedPanel(true);
}
/**
* Hides the menu Popup
*/
public void hideMenuPopup() {
if (menuPopup != null) {
menuPopup.hide();
}
}
/**
* Evaluates the special case when creating or renaming a folder, user
* changes to other active view or active panel to create folder or remove
* the tmp folder
*/
public void evaluateSpecialTmpFolderCases() {
if (folderAction == ACTION_CREATE) {
FolderTextBox folder = (FolderTextBox) actualItem.getWidget();
if (folder.getText().length() > 0) {
create(folder.getText());
} else {
removeTmpFolderCreate();
}
}
}
/**
* Indicates if is folder creating
*
* @return The boolean value if is folder creating
*/
public boolean isFolderCreating() {
return (folderAction == ACTION_CREATE);
}
/**
* Indicates if is folder renaming
*
* @return The boolean value if is folder renaming
*/
public boolean isFolderRenaming() {
return (folderAction == ACTION_RENAME);
}
/**
* Gets the actual folder action
*
* @return The boolean folder action
*/
public int getFolderAction() {
return folderAction;
}
/**
* Refresh for security changes on actual tree node selected ( icon color )
* only refresh the actual
*/
public void securityRefresh() {
folderAction = ACTION_SECURITY_REFRESH; // To make tab properties
// refresh after get folder
get();
}
/**
* Refresh tree iten values when tree folder is changed ( normally on file
* browser, or by security ).
*
* @param folder
* The new folder values
*/
public void refreshChildValues(GWTFolder folder) {
TreeItem tmpItem;
GWTFolder gWTFolder;
if (actualItem.getChildCount() > 0) {
boolean found = false;
int i = 0;
while (!found && i < actualItem.getChildCount()) {
tmpItem = actualItem.getChild(i);
gWTFolder = (GWTFolder) tmpItem.getUserObject();
if (folder.getPath().equals(gWTFolder.getPath())) {
tmpItem.setUserObject(folder);
evaluesFolderIcon(tmpItem);
found = true;
}
i++;
}
}
}
/**
* Gets the actual folder
*
* @return The parent folder
*/
public GWTFolder getFolder() {
return (GWTFolder) actualItem.getUserObject();
}
/**
* getParentFolder
*
* @return
*/
public GWTFolder getParentFolder() {
if (actualItem!=rootItem) {
return (GWTFolder) actualItem.getParentItem().getUserObject();
} else {
return (GWTFolder) actualItem.getUserObject();
}
}
/**
* elementClicked
*
* Returns the treeItem when and element is clicked, used to capture drag
* and drop tree Item
*
* @param element
* @return
*/
public TreeItem elementClicked(Element element) {
return tree.elementClicked(element);
}
/**
* Change recursivelly all the childs path
*
* @param oldPath
* The old path
* @param newPath
* The new path
* @param itemToChange
* The tree item to change the path
*/
public void changePathBeforeRenaming(String oldPath, String newPath, TreeItem itemToChange) {
for (int i = 0; i < itemToChange.getChildCount(); i++) {
TreeItem tmpItem = itemToChange.getChild(i);
GWTFolder gwtFolder = ((GWTFolder) tmpItem.getUserObject());
gwtFolder.setPath(gwtFolder.getPath().replaceAll(oldPath, newPath));
gwtFolder.setParentPath(gwtFolder.getParentPath().replaceAll(oldPath, newPath));
if (tmpItem.getChildCount() > 0) {
changePathBeforeRenaming(oldPath, newPath, tmpItem);
}
}
}
/**
* Adds a bookmark
*/
public void addBookmark() {
GWTFolder folder = (GWTFolder) actualItem.getUserObject();
String path = folder.getPath();
Main.get().mainPanel.topPanel.mainMenu.bookmarkPopup.show(path, path.substring(path.lastIndexOf("/") + 1));
}
/**
* Sets the home
*/
public void setHome() {
GWTFolder folder = (GWTFolder) actualItem.getUserObject();
Main.get().mainPanel.topPanel.mainMenu.bookmark.confirmSetHome(folder.getUuid(), folder.getPath(), false);
}
/**
* Confirm the purge
*/
public void confirmPurge() {
Main.get().confirmPopup.setConfirm(ConfirmPopup.CONFIRM_PURGE_FOLDER);
Main.get().confirmPopup.show();
}
/**
* Confirm if really wants to purge trash
*/
public void confirmPurgeTrash() {
Main.get().confirmPopup.setConfirm(ConfirmPopup.CONFIRM_EMPTY_TRASH);
Main.get().confirmPopup.show();
}
/**
* Refresh asyncronous subtree branch after an item menu is purged
*/
final AsyncCallback<Object> callbackPurge = new AsyncCallback<Object>() {
public void onSuccess(Object result) {
TreeItem tmpItem = actualItem;
actualItem = actualItem.getParentItem();
actualItem.setSelected(true);
actualItem.setState(true);
actualItem.removeItem(tmpItem);
evaluesFolderIcon(actualItem);
showTabFolderProperties();
Main.get().mainPanel.desktop.navigator.status.unsetFlagPurge();
refresh(true);
}
public void onFailure(Throwable caught) {
Main.get().mainPanel.desktop.navigator.status.unsetFlagPurge();
Main.get().showError("Purge", caught);
}
};
/**
* Refresh asyncronous subtree branch after all trash is purged
*/
final AsyncCallback<Object> callbackPurgeTrash = new AsyncCallback<Object>() {
public void onSuccess(Object result) {
actualItem = rootItem;
actualItem.setSelected(true);
actualItem.setState(true);
evaluesFolderIcon(actualItem);
showTabFolderProperties();
while (actualItem.getChildCount() > 0) {
actualItem.removeItems();
}
Main.get().workspaceUserProperties.getUserDocumentsSize();
Main.get().mainPanel.desktop.navigator.status.unsetFlagPurgeTrash();
// After purge trash must refresh desktop
Main.get().mainPanel.topPanel.toolBar.executeRefresh();
}
public void onFailure(Throwable caught) {
Main.get().mainPanel.desktop.navigator.status.unsetFlagPurgeTrash();
Main.get().showError("PurgeTrash", caught);
}
};
/**
* Purge folder on file browser ( only trash mode )
*/
public void purge() {
ServiceDefTarget endPoint = (ServiceDefTarget) folderService;
endPoint.setServiceEntryPoint(RPCService.FolderService);
String path = ((GWTFolder) actualItem.getUserObject()).getPath();
folderService.purge(path, callbackPurge);
Main.get().mainPanel.desktop.navigator.status.setFlagPurge();
}
/**
* Purge all trash ( only trash mode )
*/
public void purgeTrash() {
ServiceDefTarget endPoint = (ServiceDefTarget) repositoryService;
endPoint.setServiceEntryPoint(RPCService.RepositoryService);
repositoryService.purgeTrash(callbackPurgeTrash);
Main.get().mainPanel.desktop.navigator.status.setFlagPurgeTrash();
}
/**
* Restore folder on file browser ( only trash mode )
*/
public void restore() {
GWTFolder folderToRestore = (GWTFolder) actualItem.getUserObject();
folderSelectPopup.setEntryPoint(FolderSelectPopup.ENTRYPOINT_TAXONOMY);
folderSelectPopup.setToRestore(folderToRestore);
showDirectorySelectPopup();
}
/**
* Center the actual item on scroll
*
* @param item
* The item to show visible
*/
private void centerActualItemOnScroll(TreeItem item) {
Main.get().mainPanel.desktop.navigator.scrollTaxonomyPanel.ensureVisible(item);
}
/**
* Centers the actualItem on scroll
*/
public void centerActulItemOnScroll() {
Main.get().mainPanel.desktop.navigator.scrollTaxonomyPanel.ensureVisible(actualItem);
}
/**
* Export to file
*/
public void exportFolderToFile() {
Util.downloadFile(getFolder().getPath(), "export");
}
}