/******************************************************************************
* Copyright (C) 2008 Elaine Tan *
* Copyright (C) 2008 Idalica Corporation
* 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. *
*****************************************************************************/
package org.adempiere.webui.window;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.ArrayList;
import java.util.logging.Level;
import org.adempiere.webui.apps.AEnv;
import org.adempiere.webui.component.Checkbox;
import org.adempiere.webui.component.ConfirmPanel;
import org.adempiere.webui.component.Grid;
import org.adempiere.webui.component.GridFactory;
import org.adempiere.webui.component.Label;
import org.adempiere.webui.component.ListItem;
import org.adempiere.webui.component.Listbox;
import org.adempiere.webui.component.Row;
import org.adempiere.webui.component.Rows;
import org.adempiere.webui.component.Window;
import org.compiere.model.MRecordAccess;
import org.compiere.model.MRole;
import org.compiere.util.CLogger;
import org.compiere.util.DB;
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.zul.Div;
import org.zkoss.zul.Toolbarbutton;
/**
* Record Access Dialog
* @author <a href="mailto:elaine.tan@idalica.com">Elaine</a>
* @date December 9, 2008
*/
public class WRecordAccessDialog extends Window implements EventListener
{
/**
*
*/
private static final long serialVersionUID = -3591753244744022795L;
/**
* Record Access Dialog
* @param owner owner
* @param AD_Table_ID table
* @param Record_ID record
*/
public WRecordAccessDialog(Window parent, int AD_Table_ID, int Record_ID)
{
super();
setTitle(Msg.translate(Env.getCtx(), "RecordAccessDialog"));
setAttribute("modal", Boolean.TRUE);
setBorder("normal");
setWidth("600px");
setSizable(true);
log.info("AD_Table_ID=" + AD_Table_ID + ", Record_ID=" + Record_ID);
m_AD_Table_ID = AD_Table_ID;
m_Record_ID = Record_ID;
try
{
dynInit();
jbInit();
}
catch (Exception e)
{
log.log(Level.SEVERE, "", e);
}
AEnv.showWindow(this);
} // RecordAccessDialog
private int m_AD_Table_ID;
private int m_Record_ID;
private ArrayList<MRecordAccess> m_recordAccesss = new ArrayList<MRecordAccess>();
private int m_currentRow = 0;
private MRecordAccess m_currentData = null;
private CLogger log = CLogger.getCLogger(getClass());
private Label roleLabel = new Label(Msg.translate(Env.getCtx(), "AD_Role_ID"));
private Listbox roleField = null;
private Checkbox cbActive = new Checkbox();//Msg.translate(Env.getCtx(), "IsActive"));
private Checkbox cbExclude = new Checkbox();//Msg.translate(Env.getCtx(), "IsExclude"));
private Checkbox cbReadOnly = new Checkbox();//Msg.translate(Env.getCtx(), "IsReadOnly"));
private Checkbox cbDependent = new Checkbox();//Msg.translate(Env.getCtx(), "IsDependentEntities"));
private Toolbarbutton bDelete = new Toolbarbutton();//AEnv.getButton("Delete");
private Toolbarbutton bNew = new Toolbarbutton();//AEnv.getButton("New");
private Label rowNoLabel = new Label();
private Toolbarbutton bUp = new Toolbarbutton();//AEnv.getButton("Previous");
private Toolbarbutton bDown = new Toolbarbutton();//AEnv.getButton("Next");
private ConfirmPanel confirmPanel = new ConfirmPanel(true);
/**
* Dynamic Init
*/
private void dynInit()
{
// Load Roles
String sql = MRole.getDefault().addAccessSQL(
"SELECT AD_Role_ID, Name FROM AD_Role ORDER BY 2",
"AD_Role", MRole.SQL_NOTQUALIFIED, MRole.SQL_RO);
roleField = new Listbox(DB.getKeyNamePairs(sql, false));
roleField.setMold("select");
// Load Record Access for all roles
sql = "SELECT * FROM AD_Record_Access "
+ "WHERE AD_Table_ID=? AND Record_ID=? AND AD_Client_ID=?";
PreparedStatement pstmt = null;
try
{
pstmt = DB.prepareStatement(sql, null);
pstmt.setInt(1, m_AD_Table_ID);
pstmt.setInt(2, m_Record_ID);
pstmt.setInt(3, Env.getAD_Client_ID(Env.getCtx()));
ResultSet rs = pstmt.executeQuery();
while (rs.next())
m_recordAccesss.add(new MRecordAccess(Env.getCtx(), rs, null));
rs.close();
pstmt.close();
pstmt = null;
}
catch (Exception e)
{
log.log(Level.SEVERE, sql, e);
}
try
{
if (pstmt != null)
pstmt.close();
pstmt = null;
}
catch (Exception e)
{
pstmt = null;
}
log.fine("#" + m_recordAccesss.size());
setLine(0, false);
} // dynInit
/**
* Static Init
* @throws Exception
*/
private void jbInit() throws Exception
{
bDelete.setImage("/images/Delete16.png");
bDelete.setTooltiptext(Msg.getMsg(Env.getCtx(), "Delete"));
bNew.setImage("/images/New16.png");
bNew.setTooltiptext(Msg.getMsg(Env.getCtx(), "New"));
bUp.setImage("/images/Previous16.png");
bUp.setTooltiptext(Msg.getMsg(Env.getCtx(), "Previous"));
bDown.setImage("/images/Next16.png");
bDown.setTooltiptext(Msg.getMsg(Env.getCtx(), "Next"));
cbActive.setText(Msg.translate(Env.getCtx(), "IsActive"));
cbExclude.setText(Msg.translate(Env.getCtx(), "IsExclude"));
cbReadOnly.setText(Msg.translate(Env.getCtx(), "IsReadOnly"));
cbDependent.setText(Msg.translate(Env.getCtx(), "IsDependentEntities"));
Grid grid = GridFactory.newGridLayout();
this.appendChild(grid);
Rows rows = new Rows();
grid.appendChild(rows);
Row row = new Row();
rows.appendChild(row);
row.appendChild(bUp);
row.appendChild(new Label());
row.appendChild(new Label());
row.appendChild(new Label());
row.appendChild(new Label());
row.appendChild(new Label());
row.appendChild(bNew);
row = new Row();
rows.appendChild(row);
row.appendChild(roleLabel);
row.appendChild(roleField);
row.appendChild(cbActive);
row.appendChild(cbExclude);
row.appendChild(cbReadOnly);
row.appendChild(cbDependent);
row.appendChild(bDelete);
row = new Row();
rows.appendChild(row);
row.appendChild(bDown);
row.appendChild(new Label());
row.appendChild(new Label());
row.appendChild(new Label());
row.appendChild(new Label());
row.appendChild(new Label());
row.appendChild(rowNoLabel);
row = new Row();
rows.appendChild(row);
row.setSpans("7");
Div div = new Div();
div.setAlign("right");
div.appendChild(confirmPanel);
row.appendChild(div);
bUp.addEventListener(Events.ON_CLICK, this);
bDown.addEventListener(Events.ON_CLICK, this);
bDelete.addEventListener(Events.ON_CLICK, this);
bNew.addEventListener(Events.ON_CLICK, this);
confirmPanel.addActionListener(this);
} // jbInit
/**
* Set Line
* @param rowDelta delta to current row
* @param newRecord new
*/
private void setLine (int rowDelta, boolean newRecord)
{
log.fine("delta=" + rowDelta + ", new=" + newRecord
+ " - currentRow=" + m_currentRow + ", size=" + m_recordAccesss.size());
int maxIndex = 0;
// nothing defined
if (m_recordAccesss.size() == 0)
{
m_currentRow = 0;
maxIndex = 0;
newRecord = true;
setLine(null);
}
else if (newRecord)
{
m_currentRow = m_recordAccesss.size();
maxIndex = m_currentRow;
setLine(null);
}
else
{
m_currentRow += rowDelta;
maxIndex = m_recordAccesss.size() - 1;
if (m_currentRow < 0)
m_currentRow = 0;
else if (m_currentRow > maxIndex)
m_currentRow = maxIndex;
//
MRecordAccess ra = (MRecordAccess)m_recordAccesss.get(m_currentRow);
setLine(ra);
}
// Label
StringBuffer txt = new StringBuffer();
if (newRecord)
txt.append("+");
txt.append(m_currentRow+1).append("/").append(maxIndex+1);
rowNoLabel.setText(txt.toString());
// set up/down
bUp.setDisabled(m_currentRow <= 0);
bDown.setDisabled(m_currentRow >= maxIndex);
} // setLine
/**
* Set Selection
* @param ra record access
*/
private void setLine (MRecordAccess ra)
{
int AD_Role_ID = 0;
boolean active = true;
boolean exclude = true;
boolean readonly = false;
boolean dependent = false;
//
if (ra != null)
{
AD_Role_ID = ra.getAD_Role_ID();
active = ra.isActive();
exclude = ra.isExclude();
readonly = ra.isReadOnly();
dependent = ra.isDependentEntities();
}
cbActive.setSelected(active);
cbExclude.setSelected(exclude);
cbReadOnly.setSelected(readonly);
cbDependent.setSelected(dependent);
bDelete.setDisabled(ra == null);
//
ListItem selection = null;
for (int i = 0; i < roleField.getItemCount(); i++)
{
ListItem pp = roleField.getItemAtIndex(i);
if (pp != null && (Integer)pp.getValue() != null)
{
if(((Integer)pp.getValue()).intValue() == AD_Role_ID)
selection = pp;
}
}
if (selection != null && ra != null)
{
roleField.setSelectedItem(selection);
m_currentData = ra;
log.fine("" + ra);
}
else
m_currentData = null;
} // setLine
/**
* Action Listener
* @param e event
*/
public void onEvent(Event e) throws Exception
{
if (e.getTarget() == bUp)
setLine(-1, false);
else if (e.getTarget() == bDown)
setLine(+1, false);
else if (e.getTarget() == bNew)
setLine(0, true);
else
{
if (e.getTarget() == bDelete)
cmd_delete();
else if (e.getTarget().getId().equals(ConfirmPanel.A_OK))
{
if (!cmd_save())
return;
}
dispose();
}
}
/**
* Save Command
* @return true if saved
*/
private boolean cmd_save()
{
ListItem pp = roleField.getSelectedItem();
if (pp == null)
return false;
int AD_Role_ID = ((Integer)pp.getValue()).intValue();
//
boolean isActive = cbActive.isSelected();
boolean isExclude = cbExclude.isSelected();
boolean isReadOnly = cbReadOnly.isSelected();
boolean isDependentEntities = cbDependent.isSelected();
//
if (m_currentData == null)
{
m_currentData = new MRecordAccess (Env.getCtx(), AD_Role_ID, m_AD_Table_ID, m_Record_ID, null);
m_recordAccesss.add(m_currentData);
m_currentRow = m_recordAccesss.size()-1;
}
m_currentData.setIsActive(isActive);
m_currentData.setIsExclude(isExclude);
m_currentData.setIsReadOnly(isReadOnly);
m_currentData.setIsDependentEntities(isDependentEntities);
boolean success = m_currentData.save();
//
log.fine("Success=" + success);
return success;
} // cmd_save
/**
* Delete Command
* @return true if deleted
*/
private boolean cmd_delete()
{
boolean success = false;
if (m_currentData == null)
log.log(Level.SEVERE, "No data");
else
{
success = m_currentData.delete(true);
m_currentData = null;
m_recordAccesss.remove(m_currentRow);
log.fine("Success=" + success);
}
return success;
} // cmd_delete
}