summaryrefslogtreecommitdiff
path: root/dicore3/command/src/main/java/io/dico/dicore/command/chat/help/defaults/DefaultPageBuilder.java
blob: e06730fedc09b1d6b28c3e4d10a0f2959a0155b2 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
package io.dico.dicore.command.chat.help.defaults;

import io.dico.dicore.command.ExecutionContext;
import io.dico.dicore.command.ICommandAddress;
import io.dico.dicore.command.chat.help.*;
import org.bukkit.permissions.Permissible;

import java.util.Iterator;
import java.util.LinkedList;
import java.util.List;
import java.util.ListIterator;

public class DefaultPageBuilder implements IPageBuilder {

    @Override
    public String getPage(List<IHelpTopic> helpTopics, IPageLayout pageLayout, ICommandAddress target,
                          Permissible viewer, ExecutionContext context, int pageNum, int pageLen) {
        if (pageLen <= 0 || pageNum < 0) {
            throw new IllegalArgumentException();
        }

        List<IHelpComponent> components = new LinkedList<>();
        for (IHelpTopic topic : helpTopics) {
            components.addAll(topic.getComponents(target, viewer, context, true));
        }

        PageBorders pageBorders = null;
        int componentStartIdx = -1;
        int componentEndIdx = -1;
        int totalPageCount = 0;
        int curPageLines = 0;

        ListIterator<IHelpComponent> iterator = components.listIterator();

        while (iterator.hasNext()) {
            if (curPageLines == 0) {

                if (pageBorders != null) {
                    iterator.add(pageBorders.getFooter());
                }

                if (pageNum == totalPageCount) {
                    componentStartIdx = iterator.nextIndex();
                } else if (pageNum + 1 == totalPageCount) {
                    componentEndIdx = iterator.nextIndex();
                }

                pageBorders = pageLayout.getPageBorders(target, viewer, context, totalPageCount + 1);

                if (pageBorders != null) {
                    iterator.add(pageBorders.getHeader());
                    iterator.previous();

                    curPageLines += pageBorders.getFooter().lineCount();
                }

                totalPageCount++;
            }

            IHelpComponent component = iterator.next();
            int lineCount = component.lineCount();
            curPageLines += lineCount;

            if (curPageLines >= pageLen) {
                curPageLines = 0;
            }
        }

        if (componentStartIdx == -1) {
            // page does not exist
            return "";
        }

        if (componentEndIdx == -1) {
            componentEndIdx = components.size();
        }

        StringBuilder sb = new StringBuilder();
        iterator = components.listIterator(componentStartIdx);
        int count = componentEndIdx - componentStartIdx;
        boolean first = true;

        while (count-- > 0) {
            IHelpComponent component = iterator.next();
            if (component instanceof IPageBorder) {
                ((IPageBorder) component).setPageCount(totalPageCount);
            }
            if (first) {
                first = false;
            } else {
                sb.append('\n');
            }
            component.appendTo(sb);

        }

        return sb.toString();
    }

    public static String combine(List<IHelpComponent> components) {
        StringBuilder rv = new StringBuilder();

        Iterator<IHelpComponent> iterator = components.iterator();
        if (iterator.hasNext()) {
            iterator.next().appendTo(rv);
        }
        while (iterator.hasNext()) {
            rv.append('\n');
            iterator.next().appendTo(rv);
        }

        return rv.toString();
    }

}