/************************************************************************************* * 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.adapters; import java.text.DecimalFormat; import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Date; import org.spinsuite.base.R; import org.spinsuite.util.DisplayType; import org.spinsuite.util.TextViewArrayHolder; import org.spinsuite.view.report.ColumnPrintData; import org.spinsuite.view.report.InfoReportField; import org.spinsuite.view.report.RowPrintData; import android.content.Context; import android.view.Gravity; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.BaseAdapter; import android.widget.Filter; import android.widget.Filterable; import android.widget.LinearLayout; import android.widget.LinearLayout.LayoutParams; import android.widget.TextView; /** * @author <a href="mailto:yamelsenih@gmail.com">Yamel Senih</a> * */ public class ReportAdapter extends BaseAdapter implements Filterable { /** * * *** Constructor *** * @author <a href="mailto:yamelsenih@gmail.com">Yamel Senih</a> 29/03/2014, 15:35:03 * @param ctx * @param data * @param columns * @param ll_HeaderReport */ public ReportAdapter(Context ctx, ArrayList<RowPrintData> data, InfoReportField[] columns, LinearLayout ll_HeaderReport) { this.ctx = ctx; this.data = data; this.columns = columns; // Set Parameter v_param = new LayoutParams(200, LayoutParams.WRAP_CONTENT, WEIGHT); // inflater = (LayoutInflater) ctx.getSystemService(Context.LAYOUT_INFLATER_SERVICE); // loadHeader(ll_HeaderReport); instanceFormat(); notifyDataSetChanged(); } /** * * *** Constructor *** * @author <a href="mailto:yamelsenih@gmail.com">Yamel Senih</a> 29/03/2014, 15:35:28 * @param ctx * @param data * @param columns */ public ReportAdapter(Context ctx, ArrayList<RowPrintData> data, InfoReportField[] columns) { this(ctx, data, columns, null); } /** Context */ private Context ctx = null; /** Data */ private ArrayList<RowPrintData> originalData = null; /** Data */ private ArrayList<RowPrintData> data = null; /** Columns */ private InfoReportField[] columns = null; /** Column Parameter */ private LayoutParams v_param = null; /** Inflater */ private LayoutInflater inflater = null; /** Parameter */ private static final float WEIGHT = 1; /** Column Decimal Format */ private DecimalFormat[] cDecimalFormat = null; /** Column Date Format */ private SimpleDateFormat[] cDateFormat = null; /** * Add Item * @author <a href="mailto:yamelsenih@gmail.com">Yamel Senih</a> 25/03/2014, 22:03:50 * @param row * @return void */ public void addItem(RowPrintData row) { data.add(row); notifyDataSetChanged(); } @Override public int getCount() { return data.size(); } @Override public Object getItem(int position) { return data.get(position); } @Override public long getItemId(int position) { return position; } /** * Get Items * @author <a href="mailto:yamelsenih@gmail.com">Yamel Senih</a> 25/03/2014, 22:04:21 * @return * @return ArrayList<RowPrintData> */ public ArrayList<RowPrintData> getItems(){ return data; } /** * Format Text Field * @author <a href="mailto:yamelsenih@gmail.com">Yamel Senih</a> 27/03/2014, 14:44:53 * @param tv_column * @param index * @return void */ private void formatField(TextView tv_column, int index){ // Valid Columns if(columns != null){ InfoReportField formatField = columns[index]; // Set Style if(formatField.FieldAlignmentType .equals(InfoReportField.FIELD_ALIGNMENT_TYPE_TRAILING_RIGHT)) tv_column.setGravity(Gravity.RIGHT); else if(formatField.FieldAlignmentType .equals(InfoReportField.FIELD_ALIGNMENT_TYPE_CENTER)) tv_column.setGravity(Gravity.CENTER_HORIZONTAL); else tv_column.setGravity(Gravity.LEFT); } } /** * Load Labels Header * @author <a href="mailto:yamelsenih@gmail.com">Yamel Senih</a> 29/03/2014, 15:42:00 * @param ll_HeaderReport * @return void */ private void loadHeader(LinearLayout ll_HeaderReport){ // if(ll_HeaderReport == null) return; // Remove Old Labels if(ll_HeaderReport.getChildCount() > 0) ll_HeaderReport.removeAllViews(); // Add Labels for(int i = 0; i < columns.length; i++){ InfoReportField column = columns[i]; // Load Text View TextView tv_column = loadTextView( column.PrintName + (column.PrintNameSuffix != null ? " " + column.PrintNameSuffix :""), i); // Add to Layout ll_HeaderReport.addView(tv_column); } } /** * Instance Decimal Format Column * @author <a href="mailto:yamelsenih@gmail.com">Yamel Senih</a> 04/04/2014, 11:43:54 * @return void */ private void instanceFormat(){ // New Decimal Format cDecimalFormat = new DecimalFormat[columns.length]; cDateFormat = new SimpleDateFormat[columns.length]; // for(int i = 0; i < columns.length; i++){ InfoReportField column = columns[i]; // Only Numeric if(DisplayType.isNumeric(column.DisplayType)) cDecimalFormat[i] = DisplayType.getNumberFormat(ctx, column.DisplayType, column.FormatPattern); // Only Date else if(DisplayType.isDate(column.DisplayType)) cDateFormat[i] = DisplayType.getDateFormat(ctx, column.DisplayType, column.FormatPattern); } } /** * Load a dynamic TextView * @author <a href="mailto:yamelsenih@gmail.com">Yamel Senih</a> 26/03/2014, 11:47:32 * @param text * @param index * @return * @return TextView */ private TextView loadTextView(String text, int index){ // New Text Field TextView tv_column = new TextView(ctx); // Set Parameters tv_column.setLayoutParams(v_param); // Set Style tv_column.setTextAppearance(ctx, R.style.TextItemReport); // Format Field formatField(tv_column, index); // Set Text tv_column.setText(text); // Return return tv_column; } @Override public View getView(int position, View convertView, ViewGroup parent) { View view = convertView; // TextViewArrayHolder holder = new TextViewArrayHolder(); // Data RowPrintData reportItem = data.get(position); // Is not view if(view == null){ view = (LinearLayout) inflater.inflate(R.layout.i_report, null); LinearLayout ll_ReportItem = (LinearLayout) view.findViewById(R.id.ll_ReportItem); // ll_ReportItem.setWeightSum(columns.length); // Add Columns for(int i = 0; i < columns.length; i++){ // Format String textValue = reportItem.getValue(i); // Format Numeric if(DisplayType.isNumeric(columns[i].DisplayType)){ DecimalFormat decimalFormat = cDecimalFormat[i]; if(decimalFormat != null) textValue = decimalFormat.format(DisplayType.getNumber(textValue)); } else if(DisplayType.isDate(columns[i].DisplayType)){ SimpleDateFormat dateFormat = cDateFormat[i]; if(dateFormat != null){ long date = Long.getLong(textValue, 0); textValue = dateFormat.format(new Date(date)); } } // Set Value TextView tv_column = loadTextView(textValue, i); // Add Holder holder.addTextView(tv_column); // Add to Layout ll_ReportItem.addView(tv_column); // Set Tag view.setTag(holder); } } else { // Holder holder = (TextViewArrayHolder) view.getTag(); // Set Holder for(int i = 0; i < reportItem.getColumnsQty(); i++){ // Load Text View String textValue = reportItem.getValue(i); // Format Numeric if(DisplayType.isNumeric(columns[i].DisplayType)){ DecimalFormat decimalFormat = cDecimalFormat[i]; if(decimalFormat != null) textValue = decimalFormat.format(DisplayType.getNumber(textValue)); } else if(DisplayType.isDate(columns[i].DisplayType)){ SimpleDateFormat dateFormat = cDateFormat[i]; if(dateFormat != null){ long date = Long.getLong(textValue, 0); textValue = dateFormat.format(new Date(date)); } } // Set Text holder.setText(textValue, i); } } // Return return view; } @Override public Filter getFilter() { return new Filter() { @SuppressWarnings("unchecked") @Override protected void publishResults(CharSequence constraint, FilterResults results) { data = (ArrayList<RowPrintData>) results.values; if (results.count > 0) { notifyDataSetChanged(); } else { notifyDataSetInvalidated(); } } @Override protected FilterResults performFiltering(CharSequence constraint) { // Populate Original Data if(originalData == null) originalData = data; // Get filter result ArrayList<RowPrintData> filteredResults = getResults(constraint); // Result FilterResults results = new FilterResults(); // results.values = filteredResults; results.count = filteredResults.size(); return results; } /** * Search * @author <a href="mailto:yamelsenih@gmail.com">Yamel Senih</a> 02/03/2014, 03:19:33 * @param constraint * @return * @return ArrayList<RowPrintData> */ private ArrayList<RowPrintData> getResults(CharSequence constraint) { // Verify if(constraint != null && constraint.length() > 0) { // new Filter ArrayList<RowPrintData> filteredResult = new ArrayList<RowPrintData>(); for(RowPrintData item : originalData) { for(ColumnPrintData column : item.getColumns()){ if((column.getValue() != null && column.getValue().toLowerCase().contains(constraint.toString())) || (column.getSuffix() != null && column.getSuffix().toLowerCase().contains(constraint.toString()))) filteredResult.add(item); } } return filteredResult; } // Only Data return originalData; } }; } }