Commit | Line | Data |
---|---|---|
16a81ef7 | 1 | package be.nikiroo.fanfix.reader.tui; |
c1873e56 | 2 | |
edfd3577 NR |
3 | import java.util.ArrayList; |
4 | import java.util.List; | |
5 | ||
0861d62a NR |
6 | import jexer.TAction; |
7 | import jexer.TApplication; | |
8 | import jexer.TButton; | |
9 | import jexer.TCommand; | |
10 | import jexer.TKeypress; | |
11 | import jexer.TLabel; | |
f63c4267 | 12 | import jexer.TText; |
0861d62a | 13 | import jexer.TWindow; |
c1873e56 | 14 | import jexer.event.TResizeEvent; |
4f66bfa8 | 15 | import jexer.event.TResizeEvent.Type; |
c1873e56 NR |
16 | import be.nikiroo.fanfix.data.Chapter; |
17 | import be.nikiroo.fanfix.data.MetaData; | |
18 | import be.nikiroo.fanfix.data.Paragraph; | |
9293188f | 19 | import be.nikiroo.fanfix.data.Paragraph.ParagraphType; |
c1873e56 | 20 | import be.nikiroo.fanfix.data.Story; |
e42573a0 | 21 | import be.nikiroo.fanfix.library.BasicLibrary; |
c1873e56 | 22 | |
5dd985cf | 23 | class TuiReaderStoryWindow extends TWindow { |
68e2c6d2 | 24 | private BasicLibrary lib; |
c1873e56 NR |
25 | private MetaData meta; |
26 | private Story story; | |
f63c4267 | 27 | private TText textField; |
bc2ea776 | 28 | private int chapter = -1; |
edfd3577 NR |
29 | private List<TButton> navigationButtons; |
30 | private TLabel chapterName; | |
c1873e56 | 31 | |
6322ab64 | 32 | // chapter: -1 for "none" (0 is desc) |
68e2c6d2 NR |
33 | public TuiReaderStoryWindow(TApplication app, BasicLibrary lib, |
34 | MetaData meta, int chapter) { | |
c1873e56 | 35 | super(app, desc(meta), 0, 0, 60, 18, CENTERED | RESIZABLE); |
68e2c6d2 | 36 | |
b0e88ebd | 37 | this.lib = lib; |
c1873e56 NR |
38 | this.meta = meta; |
39 | ||
edfd3577 | 40 | // TODO: show all meta info before? |
c1873e56 | 41 | |
f63c4267 | 42 | textField = new TText(this, "", 0, 0, getWidth() - 2, getHeight() - 2); |
edfd3577 | 43 | |
396e924c NR |
44 | statusBar = newStatusBar(desc(meta)); |
45 | statusBar.addShortcutKeypress(TKeypress.kbF10, TCommand.cmExit, "Exit"); | |
edfd3577 | 46 | |
0b7e3d78 | 47 | navigationButtons = new ArrayList<TButton>(5); |
edfd3577 | 48 | |
396e924c | 49 | // -3 because 0-based and 2 for borders |
edfd3577 NR |
50 | int row = getHeight() - 3; |
51 | ||
b0e88ebd NR |
52 | navigationButtons.add(addButton(" ", 0, row, null)); // for bg colour |
53 | // when << | |
54 | // button is | |
55 | // pressed | |
0861d62a | 56 | navigationButtons.add(addButton("<< ", 0, row, new TAction() { |
211f7ddb | 57 | @Override |
396e924c | 58 | public void DO() { |
edfd3577 | 59 | setChapter(0); |
396e924c | 60 | } |
edfd3577 | 61 | })); |
0861d62a | 62 | navigationButtons.add(addButton("< ", 4, row, new TAction() { |
211f7ddb | 63 | @Override |
edfd3577 NR |
64 | public void DO() { |
65 | setChapter(TuiReaderStoryWindow.this.chapter - 1); | |
66 | } | |
67 | })); | |
0861d62a | 68 | navigationButtons.add(addButton("> ", 7, row, new TAction() { |
211f7ddb | 69 | @Override |
edfd3577 NR |
70 | public void DO() { |
71 | setChapter(TuiReaderStoryWindow.this.chapter + 1); | |
72 | } | |
73 | })); | |
0861d62a | 74 | navigationButtons.add(addButton(">> ", 10, row, new TAction() { |
211f7ddb | 75 | @Override |
edfd3577 NR |
76 | public void DO() { |
77 | setChapter(getStory().getChapters().size()); | |
78 | } | |
79 | })); | |
b0e88ebd | 80 | |
8670a283 NR |
81 | navigationButtons.get(0).setEnabled(false); |
82 | navigationButtons.get(1).setEnabled(false); | |
83 | navigationButtons.get(2).setEnabled(false); | |
edfd3577 | 84 | |
0861d62a | 85 | chapterName = addLabel("", 14, row); |
edfd3577 NR |
86 | chapterName.setWidth(getWidth() - 10); |
87 | setChapter(chapter); | |
c1873e56 NR |
88 | } |
89 | ||
90 | @Override | |
91 | public void onResize(TResizeEvent resize) { | |
92 | super.onResize(resize); | |
93 | ||
4f66bfa8 NR |
94 | // Resize the text field TODO: why setW/setH/reflow not enough for the |
95 | // scrollbars? | |
96 | textField.onResize(new TResizeEvent(Type.WIDGET, resize.getWidth() - 2, | |
97 | resize.getHeight() - 2)); | |
edfd3577 NR |
98 | |
99 | // -3 because 0-based and 2 for borders | |
100 | int row = getHeight() - 3; | |
101 | ||
102 | String name = chapterName.getLabel(); | |
103 | while (name.length() < resize.getWidth() - chapterName.getX()) { | |
104 | name += " "; | |
105 | } | |
106 | chapterName.setLabel(name); | |
107 | chapterName.setWidth(resize.getWidth() - 10); | |
108 | chapterName.setY(row); | |
109 | ||
110 | for (TButton button : navigationButtons) { | |
111 | button.setY(row); | |
112 | } | |
113 | } | |
114 | ||
115 | private void setChapter(int chapter) { | |
116 | if (chapter < 0) { | |
117 | chapter = 0; | |
118 | } | |
119 | ||
120 | if (chapter > getStory().getChapters().size()) { | |
121 | chapter = getStory().getChapters().size(); | |
122 | } | |
123 | ||
124 | if (chapter != this.chapter) { | |
125 | this.chapter = chapter; | |
b0e88ebd | 126 | |
8670a283 NR |
127 | int max = getStory().getChapters().size(); |
128 | navigationButtons.get(0).setEnabled(chapter > 0); | |
129 | navigationButtons.get(1).setEnabled(chapter > 0); | |
130 | navigationButtons.get(2).setEnabled(chapter > 0); | |
131 | navigationButtons.get(3).setEnabled(chapter < max); | |
132 | navigationButtons.get(4).setEnabled(chapter < max); | |
b0e88ebd | 133 | |
edfd3577 NR |
134 | Chapter chap; |
135 | String name; | |
136 | if (chapter == 0) { | |
137 | chap = getStory().getMeta().getResume(); | |
fdc55375 NR |
138 | if (chap != null) |
139 | name = String.format(" %s", chap.getName()); | |
140 | else | |
141 | name = "[No RESUME]"; | |
edfd3577 NR |
142 | } else { |
143 | chap = getStory().getChapters().get(chapter - 1); | |
b0e88ebd NR |
144 | name = String |
145 | .format(" %d/%d: %s", chapter, max, chap.getName()); | |
edfd3577 NR |
146 | } |
147 | ||
148 | while (name.length() < getWidth() - chapterName.getX()) { | |
149 | name += " "; | |
150 | } | |
151 | ||
152 | chapterName.setLabel(name); | |
153 | ||
154 | StringBuilder builder = new StringBuilder(); | |
155 | // TODO: i18n | |
fdc55375 NR |
156 | String c = String.format("Chapter %d: %s", chapter, |
157 | chap == null ? "[No RESUME]" : chap.getName()); | |
edfd3577 NR |
158 | builder.append(c).append("\n"); |
159 | for (int i = 0; i < c.length(); i++) { | |
160 | builder.append("═"); | |
161 | } | |
162 | builder.append("\n\n"); | |
fdc55375 NR |
163 | if (chap != null) { |
164 | for (Paragraph para : chap) { | |
9293188f NR |
165 | if (para.getType() == ParagraphType.BREAK) { |
166 | builder.append("\n"); | |
167 | } | |
168 | builder.append(para.getContent()).append("\n"); | |
169 | if (para.getType() == ParagraphType.BREAK) { | |
170 | builder.append("\n"); | |
171 | } | |
fdc55375 | 172 | } |
edfd3577 NR |
173 | } |
174 | textField.setText(builder.toString()); | |
4f66bfa8 | 175 | textField.reflowData(); |
f63c4267 | 176 | textField.toTop(); |
edfd3577 | 177 | } |
c1873e56 NR |
178 | } |
179 | ||
180 | private Story getStory() { | |
181 | if (story == null) { | |
edfd3577 | 182 | // TODO: progress bar? |
b0e88ebd | 183 | story = lib.getStory(meta.getLuid(), null); |
c1873e56 NR |
184 | } |
185 | return story; | |
186 | } | |
187 | ||
188 | private static String desc(MetaData meta) { | |
189 | return String.format("%s: %s", meta.getLuid(), meta.getTitle()); | |
190 | } | |
191 | } |