/******************************************************************************
* Product: Posterita Ajax UI *
* Copyright (C) 2007 Posterita Ltd. All Rights Reserved. *
* 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 *
* Posterita Ltd., 3, Draper Avenue, Quatre Bornes, Mauritius *
* or via info@posterita.org or http://www.posterita.org/ *
*****************************************************************************/
package org.adempiere.webui.panel;
import java.sql.PreparedStatement;
import java.sql.SQLException;
import java.sql.Timestamp;
import java.util.Date;
import java.util.logging.Level;
import org.adempiere.webui.apps.AEnv;
import org.adempiere.webui.component.Button;
import org.adempiere.webui.component.Datebox;
import org.adempiere.webui.component.Grid;
import org.adempiere.webui.component.GridFactory;
import org.adempiere.webui.component.Label;
import org.adempiere.webui.component.Row;
import org.adempiere.webui.component.Rows;
import org.adempiere.webui.editor.WEditor;
import org.adempiere.webui.editor.WSearchEditor;
import org.adempiere.webui.event.ValueChangeEvent;
import org.adempiere.webui.event.ValueChangeListener;
import org.adempiere.webui.event.WTableModelEvent;
import org.compiere.minigrid.ColumnInfo;
import org.compiere.minigrid.IDColumn;
import org.compiere.model.MLookupFactory;
import org.compiere.model.MQuery;
import org.compiere.util.DB;
import org.compiere.util.DisplayType;
import org.compiere.util.Env;
import org.compiere.util.Msg;
import org.zkoss.zk.ui.event.Event;
import org.zkoss.zk.ui.event.EventListener;
import org.zkoss.zk.ui.event.Events;
import org.zkoss.zkex.zul.Borderlayout;
import org.zkoss.zkex.zul.Center;
import org.zkoss.zkex.zul.North;
import org.zkoss.zkex.zul.South;
import org.zkoss.zul.Div;
import org.zkoss.zul.Separator;
import org.zkoss.zul.Vbox;
/**
* Based on InfoAssignment written by Jorg Janke
*
* @author Niraj Sohun
* Aug 06, 2007
*
* Zk Port
* @author Elaine
* @version InfoAssignment.java Adempiere Swing UI 3.4.1
*/
public class InfoAssignmentPanel extends InfoPanel implements EventListener, ValueChangeListener
{
/**
*
*/
private static final long serialVersionUID = -935642651768066799L;
private WEditor fieldResourceType;
private WEditor fieldResource;
private Button bNew = new Button();
private Datebox fieldFrom = new Datebox();
private Datebox fieldTo = new Datebox();
private Label labelFrom = new Label(Msg.translate(Env.getCtx(), "DateFrom"));
private Label labelTo = new Label(Msg.translate(Env.getCtx(), "DateTo"));
private Borderlayout layout;
private Vbox southBody;
/** From Clause */
private static String s_assignmentFROM =
"S_ResourceAssignment ra, S_ResourceType rt, S_Resource r, C_UOM uom";
private static String s_assignmentWHERE =
"ra.IsActive='Y' AND ra.S_Resource_ID=r.S_Resource_ID "
+ "AND r.S_ResourceType_ID=rt.S_ResourceType_ID AND rt.C_UOM_ID=uom.C_UOM_ID";
/** Array of Column Info */
private static ColumnInfo[] s_assignmentLayout = {
new ColumnInfo(" ", "ra.S_ResourceAssignment_ID", IDColumn.class),
new ColumnInfo(Msg.translate(Env.getCtx(), "S_ResourceType_ID"), "rt.Name", String.class),
new ColumnInfo(Msg.translate(Env.getCtx(), "S_Resource_ID"), "r.Name", String.class),
new ColumnInfo(Msg.translate(Env.getCtx(), "AssignDateFrom"), "ra.AssignDateFrom", Timestamp.class),
new ColumnInfo(Msg.translate(Env.getCtx(), "Qty"), "ra.Qty", Double.class),
new ColumnInfo(Msg.translate(Env.getCtx(), "C_UOM_ID"), "uom.UOMSymbol", String.class),
new ColumnInfo(Msg.translate(Env.getCtx(), "AssignDateTo"), "ra.AssignDateTo", Timestamp.class),
new ColumnInfo(Msg.translate(Env.getCtx(), "IsConfirmed"), "ra.IsConfirmed", Boolean.class)
};
/**
* Constructor
*
* @param WindowNo WindowNo
* @param value Query value Name or Value if contains numbers
* @param multiSelection multiple selection
* @param whereClause where clause
*/
public InfoAssignmentPanel (int WindowNo,
String value, boolean multiSelection, String whereClause)
{
this(WindowNo, value, multiSelection, whereClause, true);
}
/**
* Constructor
*
* @param WindowNo WindowNo
* @param value Query value Name or Value if contains numbers
* @param multiSelection multiple selection
* @param whereClause where clause
*/
public InfoAssignmentPanel (int WindowNo,
String value, boolean multiSelection, String whereClause, boolean lookup)
{
super (WindowNo, "ra", "S_ResourceAssignment_ID",
multiSelection, whereClause, lookup);
log.info(value);
setTitle(Msg.getMsg(Env.getCtx(), "InfoAssignment"));
if (!initLookups())
return;
statInit();
initInfo (value, whereClause);
int no = contentPanel.getRowCount();
setStatusLine(Integer.toString(no) + " " + Msg.getMsg(Env.getCtx(), "SearchRows_EnterQuery"), false);
setStatusDB(Integer.toString(no));
p_loadedOK = true;
} // InfoAssignmentPanel
/**
* Initialize Lookups
* @return true if OK
*/
private boolean initLookups()
{
try
{
int AD_Column_ID = 6851; // S_Resource.S_ResourceType_ID
fieldResourceType = new WSearchEditor (
MLookupFactory.get(Env.getCtx(), p_WindowNo, 0, AD_Column_ID, DisplayType.TableDir),
Msg.translate(Env.getCtx(), "S_ResourceType_ID"), "", false, false, true);
AD_Column_ID = 6826; // S_ResourceAssignment.S_Resource_ID
fieldResource = new WSearchEditor (
MLookupFactory.get (Env.getCtx(), p_WindowNo, 0, AD_Column_ID, DisplayType.TableDir),
Msg.translate(Env.getCtx(), "S_Resource_ID"), "", false, false, true);
}
catch (Exception e)
{
log.log(Level.SEVERE, "InfoAssignment.initLookup");
return false;
}
bNew.setImage("/images/New16.png");
return true;
} // initLookups
/**
* Static Setup - add fields to parameterPanel.
* <pre>
* ResourceType Resource DateTimeFrom DateTimeTo New
* </pre>
*/
private void statInit()
{
fieldFrom.setWidth("180px");
fieldTo.setWidth("180px");
bNew.addEventListener(Events.ON_CLICK, this);
Grid grid = GridFactory.newGridLayout();
Rows rows = new Rows();
grid.appendChild(rows);
Row row = new Row();
rows.appendChild(row);
row.appendChild(fieldResourceType.getLabel().rightAlign());
row.appendChild(fieldResource.getLabel().rightAlign());
row.appendChild(labelFrom.rightAlign());
row.appendChild(labelTo.rightAlign());
row.appendChild(new Label());
row = new Row();
rows.appendChild(row);
row.appendChild(fieldResourceType.getComponent());
row.appendChild(fieldResource.getComponent());
Div div = new Div();
div.setAlign("right");
div.appendChild(fieldFrom);
row.appendChild(div);
div = new Div();
div.setAlign("right");
div.appendChild(fieldTo);
row.appendChild(div);
row.appendChild(bNew);
layout = new Borderlayout();
layout.setWidth("100%");
layout.setHeight("100%");
if (!isLookup())
{
layout.setStyle("position: absolute");
}
this.appendChild(layout);
North north = new North();
layout.appendChild(north);
north.appendChild(grid);
Center center = new Center();
layout.appendChild(center);
center.setFlex(true);
div = new Div();
div.appendChild(contentPanel);
if (isLookup())
contentPanel.setWidth("99%");
else
contentPanel.setStyle("width: 99%; margin: 0px auto;");
contentPanel.setVflex(true);
div.setStyle("width :100%; height: 100%");
center.appendChild(div);
South south = new South();
layout.appendChild(south);
southBody = new Vbox();
southBody.setWidth("100%");
south.appendChild(southBody);
southBody.appendChild(confirmPanel);
southBody.appendChild(new Separator());
southBody.appendChild(statusBar);
}
/**
* Dynamic Init
* @param value value
* @param whereClause where clause
*/
private void initInfo(String value, String whereClause)
{
// C_BPartner bp, AD_User c, C_BPartner_Location l, C_Location a
// Create Grid
StringBuffer where = new StringBuffer(s_assignmentWHERE);
if (whereClause != null && whereClause.length() > 0)
where.append(" AND ").append(whereClause);
prepareTable(s_assignmentLayout, s_assignmentFROM,
where.toString(), "rt.Name,r.Name,ra.AssignDateFrom");
} // initInfo
/*************************************************************************/
/**
* Event Listener
*
* @param e event
*/
public void onEvent (Event e)
{
// don't requery if fieldValue and fieldName are empty
// return;
super.onEvent(e);
} // onEvent
/*************************************************************************/
/**
* Get dynamic WHERE part of SQL
* To be overwritten by concrete classes
* @return WHERE clause
*/
protected String getSQLWhere()
{
StringBuffer sql = new StringBuffer();
Integer S_ResourceType_ID = (Integer)fieldResourceType.getValue();
if (S_ResourceType_ID != null)
sql.append(" AND rt.S_ResourceType_ID=").append(S_ResourceType_ID.intValue());
Integer S_Resource_ID = (Integer)fieldResource.getValue();
if (S_Resource_ID != null)
sql.append(" AND r.S_Resource_ID=").append(S_Resource_ID.intValue());
Date f = fieldFrom.getValue();
Timestamp ts = f != null ? new Timestamp(f.getTime()) : null;
if (ts != null)
sql.append(" AND TRUNC(ra.AssignDateFrom, 'DD')>=").append(DB.TO_DATE(ts,false));
Date t = fieldTo.getValue();
ts = t != null ? new Timestamp(t.getTime()) : null;
if (ts != null)
sql.append(" AND TRUNC(ra.AssignDateTo, 'DD')<=").append(DB.TO_DATE(ts,false));
return sql.toString();
} // getSQLWhere
/**
* Set Parameters for Query
* To be overwritten by concrete classes
* @param pstmt pstmt
* @param forCount for counting records
* @throws SQLException
*/
protected void setParameters (PreparedStatement pstmt, boolean forCount) throws SQLException
{
}
/**
* History dialog
* To be overwritten by concrete classes
*/
protected void showHistory()
{
}
/**
* Has History (false)
* To be overwritten by concrete classes
* @return true if it has history (default false)
*/
protected boolean hasHistory()
{
return false;
}
/**
* Customize dialog
* To be overwritten by concrete classes
*/
protected void customize()
{
}
/**
* Has Customize (false)
* To be overwritten by concrete classes
* @return true if it has customize (default false)
*/
protected boolean hasCustomize()
{
return false;
}
/**
* Zoom action
* To be overwritten by concrete classes
*/
public void zoom()
{
if (getSelectedRowKey() != null && getSelectedRowKey() > 0)
{
MQuery zoomQuery = new MQuery(); // ColumnName might be changed in MTab.validateQuery
String column = getKeyColumn();
//strip off table name, fully qualify name doesn't work when zoom into detail tab
if (column.indexOf(".") > 0)
column = column.substring(column.indexOf(".")+1);
zoomQuery.addRestriction(column, MQuery.EQUAL, getSelectedRowKey());
zoomQuery.setRecordCount(1);
zoomQuery.setTableName(column.substring(0, column.length() - 3));
AEnv.zoom(236, zoomQuery);
}
}
/**
* Has Zoom (false)
* To be overwritten by concrete classes
* @return true if it has zoom (default false)
*/
protected boolean hasZoom()
{
return true;
}
/**
* Save Selection Details
* To be overwritten by concrete classes
*/
protected void saveSelectionDetail()
{
}
public void valueChange(ValueChangeEvent evt)
{
}
public void tableChanged(WTableModelEvent event)
{
}
@Override
protected void insertPagingComponent()
{
southBody.insertBefore(paging, southBody.getFirstChild());
layout.invalidate();
}
}