Exemplo n.º 1
0
        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));
        }
Exemplo n.º 2
0
        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);
        }