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
.i18n
.Trans
;
10 import be
.nikiroo
.jvcard
.tui
.KeyAction
;
11 import be
.nikiroo
.jvcard
.tui
.KeyAction
.DataType
;
12 import be
.nikiroo
.jvcard
.tui
.KeyAction
.Mode
;
13 import be
.nikiroo
.jvcard
.tui
.StringUtils
;
14 import be
.nikiroo
.jvcard
.tui
.UiColors
;
15 import be
.nikiroo
.jvcard
.tui
.UiColors
.Element
;
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 // TODO Auto-generated method stub
40 List
<KeyAction
> actions
= new LinkedList
<KeyAction
>();
43 actions
.add(new KeyAction(Mode
.ASK_USER
, KeyType
.Enter
,
44 Trans
.StringId
.DUMMY
) {
46 public Object
getObject() {
47 return getSelectedData();
51 public String
getQuestion() {
52 Data data
= getData();
54 return data
.getName();
61 public String
getDefaultAnswer() {
62 Data data
= getData();
64 return data
.getValue();
71 public String
callback(String answer
) {
72 Data data
= getData();
74 data
.setValue(answer
);
79 return "Cannot modify value";
82 actions
.add(new KeyAction(Mode
.ASK_USER_KEY
, 'd', Trans
.StringId
.DUMMY
) {
84 public Object
getObject() {
85 return getSelectedData();
89 public String
getQuestion() {
91 return "Delete data? [Y/N]";
95 public String
callback(String answer
) {
96 if (answer
.equalsIgnoreCase("y")) {
97 Data data
= getData();
98 if (data
!= null && data
.delete()) {
104 return "Cannot delete data";
111 actions
.add(new KeyAction(Mode
.ASK_USER
, 'a', Trans
.StringId
.DUMMY
) {
113 public Object
getObject() {
118 public String
getQuestion() {
120 return "new data (xx = yy): ";
124 public String
callback(String answer
) {
125 if (answer
.length() > 0 && answer
.contains("=")) {
126 String
[] tab
= answer
.split("=");
127 Data data
= new Data(null, tab
[0].trim(), tab
[1].trim(),
129 getContact().add(data
);
136 // TODO: use a real UI for this, not a simple text box (a list or
137 // something, maybe a whole new pane?)
138 actions
.add(new KeyAction(Mode
.ASK_USER
, 't', Trans
.StringId
.DUMMY
) {
139 private String previous
;
142 public Object
getObject() {
143 return getSelectedData();
147 public String
getQuestion() {
148 Data data
= getData();
150 return data
.getName();
157 public String
getDefaultAnswer() {
158 Data data
= getData();
160 previous
= typesToString(data
, null).toString();
168 public String
callback(String answer
) {
169 Data data
= getData();
171 if (!answer
.equals(previous
)) {
172 data
.replaceListContent(stringToTypes(answer
));
178 return "Cannot modify value";
181 actions
.add(new KeyAction(Mode
.ASK_USER
, 'g', Trans
.StringId
.DUMMY
) {
182 private String previous
;
185 public Object
getObject() {
186 return getSelectedData();
190 public String
getQuestion() {
191 Data data
= getData();
193 return data
.getName();
200 public String
getDefaultAnswer() {
201 Data data
= getData();
203 previous
= data
.getGroup();
211 public String
callback(String answer
) {
212 Data data
= getData();
214 if (!answer
.equals(previous
)) {
215 data
.setGroup(answer
);
221 return "Cannot modify group";
224 actions
.add(new KeyAction(Mode
.NONE
, KeyType
.Tab
,
225 Trans
.StringId
.KEY_ACTION_SWITCH_FORMAT
) {
227 public boolean onAction() {
237 public String
getTitle() {
240 if (contact
!= null) {
241 title
= contact
.getPreferredDataValue("FN");
242 if (title
== null || title
.length() == 0)
243 title
= contact
.getPreferredDataValue("N");
250 public String
move(int x
, int y
) {
251 // TODO Auto-generated method stub
256 protected List
<TextPart
> getLabel(int index
, int width
, boolean selected
,
258 // TODO: from ini file?
260 int SIZE_COL_2_OPT
= 10;
265 List
<TextPart
> parts
= new LinkedList
<TextPart
>();
267 if (index
> -1 && index
< contact
.size())
268 data
= contact
.get(index
);
273 Element el
= (focused
&& selected
) ? Element
.CONTACT_LINE_SELECTED
274 : Element
.CONTACT_LINE
;
275 Element elSep
= (focused
&& selected
) ? Element
.CONTACT_LINE_SEPARATOR_SELECTED
276 : Element
.CONTACT_LINE_SEPARATOR
;
277 Element elDirty
= (focused
&& selected
) ? Element
.CONTACT_LINE_DIRTY_SELECTED
278 : Element
.CONTACT_LINE_DIRTY
;
280 if (data
.isDirty()) {
281 parts
.add(new TextPart(" ", el
));
282 parts
.add(new TextPart("*", elDirty
));
284 parts
.add(new TextPart(" ", elSep
));
286 String name
= " " + data
.getName() + " ";
290 StringBuilder valueBuilder
= new StringBuilder(" ");
292 valueBuilder
.append(data
.getValue());
293 if (data
.getGroup() != null && data
.getGroup().length() > 0) {
294 valueBuilder
.append("(");
295 valueBuilder
.append(data
.getGroup());
296 valueBuilder
.append(")");
299 group
= data
.getGroup();
303 typesToString(data
, valueBuilder
);
305 valueBuilder
.append(" ");
307 value
= valueBuilder
.toString();
309 name
= StringUtils
.sanitize(name
, UiColors
.getInstance().isUnicode());
310 value
= StringUtils
.sanitize(value
, UiColors
.getInstance().isUnicode());
312 name
= StringUtils
.padString(name
, SIZE_COL_1
);
313 group
= StringUtils
.padString(group
, SIZE_COL_2_OPT
);
314 value
= StringUtils
.padString(value
, width
- SIZE_COL_1
315 - SIZE_COL_2_OPT
- (extMode ?
2 : 1) * getSeparator().length()
318 parts
.add(new TextPart(name
, el
));
319 parts
.add(new TextPart(getSeparator(), elSep
));
320 parts
.add(new TextPart(value
, el
));
322 parts
.add(new TextPart(getSeparator(), elSep
));
323 parts
.add(new TextPart(group
, el
));
330 * Return the currently selected {@link Data}.
332 * @return the currently selected {@link Data}
334 private Data
getSelectedData() {
335 int index
= getSelectedIndex();
336 if (index
> -1 && index
< this.contact
.size())
337 return contact
.get(index
);
342 * Serialise the {@link TypeInfo}s in the given {@link Data}.
345 * the {@link Data} from which to take the {@link TypeInfo}s
347 * an optional {@link StringBuilder} to append the serialized
350 * @return the given {@link StringBuilder} or a new one if the given one is
353 static private StringBuilder
typesToString(Data data
, StringBuilder builder
) {
355 builder
= new StringBuilder();
357 for (int indexType
= 0; indexType
< data
.size(); indexType
++) {
358 TypeInfo type
= data
.get(indexType
);
359 if (builder
.length() > 1)
360 builder
.append(", ");
361 builder
.append(type
.getName().replaceAll(",", "\\,"));
362 builder
.append(": ");
363 builder
.append(type
.getValue().replaceAll(":", "\\:"));
370 * Unserialise a list of {@link TypeInfo}s.
373 * the serialised value
375 * @return the {@link TypeInfo} in their object form
377 static private List
<TypeInfo
> stringToTypes(String value
) {
378 List
<TypeInfo
> infos
= new LinkedList
<TypeInfo
>();
379 if (value
== null || value
.length() == 0)
382 char previous
= '\0';
385 for (int index
= 0; index
< value
.length(); index
++) {
386 car
= value
.charAt(index
);
387 if (index
== value
.length() - 1) {
393 if (previous
!= '\\' && car
== ',') {
394 String
[] tab
= value
.substring(done
, index
).split("\\:");
395 infos
.add(new TypeInfo( //
396 tab
[0].replaceAll("\\,", ",").replaceAll("\\:", ":")
398 tab
[1].replaceAll("\\,", ",").replaceAll("\\:", ":")