1 package be
.nikiroo
.jvcard
.tui
.panes
;
3 import java
.util
.LinkedList
;
6 import be
.nikiroo
.jvcard
.launcher
.Main
;
7 import be
.nikiroo
.jvcard
.resources
.ColorOption
;
8 import be
.nikiroo
.jvcard
.resources
.StringId
;
9 import be
.nikiroo
.jvcard
.tui
.UiColors
;
10 import be
.nikiroo
.utils
.StringUtils
;
12 import com
.googlecode
.lanterna
.TextColor
;
13 import com
.googlecode
.lanterna
.gui2
.AbstractListBox
.ListItemRenderer
;
14 import com
.googlecode
.lanterna
.gui2
.ActionListBox
;
15 import com
.googlecode
.lanterna
.gui2
.Direction
;
16 import com
.googlecode
.lanterna
.gui2
.LinearLayout
;
17 import com
.googlecode
.lanterna
.gui2
.TextGUIGraphics
;
19 abstract public class MainContentList
extends MainContent
implements Runnable
{
20 private ActionListBox lines
;
23 * This class represent a part of a text line to draw in this
24 * {@link MainContentList}.
29 public class TextPart
{
31 private ColorOption element
;
33 public TextPart(String text
, ColorOption element
) {
35 this.element
= element
;
38 public String
getText() {
42 public ColorOption
getElement() {
46 public TextColor
getForegroundColor() {
48 return UiColors
.getForegroundColor(element
);
49 return UiColors
.getForegroundColor(ColorOption
.DEFAULT
);
52 public TextColor
getBackgroundColor() {
54 return UiColors
.getBackgroundColor(element
);
55 return UiColors
.getBackgroundColor(ColorOption
.DEFAULT
);
59 public MainContentList() {
60 super(Direction
.VERTICAL
);
62 lines
= new ActionListBox();
64 lines
.setListItemRenderer(new ListItemRenderer
<Runnable
, ActionListBox
>() {
66 * This is the main drawing method for a single list box item, it
67 * applies the current theme to setup the colors and then calls
68 * {@code getLabel(..)} and draws the result using the supplied
69 * {@code TextGUIGraphics}. The graphics object is created just for
70 * this item and is restricted so that it can only draw on the area
71 * this item is occupying. The top-left corner (0x0) should be the
72 * starting point when drawing the item.
75 * Graphics object to draw with
77 * List box we are drawing an item from
79 * Index of the item we are drawing
81 * The item we are drawing
83 * Will be set to {@code true} if the item is currently
84 * selected, otherwise {@code false}, but please notice
85 * what context 'selected' refers to here (see
86 * {@code setSelectedIndex})
88 * Will be set to {@code true} if the list box currently
89 * has input focus, otherwise {@code false}
92 public void drawItem(TextGUIGraphics graphics
,
93 ActionListBox listBox
, int index
, Runnable item
,
94 boolean selected
, boolean focused
) {
96 // width "-1" to reserve space for the optional vertical
98 List
<TextPart
> parts
= MainContentList
.this.getLabel(index
,
99 lines
.getSize().getColumns() - 1, selected
, focused
);
102 for (TextPart part
: parts
) {
103 graphics
.setForegroundColor(part
.getForegroundColor());
104 graphics
.setBackgroundColor(part
.getBackgroundColor());
106 String label
= StringUtils
.sanitize(part
.getText(),
109 graphics
.putString(position
, 0, label
);
110 position
+= label
.length();
116 LinearLayout
.createLayoutData(LinearLayout
.Alignment
.Fill
));
120 * Add an item to this {@link MainContentList}.
125 public void addItem(String line
) {
126 lines
.addItem(line
, this);
130 * Delete the given item.
132 * Remark: it will only delete the first found instance if multiple
133 * instances of this item are present.
138 * @return TRUE if the item was deleted
140 public boolean removeItem(String line
) {
141 boolean deleted
= false;
143 List
<Runnable
> copy
= lines
.getItems();
144 for (int index
= 0; index
< copy
.size(); index
++) {
145 if (copy
.get(index
).toString().equals(line
)) {
152 int index
= getSelectedIndex();
154 for (Runnable run
: copy
) {
155 addItem(run
.toString());
157 setSelectedIndex(index
);
163 * Clear all the items in this {@link MainContentList}
165 public void clearItems() {
170 * Get the index of the currently selected line.
174 public int getSelectedIndex() {
175 return lines
.getSelectedIndex();
179 * Change the index of the currently selected line.
184 public void setSelectedIndex(int index
) {
185 lines
.setSelectedIndex(index
);
189 * Return the default content separator for text fields.
191 * @return the separator
193 public String
getSeparator() {
194 return Main
.trans(StringId
.DEAULT_FIELD_SEPARATOR
);
204 public String
move(int x
, int y
) {
205 setSelectedIndex(getSelectedIndex() + x
);
211 public int getCount() {
212 return lines
.getItemCount();
216 * Return the representation of the selected line, in {@link TextPart}s.
221 * the max width of the line
223 * TRUE if the item is selected
225 * TRUE if the item is focused
227 * @return the text representation
229 protected List
<TextPart
> getLabel(int index
,
230 @SuppressWarnings("unused") int width
, boolean selected
,
232 List
<TextPart
> parts
= new LinkedList
<TextPart
>();
234 if (selected
&& focused
) {
235 parts
.add(new TextPart("" + lines
.getItems().get(index
),
236 ColorOption
.CONTACT_LINE_SELECTED
));
238 parts
.add(new TextPart("" + lines
.getItems().get(index
),
239 ColorOption
.CONTACT_LINE
));