package gueei.binding.v30.viewAttributes.absListView; import gueei.binding.Binder; import gueei.binding.BindingLog; import gueei.binding.DynamicObject; import gueei.binding.IObservable; import gueei.binding.Observer; import gueei.binding.ViewAttribute; import gueei.binding.exception.AttributeNotDefinedException; import gueei.binding.v30.listeners.MultiChoiceModeListenerMulticast; import gueei.binding.v30.widget.ActionModeBinder; import java.util.Collection; import android.content.Context; import android.view.ActionMode; import android.view.Menu; import android.view.MenuItem; import android.widget.AbsListView; public class MultiChoiceMode extends ViewAttribute<AbsListView, DynamicObject> implements AbsListView.MultiChoiceModeListener{ private int mMenuId; private Object mModel; private IObservable<?> mTitle; ListViewMultiChoiceActionModeBinder binder; public MultiChoiceMode(AbsListView view) { super(DynamicObject.class, view, "multiChoiceMode"); Binder.getMulticastListenerForView(view, MultiChoiceModeListenerMulticast.class) .register(this); try { Binder.getAttributeForView(view, "modalCheckedItemPositions") .subscribe(checkedItemPositionsWatcher); } catch (AttributeNotDefinedException e) { e.printStackTrace(); } } @Override protected void doSetAttributeValue(Object newValue) { try { DynamicObject obj = (DynamicObject)newValue; mMenuId = (Integer)obj.getObservableByName("menu").get(); mModel = obj.getObservableByName("model").get(); mTitle = obj.getObservableByName("title"); } catch (Exception e) { BindingLog.warning("MultiChoiceMode", "Dynamic Object format error; it should be {menu, model}"); } } @Override public DynamicObject get() { return null; } private Observer checkedItemPositionsWatcher = new Observer(){ public void onPropertyChanged(IObservable<?> prop, Collection<Object> initiators) { if (getView().getCheckedItemCount() >0 ) return; if (binder!=null && binder.getActionMode()!=null){ binder.getActionMode().finish(); } } }; private class ListViewMultiChoiceActionModeBinder extends ActionModeBinder implements AbsListView.MultiChoiceModeListener{ protected ListViewMultiChoiceActionModeBinder(Context context, int menuResId, Object model, IObservable<?> title) { super(context, menuResId, model, title); } public void onItemCheckedStateChanged(ActionMode mode, int position, long id, boolean checked) { } } public boolean onActionItemClicked(ActionMode mode, MenuItem item) { if (binder!=null) return binder.onActionItemClicked(mode, item); return false; } public boolean onCreateActionMode(ActionMode mode, Menu menu) { binder = new ListViewMultiChoiceActionModeBinder(getView().getContext(), mMenuId, mModel, mTitle); if (binder!=null) return binder.onCreateActionMode(mode, menu); return false; } public void onDestroyActionMode(ActionMode mode) { if (binder!=null) binder.onDestroyActionMode(mode); } public boolean onPrepareActionMode(ActionMode mode, Menu menu) { if (binder!=null) return binder.onPrepareActionMode(mode, menu); return false; } public void onItemCheckedStateChanged(ActionMode mode, int position, long id, boolean checked) { if (binder!=null) binder.onItemCheckedStateChanged(mode, position, id, checked); } }