package edu.mit.mitmobile2;
import java.util.ArrayList;
import android.content.Context;
import android.util.AttributeSet;
import android.view.LayoutInflater;
import android.view.View;
import android.widget.FrameLayout;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.TextView;
public class MITTitleBar extends LinearLayout {
private LinearLayout mContainer;
private ImageView mHomeBtn;
private TextView mModuleHomeBtn;
private ImageView mOverflowBtn;
private LinearLayout mPrimaryList;
private ArrayList<MITMenuItem> mPrimaryItems;
private ArrayList<MITMenuItem> mSecondaryItems;
private LayoutInflater mInflater;
private OnMITTitleBarListener mClickListener;
private MITPopupMenu mPopoverMenu;
private int mPrimaryItemsShowing = 0;
private int mPrimaryItemWidth;
private int mOverflowButtonWidth;
public MITTitleBar(Context context) {
this(context, null);
}
public MITTitleBar(Context context, AttributeSet attrs) {
super(context, attrs);
// TODO Auto-generated constructor stub
mPrimaryItems = new ArrayList<MITMenuItem>();
mSecondaryItems = new ArrayList<MITMenuItem>();
mInflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
mContainer = (LinearLayout) mInflater.inflate(R.layout.mit_title_bar, this);
mContainer.setOrientation(LinearLayout.VERTICAL);
mHomeBtn = (ImageView) mContainer.findViewById(R.id.titleHomeBtn);
mModuleHomeBtn = (TextView) mContainer.findViewById(R.id.titleModuleHomeBtn);
mPrimaryList = (LinearLayout) mContainer.findViewById(R.id.titlePrimaryList);
mOverflowBtn = (ImageView) mContainer.findViewById(R.id.titleOverflowBtn);
mOverflowBtn.setVisibility(View.GONE);
mHomeBtn.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
mClickListener.onHomeSelected();
}
});
mModuleHomeBtn.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
mClickListener.onModuleHomeSelected();
}
});
mPrimaryItemWidth = getContext().getResources().getDimensionPixelSize(R.dimen.titleBarPrimaryItemWidth);
mPrimaryItemWidth += getContext().getResources().getDimensionPixelSize(R.dimen.titleBarPadding) * 2;
mOverflowButtonWidth = getContext().getResources().getDimensionPixelSize(R.dimen.titleBarOverflowItemWidth);
mOverflowButtonWidth += getContext().getResources().getDimensionPixelSize(R.dimen.titleBarPadding) * 2;
initPopupMenu();
}
public void setTextForModuleBtn(int resId) {
mModuleHomeBtn.setText(resId);
}
public void setTextForModuleBtn(String text) {
mModuleHomeBtn.setText(text);
}
public void setModuleButtonEnabled(boolean enabled) {
mModuleHomeBtn.setClickable(enabled);
}
/**
* Add the item appears on the titlebar. {@link CusPopupMenu}}
* @param item it must have the background picture
*/
public void addPrimaryItem(MITMenuItem item) {
mPrimaryItems.add(item);
}
/**
* Add the item appears on the {@link CusPopupMenu}}
* @param item it should not have the background
*/
public void addSecondaryItem(MITMenuItem item) {
mSecondaryItems.add(item);
}
/**
* clear menu options
*/
public void clearMenuItems() {
mPrimaryItems.clear();
mSecondaryItems.clear();
mPrimaryItemsShowing = 0;
}
/**
* Call it before the {@link MitTitleBar#configureTitleBar()}}}
** @param listenter
*/
public void setOnTitleBarListener(OnMITTitleBarListener listener) {
mClickListener = listener;
}
private void initPopupMenu() {
mPopoverMenu = new MITPopupMenu(mOverflowBtn);
mOverflowBtn.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
mPopoverMenu.show();
}
});
mPopoverMenu.setMenuItemSelectedListener(new OnMITMenuItemListener() {
@Override
public void onOptionItemSelected(String optionId) {
mClickListener.onOptionItemSelected(optionId);
}
});
}
public void showOverflowMenu() {
if (mOverflowBtn.getVisibility() == View.VISIBLE) {
mPopoverMenu.show();
}
}
/**
* Shows the items in primary list in the titlebar.
*/
private void addPrimaryItemToView(MITMenuItem item) {
View view = getMenuItem(item);
view.setFocusable(true);
view.setClickable(true);
LinearLayout.LayoutParams layoutParams = new LinearLayout.LayoutParams(mPrimaryItemWidth, LayoutParams.FILL_PARENT);
mPrimaryList.addView(view, mPrimaryList.getChildCount()-1, layoutParams);
}
private void clearPrimaryItemViews() {
// remove everything but the overflow button
while (mPrimaryList.getChildCount() > 1) {
mPrimaryList.removeViewAt(0);
}
}
/**
* Used for the primary, secondary list to get the wrapper view.
* @param item it must not be null.
* @return View appears on the menu.
*/
public View getMenuItem(final MITMenuItem item) {
View view = item.getView(getContext());
view.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
if (null != mClickListener) {
mClickListener.onOptionItemSelected(item.getId());
}
}
});
return view;
}
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
int availableWidth = MeasureSpec.getSize(widthMeasureSpec);
availableWidth -= mHomeBtn.getMeasuredWidth();
availableWidth -= mModuleHomeBtn.getMeasuredWidth();
if (!mSecondaryItems.isEmpty()) {
availableWidth -= mOverflowButtonWidth;
}
if (availableWidth > mPrimaryItems.size() * mPrimaryItemWidth) {
mPrimaryItemsShowing = mPrimaryItems.size();
clearPrimaryItemViews();
mOverflowBtn.setVisibility(View.GONE);
for (MITMenuItem item : mPrimaryItems) {
addPrimaryItemToView(item);
}
} else {
// if we have no secondary items, then the space needed
// for the overflow button has not yet been accounted for
if (mSecondaryItems.isEmpty()) {
availableWidth -= mOverflowButtonWidth;
}
int itemsThatFit = availableWidth / mPrimaryItemWidth;
mPrimaryItemsShowing = itemsThatFit;
clearPrimaryItemViews();
for (int i = 0; i < mPrimaryItemsShowing; i++) {
addPrimaryItemToView(mPrimaryItems.get(i));
}
}
if (mPrimaryItemsShowing < mPrimaryItems.size() || !mSecondaryItems.isEmpty()) {
mOverflowBtn.setVisibility(View.VISIBLE);
mPopoverMenu.clearMenuItems();
if (mPrimaryItemsShowing < mPrimaryItems.size()) {
for (int j = mPrimaryItemsShowing; j < mPrimaryItems.size(); j++) {
mPopoverMenu.addMenuItem(mPrimaryItems.get(j));
}
}
for (MITMenuItem item : mSecondaryItems) {
mPopoverMenu.addMenuItem(item);
}
mPopoverMenu.refreshMenuList();
} else {
mOverflowBtn.setVisibility(View.GONE);
}
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
}
/*
* These add bar methods should only be called once
*/
View mSecondaryBar;
public void addSecondaryBar(View view) {
mSecondaryBar = view;
mContainer.addView(view, 1, new FrameLayout.LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.WRAP_CONTENT));
}
View mSliderBar;
public void addSliderBar(View view) {
mSliderBar = view;
mContainer.addView(view, new FrameLayout.LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.WRAP_CONTENT));
}
public void removeSliderBar() {
if (mSliderBar != null) {
mContainer.removeView(mSliderBar);
mSliderBar = null;
}
}
public void notifiyScreenChanged() {
if (null != mPopoverMenu) {
mPopoverMenu.notifyScreenRotated();
}
}
public static interface OnMITTitleBarListener extends OnMITMenuItemListener {
public void onHomeSelected();
public void onModuleHomeSelected();
}
}