CostingTreeNodeUtils.java

package com.tradecloud.domain.costing.utils;

import com.tradecloud.domain.costing.CostGroup;
import com.tradecloud.domain.costing.clean.Costed;
import com.tradecloud.domain.costing.clean.CostedLineItem;
import com.tradecloud.domain.costing.clean.CostedOrder;
import com.tradecloud.domain.document.invoice.ActualConsignment;
import com.tradecloud.domain.document.invoice.ActualLineItem;
import com.tradecloud.domain.document.invoice.ActualOrder;
import org.apache.log4j.Logger;
import org.springframework.stereotype.Component;

@Component("costingTreeNodeUtils")
public class CostingTreeNodeUtils {

    public static Logger log = Logger.getLogger(CostingTreeNodeUtils.class);

    public static final int BASE_PADDING = 9;

    public static String findFinalTableHeight(Costed rootParent, String costGroup, boolean isTotalsDistribution) {

        String finalTableHeight;

        int uiTreeHeight = CostingTreeNodeUtils.findUITreeHeight(rootParent, isTotalsDistribution, costGroup);

        int maximumHeight = 450;
        if (uiTreeHeight > maximumHeight) {
            finalTableHeight = (String.valueOf(maximumHeight));
        } else {
            finalTableHeight = "no scroll height";
        }

        return finalTableHeight;
    }

    public static int findUITreeHeight(Costed rootParent, boolean isTotalsDistribution, String costGroup) {
        int totalHeight = findHeightOfAllChildren(rootParent, isTotalsDistribution, costGroup);

        return totalHeight;
    }

    private static boolean isRoot(Costed costed) {
        return costed.getParent() == null;
    }

    private static int findHeightOfAllChildren(Costed parent, boolean isTotalsDistribution, String costGroup) {
        return findHeightOfAllChildren(parent, isTotalsDistribution, 0, costGroup);
    }

    private static int findHeightOfAllChildren(Costed<? extends Costed, ? extends Costed> parent,
                                               boolean isTotalsDistribution, int totalHeight,
                                               String costGroup) {

        for (Costed costed : parent.getCostedChildren()) {
            totalHeight += findHeightOfAllChildren(costed, isTotalsDistribution, 0, costGroup);
        }

        if (isTotalsDistribution)
            totalHeight += findRowHeightTotalsDistribution(parent) + BASE_PADDING;
        else
            totalHeight += findRowHeight(parent, costGroup) + BASE_PADDING;

        return totalHeight;
    }

    public static int findRowHeight(Costed costed, String costGroup) {
        boolean isRoot = isRoot(costed);

        if (isRoot) {
            return 80;
        } else if (costed instanceof ActualConsignment) {
            return 36;
        } else if (costed instanceof ActualOrder || costed instanceof CostedOrder) {
            return 70;
        } else if (costed instanceof ActualLineItem || costed instanceof CostedLineItem) {
            if (costGroup.equals(CostGroup.CUSTOMS.value())) {
                return 60;
            }
            return 44;
        }

        return 80;
    }

    public static int findRowHeightTotalsDistribution(Costed costed) {
        return 31;
    }
}