1 package be
.nikiroo
.jvcard
.tui
.panes
;
3 import java
.util
.LinkedList
;
6 import be
.nikiroo
.jvcard
.Contact
;
7 import be
.nikiroo
.jvcard
.Data
;
8 import be
.nikiroo
.jvcard
.TypeInfo
;
9 import be
.nikiroo
.jvcard
.launcher
.Main
;
10 import be
.nikiroo
.jvcard
.resources
.StringUtils
;
11 import be
.nikiroo
.jvcard
.resources
.enums
.ColorOption
;
12 import be
.nikiroo
.jvcard
.resources
.enums
.StringId
;
13 import be
.nikiroo
.jvcard
.tui
.KeyAction
;
14 import be
.nikiroo
.jvcard
.tui
.KeyAction
.DataType
;
15 import be
.nikiroo
.jvcard
.tui
.KeyAction
.Mode
;
17 import com
.googlecode
.lanterna
.input
.KeyType
;
19 public class ContactDetailsRaw
extends MainContentList
{
20 private Contact contact
;
21 private boolean extMode
;
23 public ContactDetailsRaw(Contact contact
) {
24 this.contact
= contact
;
27 for (int i
= 0; i
< contact
.size(); i
++) {
33 public DataType
getDataType() {
38 public List
<KeyAction
> getKeyBindings() {
39 List
<KeyAction
> actions
= new LinkedList
<KeyAction
>();
41 actions
.add(new KeyAction(Mode
.ASK_USER
, KeyType
.Enter
,
42 StringId
.KEY_ACTION_EDIT_FIELD
) {
44 public Object
getObject() {
45 return getSelectedData();
49 public String
getQuestion() {
50 Data data
= getData();
52 return data
.getName();
59 public String
getDefaultAnswer() {
60 Data data
= getData();
62 return data
.getRawValue().replaceAll("\n", "\\\\n");
69 public String
callback(String answer
) {
70 Data data
= getData();
72 data
.setRawValue(answer
.replaceAll("\\\\n", "\n"));
77 return "Cannot modify value";
80 actions
.add(new KeyAction(Mode
.ASK_USER_KEY
, 'd',
81 StringId
.KEY_ACTION_DELETE
) {
83 public Object
getObject() {
84 return getSelectedData();
88 public String
getQuestion() {
90 return "Delete data? [Y/N]";
94 public String
callback(String answer
) {
95 if (answer
.equalsIgnoreCase("y")) {
96 Data data
= getData();
97 if (data
!= null && data
.delete()) {
103 return "Cannot delete data";
110 actions
.add(new KeyAction(Mode
.ASK_USER
, 'a', StringId
.KEY_ACTION_ADD
) {
112 public Object
getObject() {
117 public String
getQuestion() {
119 return "new data (xx.group = yy): ";
123 public String
callback(String answer
) {
124 int indexEq
= answer
.indexOf('=');
126 String name
= answer
.substring(0, indexEq
).trim();
127 String value
= answer
.substring(indexEq
+ 1).trim();
130 int indexDt
= name
.indexOf('.');
132 group
= name
.substring(indexDt
+ 1).trim();
133 name
= name
.substring(0, indexDt
).trim();
136 Data data
= new Data(null, name
, value
, group
);
137 getContact().add(data
);
143 // TODO: use a real UI for this, not a simple text box (a list or
144 // something, maybe a whole new pane?)
145 actions
.add(new KeyAction(Mode
.ASK_USER
, 't', StringId
.DUMMY
) {
146 private String previous
;
149 public Object
getObject() {
150 return getSelectedData();
154 public String
getQuestion() {
155 Data data
= getData();
157 return data
.getName();
164 public String
getDefaultAnswer() {
165 Data data
= getData();
167 previous
= typesToString(data
, null).toString();
175 public String
callback(String answer
) {
176 Data data
= getData();
178 if (!answer
.equals(previous
)) {
179 data
.replaceListContent(stringToTypes(answer
));
185 return "Cannot modify value";
188 actions
.add(new KeyAction(Mode
.ASK_USER
, 'g', StringId
.DUMMY
) {
189 private String previous
;
192 public Object
getObject() {
193 return getSelectedData();
197 public String
getQuestion() {
198 Data data
= getData();
200 return data
.getName();
207 public String
getDefaultAnswer() {
208 Data data
= getData();
210 previous
= data
.getGroup();
218 public String
callback(String answer
) {
219 Data data
= getData();
221 if (!answer
.equals(previous
)) {
222 data
.setGroup(answer
);
228 return "Cannot modify group";
231 actions
.add(new KeyAction(Mode
.NONE
, KeyType
.Tab
,
232 StringId
.KEY_ACTION_SWITCH_FORMAT
) {
234 public boolean onAction() {
244 public String
getTitle() {
247 if (contact
!= null) {
248 title
= contact
.getPreferredDataValue("FN");
249 if (title
== null || title
.length() == 0)
250 title
= contact
.getPreferredDataValue("N");
257 public String
move(int x
, int y
) {
258 // TODO Auto-generated method stub
263 protected List
<TextPart
> getLabel(int index
, int width
, boolean selected
,
265 // TODO: from ini file?
267 int SIZE_COL_2_OPT
= 10;
272 List
<TextPart
> parts
= new LinkedList
<TextPart
>();
274 if (index
> -1 && index
< contact
.size())
275 data
= contact
.get(index
);
280 ColorOption el
= (focused
&& selected
) ? ColorOption
.CONTACT_LINE_SELECTED
281 : ColorOption
.CONTACT_LINE
;
282 ColorOption elSep
= (focused
&& selected
) ? ColorOption
.CONTACT_LINE_SEPARATOR_SELECTED
283 : ColorOption
.CONTACT_LINE_SEPARATOR
;
284 ColorOption elDirty
= (focused
&& selected
) ? ColorOption
.CONTACT_LINE_DIRTY_SELECTED
285 : ColorOption
.CONTACT_LINE_DIRTY
;
287 if (data
.isDirty()) {
288 parts
.add(new TextPart(" ", el
));
289 parts
.add(new TextPart("*", elDirty
));
291 parts
.add(new TextPart(" ", elSep
));
293 String name
= " " + data
.getName() + " ";
297 StringBuilder valueBuilder
= new StringBuilder(" ");
299 valueBuilder
.append(data
.getValue().replaceAll("\n", "\\\\n"));
300 if (data
.getGroup() != null && data
.getGroup().length() > 0) {
301 valueBuilder
.append("(");
302 valueBuilder
.append(data
.getGroup());
303 valueBuilder
.append(")");
306 group
= data
.getGroup();
310 typesToString(data
, valueBuilder
);
312 valueBuilder
.append(" ");
314 value
= valueBuilder
.toString();
316 name
= StringUtils
.sanitize(name
, Main
.isUnicode());
317 value
= StringUtils
.sanitize(value
, Main
.isUnicode());
319 name
= StringUtils
.padString(name
, SIZE_COL_1
);
320 group
= StringUtils
.padString(group
, SIZE_COL_2_OPT
);
321 value
= StringUtils
.padString(value
, width
- SIZE_COL_1
322 - SIZE_COL_2_OPT
- (extMode ?
2 : 1) * getSeparator().length()
325 parts
.add(new TextPart(name
, el
));
326 parts
.add(new TextPart(getSeparator(), elSep
));
327 parts
.add(new TextPart(value
, el
));
329 parts
.add(new TextPart(getSeparator(), elSep
));
330 parts
.add(new TextPart(group
, el
));
337 * Return the currently selected {@link Data}.
339 * @return the currently selected {@link Data}
341 private Data
getSelectedData() {
342 int index
= getSelectedIndex();
343 if (index
> -1 && index
< this.contact
.size())
344 return contact
.get(index
);
349 * Serialise the {@link TypeInfo}s in the given {@link Data}.
352 * the {@link Data} from which to take the {@link TypeInfo}s
354 * an optional {@link StringBuilder} to append the serialized
357 * @return the given {@link StringBuilder} or a new one if the given one is
360 static private StringBuilder
typesToString(Data data
, StringBuilder builder
) {
362 builder
= new StringBuilder();
364 for (TypeInfo type
: data
) {
365 if (builder
.length() > 1)
366 builder
.append(", ");
367 builder
.append(type
.getName().replaceAll(",", "\\,"));
368 builder
.append(": ");
369 builder
.append(type
.getValue().replaceAll(":", "\\:"));
376 * Unserialise a list of {@link TypeInfo}s.
379 * the serialised value
381 * @return the {@link TypeInfo} in their object form
383 static private List
<TypeInfo
> stringToTypes(String value
) {
384 List
<TypeInfo
> infos
= new LinkedList
<TypeInfo
>();
385 if (value
== null || value
.length() == 0)
388 char previous
= '\0';
391 for (int index
= 0; index
< value
.length(); index
++) {
392 car
= value
.charAt(index
);
393 if (index
== value
.length() - 1) {
399 if (previous
!= '\\' && car
== ',') {
400 String
[] tab
= value
.substring(done
, index
).split("\\:");
401 infos
.add(new TypeInfo( //
402 tab
[0].replaceAll("\\,", ",").replaceAll("\\:", ":")
404 tab
[1].replaceAll("\\,", ",").replaceAll("\\:", ":")