package com.darvds.ribbonmenu;
import java.util.ArrayList;
import org.xmlpull.v1.XmlPullParser;
import android.content.Context;
import android.content.res.XmlResourceParser;
import android.os.Parcel;
import android.os.Parcelable;
import android.util.AttributeSet;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.view.animation.AnimationUtils;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.BaseAdapter;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.ListView;
import android.widget.TextView;
import com.actionbarsherlock.R;
// TODO: Auto-generated Javadoc
/**
* The Class RibbonMenuView.
*/
public class RibbonMenuView extends LinearLayout {
/** The rbm list view. */
private ListView rbmListView;
/** The rbm outside view. */
private View rbmOutsideView;
/** The callback. */
private iRibbonMenuCallback callback;
/** The menu items. */
private static ArrayList<RibbonMenuItem> menuItems;
/**
* Instantiates a new ribbon menu view.
*
* @param context the context
*/
public RibbonMenuView(Context context) {
super(context);
load();
}
/**
* Instantiates a new ribbon menu view.
*
* @param context the context
* @param attrs the attrs
*/
public RibbonMenuView(Context context, AttributeSet attrs) {
super(context, attrs);
load();
}
/**
* Load.
*/
private void load(){
if(isInEditMode()) return;
inflateLayout();
initUi();
}
/**
* Inflate layout.
*/
private void inflateLayout(){
try{
LayoutInflater.from(getContext()).inflate(R.layout.rbm_menu, this, true);
} catch(Exception e){
}
}
/**
* Inits the ui.
*/
private void initUi(){
rbmListView = (ListView) findViewById(R.id.rbm_listview);
rbmOutsideView = (View) findViewById(R.id.rbm_outside_view);
rbmOutsideView.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
hideMenu();
}
});
rbmListView.setOnItemClickListener(new OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view,
int position, long id) {
if(callback != null)
callback.RibbonMenuItemClick(menuItems.get(position).id);
hideMenu();
}
});
}
/**
* Sets the menu click callback.
*
* @param callback the new menu click callback
*/
public void setMenuClickCallback(iRibbonMenuCallback callback){
this.callback = callback;
}
/**
* Sets the menu items.
*
* @param menu the new menu items
*/
public void setMenuItems(int menu){
parseXml(menu);
if(menuItems != null && menuItems.size() > 0)
{
rbmListView.setAdapter(new Adapter());
}
}
/**
* Sets the background resource.
*
* @param resource the new background resource
*/
public void setBackgroundResource(int resource){
rbmListView.setBackgroundResource(resource);
}
/**
* Show menu.
*/
public void showMenu(){
rbmOutsideView.setVisibility(View.VISIBLE);
rbmListView.setVisibility(View.VISIBLE);
rbmListView.startAnimation(AnimationUtils.loadAnimation(getContext(), R.anim.rbm_in_from_left));
}
/**
* Hide menu.
*/
public void hideMenu(){
rbmOutsideView.setVisibility(View.GONE);
rbmListView.setVisibility(View.GONE);
rbmListView.startAnimation(AnimationUtils.loadAnimation(getContext(), R.anim.rbm_out_to_left));
}
/**
* Toggle menu.
*/
public void toggleMenu(){
if(rbmOutsideView.getVisibility() == View.GONE){
showMenu();
} else {
hideMenu();
}
}
/**
* Parses the xml.
*
* @param menu the menu
*/
private void parseXml(int menu){
menuItems = new ArrayList<RibbonMenuView.RibbonMenuItem>();
try{
XmlResourceParser xpp = getResources().getXml(menu);
xpp.next();
int eventType = xpp.getEventType();
while(eventType != XmlPullParser.END_DOCUMENT){
if(eventType == XmlPullParser.START_TAG){
String elemName = xpp.getName();
if(elemName.equals("item")){
String textId = xpp.getAttributeValue("http://schemas.android.com/apk/res/android", "title");
String iconId = xpp.getAttributeValue("http://schemas.android.com/apk/res/android", "icon");
String resId = xpp.getAttributeValue("http://schemas.android.com/apk/res/android", "id");
RibbonMenuItem item = new RibbonMenuItem();
item.id = Integer.valueOf(resId.replace("@", ""));
item.text = resourceIdToString(textId);
item.icon = Integer.valueOf(iconId.replace("@", ""));
menuItems.add(item);
}
}
eventType = xpp.next();
}
} catch(Exception e){
e.printStackTrace();
}
}
/**
* Resource id to string.
*
* @param text the text
* @return the string
*/
private String resourceIdToString(String text){
if(!text.contains("@")){
return text;
} else {
String id = text.replace("@", "");
return getResources().getString(Integer.valueOf(id));
}
}
/**
* Checks if is menu visible.
*
* @return true, if is menu visible
*/
public boolean isMenuVisible(){
return rbmOutsideView.getVisibility() == View.VISIBLE;
}
/**
* On restore instance state.
*
* @param state the state
*/
@Override
protected void onRestoreInstanceState(Parcelable state) {
SavedState ss = (SavedState)state;
super.onRestoreInstanceState(ss.getSuperState());
if (ss.bShowMenu)
showMenu();
else
hideMenu();
}
/**
* On save instance state.
*
* @return the parcelable
*/
@Override
protected Parcelable onSaveInstanceState() {
Parcelable superState = super.onSaveInstanceState();
SavedState ss = new SavedState(superState);
ss.bShowMenu = isMenuVisible();
return ss;
}
/**
* The Class SavedState.
*/
static class SavedState extends BaseSavedState {
/** The b show menu. */
boolean bShowMenu;
/**
* Instantiates a new saved state.
*
* @param superState the super state
*/
SavedState(Parcelable superState) {
super(superState);
}
/**
* Instantiates a new saved state.
*
* @param in the in
*/
private SavedState(Parcel in) {
super(in);
bShowMenu = (in.readInt() == 1);
}
/* (non-Javadoc)
* @see android.view.AbsSavedState#writeToParcel(android.os.Parcel, int)
*/
@Override
public void writeToParcel(Parcel out, int flags) {
super.writeToParcel(out, flags);
out.writeInt(bShowMenu ? 1 : 0);
}
/** The Constant CREATOR. */
public static final Parcelable.Creator<SavedState> CREATOR
= new Parcelable.Creator<SavedState>() {
public SavedState createFromParcel(Parcel in) {
return new SavedState(in);
}
public SavedState[] newArray(int size) {
return new SavedState[size];
}
};
}
/**
* The Class RibbonMenuItem.
*/
class RibbonMenuItem{
/** The id. */
int id;
/** The text. */
String text;
/** The icon. */
int icon;
}
/**
* The Class Adapter.
*/
private class Adapter extends BaseAdapter {
/** The inflater. */
private LayoutInflater inflater;
/**
* Instantiates a new adapter.
*/
public Adapter(){
inflater = LayoutInflater.from(getContext());
}
/* (non-Javadoc)
* @see android.widget.Adapter#getCount()
*/
@Override
public int getCount() {
return menuItems.size();
}
/* (non-Javadoc)
* @see android.widget.Adapter#getItem(int)
*/
@Override
public Object getItem(int position) {
return null;
}
/* (non-Javadoc)
* @see android.widget.Adapter#getItemId(int)
*/
@Override
public long getItemId(int position) {
return 0;
}
/* (non-Javadoc)
* @see android.widget.Adapter#getView(int, android.view.View, android.view.ViewGroup)
*/
@Override
public View getView(int position, View convertView, ViewGroup parent) {
final ViewHolder holder;
if(convertView == null || convertView instanceof TextView){
convertView = inflater.inflate(R.layout.rbm_item, null);
holder = new ViewHolder();
holder.image = (ImageView) convertView.findViewById(R.id.rbm_item_icon);
holder.text = (TextView) convertView.findViewById(R.id.rbm_item_text);
convertView.setTag(holder);
} else {
holder = (ViewHolder) convertView.getTag();
}
holder.image.setImageResource(menuItems.get(position).icon);
holder.text.setText(menuItems.get(position).text);
return convertView;
}
/**
* The Class ViewHolder.
*/
class ViewHolder {
/** The text. */
TextView text;
/** The image. */
ImageView image;
}
}
}