private int CalcMid(List <GUTag> allChild, ITagDB db) { int rootChildrenCount = allChild.Count; int total = 0; //计算所有节点数量 foreach (GUTag c in allChild) { total += Math.Max(1, db.QueryChildrenCount(c));//没有子节点的算作1 } //找到子节点中间分割线 int tmpTotal = 0; double best = 1; int bestMid = 0; for (int i = 0; i < rootChildrenCount; i++) { tmpTotal += Math.Max(1, db.QueryChildrenCount(allChild[i])); double radio = ((double)tmpTotal) / total; if (Math.Abs(radio - 0.5) < best)//离一半最近 { best = Math.Abs(radio - 0.5); bestMid = i + 1; } } return(Math.Max(1, bestMid)); }
private static int GetTagTreeWidth(GUTag tag, ITagDB db, int level, int maxlevel) { int ret = -1; List <GUTag> children = db.QueryTagChildren(tag); if (level > maxlevel) { ret = 1; } else if (level == maxlevel) { ret = children.Count + 1; //所有子节点+自己 } //只有两种情况下不需要换行: //1. 父节点 -- 子, 孙,重孙 //2. 父节点 -- 子,子,子,子 else if (children.Count <= 1) //情况1: { //只有一列子孙节点,所有都是独生子 ret = 1; GUTag tmp = tag; for (int i = level; i < maxlevel; i++) { children = db.QueryTagChildren(tmp); if (children.Count > 1) { ret = -1; break; } else if (children.Count == 0) { ret++; break; } else if (children.Count == 1) { tmp = children[0]; ret++; } } return(ret); } else { //情况2:只有一层子节点,所有子节点都是叶子(显示为子,子,子,子) ret = children.Count; foreach (GUTag ctag in children) { if (db.QueryChildrenCount(ctag) > 0) //有子节点非叶子,并且自己子节点数量>1,表示不能在一行内显示 { ret = -1; } } } Logger.D("GetTagTreeWidth : {0} {1}", tag.ToString(), ret); return(ret); }