package com.csound.wizard.layout;
import java.io.InputStream;
import java.util.Iterator;
import org.json.simple.JSONObject;
import org.json.simple.JSONValue;
import android.app.Activity;
import android.content.Context;
import android.content.res.Configuration;
import android.graphics.Paint.Align;
import android.view.Gravity;
import android.view.View;
import android.widget.TextView;
import com.csound.wizard.Player;
import com.csound.wizard.Utils;
import com.csound.wizard.layout.SetLayoutParam.LayoutParent;
import com.csound.wizard.layout.Units.Unit;
import com.csound.wizard.layout.param.Param;
import com.csound.wizard.layout.param.TextParam;
import com.csound.wizard.layout.unit.Hor;
import com.csound.wizard.layout.unit.Ver;
import com.csound.wizard.model.TrackState;
public class Layout {
public static View init(Context ctx, InputStream file, Player csd, TrackState trackState) {
String text = Utils.readFile(file);
return init(ctx, text, csd, trackState);
}
public static View init(Context ctx, String text, Player csd, TrackState trackState) {
Object obj = JSONValue.parse(text);
LayoutContext context = new LayoutContext(ctx, csd);
Param defaultParam = context.getApp().getModel().getSettings().getParam();
if (obj == null) {
return errorMalformedJson(context, text, new Param());
} else {
return getView(context, obj, defaultParam, LayoutParent.NONE, trackState);
}
}
public static View getView(LayoutContext ctx, Object rawObj, Param defaultParams, LayoutParent layoutParent, TrackState trackState) {
View res = getViewNoBackground(ctx, rawObj, defaultParams, layoutParent, trackState);
res.setBackgroundColor(defaultParams.getColor().getBkgColor());
return res;
}
public static View getViewNoBackground(LayoutContext ctx, Object rawObj, Param defaultParams, LayoutParent layoutParent, TrackState trackState) {
JSONObject newDefaults = Json.getObject("set-default", rawObj);
if (newDefaults != null) {
defaultParams = Param.merge(Param.parse(newDefaults), defaultParams);
}
Param currentParams;
currentParams = Param.merge(Param.parse(rawObj), defaultParams);
if (Json.isObject(rawObj)) {
JSONObject obj = (JSONObject) rawObj;
Iterator<Unit> it = Units.units.iterator();
while (it.hasNext()) {
Unit u = it.next();
if (obj.containsKey(u.getTag())) {
return setBkgColor(SetLayoutParam.setParams(
u.getView(ctx, obj.get(u.getTag()), currentParams, defaultParams, trackState, layoutParent),
currentParams.getLayout(), layoutParent), currentParams.getColor().getBkgColor());
}
}
return defaultView(ctx, obj, currentParams);
} else if (Json.isString(rawObj)) {
return textView(ctx, (String) rawObj, currentParams);
} else if (Json.isArray(rawObj)) {
if (((Activity) ctx.getContext()).getResources().getConfiguration().orientation == Configuration.ORIENTATION_PORTRAIT) {
return new Ver().getView(ctx, rawObj, currentParams, defaultParams, trackState, layoutParent);
} else {
return new Hor().getView(ctx, rawObj, currentParams, defaultParams, trackState, layoutParent);
}
} else {
return textView(ctx, rawObj.toString(), currentParams);
}
}
private static View setBkgColor(View x, Integer bkgColor) {
x.setBackgroundColor(bkgColor);
return x;
}
public static View defaultView(LayoutContext ctx, JSONObject obj, Param param) {
return textView(ctx, obj.toJSONString(), param);
}
public static View errorMalformedJson(LayoutContext ctx, String text, Param param) {
return textView(ctx, "Error: Malformed JSON:\n\n" + text, param);
}
public static View errorMalformedUnitId(LayoutContext ctx, String text, Param param) {
return textView(ctx, "Error: Malformed Unit Id:\n\n" + text, param);
}
public static View errorMalformedUnitRange(LayoutContext ctx, String text, Param param) {
return textView(ctx, "Error: Malformed Unit Range:\n\n" + text, param);
}
public static View errorMalformedTabs(LayoutContext ctx, String text, Param param) {
return textView(ctx, "Error: Malformed Tabs:\n\n" + text, param);
}
public static View textView(LayoutContext ctx, String text, Param param) {
TextView res = new TextView(ctx.getContext());
res.setText(text);
setTextProperties(res, param.getText());
return res;
}
public static void setTextProperties(TextView tv, TextParam param) {
// text parameters
tv.setTextSize((int) (0.7f * param.getScale() * param.getSize()));
tv.setTextColor(param.getColor());
Align align = param.getAlign();
if (align.equals(Align.CENTER)) {
tv.setGravity(Gravity.CENTER);
}
if (align.equals(Align.LEFT)) {
tv.setGravity(Gravity.LEFT);
}
if (align.equals(Align.RIGHT)) {
tv.setGravity(Gravity.RIGHT);
}
}
}