package mobi.monaca.framework.nativeui.component;
import java.util.Iterator;
import java.util.Map;
import mobi.monaca.framework.nativeui.UIContext;
import mobi.monaca.framework.nativeui.UIValidator;
import mobi.monaca.framework.nativeui.exception.DuplicateIDException;
import mobi.monaca.framework.nativeui.exception.KeyNotValidException;
import mobi.monaca.framework.nativeui.exception.NativeUIException;
import org.json.JSONException;
import org.json.JSONObject;
import android.text.TextUtils;
import android.view.View;
public abstract class Component {
// private static final String TAG = Component.class.getSimpleName();
protected UIContext uiContext;
protected JSONObject componentJSON;
protected JSONObject style;
public Component(UIContext uiContext, JSONObject componentJSON) throws KeyNotValidException, DuplicateIDException, JSONException {
this.uiContext = uiContext;
if(componentJSON == null){
componentJSON = new JSONObject();
}
this.componentJSON = componentJSON;
addIDtoComponentIDsMap();
mixStyleWithDefault();
validate();
}
protected void addIDtoComponentIDsMap() throws DuplicateIDException {
Map<String, Component> componentIDsMap = uiContext.getComponentIDsMap();
String id = getComponentJSON().optString("id");
if (!TextUtils.isEmpty(id)) {
if (!componentIDsMap.containsKey(id)) {
componentIDsMap.put(id, this);
} else {
String components[] = { componentIDsMap.get(id).getComponentName(), getComponentName() };
DuplicateIDException exception = new DuplicateIDException(id, components);
throw exception;
}
}
}
public abstract String getComponentName();
public abstract String[] getValidKeys();
public abstract View getView();
public abstract void updateStyle(JSONObject update) throws NativeUIException;
public abstract JSONObject getDefaultStyle();
public JSONObject getComponentJSON() {
return componentJSON;
}
public JSONObject getStyle() {
return style;
}
private void mixStyleWithDefault() throws JSONException {
this.style = getComponentJSON().optJSONObject("style");
style = style != null ? style : new JSONObject();
JSONObject mixed = getDefaultStyle();
Iterator<String> keys = style.keys();
while (keys.hasNext()) {
String key = keys.next();
try {
mixed.put(key, style.get(key));
} catch (JSONException e) {
throw new RuntimeException(e);
}
}
JSONObject androidStyle = getComponentJSON().optJSONObject("androidStyle");
if (androidStyle != null) {
keys = androidStyle.keys();
while (keys.hasNext()) {
String key = keys.next();
mixed.put(key, androidStyle.get(key));
}
}
this.style = mixed;
}
public void validate() throws KeyNotValidException {
validateKeyNotValid();
}
private void validateKeyNotValid() throws KeyNotValidException {
UIValidator.validateKey(uiContext, getComponentName(), componentJSON, getValidKeys());
}
public static final int BUTTON_TEXT_DIP = 14;
public static final int LABEL_TEXT_DIP = 14;
public static final int TAB_TEXT_DIP = 14;
public static final int SEGMENT_TEXT_DIP = 14;
public static final int BIG_TITLE_TEXT_DIP = 18;
public static final int SUBTITLE_TEXT_DIP = 12;
public static final int TITLE_TEXT_DIP = 18;
public static final int TAB_BADGE_TEXT_DIP = 9;
public static final int SPINNER_TEXT_DIP = 10;
}