[283] | 1 | package net.sabi.pester;
|
---|
| 2 |
|
---|
| 3 | import danger.app.Application;
|
---|
| 4 | import danger.text.Collator;
|
---|
| 5 | import danger.text.DangerCollator;
|
---|
| 6 | import danger.ui.ListSelectMenu;
|
---|
| 7 | import danger.ui.MenuItem;
|
---|
| 8 | import danger.util.DEBUG;
|
---|
| 9 | import danger.util.TextFinder;
|
---|
| 10 | import java.io.ByteArrayInputStream;
|
---|
| 11 | import java.io.ByteArrayOutputStream;
|
---|
| 12 | import java.io.DataInputStream;
|
---|
| 13 | import java.io.DataOutputStream;
|
---|
| 14 | import java.util.Arrays;
|
---|
[284] | 15 | import java.util.Collections;
|
---|
[283] | 16 | import java.util.LinkedList;
|
---|
| 17 | import java.util.ListIterator;
|
---|
| 18 | import java.util.Vector;
|
---|
| 19 |
|
---|
| 20 | class 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 | }
|
---|
[284] | 100 | Collections.sort(mItems);
|
---|
| 101 | menu.makeResultInclusive(true);
|
---|
[283] | 102 | menu.updateMenuContents(mItems);
|
---|
| 103 | }
|
---|
| 104 | }
|
---|