package gui; import gl.Color; import gui.simpleUI.EditItem; import gui.simpleUI.ModifierGroup; import gui.simpleUI.modifiers.ColorModifier; import gui.simpleUI.modifiers.Headline; import gui.simpleUI.modifiers.InfoText; import gui.simpleUI.modifiers.TextModifier; import java.util.Arrays; import listeners.ItemSelectedListener; import util.EfficientList; import util.IO; import util.Log; import android.content.Context; import android.graphics.Bitmap; import android.graphics.drawable.Drawable; import android.location.Address; import android.view.ViewGroup; import de.rwth.R; /** * The {@link MetaInfos} object should be used to separate the information an * object holds from the system logic part of it. if every object uses an meta * infos element to store information about itself, it gets much easier to * create UI tools for visualization about different types of objects * * @author Spobo * */ public class MetaInfos implements EditItem { /** * This object should help to separate single facts about the object to get * a better representation * * @author Spobo * */ public static class InfoElement { private String key; private String value; public InfoElement(String value) { this.value = value; } public InfoElement(String key, String value) { this.key = key; this.value = value; } @Override public String toString() { if (key == null) return value; return key + ": " + value; } public void generateEditView(ModifierGroup g) { g.addModifier(new TextModifier() { @Override public boolean save(String newValue) { value = newValue; return true; } @Override public String load() { return value; } @Override public String getVarName() { if (key == null) return ""; return key; } }); } public void generateView(ModifierGroup g) { g.addModifier(new InfoText(key, value)); } } private static final int DEFAULT_ICON = R.drawable.icon; private static final Color DEFAULT_COLOR = Color.whiteTransparent(); /** * this defines the maximum size of an imaged downloaded from an URL */ protected static final String SHORT_DISCR_NAME = "Name"; protected static final String LONG_DISCR_NAME = "Desciption"; protected static final String COLOR_NAME = "ARGB Color"; /** * the id of the icon (eg R.drawable.icon) */ private int myIconId; /** * if myIconId is 0 and myIconURL isnt null then the icon is loaded from * this url and stored in myIcon */ private String myIconURL; /** * if myIconId is 0 and myIconURL isnt null then the icon is loaded from * this url and stored in myIcon */ private Bitmap myIcon; private EfficientList<InfoElement> longDescr = new EfficientList<InfoElement>(); private String shortDescr = ""; private Color myColor; /** * this field can be set to temporary change the appereance of the object. * example: the user selects the object inside i ListView, then a * CommandSetSelected will be executed which sets this field in the original * {@link MetaInfos} object to not loose the original state. when the object * later is unseleted the mySelectedInfos only have to be set to null */ private MetaInfos mySelectedInfos; public MetaInfos(Object o) { shortDescr = o.getClass().toString(); } public MetaInfos() { } public String getLongDescrAsString() { if (mySelectedInfos != null) return mySelectedInfos.getLongDescrAsString(); String s = ""; for (int i = 0; i < longDescr.myLength; i++) { s = longDescr.get(i).toString() + "\n"; } return s; } public String getShortDescr() { if (mySelectedInfos != null) return mySelectedInfos.getShortDescr(); return shortDescr; } /** * This class is called by the {@link GeoObjWrapper} and will try to load * the defined {@link Drawable} for this item. It is used for a * {@link CustomItemizedOverlay} on the {@link GMap} view. * * @return */ public Drawable getOverlayIcon() { if (mySelectedInfos != null) return mySelectedInfos.getOverlayIcon(); return null; // TODO load a specified drawable (myIconId e.g.) } public void setMyIconId(int myIconId) { this.myIconId = myIconId; } public Bitmap getIcon(Context optionalContext) { if (mySelectedInfos != null) return mySelectedInfos.getIcon(optionalContext); if (myIcon != null) return myIcon; if (myIconId != 0) { myIcon = IO.loadBitmapFromId(optionalContext, myIconId); return myIcon; } if (myIconURL != null) { myIcon = IO.loadBitmapFromURL(myIconURL); return myIcon; } return loadDefaultIcon(optionalContext); } public Bitmap loadDefaultIcon(Context context) { return IO.loadBitmapFromId(context, DEFAULT_ICON); } public Color getColor() { if (mySelectedInfos != null) return mySelectedInfos.getColor(); if (myColor == null) { Log.w("", "MetaInfos.getColor(): myColor was null, so set do DEFAULT_COLOR"); myColor = DEFAULT_COLOR; } return myColor; } /** * @param searchTerm * @return -1 if searchTerm not found */ public int matchesSearchTerm(String searchTerm) { String s = getShortDescr(); if (s != null && s.toLowerCase().contains(searchTerm.toLowerCase())) return 1; s = getLongDescrAsString(); if (s != null && s.toLowerCase().contains(searchTerm.toLowerCase())) return 2; return -1; } public void addTextToLongDescr(String info) { if (info != "") longDescr.add(new InfoElement(info)); } public void addDataToLongDescr(String key, String value) { if (key != "" && value != "") longDescr.add(new InfoElement(key, value)); } public String getDataFromLongDescr(String key) { if (longDescr == null) return null; for (int i = 0; i < longDescr.myLength; i++) { InfoElement item = longDescr.get(i); if (item.key.equals(key)) return item.value; } return null; } public void setShortDescr(String name) { if (name != "") shortDescr = name; } public void extractInfos(Address a) { String s = ""; if (a.getFeatureName() != null) setShortDescr(a.getFeatureName()); else { setShortDescr(a.getAddressLine(0)); } int i = 0; for (i = 0; i < a.getMaxAddressLineIndex(); i++) { s += a.getAddressLine(i) + "\n"; } s += a.getAddressLine(i); if (a.getPostalCode() != null) s += a.getPostalCode() + " "; if (a.getSubAdminArea() != null) s += a.getSubAdminArea() + "\n"; if (a.getCountryName() != null) s += a.getCountryName(); addTextToLongDescr(s); } public void setColor(Color color) { myColor = color; } public void setTo(MetaInfos i) { setShortDescr(i.shortDescr); longDescr = i.longDescr; if (i.myColor != null) setColor(i.myColor.copy()); setMyIconId(i.myIconId); setMyIconURL(i.myIconURL); } public int getIconId() { return myIconId; } public String getIconURL() { return myIconURL; } public android.view.View getDefaultListItemView( android.view.View viewToUseIfNotNull, ViewGroup parentView) { DefaultListItemView v = null; if (viewToUseIfNotNull instanceof DefaultListItemView) { v = (DefaultListItemView) viewToUseIfNotNull; v.setToMetaInfo(v.getContext(), this); Log.d("GUI", " -> Text set to '" + "'"); return v; } v = new DefaultListItemView(parentView.getContext(), this); return v; } public MetaInfos getSelectedInfos() { return mySelectedInfos; } public boolean isSelected() { if (mySelectedInfos != null) return true; return false; } public boolean setDeselected() { if (mySelectedInfos == null) return false; mySelectedInfos = null; return true; } /** * sets the selected values (but keeps the normal values). So if the * selected infos are set to null the normal values will be still available. * This allows temporary style customization * * @param selectedInfos * {@link MetaInfos} with selected details or null to remove the * selection */ public void setSelected(MetaInfos selectedInfos) { mySelectedInfos = selectedInfos; } /** * example: normaly the item has the text 'test text'. when selected, it * should display '< TEST TEXT >' in red * * @param textPrefix * < in the example * @param textPostfix * > in the example * @param color * red in the example * @param textInfixUppercase * true if everything should be uppercase */ public void setSelected(String textPrefix, String textPostfix, Color color, boolean textInfixUppercase) { if (textPrefix == null) textPrefix = ""; if (textPostfix == null) textPostfix = ""; MetaInfos m = new MetaInfos(); if (textInfixUppercase) { m.setShortDescr(textPrefix + this.getShortDescr().toUpperCase() + textPostfix); } else { m.setShortDescr(textPrefix + this.getShortDescr() + textPostfix); } m.setColor(color); m.addTextToLongDescr(this.getLongDescrAsString()); setSelected(m); } public boolean setSelected(ItemSelectedListener myListener) { return myListener.onItemSelected(this); } public void setMyIconURL(String url) { if (url != "") myIconURL = url; } @Override public void customizeScreen(ModifierGroup group, Object message) { if (message instanceof String) { String m = (String) message; String[] keywords = { "Edit", "edit", "editscreen", "edit mode", "editmode", "Editmode" }; // TODO if (Arrays.asList(keywords).contains(m)) { getEditUI(group); return; } } getUI(group); } private void getUI(ModifierGroup group) { ModifierGroup infosGroup = new ModifierGroup(); group.addModifier(infosGroup); try { infosGroup .addModifier(new Headline(shortDescr, myColor.toIntARGB())); } catch (Exception e) { e.printStackTrace(); } ModifierGroup g2 = new ModifierGroup(); infosGroup.addModifier(g2); for (int i = 0; i < longDescr.myLength; i++) { longDescr.get(i).generateView(g2); } } private void getEditUI(ModifierGroup group) { ModifierGroup infosGroup = new ModifierGroup(); group.addModifier(infosGroup); infosGroup.addModifier(new TextModifier() { @Override public boolean save(String newValue) { shortDescr = newValue; return true; } @Override public String load() { return shortDescr; } @Override public String getVarName() { return SHORT_DISCR_NAME; } }); ModifierGroup g2 = new ModifierGroup(); infosGroup.addModifier(g2); for (int i = 0; i < longDescr.myLength; i++) { longDescr.get(i).generateEditView(g2); } if (myColor != null) { infosGroup.addModifier(new ColorModifier() { @Override public String getVarName() { return COLOR_NAME; } @Override public boolean save(int a, int r, int g, int b) { if (myColor != null) { myColor.alpha = a / 255f; myColor.red = r / 255f; myColor.green = g / 255f; myColor.blue = b / 255f; } return true; } @Override public String getAlpha() { if (myColor != null) return "" + (int) (myColor.alpha * 255); return "0"; } @Override public String getBlue() { if (myColor != null) return "" + (int) (myColor.blue * 255); return "0"; } @Override public String getGreen() { if (myColor != null) return "" + (int) (myColor.green * 255); return "0"; } @Override public String getRed() { if (myColor != null) return "" + (int) (myColor.red * 255); return "0"; } }); } } public EfficientList<InfoElement> getLongDescr() { if (mySelectedInfos != null) return mySelectedInfos.getLongDescr(); return longDescr; } }