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.group = yy): ";
124 public String
callback(String answer
) {
125 int indexEq
= answer
.indexOf('=');
127 String name
= answer
.substring(0, indexEq
).trim();
128 String value
= answer
.substring(indexEq
+ 1).trim();
131 int indexDt
= name
.indexOf('.');
133 group
= name
.substring(indexDt
+ 1).trim();
134 name
= name
.substring(0, indexDt
).trim();
137 Data data
= new Data(null, name
, value
, group
);
138 getContact().add(data
);
144 // TODO: use a real UI for this, not a simple text box (a list or
145 // something, maybe a whole new pane?)
146 actions
.add(new KeyAction(Mode
.ASK_USER
, 't', Trans
.StringId
.DUMMY
) {
147 private String previous
;
150 public Object
getObject() {
151 return getSelectedData();
155 public String
getQuestion() {
156 Data data
= getData();
158 return data
.getName();
165 public String
getDefaultAnswer() {
166 Data data
= getData();
168 previous
= typesToString(data
, null).toString();
176 public String
callback(String answer
) {
177 Data data
= getData();
179 if (!answer
.equals(previous
)) {
180 data
.replaceListContent(stringToTypes(answer
));
186 return "Cannot modify value";
189 actions
.add(new KeyAction(Mode
.ASK_USER
, 'g', Trans
.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
= data
.getGroup();
219 public String
callback(String answer
) {
220 Data data
= getData();
222 if (!answer
.equals(previous
)) {
223 data
.setGroup(answer
);
229 return "Cannot modify group";
232 actions
.add(new KeyAction(Mode
.NONE
, KeyType
.Tab
,
233 Trans
.StringId
.KEY_ACTION_SWITCH_FORMAT
) {
235 public boolean onAction() {
245 public String
getTitle() {
248 if (contact
!= null) {
249 title
= contact
.getPreferredDataValue("FN");
250 if (title
== null || title
.length() == 0)
251 title
= contact
.getPreferredDataValue("N");
258 public String
move(int x
, int y
) {
259 // TODO Auto-generated method stub
264 protected List
<TextPart
> getLabel(int index
, int width
, boolean selected
,
266 // TODO: from ini file?
268 int SIZE_COL_2_OPT
= 10;
273 List
<TextPart
> parts
= new LinkedList
<TextPart
>();
275 if (index
> -1 && index
< contact
.size())
276 data
= contact
.get(index
);
281 Element el
= (focused
&& selected
) ? Element
.CONTACT_LINE_SELECTED
282 : Element
.CONTACT_LINE
;
283 Element elSep
= (focused
&& selected
) ? Element
.CONTACT_LINE_SEPARATOR_SELECTED
284 : Element
.CONTACT_LINE_SEPARATOR
;
285 Element elDirty
= (focused
&& selected
) ? Element
.CONTACT_LINE_DIRTY_SELECTED
286 : Element
.CONTACT_LINE_DIRTY
;
288 if (data
.isDirty()) {
289 parts
.add(new TextPart(" ", el
));
290 parts
.add(new TextPart("*", elDirty
));
292 parts
.add(new TextPart(" ", elSep
));
294 String name
= " " + data
.getName() + " ";
298 StringBuilder valueBuilder
= new StringBuilder(" ");
300 valueBuilder
.append(data
.getValue());
301 if (data
.getGroup() != null && data
.getGroup().length() > 0) {
302 valueBuilder
.append("(");
303 valueBuilder
.append(data
.getGroup());
304 valueBuilder
.append(")");
307 group
= data
.getGroup();
311 typesToString(data
, valueBuilder
);
313 valueBuilder
.append(" ");
315 value
= valueBuilder
.toString();
317 name
= StringUtils
.sanitize(name
, UiColors
.getInstance().isUnicode());
318 value
= StringUtils
.sanitize(value
, UiColors
.getInstance().isUnicode());
320 name
= StringUtils
.padString(name
, SIZE_COL_1
);
321 group
= StringUtils
.padString(group
, SIZE_COL_2_OPT
);
322 value
= StringUtils
.padString(value
, width
- SIZE_COL_1
323 - SIZE_COL_2_OPT
- (extMode ?
2 : 1) * getSeparator().length()
326 parts
.add(new TextPart(name
, el
));
327 parts
.add(new TextPart(getSeparator(), elSep
));
328 parts
.add(new TextPart(value
, el
));
330 parts
.add(new TextPart(getSeparator(), elSep
));
331 parts
.add(new TextPart(group
, el
));
338 * Return the currently selected {@link Data}.
340 * @return the currently selected {@link Data}
342 private Data
getSelectedData() {
343 int index
= getSelectedIndex();
344 if (index
> -1 && index
< this.contact
.size())
345 return contact
.get(index
);
350 * Serialise the {@link TypeInfo}s in the given {@link Data}.
353 * the {@link Data} from which to take the {@link TypeInfo}s
355 * an optional {@link StringBuilder} to append the serialized
358 * @return the given {@link StringBuilder} or a new one if the given one is
361 static private StringBuilder
typesToString(Data data
, StringBuilder builder
) {
363 builder
= new StringBuilder();
365 for (int indexType
= 0; indexType
< data
.size(); indexType
++) {
366 TypeInfo type
= data
.get(indexType
);
367 if (builder
.length() > 1)
368 builder
.append(", ");
369 builder
.append(type
.getName().replaceAll(",", "\\,"));
370 builder
.append(": ");
371 builder
.append(type
.getValue().replaceAll(":", "\\:"));
378 * Unserialise a list of {@link TypeInfo}s.
381 * the serialised value
383 * @return the {@link TypeInfo} in their object form
385 static private List
<TypeInfo
> stringToTypes(String value
) {
386 List
<TypeInfo
> infos
= new LinkedList
<TypeInfo
>();
387 if (value
== null || value
.length() == 0)
390 char previous
= '\0';
393 for (int index
= 0; index
< value
.length(); index
++) {
394 car
= value
.charAt(index
);
395 if (index
== value
.length() - 1) {
401 if (previous
!= '\\' && car
== ',') {
402 String
[] tab
= value
.substring(done
, index
).split("\\:");
403 infos
.add(new TypeInfo( //
404 tab
[0].replaceAll("\\,", ",").replaceAll("\\:", ":")
406 tab
[1].replaceAll("\\,", ",").replaceAll("\\:", ":")