hg merge release-1.0c (forward-porting)
This commit is contained in:
commit
14b0beddb0
|
@ -1,3 +1,6 @@
|
|||
SET SQLBLANKLINES ON
|
||||
SET DEFINE OFF
|
||||
|
||||
-- Jul 30, 2013 3:02:24 PM COT
|
||||
-- IDEMPIERE-1162
|
||||
UPDATE R_MailText SET MailText='Dear @Name@,
|
||||
|
|
|
@ -13,13 +13,12 @@
|
|||
package org.compiere.db;
|
||||
|
||||
import java.sql.Connection;
|
||||
import java.sql.ResultSet;
|
||||
import java.util.logging.Level;
|
||||
|
||||
import org.adempiere.exceptions.DBException;
|
||||
import org.compiere.util.CStatementVO;
|
||||
import org.compiere.util.DB;
|
||||
import org.compiere.util.Trx;
|
||||
import org.idempiere.db.util.AutoCommitConnectionBroker;
|
||||
|
||||
/**
|
||||
* Dynamic proxy for the CCallableStatement
|
||||
|
@ -51,10 +50,7 @@ public class CallableStatementProxy extends PreparedStatementProxy {
|
|||
}
|
||||
else
|
||||
{
|
||||
if (p_vo.getResultSetConcurrency() == ResultSet.CONCUR_UPDATABLE)
|
||||
m_conn = DB.getConnectionRW ();
|
||||
else
|
||||
m_conn = DB.getConnectionRO();
|
||||
m_conn = AutoCommitConnectionBroker.getConnection();
|
||||
conn = m_conn;
|
||||
}
|
||||
if (conn == null)
|
||||
|
|
|
@ -24,6 +24,7 @@ import org.compiere.util.CCachedRowSet;
|
|||
import org.compiere.util.CStatementVO;
|
||||
import org.compiere.util.DB;
|
||||
import org.compiere.util.Trx;
|
||||
import org.idempiere.db.util.AutoCommitConnectionBroker;
|
||||
|
||||
/**
|
||||
* Dynamic proxy for the CPreparedStatement interface
|
||||
|
@ -60,10 +61,7 @@ public class PreparedStatementProxy extends StatementProxy {
|
|||
if (trx != null) {
|
||||
conn = trx.getConnection();
|
||||
} else {
|
||||
if (p_vo.getResultSetConcurrency() == ResultSet.CONCUR_UPDATABLE)
|
||||
m_conn = DB.getConnectionRW();
|
||||
else
|
||||
m_conn = DB.getConnectionRO();
|
||||
m_conn = AutoCommitConnectionBroker.getConnection();
|
||||
conn = m_conn;
|
||||
}
|
||||
if (conn == null)
|
||||
|
|
|
@ -31,6 +31,7 @@ import org.compiere.util.CStatementVO;
|
|||
import org.compiere.util.DB;
|
||||
import org.compiere.util.DisplayType;
|
||||
import org.compiere.util.Trx;
|
||||
import org.idempiere.db.util.AutoCommitConnectionBroker;
|
||||
|
||||
/**
|
||||
*
|
||||
|
@ -152,10 +153,7 @@ public class StatementProxy implements InvocationHandler {
|
|||
}
|
||||
else
|
||||
{
|
||||
if (p_vo.getResultSetConcurrency() == ResultSet.CONCUR_UPDATABLE)
|
||||
m_conn = DB.getConnectionRW ();
|
||||
else
|
||||
m_conn = DB.getConnectionRO();
|
||||
m_conn = AutoCommitConnectionBroker.getConnection();
|
||||
conn = m_conn;
|
||||
}
|
||||
if (conn == null)
|
||||
|
@ -183,12 +181,7 @@ public class StatementProxy implements InvocationHandler {
|
|||
} finally {
|
||||
if (m_conn != null)
|
||||
{
|
||||
try
|
||||
{
|
||||
m_conn.close();
|
||||
}
|
||||
catch (Exception e)
|
||||
{}
|
||||
AutoCommitConnectionBroker.releaseConnection(m_conn);
|
||||
}
|
||||
m_conn = null;
|
||||
p_stmt = null;
|
||||
|
|
|
@ -2423,7 +2423,7 @@ public class GridTab implements DataStatusListener, Evaluatee, Serializable
|
|||
// Table Open?
|
||||
if (!m_mTable.isOpen())
|
||||
{
|
||||
log.severe ("Table not open");
|
||||
log.log (Level.SEVERE, "Table not open", new Exception("Table not open"));
|
||||
return -1;
|
||||
}
|
||||
// Row Count
|
||||
|
|
|
@ -524,6 +524,7 @@ public class GridTabVO implements Evaluatee, Serializable
|
|||
Env.setContext(Ctx, windowNo, clone.TabNo, GridTab.CTX_AD_Tab_ID, String.valueOf(clone.AD_Tab_ID));
|
||||
//
|
||||
clone.AD_Tab_ID = AD_Tab_ID;
|
||||
clone.AD_Tab_UU = AD_Tab_UU;
|
||||
clone.Name = Name;
|
||||
Env.setContext(Ctx, windowNo, clone.TabNo, GridTab.CTX_Name, clone.Name);
|
||||
clone.Description = Description;
|
||||
|
|
|
@ -350,6 +350,7 @@ public class GridWindowVO implements Serializable
|
|||
{
|
||||
clone = new GridWindowVO(ctx, windowNo);
|
||||
clone.AD_Window_ID = AD_Window_ID;
|
||||
clone.AD_Window_UU = AD_Window_UU;
|
||||
clone.Name = Name;
|
||||
clone.Description = Description;
|
||||
clone.Help = Help;
|
||||
|
|
|
@ -58,8 +58,7 @@ public final class MCountry extends X_C_Country
|
|||
*/
|
||||
public static MCountry get (Properties ctx, int C_Country_ID)
|
||||
{
|
||||
if (s_countries == null || s_countries.size() == 0)
|
||||
loadAllCountries(ctx);
|
||||
loadAllCountriesIfNeeded(ctx);
|
||||
String key = String.valueOf(C_Country_ID);
|
||||
MCountry c = (MCountry)s_countries.get(key);
|
||||
if (c != null)
|
||||
|
@ -80,8 +79,7 @@ public final class MCountry extends X_C_Country
|
|||
*/
|
||||
public static MCountry getDefault (Properties ctx)
|
||||
{
|
||||
if (s_countries == null || s_countries.size() == 0)
|
||||
loadAllCountries(ctx);
|
||||
loadAllCountriesIfNeeded(ctx);
|
||||
return s_default;
|
||||
} // get
|
||||
|
||||
|
@ -92,14 +90,19 @@ public final class MCountry extends X_C_Country
|
|||
*/
|
||||
public static MCountry[] getCountries(Properties ctx)
|
||||
{
|
||||
if (s_countries == null || s_countries.size() == 0)
|
||||
loadAllCountries(ctx);
|
||||
loadAllCountriesIfNeeded(ctx);
|
||||
MCountry[] retValue = new MCountry[s_countries.size()];
|
||||
s_countries.values().toArray(retValue);
|
||||
Arrays.sort(retValue, new MCountry(ctx, 0, null));
|
||||
return retValue;
|
||||
} // getCountries
|
||||
|
||||
private static synchronized void loadAllCountriesIfNeeded(Properties ctx) {
|
||||
if (s_countries == null || s_countries.isEmpty()) {
|
||||
loadAllCountries(ctx);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Load Countries.
|
||||
* Set Default Language to Client Language
|
||||
|
|
|
@ -319,7 +319,7 @@ public class MShippingTransaction extends X_M_ShippingTransaction
|
|||
|
||||
/* StringBuilder sql = new StringBuilder();
|
||||
sql.append("SELECT CompanyName, ContactName, PhoneNumber, EMail, C_Location_ID ");
|
||||
sql.append("FROM X_ShippingSenderInfo_V ");
|
||||
sql.append("FROM M_ShippingSenderInfo_V ");
|
||||
sql.append("WHERE M_ShippingTransaction_ID = ?");
|
||||
|
||||
PreparedStatement pstmt = null;
|
||||
|
@ -355,8 +355,8 @@ public class MShippingTransaction extends X_M_ShippingTransaction
|
|||
MWarehouse warehouse = new MWarehouse(getCtx(), getM_Warehouse_ID(), get_TrxName());
|
||||
|
||||
partyInfo = new PartyInfo();
|
||||
partyInfo.setCompanyName(sender.getDescription());
|
||||
partyInfo.setContactName(senderContact.getDescription());
|
||||
partyInfo.setCompanyName(sender.getName());
|
||||
partyInfo.setContactName(senderContact.getName());
|
||||
partyInfo.setPhoneNumber(sender.getInfo().getPhone());
|
||||
partyInfo.setEmail(senderContact.getEMail());
|
||||
partyInfo.setLocationId(warehouse.getC_Location_ID());
|
||||
|
@ -376,7 +376,7 @@ public class MShippingTransaction extends X_M_ShippingTransaction
|
|||
|
||||
/* StringBuilder sql = new StringBuilder();
|
||||
sql.append("SELECT CompanyName, ContactName, PhoneNumber, EMail, C_Location_ID ");
|
||||
sql.append("FROM X_ShippingRecipientInfo_V ");
|
||||
sql.append("FROM M_ShippingRecipientInfo_V ");
|
||||
sql.append("WHERE M_ShippingTransaction_ID = ?");
|
||||
|
||||
PreparedStatement pstmt = null;
|
||||
|
|
|
@ -105,7 +105,7 @@ public abstract class PO
|
|||
/**
|
||||
*
|
||||
*/
|
||||
private static final long serialVersionUID = -6478927681032558734L;
|
||||
private static final long serialVersionUID = -591429462738850345L;
|
||||
|
||||
public static final String LOCAL_TRX_PREFIX = "POSave";
|
||||
|
||||
|
@ -251,6 +251,8 @@ public abstract class PO
|
|||
private int m_idOld = 0;
|
||||
/** Custom Columns */
|
||||
private HashMap<String,String> m_custom = null;
|
||||
/** Attributes */
|
||||
private HashMap<String,Object> m_attributes = null;
|
||||
|
||||
/** Zero Integer */
|
||||
protected static final Integer I_ZERO = new Integer(0);
|
||||
|
@ -4518,6 +4520,22 @@ public abstract class PO
|
|||
log = CLogger.getCLogger(getClass());
|
||||
}
|
||||
|
||||
public void set_Attribute(String columnName, Object value) {
|
||||
if (m_attributes == null)
|
||||
m_attributes = new HashMap<String, Object>();
|
||||
m_attributes.put(columnName, value);
|
||||
}
|
||||
|
||||
public Object get_Attribute(String columnName) {
|
||||
if (m_attributes != null)
|
||||
return m_attributes.get(columnName);
|
||||
return null;
|
||||
}
|
||||
|
||||
public HashMap<String,Object> get_Attributes() {
|
||||
return m_attributes;
|
||||
}
|
||||
|
||||
private void validateUniqueIndex()
|
||||
{
|
||||
ValueNamePair ppE = CLogger.retrieveError();
|
||||
|
|
|
@ -0,0 +1,81 @@
|
|||
/******************************************************************************
|
||||
* Copyright (C) 2013 Heng Sin Low *
|
||||
* Copyright (C) 2013 Trek Global *
|
||||
* 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.idempiere.db.util;
|
||||
|
||||
import java.sql.Connection;
|
||||
import java.sql.SQLException;
|
||||
|
||||
import org.compiere.util.DB;
|
||||
|
||||
/**
|
||||
* This class managed the sharing of non-transactional connection per thread.
|
||||
* @author hengsin
|
||||
*
|
||||
*/
|
||||
public class AutoCommitConnectionBroker {
|
||||
private static ThreadLocal<ConnectionReference> threadLocalConnection = new ThreadLocal<ConnectionReference>() {
|
||||
protected ConnectionReference initialValue()
|
||||
{
|
||||
return null;
|
||||
}
|
||||
};
|
||||
|
||||
/**
|
||||
* Retrieve non-transactional connection for current thread.
|
||||
* If none have been allocated yet, a new one will be created from the connection pool.
|
||||
* @return Connection
|
||||
*/
|
||||
public static Connection getConnection() {
|
||||
ConnectionReference connReference = threadLocalConnection.get();
|
||||
if (connReference != null) {
|
||||
connReference.referenceCount++;
|
||||
return connReference.connection;
|
||||
} else {
|
||||
Connection connection = DB.createConnection(true, false, Connection.TRANSACTION_READ_COMMITTED);
|
||||
connReference = new ConnectionReference(connection);
|
||||
threadLocalConnection.set(connReference);
|
||||
return connection;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Release connection. The connection goes back to pool if reference count is zero.
|
||||
* @param conn
|
||||
*/
|
||||
public static void releaseConnection(Connection conn) {
|
||||
ConnectionReference connReference = threadLocalConnection.get();
|
||||
if (connReference != null && connReference.connection == conn) {
|
||||
connReference.referenceCount--;
|
||||
if (connReference.referenceCount <= 0) {
|
||||
threadLocalConnection.set(null);
|
||||
try {
|
||||
connReference.connection.close();
|
||||
} catch (SQLException e) {}
|
||||
}
|
||||
} else {
|
||||
try {
|
||||
conn.close();
|
||||
} catch (SQLException e) {}
|
||||
}
|
||||
}
|
||||
|
||||
private static class ConnectionReference {
|
||||
protected Connection connection;
|
||||
protected int referenceCount;
|
||||
protected ConnectionReference(Connection conn) {
|
||||
connection = conn;
|
||||
referenceCount = 1;
|
||||
}
|
||||
}
|
||||
}
|
|
@ -92,6 +92,7 @@ import org.zkoss.zul.Cell;
|
|||
import org.zkoss.zul.Center;
|
||||
import org.zkoss.zul.DefaultTreeNode;
|
||||
import org.zkoss.zul.Div;
|
||||
import org.zkoss.zul.RowRenderer;
|
||||
import org.zkoss.zul.Separator;
|
||||
import org.zkoss.zul.South;
|
||||
import org.zkoss.zul.Space;
|
||||
|
@ -177,7 +178,7 @@ DataStatusListener, IADTabpanel, IdSpace, IFieldEditorContainer
|
|||
|
||||
private GridTabDataBinder dataBinder;
|
||||
|
||||
private boolean activated = false;
|
||||
protected boolean activated = false;
|
||||
|
||||
private Group currentGroup;
|
||||
|
||||
|
@ -1533,9 +1534,15 @@ DataStatusListener, IADTabpanel, IdSpace, IFieldEditorContainer
|
|||
}
|
||||
} else if (tabPanel != null && !tabPanel.getGridTab().isCurrent()) {
|
||||
tabPanel.activate(true);
|
||||
} else if (tabPanel != null && tabPanel.isGridView()) {
|
||||
//ensure row indicator is not lost
|
||||
RowRenderer<Object[]> renderer = tabPanel.getGridView().getListbox().getRowRenderer();
|
||||
GridTabRowRenderer gtr = (GridTabRowRenderer)renderer;
|
||||
org.zkoss.zul.Row row = gtr.getCurrentRow();
|
||||
if (row != null)
|
||||
gtr.setCurrentRow(row);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
|
@ -61,6 +61,8 @@ public class CompositeADTabbox extends AbstractADTabbox
|
|||
public static final String AD_TABBOX_ON_EDIT_DETAIL_ATTRIBUTE = "ADTabbox.onEditDetail";
|
||||
|
||||
private static final String ON_POST_TAB_SELECTION_CHANGED_EVENT = "onPostTabSelectionChanged";
|
||||
|
||||
private static final String ON_TAB_SELECTION_CHANGED_ECHO_EVENT = "onTabSelectionChangedEcho";
|
||||
|
||||
public static final String ON_SELECTION_CHANGED_EVENT = "onSelectionChanged";
|
||||
|
||||
|
@ -186,8 +188,10 @@ public class CompositeADTabbox extends AbstractADTabbox
|
|||
if (formView && headerTab.isGridView()) {
|
||||
headerTab.switchRowPresentation();
|
||||
}
|
||||
|
||||
headerTab.getGridTab().setCurrentRow(row, true);
|
||||
|
||||
if (!headerTab.getGridTab().isSortTab())
|
||||
headerTab.getGridTab().setCurrentRow(row, true);
|
||||
|
||||
if (headerTab.isGridView()) {
|
||||
if (headerTab.getGridTab().isNew() || headerTab.needSave(true, false)) {
|
||||
headerTab.getGridView().onEditCurrentRow();
|
||||
|
@ -215,6 +219,13 @@ public class CompositeADTabbox extends AbstractADTabbox
|
|||
onPostTabSelectionChanged((Boolean)event.getData());
|
||||
}
|
||||
});
|
||||
|
||||
layout.addEventListener(ON_TAB_SELECTION_CHANGED_ECHO_EVENT, new EventListener<Event>() {
|
||||
@Override
|
||||
public void onEvent(Event event) throws Exception {
|
||||
onTabSelectionChangedEcho((Boolean)event.getData());
|
||||
}
|
||||
});
|
||||
|
||||
BreadCrumb breadCrumb = getBreadCrumb();
|
||||
breadCrumb.addEventListener(Events.ON_CLICK, new EventListener<Event>() {
|
||||
|
@ -437,16 +448,12 @@ public class CompositeADTabbox extends AbstractADTabbox
|
|||
headerTab.setDetailPaneMode(false);
|
||||
getBreadCrumb().getFirstChild().setVisible(false);
|
||||
|
||||
Events.echoEvent(new Event(ON_POST_TAB_SELECTION_CHANGED_EVENT, layout, oldIndex > newIndex));
|
||||
Events.sendEvent(new Event(ON_POST_TAB_SELECTION_CHANGED_EVENT, layout, oldIndex > newIndex));
|
||||
}
|
||||
|
||||
private void onPostTabSelectionChanged(Boolean back) {
|
||||
if (headerTab instanceof ADTabpanel) {
|
||||
DetailPane detailPane = headerTab.getDetailPane();
|
||||
if (detailPane == null) {
|
||||
detailPane = createDetailPane();
|
||||
}
|
||||
|
||||
if (headerTab instanceof ADTabpanel && !headerTab.getGridTab().isSortTab()) {
|
||||
List<Object[]> list = new ArrayList<Object[]>();
|
||||
int tabIndex = -1;
|
||||
int currentLevel = headerTab.getTabLevel();
|
||||
for (int i = selectedIndex + 1; i< tabPanelList.size(); i++) {
|
||||
|
@ -454,33 +461,79 @@ public class CompositeADTabbox extends AbstractADTabbox
|
|||
int tabLevel = tabPanel.getTabLevel();
|
||||
ADTabListModel.ADTabLabel tabLabel = tabLabelList.get(i);
|
||||
if ((tabLevel - currentLevel) == 1 || (tabLevel == 0 && currentLevel == 0)) {
|
||||
if (tabPanel.isActivated() && !tabPanel.isGridView()) {
|
||||
tabPanel.switchRowPresentation();
|
||||
}
|
||||
if (tabPanel.getParent() != null) tabPanel.detach();
|
||||
tabIndex++;
|
||||
detailPane.setADTabpanel(tabIndex, tabPanel, tabLabel);
|
||||
tabPanel.setDetailPaneMode(true);
|
||||
Object[] value = new Object[]{tabIndex, tabPanel, tabLabel, Boolean.TRUE};
|
||||
list.add(value);
|
||||
} else if (tabLevel > currentLevel ){
|
||||
tabIndex++;
|
||||
detailPane.setADTabpanel(tabIndex, tabPanel, tabLabel, false);
|
||||
tabPanel.setDetailPaneMode(true);
|
||||
Object[] value = new Object[]{tabIndex, tabPanel, tabLabel, Boolean.FALSE};
|
||||
list.add(value);
|
||||
} else {
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (detailPane.getTabcount() > 0 && !headerTab.getGridTab().isSortTab()) {
|
||||
if (!list.isEmpty()) {
|
||||
DetailPane detailPane = headerTab.getDetailPane();
|
||||
if (detailPane == null) {
|
||||
detailPane = createDetailPane();
|
||||
}
|
||||
detailPane.setAttribute("detailpane.tablist", list);
|
||||
|
||||
detailPane.setVflex("true");
|
||||
detailPane.setSelectedIndex(0);
|
||||
if (headerTab.getDetailPane() == null) {
|
||||
headerTab.setDetailPane(detailPane);
|
||||
}
|
||||
activateDetailIfVisible();
|
||||
}
|
||||
}
|
||||
Events.echoEvent(new Event(ON_TAB_SELECTION_CHANGED_ECHO_EVENT, layout, back));
|
||||
}
|
||||
|
||||
private void onTabSelectionChangedEcho(Boolean back) {
|
||||
if (headerTab instanceof ADTabpanel) {
|
||||
DetailPane detailPane = headerTab.getDetailPane();
|
||||
|
||||
if (detailPane != null) {
|
||||
@SuppressWarnings("unchecked")
|
||||
List<Object[]> list = (List<Object[]>) detailPane.removeAttribute("detailpane.tablist");
|
||||
if (list != null && !list.isEmpty()) {
|
||||
int currentLevel = headerTab.getTabLevel();
|
||||
for (Object[] value : list) {
|
||||
int tabIndex = (Integer) value[0];
|
||||
IADTabpanel tabPanel = (IADTabpanel) value[1];
|
||||
ADTabLabel tabLabel = (ADTabLabel) value[2] ;
|
||||
Boolean enable = (Boolean) value[3];
|
||||
|
||||
int tabLevel = tabPanel.getTabLevel();
|
||||
if ((tabLevel - currentLevel) == 1 || (tabLevel == 0 && currentLevel == 0)) {
|
||||
if (tabPanel.isActivated() && !tabPanel.isGridView()) {
|
||||
tabPanel.switchRowPresentation();
|
||||
}
|
||||
if (tabPanel.getParent() != null) tabPanel.detach();
|
||||
}
|
||||
tabPanel.setDetailPaneMode(true);
|
||||
detailPane.setADTabpanel(tabIndex, tabPanel, tabLabel, enable.booleanValue());
|
||||
}
|
||||
if (back == null || !back.booleanValue()) {
|
||||
detailPane.setSelectedIndex(0);
|
||||
activateDetailIfVisible();
|
||||
} else {
|
||||
if (((ADTabpanel) headerTab).isDetailVisible()) {
|
||||
IADTabpanel selectDetailPanel = detailPane.getSelectedADTabpanel();
|
||||
if (!selectDetailPanel.isVisible()) {
|
||||
selectDetailPanel.setVisible(true);
|
||||
}
|
||||
if (!selectDetailPanel.isGridView()) {
|
||||
selectDetailPanel.switchRowPresentation();
|
||||
}
|
||||
if (selectDetailPanel instanceof ADTabpanel)
|
||||
((ADTabpanel)selectDetailPanel).activated = true;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
updateBreadCrumb();
|
||||
updateBreadCrumb();
|
||||
getBreadCrumb().getFirstChild().setVisible(true);
|
||||
|
||||
updateTabState();
|
||||
|
@ -741,8 +794,9 @@ public class CompositeADTabbox extends AbstractADTabbox
|
|||
} else {
|
||||
tabPanel.query(false, 0, 0);
|
||||
}
|
||||
if (!tabPanel.isVisible())
|
||||
if (!tabPanel.isVisible()) {
|
||||
tabPanel.setVisible(true);
|
||||
}
|
||||
if (!tabPanel.isGridView()) {
|
||||
tabPanel.switchRowPresentation();
|
||||
}
|
||||
|
@ -752,7 +806,12 @@ public class CompositeADTabbox extends AbstractADTabbox
|
|||
headerTab.getDetailPane().updateToolbar(false, true);
|
||||
} else {
|
||||
tabPanel.dynamicDisplay(0);
|
||||
}
|
||||
RowRenderer<Object[]> renderer = tabPanel.getGridView().getListbox().getRowRenderer();
|
||||
GridTabRowRenderer gtr = (GridTabRowRenderer)renderer;
|
||||
Row row = gtr.getCurrentRow();
|
||||
if (row != null)
|
||||
gtr.setCurrentRow(row);
|
||||
}
|
||||
}
|
||||
|
||||
private void showLastError() {
|
||||
|
|
|
@ -95,7 +95,7 @@ public class DPFavourites extends DashboardPanel implements EventListener<Event>
|
|||
// Elaine 2008/07/24
|
||||
Image img = new Image(ThemeManager.getThemeResource("images/Delete24.png"));
|
||||
favToolbar.appendChild(img);
|
||||
img.setStyle("text-align: right");
|
||||
img.setStyle("text-align: right; width:24px; height:24px;");
|
||||
img.setTooltiptext(Util.cleanAmp(Msg.getMsg(Env.getCtx(), "Delete")));
|
||||
img.setDroppable(DELETE_FAV_DROPPABLE);
|
||||
img.addEventListener(Events.ON_DROP, this);
|
||||
|
|
|
@ -101,14 +101,14 @@ public class DPRecentItems extends DashboardPanel implements EventListener<Event
|
|||
|
||||
Image imgr = new Image(ThemeManager.getThemeResource("images/Refresh24.png"));
|
||||
recentItemsToolbar.appendChild(imgr);
|
||||
imgr.setStyle("text-align: right; cursor: pointer;");
|
||||
imgr.setStyle("text-align: right; cursor: pointer; width:24px; height:24px;");
|
||||
imgr.setTooltiptext(Util.cleanAmp(Msg.getMsg(ctx, "Refresh")));
|
||||
imgr.addEventListener(Events.ON_CLICK, this);
|
||||
//
|
||||
|
||||
Image img = new Image(ThemeManager.getThemeResource("images/Delete24.png"));
|
||||
recentItemsToolbar.appendChild(img);
|
||||
img.setStyle("text-align: right;");
|
||||
img.setStyle("text-align: right; width:24px; height:24px;");
|
||||
img.setDroppable(DELETE_RECENTITEMS_DROPPABLE);
|
||||
img.setTooltiptext(Util.cleanAmp(Msg.getMsg(ctx, "Delete")));
|
||||
img.addEventListener(Events.ON_DROP, this);
|
||||
|
|
|
@ -84,7 +84,8 @@ public class DashboardRunnable implements Runnable, Serializable
|
|||
|
||||
public void run()
|
||||
{
|
||||
if (dashboardPanels != null && desktop != null && desktop.get() != null)
|
||||
if (dashboardPanels != null && desktop != null && desktop.get() != null
|
||||
&& desktop.get().isAlive() && desktop.get().isServerPushEnabled())
|
||||
{
|
||||
Locales.setThreadLocal(locale);
|
||||
try {
|
||||
|
|
|
@ -23,8 +23,6 @@ import java.util.ArrayList;
|
|||
import java.util.HashMap;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.concurrent.ScheduledFuture;
|
||||
import java.util.concurrent.TimeUnit;
|
||||
import java.util.logging.Level;
|
||||
|
||||
import org.adempiere.webui.apps.AEnv;
|
||||
|
@ -37,7 +35,6 @@ import org.adempiere.webui.report.HTMLExtension;
|
|||
import org.adempiere.webui.session.SessionManager;
|
||||
import org.adempiere.webui.theme.ThemeManager;
|
||||
import org.adempiere.webui.window.ZkReportViewerProvider;
|
||||
import org.compiere.Adempiere;
|
||||
import org.compiere.model.I_AD_Menu;
|
||||
import org.compiere.model.MDashboardContent;
|
||||
import org.compiere.model.MDashboardPreference;
|
||||
|
@ -71,6 +68,7 @@ import org.zkoss.zul.Include;
|
|||
import org.zkoss.zul.Panel;
|
||||
import org.zkoss.zul.Panelchildren;
|
||||
import org.zkoss.zul.Separator;
|
||||
import org.zkoss.zul.Timer;
|
||||
import org.zkoss.zul.Toolbar;
|
||||
import org.zkoss.zul.Toolbarbutton;
|
||||
import org.zkoss.zul.Vlayout;
|
||||
|
@ -90,7 +88,7 @@ public class DashboardController implements EventListener<Event> {
|
|||
private Anchorlayout dashboardLayout;
|
||||
private Anchorchildren maximizedHolder;
|
||||
private DashboardRunnable dashboardRunnable;
|
||||
private ScheduledFuture<?> dashboardFuture;
|
||||
private Timer dashboardTimer;
|
||||
|
||||
private final static int DEFAULT_DASHBOARD_WIDTH = 95;
|
||||
|
||||
|
@ -386,7 +384,18 @@ public class DashboardController implements EventListener<Event> {
|
|||
|
||||
// default Update every one minutes
|
||||
int interval = MSysConfig.getIntValue(MSysConfig.ZK_DASHBOARD_REFRESH_INTERVAL, 60000);
|
||||
dashboardFuture = Adempiere.getThreadPoolExecutor().scheduleWithFixedDelay(dashboardRunnable, interval, interval, TimeUnit.MILLISECONDS);
|
||||
dashboardTimer = new Timer();
|
||||
dashboardTimer.setDelay(interval);
|
||||
dashboardTimer.setRepeats(true);
|
||||
dashboardTimer.addEventListener(Events.ON_TIMER, new EventListener<Event>() {
|
||||
@Override
|
||||
public void onEvent(Event event) throws Exception {
|
||||
if (dashboardRunnable != null && !dashboardRunnable.isEmpty()) {
|
||||
dashboardRunnable.run();
|
||||
}
|
||||
}
|
||||
});
|
||||
dashboardTimer.setPage(parent.getPage());
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -596,15 +605,11 @@ public class DashboardController implements EventListener<Event> {
|
|||
* @param desktop
|
||||
*/
|
||||
public void onSetPage(Page page, Desktop desktop) {
|
||||
if (dashboardFuture != null && !dashboardFuture.isDone()) {
|
||||
dashboardFuture.cancel(true);
|
||||
Adempiere.getThreadPoolExecutor().remove((Runnable) dashboardFuture);
|
||||
if (dashboardTimer != null) {
|
||||
|
||||
DashboardRunnable tmp = dashboardRunnable;
|
||||
dashboardRunnable = new DashboardRunnable(tmp, desktop);
|
||||
// default Update every one minutes
|
||||
int interval = MSysConfig.getIntValue(MSysConfig.ZK_DASHBOARD_REFRESH_INTERVAL, 60000);
|
||||
dashboardFuture = Adempiere.getThreadPoolExecutor().scheduleWithFixedDelay(dashboardRunnable, interval, interval, TimeUnit.MILLISECONDS);
|
||||
dashboardTimer.setPage(page);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -612,10 +617,9 @@ public class DashboardController implements EventListener<Event> {
|
|||
* clean up for logout
|
||||
*/
|
||||
public void onLogOut() {
|
||||
if (dashboardFuture != null && !dashboardFuture.isDone()) {
|
||||
dashboardFuture.cancel(true);
|
||||
Adempiere.getThreadPoolExecutor().remove((Runnable) dashboardFuture);
|
||||
dashboardFuture = null;
|
||||
if (dashboardTimer != null) {
|
||||
dashboardTimer.detach();
|
||||
dashboardTimer = null;
|
||||
}
|
||||
if (dashboardRunnable != null) {
|
||||
dashboardRunnable = null;
|
||||
|
|
|
@ -264,6 +264,7 @@ public class DefaultDesktop extends TabbedDesktop implements MenuListener, Seria
|
|||
toolbar.appendChild(max);
|
||||
max.setImage(ThemeManager.getThemeResource(IMAGES_UPARROW_PNG));
|
||||
max.addEventListener(Events.ON_CLICK, this);
|
||||
max.setSclass("window-container-toolbar-btn");
|
||||
max.setStyle("cursor: pointer; border: 1px solid transparent; padding: 2px;");
|
||||
|
||||
return layout;
|
||||
|
|
|
@ -211,6 +211,7 @@ public abstract class AbstractMenuPanel extends Panel implements EventListener<E
|
|||
public Toolbarbutton createNewButton()
|
||||
{
|
||||
Toolbarbutton newBtn = new Toolbarbutton(null, ThemeManager.getThemeResource("images/New10.png"));
|
||||
newBtn.setSclass("menu-href-newbtn");
|
||||
newBtn.setStyle("padding-left:3px; margin-bottom:5px");
|
||||
return newBtn;
|
||||
}
|
||||
|
|
|
@ -144,6 +144,7 @@ public class TreeSearchPanel extends Panel implements EventListener<Event>, Tree
|
|||
cmbSearch = new AutoComplete();
|
||||
cmbSearch.setAutodrop(true);
|
||||
cmbSearch.setId("treeSearchCombo");
|
||||
cmbSearch.setSclass("tree-search-combo");
|
||||
|
||||
cmbSearch.addEventListener(Events.ON_OK, this);
|
||||
cmbSearch.addEventListener(Events.ON_SELECT, new EventListener<SelectEvent<Comboitem,Object>>() {
|
||||
|
|
|
@ -137,12 +137,34 @@ html,body {
|
|||
.menu-href img {
|
||||
padding: 2px;
|
||||
padding-right: 4px;
|
||||
width: 16px;
|
||||
height: 16px;
|
||||
}
|
||||
|
||||
.menu-href-newbtn img {
|
||||
width: 10px;
|
||||
height: 10px;
|
||||
}
|
||||
|
||||
.window-container-toolbar-btn .z-toolbarbutton-cnt img {
|
||||
width: 22px;
|
||||
height: 22px;
|
||||
}
|
||||
|
||||
.tree-search-combo .z-comboitem-img img {
|
||||
width: 16px;
|
||||
height: 16px;
|
||||
}
|
||||
|
||||
.fav-new-btn {
|
||||
margin-left: 4px;
|
||||
}
|
||||
|
||||
.fav-new-btn img {
|
||||
height: 16px;
|
||||
width: 16px;
|
||||
}
|
||||
|
||||
.disableFilter img {
|
||||
opacity: 0.2;
|
||||
filter: progid : DXImageTransform . Microsoft . Alpha(opacity = 20);
|
||||
|
@ -173,6 +195,11 @@ html,body {
|
|||
height: 22px;
|
||||
}
|
||||
|
||||
.breadcrumb-toolbar-button img {
|
||||
width: 22px;
|
||||
height: 22px;
|
||||
}
|
||||
|
||||
.breadcrumb-record-info {
|
||||
font-size: 12px;
|
||||
}
|
||||
|
@ -622,6 +649,10 @@ div.wc-modal, div.wc-modal-none, div.wc-highlighted, div.wc-highlighted-none {
|
|||
width: 100%;
|
||||
}
|
||||
|
||||
.favourites-box .z-toolbar-start {
|
||||
float: right;
|
||||
}
|
||||
|
||||
.recentitems-box {
|
||||
width: 90%;
|
||||
margin: auto;
|
||||
|
@ -632,6 +663,10 @@ div.wc-modal, div.wc-modal-none, div.wc-highlighted, div.wc-highlighted-none {
|
|||
display: block;
|
||||
padding: 2px 0px;
|
||||
}
|
||||
|
||||
.recentitems-box .z-toolbar-start {
|
||||
float: right;
|
||||
}
|
||||
|
||||
.views-box {
|
||||
width: 90%;
|
||||
|
@ -648,6 +683,11 @@ div.wc-modal, div.wc-modal-none, div.wc-highlighted, div.wc-highlighted-none {
|
|||
padding: 2px 0px;
|
||||
}
|
||||
|
||||
.views-box .link img {
|
||||
height: 16px;
|
||||
width: 16px;
|
||||
}
|
||||
|
||||
.activities-box {
|
||||
width: 90%;
|
||||
margin: auto;
|
||||
|
@ -771,6 +811,11 @@ div.wc-modal, div.wc-modal-none, div.wc-highlighted, div.wc-highlighted-none {
|
|||
display: inline-block;
|
||||
}
|
||||
|
||||
.adwindow-detailpane-toolbar .z-toolbarbutton img {
|
||||
width: 16px;
|
||||
height: 16px;
|
||||
}
|
||||
|
||||
.adwindow-detailpane-toolbar .z-toolbar-body .docstatus-normal,
|
||||
.adwindow-detailpane-toolbar .z-toolbar-body .docstatus-error {
|
||||
padding-left: 4px;
|
||||
|
@ -1543,6 +1588,10 @@ font-size: 0;
|
|||
padding: 1px 4px 1px 4px;
|
||||
}
|
||||
|
||||
.menu-search-toggle-on img, .menu-search-toggle-off img {
|
||||
height: 16px;
|
||||
width: 16px;
|
||||
}
|
||||
<%-- workaround for http://jira.idempiere.com/browse/IDEMPIERE-692 --%>
|
||||
.z-combobox-pp {
|
||||
max-height: 200px;
|
||||
|
@ -1595,6 +1644,11 @@ table.z-vbox > tbody > tr > td > table {
|
|||
width: 120px !important;
|
||||
}
|
||||
|
||||
.performance-indicator img {
|
||||
height: 120px;
|
||||
width: 120px;
|
||||
}
|
||||
|
||||
.window-view-pi .performance-indicator {
|
||||
width: 180px !important;
|
||||
}
|
||||
|
|
|
@ -96,6 +96,10 @@
|
|||
margin: -3px;
|
||||
padding-top: 5px;
|
||||
}
|
||||
.calendar-toolbar .z-toolbarbutton img {
|
||||
height: 16px;
|
||||
width: 16px;
|
||||
}
|
||||
.gecko2 .calendar-toolbar {
|
||||
margin: -3px;
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue