package com.athena.asm.fragment;
import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
import android.view.LayoutInflater;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup;
import android.view.inputmethod.InputMethodManager;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.ArrayAdapter;
import android.widget.AutoCompleteTextView;
import android.widget.Button;
import android.widget.ListView;
import android.widget.RelativeLayout;
import android.widget.Toast;
import com.actionbarsherlock.app.SherlockActivity;
import com.actionbarsherlock.app.SherlockFragment;
import com.athena.asm.ActivityFragmentTargets;
import com.athena.asm.OnOpenActivityFragmentListener;
import com.athena.asm.R;
import com.athena.asm.aSMApplication;
import com.athena.asm.Adapter.CategoryListAdapter;
import com.athena.asm.data.Board;
import com.athena.asm.listener.OnKeyDownListener;
import com.athena.asm.util.AutoCompleteAdapter;
import com.athena.asm.util.ListViewUtil;
import com.athena.asm.util.StringUtility;
import com.athena.asm.util.task.LoadCategoryTask;
import com.athena.asm.viewmodel.BaseViewModel;
import com.athena.asm.viewmodel.HomeViewModel;
public class CategoryFragment extends SherlockFragment implements
BaseViewModel.OnViewModelChangObserver, OnClickListener, OnKeyDownListener {
private HomeViewModel m_viewModel;
private LayoutInflater m_inflater;
private View layout;
private ListView m_listView;
private boolean m_isLoaded;
private OnOpenActivityFragmentListener m_onOpenActivityFragmentListener;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setHasOptionsMenu(true);
setRetainInstance(true);
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
m_inflater = inflater;
layout = m_inflater.inflate(R.layout.category, null);
m_listView = (ListView)layout.findViewById(R.id.category_list);
aSMApplication application = (aSMApplication) getActivity()
.getApplication();
m_viewModel = application.getHomeViewModel();
m_viewModel.registerViewModelChangeObserver(this);
m_isLoaded = false;
return layout;
}
@Override
public void onActivityCreated(Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
Activity parentActivity = getSherlockActivity();
if (parentActivity instanceof OnOpenActivityFragmentListener) {
m_onOpenActivityFragmentListener = (OnOpenActivityFragmentListener) parentActivity;
}
if (m_viewModel.getCurrentTab() != null
&& m_viewModel.getCurrentTab().equals(
StringUtility.TAB_CATEGORY)) {
reloadCategory();
}
}
@Override
public void onDestroy() {
m_viewModel.unregisterViewModelChangeObserver(this);
super.onDestroy();
}
public void reloadCategory() {
if (m_viewModel.getCategoryList() == null) {
// it seems the following task might be called cocurrently
// we might have to add Synchronized Methods
LoadCategoryTask loadCategoryTask = new LoadCategoryTask(
getActivity(), m_viewModel);
loadCategoryTask.execute();
} else {
RelativeLayout relativeLayout = (RelativeLayout) layout
.findViewById(R.id.board_relative_layout);
Button goButton = (Button) relativeLayout
.findViewById(R.id.btn_go_board);
goButton.setOnClickListener(this);
AutoCompleteTextView textView = (AutoCompleteTextView) relativeLayout
.findViewById(R.id.search_board);
textView.setCompletionHint("请输入版面中/英文名(支持部分查找)");
ArrayAdapter<String> adapter = new AutoCompleteAdapter(getActivity(),
android.R.layout.simple_dropdown_item_1line, m_viewModel.getBoardFullStrings());
textView.setAdapter(adapter);
ListView categoryList = (ListView) layout.findViewById(R.id.category_list);
categoryList.setAdapter(new CategoryListAdapter(getActivity(), android.R.id.text1, m_viewModel
.getCategoryList(), getActivity().getLayoutInflater()));
categoryList.setFastScrollEnabled(true);
categoryList.setFastScrollAlwaysVisible(true);
categoryList.setOnItemClickListener(new OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> arg0, View view, int arg2, long arg3) {
Bundle bundle = new Bundle();
Board board = ((CategoryListAdapter.ViewHolder) view.getTag()).board;
bundle.putSerializable(StringUtility.BOARD, board);
aSMApplication.getCurrentApplication().addRecentBoard(board);
if (m_onOpenActivityFragmentListener != null) {
m_onOpenActivityFragmentListener.onOpenActivityOrFragment(ActivityFragmentTargets.SUBJECT_LIST,
bundle);
}
}
});
}
}
@Override
public void onViewModelChange(BaseViewModel viewModel,
String changedPropertyName, Object... params) {
if (changedPropertyName.equals(HomeViewModel.CATEGORYLIST_PROPERTY_NAME))
{
reloadCategory();
}
else if (changedPropertyName.equals(HomeViewModel.CURRENTTAB_PROPERTY_NAME))
{
if (!m_isLoaded && m_viewModel.getCurrentTab() != null
&& m_viewModel.getCurrentTab().equals(StringUtility.TAB_CATEGORY))
{
reloadCategory();
}
}
}
@Override
public void onClick(View view) {
if (view.getId() == R.id.btn_go_board) {
AutoCompleteTextView textView = (AutoCompleteTextView) ((RelativeLayout) view
.getParent()).findViewById(R.id.search_board);
// this line of code has problem, since "IT业界特快" can't work in this method
Board board = m_viewModel.getBoardHashMap().get(textView.getText().toString().toLowerCase());
if (board == null) {
new Handler().post(new Runnable() {
@Override
public void run() {
Toast.makeText(getActivity().getApplicationContext(),
"版面不存在.", Toast.LENGTH_SHORT).show();
}
});
return;
}
InputMethodManager inputManager = (InputMethodManager) getActivity()
.getSystemService(SherlockActivity.INPUT_METHOD_SERVICE);
inputManager.hideSoftInputFromWindow(textView.getWindowToken(), 0);
aSMApplication.getCurrentApplication().addRecentBoard(board);
Bundle bundle = new Bundle();
bundle.putSerializable(StringUtility.BOARD, board);
if (m_onOpenActivityFragmentListener != null) {
m_onOpenActivityFragmentListener.onOpenActivityOrFragment(ActivityFragmentTargets.SUBJECT_LIST, bundle);
}
}
}
@Override
public boolean onKeyDown(int keyCode) {
return ListViewUtil.ScrollListViewByKey(m_listView, keyCode);
}
}