Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
27 commits
Select commit Hold shift + click to select a range
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
.metadata
3 changes: 2 additions & 1 deletion Core/AndroidBinding/.classpath
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
<classpathentry kind="src" path="src"/>
<classpathentry kind="src" path="gen"/>
<classpathentry kind="con" path="com.android.ide.eclipse.adt.ANDROID_FRAMEWORK"/>
<classpathentry kind="con" path="com.android.ide.eclipse.adt.LIBRARIES"/>
<classpathentry exported="true" kind="con" path="com.android.ide.eclipse.adt.LIBRARIES"/>
<classpathentry exported="true" kind="con" path="com.android.ide.eclipse.adt.DEPENDENCIES"/>
<classpathentry kind="output" path="bin/classes"/>
</classpath>
7 changes: 3 additions & 4 deletions Core/AndroidBinding/.gitignore
Original file line number Diff line number Diff line change
@@ -1,4 +1,3 @@
gen
/**/*

bin/**/*
.settings/**/*
gen/**/*
bin/**/*
8 changes: 0 additions & 8 deletions Core/AndroidBinding/bin/AndroidManifest.xml

This file was deleted.

Binary file removed Core/AndroidBinding/bin/androidbinding.jar
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
31 changes: 24 additions & 7 deletions Core/AndroidBinding/src/gueei/binding/Attribute.java
Original file line number Diff line number Diff line change
Expand Up @@ -63,25 +63,36 @@ public void _setObject(final Object newValue, Collection<Object> initiators){

// Set to package internal for debug use
Bridge mBridge;
BindingType mBindingType = BindingType.NoBinding;

public BindingType BindTo(Context context, IObservable<?> prop) {
if (prop == null) return BindingType.NoBinding;

BindingType binding;

// Dirty fix
// Since for InnerFieldObservable, it may not know what type of it will be
// So, it assumes two way no matter what
if (prop instanceof Undetermined)
binding = BindingType.TwoWay;
mBindingType = BindingType.TwoWay;
else
binding = AcceptThisTypeAs(prop.getType());
mBindingType = AcceptThisTypeAs(prop.getType());

if (binding.equals(BindingType.NoBinding)) return binding;
if (mBindingType.equals(BindingType.NoBinding)) return mBindingType;

onBind(context, prop, binding);
onBind(context, prop, mBindingType);

return binding;
return mBindingType;
}

public void UnbindAll() {
if(mBridge == null)
return;

mBridge.unbind();
if (mBindingType.equals(BindingType.TwoWay))
this.unsubscribe(mBridge);

mBridge = null;
mBindingType = BindingType.NoBinding;
}

/*
Expand Down Expand Up @@ -122,6 +133,12 @@ public Bridge(Attribute<Th, T> attribute, IObservable<?> observable){
mBindedObservable = observable;
}

public void unbind() {
if(mBindedObservable != null)
mBindedObservable.unsubscribe(this);
mBindedObservable = null;
}

public void onPropertyChanged(IObservable<?> prop,
Collection<Object> initiators) {
if (prop==mAttribute){
Expand Down
19 changes: 19 additions & 0 deletions Core/AndroidBinding/src/gueei/binding/AttributeBinder.java
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
import gueei.binding.ISyntaxResolver.SyntaxResolveException;
import gueei.binding.bindingProviders.BindingProvider;
import gueei.binding.exception.AttributeNotDefinedException;
import gueei.binding.widgets.IBindableLayout;

import java.lang.ref.WeakReference;
import java.util.ArrayList;
Expand Down Expand Up @@ -60,6 +61,24 @@ public void bindView(Context context, View view, Object model) {
bindAttributeWithModel(context, view, entry.getKey(), entry.getValue(), model);
}
}

public void unbindView(Context context, View view) {
BindingMap map = Binder.getBindingMapForView(view);

for(Entry<String, String> entry: map.getMapTable().entrySet()){
ViewAttribute<?, ?> attr;
try {
attr = Binder.getAttributeForView(view, entry.getKey());
if(view instanceof IBindableLayout) {
((IBindableLayout)view).unbind();
}
attr.UnbindAll();
} catch (AttributeNotDefinedException e) {
continue;
}

}
}

public boolean bindAttributeWithModel(Context context,
View view, String viewAttributeName, String statement, Object model) {
Expand Down
4 changes: 4 additions & 0 deletions Core/AndroidBinding/src/gueei/binding/Binder.java
Original file line number Diff line number Diff line change
Expand Up @@ -53,6 +53,10 @@ public static View bindView(Context context, InflateResult inflatedView, Object
return _kernel.bindView(context, inflatedView, model);
}

public static void unbindView(Context context, InflateResult inflatedView){
_kernel.unbindView(context, inflatedView);
}

public static void init(Application application){
init(application, new DefaultKernel());
}
Expand Down
9 changes: 9 additions & 0 deletions Core/AndroidBinding/src/gueei/binding/Converter.java
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,16 @@ public boolean ConvertBack(Object value, Object[] outResult) {
public void setContext(Context context){
mContext = context;
}

public Context getContext(){
return mContext;
}

@Override
public void unsubscribe(Observer o){
super.unsubscribe(o);
if(!hasObservers())
setContext(null);
}

}
18 changes: 18 additions & 0 deletions Core/AndroidBinding/src/gueei/binding/DependentObservable.java
Original file line number Diff line number Diff line change
Expand Up @@ -71,4 +71,22 @@ public boolean isDirty() {
public void setDirty(boolean dirty) {
this.dirty = dirty;
}

@Override
public void unsubscribe(Observer o){
super.unsubscribe(o);

if(hasObservers())
return;

if(mDependents == null)
return;

int len = mDependents.length;
for(int i=0; i<len; i++){
mDependents[i].unsubscribe(this);
}

mDependents = null;
}
}
1 change: 1 addition & 0 deletions Core/AndroidBinding/src/gueei/binding/IKernel.java
Original file line number Diff line number Diff line change
Expand Up @@ -48,6 +48,7 @@ public interface IKernel {
* @return RootView of the binded view
*/
public View bindView(Context context, InflateResult inflatedView, Object model);
public void unbindView(Context context, InflateResult inflatedView);
public <T extends ViewMulticastListener<?>> T getMulticastListenerForView(View view, Class<T> listenerType);
public void init(Application application);

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -151,7 +151,7 @@ public final void notifyChanged(Object initiator){
public final void notifyChanged(Collection<Object> initiators){
initiators.add(this);
for(Object o: observers.toArray()){
if (initiators.contains(o)) continue;
if (initiators.contains(o) || o == null) continue;
((Observer)o).onPropertyChanged(this, initiators);
}
}
Expand Down
6 changes: 5 additions & 1 deletion Core/AndroidBinding/src/gueei/binding/Observable.java
Original file line number Diff line number Diff line change
Expand Up @@ -55,7 +55,7 @@ public final void notifyChanged(Object initiator){
public final void notifyChanged(Collection<Object> initiators){
initiators.add(this);
for(Object o: observers.toArray()){
if (initiators.contains(o)) continue;
if (initiators.contains(o) || o == null) continue;
((Observer)o).onPropertyChanged(this, initiators);
}
}
Expand Down Expand Up @@ -121,4 +121,8 @@ public Observer[] getAllObservers() {
public boolean isNull() {
return mValue==null;
}

public boolean hasObservers() {
return observers.size() > 0;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -20,9 +20,15 @@ public TwoWayDependentObservable(Class<T> type, IObservable<?>... dependents){
protected void doSetValue(T newValue, Collection<Object> initiators) {
int count = mDependents.length;
Object[] outResult = new Object[count];
for(int i=0; i<count; i++){
// fill with current values
outResult[i] = mDependents[i].get();
}
if (!ConvertBack(newValue, outResult)) return;
for(int i=0; i<count; i++){
mDependents[i]._setObject(outResult[i], initiators);
// only set values if not equals
if( !mDependents[i].equals(outResult[i]))
mDependents[i]._setObject(outResult[i], initiators);
}
}
}
2 changes: 2 additions & 0 deletions Core/AndroidBinding/src/gueei/binding/app/BindingWidget.java
Original file line number Diff line number Diff line change
Expand Up @@ -19,4 +19,6 @@ public static Dialog createAndBindDialog(Context context, int layoutId, Object c
return dialog;
}

// TODO: add unbind - or create a derived Dialog View with automaticually unbinding.

}
Original file line number Diff line number Diff line change
@@ -1,77 +1,82 @@
package gueei.binding.bindingProviders;

import gueei.binding.ViewAttribute;
import gueei.binding.viewAttributes.textView.CheckedClickableTextViewAttribute;
import gueei.binding.viewAttributes.textView.CheckedTextViewAttribute;
import gueei.binding.viewAttributes.textView.CompoundDrawableViewAttribute;
import gueei.binding.viewAttributes.textView.MaxLinesViewAttribute;
import gueei.binding.viewAttributes.textView.MinLinesViewAttribute;
import gueei.binding.viewAttributes.textView.OnTextChangedViewEvent;
import gueei.binding.viewAttributes.textView.TextColorViewAttribute;
import gueei.binding.viewAttributes.textView.TextViewAttribute;
import gueei.binding.viewAttributes.textView.TypefaceViewAttribute;
import android.view.View;
import android.widget.CheckedTextView;
import android.widget.EditText;
import android.widget.TextView;


public class TextViewProvider extends BindingProvider {

@SuppressWarnings("unchecked")
@Override
public <Tv extends View>ViewAttribute<Tv, ?> createAttributeForView(View view, String attributeId) {
if (view instanceof CheckedTextView) {
if (attributeId.equals("checked")){
CheckedTextViewAttribute attr = new CheckedTextViewAttribute((CheckedTextView)view);
return (ViewAttribute<Tv, ?>) attr;
}
if (attributeId.equals("checkedClickable")){
CheckedClickableTextViewAttribute attr = new CheckedClickableTextViewAttribute((CheckedTextView)view);
return (ViewAttribute<Tv, ?>) attr;
}
}
if (!(view instanceof TextView)) return null;
if (attributeId.equals("text")){
TextViewAttribute attr = new TextViewAttribute((TextView)view, "text");
return (ViewAttribute<Tv, ?>) attr;
}
if (attributeId.equals("minLines")){
return (ViewAttribute<Tv, ?>) new MinLinesViewAttribute((TextView)view);
}
if (attributeId.equals("maxLines")){
return (ViewAttribute<Tv, ?>) new MaxLinesViewAttribute((TextView)view);
}
if (attributeId.equals("textColor")){
TextColorViewAttribute attr = new TextColorViewAttribute((TextView)view);
return (ViewAttribute<Tv, ?>) attr;
}
if (attributeId.equals("onTextChanged")){
if (view instanceof EditText){
return (ViewAttribute<Tv, ?>) (new OnTextChangedViewEvent((EditText)view));
}
}
if (attributeId.equals("typeface")){
TypefaceViewAttribute attr = new TypefaceViewAttribute((TextView)view);
return (ViewAttribute<Tv, ?>) attr;
}
if (attributeId.equals("drawableLeft")){
CompoundDrawableViewAttribute attr = new CompoundDrawableViewAttribute((TextView)view, "drawableLeft");
return (ViewAttribute<Tv, ?>) attr;
}
if (attributeId.equals("drawableTop")){
CompoundDrawableViewAttribute attr = new CompoundDrawableViewAttribute((TextView)view, "drawableTop");
return (ViewAttribute<Tv, ?>) attr;
}
if (attributeId.equals("drawableRight")){
CompoundDrawableViewAttribute attr = new CompoundDrawableViewAttribute((TextView)view, "drawableRight");
return (ViewAttribute<Tv, ?>) attr;
}
if (attributeId.equals("drawableBottom")){
CompoundDrawableViewAttribute attr = new CompoundDrawableViewAttribute((TextView)view, "drawableBottom");
return (ViewAttribute<Tv, ?>) attr;
}

return null;
}
package gueei.binding.bindingProviders;

import gueei.binding.ViewAttribute;
import gueei.binding.viewAttributes.textView.CheckedClickableTextViewAttribute;
import gueei.binding.viewAttributes.textView.CheckedTextViewAttribute;
import gueei.binding.viewAttributes.textView.CompoundDrawableViewAttribute;
import gueei.binding.viewAttributes.textView.MaxLinesViewAttribute;
import gueei.binding.viewAttributes.textView.MinLinesViewAttribute;
import gueei.binding.viewAttributes.textView.OnTextChangedViewEvent;
import gueei.binding.viewAttributes.textView.TextAppearanceViewAttribute;
import gueei.binding.viewAttributes.textView.TextColorViewAttribute;
import gueei.binding.viewAttributes.textView.TextViewAttribute;
import gueei.binding.viewAttributes.textView.TypefaceViewAttribute;
import android.view.View;
import android.widget.CheckedTextView;
import android.widget.EditText;
import android.widget.TextView;


public class TextViewProvider extends BindingProvider {

@SuppressWarnings("unchecked")
@Override
public <Tv extends View>ViewAttribute<Tv, ?> createAttributeForView(View view, String attributeId) {
if (view instanceof CheckedTextView) {
if (attributeId.equals("checked")){
CheckedTextViewAttribute attr = new CheckedTextViewAttribute((CheckedTextView)view);
return (ViewAttribute<Tv, ?>) attr;
}
if (attributeId.equals("checkedClickable")){
CheckedClickableTextViewAttribute attr = new CheckedClickableTextViewAttribute((CheckedTextView)view);
return (ViewAttribute<Tv, ?>) attr;
}
}
if (!(view instanceof TextView)) return null;
if (attributeId.equals("text")){
TextViewAttribute attr = new TextViewAttribute((TextView)view, "text");
return (ViewAttribute<Tv, ?>) attr;
}
if (attributeId.equals("minLines")){
return (ViewAttribute<Tv, ?>) new MinLinesViewAttribute((TextView)view);
}
if (attributeId.equals("maxLines")){
return (ViewAttribute<Tv, ?>) new MaxLinesViewAttribute((TextView)view);
}
if (attributeId.equals("textColor")){
TextColorViewAttribute attr = new TextColorViewAttribute((TextView)view);
return (ViewAttribute<Tv, ?>) attr;
}
if (attributeId.equals("textAppearance")){
TextAppearanceViewAttribute attr = new TextAppearanceViewAttribute((TextView)view);
return (ViewAttribute<Tv, ?>) attr;
}
if (attributeId.equals("onTextChanged")){
if (view instanceof EditText){
return (ViewAttribute<Tv, ?>) (new OnTextChangedViewEvent((EditText)view));
}
}
if (attributeId.equals("typeface")){
TypefaceViewAttribute attr = new TypefaceViewAttribute((TextView)view);
return (ViewAttribute<Tv, ?>) attr;
}
if (attributeId.equals("drawableLeft")){
CompoundDrawableViewAttribute attr = new CompoundDrawableViewAttribute((TextView)view, "drawableLeft");
return (ViewAttribute<Tv, ?>) attr;
}
if (attributeId.equals("drawableTop")){
CompoundDrawableViewAttribute attr = new CompoundDrawableViewAttribute((TextView)view, "drawableTop");
return (ViewAttribute<Tv, ?>) attr;
}
if (attributeId.equals("drawableRight")){
CompoundDrawableViewAttribute attr = new CompoundDrawableViewAttribute((TextView)view, "drawableRight");
return (ViewAttribute<Tv, ?>) attr;
}
if (attributeId.equals("drawableBottom")){
CompoundDrawableViewAttribute attr = new CompoundDrawableViewAttribute((TextView)view, "drawableBottom");
return (ViewAttribute<Tv, ?>) attr;
}

return null;
}
}
Loading