1 package be
.nikiroo
.jvcard
.tui
.panes
;
3 import java
.io
.IOException
;
4 import java
.util
.LinkedList
;
7 import be
.nikiroo
.jvcard
.Card
;
8 import be
.nikiroo
.jvcard
.Contact
;
9 import be
.nikiroo
.jvcard
.i18n
.Trans
;
10 import be
.nikiroo
.jvcard
.tui
.KeyAction
;
11 import be
.nikiroo
.jvcard
.tui
.UiColors
;
12 import be
.nikiroo
.jvcard
.tui
.KeyAction
.DataType
;
13 import be
.nikiroo
.jvcard
.tui
.KeyAction
.Mode
;
14 import be
.nikiroo
.jvcard
.tui
.UiColors
.Element
;
16 import com
.googlecode
.lanterna
.input
.KeyType
;
18 public class ContactList
extends MainContentList
{
20 private List
<Contact
> contacts
;
21 private String filter
;
23 private List
<String
> formats
= new LinkedList
<String
>();
24 private int selectedFormat
= -1;
25 private String format
= "";
27 public ContactList(Card card
) {
28 super(UiColors
.Element
.CONTACT_LINE
,
29 UiColors
.Element
.CONTACT_LINE_SELECTED
);
31 // TODO: should get that in an INI file
32 formats
.add("NICKNAME@3|FN@+|EMAIL@30");
33 formats
.add("FN@+|EMAIL@40");
40 * Change the currently displayed contacts card, only allowing those that
41 * satisfy the current filter.
44 * the new {@link Card}
46 * the text filter or NULL for all contacts
48 public void setCard(Card card
) {
51 this.contacts
= new LinkedList
<Contact
>();
54 for (int i
= 0; i
< card
.size(); i
++) {
55 Contact c
= card
.get(i
);
57 || c
.toString(format
).toLowerCase()
58 .contains(filter
.toLowerCase())) {
59 addItem("[contact line]");
69 public void refreshData() {
70 int index
= getSelectedIndex();
72 if (index
>= contacts
.size())
73 index
= contacts
.size() - 1;
74 setSelectedIndex(index
);
80 public String
getExitWarning() {
81 if (card
!= null && card
.isDirty()) {
82 return "Ignore unsaved changes? [Y/N]";
89 public List
<KeyAction
> getKeyBindings() {
90 List
<KeyAction
> actions
= new LinkedList
<KeyAction
>();
93 actions
.add(new KeyAction(Mode
.CONTACT_DETAILS_RAW
, 'e',
94 Trans
.StringId
.KEY_ACTION_EDIT_CONTACT
) {
96 public Object
getObject() {
97 return getSelectedContact();
100 actions
.add(new KeyAction(Mode
.ASK_USER_KEY
, 'd',
101 Trans
.StringId
.KEY_ACTION_DELETE_CONTACT
) {
103 public Object
getObject() {
104 return getSelectedContact();
108 public String
getQuestion() {
110 return "Delete contact? [Y/N]";
114 public String
callback(String answer
) {
115 if (answer
.equalsIgnoreCase("y")) {
116 Contact contact
= getSelectedContact();
117 if (contact
!= null && contact
.delete()) {
122 return "Cannot delete contact";
128 actions
.add(new KeyAction(Mode
.ASK_USER_KEY
, 's',
129 Trans
.StringId
.KEY_ACTION_SAVE_CARD
) {
131 public Object
getObject() {
136 public String
getQuestion() {
137 return "Save changes? [Y/N]";
141 public String
callback(String answer
) {
142 if (answer
.equalsIgnoreCase("y")) {
145 if (card
!= null && card
.save())
147 } catch (IOException ioe
) {
148 ioe
.printStackTrace();
152 return "Cannot save to file";
160 actions
.add(new KeyAction(Mode
.CONTACT_DETAILS
, KeyType
.Enter
,
161 Trans
.StringId
.KEY_ACTION_VIEW_CONTACT
) {
163 public Object
getObject() {
164 return getSelectedContact();
167 actions
.add(new KeyAction(Mode
.NONE
, KeyType
.Tab
,
168 Trans
.StringId
.KEY_ACTION_SWITCH_FORMAT
) {
170 public boolean onAction() {
175 actions
.add(new KeyAction(Mode
.ASK_USER
, 'w',
176 Trans
.StringId
.KEY_ACTION_SEARCH
) {
179 public String
getQuestion() {
184 public String
getDefaultAnswer() {
189 public String
callback(String answer
) {
200 public DataType
getDataType() {
201 return DataType
.CARD
;
205 public String
getTitle() {
208 return card
.getName() + " [" + filter
+ "]";
209 return card
.getName();
216 protected List
<TextPart
> getLabel(int index
, int width
, boolean selected
,
218 List
<TextPart
> parts
= new LinkedList
<TextPart
>();
220 Contact contact
= null;
221 if (index
> -1 && index
< contacts
.size())
222 contact
= contacts
.get(index
);
227 Element el
= (focused
&& selected
) ? Element
.CONTACT_LINE_SELECTED
228 : Element
.CONTACT_LINE
;
229 Element elSep
= (focused
&& selected
) ? Element
.CONTACT_LINE_SEPARATOR_SELECTED
230 : Element
.CONTACT_LINE_SEPARATOR
;
231 Element elDirty
= (focused
&& selected
) ? Element
.CONTACT_LINE_DIRTY_SELECTED
232 : Element
.CONTACT_LINE_DIRTY
;
234 width
-= 2; // dirty mark space
236 String
[] array
= contact
.toStringArray(format
, getSeparator(), " ",
237 width
, UiColors
.getInstance().isUnicode());
239 if (contact
.isDirty()) {
240 parts
.add(new TextPart(" ", el
));
241 parts
.add(new TextPart("*", elDirty
));
243 parts
.add(new TextPart(" ", elSep
));
246 boolean separator
= false;
247 for (String str
: array
) {
248 parts
.add(new TextPart(str
, (separator ? elSep
: el
)));
249 separator
= !separator
;
256 * Return the currently selected {@link Contact}.
258 * @return the currently selected {@link Contact}
260 private Contact
getSelectedContact() {
261 int index
= getSelectedIndex();
262 if (index
> -1 && index
< contacts
.size())
263 return contacts
.get(index
);
267 private void switchFormat() {
268 if (formats
.size() == 0)
272 if (selectedFormat
>= formats
.size()) {
276 format
= formats
.get(selectedFormat
);