package org.eevolution.form;
import java.math.BigDecimal;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Timestamp;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;
import java.util.logging.Level;
import org.adempiere.model.MBrowse;
import org.adempiere.model.MBrowseField;
import org.adempiere.model.MView;
import org.adempiere.model.MViewColumn;
import org.compiere.apps.search.Info_Column;
import org.compiere.minigrid.IDColumn;
import org.compiere.model.MLookup;
import org.compiere.model.MLookupFactory;
import org.compiere.model.MProcess;
import org.compiere.model.MRole;
import org.compiere.model.M_Element;
import org.compiere.process.ProcessInfo;
import org.compiere.util.CLogger;
import org.compiere.util.DB;
import org.compiere.util.DisplayType;
import org.compiere.util.Env;
import org.compiere.util.Language;
import org.compiere.util.Msg;
public MBrowse m_Browse = null;
public MView m_View = null;
public static final int WINDOW_WIDTH = 1024;
public Info_Column[] m_generalLayout;
public ArrayList<String> m_queryColumns = new ArrayList<String>();
public ArrayList<String> m_queryColumnsSql = new ArrayList<String>();
public ArrayList <String> m_parameters;
public ArrayList <Object> m_values;
public MProcess m_process = null;
public ProcessInfo m_pi = null;
public boolean p_loadedOK = false;
public int m_keyColumnIndex = -1;
public boolean m_ok = false;
public boolean m_cancel = false;
public ArrayList<Integer> m_results = new ArrayList<Integer>(3);
public CLogger log = CLogger.getCLogger(getClass());
public Info_Column[] p_layout;
public String m_sqlMain;
public String m_sqlCount;
public String m_sqlOrder;
public int p_WindowNo;
public String p_FromClause;
public String p_keyColumn;
public boolean p_multiSelection;
public String p_whereClause = "";
public static final int INFO_WIDTH = 800;
public boolean isAllSelected = false;
public Browser(
boolean modal,
int WindowNo, String value,
MBrowse browse, String keyColumn,
boolean multiSelection, String whereClause)
{
m_Browse = browse;
m_View = browse.getAD_View();
p_WindowNo = WindowNo;
p_keyColumn = keyColumn;
p_multiSelection = multiSelection;
if (whereClause == null || whereClause.indexOf('@') == -1)
p_whereClause = whereClause;
else
{
p_whereClause = Env.parseContext(Env.getCtx(), p_WindowNo, whereClause, false, false);
if (p_whereClause.length() == 0)
log.log(Level.SEVERE, "Cannot parse context= " + whereClause);
}
log.info(m_Browse.getName() + " - " + keyColumn + " - " + whereClause);
}
public MLookup
getMLookup(MBrowseField field)
throws Exception
{
MViewColumn column = field.getAD_View_Column();
Language language = Language.getLoginLanguage();
return MLookupFactory.get(m_Browse.getCtx(), p_WindowNo,column.getAD_Column_ID(),
field.getAD_Reference_ID(), language, column.getAD_Column().getColumnName() , field.getAD_Reference_Value_ID(), false,"");
}
{
Collection<MBrowseField> fields = m_Browse.getFields();
ArrayList<Info_Column> list = new ArrayList<Info_Column>();
for (MBrowseField field : fields)
{
MViewColumn vcol = field.getAD_View_Column();
M_Element element = new M_Element(m_Browse.getCtx(),field.getAD_Element_ID(),null);
String columnName= element.getColumnName();
if(field.isQueryCriteria())
{
m_queryColumns.add(columnName);
}
m_queryColumnsSql.add(vcol.getColumnSQL());
Language language = Language.getLanguage(Env.getAD_Language(m_Browse.getCtx()));
int displayType = field.getAD_Reference_ID();
boolean isKey = field.isKey();
boolean isDisplayed = field.isDisplayed();
String columnSql = vcol.getColumnSQL() + " AS "+ vcol.getColumnName();
if (columnSql == null || columnSql.length() == 0)
columnSql = columnName;
StringBuffer colSql = new StringBuffer(columnSql);
Class colClass = null;
if (isKey)
{
colClass = IDColumn.class;
}
else if (!isDisplayed)
;
else if (DisplayType.YesNo == displayType)
colClass = Boolean.class;
else if (DisplayType.Amount == displayType)
colClass = BigDecimal.class;
else if (DisplayType.Number == displayType ||
DisplayType.Quantity == displayType)
colClass = Double.class;
else if (DisplayType.Integer == displayType)
colClass = Integer.class;
else if (DisplayType.TableDir == displayType ||
DisplayType.Search == displayType)
{
String alias = vcol.getAD_View_Definition().getTableAlias();
colSql = new StringBuffer("(" + MLookupFactory.getLookup_TableDirEmbed(language, columnName , alias) + ") AS "+ vcol.getColumnName());
colClass = String.class;
}
else if(DisplayType.Table == displayType)
{
String alias = vcol.getAD_View_Definition().getTableAlias();
colSql = new StringBuffer("(" + MLookupFactory.getLookup_TableEmbed (language, columnName , alias ,field.getAD_Reference_Value_ID()) + ") AS "+ vcol.getColumnName());
colClass = String.class;
}
else if (DisplayType.String == displayType ||
DisplayType.Text == displayType ||
DisplayType.Memo == displayType)
colClass = String.class;
else if (DisplayType.isDate(displayType))
colClass = Timestamp.class;
else if (DisplayType.List == displayType)
{
colSql =new StringBuffer("(" + MLookupFactory.getLookup_ListEmbed(language, field.getAD_Reference_Value_ID(), vcol.getColumnSQL()) + ")");
colClass = String.class;
}
if (colClass != null)
{
Info_Column infocol = new Info_Column(Msg.translate(Env.getCtx(), columnName), colSql.toString(), colClass);
list.add(infocol);
log.finest("Added Column=" + columnName);
}
else
log.finest("Not Added Column=" + columnName);
}
return list;
}
{
StringBuffer sql = new StringBuffer(m_Browse.getWhereClause()==null ? "" : " AND " + m_Browse.getWhereClause());
if(getParameters().size() > 0)
{
sql.append(" AND ");
}
Iterator <String> parameters = getParameters().iterator();
while(parameters.hasNext())
{
String parameter = parameters.next();
MBrowseField field = m_Browse.getField(parameter);
if(field!=null)
{
if(field.isRange())
{
MViewColumn column = field.getAD_View_Column();
sql.append(column.getColumnSQL()).append(" BETWEEN ? AND ? ");
}
else
{
MViewColumn column = field.getAD_View_Column();
sql.append(column.getColumnSQL()).append("=? ");
if(parameters.hasNext())
{
sql.append(" AND ");
}
}
}
else if(parameters.hasNext())
{
sql.append(" AND ");
}
}
return sql.toString();
}
{
return m_parameters;
}
{
return m_values;
}
{
if(value != null && value.toString().length() > 0)
{
m_parameters.add(name);
m_values.add(value);
}
}
public void addSQLWhere(StringBuffer sql,
int index, String value)
{
if (!(value.equals("") || value.equals("%")) && index < m_queryColumns.size())
{
sql.append(" UPPER(").append(m_queryColumnsSql.get(index).toString()).append(") LIKE '");
sql.append(value);
if (value.endsWith("%"))
sql.append("'");
else
sql.append("%'");
}
}
public void setParameters(PreparedStatement pstmt,
boolean forCount)
throws SQLException
{
int index = 1;
}
{
long start = System.currentTimeMillis();
String dynWhere = getSQLWhere();
StringBuffer sql = new StringBuffer (m_sqlCount);
if (dynWhere.length() > 0)
sql.append(dynWhere);
String countSql = Msg.parseTranslation(Env.getCtx(), sql.toString());
countSql = MRole.getDefault().addAccessSQL(countSql, m_View.getParentEntityAliasName(), MRole.SQL_FULLYQUALIFIED, MRole.SQL_RO);
log.finer(countSql);
PreparedStatement pstmt = null;
ResultSet rs = null;
int no = -1;
try
{
pstmt = DB.prepareStatement(countSql, null);
if(getParametersValues().size() > 0)
DB.setParameters(pstmt, getParametersValues());
setParameters (pstmt, true);
rs = pstmt.executeQuery();
if (rs.next())
no = rs.getInt(1);
}
catch (Exception e)
{
log.log(Level.SEVERE, countSql, e);
no = -2;
}
finally {
DB.close(rs, pstmt);
rs = null; pstmt = null;
}
log.fine("#" + no + " - " + (System.currentTimeMillis()-start) + "ms");
return no;
}
{
Collection<Integer> keys = getSelectedKeys();
if (keys == null || keys.size() == 0)
{
log.config("No Results - OK="
+ m_ok + ", Cancel=" + m_cancel);
return "";
}
StringBuffer sb = new StringBuffer(getKeyColumn());
if (keys.size() > 1)
sb.append(" IN (");
else
sb.append("=");
for (Integer key : keys)
{
if (getKeyColumn().endsWith("_ID"))
sb.append(key.toString()).append(",");
else
sb.append("'").append(key.toString()).append("',");
}
sb.replace(sb.length()-1, sb.length(), "");
if (keys.size() > 1)
sb.append(")");
return sb.toString();
}
{
return p_keyColumn;
}
{
ArrayList<Integer> selectedDataList = getSelectedRowKeys();
if (selectedDataList.size() == 0)
{
return null;
}
else
{
return selectedDataList.get(0);
}
}
{
if (!m_ok || m_results.size() == 0)
return null;
return m_results;
}
{
if (!m_ok || m_results.size() == 0)
return null;
return m_results.get(0);
}
{
return m_Browse.getAD_Browse_ID();
}
}