📄 agcreatedepttree.java.svn-base
字号:
package com.fzet.cois.dividework.agents;
/*
* 生成部门树形结构代理|agCreateDeptTree
* @author yeshq
* @version 2007-1-30
*/
import lotus.domino.*;
import java.util.*;
import com.fzet.cois.common.scriptLib.*;
public class AgCreateDeptTree extends AgentBase {
Session session = null;
Database db = null;
Database dbMain = null;
Document doc = null;
int nCount = 0; // 计数器,用于为各个折叠式元素命名,所有的折叠式元素都以UNID命名
View vwDept = null; // 部门取值视图
String sRootName = null; // 树形根目录名称
public void NotesMain() {
AgentContext ac = null;
ErrHandle err = null; // 错误处理
try {
session = getSession();
ac = session.getAgentContext();
db = ac.getCurrentDatabase();
doc = ac.getDocumentContext();
dbMain = Common.getMainDb(session);
err = new ErrHandle(session, 0, "", "agCreateDeptTree");
// 首先打开“部门取值视图”,如果打不开,后面的代码就无法执行,只好退出
vwDept = dbMain.getView("vwDept");
if (vwDept == null) {
err.record(true, 0, "无法打开部门取值视图");
return;
}
sRootName = doc.getItemValueString("CompanyName");
// 调用绘制树形结构函数,并将返回值填写到Tree域中
String sTree = paintTree("");
// 好了,结果已经出来了,接下来就是要把它分配到n个Body域中(因为域会超长)
int nPos = 1;
int nStart = 0;
int nEnd = nStart + 10000;
int nLength = sTree.length();
while (nStart < nLength) {
if (nEnd > nLength)
nEnd = nLength;
doc.replaceItemValue("Body" + Integer.toString(nPos), sTree.substring(nStart, nEnd).toString());
nStart += 10000;
nEnd += 10000;
nPos += 1;
}
} catch (NotesException e) {
err.record(true, e.id, e.text);
e.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
if (vwDept != null)
vwDept.recycle();
if (doc != null)
doc.recycle();
if (db != null)
db.recycle();
if (dbMain != null)
dbMain.recycle();
if (ac != null)
ac.recycle();
if (session != null)
session.recycle();
} catch (Exception e) {
e.printStackTrace();
}
}
}
// 绘制树形结构函数
public String paintTree(String sRootName) {
String sSubTree = null; // 用于接收“绘制子树形结构”函数的返回值
String sTableCode = null; // 作为表格头代码的常量使用
ErrHandle err = null; // 错误处理
try {
err = new ErrHandle(session, 0, "", "agCreateDeptTree.paintTree()");
sTableCode = "<table border0 width=100% cellspacing=0 cellpadding=0>";
// 在“类别管理视图”中根目录是以“/”表示的,所有必须将根目录转换为“/”
if (sRootName.equals("")) {
sRootName = "/";
}
// 调用“绘制子树形结构”函数
sSubTree = paintSubTree(sRootName, "0", "TreeRoot");
// 返回值为空,表示当前部门没有下级部门
// 根目录的命名为“TreeRoot”
if (sSubTree.equals("")) {
return sTableCode + addIcon(sRootName, sRootName, "0", "TreeRoot", "0", "0")
+ "</table><span id=\"TreeRoot\" parentId=\"\"></span>";
} else {
return sTableCode + addIcon(sRootName, sRootName, "1", "TreeRoot", "0", "0")
+ "<tr id=\"TreeRoot\" parentId=\"\"><td>" + sSubTree + "</td></tr></table>";
}
} catch (Exception e) {
err.record(true, 0, e.toString());
e.printStackTrace();
return "";
}
}
// 绘制子树形结构函数
// 参数说明:sParentName|父部门名称,sParentIsLast|父部门是否为同级中的最后一个部门
public String paintSubTree(String sParentName, String sParentIsLast, String sParentAreaName) {
ErrHandle err = null; // 错误处理
String sResult = null; // 函数返回值
String sTableCode = null; // 表格头常量
try {
err = new ErrHandle(session, 0, "", "agCreateDeptTree.paintSubTree()");
sTableCode = "<table width=100% border=0 cellspacing=0 cellpadding=0>";
// 调用“查找子部门”函数,返回值为一个数组
Vector asSubDept = new Vector();
asSubDept = findSubDept(sParentName);
// 如果没有下级部门,则返回空值
sResult = "";
if (!asSubDept.isEmpty()) {
String sSubTree = ""; // 用于接收“绘制子树形结构”函数的返回值
String sAreaName = ""; // 用于定义各折叠式树形区域的命名
String sIsLast = "0"; // 用于定义是否同级部门中的最后一个部门,0|否,1|是。默认为“0”
String sSubDept = ""; // 循环中使用,记录当前的子部门
String sShortName = ""; // 部门简称,用于添加图标时作为显示名称
Vector vSubDept = new Vector(); // 返回值中每个元素又是一个Vector,有三个值:UNID,简称,全称
for (int i = 0; i < asSubDept.size(); i++) {
vSubDept = (Vector) asSubDept.elementAt(i);
sAreaName = vSubDept.elementAt(0).toString(); // 命名折叠式树形区域
if (i == asSubDept.size() - 1) // 判断是否同级部门中的最后一个
sIsLast = "1";
sShortName = (String) vSubDept.elementAt(1); // 部门简称
sSubDept = (String) vSubDept.elementAt(2); // 部门全称
// 递归调用“绘制子树形结构”函数
sSubTree = paintSubTree(sSubDept, sIsLast, sAreaName);
if (sSubTree.equals("")) {
sResult += sTableCode + addIcon(sShortName, sSubDept, "0", sAreaName, sIsLast, sParentIsLast)
+ "</table><span id=\"" + sAreaName + "\" parentId=\"" + sParentAreaName + "\"></span>";
} else {
sResult += sTableCode + addIcon(sShortName, sSubDept, "1", sAreaName, sIsLast, sParentIsLast)
+ "<tr id=\"" + sAreaName + "\" style=\"display:none\" parentId=\"" + sParentAreaName
+ "\"><td>" + sSubTree + "</td></tr></table>";
/*
* debug sResult += sTableCode + addIcon(sShortName, sSubDept, "1", sAreaName, sIsLast, sParentIsLast) + "<tr id=\"" + sAreaName + "\" style=\"display:\"
* parentId=\"" + sParentAreaName + "\"><td>" + sSubTree + "</td></tr></table>";
*/
}
}
}
// 返回函数计算结果
return sResult;
} catch (Exception e) {
err.record(true, 0, e.toString());
e.printStackTrace();
return ""; // 如果出错,返回空值
}
}
// 查找子部门函数,根据传入的“部门名称”,查找其下级部门
public Vector findSubDept(String sParentName) {
ErrHandle err = null; // 错误处理
Vector asResult = new Vector(); // 函数返回值
Document docDept = null;
ViewEntryCollection vecDept = null;
ViewEntry veDept = null;
ViewEntry veTemp = null;
try {
err = new ErrHandle(session, 0, "", "agCreateDeptTree.findSubDept()");
// 以“部门名称”为关键字,在“部门管理视图”中查找所有下级部门文档
vecDept = vwDept.getAllEntriesByKey(sParentName, true);
veDept = vecDept.getFirstEntry();
while (veDept != null) {
docDept = veDept.getDocument();
Vector vDept = new Vector();
vDept.addElement(docDept.getUniversalID());
vDept.addElement(docDept.getItemValueString("DeptName"));
// 升级到LD7时出错,modify by yeshq,2007/10/19
// if (docDept.getItemValueString("ParentDept") == null) {
if (docDept.getItemValueString("ParentDept") == null
|| docDept.getItemValueString("ParentDept").equals("")) {
vDept.addElement(docDept.getItemValueString("DeptName"));
} else {
vDept.addElement(docDept.getItemValueString("DeptName") + "/"
+ docDept.getItemValueString("ParentDept"));
}
asResult.addElement(vDept);
docDept.recycle();
veTemp = veDept;
veDept = vecDept.getNextEntry(veDept);
veTemp.recycle();
}
return asResult;
} catch (NotesException e) {
err.record(true, e.id, e.text);
e.printStackTrace();
return asResult;
} catch (Exception e) {
e.printStackTrace();
return asResult;
} finally {
try {
// 最后释放dcDept,docDept对象所占用的资源
if (docDept != null)
docDept.recycle();
if (veTemp != null)
veTemp.recycle();
if (veDept != null)
veDept.recycle();
if (vecDept != null)
vecDept.recycle();
} catch (Exception e) {
e.printStackTrace();
}
}
}
// 为各部门添加图标。
// 各部门标签上还要添加调用“打开标签”“读取下级部门”等JS函数的代码
// 参数说明:
// sFullName|部门全称
// sHasChild|是否有下级部门。1|有,0|没有
// sAreaName|折叠式元素的名称
// sIsLast|当前部门是否同级部门中的最后一个
// sParentIsLast|上级部门是否同级部门中的最后一个
public String addIcon(String sShortName, String sFullName, String sHasChild, String sAreaName, String sIsLast,
String sParentIsLast) {
ErrHandle err = null;
try {
err = new ErrHandle(session, 0, "", "agCreateDeptTree.addIcon()");
// 计算出当前部门的“全称”,如果第一个字符为“/”,则去掉这个字符
if (sFullName.substring(0, 1) == "/") {
sFullName = sFullName.substring(1, sFullName.length());
}
// 为当前部门加上“根目录名称”,如“亿同科技”
String sTmpName = sFullName;
if (!sTmpName.equals("")) {
sTmpName = sTmpName + "/" + sRootName;
}
if (sShortName.equals("") | sShortName.equals("/")) {
// 此时,如果简称为空,表示为根目录,则显示为“根目录名称”
sShortName = sRootName;
}
// 计算出当前部门的级数,如“开发部/cois产品事业部” = “2”
int nLevel = 1;
int nPos = sFullName.indexOf("/");
while (nPos >= 0) {
nLevel += 1;
nPos = sFullName.indexOf("/", nPos + 1);
}
// 根据部门级数,计算出各部门名称前面的缩进量
// 根目录和一级部门无缩进
// 二级以下部门前面添加缩进。其中,父部门为“最后一个部门”的,缩进处不加“竖线”背景
String sIndent = null;
if (nLevel > 1) {
if (sParentIsLast.equals("0"))
sIndent = "<td width=20 rowspan=200 class=\"menubgline\"> </td>";
else
sIndent = "<td width=20 rowspan=200> </td>";
} else {
sIndent = "";
}
if (sFullName.equals(""))
sFullName = "/";
// 生成部门名称标签,点击时调用“fnRefreshList()”JS函数
String sCode = null;
sCode = "<span id=\"" + sAreaName + "_Link\" style=\"cursor:hand\" onclick=\"fnRefreshList(\'" + sAreaName
+ "_Link\',\'" + sFullName + "\');\">" + sShortName + "</span>";
// 定义使用的图标名称
String sImageName = null;
String sOpenImageName = null; // 打开后的图片
if (sIsLast.equals("1")) { // 同级最后一个
if (sHasChild.equals("1")) {
sImageName = "file_last_close_canopen.gif"; // 有下级
sOpenImageName = "file_last_open.gif";
} else {
sImageName = "file_last_close.gif"; // 无下级
sOpenImageName = "file_last_open.gif";
}
} else {
if (sAreaName.equals("TreeRoot")) {
sImageName = "file1_close.gif"; // 根目录
sOpenImageName = "";
} else {
if (sHasChild.equals("1")) { // 普通部门
sImageName = "file2_close_canopen.gif"; // 有下级
sOpenImageName = "file2_open.gif";
} else {
sImageName = "file2_close.gif"; // 无下级
sOpenImageName = "file2_open.gif";
}
}
}
sImageName = doc.getItemValueString("ImagePath") + sImageName;
sOpenImageName = doc.getItemValueString("ImagePath") + sOpenImageName;
// 输出结果,如果有下级部门,则点击图标时,调用“打开折叠区域”JS函数
// 增加sOpenImageName和sImageName参数,yeshq, 2007/10/22
if (sHasChild.equals("1")) {
/*
* return "<tr>" + sIndent + "<td height=18 valign=\"middle\"><img id=\"" + sAreaName + "_Image\" src=\"" + sImageName + "\" style=\"cursor:hand\" hspace=\"5\"
* align=\"absmiddle\" onclick=\"fnOpenDiv('" + sAreaName + "','" + sIsLast + "','" + sImageName + "');\">" + sCode + "</td></tr>";
*/
return "<tr>" + sIndent + "<td height=18 valign=\"middle\"><img id=\"" + sAreaName + "_Image\" src=\""
+ sImageName + "\" OpenImage=\"" + sOpenImageName + "\" CloseImage=\"" + sImageName
+ "\" style=\"cursor:hand\" hspace=\"5\" align=\"absmiddle\" onclick=\"fnOpenDiv('" + sAreaName
+ "');\">" + sCode + "</td></tr>";
} else {
/*
* return "<tr>" + sIndent + "<td height=18 valign=\"middle\"><img id=\"" + sAreaName + "_Image\" src=\"" + sImageName + "\" hspace=\"5\" align=\"absmiddle\">" +
* sCode + "</td></tr>";
*/
return "<tr>" + sIndent + "<td height=18 valign=\"middle\"><img id=\"" + sAreaName + "_Image\" src=\""
+ sImageName + "\" OpenImage=\"" + sOpenImageName + "\" CloseImage=\"" + sImageName
+ "\" hspace=\"5\" align=\"absmiddle\">" + sCode + "</td></tr>";
}
} catch (Exception e) {
err.record(true, 0, e.toString());
e.printStackTrace();
return "";
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -