/*************************************************************************************
* Product: SFAndroid (Sales Force Mobile) *
* This program is free software; you can redistribute it and/or modify it *
* under the terms version 2 of the GNU General Public License as published *
* by the Free Software Foundation. This program is distributed in the hope *
* that it will be useful, but WITHOUT ANY WARRANTY; without even the implied *
* warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. *
* See the GNU General Public License for more details. *
* You should have received a copy of the GNU General Public License along *
* with this program; if not, write to the Free Software Foundation, Inc., *
* 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. *
* For the text or an alternative of this public license, you may reach us *
* Copyright (C) 2012-2014 E.R.P. Consultores y Asociados, S.A. All Rights Reserved. *
* Contributor(s): Yamel Senih www.erpconsultoresyasociados.com *
*************************************************************************************/
package org.spinsuite.view;
import java.util.ArrayList;
import java.util.logging.Level;
import org.spinsuite.adapters.SearchAdapter;
import org.spinsuite.base.DB;
import org.spinsuite.base.R;
import org.spinsuite.util.DisplayRecordItem;
import org.spinsuite.util.DisplayType;
import org.spinsuite.util.FilterValue;
import org.spinsuite.util.LogM;
import org.spinsuite.util.ViewIndex;
import org.spinsuite.view.lookup.InfoField;
import org.spinsuite.view.lookup.InfoTab;
import org.spinsuite.view.lookup.LookupDisplayType;
import org.spinsuite.view.lookup.VLookup;
import org.spinsuite.view.lookup.VLookupCheckBox;
import org.spinsuite.view.lookup.VLookupDateBox;
import org.spinsuite.view.lookup.VLookupSearch;
import org.spinsuite.view.lookup.VLookupSpinner;
import org.spinsuite.view.lookup.VLookupString;
import android.app.Activity;
import android.content.Intent;
import android.database.Cursor;
import android.os.Bundle;
import android.support.v4.app.FragmentActivity;
import android.support.v4.app.NavUtils;
import android.support.v4.view.MenuItemCompat;
import android.support.v4.widget.SearchViewCompat;
import android.support.v4.widget.SearchViewCompat.OnCloseListenerCompat;
import android.support.v4.widget.SearchViewCompat.OnQueryTextListenerCompat;
import android.text.TextUtils;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.MenuItem;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.AdapterView;
import android.widget.Button;
import android.widget.EditText;
import android.widget.LinearLayout;
import android.widget.LinearLayout.LayoutParams;
import android.widget.ListView;
/**
* @author <a href="mailto:yamelsenih@gmail.com">Yamel Senih</a>
*
*/
public class LV_Search extends FragmentActivity {
/** Adapter */
private SearchAdapter adapter = null;
/** Main Layout */
private LinearLayout llc_Search = null;
/** List View */
private ListView lv_Search = null;
/** Field */
private InfoField m_field = null;
/** Table Identifier */
private int m_SFA_Table_ID = 0;
/** Tab Identifier */
private int m_SFA_Tab_ID = 0;
/** Criteria */
private FilterValue m_criteria = null;
/** Old Criteria */
private FilterValue m_oldCriteria = null;
/** Lookup */
private LookupDisplayType lookup = null;
/** Info Field */
private InfoTab tabInfo = null;
/** View Index Array */
private ArrayList<ViewIndex> viewList = null;
/** Parameter */
private LayoutParams v_param = null;
/** View Weight */
private static final float WEIGHT = 1;
public void onCreate(Bundle icicle) {
super.onCreate(icicle);
super.setContentView(R.layout.v_search);
// Get Field
Bundle bundle = getIntent().getExtras();
if(bundle != null){
m_field = (InfoField)bundle.getParcelable("Field");
m_SFA_Table_ID = bundle.getInt("SFA_Table_ID");
m_SFA_Tab_ID = bundle.getInt("SFA_Tab_ID");
m_criteria = bundle.getParcelable("Criteria");
}
//
if(m_field == null)
m_field = new InfoField();
//
llc_Search = (LinearLayout) findViewById(R.id.llc_Search);
lv_Search = (ListView) findViewById(R.id.lv_Search);
//
if(m_SFA_Table_ID != 0)
lookup = new LookupDisplayType(getApplicationContext(), m_SFA_Table_ID);
else if(m_field != null)
lookup = new LookupDisplayType(getApplicationContext(), m_field);
loadConfig();
// Load
load();
// Listener
lv_Search.setOnItemClickListener(new ListView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> adapter, View arg1, int position,
long arg3) {
// Load from Action
selectedRecord((DisplayRecordItem) adapter.getItemAtPosition(position));
}
});
}
/**
* Load Config
* @author <a href="mailto:yamelsenih@gmail.com">Yamel Senih</a> 18/03/2014, 22:07:43
* @return void
*/
private void loadConfig(){
if(m_SFA_Tab_ID != 0){
tabInfo = new InfoTab(getApplicationContext(), m_SFA_Tab_ID, true, null);
viewList = new ArrayList<ViewIndex>();
// Set Parameter
v_param = new LayoutParams(LayoutParams.MATCH_PARENT,
LayoutParams.MATCH_PARENT, WEIGHT);
// Add Fields
for(InfoField field : tabInfo.getFields()){
if(!field.IsDisplayed)
continue;
// Add View to Layout
addView(field);
}
// Add Button
Button btn_Search = new Button(this);
btn_Search.setText(getResources().getString(R.string.msg_Search));
// Action
btn_Search.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
m_criteria = new FilterValue();
if(m_oldCriteria != null)
m_criteria = m_oldCriteria;
// Add Criteria
addCriteriaQuery();
load();
}
});
// Add Button
llc_Search.addView(btn_Search, v_param);
}
// Hide
llc_Search.setVisibility(LinearLayout.GONE);
}
/**
* Add Criteria Query
* @author <a href="mailto:yamelsenih@gmail.com">Yamel Senih</a> 19/03/2014, 10:28:14
* @return void
*/
private void addCriteriaQuery(){
// Get Values
StringBuffer sqlWhere = new StringBuffer();
for (ViewIndex vIndex: viewList) {
VLookup lookup = vIndex.getVLookup();
// Only Filled
if(lookup.isEmpty())
continue;
InfoField field = lookup.getField();
// Set to model
if(sqlWhere.length() > 0)
sqlWhere.append(" AND ");
// Add Criteria Column Filter
sqlWhere.append(field.ColumnName).append(" = ?");
// Add Value
m_criteria.addValue(DisplayType.getJDBC_Value(field.DisplayType,
lookup.getValue()));
}
// Add SQL
m_criteria.setWhereClause(sqlWhere.toString());
}
/**
* Add View to Config Panel
* @author <a href="mailto:yamelsenih@gmail.com">Yamel Senih</a> 18/03/2014, 22:10:08
* @param field
* @return void
*/
private void addView(InfoField field){
VLookup lookup = null;
// Add
if(DisplayType.isDate(field.DisplayType)){
lookup = new VLookupDateBox(this, field);
} else if(DisplayType.isText(field.DisplayType)){
VLookupString lookupString = new VLookupString(this, field);
lookupString.setInputType(DisplayType.getInputType(field.DisplayType));
lookup = lookupString;
} else if(DisplayType.isBoolean(field.DisplayType)){
lookup = new VLookupCheckBox(this, field);
} else if(DisplayType.isLookup(field.DisplayType)){
// Table Direct
if(field.DisplayType == DisplayType.TABLE_DIR){
lookup = new VLookupSpinner(this, field);
} else if(field.DisplayType == DisplayType.SEARCH){
lookup = new VLookupSearch(this, field);
}
}
// is Filled
if(lookup != null){
ViewIndex index = new ViewIndex(lookup, field.ColumnName);
viewList.add(index);
llc_Search.addView(lookup, v_param);
}
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
super.onCreateOptionsMenu(menu);
// Inflate menu
MenuInflater inflater = getMenuInflater();
inflater.inflate(R.menu.search, menu);
// Get Item
MenuItem item = menu.findItem(R.id.action_search);
// Search View
final View searchView = SearchViewCompat.newSearchView(this);
if (searchView != null) {
// Set Back ground Color
int id = searchView.getContext().getResources().getIdentifier("android:id/search_src_text", null, null);
EditText searchText = (EditText) searchView.findViewById(id);
// Set Parameters
if(searchText != null)
searchText.setTextAppearance(this, R.style.TextSearch);
//
SearchViewCompat.setOnQueryTextListener(searchView,
new OnQueryTextListenerCompat() {
@Override
public boolean onQueryTextChange(String newText) {
if(adapter != null){
String mFilter = !TextUtils.isEmpty(newText) ? newText : null;
adapter.getFilter().filter(mFilter);
}
return true;
}
});
SearchViewCompat.setOnCloseListener(searchView,
new OnCloseListenerCompat() {
@Override
public boolean onClose() {
if (!TextUtils.isEmpty(SearchViewCompat.getQuery(searchView))) {
SearchViewCompat.setQuery(searchView, null, true);
}
return true;
}
});
MenuItemCompat.setActionView(item, searchView);
}
// Valid Configuration
MenuItem itemConfig = menu.findItem(R.id.action_config);
if(itemConfig != null) {
if(m_SFA_Tab_ID != 0)
itemConfig.setVisible(true);
else
itemConfig.setVisible(false);
}
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
case R.id.action_add:
selectedRecord(new DisplayRecordItem(0, null));
return true;
case R.id.action_config:
// Show
if(llc_Search.getVisibility() == LinearLayout.GONE){
llc_Search.setVisibility(LinearLayout.VISIBLE);
m_oldCriteria = m_criteria;
} else {
llc_Search.setVisibility(LinearLayout.GONE);
m_criteria = m_oldCriteria;
// Load New
load();
}
return true;
case android.R.id.home:
NavUtils.navigateUpTo(this, new Intent(this, LV_Menu.class));
return true;
}
return super.onOptionsItemSelected(item);
}
/**
* Load Data
* @author <a href="mailto:yamelsenih@gmail.com">Yamel Senih</a> 01/03/2014, 13:32:16
* @return void
*/
private void load(){
try{
if(lookup == null)
throw new Exception("No Parameter");
//
DB conn = new DB(this);
DB.loadConnection(conn, DB.READ_ONLY);
Cursor rs = null;
// Query
String[] values = null;
if(m_criteria != null) {
lookup.setCriteria(m_criteria.getWhereClause());
values = m_criteria.getValues();
} else
lookup.setCriteria(null);
rs = conn.querySQL(lookup.getSQL(), values);
ArrayList<DisplayRecordItem> data = new ArrayList<DisplayRecordItem>();
if(rs.moveToFirst()){
// Loop
do{
data.add(new DisplayRecordItem(
rs.getInt(0),
rs.getString(1)));
}while(rs.moveToNext());
}
// Close
DB.closeConnection(conn);
// Set Adapter
adapter = new SearchAdapter(this, R.layout.i_search, data);
adapter.setDropDownViewResource(R.layout.i_search);
lv_Search.setAdapter(adapter);
} catch(Exception e){
LogM.log(this, getClass(), Level.SEVERE, "Error in Load", e);
}
}
/**
* On Selected Record
* @author <a href="mailto:yamelsenih@gmail.com">Yamel Senih</a> 01/03/2014, 13:23:17
* @param item
* @return void
*/
private void selectedRecord(DisplayRecordItem item){
Intent intent = getIntent();
Bundle bundle = new Bundle();
bundle.putParcelable("Record", item);
bundle.putString("ColumnName", m_field.ColumnName);
intent.putExtras(bundle);
setResult(Activity.RESULT_OK, intent);
finish();
}
}