⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 membernavigator.java

📁 OLAP 的客户端代码
💻 JAVA
📖 第 1 页 / 共 2 页
字号:
/*
 * ====================================================================
 * This software is subject to the terms of the Common Public License
 * Agreement, available at the following URL:
 *   http://www.opensource.org/licenses/cpl.html .
 * Copyright (C) 2003-2004 TONBELLER AG.
 * All Rights Reserved.
 * You must accept the terms of that agreement to use this software.
 * ====================================================================
 *
 * 
 */
package com.tonbeller.jpivot.navigator.member;

import java.util.Comparator;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Locale;
import java.util.Map;

import org.apache.log4j.Logger;
import org.w3c.dom.Document;
import org.w3c.dom.Element;

import com.tonbeller.jpivot.core.ModelChangeEvent;
import com.tonbeller.jpivot.core.ModelChangeListener;
import com.tonbeller.jpivot.olap.model.Displayable;
import com.tonbeller.jpivot.olap.model.Hierarchy;
import com.tonbeller.jpivot.olap.model.Level;
import com.tonbeller.jpivot.olap.model.Member;
import com.tonbeller.jpivot.olap.model.OlapModel;
import com.tonbeller.jpivot.olap.model.OlapUtils;
import com.tonbeller.jpivot.olap.navi.MemberDeleter;
import com.tonbeller.jpivot.olap.navi.MemberTree;
import com.tonbeller.jpivot.ui.Available;
import com.tonbeller.tbutils.res.Resources;
import com.tonbeller.wcf.component.Component;
import com.tonbeller.wcf.controller.Dispatcher;
import com.tonbeller.wcf.controller.RequestContext;
import com.tonbeller.wcf.controller.RequestListener;
import com.tonbeller.wcf.scroller.Scroller;
import com.tonbeller.wcf.selection.SelectionModel;
import com.tonbeller.wcf.tree.DefaultDeleteNodeModel;
import com.tonbeller.wcf.tree.DefaultLabelProvider;
import com.tonbeller.wcf.tree.DefaultNodeRenderer;
import com.tonbeller.wcf.tree.DeleteNodeModel;
import com.tonbeller.wcf.tree.GroupingTreeModelDecorator;
import com.tonbeller.wcf.tree.LabelProvider;
import com.tonbeller.wcf.tree.MutableTreeModelDecorator;
import com.tonbeller.wcf.tree.TreeComponent;
import com.tonbeller.wcf.tree.TreeModel;
import com.tonbeller.wcf.ui.Button;
import com.tonbeller.wcf.utils.DomUtils;

/**
 * GUI for choosing members. User of this class must call setHierarchy or setHierarchies before
 * rendering.
 *
 * @author av
 */
public class MemberNavigator extends TreeComponent implements ModelChangeListener, Available {

  private OlapModel olapModel;
  private String title;
  private RequestListener okHandler;
  private RequestListener cancelHandler;
  private boolean showSelectNoneButton;
  private String okButtonId;
  private String cancelButtonId;
  private String selectVisibleButtonId;
  private String selectNoneButtonId;
  private String enableGroupingButtonId;
  private String disableGroupingButtonId;
  // contains a Tree (value) for a HierarchyArray (key)
  private Map trees = new HashMap();
  private Resources resources;

  private int groupingMemberCount = 12;

  /**
   * defines equals/hashCode for an array of hierarchies. Two arrays are equal if and only if all
   * their hierarchies are equal.
   *
   * @author av
   */
  static class HierarchyArray {

    private Hierarchy[] hiers;

    public HierarchyArray(Hierarchy[] hiers) {
      this.hiers = hiers;
    }

    public boolean equals(Object obj) {
      if (!(obj instanceof HierarchyArray))
        return false;
      HierarchyArray that = (HierarchyArray) obj;
      if (this.hiers.length != that.hiers.length)
        return false;
      for (int i = 0; i < hiers.length; i++)
        if (!this.hiers[i].equals(that.hiers[i]))
          return false;
      return true;
    }

    public Hierarchy[] getHierarchies() {
      return hiers;
    }

    public String getLabel() {
      if (hiers.length == 0)
        return ""; //$NON-NLS-1$
      if (hiers.length == 1)
        return hiers[0].getLabel();
      StringBuffer sb = new StringBuffer();
      for (int i = 0; i < hiers.length; i++) {
        if (i > 0)
          sb.append(" / "); //$NON-NLS-1$
        sb.append(hiers[i].getLabel());
      }
      return sb.toString();
    }

    public int hashCode() {
      int code = 27;
      for (int i = 0; i < hiers.length; i++) {
        code ^= hiers[i].hashCode();
      }
      return code;
    }

    public void setHierarchies(Hierarchy[] hiers) {
      this.hiers = hiers;
    }

  }

  class SelectVisibleHandler implements RequestListener {
    public void request(RequestContext context) throws Exception {
      Scroller.enableScroller(context);
      validate(context);
      selectVisible();
    }
  }

  class SelectNoneHandler implements RequestListener {
    public void request(RequestContext context) throws Exception {
      Scroller.enableScroller(context);
      validate(context);
      getSelectionModel().clear();
    }
  }

  class SetGroupingHandler implements RequestListener {
    boolean grouping;

    SetGroupingHandler(boolean grouping) {
      this.grouping = grouping;
    }

    public void request(RequestContext context) throws Exception {
      validate(context);
      setGrouping(grouping);
    }
  }

  static class Tree {
    TreeModelAdapter adapter;
    MutableTreeModelDecorator model;

    public Tree(TreeModelAdapter adapter, MutableTreeModelDecorator model) {
      this.adapter = adapter;
      this.model = model;
    }

    public TreeModelAdapter getAdapter() {
      return adapter;
    }

    public MutableTreeModelDecorator getModel() {
      return model;
    }
  }

  class MutableMemberTreeModelDecorator extends MutableTreeModelDecorator {
    public MutableMemberTreeModelDecorator(TreeModel decoree) {
      super(decoree);
    }

    public MutableMemberTreeModelDecorator(TreeModel decoree, Comparator comp) {
      super(decoree, comp);
    }

    public boolean mayMove(Object scope, Object node) {
      // non-members are virtual groups
      if (!(node instanceof Member)) { return false; }
      return super.mayMove(scope, node);
    }
  }

  private static Logger logger = Logger.getLogger(MemberNavigator.class);

  private DeleteNodeModel deleteModel = new DefaultDeleteNodeModel() {
    public boolean isDeletable(Object node) {
      if (olapModel == null)
        return false;
      MemberDeleter md = (MemberDeleter) olapModel.getExtension(MemberDeleter.ID);
      if (md == null)
        return false;
      if (node instanceof Member)
        return md.isDeletable((Member) node);
      return false;
    }
  };

  public MemberNavigator(String id, Component parent, OlapModel olapModel,
      RequestListener okHandler, RequestListener cancelHandler) {
    super(id, parent);
    logger.info("creating instance: " + this);

    this.olapModel = olapModel;
    if (olapModel != null)
      olapModel.addModelChangeListener(this);

    this.okHandler = okHandler;
    this.cancelHandler = cancelHandler;
    setNodeRenderer(new DefaultNodeRenderer(labelProvider));
    if (id == null)
      id = DomUtils.randomId();
    okButtonId = id + ".ok";
    cancelButtonId = id + ".cancel";
    selectVisibleButtonId = id + ".selectVisible";
    selectNoneButtonId = id + ".selectNone";
    enableGroupingButtonId = id + ".enableGrouping";
    disableGroupingButtonId = id + ".disableGrouping";
    setSelectionModel(new MemberSelectionModel());
    setDeleteNodeModel(deleteModel);
    // move nodes via Cut/Paste GUI
    setCutPasteMode(true);
  }

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -