package gueei.binding.plugin.abs.menu;
import gueei.binding.Command;
import gueei.binding.IObservable;
import android.content.Context;
import android.graphics.drawable.Drawable;
import android.util.AttributeSet;
import com.actionbarsherlock.view.Menu;
import com.actionbarsherlock.view.MenuItem;
import android.widget.AdapterView;
/**
* Mock menu item act as bridging bindable attributes
* with the real menu item
* Will not keep reference to real menu item since
* menu item might suddenly detached
* @author andy
*
*/
public class MenuItemBridge extends AbsMenuBridge{
private Command onClickCommand;
private IObservable<?> title, visible, enabled, checked, icon;
public void onCreateOptionItem(Menu menu){
}
public void onPrepareOptionItem(Menu menu){
MenuItem item = menu.findItem(mId);
if (item==null) return;
if (title!=null){
Object titleObj = title.get();
if(titleObj!=null){
// Title don't allow HTML Formatting
item.setTitle(titleObj.toString());
}else{
item.setTitle("");
}
}
if (visible!=null){
item.setVisible(Boolean.TRUE.equals(visible.get()));
}
if (enabled!=null){
item.setEnabled(Boolean.TRUE.equals(enabled.get()));
}
if (checked!=null){
item.setChecked(Boolean.TRUE.equals(checked.get()));
}
if (icon!=null){
Object iconObj = icon.get();
if (iconObj!=null){
if (iconObj instanceof Integer)
item.setIcon((Integer)iconObj);
else if (iconObj instanceof Drawable)
item.setIcon((Drawable)iconObj);
}else{
item.setIcon(null);
}
}
}
public MenuItemBridge(int id, AttributeSet attributes,
Context context, Object model){
this(id, attributes, context, model, null);
}
public MenuItemBridge(int id, AttributeSet attributes,
Context context, Object model, IMenuItemChangedCallback callback) {
super(id);
IObservable<?> temp = getObservableFromStatement(context, attributes, "onClick", model, callback);
if ((temp!=null)&&(temp.get() instanceof Command)){
onClickCommand = (Command)temp.get();
}
temp = getObservableFromStatement(context, attributes, "title", model, callback);
if ((temp!=null)){
title = temp;
}
temp = getObservableFromStatement(context, attributes, "visible", model, callback);
if ((temp!=null)){
visible = temp;
}
temp = getObservableFromStatement(context, attributes, "enabled", model, callback);
if ((temp!=null)){
enabled = temp;
}
temp = getObservableFromStatement(context, attributes, "checked", model, callback);
if ((temp!=null)){
checked = temp;
}
temp = getObservableFromStatement(context, attributes, "icon", model, callback);
if ((temp!=null)){
icon = temp;
}
}
public MenuItemBridge(int id, MenuItemViemodel model) {
super(id);
if(model == null)
return;
IObservable<?> temp = model.onClick;
if ((temp!=null)&&(temp.get() instanceof Command)){
onClickCommand = (Command)temp.get();
}
temp = model.title;
if ((temp!=null)){
title = temp;
}
temp = model.visible;
if ((temp!=null)){
visible = temp;
}
temp = model.enabled;
if ((temp!=null)){
enabled = temp;
}
temp = model.checked;
if ((temp!=null)){
checked = temp;
}
temp = model.icon;
if ((temp!=null)){
icon = temp;
}
}
@SuppressWarnings("unchecked")
@Override
public boolean onOptionsItemSelected(MenuItem item) {
boolean output = false;
if (onClickCommand!=null){
if(item.getMenuInfo() instanceof AdapterView.AdapterContextMenuInfo) {
AdapterView.AdapterContextMenuInfo cmi =
(AdapterView.AdapterContextMenuInfo) item.getMenuInfo ();
int position = cmi.position;
onClickCommand.InvokeCommand(null, item, position);
} else {
onClickCommand.InvokeCommand(null, item);
}
output = true;
}
if (checked!=null){
if (Boolean.class.isAssignableFrom(checked.getType()))
((IObservable<Boolean>)checked).set(!item.isChecked());
}
return output;
}
}