package gueei.binding;
import java.lang.reflect.Field;
import android.util.Log;
import android.view.View;
public class Debugger {
public static void graphView(View view, int level, Printer printer, Object caller){
if (view == null) return;
if (printer==null) printer = new Printer(level);
if (level<=0) return;
printer.println("view: " + view.toString(), level);
AttributeCollection collection = Binder.getAttributeCollectionOfView(view);
for (ViewAttribute<?,?> attr : collection.getAllAttributes()){
if (attr == caller) continue;
graphAttribute(attr, level-1, printer, view);
}
}
public static void graphAttribute(ViewAttribute<?, ?> attr, int level,
Printer printer, Object caller) {
if (attr == null)return;
if (printer==null) printer = new Printer(level);
if (level <=0) return;
printer.println("attribute: " + attr + "\tvalue: " + attr.get(), level);
IObservable<?> observable = attr.getBindedObservable();
if (observable==null){
printer.println("not binded", level);
return;
}
if (attr.getView()!=caller){
graphView(attr.getView(), level-1, printer, attr.mBridge);
}
if (observable!=caller){
graphObservable(observable, level-1, printer, attr.mBridge);
}
}
public static void graphObservable(IObservable<?> observable, int level,
Printer printer, Object caller) {
if (observable == null)return;
if (printer==null) printer = new Printer(level);
if (level <=0) return;
printer.println("observable: " + observable+ "\tvalue: " + observable.get(), level);
for(Observer observer: observable.getAllObservers()){
if (observer==caller) continue;
graphObject(observer, level-1, printer, observable);
}
}
public static void graphObject(Object object, int level,
Printer printer, Object caller) {
if (object == null)return;
if (printer==null) printer = new Printer(level);
if (level <=0) return;
if (object instanceof IObservable){
graphObservable((IObservable<?>)object, level, printer, caller);
return;
}
printer.println("object: " + object.getClass().getName() + "\ttoString: " + object.toString(), level);
// get all fields
for(Field f: object.getClass().getDeclaredFields()){
if (!IObservable.class.isAssignableFrom(f.getType()))
continue;
try {
IObservable<?> obs = (IObservable<?>)f.get(object);
if (obs==caller) continue;
graphObservable(obs, level-1, printer, object);
} catch (Exception e) {
e.printStackTrace();
}
}
}
public static class Printer{
final int mTotalLevel;
public Printer(int totalLevel){
mTotalLevel = totalLevel;
}
public void println(String message, int level){
String output = "";
for(int i=mTotalLevel; i>level; i--){
output += "\t";
}
Log.v("BinderV30", output + message);
}
public void printSeparator(int level){
println("-----------------------", level);
}
}
}