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
;
16 import be
.nikiroo
.jvcard
.tui
.TuiLauncher
;
18 import com
.googlecode
.lanterna
.gui2
.MultiWindowTextGUI
;
19 import com
.googlecode
.lanterna
.gui2
.dialogs
.ActionListDialogBuilder
;
20 import com
.googlecode
.lanterna
.input
.KeyType
;
22 public class ContactDetailsRaw
extends MainContentList
{
23 private Contact contact
;
24 private boolean extMode
;
26 public ContactDetailsRaw(Contact contact
) {
27 this.contact
= contact
;
30 for (int i
= 0; i
< contact
.size(); i
++) {
36 public DataType
getDataType() {
41 public List
<KeyAction
> getKeyBindings() {
42 List
<KeyAction
> actions
= new LinkedList
<KeyAction
>();
44 actions
.add(new KeyAction(Mode
.ASK_USER
, KeyType
.Enter
,
45 StringId
.KEY_ACTION_EDIT_FIELD
) {
47 public Object
getObject() {
48 Data data
= getSelectedData();
49 if (data
!= null && data
.getB64Key() != -1) {
50 setMessage("Cannot modify binary values in RAW mode", true);
58 public String
getQuestion() {
59 Data data
= getData();
61 return data
.getName();
68 public String
getDefaultAnswer() {
69 Data data
= getData();
71 return data
.getRawValue().replaceAll("\n", "\\\\n");
78 public String
callback(String answer
) {
79 Data data
= getData();
81 data
.setRawValue(answer
.replaceAll("\\\\n", "\n"));
86 return "Cannot modify value";
89 actions
.add(new KeyAction(Mode
.ASK_USER_KEY
, 'd',
90 StringId
.KEY_ACTION_DELETE
) {
92 public Object
getObject() {
93 return getSelectedData();
97 public String
getQuestion() {
99 return "Delete data? [Y/N]";
103 public String
callback(String answer
) {
104 if (answer
.equalsIgnoreCase("y")) {
105 Data data
= getData();
106 if (data
!= null && data
.delete()) {
112 return "Cannot delete data";
119 actions
.add(new KeyAction(Mode
.ASK_USER
, 'a', StringId
.KEY_ACTION_ADD
) {
123 public boolean onAction() {
124 new ActionListDialogBuilder()
125 .setTitle("New data")
126 .setDescription("Choose a data type")
127 .addAction("Email address", new Runnable() {
133 .addAction("Telephone number", new Runnable() {
139 .addAction("Birthday", new Runnable() {
145 .addAction("[other]", new Runnable() {
153 new MultiWindowTextGUI(TuiLauncher
.getScreen()));
155 String name
= this.name
;
159 if (name
.length() > 0) {
160 Data data
= new Data(null, name
, "", null);
161 getContact().add(data
);
165 return (name
.length() == 0);
172 public Object
getObject() {
177 public String
getQuestion() {
180 return "Data name: ";
186 public String
callback(String answer
) {
187 if (answer
!= null & answer
.length() > 0) {
188 Data data
= new Data(null, answer
, "", null);
189 getContact().add(data
);
196 // TODO: use a real UI for this, not a simple text box (a list or
197 // something, maybe a whole new pane?)
198 actions
.add(new KeyAction(Mode
.ASK_USER
, 't', StringId
.DUMMY
) {
199 private String previous
;
202 public Object
getObject() {
203 return getSelectedData();
207 public String
getQuestion() {
208 Data data
= getData();
210 return data
.getName();
217 public String
getDefaultAnswer() {
218 Data data
= getData();
220 previous
= typesToString(data
, null).toString();
228 public String
callback(String answer
) {
229 Data data
= getData();
231 if (!answer
.equals(previous
)) {
232 data
.replaceListContent(stringToTypes(answer
));
238 return "Cannot modify value";
241 actions
.add(new KeyAction(Mode
.ASK_USER
, 'g', StringId
.DUMMY
) {
242 private String previous
;
245 public Object
getObject() {
246 return getSelectedData();
250 public String
getQuestion() {
251 Data data
= getData();
253 return data
.getName();
260 public String
getDefaultAnswer() {
261 Data data
= getData();
263 previous
= data
.getGroup();
271 public String
callback(String answer
) {
272 Data data
= getData();
274 if (!answer
.equals(previous
)) {
275 data
.setGroup(answer
);
281 return "Cannot modify group";
284 actions
.add(new KeyAction(Mode
.NONE
, KeyType
.Tab
,
285 StringId
.KEY_ACTION_SWITCH_FORMAT
) {
287 public boolean onAction() {
297 public String
getTitle() {
300 if (contact
!= null) {
301 title
= contact
.getPreferredDataValue("FN");
302 if (title
== null || title
.length() == 0)
303 title
= contact
.getPreferredDataValue("N");
310 public String
move(int x
, int y
) {
311 // TODO Auto-generated method stub
316 protected List
<TextPart
> getLabel(int index
, int width
, boolean selected
,
319 // TODO: from ini file?
321 int SIZE_COL_2_OPT
= 10;
326 List
<TextPart
> parts
= new LinkedList
<TextPart
>();
328 if (index
> -1 && index
< contact
.size())
329 data
= contact
.get(index
);
334 ColorOption el
= (focused
&& selected
) ? ColorOption
.CONTACT_LINE_SELECTED
335 : ColorOption
.CONTACT_LINE
;
336 ColorOption elSep
= (focused
&& selected
) ? ColorOption
.CONTACT_LINE_SEPARATOR_SELECTED
337 : ColorOption
.CONTACT_LINE_SEPARATOR
;
338 ColorOption elDirty
= (focused
&& selected
) ? ColorOption
.CONTACT_LINE_DIRTY_SELECTED
339 : ColorOption
.CONTACT_LINE_DIRTY
;
341 if (data
.isDirty()) {
342 parts
.add(new TextPart(" ", el
));
343 parts
.add(new TextPart("*", elDirty
));
345 parts
.add(new TextPart(" ", elSep
));
347 String name
= " " + data
.getName() + " ";
351 StringBuilder valueBuilder
= new StringBuilder(" ");
353 if (data
.getB64Key() != -1) {
355 valueBuilder
.append("<BKey " + data
.getB64Key() + ">");
357 valueBuilder
.append(data
.getValue().replaceAll("\n", "\\\\n"));
359 if (data
.getGroup() != null && data
.getGroup().length() > 0) {
360 valueBuilder
.append("(");
361 valueBuilder
.append(data
.getGroup());
362 valueBuilder
.append(")");
365 group
= data
.getGroup();
369 typesToString(data
, valueBuilder
);
371 valueBuilder
.append(" ");
373 value
= valueBuilder
.toString();
375 name
= StringUtils
.sanitize(name
, Main
.isUnicode());
376 value
= StringUtils
.sanitize(value
, Main
.isUnicode());
378 name
= StringUtils
.padString(name
, SIZE_COL_1
);
379 group
= StringUtils
.padString(group
, SIZE_COL_2_OPT
);
380 value
= StringUtils
.padString(value
, width
- SIZE_COL_1
381 - SIZE_COL_2_OPT
- (extMode ?
2 : 1) * getSeparator().length()
384 parts
.add(new TextPart(name
, el
));
385 parts
.add(new TextPart(getSeparator(), elSep
));
386 parts
.add(new TextPart(value
, el
));
388 parts
.add(new TextPart(getSeparator(), elSep
));
389 parts
.add(new TextPart(group
, el
));
396 * Return the currently selected {@link Data}.
398 * @return the currently selected {@link Data}
400 private Data
getSelectedData() {
401 int index
= getSelectedIndex();
402 if (index
> -1 && index
< this.contact
.size())
403 return contact
.get(index
);
408 * Serialise the {@link TypeInfo}s in the given {@link Data}.
411 * the {@link Data} from which to take the {@link TypeInfo}s
413 * an optional {@link StringBuilder} to append the serialised
416 * @return the given {@link StringBuilder} or a new one if the given one is
419 static private StringBuilder
typesToString(Data data
, StringBuilder builder
) {
421 builder
= new StringBuilder();
423 for (TypeInfo type
: data
) {
424 if (builder
.length() > 1)
425 builder
.append(", ");
426 builder
.append(type
.getName().replaceAll(",", "\\,"));
427 builder
.append(": ");
428 builder
.append(type
.getValue().replaceAll(":", "\\:"));
435 * Unserialise a list of {@link TypeInfo}s.
438 * the serialised value
440 * @return the {@link TypeInfo} in their object form
442 static private List
<TypeInfo
> stringToTypes(String value
) {
443 List
<TypeInfo
> infos
= new LinkedList
<TypeInfo
>();
444 if (value
== null || value
.length() == 0)
447 char previous
= '\0';
450 for (int index
= 0; index
< value
.length(); index
++) {
451 car
= value
.charAt(index
);
452 if (index
== value
.length() - 1) {
458 if (previous
!= '\\' && car
== ',') {
459 String subValue
= value
.substring(done
, index
);
460 int indexColumn
= subValue
.indexOf(':');
461 while (indexColumn
> 0
462 && subValue
.charAt(indexColumn
- 1) == '\\') {
463 if (indexColumn
== subValue
.length() - 1) {
466 indexColumn
= subValue
.indexOf(':', indexColumn
+ 1);
472 if (indexColumn
>= 0) {
473 n
= subValue
.substring(0, indexColumn
).trim();
474 v
= subValue
.substring(indexColumn
+ 1)
475 .replaceAll("\\\\:", ":").trim();
480 infos
.add(new TypeInfo(n
, v
));