📄 membernavigator.java
字号:
/*
* ====================================================================
* 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 + -