package com.ese2013.mensaunibe.menu;
import java.util.ArrayList;
import android.content.Context;
import android.content.Intent;
import android.view.LayoutInflater;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.View.OnLongClickListener;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.LinearLayout;
import android.widget.RelativeLayout;
import android.widget.TextView;
import android.widget.Toast;
import com.ese2013.mensaunibe.R;
import com.ese2013.mensaunibe.model.Model;
import com.ese2013.mensaunibe.model.menu.DailyMenu;
import com.ese2013.mensaunibe.model.menu.MenuDate;
import com.ese2013.mensaunibe.model.menu.Menuplan;
import com.ese2013.mensaunibe.model.utils.AppUtils;
import com.ese2013.mensaunibe.model.utils.ListItem;
import com.ese2013.mensaunibe.model.utils.ListSectionItem;
/**
* @author group7
* @author Sandor Torok
* @author Andreas Hohler
*/
public class MenuListAdapter extends BaseAdapter{
TitleListener mCallback;
private Context context;
private int resource;
private LayoutInflater inflater;
private ArrayList<ListItem> items;
private ArrayList<Menuplan> mMenus;
private int mMensaId;
private int mFirstOrAll;
public MenuListAdapter(Context context, int resource, int mensaId, int firstOrAll) {
super();
this.context = context;
this.resource = resource;
mMensaId = mensaId;
mFirstOrAll = firstOrAll;
attachListener();
populate(firstOrAll);
}
private void attachListener() {
try {
mCallback = (TitleListener) context;
} catch (ClassCastException e) {
throw new ClassCastException(context.toString()
+ " must implement TitleListener");
}
}
public View getView(int position, View convertView, ViewGroup parent) {
View view = convertView;
if(view == null) {
inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
view = inflater.inflate(this.resource, parent, false);
ViewHolder viewHolder = new ViewHolder();
viewHolder.date = (TextView) view.findViewById(R.id.menu_date);
viewHolder.title = (TextView) view.findViewById(R.id.menu_title);
viewHolder.text = (TextView) view.findViewById(R.id.menu_text);
viewHolder.item = (RelativeLayout) view.findViewById(R.id.menu_list_item);
viewHolder.section_item = (LinearLayout) view.findViewById(R.id.menu_list_section_item);
view.setTag(viewHolder);
}
ViewHolder holder = (ViewHolder) view.getTag();
//list is not consistent, if we don't clear the holder
clearHolder(holder);
ListItem item = items.get(position);
if(item.isSection()) {
ListSectionItem si = (ListSectionItem) item;
holder.date.setLongClickable(false);
holder.date.setText(si.toString());
holder.date.setVisibility(View.VISIBLE);
holder.section_item.setVisibility(View.VISIBLE);
} else {
DailyMenu dm = (DailyMenu) item;
holder.title.setText(dm.getTitle());
holder.title.setVisibility(View.VISIBLE);
holder.text.setText(dm.getMenu());
holder.text.setVisibility(View.VISIBLE);
holder.item.setVisibility(View.VISIBLE);
view.setOnClickListener( new MenuOnClickListener( dm.getMenu() ) );
view.setOnLongClickListener( new MenuOnLongClickListener () );
}
return view;
}
/**
* OnClickListener on Menu-Item.
* @author Andreas Hohler
*/
private class MenuOnLongClickListener implements OnLongClickListener {
@Override
public boolean onLongClick(View v) {
Toast.makeText(v.getContext(), context.getString(R.string.menu_hint), Toast.LENGTH_SHORT).show();
return true;
}
}
private class MenuOnClickListener implements OnClickListener {
private String title;
public MenuOnClickListener(String title) {
this.title = title;
}
@Override
public void onClick(View view) {
Intent intent = new Intent();
intent.setClass(context, RatingActivity.class);
intent.putExtra("menu", this.title);
intent.putExtra(AppUtils.MENSA_ID, mMensaId);
context.startActivity(intent);
}
}
/**
* clears all views in a ViewHolder and hide them.
* @param ViewHolder
*/
private void clearHolder(ViewHolder holder) {
holder.date.setText("");
holder.date.setVisibility(View.GONE);
holder.title.setText("");
holder.title.setVisibility(View.GONE);
holder.text.setText("");
holder.text.setVisibility(View.GONE);
holder.item.setVisibility(View.GONE);
holder.section_item.setVisibility(View.GONE);
}
/**
* populates the menu list.
* @param firstOrAll: if only one day should be displayed
*/
private void populate(int firstOrAll) {
//fill
this.items = new ArrayList<ListItem>();
boolean firstrun = true;
mMenus = Model.getInstance().getComingDaysMenu(mMensaId);
for(Menuplan m : mMenus) {
//skip first menuplan
if(firstrun && firstOrAll == AppUtils.ALL_EXCEPT_FIRST){
firstrun = false;
continue;
}
//first item will be also the tab title
if(items.isEmpty()){
notifyListeners(m.getDate());
}
items.add(new ListSectionItem(m.getDate().toText(false)));
for (DailyMenu dm : m){
if(dm != null)items.add(dm);
}
if(firstOrAll == AppUtils.FIRST_MENU) break;//stop if we need just first menuplan
}
}
private void notifyListeners(MenuDate date) {
String tabTitle = "";
if(AppUtils.FIRST_MENU != mFirstOrAll) tabTitle += context.getString(R.string.from)+" ";
tabTitle +=date.toText(true);
mCallback.updateTiteListener(tabTitle, mFirstOrAll);
}
public long getItemId(int position) {
return position;
}
public int getCount() {
return items.size();
}
@Override
public DailyMenu getItem(int position) {
if(!items.get(position).isSection()) {
return (DailyMenu) items.get(position);
}
return null;
}
public interface TitleListener {
public void updateTiteListener(String tabTitle, int firstMenu);
}
/**
* @author group7
* @author Sandor Torok
* Just holds the TextView variables (pattern)
*/
static class ViewHolder {
public TextView date;
public TextView title;
public TextView text;
public RelativeLayout item;
public LinearLayout section_item;
}
}