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 Data data
= getSelectedData();
46 if (data
!= null && data
.getB64Key() != -1) {
47 setMessage("Cannot modify binary values in RAW mode", true);
55 public String
getQuestion() {
56 Data data
= getData();
58 return data
.getName();
65 public String
getDefaultAnswer() {
66 Data data
= getData();
68 return data
.getRawValue().replaceAll("\n", "\\\\n");
75 public String
callback(String answer
) {
76 Data data
= getData();
78 data
.setRawValue(answer
.replaceAll("\\\\n", "\n"));
83 return "Cannot modify value";
86 actions
.add(new KeyAction(Mode
.ASK_USER_KEY
, 'd',
87 StringId
.KEY_ACTION_DELETE
) {
89 public Object
getObject() {
90 return getSelectedData();
94 public String
getQuestion() {
96 return "Delete data? [Y/N]";
100 public String
callback(String answer
) {
101 if (answer
.equalsIgnoreCase("y")) {
102 Data data
= getData();
103 if (data
!= null && data
.delete()) {
109 return "Cannot delete data";
116 actions
.add(new KeyAction(Mode
.ASK_USER
, 'a', StringId
.KEY_ACTION_ADD
) {
118 public Object
getObject() {
123 public String
getQuestion() {
125 return "new data (xx.group = yy): ";
129 public String
callback(String answer
) {
130 int indexEq
= answer
.indexOf('=');
132 String name
= answer
.substring(0, indexEq
).trim();
133 String value
= answer
.substring(indexEq
+ 1).trim();
136 int indexDt
= name
.indexOf('.');
138 group
= name
.substring(indexDt
+ 1).trim();
139 name
= name
.substring(0, indexDt
).trim();
142 Data data
= new Data(null, name
, value
, group
);
143 getContact().add(data
);
149 // TODO: use a real UI for this, not a simple text box (a list or
150 // something, maybe a whole new pane?)
151 actions
.add(new KeyAction(Mode
.ASK_USER
, 't', StringId
.DUMMY
) {
152 private String previous
;
155 public Object
getObject() {
156 return getSelectedData();
160 public String
getQuestion() {
161 Data data
= getData();
163 return data
.getName();
170 public String
getDefaultAnswer() {
171 Data data
= getData();
173 previous
= typesToString(data
, null).toString();
181 public String
callback(String answer
) {
182 Data data
= getData();
184 if (!answer
.equals(previous
)) {
185 data
.replaceListContent(stringToTypes(answer
));
191 return "Cannot modify value";
194 actions
.add(new KeyAction(Mode
.ASK_USER
, 'g', StringId
.DUMMY
) {
195 private String previous
;
198 public Object
getObject() {
199 return getSelectedData();
203 public String
getQuestion() {
204 Data data
= getData();
206 return data
.getName();
213 public String
getDefaultAnswer() {
214 Data data
= getData();
216 previous
= data
.getGroup();
224 public String
callback(String answer
) {
225 Data data
= getData();
227 if (!answer
.equals(previous
)) {
228 data
.setGroup(answer
);
234 return "Cannot modify group";
237 actions
.add(new KeyAction(Mode
.NONE
, KeyType
.Tab
,
238 StringId
.KEY_ACTION_SWITCH_FORMAT
) {
240 public boolean onAction() {
250 public String
getTitle() {
253 if (contact
!= null) {
254 title
= contact
.getPreferredDataValue("FN");
255 if (title
== null || title
.length() == 0)
256 title
= contact
.getPreferredDataValue("N");
263 public String
move(int x
, int y
) {
264 // TODO Auto-generated method stub
269 protected List
<TextPart
> getLabel(int index
, int width
, boolean selected
,
272 // TODO: from ini file?
274 int SIZE_COL_2_OPT
= 10;
279 List
<TextPart
> parts
= new LinkedList
<TextPart
>();
281 if (index
> -1 && index
< contact
.size())
282 data
= contact
.get(index
);
287 ColorOption el
= (focused
&& selected
) ? ColorOption
.CONTACT_LINE_SELECTED
288 : ColorOption
.CONTACT_LINE
;
289 ColorOption elSep
= (focused
&& selected
) ? ColorOption
.CONTACT_LINE_SEPARATOR_SELECTED
290 : ColorOption
.CONTACT_LINE_SEPARATOR
;
291 ColorOption elDirty
= (focused
&& selected
) ? ColorOption
.CONTACT_LINE_DIRTY_SELECTED
292 : ColorOption
.CONTACT_LINE_DIRTY
;
294 if (data
.isDirty()) {
295 parts
.add(new TextPart(" ", el
));
296 parts
.add(new TextPart("*", elDirty
));
298 parts
.add(new TextPart(" ", elSep
));
300 String name
= " " + data
.getName() + " ";
304 StringBuilder valueBuilder
= new StringBuilder(" ");
306 if (data
.getB64Key() != -1) {
308 valueBuilder
.append("<BKey " + data
.getB64Key() + ">");
310 valueBuilder
.append(data
.getValue().replaceAll("\n", "\\\\n"));
312 if (data
.getGroup() != null && data
.getGroup().length() > 0) {
313 valueBuilder
.append("(");
314 valueBuilder
.append(data
.getGroup());
315 valueBuilder
.append(")");
318 group
= data
.getGroup();
322 typesToString(data
, valueBuilder
);
324 valueBuilder
.append(" ");
326 value
= valueBuilder
.toString();
328 name
= StringUtils
.sanitize(name
, Main
.isUnicode());
329 value
= StringUtils
.sanitize(value
, Main
.isUnicode());
331 name
= StringUtils
.padString(name
, SIZE_COL_1
);
332 group
= StringUtils
.padString(group
, SIZE_COL_2_OPT
);
333 value
= StringUtils
.padString(value
, width
- SIZE_COL_1
334 - SIZE_COL_2_OPT
- (extMode ?
2 : 1) * getSeparator().length()
337 parts
.add(new TextPart(name
, el
));
338 parts
.add(new TextPart(getSeparator(), elSep
));
339 parts
.add(new TextPart(value
, el
));
341 parts
.add(new TextPart(getSeparator(), elSep
));
342 parts
.add(new TextPart(group
, el
));
349 * Return the currently selected {@link Data}.
351 * @return the currently selected {@link Data}
353 private Data
getSelectedData() {
354 int index
= getSelectedIndex();
355 if (index
> -1 && index
< this.contact
.size())
356 return contact
.get(index
);
361 * Serialise the {@link TypeInfo}s in the given {@link Data}.
364 * the {@link Data} from which to take the {@link TypeInfo}s
366 * an optional {@link StringBuilder} to append the serialised
369 * @return the given {@link StringBuilder} or a new one if the given one is
372 static private StringBuilder
typesToString(Data data
, StringBuilder builder
) {
374 builder
= new StringBuilder();
376 for (TypeInfo type
: data
) {
377 if (builder
.length() > 1)
378 builder
.append(", ");
379 builder
.append(type
.getName().replaceAll(",", "\\,"));
380 builder
.append(": ");
381 builder
.append(type
.getValue().replaceAll(":", "\\:"));
388 * Unserialise a list of {@link TypeInfo}s.
391 * the serialised value
393 * @return the {@link TypeInfo} in their object form
395 static private List
<TypeInfo
> stringToTypes(String value
) {
396 List
<TypeInfo
> infos
= new LinkedList
<TypeInfo
>();
397 if (value
== null || value
.length() == 0)
400 char previous
= '\0';
403 for (int index
= 0; index
< value
.length(); index
++) {
404 car
= value
.charAt(index
);
405 if (index
== value
.length() - 1) {
411 if (previous
!= '\\' && car
== ',') {
412 String subValue
= value
.substring(done
, index
);
413 int indexColumn
= subValue
.indexOf(':');
414 while (indexColumn
> 0
415 && subValue
.charAt(indexColumn
- 1) == '\\') {
416 if (indexColumn
== subValue
.length() - 1) {
419 indexColumn
= subValue
.indexOf(':', indexColumn
+ 1);
425 if (indexColumn
>= 0) {
426 n
= subValue
.substring(0, indexColumn
).trim();
427 v
= subValue
.substring(indexColumn
+ 1)
428 .replaceAll("\\\\:", ":").trim();
433 infos
.add(new TypeInfo(n
, v
));