Java tutorial
/* * * @file ViewBrowser.java * * Copyright (C) 2006-2009 Tensegrity Software GmbH * * This program is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License (Version 2) as published * by the Free Software Foundation at http://www.gnu.org/copyleft/gpl.html. * * 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., 59 Temple * Place, Suite 330, Boston, MA 02111-1307 USA * * If you are developing and distributing open source applications under the * GPL License, then you are free to use JPalo Modules under the GPL License. For OEMs, * ISVs, and VARs who distribute JPalo Modules with their products, and do not license * and distribute their source code under the GPL, Tensegrity provides a flexible * OEM Commercial License. * * @author Philipp Bouillon <Philipp.Bouillon@tensegrity-software.com> * * @version $Id: ViewBrowser.java,v 1.76 2010/04/15 09:55:22 PhilippBouillon Exp $ * */ /* * (c) Tensegrity Software 2009 * All rights reserved */ package com.tensegrity.wpalo.client.ui.mvc.viewbrowser; import java.util.ArrayList; import java.util.Date; import java.util.List; import com.allen_sauer.gwt.log.client.Log; import com.extjs.gxt.ui.client.Events; import com.extjs.gxt.ui.client.GXT; import com.extjs.gxt.ui.client.Registry; import com.extjs.gxt.ui.client.Style.Scroll; import com.extjs.gxt.ui.client.Style.SelectionMode; import com.extjs.gxt.ui.client.binder.TreeBinder; import com.extjs.gxt.ui.client.data.BaseTreeLoader; import com.extjs.gxt.ui.client.data.BaseTreeModel; import com.extjs.gxt.ui.client.data.LoadEvent; import com.extjs.gxt.ui.client.data.ModelStringProvider; import com.extjs.gxt.ui.client.data.TreeLoader; import com.extjs.gxt.ui.client.dnd.TreeDragSource; import com.extjs.gxt.ui.client.dnd.TreeDropTarget; import com.extjs.gxt.ui.client.dnd.DND.Feedback; import com.extjs.gxt.ui.client.dnd.DND.Operation; import com.extjs.gxt.ui.client.event.BaseEvent; import com.extjs.gxt.ui.client.event.ComponentEvent; import com.extjs.gxt.ui.client.event.DNDEvent; import com.extjs.gxt.ui.client.event.DNDListener; import com.extjs.gxt.ui.client.event.EditorEvent; import com.extjs.gxt.ui.client.event.Listener; import com.extjs.gxt.ui.client.event.LoadListener; import com.extjs.gxt.ui.client.event.MenuEvent; import com.extjs.gxt.ui.client.event.SelectionListener; import com.extjs.gxt.ui.client.event.TreeEvent; import com.extjs.gxt.ui.client.event.WindowEvent; import com.extjs.gxt.ui.client.mvc.AppEvent; import com.extjs.gxt.ui.client.mvc.Controller; import com.extjs.gxt.ui.client.mvc.Dispatcher; import com.extjs.gxt.ui.client.mvc.View; import com.extjs.gxt.ui.client.store.TreeStore; import com.extjs.gxt.ui.client.util.Point; import com.extjs.gxt.ui.client.widget.Component; import com.extjs.gxt.ui.client.widget.ComponentHelper; import com.extjs.gxt.ui.client.widget.ContentPanel; import com.extjs.gxt.ui.client.widget.Dialog; import com.extjs.gxt.ui.client.widget.Editor; import com.extjs.gxt.ui.client.widget.MessageBox; import com.extjs.gxt.ui.client.widget.form.TextField; import com.extjs.gxt.ui.client.widget.menu.Menu; import com.extjs.gxt.ui.client.widget.menu.MenuItem; import com.extjs.gxt.ui.client.widget.toolbar.SeparatorToolItem; import com.extjs.gxt.ui.client.widget.toolbar.TextToolItem; import com.extjs.gxt.ui.client.widget.toolbar.ToolBar; import com.extjs.gxt.ui.client.widget.tree.Tree; import com.extjs.gxt.ui.client.widget.tree.TreeItem; import com.extjs.gxt.ui.client.widget.tree.TreeItemUI; import com.google.gwt.user.client.Cookies; import com.google.gwt.user.client.Element; import com.google.gwt.user.client.rpc.AsyncCallback; import com.tensegrity.palo.gwt.core.client.exceptions.SessionExpiredException; import com.tensegrity.palo.gwt.core.client.models.XObject; import com.tensegrity.palo.gwt.core.client.models.admin.XUser; import com.tensegrity.palo.gwt.core.client.models.cubeviews.XView; import com.tensegrity.palo.gwt.core.client.models.folders.XFolderElement; import com.tensegrity.palo.gwt.core.client.models.folders.XStaticFolder; import com.tensegrity.palo.gwt.widgets.client.util.UserAgent; import com.tensegrity.wpalo.client.DisplayFlags; import com.tensegrity.wpalo.client.WPaloEvent; import com.tensegrity.wpalo.client.WPaloPropertyServiceProvider; import com.tensegrity.wpalo.client.async.Callback; import com.tensegrity.wpalo.client.i18n.ILocalConstants; import com.tensegrity.wpalo.client.i18n.ILocalMessages; import com.tensegrity.wpalo.client.i18n.Resources; import com.tensegrity.wpalo.client.serialization.XObjectWrapper; import com.tensegrity.wpalo.client.services.cubeview.WPaloCubeViewServiceProvider; import com.tensegrity.wpalo.client.services.folder.WPaloFolderServiceProvider; import com.tensegrity.wpalo.client.ui.model.TreeLoaderProxy; import com.tensegrity.wpalo.client.ui.model.TreeNode; import com.tensegrity.wpalo.client.ui.mvc.cubeview.CubeViewEditor; import com.tensegrity.wpalo.client.ui.mvc.cubeview.LargeQueryWarningDialog; import com.tensegrity.wpalo.client.ui.mvc.viewbrowser.importer.ViewImportDialog; import com.tensegrity.wpalo.client.ui.mvc.workbench.Workbench; /** * <code>ViewBrowser</code> TODO DOCUMENT ME * * @version $Id: ViewBrowser.java,v 1.33 2009/08/17 13:24:23 PhilippBouillon Exp * $ **/ public class ViewBrowser extends View { protected static transient final ILocalConstants constants = Resources.getInstance().getConstants(); protected static transient final ILocalMessages messages = Resources.getInstance().getMessages(); public static final String SHOW_TIPS_COOKIE = "showTipsAtStartup"; private static final int F2 = 113; private static final String OPEN = "Open"; private static final String DELETE = "Delete"; private static final String RENAME = "Rename"; /** id to access view browser instance via the global {@link Registry} */ public static final String ID = ViewBrowser.class.getName(); private ContentPanel navigator; private TreeBinder<TreeNode> treeBinder; private Tree viewsTree; private ViewBrowserModel browserModel; private TextToolItem deleteItem; private TextToolItem renameItem; private boolean mayDelete = false; private int createRight = -1; private MenuItem editViewProperties; private MenuItem createDirectLink; public ViewBrowser(Controller controller) { super(controller); Registry.register(ID, this); } public final void clear() { viewsTree.removeAll(); } public final XView[] getViews() { return browserModel.getViews(); } final void addView(XView originalView, XView xView, boolean openIt, boolean isPublic, boolean isEditable) { TreeNode selection = getSelectedNode(); if (originalView != null) { selection = findNodeOf(originalView); } TreeNode parent = getParentFolder(selection); browserModel.addView(xView, parent, openIt, this, isPublic, isEditable); } final void open(TreeNode node) { fireEvent(new AppEvent<TreeNode>(WPaloEvent.EDIT_VIEWBROWSER_VIEW, node)); } protected void handleEvent(AppEvent<?> event) { switch (event.type) { case WPaloEvent.INIT: try { if (event.data instanceof XUser) { initUI((XUser) event.data); checkShowTipsAtStartup((XUser) event.data); } else if (event.data != null && event.data instanceof DisplayFlags) { DisplayFlags flags = (DisplayFlags) event.data; if (!flags.isHideNavigator()) { initUI(flags.getUser()); } } } catch (Throwable t) { t.printStackTrace(); } break; case WPaloEvent.EXPANDED_VIEWBROWSER_SECTION: // reload tree // browserModel.reload(); break; case WPaloEvent.WILL_DELETE_VIEWBROWSER_VIEW: TreeNode viewNode = null; Object obj = event.data; if (event.data instanceof XObjectWrapper) { obj = ((XObjectWrapper) event.data).getXObject(); } if (obj instanceof XView) { viewNode = findNodeOf((XView) obj); } else if (obj instanceof XFolderElement) { viewNode = findNodeOf((XFolderElement) obj); } else { viewNode = (TreeNode) obj; } if (viewNode != null) delete(viewNode, false); break; case WPaloEvent.DELETED_ITEM: TreeNode node = (TreeNode) event.data; // Account account = getAccount((TreeNode)event.data); // if(account != null) { // deleteAllViewsFor(account) // } // TreeNode viewNode = (TreeNode)event.data; // if(viewNode != null) // delete(viewNode); break; } } private final void checkShowTipCookie(XUser user) { String cookieData = Cookies.getCookie(SHOW_TIPS_COOKIE + user.getLogin()); Date date = new Date(System.currentTimeMillis() + 1000l * 60l * 60l * 24l * 30l); if (cookieData == null) { cookieData = "true,1"; } // Update cookie data expiration date: Cookies.setCookie(SHOW_TIPS_COOKIE + user.getLogin(), cookieData, date); String[] values = cookieData.split(","); if (values == null || values.length != 2) { values = new String[2]; values[0] = "true"; values[1] = "1"; } boolean doShow = true; int tipNumber = 1; try { doShow = Boolean.parseBoolean(values[0]); tipNumber = Integer.parseInt(values[1]); } catch (Throwable t) { doShow = true; tipNumber = 1; } if (doShow) { new ShowTipsAtStartupDialog(tipNumber, date, user.getLogin()); } else { cookieData = doShow + "," + tipNumber; Cookies.setCookie(SHOW_TIPS_COOKIE + user.getLogin(), cookieData, date); } } private final void checkShowTipsAtStartup(final XUser user) { WPaloPropertyServiceProvider.getInstance().getBooleanProperty("showTipsAtStartup", true, new AsyncCallback<Boolean>() { public void onFailure(Throwable t) { checkShowTipCookie(user); } public void onSuccess(Boolean result) { if (result) { checkShowTipCookie(user); } } }); } private final TreeNode findNodeOf(XView xView) { return browserModel.getNodeOf(xView); } private final TreeNode findNodeOf(XStaticFolder folder) { return browserModel.getNodeOf(folder); } private final TreeNode findNodeOf(XFolderElement elem) { return browserModel.getNodeOf(elem); } private static final String getBrowserName() { String result = constants.unknown(); UserAgent ua = UserAgent.getInstance(); if (ua.isOpera) result = "Opera"; if (ua.isChrome) result = "Chrome"; if (ua.isChrome4) result = "Chrome 4"; if (ua.isChrome3) result = "Chrome 3"; if (ua.isChrome2) result = "Chrome 2"; if (ua.isChrome1) result = "Chrome 1"; if (ua.isIron) result = "Iron"; if (ua.isIron1) result = "Iron 1"; if (ua.isIron2) result = "Iron 2"; if (ua.isIron3) result = "Iron 3"; if (ua.isIron4) result = "Iron 4"; if (ua.isSafari) result = "Safari"; if (ua.isSafari4) result = "Safari 4"; if (ua.isSafari3) result = "Safari 3"; if (ua.isIE) result = "Internet Explorer"; if (ua.isIE8) result = "Internet Explorer 8"; if (ua.isIE7) result = "Internet Explorer 7"; if (ua.isIE6) result = "Internet Explorer 6"; if (ua.isGecko) result = "Firefox"; if (ua.isGecko36) result = "Firefox 3.6"; if (ua.isGecko35) result = "Firefox 3.5"; if (ua.isGecko3) result = "Firefox 3"; if (ua.isGecko2) result = "Firefox 2"; return result; } private static final boolean isNewerVersionAvailable(String buildNumber, String[] buildInformation) { String[] partInfo = buildInformation[0].split("\\."); int major = Integer.parseInt(partInfo[0]); int minor = Integer.parseInt(partInfo[1]); int rev = Integer.parseInt(partInfo[2]); int build = Integer.parseInt(partInfo[3]); if (major > 3) { return true; } else if (major == 3 && minor > 2) { return true; } else if (major == 3 && minor == 2 && rev > 0) { return true; } else if (major == 3 && minor == 2 && rev == 0) { if (Integer.parseInt(buildNumber) < build) { return true; } } return false; } public static final void displayAboutDialog(final String buildNumber, final String[] buildInformation) { WPaloPropertyServiceProvider.getInstance().getStringProperty("appName", new AsyncCallback<String>() { private final void showAbout(String appName) { final String aboutString = messages.aboutMessage(appName, 3, 2, 0, buildNumber); LargeQueryWarningDialog.readThresholds(new AsyncCallback<String[]>() { public void onFailure(Throwable arg0) { MessageBox.info(constants.aboutHeader(), aboutString, null); } public void onSuccess(String[] result) { String browserInfo = messages.browser(getBrowserName()); String thInfo = messages.thresholds(result[0], result[1], result[2], result[3], result[4], result[5]); String link = constants.licenseLink(); String displayInfo = aboutString + link + "<br/>"; if (buildInformation != null) { if (isNewerVersionAvailable(buildNumber, buildInformation)) { displayInfo += messages.newerVersionExists(buildInformation[0], buildInformation[1]) + "</br>"; } else { String infoLink = buildInformation[1]; int index; if ((index = infoLink.indexOf("#")) != -1) { infoLink = infoLink.substring(0, index); } displayInfo += messages.noNewerVersionAvailable(infoLink) + "<br/>"; } } displayInfo += browserInfo + thInfo; MessageBox.info(constants.aboutHeader(), displayInfo, null); } }); } public void onFailure(Throwable arg0) { showAbout("Palo Pivot"); } public void onSuccess(String result) { if (result == null || result.trim().length() == 0) { result = "Palo Pivot"; } showAbout(result); } }); } static final String getIconStyle(TreeNode node) { String result = "icon-view"; if (node != null && node.getXObject() != null) { XObject x = node.getXObject(); if (x instanceof XObjectWrapper) { x = ((XObjectWrapper) x).getXObject(); } if (x != null && x instanceof XFolderElement) { x = ((XFolderElement) x).getSourceObject(); } if (x != null && x instanceof XView) { return getIconStyle((XView) x); } } return result; } static final String getIconStyle(XView view) { boolean isViewer = false; boolean isOwner = false; boolean isEditor = false; String result = "icon-view"; XUser user = ((Workbench) Registry.get(Workbench.ID)).getUser(); isOwner = user.getId().equals(view.getOwnerId()); isEditor = view.containsRoleName("EDITOR"); isViewer = view.containsRoleName("VIEWER"); if (isViewer) { result += "V"; } if (isEditor) { result += "E"; } if (isOwner) { result += "O"; } return result; } private final ToolBar initUI(XUser user) { navigator = new ContentPanel(); navigator.setHeading(constants.views()); navigator.setScrollMode(Scroll.AUTO); // connect with dispatcher: navigator.addListener(Events.Expand, new Listener<ComponentEvent>() { public void handleEvent(ComponentEvent be) { Dispatcher.get().dispatch(WPaloEvent.EXPANDED_VIEWBROWSER_SECTION); } }); // create the tree which displays the data: final TreeLoader<TreeNode> treeLoader = new BaseTreeLoader<TreeNode>(new TreeLoaderProxy()) { public boolean hasChildren(TreeNode data) { return data != null && data.getXObject() != null && data.getXObject().hasChildren(); } protected void onLoadFailure(TreeNode loadConfig, Throwable t) { if (t instanceof SessionExpiredException) Callback.handle((SessionExpiredException) t); else super.onLoadFailure(loadConfig, t); } }; ((Workbench) Registry.get(Workbench.ID)).showWaitCursor(constants.loadingStructure()); viewsTree = createTree(user, treeLoader); LoadListener initialOpenListener = new LoadListener() { public void loaderLoadException(LoadEvent le) { ((Workbench) Registry.get(Workbench.ID)).hideWaitCursor(); } public void loaderLoad(LoadEvent le) { if (le.config != null && le.config instanceof TreeNode && ((TreeNode) le.config).getParent() == null) { // Root // node if (le.data != null && le.data instanceof List) { List loaded = (List) le.data; if (!loaded.isEmpty()) { Object o = loaded.get(0); if (o instanceof TreeNode) { TreeNode tn = (TreeNode) o; Component c = treeBinder.findItem(tn); if (c != null && c instanceof TreeItem) { if (!((TreeItem) c).isExpanded()) { ((TreeItem) c).setExpanded(true); treeLoader.removeLoadListener(this); } } } } } } ((Workbench) Registry.get(Workbench.ID)).hideWaitCursor(); } }; treeLoader.addLoadListener(initialOpenListener); treeLoader.addLoadListener(new LoadListener() { public void loaderBeforeLoad(LoadEvent le) { ((Workbench) Registry.get(Workbench.ID)).showWaitCursor(constants.loadingChildren()); } public void loaderLoadException(LoadEvent le) { ((Workbench) Registry.get(Workbench.ID)).hideWaitCursor(); } public void loaderLoad(LoadEvent le) { ((Workbench) Registry.get(Workbench.ID)).hideWaitCursor(); } }); final ToolBar toolbar = new ToolBar(); TextToolItem addFolder = new TextToolItem("", "icon-create-folder"); addFolder.setToolTip(constants.createNewViewFolder()); addFolder.addSelectionListener(new SelectionListener<ComponentEvent>() { public void componentSelected(ComponentEvent ce) { createNewFolder(); } }); toolbar.add(addFolder); toolbar.add(new SeparatorToolItem()); TextToolItem createViews = new TextToolItem("", "icon-create-view"); createViews.setToolTip(constants.createNewViews()); createViews.addSelectionListener(new SelectionListener<ComponentEvent>() { public void componentSelected(ComponentEvent ce) { TreeNode node = getSelectedNode(); createViews(node); } }); toolbar.add(createViews); TextToolItem importViews = new TextToolItem("", "icon-import-view"); importViews.setToolTip(constants.importViews()); importViews.addSelectionListener(new SelectionListener<ComponentEvent>() { public void componentSelected(ComponentEvent ce) { TreeNode node = getSelectedNode(); importViews(node); } }); toolbar.add(importViews); toolbar.add(new SeparatorToolItem()); renameItem = new TextToolItem("", "icon-rename"); renameItem.setToolTip(constants.renameSelectedItem()); renameItem.setEnabled(true); renameItem.addSelectionListener(new SelectionListener<ComponentEvent>() { public void componentSelected(ComponentEvent ce) { handleAction(RENAME); } }); toolbar.add(renameItem); deleteItem = new TextToolItem("", "icon-delete-off"); deleteItem.setToolTip(constants.deleteSelectedItem()); deleteItem.setEnabled(false); deleteItem.addSelectionListener(new SelectionListener<ComponentEvent>() { public void componentSelected(ComponentEvent ce) { handleAction(DELETE); } }); toolbar.add(deleteItem); navigator.setTopComponent(toolbar); navigator.add(viewsTree); Workbench wb = (Workbench) Registry.get(Workbench.ID); wb.addToViewPanel(navigator); ComponentHelper.doAttach(viewsTree); navigator.addListener(Events.OnKeyUp, new Listener<BaseEvent>() { public void handleEvent(BaseEvent be) { viewsTree.fireEvent(Events.OnKeyUp, be); } }); toolbar.add(new SeparatorToolItem()); // SplitToolItem about = new SplitToolItem(""); // about.setIconStyle("icon-about"); TextToolItem about = new TextToolItem("", "icon-about"); about.setToolTip(constants.extras()); // about.addSelectionListener(new SelectionListener<ComponentEvent>() { // public void componentSelected(ComponentEvent ce) { // WPaloPropertyServiceProvider.getInstance().getBuildNumber(new // AsyncCallback<String>() { // public void onFailure(Throwable arg0) { // displayAboutDialog("<Unknown>"); // } // // public void onSuccess(String result) { // displayAboutDialog(result); // } // }); // } // }); Menu menu = new Menu(); editViewProperties = new MenuItem(constants.editViewProperties()); editViewProperties.addSelectionListener(new SelectionListener<ComponentEvent>() { public void componentSelected(ComponentEvent ce) { XUser user = ((Workbench) Registry.get(Workbench.ID)).getUser(); final String sessionId = user.getSessionId(); XView targetView = null; XObject xObj = null; TreeItem item = null; TreeNode node = null; if (treeBinder != null && treeBinder.getTree() != null) { TreeItem selection = treeBinder.getTree().getSelectedItem(); if (selection != null) { item = selection; node = (TreeNode) selection.getModel(); xObj = browserModel.getWrappedXObject(node); if (xObj instanceof XFolderElement) { XObject source = ((XFolderElement) xObj).getSourceObject(); if (source != null && source instanceof XView) { targetView = (XView) source; } } } } if (targetView != null) { final XView viewToModify = targetView; final XObject xObject = xObj; final TreeItem selectedItem = item; final TreeNode nodeOfView = node; // int permission = user.getId().equals(targetView.getOwnerId()) ? // 2 : 16; int permission = user.isAdmin() ? 0 : (user.getId().equals(targetView.getOwnerId()) ? 16 : 22); WPaloCubeViewServiceProvider.getInstance().checkPermission(sessionId, permission, new Callback<Boolean>() { public void onSuccess(Boolean result) { if (result) { final EditViewPropertiesDialog dlg = new EditViewPropertiesDialog( viewToModify); dlg.addButtonListener(EditViewPropertiesDialog.BUTTON_OK, new Listener<BaseEvent>() { public void handleEvent(BaseEvent be) { boolean pub = dlg.isPublic(); boolean edi = dlg.isEditable(); String ownerId = dlg.getOwner(); String accId = dlg.getAccountId(); String dbId = dlg.getDatabaseId(); String cubeId = dlg.getCubeId(); WPaloCubeViewServiceProvider.getInstance().setVisibility( sessionId, (XFolderElement) xObject, pub, edi, ownerId, accId, dbId, cubeId, new Callback<XView>() { public void onSuccess(XView view) { XFolderElement xObj = (XFolderElement) browserModel .getWrappedXObject(nodeOfView); xObj.setSourceObject(view); selectedItem .setIconStyle(getIconStyle(view)); treeBinder.getStore().update(nodeOfView); } }); } }); dlg.show(); } else { MessageBox.alert(constants.notEnoughRights(), constants.notEnoughRightsToModifyVisibility(), null); } } }); } } }); menu.add(editViewProperties); createDirectLink = new MenuItem(constants.createDirectLink()); createDirectLink.addSelectionListener(new SelectionListener<ComponentEvent>() { public void componentSelected(ComponentEvent ce) { if (treeBinder != null && treeBinder.getTree() != null) { TreeItem selection = treeBinder.getTree().getSelectedItem(); if (selection != null) { TreeNode node = (TreeNode) selection.getModel(); final XObject xObj = browserModel.getWrappedXObject(node); if (xObj instanceof XFolderElement) { final XObject source = ((XFolderElement) xObj).getSourceObject(); if (source != null && source instanceof XView) { final CreateDirectLinkDialog cdl = new CreateDirectLinkDialog((XView) source); cdl.show(); } } } } } }); menu.add(createDirectLink); MenuItem abi = new MenuItem(constants.about()); abi.addSelectionListener(new SelectionListener<ComponentEvent>() { public void componentSelected(ComponentEvent ce) { WPaloPropertyServiceProvider.getInstance().getBuildNumber(new AsyncCallback<String>() { public void onFailure(Throwable arg0) { displayAboutDialog("<" + constants.unknown() + ">", null); } public void onSuccess(final String result) { WPaloPropertyServiceProvider.getInstance() .getCurrentBuildNumber(new AsyncCallback<String[]>() { public void onFailure(Throwable arg0) { displayAboutDialog(result, null); } public void onSuccess(String[] buildInformation) { displayAboutDialog(result, buildInformation); } }); } }); } }); menu.add(abi); // MenuItem tti = new MenuItem("Test Tree"); // tti.addSelectionListener(new SelectionListener<ComponentEvent>() { // public void componentSelected(ComponentEvent ce) { // final TestFastTreeDialog tftd = new TestFastTreeDialog(); // tftd.show(); // } // }); // menu.add(tti); about.setMenu(menu); toolbar.add(about); return toolbar; } private final void createNewFolder() { String sessionId = ((Workbench) Registry.get(Workbench.ID)).getUser().getSessionId(); WPaloFolderServiceProvider.getInstance().hasCreatePermission(sessionId, new Callback<Boolean>() { public void onSuccess(Boolean result) { if (result) { TreeNode selection = getSelectedNode(); final TreeNode parent = getParentFolder(selection); String[] usedFolderNames = browserModel.getUsedFolderNames(); final NewFolderDialog newFolderDlg = new NewFolderDialog(); newFolderDlg.setUsedFolderNames(usedFolderNames); // add close listener: newFolderDlg.addListener(Events.Close, new Listener<WindowEvent>() { public void handleEvent(WindowEvent be) { if (be.buttonClicked.getItemId().equals(NewFolderDialog.CREATE)) { createFolder(newFolderDlg.getFolderName(), parent); } } }); newFolderDlg.show(); } else { MessageBox.alert(constants.notEnoughRights(), constants.notEnoughRightsToCreateNewFolders(), null); } } }); } private final void delete(TreeNode node, boolean confirm) { if (node != null) { XObject xObj = browserModel.getWrappedXObject(node); if (xObj instanceof XFolderElement) { deleteFolderElement((XFolderElement) xObj, node, confirm); } else if (xObj instanceof XStaticFolder) { deleteFolder((XStaticFolder) xObj, node); } } } private final void deleteFolderElement(final XFolderElement xFolderElement, final TreeNode node, final boolean confirm) { final XView xView = browserModel.getView(node); if (xView != null) { String sessionId = ((Workbench) Registry.get(Workbench.ID)).getUser().getSessionId(); WPaloCubeViewServiceProvider.getInstance().checkPermission(sessionId, xView.getId(), CubeViewEditor.RIGHT_DELETE, new Callback<Boolean>() { public void onSuccess(Boolean result) { if (result) { if (confirm) { MessageBox.confirm(constants.confirmDelete(), messages.sureToDeleteView( ViewBrowserModel.modify(xFolderElement.getName())), new Listener<WindowEvent>() { public void handleEvent(WindowEvent be) { if (!be.buttonClicked.getItemId().equalsIgnoreCase(Dialog.NO)) delete(xFolderElement, node); } }); } else delete(xFolderElement, node); } else { MessageBox.alert(constants.notEnoughRights(), constants.notEnoughRightsToDeleteView(), null); } } }); } else { delete(xFolderElement, node); } } private final void deleteFolder(final XStaticFolder xFolder, final TreeNode node) { XUser user = ((Workbench) Registry.get(Workbench.ID)).getUser(); WPaloCubeViewServiceProvider.getInstance().checkPermission(user.getSessionId(), 4, new Callback<Boolean>() { public void onSuccess(Boolean result) { if (result) { MessageBox.confirm(constants.confirmDelete(), messages.sureToDeleteFolder(ViewBrowserModel.modify(xFolder.getName())), new Listener<WindowEvent>() { public void handleEvent(WindowEvent be) { if (!be.buttonClicked.getItemId().equalsIgnoreCase(Dialog.NO)) delete(xFolder, node); } }); } else { MessageBox.alert(constants.notEnoughRights(), constants.notEnoughRightsToDeleteFolder(), null); } } }); } private final void createViewsAfterCheck(final TreeNode node) { // final XStaticFolder xParentFolder = getFolderOrParentFolderOf(node); // final ViewCreateDialog createDlg = new ViewCreateDialog(); XUser user = ((Workbench) Registry.get(Workbench.ID)).getUser(); int permission = user.isAdmin() ? 0 : 16; WPaloCubeViewServiceProvider.getInstance().checkPermission(user.getSessionId(), permission, new AsyncCallback<Boolean>() { private final void showDialog(boolean showBoxes) { final ViewImportDialog createDlg = new ViewImportDialog(false, showBoxes); createDlg.addButtonListener(ViewImportDialog.BUTTON_OK, new Listener<BaseEvent>() { public void handleEvent(BaseEvent be) { XView[] xViews = createDlg.getSelectedViews(); TreeNode parent = getParentFolder(node); importViews(constants.creatingView(), xViews, parent, createDlg.isPublic(), createDlg.isEditable()); } }); createDlg.show(); } public void onFailure(Throwable t) { showDialog(false); } public void onSuccess(Boolean result) { showDialog(result); } }); } private final void importViewsAfterCheck(final TreeNode node) { XUser user = ((Workbench) Registry.get(Workbench.ID)).getUser(); int permission = user.isAdmin() ? 0 : 16; WPaloCubeViewServiceProvider.getInstance().checkPermission(user.getSessionId(), permission, new AsyncCallback<Boolean>() { private final void showDialog(boolean showBoxes) { final ViewImportDialog importDlg = new ViewImportDialog(true, showBoxes); importDlg.addButtonListener(ViewImportDialog.BUTTON_OK, new Listener<BaseEvent>() { public void handleEvent(BaseEvent be) { XView[] xViews = importDlg.getSelectedViews(); TreeNode parent = getParentFolder(node); importViews(constants.importingViews(), xViews, parent, importDlg.isPublic(), importDlg.isEditable()); } }); importDlg.show(); } public void onFailure(Throwable t) { showDialog(false); } public void onSuccess(Boolean result) { showDialog(result); } }); } private final void createViews(final TreeNode node) { if (createRight == -1) { String sessionId = ((Workbench) Registry.get(Workbench.ID)).getUser().getSessionId(); WPaloCubeViewServiceProvider.getInstance().checkPermission(sessionId, CubeViewEditor.RIGHT_CREATE, new Callback<Boolean>() { public void onSuccess(Boolean result) { if (result) { createRight = 1; createViewsAfterCheck(node); } else { createRight = 0; MessageBox.alert(constants.notEnoughRights(), constants.notEnoughRightsToCreateNewViews(), null); } } }); } else if (createRight == 0) { MessageBox.alert(constants.notEnoughRights(), constants.notEnoughRightsToCreateNewViews(), null); } else { createViewsAfterCheck(node); } } private final TreeNode getParentFolder(TreeNode node) { XObject xObj = browserModel.getWrappedXObject(node); if (xObj instanceof XStaticFolder) return node; return node.getParent(); } private final void importViews(String operation, final XView[] xViews, final TreeNode parent, final boolean isPublic, final boolean isEditable) { XStaticFolder xParentFolder = (XStaticFolder) browserModel.getWrappedXObject(parent); ((Workbench) Registry.get(Workbench.ID)).showWaitCursor(operation); String sessionId = ((Workbench) Registry.get(Workbench.ID)).getUser().getSessionId(); WPaloFolderServiceProvider.getInstance().importViewsAsFolderElements(sessionId, xViews, xParentFolder, isPublic, isEditable, new Callback<XFolderElement[]>(constants.couldNotCreateView()) { public void onSuccess(XFolderElement[] xFolderElements) { browserModel.addViews(xFolderElements, parent); TreeItem it = viewsTree.getSelectedItem(); if (it != null) { viewsTree.expandPath(it.getPath()); } hideWaitCursor(); } }); } private final void importViews(final TreeNode node) { if (createRight == -1) { String sessionId = ((Workbench) Registry.get(Workbench.ID)).getUser().getSessionId(); WPaloCubeViewServiceProvider.getInstance().checkPermission(sessionId, CubeViewEditor.RIGHT_CREATE, new Callback<Boolean>() { public void onSuccess(Boolean result) { Log.info("nel view browser::importViews"); if (result) { createRight = 1; importViewsAfterCheck(node); } else { createRight = 0; MessageBox.alert(constants.notEnoughRights(), constants.notEnoughRightsToCreateNewViews(), null); } } }); } else if (createRight == 0) { MessageBox.alert(constants.notEnoughRights(), constants.notEnoughRightsToCreateNewViews(), null); } else { importViewsAfterCheck(node); } } final void handleAction(String action) { TreeNode selection = getSelectedNode(); if (selection != null) { if (action.equals(OPEN)) { doOpen(selection); } else if (action.equals(DELETE)) { doDelete(viewsTree.getSelectedItems()); } else if (action.equals(RENAME)) { doRename(selection); } } } private final void doOpen(TreeNode selection) { XObject xObj = browserModel.getWrappedXObject(selection); if (xObj instanceof XFolderElement) { fireEvent(new AppEvent<TreeNode>(WPaloEvent.EDIT_VIEWBROWSER_VIEW, selection)); } } private final void doDelete(final List<TreeItem> selection) { if (selection.isEmpty()) return; TreeItem sel = selection.get(0); if (sel != null) { TreeNode tn = (TreeNode) sel.getModel(); if (tn != null && tn.getXObject() instanceof XObjectWrapper && ((XObjectWrapper) tn.getXObject()).getXObject() instanceof XStaticFolder) { delete(selection); return; } } MessageBox.confirm(constants.confirmDelete(), constants.sureToDeleteItems(), new Listener<WindowEvent>() { public void handleEvent(WindowEvent be) { if (!be.buttonClicked.getItemId().equalsIgnoreCase(Dialog.NO)) { delete(selection); } } }); } private final void delete(List<TreeItem> selection) { for (TreeItem selectedItem : selection) { if (selectedItem != null) { TreeNode node = (TreeNode) selectedItem.getModel(); if (node == null) node = getVisibleRoot(); delete(node, false); } } } private final void doRename(TreeNode selection) { TreeItem selectedItem = viewsTree.getSelectedItem(); XObject xObj = browserModel.getWrappedXObject(selection); if ((xObj instanceof XFolderElement || xObj instanceof XStaticFolder) && selectedItem instanceof EditableTreeItem) rename((EditableTreeItem) selectedItem); } private final void delete(final XFolderElement xFolderElement, final TreeNode node) { String sessionId = ((Workbench) Registry.get(Workbench.ID)).getUser().getSessionId(); WPaloFolderServiceProvider.getInstance().deleteFolderElement(sessionId, xFolderElement, new Callback<Void>(messages.couldNotDeleteView(ViewBrowserModel.modify(xFolderElement.getName()))) { public void onSuccess(Void arg0) { delete((XView) xFolderElement.getSourceObject(), node); } }); } private final void delete(final XView xView, final TreeNode node) { if (xView == null) { fireViewDeleted(node); } else { String sessionId = ((Workbench) Registry.get(Workbench.ID)).getUser().getSessionId(); WPaloCubeViewServiceProvider.getInstance().deleteView(sessionId, xView, new Callback<Void>(messages.couldNotDeleteView(ViewBrowserModel.modify(xView.getName()))) { public void onSuccess(Void arg0) { fireViewDeleted(node); } }); } } private final void fireViewDeleted(TreeNode node) { fireEvent(new AppEvent<TreeNode>(WPaloEvent.DELETED_VIEWBROWSER_VIEW, node)); browserModel.delete(node); } private final void delete(final XStaticFolder folder, final TreeNode node) { String sessionId = ((Workbench) Registry.get(Workbench.ID)).getUser().getSessionId(); WPaloFolderServiceProvider.getInstance().deleteFolder(sessionId, folder, new Callback<Void>(messages.couldNotDeleteFolder(ViewBrowserModel.modify(folder.getName()))) { public void onSuccess(Void arg0) { browserModel.delete(node); } }); } private final void checkSelection(Tree tree) { TreeItem selection = tree.getSelectedItem(); if (selection != null) { TreeNode node = (TreeNode) selection.getModel(); XObject xObj = browserModel.getWrappedXObject(node); mayDelete = true; if (deleteItem != null) { deleteItem.setEnabled(true); deleteItem.setIconStyle("icon-delete"); } if (xObj instanceof XStaticFolder) { if (node.getParent().getParent() == null) { mayDelete = false; if (deleteItem != null) { deleteItem.setEnabled(false); deleteItem.setIconStyle("icon-delete-off"); } } } if (mayDelete && viewsTree != null) { if (viewsTree.getContextMenu().getItemCount() == 2) { viewsTree.setContextMenu(createContextMenu()); } } else if (!mayDelete && viewsTree != null) { if (viewsTree.getContextMenu().getItemCount() == 3) { viewsTree.setContextMenu(createContextMenu()); } } if (mayDelete) { if (renameItem != null) { renameItem.setEnabled(true); renameItem.setIconStyle("icon-rename"); } if (editViewProperties != null) { editViewProperties.setEnabled(xObj instanceof XFolderElement); } if (createDirectLink != null) { createDirectLink.setEnabled(xObj instanceof XFolderElement); } } else { if (editViewProperties != null) { editViewProperties.setEnabled(false); } if (createDirectLink != null) { createDirectLink.setEnabled(false); } } } } private final Tree createTree(XUser user, TreeLoader<TreeNode> loader) { final Tree tree = new Tree(); tree.setIndentWidth(18); tree.setSelectionMode(SelectionMode.SINGLE); TreeStore<TreeNode> treeStore = new TreeStore<TreeNode>(loader); treeBinder = new TreeNodeBinder(tree, treeStore); treeBinder.setDisplayProperty("name"); treeBinder.setAutoSelect(true); treeBinder.init(); // tree model: browserModel = new ViewBrowserModel(user, treeStore); tree.addListener(Events.SelectionChange, new Listener<BaseEvent>() { public void handleEvent(BaseEvent be) { TreeItem selection = tree.getSelectedItem(); if (selection == null) { if (deleteItem != null) { deleteItem.setEnabled(false); deleteItem.setIconStyle("icon-delete-off"); } if (renameItem != null) { renameItem.setEnabled(false); } if (editViewProperties != null) { editViewProperties.setEnabled(false); } if (createDirectLink != null) { createDirectLink.setEnabled(false); } } else { checkSelection(tree); } } }); tree.addListener(Events.OnClick, new Listener<BaseEvent>() { public void handleEvent(BaseEvent be) { checkSelection(tree); } }); tree.addListener(Events.OnDoubleClick, new Listener<TreeEvent>() { public void handleEvent(TreeEvent be) { handleAction(OPEN); } }); tree.addListener(Events.OnKeyUp, new Listener<TreeEvent>() { public void handleEvent(TreeEvent te) { if (te.getKeyCode() == F2) { handleAction(RENAME); } } }); String sessionId = ((Workbench) Registry.get(Workbench.ID)).getUser().getSessionId(); WPaloFolderServiceProvider.getInstance().hasWritePermission(sessionId, new Callback<Boolean>() { public void onSuccess(Boolean result) { if (result) { addDragAndDrop(treeBinder); } } }); tree.setContextMenu(createContextMenu()); tree.getRootItem().setExpanded(true); return tree; } private final Menu createContextMenu() { ContextMenu ctxtMenu = new ContextMenu(this); ctxtMenu.add(OPEN, null); if (mayDelete) { ctxtMenu.add(DELETE, "icon-delete"); } ctxtMenu.add(RENAME, "icon-rename"); return ctxtMenu.getMenu(); } private final void rename(final EditableTreeItem item) { final Editor editor = item.getEditor(); Listener<EditorEvent> editorListener = new Listener<EditorEvent>() { public void handleEvent(EditorEvent ev) { editor.removeListener(Events.Complete, this); if (!ev.startValue.equals(ev.value)) doRename(item); } }; editor.addListener(Events.Complete, editorListener); item.startEdit(); } private final void doRename(final TreeItem item) { TreeNode node = (TreeNode) item.getModel(); final XObject obj = browserModel.getWrappedXObject(node); if (obj instanceof XStaticFolder) { String sessionId = ((Workbench) Registry.get(Workbench.ID)).getUser().getSessionId(); WPaloFolderServiceProvider.getInstance().hasWritePermission(sessionId, new Callback<Boolean>() { public void onSuccess(Boolean result) { if (result) { rename((XStaticFolder) obj, item); } else { MessageBox.alert(constants.notEnoughRights(), constants.notEnoughRightsToRenameFolder(), null); } } }); return; } final XFolderElement xFolderElement = (XFolderElement) browserModel.getWrappedXObject(node); final XView xView = browserModel.getView(node); if (xView != null) { String sessionId = ((Workbench) Registry.get(Workbench.ID)).getUser().getSessionId(); WPaloCubeViewServiceProvider.getInstance().checkPermission(sessionId, xView.getId(), CubeViewEditor.RIGHT_WRITE, new Callback<Boolean>() { public void onSuccess(Boolean result) { if (result) { rename(xFolderElement, xView, item); } else { MessageBox.alert(constants.notEnoughRights(), constants.notEnoughRightsToRenameView(), null); } } public void onFailure(Throwable arg0) { // TODO Auto-generated method stub } }); } } protected String demodify(String x) { x = x.replaceAll("&", "&"); x = x.replaceAll("'", "'"); x = x.replaceAll("<", "<"); x = x.replaceAll(">", ">"); x = x.replaceAll(""", "\""); return x; } private final void rename(final XFolderElement xFolderElement, final XView xView, final TreeItem item) { final String newName = demodify(item.getText()); String sessionId = ((Workbench) Registry.get(Workbench.ID)).getUser().getSessionId(); WPaloFolderServiceProvider.getInstance().renameFolderElement(sessionId, xFolderElement, newName, new Callback<Void>(constants.failedToRenameView()) { public void onSuccess(Void v) { xFolderElement.setName(newName); // successful => rename internal view too: rename(xView, item); } }); } // private final void checkStyle(TreeItem item) { // if (item.getModel() instanceof TreeNode) { // TreeNode tn = (TreeNode) item.getModel(); // if (tn != null && tn.getXObject() != null) { // XObject x = tn.getXObject(); // if (x instanceof XObjectWrapper) { // x = ((XObjectWrapper) x).getXObject(); // } // if (x != null && x instanceof XFolderElement) { // x = ((XFolderElement) x).getSourceObject(); // } // if (x != null && x instanceof XView) { // XUser user = ((Workbench)Registry.get(Workbench.ID)).getUser(); // if (!user.getId().equals(((XView) x).getOwnerId())) { // item.setTextStyle("italic"); // } // } // } // } // } private final void rename(final XStaticFolder folder, final TreeItem item) { final String newName = demodify(item.getText()); String sessionId = ((Workbench) Registry.get(Workbench.ID)).getUser().getSessionId(); WPaloFolderServiceProvider.getInstance().renameFolder(sessionId, folder, newName, new Callback<Void>(constants.failedToRenameFolder()) { public void onSuccess(Void arg0) { TreeNode node = (TreeNode) item.getModel(); node.getXObject().setName(newName); browserModel.refresh(node); } }); } private final void rename(final XView xView, final TreeItem item) { final String newName = demodify(item.getText()); String sessionId = ((Workbench) Registry.get(Workbench.ID)).getUser().getSessionId(); WPaloCubeViewServiceProvider.getInstance().renameView(sessionId, xView, newName, new Callback<Void>(constants.failedToRenameView()) { public void onSuccess(Void arg0) { TreeNode node = (TreeNode) item.getModel(); node.getXObject().setName(newName); browserModel.refresh(node); // checkStyle(item); fireEvent(new AppEvent<TreeNode>(WPaloEvent.RENAMED_VIEWBROWSER_VIEW, node)); } }); } @SuppressWarnings("unchecked") private final void dropToStaticFolder(XStaticFolder toFolder, TreeItem target, DNDEvent e) { final TreeNode newParent = findNodeOf(toFolder); List movedNodes = (List) e.data; XObject[] xElems = getMoveableElementsFrom(movedNodes, newParent); String sessionId = ((Workbench) Registry.get(Workbench.ID)).getUser().getSessionId(); WPaloFolderServiceProvider.getInstance().move(sessionId, xElems, toFolder, new Callback<Void>(constants.couldNotMoveViews()) { public void onSuccess(Void arg0) { } }); } private final void addDragAndDrop(final TreeBinder<TreeNode> binder) { final Tree tree = binder.getTree(); // D 'n' D: TreeDragSource dragSource = new TreeDragSource(binder); dragSource.addDNDListener(new DNDListener() { @SuppressWarnings("unchecked") public void dragStart(DNDEvent e) { List selection = (List) e.data; if (!isValid(selection)) { e.doit = false; e.status.setStatus(false); } } }); TreeDropTarget dropTarget = new TreeDropTarget(binder); dropTarget.setAllowSelfAsSource(true); dropTarget.setFeedback(Feedback.APPEND); dropTarget.setOperation(Operation.MOVE); dropTarget.addDNDListener(new DNDListener() { public void dragDrop(final DNDEvent e) { final TreeItem target = tree.findItem(e.getTarget()); if (target != null) { XObject wrappedObj = browserModel.getWrappedXObject((TreeNode) target.getModel()); if (wrappedObj instanceof XStaticFolder) { dropToStaticFolder((XStaticFolder) wrappedObj, target, e); } } } }); } private final boolean isValid(List selection) { if (selection == null) return false; for (Object nd : selection) { BaseTreeModel btm = ((BaseTreeModel) nd); Object model = btm.getProperties().get("model"); if (model != null && model instanceof TreeNode) { TreeNode node = (TreeNode) model; XObject wrappedXObj = browserModel.getWrappedXObject(node); // if(wrappedXObj instanceof XStaticFolder) // return false; } else { return false; } } return true; } private final XObject[] getMoveableElementsFrom(List nodes, TreeNode newParent) { List<XObject> elements = new ArrayList<XObject>(); for (Object nd : nodes) { BaseTreeModel btm = ((BaseTreeModel) nd); Object model = btm.getProperties().get("model"); if (model != null && model instanceof TreeNode) { TreeNode node = (TreeNode) model; XObject wrappedXObj = browserModel.getWrappedXObject(node); if (wrappedXObj instanceof XFolderElement || wrappedXObj instanceof XStaticFolder) { elements.add(wrappedXObj); node.setParent(newParent); } } } return elements.toArray(new XObject[0]); } private final TreeNode getSelectedNode() { // TreeNode defaultNode) { TreeNode node = null; // TreeNode defaultNode = (TreeNode) viewsTree.getRootItem().getModel(); TreeItem selectedItem = viewsTree.getSelectedItem(); if (selectedItem != null) node = (TreeNode) selectedItem.getModel(); return node != null ? node : getVisibleRoot(); } private final TreeNode getVisibleRoot() { TreeItem root = viewsTree.getRootItem(); if (root.getItemCount() > 0) return (TreeNode) root.getItem(0).getModel(); return null; } private final void createFolder(String name, final TreeNode parent) { XObjectWrapper wrappedXObj = (XObjectWrapper) parent.getXObject(); XStaticFolder parentFolder = (XStaticFolder) wrappedXObj.getXObject(); String sessionId = ((Workbench) Registry.get(Workbench.ID)).getUser().getSessionId(); WPaloFolderServiceProvider.getInstance().createFolder(sessionId, name, parentFolder, new Callback<XStaticFolder>(constants.couldNotAddFolder()) { public void onSuccess(XStaticFolder folder) { if (folder != null) { browserModel.addFolder(folder, parent); TreeItem it = viewsTree.getSelectedItem(); if (it != null) { viewsTree.expandPath(it.getPath()); } } } }); } } class TreeNodeBinder extends TreeBinder<TreeNode> { private final TreeNodeIconProvider iconProvider = new TreeNodeIconProvider(); public TreeNodeBinder(Tree tree, TreeStore<TreeNode> store) { super(tree, store); setIconProvider(iconProvider); } protected TreeItem createItem(TreeNode model) { // final TreeItem item = super.createItem(model); TreeItem item = createEditableTreeItem(model); item.setLeaf(!iconProvider.isFolder(model)); return item; } protected TreeItem createEditableTreeItem(TreeNode model) { TreeItem item = new EditableTreeItem(); update(item, model); if (loader != null) { item.setLeaf(!loader.hasChildren(model)); } else { item.setLeaf(!hasChildren(model)); } setModel(item, model); return item; } } class EditableTreeItem extends TreeItem { private TextField<String> textField = new TextField<String>(); private Editor editor = new Editor(textField) { public Object postProcessValue(Object value) { return modify("" + value); } public Object preProcessValue(Object value) { return demodify("" + value); } }; private EditableTreeItemUI ui; public EditableTreeItem() { super(); editor.setCompleteOnEnter(true); editor.setCancelOnEsc(true); editor.addListener(Events.Complete, new Listener<EditorEvent>() { public void handleEvent(EditorEvent be) { setText(demodify((String) be.value)); } }); } protected TreeItemUI getTreeItemUI() { if (ui == null) { ui = new EditableTreeItemUI(this); } return ui; } public void setText(String text) { String r = modify(text); this.textField.setValue(r); super.setText(r); } public String getText() { String text = modify(demodify(textField.getValue())); return text; } protected String demodify(String x) { x = x.replaceAll("&", "&"); x = x.replaceAll("'", "'"); x = x.replaceAll("<", "<"); x = x.replaceAll(">", ">"); x = x.replaceAll(""", "\""); return x; } protected String modify(String x) { x = x.replaceAll("&", "&"); x = x.replaceAll("\"", """); x = x.replaceAll("'", "'"); x = x.replaceAll("<", "<"); x = x.replaceAll(">", ">"); return x; } public Editor getEditor() { return editor; } public void startEdit() { editor.startEdit(this.getElement(), getText()); align(editor); } private final void align(Editor editor) { Element icon = ui.getIconElement(); int x = icon.getAbsoluteLeft() + icon.getOffsetWidth() + 2; int y = icon.getAbsoluteTop(); int w = getOffsetWidth() + 15 - x; // Need to use the icon's offsetHeight, because otherwise // the editor will be too high for expanded folder elements int h = icon.getOffsetHeight(); if (GXT.isIE) { h -= 2; } // getOffsetHeight() + 1; editor.setBounds(x, y, w, h); } public boolean clickedOnIcon(Point mouseXY) { Element icon = ui.getIconElement(); int iconX = icon.getAbsoluteLeft(); int iconW = iconX + icon.getOffsetWidth(); int iconY = icon.getAbsoluteTop(); int iconH = iconY + icon.getOffsetHeight(); return (mouseXY.x >= iconX && mouseXY.x <= iconW) && (mouseXY.y >= iconY && mouseXY.y <= iconH); } public void removeAll() { // TODO Auto-generated method stub super.removeAll(); } } class EditableTreeItemUI extends TreeItemUI { public EditableTreeItemUI(TreeItem item) { super(item); } Element getIconElement() { return iconEl; } Element getTextElement() { return textEl; } } class TreeNodeIconProvider implements ModelStringProvider<TreeNode> { public final boolean isFolder(TreeNode node) { return getObjectType(node).equals(XStaticFolder.TYPE); } public String getStringValue(TreeNode node, String property) { String xType = getObjectType(node); if (xType.equals(XFolderElement.TYPE) || xType.equals(XView.TYPE)) { return ViewBrowser.getIconStyle(node); } else return "icon-static-folder"; } private final String getObjectType(TreeNode node) { XObject xObject = getWrappedXObject(node); return xObject.getType(); } private final XObject getWrappedXObject(TreeNode node) { XObject xObj = node.getXObject(); if (xObj instanceof XObjectWrapper) return ((XObjectWrapper) xObj).getXObject(); return xObj; } } class ContextMenu extends SelectionListener<MenuEvent> { private final Menu contextMenu = new Menu(); private final ViewBrowser browser; ContextMenu(ViewBrowser browser) { this.browser = browser; } final Menu getMenu() { return contextMenu; } final void add(String action, String icon) { MenuItem item = new MenuItem(); item.setText(action); item.setIconStyle(icon); item.addSelectionListener(this); contextMenu.add(item); } public void componentSelected(MenuEvent me) { browser.handleAction(((MenuItem) me.item).getText()); } }