package com.jobmineplus.mobile.activities.jbmnpls;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.HashSet;
import junit.framework.Assert;
import android.os.Bundle;
import android.support.v4.app.ListFragment;
import android.support.v4.app.ListFragmentLayout;
import android.support.v7.internal.view.menu.SubMenuBuilder;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.MenuItem;
import android.view.SubMenu;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.ListView;
import com.jobmineplus.mobile.R;
import com.jobmineplus.mobile.database.pages.PageMapResult;
import com.jobmineplus.mobile.widgets.JbmnplsAdapterBase;
import com.jobmineplus.mobile.widgets.JbmnplsAdapterBase.HIGHLIGHTING;
import com.jobmineplus.mobile.widgets.JbmnplsLoadingAdapterBase;
import com.jobmineplus.mobile.widgets.Job;
import com.jobmineplus.mobile.widgets.Job.HEADER;
import com.jobmineplus.mobile.widgets.Job.HeaderComparator.DIRECTION;
import com.jobmineplus.mobile.widgets.ListViewPlus;
import com.jobmineplus.mobile.widgets.ListViewPlus.OnVisualRowChangeListener;
public abstract class JbmnplsPageListActivityBase extends JbmnplsPageActivityBase implements OnItemClickListener {
private HashMap<String, ArrayList<Job>> lists;
private static final String DISPLAYNAME = "displayname";
private final Job.HeaderComparator comparer = new Job.HeaderComparator();
private MenuItem sortSelected;
private boolean sortedAscending = false;
private OnVisualRowChangeListener listViewListener;
//====================
// Abstract Methods
//====================
public abstract HEADER[] getTableHeaders();
public abstract int[] getJobListItemResources();
protected abstract HIGHLIGHTING formatJobListItem(int position, Job job, View[] elements, View layout);
//====================
// Override Methods
//====================
@Override
public void onCreate(Bundle savedInstanceState) {
lists = new HashMap<String, ArrayList<Job>>();
super.onCreate(savedInstanceState);
}
@Override
protected void onRequestComplete(boolean pullData) {
updateLists();
if (pullData) {
jobsToDatabase();
}
}
/**
* Instead of running a request to get a job list for each tab, we ask the data source
* to do it for us (1 database request). Look at getJobsMap for more info.
*/
@Override
protected long doOffine() {
PageMapResult result =
pageDataSource.getPageDataMap(client.getUsername(), getPageName());
if (result != null) {
HashMap<String, ArrayList<Integer>> idMap = result.idMap;
if (idMap != null) {
HashMap<String, ArrayList<Job>> retList = jobDataSource.getJobsMap(idMap);
if (retList != null) {
// Make the job list
HashSet<Integer> ids = new HashSet<Integer>();
for (String tag : lists.keySet()) {
ArrayList<Job> joblist = retList.get(tag);
if (joblist != null) {
getListByTab(tag).addAll(joblist);
}
ArrayList<Job> jobs = lists.get(tag);
if (!jobs.isEmpty()) {
for (Job job : jobs) {
if (!ids.contains(job.getId())) {
ids.add(job.getId());
allJobs.add(job);
}
}
}
}
}
}
return result.timestamp;
}
return 0;
}
@Override
public Long doPutTask() {
jobDataSource.addJobs(allJobs);
String pageName = getPageName();
if (pageName != null) {
pageDataSource.addPage(client.getUsername(), pageName, lists, timestamp);
}
return null;
}
@Override
protected int getActionBarId() {
return R.menu.actionbar_with_sort;
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
boolean flag = super.onCreateOptionsMenu(menu);
MenuItem item = menu.findItem(R.id.action_sort);
SubMenu sub = item.getSubMenu();
sub.clear();
// Because SherlockActionBar renders text differently, the tabbing is different
String prefex = sub instanceof SubMenuBuilder ? " \t" : " \t\t";
HEADER[] headers = getTableHeaders();
for (int i = 0; i < headers.length; i++) {
HEADER header = headers[i];
sub.add(1, i, Menu.NONE, prefex + header.readable());
}
return flag;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
int id = item.getItemId();
HEADER[] headers = getTableHeaders();
if (id >= 0 && id < headers.length) {
if (sortSelected != null && item != sortSelected) {
sortSelected.setTitle(" " + ((String)sortSelected.getTitle()).substring(1));
sortedAscending = true;
} else {
sortedAscending = !sortedAscending;
}
item.setTitle((sortedAscending ? "��" : "��") + ((String)item.getTitle()).substring(1));
sort(headers[id], sortedAscending);
sortSelected = item;
return true;
} else {
return super.onOptionsItemSelected(item);
}
}
//====================
// List Alters
//====================
public void clearAllLists() {
for (String tag : lists.keySet()) {
lists.get(tag).clear();
}
allJobs.clear();
}
protected void scrollToTop() {
for (String tag : lists.keySet()) {
((PageListFragment)getFragment(tag)).scrollToTop();
}
}
protected void createTab(String displayName) {
PageListFragment frag = PageListFragment.newInstance();
Bundle b = new Bundle();
b.putString(DISPLAYNAME, displayName);
frag.setArguments(b);
// Set thew new adapter
ArrayList<Job> list = new ArrayList<Job>();
JbmnplsAdapterBase adapter = new JbmnplsPageListAdapter(this, list);
frag.setPageListAdapter(adapter);
super.createTab(displayName, frag);
lists.put(displayName, list);
// Add the listView listener if it exists
frag.setOnRowChangeListener(listViewListener);
}
public void updateLists() {
for (String tag : lists.keySet()) {
PageListFragment frag = (PageListFragment) getFragment(tag);
frag.showEmptyText();
frag.notifyListDataSetChanged();
}
}
public void addJobToListByTabId(String displayName, Job job) {
lists.get(displayName).add(job);
}
protected void sort(HEADER header) {
sort(header, true);
}
protected void sort(HEADER header, boolean ascend) {
// Update the current list, then the others
comparer.setHeader(header);
comparer.setDirection(ascend ? DIRECTION.ASCEND : DIRECTION.DESCEND);
for (String tag : lists.keySet()) {
PageListFragment frag = (PageListFragment) getFragment(tag);
if (frag != null) {
JbmnplsAdapterBase adapter = frag.getPageListAdapter();
if (adapter != null) {
adapter.sort(comparer);
}
}
}
}
protected void resetSortingMenu() {
if (sortSelected != null) {
sortSelected.setTitle(" " + ((String)sortSelected.getTitle()).substring(1));
}
sortedAscending = false;
}
public void setOnRowChangeListener(OnVisualRowChangeListener listener) {
for (String tag : lists.keySet()) {
PageListFragment frag = (PageListFragment) getFragment(tag);
frag.setOnRowChangeListener(listener);
}
listViewListener = listener;
}
//====================
// Accessors
//====================
@Override
public ListFragment getCurrentFragment() {
return (ListFragment) super.getCurrentFragment();
}
@Override
public ListFragment getFragment(int index) {
return (ListFragment) super.getFragment(index);
}
public ListViewPlus getListViewByTab(String displayName) {
return ((PageListFragment)getFragment(displayName)).getListView();
}
public ListViewPlus getListViewByIndex(int index) {
return ((PageListFragment)getFragment(index)).getListView();
}
public ListViewPlus getCurrentListView() {
return getListViewByIndex(getCurrentIndex());
}
public ArrayList<Job> getListByTab(String displayName) {
return lists.get(displayName);
}
public ArrayList<Job> getCurrentList() {
return lists.get(getCurrentTabName());
}
public boolean listContainsId(String displayName, int id) {
for (Job job : getListByTab(displayName)) {
if (job.getId() == id) {
return true;
}
}
return false;
}
public JbmnplsAdapterBase getAdapterByTab(String displayName) {
return ((PageListFragment)getFragment(displayName)).getPageListAdapter();
}
public JbmnplsAdapterBase getAdapterByIndex(int index) {
return ((PageListFragment)getFragment(index)).getPageListAdapter();
}
//========================
// Generic List Adapter
//========================
protected int getJobListItemLayout() {
return R.layout.job_widget;
}
private class JbmnplsPageListAdapter extends JbmnplsLoadingAdapterBase {
public JbmnplsPageListAdapter(JbmnplsPageListActivityBase a, ArrayList<Job> list) {
super(a, getJobListItemLayout(), getJobListItemResources(), list);
}
@Override
protected HIGHLIGHTING setJobWidgetValues(int position, Job job, View[] elements, View layout) {
return formatJobListItem(position, job, elements, layout);
}
}
//============================
// Custom ListFragment Class
//============================
public final static class PageListFragment extends ListFragment {
private boolean showEmptyText = false;
private boolean listIsAvailable = false;
public String displayName;
private JbmnplsAdapterBase listAdapter;
private OnVisualRowChangeListener listViewListener;
public final static PageListFragment newInstance() {
return new PageListFragment();
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState)
{
View view = inflater.inflate(R.layout.list_loader, container, false);
ListFragmentLayout.setupIds(view);
return view;
}
public void setOnRowChangeListener(OnVisualRowChangeListener listener) {
ListViewPlus view = getListView();
if (view != null) {
view.setOnRowChangeListener(listener);
}
listViewListener = listener;
}
// Hack that shows the text only when there is no content in the list
public void showEmptyText() {
showEmptyText = true;
if (getView() != null) {
setEmptyText(getString(R.string.empty_job_list));
}
}
public void notifyListDataSetChanged() {
if (listAdapter != null) {
listAdapter.notifyDataSetChanged();
}
}
public void setPageListAdapter(JbmnplsAdapterBase adapter) {
listAdapter = adapter;
super.setListAdapter(adapter);
}
public JbmnplsAdapterBase getPageListAdapter() {
return listAdapter;
}
public void scrollToTop() {
ListView view = getListView();
if (view != null) {
view.setSelectionAfterHeaderView();
}
}
@Override
public ListViewPlus getListView() {
if (listIsAvailable) {
return (ListViewPlus)super.getListView();
} else {
return null;
}
}
@Override
public void onDestroyView() {
super.onDestroyView();
listIsAvailable = false;
}
@Override
public void onActivityCreated(Bundle savedInstanceState) {
Bundle b = getArguments();
setListShown(true);
listIsAvailable = true;
Assert.assertNotNull(b);
displayName = b.getString(DISPLAYNAME);
JbmnplsPageListActivityBase a = (JbmnplsPageListActivityBase)getActivity();
a.createTab(displayName, this);
ListViewPlus list = (ListViewPlus)super.getListView();
list.setOnItemClickListener(a);
list.setAdapter(listAdapter);
list.setOnRowChangeListener(listViewListener);
if (showEmptyText) {
setEmptyText(getString(R.string.empty_job_list));
}
super.onActivityCreated(savedInstanceState);
}
}
}