source: trunk/hiptop/pester/net/sabi/pester/MessageFinder.java@ 299

Last change on this file since 299 was 284, checked in by Nicholas Riley, 18 years ago

A few tweaks to autocompletion - use a sorted list, and select by default. Users can still hit menu to stop it.

File size: 3.0 KB
Line 
1package net.sabi.pester;
2
3import danger.app.Application;
4import danger.text.Collator;
5import danger.text.DangerCollator;
6import danger.ui.ListSelectMenu;
7import danger.ui.MenuItem;
8import danger.util.DEBUG;
9import danger.util.TextFinder;
10import java.io.ByteArrayInputStream;
11import java.io.ByteArrayOutputStream;
12import java.io.DataInputStream;
13import java.io.DataOutputStream;
14import java.util.Arrays;
15import java.util.Collections;
16import java.util.LinkedList;
17import java.util.ListIterator;
18import java.util.Vector;
19
20class MessageFinder implements TextFinder, Resources {
21 private static final int VERSION_1 = 1;
22 private static final int MAX_MESSAGE_COUNT = 50;
23 private static LinkedList sMessageList = new LinkedList();
24 private Vector mItems;
25
26 public static void setDefaultMessageList() {
27 String messages[] =
28 Application.getCurrentApp().getStringArray(ID_ALARM_MESSAGES);
29 sMessageList = new LinkedList(Arrays.asList(messages));
30 }
31
32 public static byte[] messageListAsByteArray() {
33 try {
34 ByteArrayOutputStream byteStream = new ByteArrayOutputStream();
35 DataOutputStream dataStream = new DataOutputStream(byteStream);
36
37 dataStream.writeByte(VERSION_1);
38 dataStream.writeInt(sMessageList.size());
39 ListIterator i = sMessageList.listIterator(0);
40 while (i.hasNext())
41 dataStream.writeUTF((String)i.next());
42 dataStream.flush();
43 return byteStream.toByteArray();
44 } catch (Exception e) {
45 DEBUG.p("Pester: couldn't serialize message list: " + e);
46 }
47 return null;
48 }
49
50 public static void setMessageListFromByteArray(byte[] data) {
51 try {
52 ByteArrayInputStream byteStream = new ByteArrayInputStream(data);
53 DataInputStream dataStream = new DataInputStream(byteStream);
54
55 byte version = dataStream.readByte();
56 if (version != VERSION_1)
57 throw new Exception();
58
59 int count = dataStream.readInt();
60 for (int i = 0 ; i < count ; i++)
61 addMessage(dataStream.readUTF());
62 } catch (Exception e) {
63 setDefaultMessageList();
64 DEBUG.p("Pester: setting default message list: " + e);
65 }
66 }
67
68 private static boolean addMessage(String message) {
69 int i = sMessageList.indexOf(message);
70 if (i == 0)
71 return false;
72 if (i != -1)
73 sMessageList.remove(i);
74 sMessageList.addFirst(message);
75 if (sMessageList.size() > MAX_MESSAGE_COUNT)
76 sMessageList.removeLast();
77 return true;
78 }
79
80 public static void usedMessage(String message) {
81 if (!addMessage(message))
82 return;
83 Alarms.recentMessagesChanged();
84 }
85
86 public MessageFinder() {
87 mItems = new Vector(sMessageList.size() / 2);
88 }
89
90 public void search(ListSelectMenu menu, String key) {
91 DangerCollator collator = (DangerCollator)DangerCollator.getInstance();
92 mItems.removeAllElements();
93 ListIterator i = sMessageList.listIterator(0);
94 while (i.hasNext()) {
95 String message = (String)i.next();
96 if (collator.startsWith(message, key, Collator.PRIMARY)) {
97 mItems.addElement(new MenuItem(message));
98 }
99 }
100 Collections.sort(mItems);
101 menu.makeResultInclusive(true);
102 menu.updateMenuContents(mItems);
103 }
104}
Note: See TracBrowser for help on using the repository browser.