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
) {
121 public boolean onAction() {
123 new ActionListDialogBuilder()
124 .setTitle("Action List Dialog")
125 .setDescription("Choose an item")
126 .addAction("First Item", new Runnable() {
132 .addAction("Second Item", new Runnable() {
138 .addAction("Third Item", new Runnable() {
146 new MultiWindowTextGUI(TuiLauncher
.getScreen()));
156 public Object
getObject() {
161 public String
getQuestion() {
163 return "new data (xx.group = yy): ";
167 public String
callback(String answer
) {
168 int indexEq
= answer
.indexOf('=');
170 String name
= answer
.substring(0, indexEq
).trim();
171 String value
= answer
.substring(indexEq
+ 1).trim();
174 int indexDt
= name
.indexOf('.');
176 group
= name
.substring(indexDt
+ 1).trim();
177 name
= name
.substring(0, indexDt
).trim();
180 Data data
= new Data(null, name
, value
, group
);
181 getContact().add(data
);
187 // TODO: use a real UI for this, not a simple text box (a list or
188 // something, maybe a whole new pane?)
189 actions
.add(new KeyAction(Mode
.ASK_USER
, 't', StringId
.DUMMY
) {
190 private String previous
;
193 public Object
getObject() {
194 return getSelectedData();
198 public String
getQuestion() {
199 Data data
= getData();
201 return data
.getName();
208 public String
getDefaultAnswer() {
209 Data data
= getData();
211 previous
= typesToString(data
, null).toString();
219 public String
callback(String answer
) {
220 Data data
= getData();
222 if (!answer
.equals(previous
)) {
223 data
.replaceListContent(stringToTypes(answer
));
229 return "Cannot modify value";
232 actions
.add(new KeyAction(Mode
.ASK_USER
, 'g', StringId
.DUMMY
) {
233 private String previous
;
236 public Object
getObject() {
237 return getSelectedData();
241 public String
getQuestion() {
242 Data data
= getData();
244 return data
.getName();
251 public String
getDefaultAnswer() {
252 Data data
= getData();
254 previous
= data
.getGroup();
262 public String
callback(String answer
) {
263 Data data
= getData();
265 if (!answer
.equals(previous
)) {
266 data
.setGroup(answer
);
272 return "Cannot modify group";
275 actions
.add(new KeyAction(Mode
.NONE
, KeyType
.Tab
,
276 StringId
.KEY_ACTION_SWITCH_FORMAT
) {
278 public boolean onAction() {
288 public String
getTitle() {
291 if (contact
!= null) {
292 title
= contact
.getPreferredDataValue("FN");
293 if (title
== null || title
.length() == 0)
294 title
= contact
.getPreferredDataValue("N");
301 public String
move(int x
, int y
) {
302 // TODO Auto-generated method stub
307 protected List
<TextPart
> getLabel(int index
, int width
, boolean selected
,
310 // TODO: from ini file?
312 int SIZE_COL_2_OPT
= 10;
317 List
<TextPart
> parts
= new LinkedList
<TextPart
>();
319 if (index
> -1 && index
< contact
.size())
320 data
= contact
.get(index
);
325 ColorOption el
= (focused
&& selected
) ? ColorOption
.CONTACT_LINE_SELECTED
326 : ColorOption
.CONTACT_LINE
;
327 ColorOption elSep
= (focused
&& selected
) ? ColorOption
.CONTACT_LINE_SEPARATOR_SELECTED
328 : ColorOption
.CONTACT_LINE_SEPARATOR
;
329 ColorOption elDirty
= (focused
&& selected
) ? ColorOption
.CONTACT_LINE_DIRTY_SELECTED
330 : ColorOption
.CONTACT_LINE_DIRTY
;
332 if (data
.isDirty()) {
333 parts
.add(new TextPart(" ", el
));
334 parts
.add(new TextPart("*", elDirty
));
336 parts
.add(new TextPart(" ", elSep
));
338 String name
= " " + data
.getName() + " ";
342 StringBuilder valueBuilder
= new StringBuilder(" ");
344 if (data
.getB64Key() != -1) {
346 valueBuilder
.append("<BKey " + data
.getB64Key() + ">");
348 valueBuilder
.append(data
.getValue().replaceAll("\n", "\\\\n"));
350 if (data
.getGroup() != null && data
.getGroup().length() > 0) {
351 valueBuilder
.append("(");
352 valueBuilder
.append(data
.getGroup());
353 valueBuilder
.append(")");
356 group
= data
.getGroup();
360 typesToString(data
, valueBuilder
);
362 valueBuilder
.append(" ");
364 value
= valueBuilder
.toString();
366 name
= StringUtils
.sanitize(name
, Main
.isUnicode());
367 value
= StringUtils
.sanitize(value
, Main
.isUnicode());
369 name
= StringUtils
.padString(name
, SIZE_COL_1
);
370 group
= StringUtils
.padString(group
, SIZE_COL_2_OPT
);
371 value
= StringUtils
.padString(value
, width
- SIZE_COL_1
372 - SIZE_COL_2_OPT
- (extMode ?
2 : 1) * getSeparator().length()
375 parts
.add(new TextPart(name
, el
));
376 parts
.add(new TextPart(getSeparator(), elSep
));
377 parts
.add(new TextPart(value
, el
));
379 parts
.add(new TextPart(getSeparator(), elSep
));
380 parts
.add(new TextPart(group
, el
));
387 * Return the currently selected {@link Data}.
389 * @return the currently selected {@link Data}
391 private Data
getSelectedData() {
392 int index
= getSelectedIndex();
393 if (index
> -1 && index
< this.contact
.size())
394 return contact
.get(index
);
399 * Serialise the {@link TypeInfo}s in the given {@link Data}.
402 * the {@link Data} from which to take the {@link TypeInfo}s
404 * an optional {@link StringBuilder} to append the serialised
407 * @return the given {@link StringBuilder} or a new one if the given one is
410 static private StringBuilder
typesToString(Data data
, StringBuilder builder
) {
412 builder
= new StringBuilder();
414 for (TypeInfo type
: data
) {
415 if (builder
.length() > 1)
416 builder
.append(", ");
417 builder
.append(type
.getName().replaceAll(",", "\\,"));
418 builder
.append(": ");
419 builder
.append(type
.getValue().replaceAll(":", "\\:"));
426 * Unserialise a list of {@link TypeInfo}s.
429 * the serialised value
431 * @return the {@link TypeInfo} in their object form
433 static private List
<TypeInfo
> stringToTypes(String value
) {
434 List
<TypeInfo
> infos
= new LinkedList
<TypeInfo
>();
435 if (value
== null || value
.length() == 0)
438 char previous
= '\0';
441 for (int index
= 0; index
< value
.length(); index
++) {
442 car
= value
.charAt(index
);
443 if (index
== value
.length() - 1) {
449 if (previous
!= '\\' && car
== ',') {
450 String subValue
= value
.substring(done
, index
);
451 int indexColumn
= subValue
.indexOf(':');
452 while (indexColumn
> 0
453 && subValue
.charAt(indexColumn
- 1) == '\\') {
454 if (indexColumn
== subValue
.length() - 1) {
457 indexColumn
= subValue
.indexOf(':', indexColumn
+ 1);
463 if (indexColumn
>= 0) {
464 n
= subValue
.substring(0, indexColumn
).trim();
465 v
= subValue
.substring(indexColumn
+ 1)
466 .replaceAll("\\\\:", ":").trim();
471 infos
.add(new TypeInfo(n
, v
));