Package com.tensegrity.wpalo.client.ui.mvc.viewbrowser

Source Code of com.tensegrity.wpalo.client.ui.mvc.viewbrowser.ViewBrowser

/*
*
* @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.isChromeresult = "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.isSafariresult = "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.isGecko3result = "Firefox 3";
    if (ua.isGecko2result = "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("&amp;", "&");
    x = x.replaceAll("&apos;", "'");
    x = x.replaceAll("&lt;", "<");
    x = x.replaceAll("&gt;", ">");
    x = x.replaceAll("&quot;", "\"");
    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("&amp;", "&");
    x = x.replaceAll("&apos;", "'");
    x = x.replaceAll("&lt;", "<");
    x = x.replaceAll("&gt;", ">");
    x = x.replaceAll("&quot;", "\"");
    return x;
  }
 
  protected String modify(String x) {
    x = x.replaceAll("&", "&amp;");
    x = x.replaceAll("\"", "&quot;");
    x = x.replaceAll("'", "&apos;");
    x = x.replaceAll("<", "&lt;");
    x = x.replaceAll(">", "&gt;");
    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());
 
}
TOP

Related Classes of com.tensegrity.wpalo.client.ui.mvc.viewbrowser.ViewBrowser

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.