hg merge 71b0bba695a6 / Solving the conflict for AbstractADWindowPanel.java

This commit is contained in:
Carlos Ruiz 2012-09-13 14:56:32 -05:00
commit 92f9a9f47c
12 changed files with 345 additions and 531 deletions

View File

@ -0,0 +1,36 @@
-- Sep 12, 2012 6:56:41 PM SGT
-- IDEMPIERE-375 Implement Forgot my Password
INSERT INTO AD_SysConfig (AD_SysConfig_ID,EntityType,ConfigurationLevel,Value,Description,AD_SysConfig_UU,Created,Updated,AD_Client_ID,AD_Org_ID,CreatedBy,IsActive,UpdatedBy,Name) VALUES (200020,'D','S','Y','New password must differs from the old password','13b5a576-7b91-471b-8b40-05589dd585f7',TO_DATE('2012-09-12 18:56:39','YYYY-MM-DD HH24:MI:SS'),TO_DATE('2012-09-12 18:56:39','YYYY-MM-DD HH24:MI:SS'),0,0,100,'Y',100,'CHANGE_PASSWORD_MUST_DIFFER')
;
-- Sep 12, 2012 6:57:05 PM SGT
-- IDEMPIERE-375 Implement Forgot my Password
UPDATE AD_Column SET FieldLength=1024,Updated=TO_DATE('2012-09-12 18:57:05','YYYY-MM-DD HH24:MI:SS'),UpdatedBy=100 WHERE AD_Column_ID=200457
;
-- Sep 12, 2012 6:57:13 PM SGT
-- IDEMPIERE-375 Implement Forgot my Password
ALTER TABLE AD_User MODIFY SecurityQuestion NVARCHAR2(1024) DEFAULT NULL
;
-- Sep 12, 2012 6:58:41 PM SGT
-- IDEMPIERE-375 Implement Forgot my Password
INSERT INTO AD_Message (MsgType,MsgText,AD_Message_ID,EntityType,AD_Message_UU,Value,IsActive,Updated,CreatedBy,UpdatedBy,AD_Client_ID,AD_Org_ID,Created) VALUES ('E','New Password must differ from Old Password',200066,'U','0d873a03-0980-4725-8a4f-a6954e4ee59e','NewPasswordMustDiffer','Y',TO_DATE('2012-09-12 18:58:40','YYYY-MM-DD HH24:MI:SS'),100,100,0,0,TO_DATE('2012-09-12 18:58:40','YYYY-MM-DD HH24:MI:SS'))
;
-- Sep 12, 2012 6:58:41 PM SGT
-- IDEMPIERE-375 Implement Forgot my Password
INSERT INTO AD_Message_Trl (AD_Language,AD_Message_ID, MsgText,MsgTip, IsTranslated,AD_Client_ID,AD_Org_ID,Created,Createdby,Updated,UpdatedBy,AD_Message_Trl_UU ) SELECT l.AD_Language,t.AD_Message_ID, t.MsgText,t.MsgTip, 'N',t.AD_Client_ID,t.AD_Org_ID,t.Created,t.Createdby,t.Updated,t.UpdatedBy,Generate_UUID() FROM AD_Language l, AD_Message t WHERE l.IsActive='Y' AND l.IsSystemLanguage='Y' AND l.IsBaseLanguage='N' AND t.AD_Message_ID=200066 AND NOT EXISTS (SELECT * FROM AD_Message_Trl tt WHERE tt.AD_Language=l.AD_Language AND tt.AD_Message_ID=t.AD_Message_ID)
;
-- Sep 12, 2012 6:58:45 PM SGT
-- IDEMPIERE-375 Implement Forgot my Password
UPDATE AD_Message SET EntityType='D',Updated=TO_DATE('2012-09-12 18:58:45','YYYY-MM-DD HH24:MI:SS'),UpdatedBy=100 WHERE AD_Message_ID=200066
;
UPDATE AD_User u SET SecurityQuestion = (
SELECT MAX(m.MsgText) FROM AD_Message m WHERE m.Value = u.SecurityQuestion)
WHERE u.SecurityQuestion IS NOT NULL;
SELECT register_migration_script('910_IDEMPIERE-375.sql') FROM dual
;

View File

@ -0,0 +1,36 @@
-- Sep 12, 2012 6:56:41 PM SGT
-- IDEMPIERE-375 Implement Forgot my Password
INSERT INTO AD_SysConfig (AD_SysConfig_ID,EntityType,ConfigurationLevel,Value,Description,AD_SysConfig_UU,Created,Updated,AD_Client_ID,AD_Org_ID,CreatedBy,IsActive,UpdatedBy,Name) VALUES (200020,'D','S','Y','New password must differs from the old password','13b5a576-7b91-471b-8b40-05589dd585f7',TO_TIMESTAMP('2012-09-12 18:56:39','YYYY-MM-DD HH24:MI:SS'),TO_TIMESTAMP('2012-09-12 18:56:39','YYYY-MM-DD HH24:MI:SS'),0,0,100,'Y',100,'CHANGE_PASSWORD_MUST_DIFFER')
;
-- Sep 12, 2012 6:57:05 PM SGT
-- IDEMPIERE-375 Implement Forgot my Password
UPDATE AD_Column SET FieldLength=1024,Updated=TO_TIMESTAMP('2012-09-12 18:57:05','YYYY-MM-DD HH24:MI:SS'),UpdatedBy=100 WHERE AD_Column_ID=200457
;
-- Sep 12, 2012 6:57:13 PM SGT
-- IDEMPIERE-375 Implement Forgot my Password
INSERT INTO t_alter_column values('ad_user','SecurityQuestion','VARCHAR(1024)',null,'NULL')
;
-- Sep 12, 2012 6:58:41 PM SGT
-- IDEMPIERE-375 Implement Forgot my Password
INSERT INTO AD_Message (MsgType,MsgText,AD_Message_ID,EntityType,AD_Message_UU,Value,IsActive,Updated,CreatedBy,UpdatedBy,AD_Client_ID,AD_Org_ID,Created) VALUES ('E','New Password must differ from Old Password',200066,'U','0d873a03-0980-4725-8a4f-a6954e4ee59e','NewPasswordMustDiffer','Y',TO_TIMESTAMP('2012-09-12 18:58:40','YYYY-MM-DD HH24:MI:SS'),100,100,0,0,TO_TIMESTAMP('2012-09-12 18:58:40','YYYY-MM-DD HH24:MI:SS'))
;
-- Sep 12, 2012 6:58:41 PM SGT
-- IDEMPIERE-375 Implement Forgot my Password
INSERT INTO AD_Message_Trl (AD_Language,AD_Message_ID, MsgText,MsgTip, IsTranslated,AD_Client_ID,AD_Org_ID,Created,Createdby,Updated,UpdatedBy,AD_Message_Trl_UU ) SELECT l.AD_Language,t.AD_Message_ID, t.MsgText,t.MsgTip, 'N',t.AD_Client_ID,t.AD_Org_ID,t.Created,t.Createdby,t.Updated,t.UpdatedBy,Generate_UUID() FROM AD_Language l, AD_Message t WHERE l.IsActive='Y' AND l.IsSystemLanguage='Y' AND l.IsBaseLanguage='N' AND t.AD_Message_ID=200066 AND NOT EXISTS (SELECT * FROM AD_Message_Trl tt WHERE tt.AD_Language=l.AD_Language AND tt.AD_Message_ID=t.AD_Message_ID)
;
-- Sep 12, 2012 6:58:45 PM SGT
-- IDEMPIERE-375 Implement Forgot my Password
UPDATE AD_Message SET EntityType='D',Updated=TO_TIMESTAMP('2012-09-12 18:58:45','YYYY-MM-DD HH24:MI:SS'),UpdatedBy=100 WHERE AD_Message_ID=200066
;
UPDATE AD_User u SET SecurityQuestion = (
SELECT MAX(m.MsgText) FROM AD_Message m WHERE m.Value = u.SecurityQuestion)
WHERE u.SecurityQuestion IS NOT NULL;
SELECT register_migration_script('910_IDEMPIERE-375.sql') FROM dual
;

View File

@ -95,6 +95,7 @@ public class MSysConfig extends X_AD_SysConfig
public static final String USER_LOCKING_MAX_LOGIN_ATTEMPT = "USER_LOCKING_MAX_LOGIN_ATTEMPT"; public static final String USER_LOCKING_MAX_LOGIN_ATTEMPT = "USER_LOCKING_MAX_LOGIN_ATTEMPT";
public static final String USER_LOCKING_MAX_INACTIVE_PERIOD_DAY = "USER_LOCKING_MAX_INACTIVE_PERIOD_DAY"; public static final String USER_LOCKING_MAX_INACTIVE_PERIOD_DAY = "USER_LOCKING_MAX_INACTIVE_PERIOD_DAY";
public static final String USER_LOCKING_MAX_PASSWORD_AGE_DAY = "USER_LOCKING_MAX_PASSWORD_AGE_DAY"; public static final String USER_LOCKING_MAX_PASSWORD_AGE_DAY = "USER_LOCKING_MAX_PASSWORD_AGE_DAY";
public static final String CHANGE_PASSWORD_MUST_DIFFER = "CHANGE_PASSWORD_MUST_DIFFER";
public static final String ProductUOMConversionUOMValidate = "ProductUOMConversionUOMValidate"; public static final String ProductUOMConversionUOMValidate = "ProductUOMConversionUOMValidate";
public static final String ProductUOMConversionRateValidate = "ProductUOMConversionRateValidate"; public static final String ProductUOMConversionRateValidate = "ProductUOMConversionRateValidate";
public static final String SYSTEM_INSERT_CHANGELOG = "SYSTEM_INSERT_CHANGELOG"; public static final String SYSTEM_INSERT_CHANGELOG = "SYSTEM_INSERT_CHANGELOG";

View File

@ -120,9 +120,6 @@ public final class ALogin extends CDialog
private static final int CONNECTED_OK = 0; private static final int CONNECTED_OK = 0;
private static final int CONNECTED_OK_WITH_PASSWORD_EXPIRED = 1; private static final int CONNECTED_OK_WITH_PASSWORD_EXPIRED = 1;
/* private static final int NO_OF_SECURITY_QUESTION = 5;
private static final String SECURITY_QUESTION_PREFIX = "SecurityQuestion_";
*/
private CPanel mainPanel = new CPanel(new BorderLayout()); private CPanel mainPanel = new CPanel(new BorderLayout());
private CTabbedPane loginTabPane = new CTabbedPane(); private CTabbedPane loginTabPane = new CTabbedPane();
private CPanel connectionPanel = new CPanel(); private CPanel connectionPanel = new CPanel();
@ -169,11 +166,11 @@ public final class ALogin extends CDialog
private JPasswordField txtNewPassword = new JPasswordField(); private JPasswordField txtNewPassword = new JPasswordField();
private JPasswordField txtRetypeNewPassword = new JPasswordField(); private JPasswordField txtRetypeNewPassword = new JPasswordField();
// //
/* private CLabel lblSecurityQuestion = new CLabel(); private CLabel lblSecurityQuestion = new CLabel();
private CLabel lblAnswer = new CLabel(); private CLabel lblAnswer = new CLabel();
private VComboBox lstSecurityQuestion = new VComboBox(); private CTextField txtSecurityQuestion = new CTextField();
private CTextField txtAnswer = new CTextField(); private CTextField txtAnswer = new CTextField();
*/
/** Server Connection */ /** Server Connection */
private CConnection m_cc; private CConnection m_cc;
/** Application User */ /** Application User */
@ -382,22 +379,18 @@ public final class ALogin extends CDialog
lblRetypeNewPassword.setHorizontalAlignment(SwingConstants.RIGHT); lblRetypeNewPassword.setHorizontalAlignment(SwingConstants.RIGHT);
lblRetypeNewPassword.setText(Msg.getMsg(m_ctx, "New Password Confirm")); lblRetypeNewPassword.setText(Msg.getMsg(m_ctx, "New Password Confirm"));
/* lstSecurityQuestion.setName("lstSecurityQuestion"); txtSecurityQuestion.setName("txtSecurityQuestion");
lblSecurityQuestion.setRequestFocusEnabled(false); lblSecurityQuestion.setRequestFocusEnabled(false);
lblSecurityQuestion.setLabelFor(lstSecurityQuestion); lblSecurityQuestion.setLabelFor(txtSecurityQuestion);
lblSecurityQuestion.setHorizontalAlignment(SwingConstants.RIGHT); lblSecurityQuestion.setHorizontalAlignment(SwingConstants.RIGHT);
lblSecurityQuestion.setText(Msg.getMsg(m_ctx, "SecurityQuestion")); lblSecurityQuestion.setText(Msg.getMsg(m_ctx, "SecurityQuestion"));
lstSecurityQuestion.removeAllItems();
for (int i = 1; i <= NO_OF_SECURITY_QUESTION; i++)
lstSecurityQuestion.addItem(new ValueNamePair(SECURITY_QUESTION_PREFIX + i, Msg.getMsg(m_ctx, SECURITY_QUESTION_PREFIX + i)));
txtAnswer.setName("txtAnswer"); txtAnswer.setName("txtAnswer");
lblAnswer.setRequestFocusEnabled(false); lblAnswer.setRequestFocusEnabled(false);
lblAnswer.setLabelFor(txtAnswer); lblAnswer.setLabelFor(txtAnswer);
lblAnswer.setHorizontalAlignment(SwingConstants.RIGHT); lblAnswer.setHorizontalAlignment(SwingConstants.RIGHT);
lblAnswer.setText(Msg.getMsg(m_ctx, "Answer")); lblAnswer.setText(Msg.getMsg(m_ctx, "Answer"));
*/
changePasswordPanel.setLayout(changePasswordPanelLayout); changePasswordPanel.setLayout(changePasswordPanelLayout);
changePasswordPanel.add(lblOldPassword, new GridBagConstraints(0, 0, 1, 1, 0.0, 0.0 changePasswordPanel.add(lblOldPassword, new GridBagConstraints(0, 0, 1, 1, 0.0, 0.0
@ -412,15 +405,15 @@ public final class ALogin extends CDialog
,GridBagConstraints.EAST, GridBagConstraints.NONE, new Insets(12, 12, 5, 5), 0, 0)); ,GridBagConstraints.EAST, GridBagConstraints.NONE, new Insets(12, 12, 5, 5), 0, 0));
changePasswordPanel.add(txtRetypeNewPassword, new GridBagConstraints(1, 2, 1, 1, 1.0, 0.0 changePasswordPanel.add(txtRetypeNewPassword, new GridBagConstraints(1, 2, 1, 1, 1.0, 0.0
,GridBagConstraints.WEST, GridBagConstraints.HORIZONTAL, new Insets(12, 0, 5, 12), 0, 0)); ,GridBagConstraints.WEST, GridBagConstraints.HORIZONTAL, new Insets(12, 0, 5, 12), 0, 0));
/* changePasswordPanel.add(lblSecurityQuestion, new GridBagConstraints(0, 3, 1, 1, 0.0, 0.0 changePasswordPanel.add(lblSecurityQuestion, new GridBagConstraints(0, 3, 1, 1, 0.0, 0.0
,GridBagConstraints.EAST, GridBagConstraints.NONE, new Insets(12, 12, 5, 5), 0, 0)); ,GridBagConstraints.EAST, GridBagConstraints.NONE, new Insets(12, 12, 5, 5), 0, 0));
changePasswordPanel.add(lstSecurityQuestion, new GridBagConstraints(1, 3, 1, 1, 1.0, 0.0 changePasswordPanel.add(txtSecurityQuestion, new GridBagConstraints(1, 3, 1, 1, 1.0, 0.0
,GridBagConstraints.WEST, GridBagConstraints.HORIZONTAL, new Insets(12, 0, 5, 12), 0, 0)); ,GridBagConstraints.WEST, GridBagConstraints.HORIZONTAL, new Insets(12, 0, 5, 12), 0, 0));
changePasswordPanel.add(lblAnswer, new GridBagConstraints(0, 4, 1, 1, 0.0, 0.0 changePasswordPanel.add(lblAnswer, new GridBagConstraints(0, 4, 1, 1, 0.0, 0.0
,GridBagConstraints.EAST, GridBagConstraints.NONE, new Insets(12, 12, 5, 5), 0, 0)); ,GridBagConstraints.EAST, GridBagConstraints.NONE, new Insets(12, 12, 5, 5), 0, 0));
changePasswordPanel.add(txtAnswer, new GridBagConstraints(1, 4, 1, 1, 1.0, 0.0 changePasswordPanel.add(txtAnswer, new GridBagConstraints(1, 4, 1, 1, 1.0, 0.0
,GridBagConstraints.WEST, GridBagConstraints.HORIZONTAL, new Insets(12, 0, 5, 12), 0, 0)); ,GridBagConstraints.WEST, GridBagConstraints.HORIZONTAL, new Insets(12, 0, 5, 12), 0, 0));
*/ loginTabPane.add(changePasswordPanel, res.getString("ChangePassword")); loginTabPane.add(changePasswordPanel, res.getString("ChangePassword"));
loginTabPane.setEnabledAt(TAB_CHANGE_PASSWORD, false); loginTabPane.setEnabledAt(TAB_CHANGE_PASSWORD, false);
// //
@ -656,12 +649,9 @@ public final class ALogin extends CDialog
String newPassword = new String(txtNewPassword.getPassword()); String newPassword = new String(txtNewPassword.getPassword());
String retypeNewPassword = new String(txtRetypeNewPassword.getPassword()); String retypeNewPassword = new String(txtRetypeNewPassword.getPassword());
/* String securityQuestion = null; String securityQuestion = txtSecurityQuestion.getText();
if (lstSecurityQuestion.getSelectedItem() != null)
securityQuestion = ((ValueNamePair) lstSecurityQuestion.getSelectedItem()).getValue();
String answer = txtAnswer.getText(); String answer = txtAnswer.getText();
*/
if (Util.isEmpty(oldPassword)) if (Util.isEmpty(oldPassword))
{ {
statusBar.setStatusLine(Msg.getMsg(m_ctx, "OldPasswordMandatory"), true); statusBar.setStatusLine(Msg.getMsg(m_ctx, "OldPasswordMandatory"), true);
@ -680,7 +670,7 @@ public final class ALogin extends CDialog
return; return;
} }
/* if (Util.isEmpty(securityQuestion)) if (Util.isEmpty(securityQuestion))
{ {
statusBar.setStatusLine(Msg.getMsg(m_ctx, "SecurityQuestionMandatory"), true); statusBar.setStatusLine(Msg.getMsg(m_ctx, "SecurityQuestionMandatory"), true);
return; return;
@ -691,13 +681,22 @@ public final class ALogin extends CDialog
statusBar.setStatusLine(Msg.getMsg(m_ctx, "AnswerMandatory"), true); statusBar.setStatusLine(Msg.getMsg(m_ctx, "AnswerMandatory"), true);
return; return;
} }
*/
String m_userPassword = new String(m_pwd); String m_userPassword = new String(m_pwd);
if (!oldPassword.equals(m_userPassword)) if (!oldPassword.equals(m_userPassword))
{ {
statusBar.setStatusLine(Msg.getMsg(m_ctx, "OldPasswordNoMatch"), true); statusBar.setStatusLine(Msg.getMsg(m_ctx, "OldPasswordNoMatch"), true);
return; return;
} }
if (MSysConfig.getBooleanValue(MSysConfig.CHANGE_PASSWORD_MUST_DIFFER, true))
{
if (oldPassword.equals(newPassword))
{
statusBar.setStatusLine(Msg.getMsg(m_ctx, "NewPasswordMustDiffer"), true);
return;
}
}
Trx trx = null; Trx trx = null;
try try
@ -721,9 +720,9 @@ public final class ALogin extends CDialog
user.setPassword(newPassword); user.setPassword(newPassword);
user.setIsExpired(false); user.setIsExpired(false);
/* user.setSecurityQuestion(securityQuestion); user.setSecurityQuestion(securityQuestion);
user.setAnswer(answer); user.setAnswer(answer);
*/ if (!user.save(trx.getTrxName())) if (!user.save(trx.getTrxName()))
{ {
trx.rollback(); trx.rollback();
statusBar.setStatusLine("Could not update user", true); statusBar.setStatusLine("Could not update user", true);

View File

@ -135,7 +135,7 @@ public abstract class AbstractADTab extends AbstractUIPart implements IADTab
private void prepareContext(int newIndex, IADTabpanel newTab) { private void prepareContext(int newIndex, IADTabpanel newTab) {
//update context //update context
if (newTab != null && (adWindowPanel == null || !adWindowPanel.isEmbedded())) if (newTab != null)
{ {
List<Integer> parents = new ArrayList<Integer>(); List<Integer> parents = new ArrayList<Integer>();
//get parent list, always include first tab (0) //get parent list, always include first tab (0)

View File

@ -61,8 +61,6 @@ public class CWindowToolbar extends FToolbar implements EventListener<Event>
private static final String BTNPREFIX = "Btn"; private static final String BTNPREFIX = "Btn";
private static final String EMBEDDED_TOOLBAR_BUTTON_STYLE = "background-color: transparent; display:inline-block; margin-left: 1px; margin-right: 1px; width: 20px; height: 18px;";
private static CLogger log = CLogger.getCLogger(CWindowToolbar.class); private static CLogger log = CLogger.getCLogger(CWindowToolbar.class);
private ToolBarButton btnIgnore; private ToolBarButton btnIgnore;
@ -101,8 +99,6 @@ public class CWindowToolbar extends FToolbar implements EventListener<Event>
private Map<Integer, ToolBarButton> altKeyMap = new HashMap<Integer, ToolBarButton>(); private Map<Integer, ToolBarButton> altKeyMap = new HashMap<Integer, ToolBarButton>();
private Map<Integer, ToolBarButton> ctrlKeyMap = new HashMap<Integer, ToolBarButton>(); private Map<Integer, ToolBarButton> ctrlKeyMap = new HashMap<Integer, ToolBarButton>();
private boolean embedded;
// Elaine 2008/12/04 // Elaine 2008/12/04
/** Show Personal Lock */ /** Show Personal Lock */
public boolean isPersonalLock = MRole.getDefault().isPersonalLock(); public boolean isPersonalLock = MRole.getDefault().isPersonalLock();
@ -120,17 +116,10 @@ public class CWindowToolbar extends FToolbar implements EventListener<Event>
public CWindowToolbar() public CWindowToolbar()
{ {
this(false); this(0);
} }
public CWindowToolbar(boolean embedded) public CWindowToolbar(int windowNo) {
{
this.embedded = embedded;
init();
}
public CWindowToolbar(boolean embedded, int windowNo) {
this.embedded = embedded;
setWindowNo(windowNo); setWindowNo(windowNo);
init(); init();
} }
@ -197,20 +186,7 @@ public class CWindowToolbar extends FToolbar implements EventListener<Event>
configureKeyMap(); configureKeyMap();
if (embedded) setWidth("100%");
{
btnParentRecord.setVisible(false);
btnDetailRecord.setVisible(false);
btnActiveWorkflows.setVisible(false);
btnProductInfo.setVisible(false);
setAlign("end");
setWidth("100%");
setStyle("background: transparent none; ");
}
else
{
setWidth("100%");
}
} }
@ -219,20 +195,13 @@ public class CWindowToolbar extends FToolbar implements EventListener<Event>
ToolBarButton btn = new ToolBarButton(""); ToolBarButton btn = new ToolBarButton("");
btn.setName(BTNPREFIX+name); btn.setName(BTNPREFIX+name);
if (windowNo > 0) if (windowNo > 0)
btn.setAttribute(AdempiereIdGenerator.ZK_COMPONENT_PREFIX_ATTRIBUTE, "unq" + btn.getName() + "_" + windowNo + (embedded ? "E" : "")); btn.setAttribute(AdempiereIdGenerator.ZK_COMPONENT_PREFIX_ATTRIBUTE, "unq" + btn.getName() + "_" + windowNo);
else else
btn.setAttribute(AdempiereIdGenerator.ZK_COMPONENT_PREFIX_ATTRIBUTE, btn.getName()); btn.setAttribute(AdempiereIdGenerator.ZK_COMPONENT_PREFIX_ATTRIBUTE, btn.getName());
btn.setImage("/images/"+image + (embedded ? "16.png" : "24.png")); btn.setImage("/images/"+image + "24.png");
btn.setTooltiptext(Msg.getMsg(Env.getCtx(),tooltip)); btn.setTooltiptext(Msg.getMsg(Env.getCtx(),tooltip));
if (embedded) btn.setSclass("toolbar-button");
{
btn.setStyle(EMBEDDED_TOOLBAR_BUTTON_STYLE);
btn.setSclass("embedded-toolbar-button");
}
else
{
btn.setSclass("toolbar-button");
}
buttons.put(name, btn); buttons.put(name, btn);
this.appendChild(btn); this.appendChild(btn);
//make toolbar button last to receive focus //make toolbar button last to receive focus
@ -310,10 +279,7 @@ public class CWindowToolbar extends FToolbar implements EventListener<Event>
protected void addSeparator() protected void addSeparator()
{ {
Space s = new Space(); Space s = new Space();
if (embedded) s.setSpacing("6px");
s.setSpacing("3px");
else
s.setSpacing("6px");
s.setOrient("vertical"); s.setOrient("vertical");
this.appendChild(s); this.appendChild(s);
} }
@ -505,7 +471,7 @@ public class CWindowToolbar extends FToolbar implements EventListener<Event>
{ {
this.btnLock.setPressed(locked); this.btnLock.setPressed(locked);
String imgURL = "/images/"+ (this.btnLock.isPressed() ? "LockX" : "Lock") + (embedded ? "16.png" : "24.png"); String imgURL = "/images/"+ (this.btnLock.isPressed() ? "LockX" : "Lock") + "24.png";
this.btnLock.setImage(imgURL); this.btnLock.setImage(imgURL);
} }

View File

@ -23,7 +23,6 @@ import java.util.Iterator;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
import java.util.Map.Entry; import java.util.Map.Entry;
import java.util.Properties;
import java.util.logging.Level; import java.util.logging.Level;
import org.adempiere.webui.LayoutUtils; import org.adempiere.webui.LayoutUtils;
@ -146,8 +145,6 @@ DataStatusListener, IADTabpanel
private Map<Integer, Group> includedTab = new HashMap<Integer, Group>(); private Map<Integer, Group> includedTab = new HashMap<Integer, Group>();
private Map<Integer, Groupfoot> includedTabFooter = new HashMap<Integer, Groupfoot>(); private Map<Integer, Groupfoot> includedTabFooter = new HashMap<Integer, Groupfoot>();
private List<EmbeddedPanel> includedPanel = new ArrayList<EmbeddedPanel>();
private boolean active = false; private boolean active = false;
private Group currentGroup; private Group currentGroup;
@ -335,14 +332,6 @@ DataStatusListener, IADTabpanel
row.appendChild(new Separator()); row.appendChild(new Separator());
rows.appendChild(row); rows.appendChild(row);
for (EmbeddedPanel ep : includedPanel) {
if (ep.adTabId == field.getIncluded_Tab_ID()) {
ep.group = includedTab.get(ep.adTabId);
createEmbeddedPanelUI(ep, field.getDisplayLength());
break;
}
}
row = new Row(); row = new Row();
continue; continue;
} }
@ -759,27 +748,11 @@ DataStatusListener, IADTabpanel
} }
} }
//activate embedded panel
for(EmbeddedPanel ep : includedPanel)
{
activateChild(activate, ep);
}
if (gridTab.getRecord_ID() > 0 && gridTab.isTreeTab() && treePanel != null) { if (gridTab.getRecord_ID() > 0 && gridTab.isTreeTab() && treePanel != null) {
setSelectedNode(gridTab.getRecord_ID()); setSelectedNode(gridTab.getRecord_ID());
} }
} }
private void activateChild(boolean activate, EmbeddedPanel panel) {
if (activate)
{
panel.windowPanel.getADTab().evaluate(null);
panel.windowPanel.getADTab().setSelectedIndex(0);
panel.tabPanel.query(false, 0, 0);
}
panel.tabPanel.activate(activate);
}
/** /**
* set focus to first active editor * set focus to first active editor
*/ */
@ -928,27 +901,6 @@ DataStatusListener, IADTabpanel
listPanel.updateListIndex(); listPanel.updateListIndex();
listPanel.dynamicDisplay(col); listPanel.dynamicDisplay(col);
} }
if (!includedPanel.isEmpty() && e.getChangedColumn() == -1) {
ArrayList<String> parentColumnNames = new ArrayList<String>();
GridField[] parentFields = gridTab.getFields();
for (GridField parentField : parentFields)
parentColumnNames.add(parentField.getColumnName());
for (EmbeddedPanel panel : includedPanel)
{
GridTab tab = panel.tabPanel.getGridTab();
GridField[] fields = tab.getFields();
for (GridField field : fields)
{
if (!parentColumnNames.contains(field.getColumnName()))
Env.setContext(Env.getCtx(), field.getWindowNo(), field.getColumnName(), "");
}
panel.tabPanel.query(false, 0, 0);
}
parentColumnNames = null;
}
} }
private void deleteNode(int recordId) { private void deleteNode(int recordId) {
@ -1029,18 +981,8 @@ DataStatusListener, IADTabpanel
public void switchRowPresentation() { public void switchRowPresentation() {
if (formComponent.isVisible()) { if (formComponent.isVisible()) {
formComponent.setVisible(false); formComponent.setVisible(false);
//de-activate embedded panel
for(EmbeddedPanel ep : includedPanel)
{
activateChild(false, ep);
}
} else { } else {
formComponent.setVisible(true); formComponent.setVisible(true);
//activate embedded panel
for(EmbeddedPanel ep : includedPanel)
{
activateChild(true, ep);
}
formComponent.getParent().invalidate(); formComponent.getParent().invalidate();
} }
listPanel.setVisible(!formComponent.isVisible()); listPanel.setVisible(!formComponent.isVisible());
@ -1069,89 +1011,10 @@ DataStatusListener, IADTabpanel
} }
/**
* Embed detail tab
* @param ctx
* @param windowNo
* @param gridWindow
* @param adTabId
* @param tabIndex
* @param tabPanel
*/
public void embed(Properties ctx, int windowNo, GridWindow gridWindow,
int adTabId, int tabIndex, IADTabpanel tabPanel) {
embed(ctx, windowNo, gridWindow, adTabId, tabIndex, tabPanel, 0);
}
/**
* Embed detail tab
* @param ctx
* @param windowNo
* @param gridWindow
* @param adTabId
* @param tabIndex
* @param tabPanel
*/
public void embed(Properties ctx, int windowNo, GridWindow gridWindow,
int adTabId, int tabIndex, IADTabpanel tabPanel, int height) {
EmbeddedPanel ep = new EmbeddedPanel();
ep.tabPanel = tabPanel;
ep.adTabId = adTabId;
ep.tabIndex = tabIndex;
ep.gridWindow = gridWindow;
includedPanel.add(ep);
Group group = includedTab.get(adTabId);
ep.group = group;
if (tabPanel instanceof ADTabpanel) {
ADTabpanel atp = (ADTabpanel) tabPanel;
atp.listPanel.setPageSize(-1);
}
ADWindowPanel panel = new ADWindowPanel(ctx, windowNo, gridWindow, tabIndex, tabPanel);
ep.windowPanel = panel;
if (group != null) {
createEmbeddedPanelUI(ep, height);
if (active)
activateChild(true, ep);
}
}
class EmbeddedPanel {
Group group;
GridWindow gridWindow;
int tabIndex;
ADWindowPanel windowPanel;
IADTabpanel tabPanel;
int adTabId;
}
/** /**
* @see IADTabpanel#afterSave(boolean) * @see IADTabpanel#afterSave(boolean)
*/ */
public void afterSave(boolean onSaveEvent) { public void afterSave(boolean onSaveEvent) {
if (!includedPanel.isEmpty()) {
for (EmbeddedPanel panel : includedPanel)
panel.tabPanel.query(false, 0, 0);
}
}
private void createEmbeddedPanelUI(EmbeddedPanel ep, int height) {
Row row = new Row();
row.setSpans("5");
grid.getRows().insertBefore(row, includedTabFooter.get(ep.adTabId));
ep.windowPanel.createPart(row);
ep.windowPanel.getComponent().setWidth("100%");
ep.windowPanel.getComponent().setStyle("position: relative;");
//for backward compatibility, only treat display length > 50 as height for the embedded panel
if (height > 50)
ep.windowPanel.getComponent().setHeight(height + "px");
else
ep.windowPanel.getComponent().setHeight("400px");
Label title = new Label(ep.gridWindow.getTab(ep.tabIndex).getName());
ep.group.appendChild(title);
ep.group.appendChild(ep.windowPanel.getToolbar());
ep.windowPanel.initPanel(-1, null);
} }
@Override @Override
@ -1196,20 +1059,6 @@ DataStatusListener, IADTabpanel
return listPanel.isVisible(); return listPanel.isVisible();
} }
/**
* @param gTab
* @return embedded panel or null if not found
*/
public IADTabpanel findEmbeddedPanel(GridTab gTab) {
IADTabpanel panel = null;
for(EmbeddedPanel ep : includedPanel) {
if (ep.tabPanel.getGridTab().equals(gTab)) {
return ep.tabPanel;
}
}
return panel;
}
/** /**
* *
* @return GridPanel * @return GridPanel

View File

@ -35,7 +35,6 @@ import org.adempiere.webui.component.Tabs;
import org.adempiere.webui.part.ITabOnSelectHandler; import org.adempiere.webui.part.ITabOnSelectHandler;
import org.adempiere.webui.session.SessionManager; import org.adempiere.webui.session.SessionManager;
import org.adempiere.webui.util.UserPreference; import org.adempiere.webui.util.UserPreference;
import org.compiere.model.GridWindow;
import org.compiere.model.MQuery; import org.compiere.model.MQuery;
import org.compiere.util.CLogger; import org.compiere.util.CLogger;
import org.compiere.util.Env; import org.compiere.util.Env;
@ -86,12 +85,6 @@ public class ADWindowPanel extends AbstractADWindowPanel
} }
public ADWindowPanel(Properties ctx, int windowNo, GridWindow gridWindow,
int tabIndex, IADTabpanel tabPanel) {
super(ctx, windowNo, gridWindow, tabIndex, tabPanel);
}
protected Component doCreatePart(Component parent) protected Component doCreatePart(Component parent)
{ {
layout = new Borderlayout(); layout = new Borderlayout();
@ -102,37 +95,24 @@ public class ADWindowPanel extends AbstractADWindowPanel
layout.setPage(page); layout.setPage(page);
} }
//toolbar would be added to group for embedded tab //toolbar
if (!isEmbedded()) North n = new North();
{ n.setParent(layout);
North n = new North(); n.setCollapsible(false);
n.setParent(layout); n.setSclass("adwindow-north");
n.setCollapsible(false); toolbar.setParent(n);
n.setSclass("adwindow-north"); toolbar.setWindowNo(getWindowNo());
toolbar.setParent(n);
toolbar.setWindowNo(getWindowNo());
}
//status bar on top for embedded tab //status bar
if (!isEmbedded()) South s = new South();
{ layout.appendChild(s);
South s = new South(); s.setCollapsible(false);
layout.appendChild(s); s.setSclass("adwindow-south");
s.setCollapsible(false); statusBar.setParent(s);
s.setSclass("adwindow-south");
statusBar.setParent(s);
}
else
{
North n = new North();
layout.appendChild(n);
n.setCollapsible(false);
statusBar.setParent(n);
}
LayoutUtils.addSclass("adwindow-status", statusBar); LayoutUtils.addSclass("adwindow-status", statusBar);
if (!isEmbedded() && adTab.isUseExternalSelection()) if (adTab.isUseExternalSelection())
{ {
String tabPlacement = SessionManager.getSessionApplication().getUserPreference().getProperty(UserPreference.P_WINDOW_TAB_PLACEMENT); String tabPlacement = SessionManager.getSessionApplication().getUserPreference().getProperty(UserPreference.P_WINDOW_TAB_PLACEMENT);
if (tabPlacement == null || "left".equalsIgnoreCase(tabPlacement)) if (tabPlacement == null || "left".equalsIgnoreCase(tabPlacement))
@ -183,16 +163,14 @@ public class ADWindowPanel extends AbstractADWindowPanel
((Tabpanel)parent).setOnCloseHandler(handler); ((Tabpanel)parent).setOnCloseHandler(handler);
} }
if (!isEmbedded()) { if (keyListener != null)
if (keyListener != null) keyListener.detach();
keyListener.detach(); keyListener = new Keylistener();
keyListener = new Keylistener(); statusBar.appendChild(keyListener);
statusBar.appendChild(keyListener); keyListener.setCtrlKeys("#f1#f2#f3#f4#f5#f6#f7#f8#f9#f10#f11#f12^f^i^n^s^d@#left@#right@#up@#down@#pgup@#pgdn@p^p@z@x#enter");
keyListener.setCtrlKeys("#f1#f2#f3#f4#f5#f6#f7#f8#f9#f10#f11#f12^f^i^n^s^d@#left@#right@#up@#down@#pgup@#pgdn@p^p@z@x#enter"); keyListener.addEventListener(Events.ON_CTRL_KEY, toolbar);
keyListener.addEventListener(Events.ON_CTRL_KEY, toolbar); keyListener.addEventListener(Events.ON_CTRL_KEY, this);
keyListener.addEventListener(Events.ON_CTRL_KEY, this); keyListener.setAutoBlur(false);
keyListener.setAutoBlur(false);
}
layout.setAttribute(ITabOnSelectHandler.ATTRIBUTE_KEY, new ITabOnSelectHandler() { layout.setAttribute(ITabOnSelectHandler.ATTRIBUTE_KEY, new ITabOnSelectHandler() {
public void onSelect() { public void onSelect() {

View File

@ -168,46 +168,19 @@ public abstract class AbstractADWindowPanel extends AbstractUIPart implements To
private boolean m_findCancelled; private boolean m_findCancelled;
private int embeddedTabindex = -1;
protected Map<Integer, ADTabpanel> includedMap = new HashMap<Integer, ADTabpanel>();
protected Map<Integer, GridField> includedFieldMap = new HashMap<Integer, GridField>();
private IADTabpanel embeddedTabPanel;
private boolean m_findCreateNew; private boolean m_findCreateNew;
private boolean m_queryInitiating; private boolean m_queryInitiating;
/** /**
* Constructor for non-embedded mode * Constructor
* @param ctx * @param ctx
* @param windowNo * @param windowNo
*/ */
public AbstractADWindowPanel(Properties ctx, int windowNo) public AbstractADWindowPanel(Properties ctx, int windowNo)
{
this(ctx, windowNo, null, -1, null);
}
/**
* Constructor for embedded mode
* @param ctx
* @param windowNo
* @param gridWindow
* @param tabIndex
* @param tabPanel
*/
public AbstractADWindowPanel(Properties ctx, int windowNo, GridWindow gridWindow, int tabIndex, IADTabpanel tabPanel)
{ {
this.ctx = ctx; this.ctx = ctx;
this.curWindowNo = windowNo; this.curWindowNo = windowNo;
this.gridWindow = gridWindow;
this.embeddedTabindex = tabIndex;
this.embeddedTabPanel = tabPanel;
curTabpanel = tabPanel;
if (gridWindow != null && tabIndex >= 0)
curTab = gridWindow.getTab(tabIndex);
initComponents(); initComponents();
} }
@ -236,20 +209,13 @@ public abstract class AbstractADWindowPanel extends AbstractUIPart implements To
return statusBar; return statusBar;
} }
/**
* @return boolean
*/
public boolean isEmbedded() {
return embeddedTabindex >= 0;
}
private void initComponents() private void initComponents()
{ {
/** Initalise toolbar */ /** Initalise toolbar */
toolbar = new CWindowToolbar(isEmbedded(), getWindowNo()); toolbar = new CWindowToolbar(getWindowNo());
toolbar.addListener(this); toolbar.addListener(this);
statusBar = new StatusBarPanel(isEmbedded()); statusBar = new StatusBarPanel();
} }
/** /**
@ -294,89 +260,70 @@ public abstract class AbstractADWindowPanel extends AbstractUIPart implements To
// End of temporary code for [ adempiere-ZK Web Client-2832968 ] User context lost? // End of temporary code for [ adempiere-ZK Web Client-2832968 ] User context lost?
// Set AutoCommit for this Window // Set AutoCommit for this Window
if (embeddedTabindex < 0) Env.setAutoCommit(ctx, curWindowNo, Env.isAutoCommit(ctx));
{ boolean autoNew = Env.isAutoNew(ctx);
Env.setAutoCommit(ctx, curWindowNo, Env.isAutoCommit(ctx)); Env.setAutoNew(ctx, curWindowNo, autoNew);
boolean autoNew = Env.isAutoNew(ctx);
Env.setAutoNew(ctx, curWindowNo, autoNew);
GridWindowVO gWindowVO = AEnv.getMWindowVO(curWindowNo, adWindowId, 0); GridWindowVO gWindowVO = AEnv.getMWindowVO(curWindowNo, adWindowId, 0);
if (gWindowVO == null) if (gWindowVO == null)
{ {
throw new ApplicationException(Msg.getMsg(ctx, throw new ApplicationException(Msg.getMsg(ctx,
"AccessTableNoView") "AccessTableNoView")
+ "(No Window Model Info)"); + "(No Window Model Info)");
} }
gridWindow = new GridWindow(gWindowVO, true); gridWindow = new GridWindow(gWindowVO, true);
title = gridWindow.getName(); title = gridWindow.getName();
// Set SO/AutoNew for Window // Set SO/AutoNew for Window
Env.setContext(ctx, curWindowNo, "IsSOTrx", gridWindow.isSOTrx()); Env.setContext(ctx, curWindowNo, "IsSOTrx", gridWindow.isSOTrx());
if (!autoNew && gridWindow.isTransaction()) if (!autoNew && gridWindow.isTransaction())
{ {
Env.setAutoNew(ctx, curWindowNo, true); Env.setAutoNew(ctx, curWindowNo, true);
} }
}
m_onlyCurrentRows = embeddedTabindex < 0 && gridWindow.isTransaction(); m_onlyCurrentRows = gridWindow.isTransaction();
MQuery detailQuery = null; MQuery detailQuery = null;
/** /**
* Window Tabs * Window Tabs
*/ */
if (embeddedTabindex < 0) if (query != null && query.getZoomTableName() != null && query.getZoomColumnName() != null
&& query.getZoomValue() instanceof Integer && (Integer)query.getZoomValue() > 0)
{
if (!query.getZoomTableName().equalsIgnoreCase(gridWindow.getTab(0).getTableName()))
{
detailQuery = query;
query = new MQuery();
query.addRestriction("1=2");
query.setRecordCount(0);
}
}
int tabSize = gridWindow.getTabCount();
for (int tab = 0; tab < tabSize; tab++)
{ {
if (query != null && query.getZoomTableName() != null && query.getZoomColumnName() != null initTab(query, tab);
&& query.getZoomValue() instanceof Integer && (Integer)query.getZoomValue() > 0) if (tab == 0 && curTab == null && m_findCancelled)
{ return false;
if (!query.getZoomTableName().equalsIgnoreCase(gridWindow.getTab(0).getTableName()))
{
detailQuery = query;
query = new MQuery();
query.addRestriction("1=2");
query.setRecordCount(0);
}
}
int tabSize = gridWindow.getTabCount();
for (int tab = 0; tab < tabSize; tab++)
{
initTab(query, tab);
if (tab == 0 && curTab == null && m_findCancelled)
return false;
}
Env.setContext(ctx, curWindowNo, "WindowName", gridWindow.getName());
} }
else Env.setContext(ctx, curWindowNo, "WindowName", gridWindow.getName());
{
initEmbeddedTab(query, embeddedTabindex);
}
if (curTab != null) if (curTab != null)
curTab.getTableModel().setChanged(false); curTab.getTableModel().setChanged(false);
if (embeddedTabindex < 0) curTabIndex = 0;
{
curTabIndex = 0;
adTab.setSelectedIndex(0); adTab.setSelectedIndex(0);
// all fields context for window is clear at AbstractADTab.prepareContext, set again IsSOTrx for window // all fields context for window is clear at AbstractADTab.prepareContext, set again IsSOTrx for window
Env.setContext(ctx, curWindowNo, "IsSOTrx", gridWindow.isSOTrx()); Env.setContext(ctx, curWindowNo, "IsSOTrx", gridWindow.isSOTrx());
toolbar.enableTabNavigation(adTab.getTabCount() > 1); toolbar.enableTabNavigation(adTab.getTabCount() > 1);
toolbar.enableFind(true); toolbar.enableFind(true);
adTab.evaluate(null); adTab.evaluate(null);
if (detailQuery != null && zoomToDetailTab(detailQuery)) if (detailQuery != null && zoomToDetailTab(detailQuery))
{
return true;
}
}
else
{ {
curTabIndex = embeddedTabindex; return true;
toolbar.enableTabNavigation(false);
toolbar.enableFind(true);
} }
updateToolbar(); updateToolbar();
@ -472,15 +419,7 @@ public abstract class AbstractADWindowPanel extends AbstractUIPart implements To
targetQuery.addRestriction(gTab.getLinkColumnName(), "=", parentId); targetQuery.addRestriction(gTab.getLinkColumnName(), "=", parentId);
gTab.setQuery(targetQuery); gTab.setQuery(targetQuery);
IADTabpanel gc = null; IADTabpanel gc = null;
if (!includedMap.containsKey(gTab.getAD_Tab_ID())) gc = adTab.findADTabpanel(gTab);
{
gc = adTab.findADTabpanel(gTab);
}
else
{
ADTabpanel parent = (ADTabpanel)includedMap.get(gTab.getAD_Tab_ID());
gc = parent.findEmbeddedPanel(gTab);
}
gc.createUI(); gc.createUI();
gc.query(false, 0, 0); gc.query(false, 0, 0);
@ -491,17 +430,7 @@ public abstract class AbstractADWindowPanel extends AbstractUIPart implements To
int id = table.getKeyID(i); int id = table.getKeyID(i);
if (id == ((Integer)query.getZoomValue()).intValue()) if (id == ((Integer)query.getZoomValue()).intValue())
{ {
if (!includedMap.containsKey(gTab.getAD_Tab_ID())) setActiveTab(gridWindow.getTabIndex(gTab), null);
{
setActiveTab(gridWindow.getTabIndex(gTab), null);
}
else
{
IADTabpanel parent = includedMap.get(gTab.getAD_Tab_ID());
int pindex = gridWindow.getTabIndex(parent.getGridTab());
if (pindex >= 0)
setActiveTab(pindex, null);
}
gTab.navigate(i); gTab.navigate(i);
return true; return true;
} }
@ -512,17 +441,6 @@ public abstract class AbstractADWindowPanel extends AbstractUIPart implements To
return false; return false;
} }
private void initEmbeddedTab(MQuery query, int tabIndex) {
GridTab gTab = gridWindow.getTab(tabIndex);
gTab.addDataStatusListener(this);
adTab.addTab(gTab, embeddedTabPanel);
if (gTab.isSortTab()) {
((ADSortTab)embeddedTabPanel).registerAPanel(this);
} else {
((ADTabpanel)embeddedTabPanel).init(this, curWindowNo, gTab, gridWindow);
}
}
private void initQueryOnNew(MQuery result) { private void initQueryOnNew(MQuery result) {
if (curTab.isHighVolume() && m_findCreateNew) if (curTab.isHighVolume() && m_findCreateNew)
onNew(); onNew();
@ -584,57 +502,31 @@ public abstract class AbstractADWindowPanel extends AbstractUIPart implements To
if (gTab.isSortTab()) if (gTab.isSortTab())
{ {
ADSortTab sortTab = new ADSortTab(curWindowNo, gTab); ADSortTab sortTab = new ADSortTab(curWindowNo, gTab);
if (includedMap.containsKey(gTab.getAD_Tab_ID())) adTab.addTab(gTab, sortTab);
{ sortTab.registerAPanel(this);
includedMap.get(gTab.getAD_Tab_ID()).embed(ctx, curWindowNo, gridWindow, gTab.getAD_Tab_ID(), tabIndex, sortTab); if (tabIndex == 0) {
} curTabpanel = sortTab;
else curTabpanel.createUI();
{ if (!m_queryInitiating)
adTab.addTab(gTab, sortTab); {
sortTab.registerAPanel(this); initFirstTabpanel();
if (tabIndex == 0) {
curTabpanel = sortTab;
curTabpanel.createUI();
if (!m_queryInitiating)
{
initFirstTabpanel();
}
} }
gTab.addDataStatusListener(this);
} }
gTab.addDataStatusListener(this);
} }
else else
{ {
//build embedded tab map
ADTabpanel fTabPanel = new ADTabpanel(); ADTabpanel fTabPanel = new ADTabpanel();
GridField[] fields = gTab.getTableModel().getFields(); gTab.addDataStatusListener(this);
for(int i = 0; i < fields.length; i++) fTabPanel.init(this, curWindowNo, gTab, gridWindow);
{ adTab.addTab(gTab, fTabPanel);
if (fields[i].getIncluded_Tab_ID() > 0) if (tabIndex == 0) {
{ fTabPanel.createUI();
includedMap.put(fields[i].getIncluded_Tab_ID(), fTabPanel); curTabpanel = fTabPanel;
includedFieldMap.put(fields[i].getIncluded_Tab_ID(), fields[i]); if (!m_queryInitiating)
} {
} initFirstTabpanel();
}
if (includedMap.containsKey(gTab.getAD_Tab_ID()))
{
includedMap.get(gTab.getAD_Tab_ID()).embed(ctx, curWindowNo, gridWindow, gTab.getAD_Tab_ID(), tabIndex, fTabPanel,
includedFieldMap.get(gTab.getAD_Tab_ID()).getDisplayLength());
}
else
{
gTab.addDataStatusListener(this);
fTabPanel.init(this, curWindowNo, gTab, gridWindow);
adTab.addTab(gTab, fTabPanel);
if (tabIndex == 0) {
fTabPanel.createUI();
curTabpanel = fTabPanel;
if (!m_queryInitiating)
{
initFirstTabpanel();
}
}
} }
if (!m_queryInitiating && tabIndex == 0) if (!m_queryInitiating && tabIndex == 0)

View File

@ -20,7 +20,6 @@ import java.util.Properties;
import org.adempiere.exceptions.AdempiereException; import org.adempiere.exceptions.AdempiereException;
import org.adempiere.webui.AdempiereIdGenerator; import org.adempiere.webui.AdempiereIdGenerator;
import org.adempiere.webui.LayoutUtils; import org.adempiere.webui.LayoutUtils;
import org.adempiere.webui.component.Combobox;
import org.adempiere.webui.component.ConfirmPanel; import org.adempiere.webui.component.ConfirmPanel;
import org.adempiere.webui.component.Label; import org.adempiere.webui.component.Label;
import org.adempiere.webui.component.Textbox; import org.adempiere.webui.component.Textbox;
@ -29,6 +28,7 @@ import org.adempiere.webui.session.SessionManager;
import org.adempiere.webui.theme.ITheme; import org.adempiere.webui.theme.ITheme;
import org.adempiere.webui.theme.ThemeManager; import org.adempiere.webui.theme.ThemeManager;
import org.adempiere.webui.window.LoginWindow; import org.adempiere.webui.window.LoginWindow;
import org.compiere.model.MSysConfig;
import org.compiere.model.MUser; import org.compiere.model.MUser;
import org.compiere.util.CLogger; import org.compiere.util.CLogger;
import org.compiere.util.Env; import org.compiere.util.Env;
@ -75,10 +75,10 @@ public class ChangePasswordPanel extends Window implements EventListener<Event>
private Label lblRetypeNewPassword; private Label lblRetypeNewPassword;
private Label lblSecurityQuestion; private Label lblSecurityQuestion;
private Label lblAnswer; private Label lblAnswer;
private Combobox lstSecurityQuestion;
private Textbox txtOldPassword; private Textbox txtOldPassword;
private Textbox txtNewPassword; private Textbox txtNewPassword;
private Textbox txtRetypeNewPassword; private Textbox txtRetypeNewPassword;
private Textbox txtSecurityQuestion;
private Textbox txtAnswer; private Textbox txtAnswer;
public ChangePasswordPanel(Properties ctx, LoginWindow loginWindow, String userName, String userPassword, boolean show, KeyNamePair[] clientsKNPairs) public ChangePasswordPanel(Properties ctx, LoginWindow loginWindow, String userName, String userPassword, boolean show, KeyNamePair[] clientsKNPairs)
@ -168,7 +168,7 @@ public class ChangePasswordPanel extends Window implements EventListener<Event>
td = new Td(); td = new Td();
td.setSclass(ITheme.LOGIN_FIELD_CLASS); td.setSclass(ITheme.LOGIN_FIELD_CLASS);
tr.appendChild(td); tr.appendChild(td);
td.appendChild(lstSecurityQuestion); td.appendChild(txtSecurityQuestion);
tr = new Tr(); tr = new Tr();
tr.setId("rowAnswer"); tr.setId("rowAnswer");
@ -215,18 +215,7 @@ public class ChangePasswordPanel extends Window implements EventListener<Event>
lblAnswer = new Label(); lblAnswer = new Label();
lblAnswer.setId("lblAnswer"); lblAnswer.setId("lblAnswer");
lblAnswer.setValue(Msg.getMsg(m_ctx, "Answer")); lblAnswer.setValue(Msg.getMsg(m_ctx, "Answer"));
lstSecurityQuestion = new Combobox();
lstSecurityQuestion.setAutocomplete(true);
lstSecurityQuestion.setAutodrop(true);
lstSecurityQuestion.setId("lstSecurityQuestion");
lstSecurityQuestion.setAttribute(AdempiereIdGenerator.ZK_COMPONENT_PREFIX_ATTRIBUTE, "unq" + lstSecurityQuestion.getId());
lstSecurityQuestion.setWidth("220px");
lstSecurityQuestion.getItems().clear();
for (int i = 1; i <= ResetPasswordPanel.NO_OF_SECURITY_QUESTION; i++)
lstSecurityQuestion.appendItem(Msg.getMsg(m_ctx, ResetPasswordPanel.SECURITY_QUESTION_PREFIX + i), ResetPasswordPanel.SECURITY_QUESTION_PREFIX + i);
txtOldPassword = new Textbox(); txtOldPassword = new Textbox();
txtOldPassword.setId("txtOldPassword"); txtOldPassword.setId("txtOldPassword");
txtOldPassword.setType("password"); txtOldPassword.setType("password");
@ -248,6 +237,12 @@ public class ChangePasswordPanel extends Window implements EventListener<Event>
txtRetypeNewPassword.setCols(25); txtRetypeNewPassword.setCols(25);
txtRetypeNewPassword.setWidth("220px"); txtRetypeNewPassword.setWidth("220px");
txtSecurityQuestion = new Textbox();
txtSecurityQuestion.setId("txtSecurityQuestion");
txtSecurityQuestion.setAttribute(AdempiereIdGenerator.ZK_COMPONENT_PREFIX_ATTRIBUTE, "unq" + txtSecurityQuestion.getId());
txtSecurityQuestion.setCols(25);
txtSecurityQuestion.setWidth("220px");
txtAnswer = new Textbox(); txtAnswer = new Textbox();
txtAnswer.setId("txtAnswer"); txtAnswer.setId("txtAnswer");
// txtAnswer.setType("password"); // txtAnswer.setType("password");
@ -273,12 +268,8 @@ public class ChangePasswordPanel extends Window implements EventListener<Event>
{ {
String oldPassword = txtOldPassword.getValue(); String oldPassword = txtOldPassword.getValue();
String newPassword = txtNewPassword.getValue(); String newPassword = txtNewPassword.getValue();
String retypeNewPassword = txtRetypeNewPassword.getValue(); String retypeNewPassword = txtRetypeNewPassword.getValue();
String securityQuestion = txtSecurityQuestion.getValue();
String securityQuestion = null;
if (lstSecurityQuestion.getSelectedItem() != null)
securityQuestion = (String) lstSecurityQuestion.getSelectedItem().getValue();
String answer = txtAnswer.getValue(); String answer = txtAnswer.getValue();
if (Util.isEmpty(oldPassword)) if (Util.isEmpty(oldPassword))
@ -298,6 +289,12 @@ public class ChangePasswordPanel extends Window implements EventListener<Event>
if (!oldPassword.equals(m_userPassword)) if (!oldPassword.equals(m_userPassword))
throw new IllegalArgumentException(Msg.getMsg(m_ctx, "OldPasswordNoMatch")); throw new IllegalArgumentException(Msg.getMsg(m_ctx, "OldPasswordNoMatch"));
if (MSysConfig.getBooleanValue(MSysConfig.CHANGE_PASSWORD_MUST_DIFFER, true))
{
if (oldPassword.equals(newPassword))
throw new IllegalArgumentException(Msg.getMsg(m_ctx, "NewPasswordMustDiffer"));
}
Trx trx = null; Trx trx = null;
try try

View File

@ -23,7 +23,6 @@ import java.util.Properties;
import org.adempiere.exceptions.AdempiereException; import org.adempiere.exceptions.AdempiereException;
import org.adempiere.webui.AdempiereIdGenerator; import org.adempiere.webui.AdempiereIdGenerator;
import org.adempiere.webui.LayoutUtils; import org.adempiere.webui.LayoutUtils;
import org.adempiere.webui.component.Combobox;
import org.adempiere.webui.component.ConfirmPanel; import org.adempiere.webui.component.ConfirmPanel;
import org.adempiere.webui.component.Label; import org.adempiere.webui.component.Label;
import org.adempiere.webui.component.Textbox; import org.adempiere.webui.component.Textbox;
@ -67,9 +66,7 @@ public class ResetPasswordPanel extends Window implements EventListener<Event>
private static CLogger logger = CLogger.getCLogger(ResetPasswordPanel.class); private static CLogger logger = CLogger.getCLogger(ResetPasswordPanel.class);
private static final int MAX_RESET_PASSWORD_TRIES = 3; private static final int MAX_RESET_PASSWORD_TRIES = 3;
protected static final int NO_OF_SECURITY_QUESTION = 5;
protected static final String SECURITY_QUESTION_PREFIX = "SecurityQuestion_";
private static final String RESET_PASSWORD_MAIL_TEXT_NAME = "Reset Password"; private static final String RESET_PASSWORD_MAIL_TEXT_NAME = "Reset Password";
private LoginWindow wndLogin; private LoginWindow wndLogin;
@ -86,9 +83,11 @@ public class ResetPasswordPanel extends Window implements EventListener<Event>
private Label lblSecurityQuestion; private Label lblSecurityQuestion;
private Label lblAnswer; private Label lblAnswer;
private Label lblUserId; private Label lblUserId;
private Combobox lstSecurityQuestion; private Label lblEmail;
private Textbox txtSecurityQuestion;
private Textbox txtAnswer; private Textbox txtAnswer;
private Textbox txtUserId; private Textbox txtUserId;
private Textbox txtEmail;
public ResetPasswordPanel(Properties ctx, LoginWindow loginWindow, String userName, boolean noSecurityQuestion) public ResetPasswordPanel(Properties ctx, LoginWindow loginWindow, String userName, boolean noSecurityQuestion)
{ {
@ -100,6 +99,8 @@ public class ResetPasswordPanel extends Window implements EventListener<Event>
initComponents(); initComponents();
init(); init();
this.setId("resetPasswordPanel"); this.setId("resetPasswordPanel");
loadData();
} }
private void init() private void init()
@ -145,6 +146,18 @@ public class ResetPasswordPanel extends Window implements EventListener<Event>
} }
else else
{ {
tr = new Tr();
tr.setId("rowEmail");
table.appendChild(tr);
td = new Td();
tr.appendChild(td);
td.setSclass(ITheme.LOGIN_LABEL_CLASS);
td.appendChild(lblEmail);
td = new Td();
td.setSclass(ITheme.LOGIN_FIELD_CLASS);
tr.appendChild(td);
td.appendChild(txtEmail);
tr = new Tr(); tr = new Tr();
tr.setId("rowSecurityQuestion"); tr.setId("rowSecurityQuestion");
table.appendChild(tr); table.appendChild(tr);
@ -155,7 +168,7 @@ public class ResetPasswordPanel extends Window implements EventListener<Event>
td = new Td(); td = new Td();
td.setSclass(ITheme.LOGIN_FIELD_CLASS); td.setSclass(ITheme.LOGIN_FIELD_CLASS);
tr.appendChild(td); tr.appendChild(td);
td.appendChild(lstSecurityQuestion); td.appendChild(txtSecurityQuestion);
tr = new Tr(); tr = new Tr();
tr.setId("rowAnswer"); tr.setId("rowAnswer");
@ -200,6 +213,10 @@ public class ResetPasswordPanel extends Window implements EventListener<Event>
} }
else else
{ {
lblEmail = new Label();
lblEmail.setId("lblEmail");
lblEmail.setValue(Msg.getMsg(m_ctx, "EMail"));
lblSecurityQuestion = new Label(); lblSecurityQuestion = new Label();
lblSecurityQuestion.setId("lblSecurityQuestion"); lblSecurityQuestion.setId("lblSecurityQuestion");
lblSecurityQuestion.setValue(Msg.getMsg(m_ctx, "SecurityQuestion")); lblSecurityQuestion.setValue(Msg.getMsg(m_ctx, "SecurityQuestion"));
@ -208,16 +225,19 @@ public class ResetPasswordPanel extends Window implements EventListener<Event>
lblAnswer.setId("lblAnswer"); lblAnswer.setId("lblAnswer");
lblAnswer.setValue(Msg.getMsg(m_ctx, "Answer")); lblAnswer.setValue(Msg.getMsg(m_ctx, "Answer"));
lstSecurityQuestion = new Combobox(); txtEmail = new Textbox();
lstSecurityQuestion.setAutocomplete(true); txtEmail.setId("txtEmail");
lstSecurityQuestion.setAutodrop(true); txtEmail.setAttribute(AdempiereIdGenerator.ZK_COMPONENT_PREFIX_ATTRIBUTE, "unq" + txtEmail.getId());
lstSecurityQuestion.setId("lstSecurityQuestion"); txtEmail.setCols(25);
lstSecurityQuestion.setAttribute(AdempiereIdGenerator.ZK_COMPONENT_PREFIX_ATTRIBUTE, "unq" + lstSecurityQuestion.getId()); txtEmail.setWidth("220px");
lstSecurityQuestion.setWidth("220px"); txtEmail.setReadonly(false);
lstSecurityQuestion.getItems().clear(); txtSecurityQuestion = new Textbox();
for (int i = 1; i <= NO_OF_SECURITY_QUESTION; i++) txtSecurityQuestion.setId("txtSecurityQuestion");
lstSecurityQuestion.appendItem(Msg.getMsg(m_ctx, SECURITY_QUESTION_PREFIX + i), SECURITY_QUESTION_PREFIX + i); txtSecurityQuestion.setAttribute(AdempiereIdGenerator.ZK_COMPONENT_PREFIX_ATTRIBUTE, "unq" + txtSecurityQuestion.getId());
txtSecurityQuestion.setCols(25);
txtSecurityQuestion.setWidth("220px");
txtSecurityQuestion.setReadonly(true);
txtAnswer = new Textbox(); txtAnswer = new Textbox();
txtAnswer.setId("txtAnswer"); txtAnswer.setId("txtAnswer");
@ -225,14 +245,54 @@ public class ResetPasswordPanel extends Window implements EventListener<Event>
txtAnswer.setAttribute(AdempiereIdGenerator.ZK_COMPONENT_PREFIX_ATTRIBUTE, "unq" + txtAnswer.getId()); txtAnswer.setAttribute(AdempiereIdGenerator.ZK_COMPONENT_PREFIX_ATTRIBUTE, "unq" + txtAnswer.getId());
txtAnswer.setCols(25); txtAnswer.setCols(25);
txtAnswer.setWidth("220px"); txtAnswer.setWidth("220px");
txtAnswer.setReadonly(true);
} }
} }
private void loadData()
{
boolean email_login = MSysConfig.getBooleanValue(MSysConfig.USE_EMAIL_FOR_LOGIN, false);
if (email_login)
{
txtEmail.setText(m_userName);
loadSecurityQuestion();
}
}
private void loadSecurityQuestion()
{
String email = txtEmail.getValue();
if (Util.isEmpty(email))
throw new IllegalArgumentException(Msg.getMsg(m_ctx, "FillMandatory") + " " + lblEmail.getValue());
// TODO: Validation for user with same email uses the same password and security question
StringBuilder sql = new StringBuilder("SELECT SecurityQuestion ");
sql.append("FROM AD_User ");
sql.append("WHERE IsActive='Y' ");
boolean email_login = MSysConfig.getBooleanValue(MSysConfig.USE_EMAIL_FOR_LOGIN, false);
if (email_login)
sql.append("AND EMail=? ");
else
sql.append("AND COALESCE(LDAPUser,Name)=? ");
sql.append("AND EMail=? ");
sql.append("AND SecurityQuestion IS NOT NULL ");
sql.append("ORDER BY AD_Client_ID DESC");
String securityQuestion = DB.getSQLValueString(null, sql.toString(), m_userName, email);
txtSecurityQuestion.setValue(securityQuestion);
txtEmail.setReadonly(true);
txtAnswer.setReadonly(false);
}
public void onEvent(Event event) public void onEvent(Event event)
{ {
if (event.getTarget().getId().equals(ConfirmPanel.A_OK)) if (event.getTarget().getId().equals(ConfirmPanel.A_OK))
{ {
validateResetPassword(); if (txtAnswer != null && txtAnswer.isReadonly())
validateEmail();
else
validateResetPassword();
} }
else if (event.getTarget().getId().equals(ConfirmPanel.A_CANCEL)) else if (event.getTarget().getId().equals(ConfirmPanel.A_CANCEL))
{ {
@ -241,7 +301,36 @@ public class ResetPasswordPanel extends Window implements EventListener<Event>
} }
} }
public void validateResetPassword() private void validateEmail()
{
String email = txtEmail.getValue();
if (Util.isEmpty(email))
throw new IllegalArgumentException(Msg.getMsg(m_ctx, "FillMandatory") + " " + lblEmail.getValue());
StringBuilder whereClause = new StringBuilder("Password IS NOT NULL ");
whereClause.append("AND COALESCE(LDAPUser,Name)=? ");
whereClause.append("AND EMail=? ");
whereClause.append(" AND")
.append(" EXISTS (SELECT * FROM AD_User_Roles ur")
.append(" INNER JOIN AD_Role r ON (ur.AD_Role_ID=r.AD_Role_ID)")
.append(" WHERE ur.AD_User_ID=AD_User.AD_User_ID AND ur.IsActive='Y' AND r.IsActive='Y') AND ")
.append(" EXISTS (SELECT * FROM AD_Client c")
.append(" WHERE c.AD_Client_ID=AD_User.AD_Client_ID")
.append(" AND c.IsActive='Y') AND ")
.append(" AD_User.IsActive='Y'");
List<MUser> users = new Query(m_ctx, MUser.Table_Name, whereClause.toString(), null)
.setParameters(m_userName, email)
.setOrderBy(MUser.COLUMNNAME_AD_User_ID)
.list();
if (users.size() == 0)
throw new AdempiereException(Msg.getMsg(m_ctx, "InvalidUserNameAndEmail"));
loadSecurityQuestion();
}
private void validateResetPassword()
{ {
List<MUser> users = null; List<MUser> users = null;
if (m_noSecurityQuestion) if (m_noSecurityQuestion)
@ -278,10 +367,8 @@ public class ResetPasswordPanel extends Window implements EventListener<Event>
} }
else else
{ {
String securityQuestion = null; String email = txtEmail.getValue();
if (lstSecurityQuestion.getSelectedItem() != null) String securityQuestion = txtSecurityQuestion.getValue();
securityQuestion = (String) lstSecurityQuestion.getSelectedItem().getValue();
String answer = txtAnswer.getValue(); String answer = txtAnswer.getValue();
if (Util.isEmpty(securityQuestion)) if (Util.isEmpty(securityQuestion))
@ -290,12 +377,8 @@ public class ResetPasswordPanel extends Window implements EventListener<Event>
if (Util.isEmpty(answer)) if (Util.isEmpty(answer))
throw new IllegalArgumentException(Msg.getMsg(m_ctx, "AnswerMandatory")); throw new IllegalArgumentException(Msg.getMsg(m_ctx, "AnswerMandatory"));
boolean email_login = MSysConfig.getBooleanValue(MSysConfig.USE_EMAIL_FOR_LOGIN, false);
StringBuilder whereClause = new StringBuilder("Password IS NOT NULL AND "); StringBuilder whereClause = new StringBuilder("Password IS NOT NULL AND ");
if (email_login) whereClause.append("EMail=?");
whereClause.append("EMail=?");
else
whereClause.append("COALESCE(LDAPUser,Name)=?");
whereClause.append(" AND") whereClause.append(" AND")
.append(" EXISTS (SELECT * FROM AD_User_Roles ur") .append(" EXISTS (SELECT * FROM AD_User_Roles ur")
.append(" INNER JOIN AD_Role r ON (ur.AD_Role_ID=r.AD_Role_ID)") .append(" INNER JOIN AD_Role r ON (ur.AD_Role_ID=r.AD_Role_ID)")
@ -308,7 +391,7 @@ public class ResetPasswordPanel extends Window implements EventListener<Event>
.append(" AND AD_User.Answer=?"); .append(" AND AD_User.Answer=?");
users = new Query(m_ctx, MUser.Table_Name, whereClause.toString(), null) users = new Query(m_ctx, MUser.Table_Name, whereClause.toString(), null)
.setParameters(m_userName, securityQuestion, answer) .setParameters(email, securityQuestion, answer)
.setOrderBy(MUser.COLUMNNAME_AD_User_ID) .setOrderBy(MUser.COLUMNNAME_AD_User_ID)
.list(); .list();
} }
@ -358,7 +441,7 @@ public class ResetPasswordPanel extends Window implements EventListener<Event>
if (errorMsg.length() > 0) if (errorMsg.length() > 0)
errorMsg += ", "; errorMsg += ", ";
errorMsg += user.getEMail(); errorMsg += user.getEMail();
throw new AdempiereException("Failed to send email to user - " + user.getEMail()); throw new AdempiereException(Msg.getMsg(m_ctx, "RequestActionEMailError") + ": " + user.getEMail());
} }
} }

View File

@ -49,7 +49,7 @@ import org.zkoss.zul.Vbox;
* @date Mar 12, 2007 * @date Mar 12, 2007
* @version $Revision: 0.10 $ * @version $Revision: 0.10 $
*/ */
public class StatusBarPanel extends Panel implements EventListener, IStatusBar public class StatusBarPanel extends Panel implements EventListener<Event>, IStatusBar
{ {
/** /**
* *
@ -79,20 +79,10 @@ public class StatusBarPanel extends Panel implements EventListener, IStatusBar
private Div popupContent; private Div popupContent;
private String popupStyle; private String popupStyle;
private boolean embedded;
public StatusBarPanel() public StatusBarPanel()
{ {
this(false);
}
/**
* @param embedded
*/
public StatusBarPanel(boolean embedded)
{
super(); super();
this.embedded = embedded;
init(); init();
} }
@ -109,16 +99,10 @@ public class StatusBarPanel extends Panel implements EventListener, IStatusBar
hbox.appendChild(leftCell); hbox.appendChild(leftCell);
Cell rightCell = new Cell(); Cell rightCell = new Cell();
hbox.appendChild(rightCell); hbox.appendChild(rightCell);
if (embedded)
{ leftCell.setWidth("50%");
leftCell.setWidth("90%"); rightCell.setWidth("50%");
rightCell.setWidth("10%");
}
else
{
leftCell.setWidth("50%");
rightCell.setWidth("50%");
}
west = new Div(); west = new Div();
west.setStyle("text-align: left; "); west.setStyle("text-align: left; ");
west.appendChild(statusLine); west.appendChild(statusLine);
@ -131,17 +115,13 @@ public class StatusBarPanel extends Panel implements EventListener, IStatusBar
east = new Div(); east = new Div();
east.setWidth("100%"); east.setWidth("100%");
east.setStyle("text-align: right; "); east.setStyle("text-align: right; ");
if (!embedded) infoLine = new Label();
{ east.appendChild(infoLine);
infoLine = new Label(); infoLine.setVisible(false);
east.appendChild(infoLine);
infoLine.setVisible(false);
}
east.appendChild(statusDB); east.appendChild(statusDB);
LayoutUtils.addSclass("status-db", statusDB); LayoutUtils.addSclass("status-db", statusDB);
if (!embedded) LayoutUtils.addSclass("status-info", infoLine);
LayoutUtils.addSclass("status-info", infoLine);
vbox = new Vbox(); vbox = new Vbox();
vbox.setAlign("stretch"); vbox.setAlign("stretch");
vbox.setPack("center"); vbox.setPack("center");
@ -306,15 +286,12 @@ public class StatusBarPanel extends Panel implements EventListener, IStatusBar
*/ */
public void setInfo (String text) public void setInfo (String text)
{ {
if (!embedded) infoLine.setValue(text != null ? text : "");
{ infoLine.setTooltiptext(text);
infoLine.setValue(text != null ? text : ""); if (text == null || text.trim().length() == 0)
infoLine.setTooltiptext(text); infoLine.setVisible(false);
if (text == null || text.trim().length() == 0) else
infoLine.setVisible(false); infoLine.setVisible(true);
else
infoLine.setVisible(true);
}
} // setInfo } // setInfo
public void onEvent(Event event) throws Exception { public void onEvent(Event event) throws Exception {