Adempiere 3.1.2

This commit is contained in:
vpj-cd 2006-12-07 03:43:41 +00:00
parent 3845274508
commit 2c02be5c40
16 changed files with 0 additions and 2592 deletions

View File

@ -1,25 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE log4j:configuration SYSTEM "log4j.dtd">
<log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/">
<!-- this is a standard log4j deployment descriptor -->
<appender name="console" class="org.apache.log4j.ConsoleAppender">
<param name="Target" value="System.Out"/>
<layout class="org.apache.log4j.PatternLayout">
<param name="ConversionPattern" value="%d %-5p %C{1}.%M - %m\n"/>
</layout>
</appender>
<!-- The All category -->
<category name="All" additivity="false">
<priority value="debug"/>
<appender-ref ref="console"/>
</category>
<!-- The one and only root category -->
<root>
<priority value="info"/>
<appender-ref ref="console"/>
</root>
</log4j:configuration>

View File

@ -1,106 +0,0 @@
/******************************************************************************
* Product: Adempiere ERP & CRM Smart Business Solution *
* Copyright (C) 1999-2006 ComPiere, Inc. All Rights Reserved. *
* This program is free software; you can redistribute it and/or modify it *
* under the terms version 2 of the GNU General Public License as published *
* by the Free Software Foundation. This program is distributed in the hope *
* that it will be useful, but WITHOUT ANY WARRANTY; without even the implied *
* warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. *
* See the GNU General Public License for more details. *
* You should have received a copy of the GNU General Public License along *
* with this program; if not, write to the Free Software Foundation, Inc., *
* 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. *
* For the text or an alternative of this public license, you may reach us *
* ComPiere, Inc., 2620 Augustine Dr. #245, Santa Clara, CA 95054, USA *
* or via info@compiere.org or http://www.compiere.org/license.html *
*****************************************************************************/
package org.compiere.jsf;
import java.io.IOException;
import java.util.Properties;
import java.util.logging.Level;
import javax.servlet.Servlet;
import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.UnavailableException;
import org.compiere.Adempiere;
import org.compiere.util.CLogMgt;
import org.compiere.util.CLogger;
import org.compiere.util.Env;
import org.compiere.util.Ini;
import org.compiere.util.Login;
/**
* for this project, this servlet needs to be replaced by a backing bean that can also log out
* initializes the adempiere "engine" -- basically logs into the server
* web.xml snippet:
* <servlet>
<servlet-name>adempiereInitServlet</servlet-name>
<servlet-class>org.compiere.jsf.AdempiereInitServlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
* @author rfreden
* @todo wouldn't it be cool to have a Filter to implement lazy loading?
* @fixme the adempiere code here does a System.exit (terminating tomcat...) if it fails to connect to the db
*/
public class AdempiereInitServlet implements Servlet
{
private static final CLogger log=CLogger.getCLogger(AdempiereInitServlet.class);
private Properties adempiereProperties;
private ServletConfig servletConfig=null;
/**
* nop method, because this servlet doesn't actually serve anything
*/
public void service(ServletRequest servletRequest,ServletResponse servletResponse)
throws ServletException, IOException
{}
public void init(ServletConfig s) throws ServletException
{
servletConfig=s;
// Adempiere start up and properties setup
//org.compiere.Adempiere.startupEnvironment(true);
if(!Adempiere.startupEnvironment(true))
throw new UnavailableException("adempiere init failed");
adempiereProperties = Env.getCtx();
//CLogMgt.setLoggerLevel(Level.FINE, null);
CLogMgt.setLevel(Level.ALL);
Ini.setProperty(Ini.P_UID, "SuperUser");
Ini.setProperty(Ini.P_PWD, "System");
Ini.setProperty(Ini.P_ROLE, "GardenWorld Admin");
Ini.setProperty(Ini.P_CLIENT, "GardenWorld");
Ini.setProperty(Ini.P_ORG, "*");
Ini.setProperty(Ini.P_LANGUAGE, "English");
//Ini.setProperty(Ini.P_LANGUAGE, "Danish_dk_DK");
Ini.setProperty(Ini.P_WAREHOUSE, "");
Login login = new Login(adempiereProperties);
if (!login.batchLogin(null))
throw new UnavailableException("Adempiere login failed");
log.info("adempiere login complete");
}
public String getServletInfo()
{
return "Adempiere Initialization Servlet, author Rigel Freden, copyright Possibility Forge, Inc. 2006";
}
public ServletConfig getServletConfig()
{
return servletConfig;
}
/**
* @todo implement this method
*/
public void destroy()
{}
}

View File

@ -1,222 +0,0 @@
/******************************************************************************
* Product: Adempiere ERP & CRM Smart Business Solution *
* Copyright (C) 1999-2006 ComPiere, Inc. All Rights Reserved. *
* This program is free software; you can redistribute it and/or modify it *
* under the terms version 2 of the GNU General Public License as published *
* by the Free Software Foundation. This program is distributed in the hope *
* that it will be useful, but WITHOUT ANY WARRANTY; without even the implied *
* warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. *
* See the GNU General Public License for more details. *
* You should have received a copy of the GNU General Public License along *
* with this program; if not, write to the Free Software Foundation, Inc., *
* 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. *
* For the text or an alternative of this public license, you may reach us *
* ComPiere, Inc., 2620 Augustine Dr. #245, Santa Clara, CA 95054, USA *
* or via info@compiere.org or http://www.compiere.org/license.html *
*****************************************************************************/
package org.compiere.jsf;
import java.util.HashMap;
import javax.faces.context.FacesContext;
import javax.faces.event.ActionEvent;
import org.compiere.model.GridTab;
import org.compiere.model.GridWindow;
import org.compiere.util.CLogger;
/**
* this class does the actual work for variables that start with actionListener_lookup
* basically every method here should have a void return type and take an ActionEvent as argument
* TODO: implement all methods for the dropdown and button menus, list them here
* gridToggle
*
* @author rfreden
*
*/
public class DynamicActionListenerLookup
{
// this class makes use of the hidden variable "tabNo"
// which contains tab0Grid or somesuch, identifying the panel that's currently on top
// where the digit in the middle is the tabNo for adempiere
// in case it will matter, it will also have a windowNo, a unique window identifier for adempiere
private static final CLogger log=CLogger.getCLogger(DynamicActionListenerLookup.class);
private FacesContext facesContext;
private Long tabNo;
private TabStateManager tabStateManager;
public DynamicActionListenerLookup(FacesContext ctx)
{
facesContext=ctx;
tabStateManager=new TabStateManager(facesContext);
}
// FIXME: implement all these method stubs
public void undo(ActionEvent ae)
{
throw new UnsupportedOperationException();
}
public void help(ActionEvent ae)
{
throw new UnsupportedOperationException();
}
public void createNew(ActionEvent ae)
{
throw new UnsupportedOperationException();
}
public void delete(ActionEvent ae)
{
throw new UnsupportedOperationException();
}
/**
* tab control actionListener method; use actionListener="actionListener_lookup.focus"
* to raise the tab described by currentTabNo
* @param ae
*/
public void focus(ActionEvent ae)
{
log.info("focusing on tabNo "+tabNo);
tabStateManager.getUIState().setTabNo(tabNo.intValue());
}
public void save(ActionEvent ae)
{
// save tab on window
// check if this is called during the
GridTab gridTab=getCurrentGridTab();
gridTab.getTableModel().open(0);
log.info("saving tab "+gridTab.getTabNo());
if(!gridTab.dataSave(true))
log.info("failed to save tab");
}
public void refresh(ActionEvent ae)
{
log.info("called");
// FIXME: this open method is hackish at best
getCurrentGridTab().getTableModel().open(0);
getCurrentGridTab().dataRefresh();
}
public void lookup(ActionEvent ae)
{
throw new UnsupportedOperationException();
}
public void attachment(ActionEvent ae)
{
throw new UnsupportedOperationException();
}
/*
public void gridToggle(ActionEvent ae)
{
log.info("entered");
tabStateManager.gridToggle();
}
*/
public void history(ActionEvent ae)
{
throw new UnsupportedOperationException();
}
public void menu(ActionEvent ae)
{
throw new UnsupportedOperationException();
}
public void parent(ActionEvent ae)
{
throw new UnsupportedOperationException();
}
public void detail(ActionEvent ae)
{
throw new UnsupportedOperationException();
}
public void first(ActionEvent ae)
{
throw new UnsupportedOperationException();
}
public void previous(ActionEvent ae)
{
throw new UnsupportedOperationException();
}
public void next(ActionEvent ae)
{
throw new UnsupportedOperationException();
}
public void last(ActionEvent ae)
{
throw new UnsupportedOperationException();
}
public void report(ActionEvent ae)
{
throw new UnsupportedOperationException();
}
public void archived(ActionEvent ae)
{
throw new UnsupportedOperationException();
}
public void print(ActionEvent ae)
{
throw new UnsupportedOperationException();
}
public void zoom(ActionEvent ae)
{
throw new UnsupportedOperationException();
}
public void active(ActionEvent ae)
{
throw new UnsupportedOperationException();
}
public void check(ActionEvent ae)
{
throw new UnsupportedOperationException();
}
public void product(ActionEvent ae)
{
throw new UnsupportedOperationException();
}
public void exit(ActionEvent ae)
{
throw new UnsupportedOperationException();
}
public void setTabNo(Long l)
{
log.info("setting tabNo to "+l);
tabNo=l;
}
// these three parse the tabNo string
// FIXME: check them
private GridTab getCurrentGridTab()
{
Integer key=new Integer(tabStateManager.getUIState().getWindowNo());
// get window from hashmap "grids"
GridWindow gridWindow=((HashMap<Integer, GridWindow>)facesContext.getExternalContext()
.getSessionMap().get("grids")).get(key);
return gridWindow.getTab(tabStateManager.getUIState().getTabNo().intValue());
}
}

View File

@ -1,116 +0,0 @@
/******************************************************************************
* Product: Adempiere ERP & CRM Smart Business Solution *
* Copyright (C) 1999-2006 ComPiere, Inc. All Rights Reserved. *
* This program is free software; you can redistribute it and/or modify it *
* under the terms version 2 of the GNU General Public License as published *
* by the Free Software Foundation. This program is distributed in the hope *
* that it will be useful, but WITHOUT ANY WARRANTY; without even the implied *
* warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. *
* See the GNU General Public License for more details. *
* You should have received a copy of the GNU General Public License along *
* with this program; if not, write to the Free Software Foundation, Inc., *
* 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. *
* For the text or an alternative of this public license, you may reach us *
* ComPiere, Inc., 2620 Augustine Dr. #245, Santa Clara, CA 95054, USA *
* or via info@compiere.org or http://www.compiere.org/license.html *
*****************************************************************************/
package org.compiere.jsf;
import javax.faces.el.PropertyNotFoundException;
import javax.faces.el.PropertyResolver;
import org.compiere.util.CLogger;
/**
* this class continues the el lookup initiated by DynamicActionListenerVariableResolver,
* resolving the value to the proper name
* hmmm, i think this whole class is unnecessary
*/
public class DynamicActionListenerPropertyResolver extends PropertyResolver
{
private final static CLogger log=CLogger.getCLogger(DynamicActionListenerPropertyResolver.class);
private PropertyResolver originalResolver;
public DynamicActionListenerPropertyResolver(PropertyResolver propertyResolver)
{
//log.info("entered");
originalResolver = propertyResolver;
}
public Object getValue(Object base,Object property) throws PropertyNotFoundException
{
if (base instanceof DynamicActionListenerLookup)
{
if(property instanceof Long)
((DynamicActionListenerLookup)base).setTabNo((Long)property);
return base;
//throw new PropertyNotFoundException();
}
return originalResolver.getValue(base,property);
}
public Object getValue(Object base,int index) throws PropertyNotFoundException
{
if(base instanceof DynamicActionListenerLookup)
throw new PropertyNotFoundException();
return originalResolver.getValue(base,index);
}
/**
* TODO: test this method
*/
public void setValue(Object base,Object property,Object value) throws PropertyNotFoundException
{
//log.info("entered");
if(base instanceof DynamicActionListenerLookup)
throw new PropertyNotFoundException("attempted to call set on a read-only field");
else
{
originalResolver.setValue(base,property,value);
}
}
public void setValue(Object obj,int i,Object obj1) throws PropertyNotFoundException
{
//log.info("entered");
if(obj instanceof DynamicActionListenerLookup)
throw new PropertyNotFoundException();
else
originalResolver.setValue(obj,i,obj1);
}
public boolean isReadOnly(Object base,Object property) throws PropertyNotFoundException
{
//log.info("entered");
if(base instanceof DynamicActionListenerLookup)
throw new PropertyNotFoundException();
return originalResolver.isReadOnly(base,property);
}
public boolean isReadOnly(Object obj,int i) throws PropertyNotFoundException
{
//log.info("entered");
if(obj instanceof DynamicActionListenerLookup)
throw new PropertyNotFoundException();
return originalResolver.isReadOnly(obj,i);
}
// this should probably throw for our object
public Class getType(Object obj,Object obj1) throws PropertyNotFoundException
{
//log.info("entered");
//if (!(obj instanceof DynamicFieldLookup))
// hope this works..
return originalResolver.getType(obj,obj1);
//else
// return com.ibm.faces.databind.SelectItemsWrapper.class;
}
public Class getType(Object obj,int i) throws PropertyNotFoundException
{
//log.info("entered");
if(obj instanceof DynamicActionListenerLookup)
throw new PropertyNotFoundException();
return originalResolver.getType(obj,i);
}
}

View File

@ -1,49 +0,0 @@
/******************************************************************************
* Product: Adempiere ERP & CRM Smart Business Solution *
* Copyright (C) 1999-2006 ComPiere, Inc. All Rights Reserved. *
* This program is free software; you can redistribute it and/or modify it *
* under the terms version 2 of the GNU General Public License as published *
* by the Free Software Foundation. This program is distributed in the hope *
* that it will be useful, but WITHOUT ANY WARRANTY; without even the implied *
* warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. *
* See the GNU General Public License for more details. *
* You should have received a copy of the GNU General Public License along *
* with this program; if not, write to the Free Software Foundation, Inc., *
* 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. *
* For the text or an alternative of this public license, you may reach us *
* ComPiere, Inc., 2620 Augustine Dr. #245, Santa Clara, CA 95054, USA *
* or via info@compiere.org or http://www.compiere.org/license.html *
*****************************************************************************/
package org.compiere.jsf;
import javax.faces.context.FacesContext;
import javax.faces.el.VariableResolver;
import org.compiere.util.CLogger;
/**
* this class exists only to signal that this is a custom lookup
*/
public class DynamicActionListenerVariableResolver extends VariableResolver
{
private static final String LOOKUP_VAR="actionListener_lookup";
private static final CLogger log=CLogger.getCLogger(DynamicActionListenerVariableResolver.class);
private VariableResolver originalResolver;
public DynamicActionListenerVariableResolver(VariableResolver variableResolver)
{
originalResolver=variableResolver;
}
public Object resolveVariable(FacesContext facescontext, String s)
{
//log.info("resolving var "+s);
if(s.equals(LOOKUP_VAR))
{
//log.info("matched a dynamic lookup for "+LOOKUP_VAR);
return new DynamicActionListenerLookup(facescontext);
}
//log.info("failed to match");
return originalResolver.resolveVariable(facescontext,s);
}
}

View File

@ -1,333 +0,0 @@
/******************************************************************************
* Product: Adempiere ERP & CRM Smart Business Solution *
* Copyright (C) 1999-2006 ComPiere, Inc. All Rights Reserved. *
* This program is free software; you can redistribute it and/or modify it *
* under the terms version 2 of the GNU General Public License as published *
* by the Free Software Foundation. This program is distributed in the hope *
* that it will be useful, but WITHOUT ANY WARRANTY; without even the implied *
* warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. *
* See the GNU General Public License for more details. *
* You should have received a copy of the GNU General Public License along *
* with this program; if not, write to the Free Software Foundation, Inc., *
* 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. *
* For the text or an alternative of this public license, you may reach us *
* ComPiere, Inc., 2620 Augustine Dr. #245, Santa Clara, CA 95054, USA *
* or via info@compiere.org or http://www.compiere.org/license.html *
*****************************************************************************/
package org.compiere.jsf;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.logging.Level;
import javax.faces.context.FacesContext;
import javax.faces.el.PropertyNotFoundException;
import javax.faces.model.SelectItem;
import org.compiere.model.GridField;
import org.compiere.model.GridTab;
import org.compiere.model.GridWindow;
import org.compiere.util.CLogger;
import org.compiere.util.DB;
import org.compiere.util.Env;
import org.compiere.util.NamePair;
/**
* this class provides enough of an interface to adempiere to get values for a
* field's label, tooltip text, and value from the adempiere model
*/
public class DynamicFieldLookup
{
private final static CLogger log=CLogger.getCLogger(DynamicFieldLookup.class);
private FacesContext facesContext;
private Long tabNumber;
private String columnName;
private GridTab gridTab;
private TabStateManager tabStateManager;
// this exists so we can always call .value in el
static public class FieldProxy
{
private GridField gridField;
public FieldProxy(GridField gF)
{
gridField=gF;
}
public Object getValue()
{
return convertToValue();
}
public String getLabel()
{
//log.info("returning label "+gridField.getHeader());
if(gridField.getDisplayType()==28)
{
if (gridField.getColumnName().equals("PaymentRule"))
{
return readReference(195);
//this.setForeground(Color.blue);
//setIcon(Env.getImageIcon("Payment16.gif")); // 29*14
}
else if (gridField.getColumnName().equals("DocAction"))
{
return readReference(135);
//this.setForeground(Color.blue);
//setIcon(Env.getImageIcon("Process16.gif")); // 16*16
}
else if (gridField.getColumnName().equals("CreateFrom"))
{
//setIcon(Env.getImageIcon("Copy16.gif")); // 16*16
}
else if (gridField.getColumnName().equals("Record_ID"))
{
//setIcon(Env.getImageIcon("Zoom16.gif")); // 16*16
// FIXME: this probably does something that needs to be emulated in our jsf layer
//this.setText(Msg.getMsg(Env.getCtx(), "ZoomDocument"));
}
else if (gridField.getColumnName().equals("Posted"))
{
return readReference(234);
//this.setForeground(Color.magenta);
//setIcon(Env.getImageIcon("InfoAccount16.gif")); // 16*16
}
}
return gridField.getHeader();
}
public String getTooltip()
{
return gridField.getDescription();
}
// arg may need to be an Object to handle all cases
public void setValue(Object o)
{
String s=o.toString();
// some values may not be writable, should catch it in DynamicFieldPropertyResolver.isReadOnly
if(s.equals("true"))
s="Y";
else if(s.equals("false"))
s="N";
// TODO: this really probably belongs somewhere else
String ret=gridField.setValueValidate(s,true);
if(ret!=null)
throw new PropertyNotFoundException(ret);
//log.info("got back from setValueValidate (null is success) "+ret);
}
// this is for conversion in jsf
public Class getType()
{
// TODO: there probably need to be other types here (Date in the future, for one)
if(gridField.getDisplayType()==20)
return java.lang.Boolean.class;
return java.lang.String.class;
}
private Object convertToValue()
{
int displayType=gridField.getDisplayType();
//log.info("got display type "+displayType);
// TODO: this only has like... 3 or 4 unique cases, refactor for
// reuse
// check display type to genereate jsf code for each specific
// component
switch (displayType)
{
case 10:
case 11:
case 12:
case 13:
case 14:
case 22:
case 29:
case 33:
case 34:
case 35:
case 36:
case 37:
// text box
// check if same line. make sure that it isn't the first field.
// It is possible that the first field can have same line checked and that would cause
// formatting issues.
log.info("getValue1 "+gridField.getValue());
log.info("getValue2 "+gridField.getValue());
return gridField.getValue();
case 15:
// may want to convert this to a java.util.Date, same for case 16
// date. have to chop timestamp off of gridField value
String dateString="";
if(gridField.getValue()!=null)
{
String[] dateArray=gridField.getValue().toString().split(" ");
dateString=dateArray[0];
return dateString;
}
case 16:
// probably unused so far
// date + time
// check if same line. make sure that it isn't the first field.
// It is possible that the first field can have same line checked and that
// would cause formatting issues.
return gridField.getValue();
case 17:
case 18:
case 19:
// check if same line. make sure that it isn't the first field.
// It is possible that the first field can have same line checked and that would cause
// formatting issues.
ArrayList tmp=gridField.getLookup().getData(true, true, true, true);
ArrayList<NamePair> valueNamePairList=tmp;
ArrayList<SelectItem> selectItems=new ArrayList<SelectItem>();
for(int i=0; i<valueNamePairList.size(); i++)
selectItems.add(new SelectItem(valueNamePairList.get(i).getID(),valueNamePairList.get(i).getName()));
return selectItems;
case 20:
// Check box
// check if same line. make sure that it isn't the first field.
// It is possible that the first field can have same line checked and that would cause
// formatting issues.
return gridField.getValue();
case 21:
// Address
// check if same line. make sure that it isn't the first field.
// It
// is possible that the
// first field can have same line checked and that would cause
// formatting issues.
return gridField.getValue();
case 23:
case 24:
case 25:
case 27:
// these last are unimplemented and tricky at best
case 28:
// custom component
// break;
case 30:
// search
// break;
case 31:
// locator
// break;
case 32:
// image
// break;
default:
log.warning("Display Type not handled for "+gridField.getColumnName()+": "
+gridField.getDisplayType());
return "";
}
}
// stolen from adempiere, this should eventually be abstracted from this layer
private String readReference( int AD_Reference_ID)
{
//m_values = new HashMap<String,String>();
String SQL;
if (Env.isBaseLanguage(Env.getCtx(), "AD_Ref_List"))
SQL = "SELECT Name FROM AD_Ref_List WHERE AD_Reference_ID=?";
else
SQL = "SELECT t.Name FROM AD_Ref_List l, AD_Ref_List_Trl t "
+ "WHERE l.AD_Ref_List_ID=t.AD_Ref_List_ID"
+ " AND t.AD_Language='" + Env.getAD_Language(Env.getCtx()) + "'"
+ " AND l.AD_Reference_ID=?";
try
{
PreparedStatement pstmt = DB.prepareStatement(SQL, null);
pstmt.setInt(1, AD_Reference_ID);
ResultSet rs = pstmt.executeQuery();
rs.next();
String name = rs.getString(1);
rs.close();
pstmt.close();
return name;
}
catch (SQLException e)
{
log.log(Level.SEVERE, SQL, e);
}
return "ERROR";
} // readReference
} // end FieldProxy
public DynamicFieldLookup(FacesContext ctx)
{
facesContext=ctx;
tabStateManager=new TabStateManager(facesContext);
}
public FieldProxy getProxy()
{
return new FieldProxy(gridTab.getField(columnName));
}
/**
* sets the GridTab for this field
* @param l
*/
public void setTabNumber(Long l)
{
//log.info("setting tab number");
tabNumber=l;
// window # is available as a hidden field named windowNo
// GridWindows are stored in a session Map called grid
HashMap<Integer,GridWindow> grids=(HashMap<Integer,GridWindow>)facesContext.getExternalContext().getSessionMap().get("grids");
//log.info("grids is "+grids+" getting windowNo "+tabStateManager.getUIState().getWindowNo());
GridWindow gridWindow=grids.get(new Integer(tabStateManager.getUIState().getWindowNo()));
//log.info("gridWindow is "+gridWindow);
gridTab=gridWindow.getTab((int)tabNumber.longValue());
//log.info("gridTab open status "+gridTab.isOpen());
}
/**
*
*/
public void setColumnName(String s)
{
// error checking for testing in development, all of this but the final assignment can be commented out in release
boolean b=false;
GridField[] gridFields=gridTab.getFields();
for(int i=0;i<gridFields.length;i++)
if(gridFields[i].getColumnName().equals(s))
b=true;
if(!b)
throw new PropertyNotFoundException("could not find column name: "+s+" on tab "+tabNumber+". Check your el");
columnName=s;
}
String getColumnName()
{
return columnName;
}
/**
* @return a list that can be iterated through in a jsf looping construct
*/
public List<List<FieldProxy> > getProxies()
{
GridField[] gridFields=gridTab.getFields();
ArrayList<FieldProxy> fieldProxies=new ArrayList<FieldProxy>();
log.info("got "+gridFields.length+" fields");
for (int i=0;i<gridFields.length;i++)
fieldProxies.add(new FieldProxy(gridFields[i]));
List<List<FieldProxy> > tmp=new ArrayList<List<FieldProxy> >();
tmp.add(fieldProxies);
return tmp;
}
}

View File

@ -1,172 +0,0 @@
/******************************************************************************
* Product: Adempiere ERP & CRM Smart Business Solution *
* Copyright (C) 1999-2006 ComPiere, Inc. All Rights Reserved. *
* This program is free software; you can redistribute it and/or modify it *
* under the terms version 2 of the GNU General Public License as published *
* by the Free Software Foundation. This program is distributed in the hope *
* that it will be useful, but WITHOUT ANY WARRANTY; without even the implied *
* warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. *
* See the GNU General Public License for more details. *
* You should have received a copy of the GNU General Public License along *
* with this program; if not, write to the Free Software Foundation, Inc., *
* 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. *
* For the text or an alternative of this public license, you may reach us *
* ComPiere, Inc., 2620 Augustine Dr. #245, Santa Clara, CA 95054, USA *
* or via info@compiere.org or http://www.compiere.org/license.html *
*****************************************************************************/
package org.compiere.jsf;
import javax.faces.el.PropertyNotFoundException;
import javax.faces.el.PropertyResolver;
import org.compiere.util.CLogger;
/**
* this class continues the el lookup initiated by DynamicFieldVariableResolver,
* resolving the value to the proper name
*
* TODO: this should deduce the tab number from the hidden field id = "tabNo"
*/
public class DynamicFieldPropertyResolver extends PropertyResolver
{
// yes these should probably be an enum
public static final String DYNAMIC_VALUE_TOKEN="value";
public static final String DYNAMIC_LABEL_TOKEN="label";
public static final String DYNAMIC_TOOLTIP_TOKEN="tooltip";
public static final String DYNAMIC_COLLECTION_TOKEN="fields";
// less related to the others, these are more application state than 1:1 with adempiere model
//public static final String DYNAMIC_TAB_TOKEN="tabNo";
//public static final String DYNAMIC_GRID_TOKEN="gridView";
private final static CLogger log=CLogger.getCLogger(DynamicFieldPropertyResolver.class);
private PropertyResolver originalResolver;
public DynamicFieldPropertyResolver(PropertyResolver propertyResolver)
{
originalResolver = propertyResolver;
}
public Object getValue(Object o1,Object o2) throws PropertyNotFoundException
{
//log.info("entered getValue(Object,Object), base is type "+o1.getClass().getName()+" property is type "+o2.getClass().getName()+" value "+o2.toString());
if (o1 instanceof DynamicFieldLookup)
{
//log.info("matches dynamic lookup");
DynamicFieldLookup dynamicFieldLookup=(DynamicFieldLookup)o1;
if(o2 instanceof Long)
{
//log.info("looking up tab index "+(Long)o2);
dynamicFieldLookup.setTabNumber((Long)o2);
return dynamicFieldLookup;
}
else
{
//log.info("looking up named property "+(String)o2);
String s=(String)o2;
if(s.equals(DYNAMIC_VALUE_TOKEN))
{
Object o=dynamicFieldLookup.getProxy().getValue();
return o;
}
else if(s.equals(DYNAMIC_LABEL_TOKEN))
return dynamicFieldLookup.getProxy().getLabel();
else if(s.equals(DYNAMIC_TOOLTIP_TOKEN))
return dynamicFieldLookup.getProxy().getTooltip();
else if(s.equals(DYNAMIC_COLLECTION_TOKEN))
return dynamicFieldLookup.getProxies();
//else if(s.equals(DYNAMIC_TAB_TOKEN))
// return dynamicFieldLookup.getTabNo();
//else if(s.equals(DYNAMIC_GRID_TOKEN))
// return dynamicFieldLookup.getGridView();
else
{
dynamicFieldLookup.setColumnName(s);
return dynamicFieldLookup;
}
}
}
return originalResolver.getValue(o1,o2);
}
public Object getValue(Object obj,int i) throws PropertyNotFoundException
{
if(obj instanceof DynamicFieldLookup)
throw new PropertyNotFoundException();
return originalResolver.getValue(obj,i);
}
/**
* TODO: test this method
*/
public void setValue(Object base,Object property,Object value) throws PropertyNotFoundException
{
if(base instanceof DynamicFieldLookup)
{
//log.info("setValue called for column "+((DynamicFieldLookup)base).getColumnName()+" value type "+value.getClass().getName()+" value "+value.toString());
DynamicFieldLookup dfl=(DynamicFieldLookup)base;
String s=(String)property;
if(s.equals(DYNAMIC_VALUE_TOKEN)) // FIXME: this will probably break
{
dfl.getProxy().setValue(value.toString());
}
else // tabNo fits this case
log.info("attempted to call set on read-only field: "+((DynamicFieldLookup)base).getColumnName()+" with terminating token "+s);
}
else
{
originalResolver.setValue(base,property,value);
}
}
public void setValue(Object obj,int i,Object obj1) throws PropertyNotFoundException
{
if(obj instanceof DynamicFieldLookup)
{
//log.info("setValue with int arg called");
throw new PropertyNotFoundException();
}
else
originalResolver.setValue(obj,i,obj1);
}
// FIXME: this likely needs to be a non constant return for custom lookup (false for value lookup?)
public boolean isReadOnly(Object base,Object property) throws PropertyNotFoundException
{
//log.info("invoked isReadOnly");
if(base instanceof DynamicFieldLookup)
{
// FIXME: lookups obviously have more properties than just a name
// so we should associate them logically, java enums? or give them to different resolver classes perhaps
log.info("base id DynamicFieldLookup, property is "+property.toString());
if(property instanceof String && ( ((String)property).equals("value") || ((String)property).equals("gridView") || ((String)property).equals("tabNo") ))
return false;
else
return true;
}
return originalResolver.isReadOnly(base,property);
}
public boolean isReadOnly(Object obj,int i) throws PropertyNotFoundException
{
//log.info("");
if(obj instanceof DynamicFieldLookup)
return true;
return originalResolver.isReadOnly(obj,i);
}
public Class getType(Object base,Object property) throws PropertyNotFoundException
{
//log.info("getType called, base is of type "+base.getClass().getName()+" value "+base.toString()+" property is of type "+property.getClass().getName()+" value "+property.toString()+" and column name is "+((DynamicFieldLookup)base).getColumnName());
// FIXME: this needs to return the type (to convert to from String) of the column
//return originalResolver.getType(base,property);
//return java.lang.String.class;
return ((DynamicFieldLookup)base).getProxy().getType();
}
public Class getType(Object obj,int i) throws PropertyNotFoundException
{
if(obj instanceof DynamicFieldLookup)
throw new PropertyNotFoundException();
return originalResolver.getType(obj,i);
}
}

View File

@ -1,51 +0,0 @@
/******************************************************************************
* Product: Adempiere ERP & CRM Smart Business Solution *
* Copyright (C) 1999-2006 ComPiere, Inc. All Rights Reserved. *
* This program is free software; you can redistribute it and/or modify it *
* under the terms version 2 of the GNU General Public License as published *
* by the Free Software Foundation. This program is distributed in the hope *
* that it will be useful, but WITHOUT ANY WARRANTY; without even the implied *
* warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. *
* See the GNU General Public License for more details. *
* You should have received a copy of the GNU General Public License along *
* with this program; if not, write to the Free Software Foundation, Inc., *
* 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. *
* For the text or an alternative of this public license, you may reach us *
* ComPiere, Inc., 2620 Augustine Dr. #245, Santa Clara, CA 95054, USA *
* or via info@compiere.org or http://www.compiere.org/license.html *
*****************************************************************************/
package org.compiere.jsf;
import javax.faces.context.FacesContext;
import javax.faces.el.VariableResolver;
import org.compiere.util.CLogger;
/**
* this class exists only to signal that this is a custom lookup
*/
public class DynamicFieldVariableResolver extends VariableResolver
{
private static final CLogger log=CLogger.getCLogger(DynamicFieldVariableResolver.class);
private static final String LOOKUP_VAR="tab_lookup";
private VariableResolver originalResolver;
public DynamicFieldVariableResolver(VariableResolver variableResolver)
{
originalResolver=variableResolver;
}
public Object resolveVariable(FacesContext facescontext, String s)
{
//log.info("resolving var "+s);
if(s.equals(LOOKUP_VAR))
{
//log.info("matching tab_lookup");
return new DynamicFieldLookup(facescontext);
}
//log.info("failed to match");
return originalResolver.resolveVariable(facescontext,s);
}
}

View File

@ -1,809 +0,0 @@
/******************************************************************************
* Product: Adempiere ERP & CRM Smart Business Solution *
* Copyright (C) 1999-2006 ComPiere, Inc. All Rights Reserved. *
* This program is free software; you can redistribute it and/or modify it *
* under the terms version 2 of the GNU General Public License as published *
* by the Free Software Foundation. This program is distributed in the hope *
* that it will be useful, but WITHOUT ANY WARRANTY; without even the implied *
* warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. *
* See the GNU General Public License for more details. *
* You should have received a copy of the GNU General Public License along *
* with this program; if not, write to the Free Software Foundation, Inc., *
* 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. *
* For the text or an alternative of this public license, you may reach us *
* ComPiere, Inc., 2620 Augustine Dr. #245, Santa Clara, CA 95054, USA *
* or via info@compiere.org or http://www.compiere.org/license.html *
*****************************************************************************/
package org.compiere.jsf;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.sql.Timestamp;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Properties;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;
import org.compiere.model.GridField;
import org.compiere.model.GridTab;
import org.compiere.model.GridWindow;
import org.compiere.util.CLogger;
import org.compiere.util.Env;
/**
* JSF Filter
* @author zbeatty
*
*/
public class JSFFilter
implements Filter
{
private FilterConfig filterConfig = null;
/** Logging */
private static CLogger log = CLogger.getCLogger(JSFFilter.class);
/** GridWindow timestamp */
private long gridWindowTimestamp;
/** Environment Variable */
private Properties ctx;
/** ID's and Window Nums */
private int windowId;
private int windowNo;
/** Tab count */
private int tabCount;
/** GridWindow, GridTab, GridFields */
private GridWindow gridWindow = null;
private ArrayList<GridTab> tabList;
/**
* Init
* @param config configuration
* @throws ServletException
*/
public void init(FilterConfig filterConfig) throws ServletException
{
this.filterConfig = filterConfig;
ctx = Env.getCtx();
}
/**
* Destroy
*/
public void destroy()
{
this.filterConfig = null;
}
/**
* The filter checks to see if the requested file already exists. If it doesn't exist, then it
* generates a new file for the page requested. If it does exist, it compares the timestamp
* on the file to the timestamp on the GridWindow object to make sure it is not out of date. If
* it is out of date, it generates a new file for the page requested. If it is not out of date,
* displays the existing, up to date file.
* @param ServletRequest request
* @param ServletResponse response
* @param FilterChain chain
* @throws IOException
* @throws ServletException
*/
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
throws IOException, ServletException
{
// cast request into HttpServletRequest
HttpServletRequest httpServletRequest = (HttpServletRequest) request;
HttpSession session = null;
// get session from request. Using boolean true should create a new session if session doesn't exist
try
{
session = httpServletRequest.getSession(true);
}
catch (Exception e)
{
log.warning("There was a problem getting the session from the HttpServletRequest");
}
// get windowNo and windowId out of the request
try
{
windowNo = (Integer.parseInt(httpServletRequest.getParameter("windowNo")));
windowId = (Integer.parseInt(httpServletRequest.getParameter("windowId")));
}
catch (NumberFormatException nfe)
{
log.info("There was an error getting the request parameters: " + nfe);
}
HashMap<Integer, GridWindow> grids = new HashMap<Integer, GridWindow>(); // holds HashMap(WindowNo, GridWindow)
StringBuilder generatedJSF = new StringBuilder();
// get context and path to store file
String realContextPath = session.getServletContext().getRealPath("/"); // holds servlet context path
try
{
// get "grids" out of the session to see if window exists
// note: attribute "grids" is expected to be in the session before the filter is hit.
if (session.getAttribute("grids") != null)
{
grids = (HashMap<Integer, GridWindow>)session.getAttribute("grids");
}
// see if requested windowNo is in session
if (grids.isEmpty() || (! grids.containsKey(windowId)))
{
gridWindow = GridWindow.get(ctx, windowNo, windowId);
}
else
{
gridWindow = grids.get(windowNo);
}
String jsfFile = realContextPath + "window/" + formatNameWithFirstLowerCase(gridWindow.getName()) + ".jsp";
File file = new File(jsfFile);
// check if file exists and up to date
if (file.exists())
{
gridWindowTimestamp = getGridWindowTimeStamp();
if (gridWindowTimestamp > file.lastModified())
{
generateJSFPage(generatedJSF, realContextPath);
saveFile(file, generatedJSF.toString());
}
}
else
{
generateJSFPage(generatedJSF, realContextPath);
saveFile(file, generatedJSF.toString());
}
}
catch (NullPointerException npe)
{
log.info("Null pointer occured getting \"grids\" out of session: " + npe);
}
// load session attribute
grids.put(windowNo, gridWindow);
session.setAttribute("grids", grids);
// next filter
chain.doFilter(request, response);
}
// creates the window, tabs, and fields for the requested window
private void generateJSFPage(StringBuilder jsfString, String realContextPath)
{
// There is a backing bean called menuBean that we will use for the menus of all windows
// TODO change titles to title="#{tab_lookup[tabNo].fieldColumnName.tooltip}"
jsfString.append(createAdempiereHeader());
jsfString.append(createHeader());
jsfString.append("<f:view>\n<f:verbatim><html></f:verbatim>\n<f:verbatim><head></f:verbatim>\n<f:verbatim><title>" + gridWindow.getName()
+ "</title></f:verbatim>\n<f:verbatim><script type=\"text/javascript\" src=\"/javaScript/aa.js\"></script></f:verbatim>\n"
+ "<t:stylesheet path=\"/css/iconToolbar.css\" />\n<t:stylesheet path=\"/css/wideTable.css\" />\n<t:stylesheet path=\"/css/tab.css\" />\n"
+ "<t:stylesheet path=\"/css/misc.css\" />\n<f:verbatim></head></f:verbatim>\n<f:verbatim><body class=\"mainDocumentStyle\"></f:verbatim>\n"
// jsf Messages
+ "<t:messages showDetail=\"true\" />"
+ "<t:jscookMenu layout=\"hbr\" theme=\"ThemeAdempiere\" javascriptLocation=\"/js\" styleLocation=\"/css\" imageLocation=\"/images\">\n"
+ "<t:navigationMenuItems value=\"#{menuBean.menu}\" />\n</t:jscookMenu>\n<h:form id=\"toolbarForm\">\n<f:verbatim><table><tr><td></f:verbatim>\n"
+ "<t:panelGroup id=\"toolbar\">\n"
// toolbar (Maybe extract to method)
+ "<t:commandButton image=\"/images/Ignore24.gif\" styleClass=\"iconButtonStyle\" title=\"Undo Changes\" "
+ "actionListener=\"#{actionListener_lookup.undo}\" />\n"
+ "<f:verbatim> &nbsp;</f:verbatim>\n<t:panelGroup>\n"
+ "<t:commandButton image=\"/images/Help24.gif\" styleClass=\"iconButtonStyle\" title=\"Help\" "
+ "actionListener=\"#{actionListener_lookup.help}\" />\n"
+ "<t:commandButton image=\"/images/New24.gif\" styleClass=\"iconButtonStyle\" title=\"New Record\" "
+ "actionListener=\"#{actionListener_lookup.createNew}\" />\n"
+ "<t:commandButton image=\"/images/Delete24.gif\" styleClass=\"iconButtonStyle\" title=\"Delete Record\" "
+ "actionListener=\"#{actionListener_lookup.delete}\" />\n"
+ "<t:commandButton image=\"/images/Save24.gif\" styleClass=\"iconButtonStyle\" title=\"Save Changes\" "
+ "actionListener=\"#{actionListener_lookup.save}\" />\n"
+ "</t:panelGroup>\n<f:verbatim> &nbsp;</f:verbatim>\n<t:panelGroup>\n"
+ "<t:commandButton image=\"/images/Refresh24.gif\" styleClass=\"iconButtonStyle\" title=\"Requery\" "
+ "actionListener=\"#{actionListener_lookup.refresh}\" />\n"
+ "<t:commandButton image=\"/images/Find24.gif\" styleClass=\"iconButtonStyle\" title=\"Look Up Record\" "
+ "actionListener=\"#{actionListener_lookup.lookup}\" />\n"
+ "<t:commandButton image=\"/images/Attachment24.gif\" styleClass=\"iconButtonStyle\" title=\"Attachment\" "
+ "actionListener=\"#{actionListener_lookup.attachment}\" />\n"
+ "<t:commandButton image=\"/images/Multi24.gif\" styleClass=\"iconButtonStyle\" title=\"Grid Toggle\" "
+ "actionListener=\"#{uiStateBean.toggleGridView}\" rendered=\"#{!(uiStateBean.gridView)}\" /> \n"
+ "<t:commandButton image=\"/images/MultiX24.gif\" styleClass=\"iconButtonStyle\" title=\"Grid Toggle\" "
+ "actionListener=\"#{uiStateBean.toggleGridView}\" rendered=\"#{uiStateBean.gridView}\" />\n"
+ "</t:panelGroup>\n<f:verbatim> &nbsp;</f:verbatim>\n<t:panelGroup>\n"
+ "<t:commandButton image=\"/images/History24.gif\" styleClass=\"iconButtonStyle\" title=\"History Records\" "
+ "actionListener=\"#{actionListener_lookup.history}\" />\n"
+ "<t:commandButton image=\"/images/Home24.gif\" styleClass=\"iconButtonStyle\" title=\"Menu\" "
+ "actionListener=\"#{actionListener_lookup.menu}\" />\n"
+ "<t:commandButton image=\"/images/Parent24.gif\" styleClass=\"iconButtonStyle\" title=\"Parent Record\" "
+ "actionListener=\"#{actionListener_lookup.parent}\" />\n"
+ "<t:commandButton image=\"/images/Detail24.gif\" styleClass=\"iconButtonStyle\" title=\"Detail Record\" "
+ "actionListener=\"#{actionListener_lookup.detail}\" />\n"
+ "</t:panelGroup>\n<f:verbatim> &nbsp;</f:verbatim>\n<t:panelGroup>\n"
+ "<t:commandButton image=\"/images/First24.gif\" styleClass=\"iconButtonStyle\" title=\"First Record\" "
+ "actionListener=\"#{actionListener_lookup.first}\" />\n"
+ "<t:commandButton image=\"/images/Previous24.gif\" styleClass=\"iconButtonStyle\" title=\"Previous Record\" "
+ "actionListener=\"#{actionListener_lookup.previous}\" />\n"
+ "<t:commandButton image=\"/images/Next24.gif\" styleClass=\"iconButtonStyle\" title=\"Next Record\" "
+ "actionListener=\"#{actionListener_lookup.next}\" />\n"
+ "<t:commandButton image=\"/images/Last24.gif\" styleClass=\"iconButtonStyle\" title=\"Last Record\" "
+ "actionListener=\"#{actionListener_lookup.last}\" />\n"
+ "</t:panelGroup>\n<f:verbatim> &nbsp;</f:verbatim>\n<t:panelGroup>\n"
+ "<t:commandButton image=\"/images/Report24.gif\" styleClass=\"iconButtonStyle\" title=\"Report\" "
+ "actionListener=\"#{actionListener_lookup.report}\" />\n"
+ "<t:commandButton image=\"/images/Archive24.gif\" styleClass=\"iconButtonStyle\" title=\"Archived Documents/Reports\" "
+ "actionListener=\"#{actionListener_lookup.archived}\" />\n"
+ "<t:commandButton image=\"/images/Print24.gif\" styleClass=\"iconButtonStyle\" title=\"Print\" "
+ "actionListener=\"#{actionListener_lookup.print}\" />\n"
+ "</t:panelGroup>\n<f:verbatim> &nbsp;</f:verbatim>\n<t:panelGroup>\n"
+ "<t:commandButton image=\"/images/ZoomAcross24.gif\" styleClass=\"iconButtonStyle\" title=\"Zoom Across (Where Used)\" "
+ "actionListener=\"#{actionListener_lookup.zoom}\" />\n"
+ "<t:commandButton image=\"/images/WorkFlow24.gif\" styleClass=\"iconButtonStyle\" title=\"Active Workflows\" "
+ "actionListener=\"#{actionListener_lookup.active}\" />\n"
+ "<t:commandButton image=\"/images/Request24.gif\" styleClass=\"iconButtonStyle\" title=\"Check Requests\" "
+ "actionListener=\"#{actionListener_lookup.check}\" />\n"
+ "<t:commandButton image=\"/images/Product24.gif\" styleClass=\"iconButtonStyle\" title=\"Product Info\" "
+ "actionListener=\"#{actionListener_lookup.product}\" />\n"
+ "</t:panelGroup><f:verbatim> &nbsp;</f:verbatim>\n"
+ "<t:commandButton image=\"/images/End24.gif\" styleClass=\"iconButtonStyle\" title=\"Exit Window\" "
+ "actionListener=\"#{actionListener_lookup.exit}\" />\n"
+ "</t:panelGroup>\n"
+ "<f:verbatim></td></tr></table></f:verbatim>\n"
// hidden field to store window number
+ "<t:inputHidden id=\"windowNo\" value=\"#{uiStateBean.windowNo}\" forceId=\"true\" />\n"
+ "<t:saveState value=\"uiStateBean\" />\n"
+ "<f:verbatim><table></f:verbatim>\n<f:verbatim><tr></f:verbatim>\n"
+ "<f:verbatim><td valign=\"top\"></f:verbatim>\n<f:verbatim><table></f:verbatim>\n");
// generate tabs
jsfString.append(generateTabInfo());
// end generate tabs
jsfString.append("<f:verbatim></table></f:verbatim>\n<f:verbatim></td></f:verbatim>\n<f:verbatim><td></f:verbatim>\n"
+ "<t:panelStack selectedPanel=\"#{uiStateBean.tabState}\">\n");
// generate jsp pages for tabs. Each tab has a detail page and a table page
createDetailPage(realContextPath);
createTablePage(realContextPath);
int orderSubCount = 1; // used to increment orderSub count
for (int i = 0; i < tabCount; i++) {
GridTab gridTab = gridWindow.getTab(i);
String tabName = formatNameWithFirstLowerCase(gridTab.getName());
jsfString.append("<t:div id=\"tab" + gridTab.getTabNo() + "Detail\">\n<f:subview id=\"ordersub" + (orderSubCount++)
+ "\">\n<jsp:include page=\"" + (tabName + "Detail.jsp") + "\"/>\n</f:subview>\n</t:div>\n"
+ "<t:div id=\"tab" + gridTab.getTabNo() + "Table\">\n<f:subview id=\"ordersub" + (orderSubCount++)
+ "\">\n<jsp:include page=\"" + (tabName + "Table.jsp") + "\" />\n</f:subview>\n</t:div>\n");
}
jsfString.append("</t:panelStack>\n<f:verbatim></td></f:verbatim>\n<f:verbatim></tr></f:verbatim>\n<f:verbatim></table></f:verbatim>\n"
+ "</h:form>\n<f:verbatim></body></f:verbatim>\n<f:verbatim></html></f:verbatim>\n</f:view>");
}
// Generate GridTabs for JSF page
private StringBuilder generateTabInfo()
{
StringBuilder tabString = new StringBuilder();
tabCount = gridWindow.getTabCount();
for (int i = 0; i < tabCount; i++)
{
GridTab gridTab = gridWindow.getTab(i);
if (i == 0)
{
tabString.append("<f:verbatim><tr></f:verbatim>\n<f:verbatim><td><span></f:verbatim>\n<t:commandButton id=\"");
}
else
{
tabString.append("<f:verbatim><tr></f:verbatim>\n<f:verbatim><td><span class=\"childTab\"></f:verbatim>\n<t:commandButton id=\"");
}
// GridTab name formatting
String tabName = formatNameWithFirstLowerCase(gridTab.getName());
tabString.append(tabName + "TabButton\" value=\"" + gridTab.getName() + "\" styleClass=\"");
// check parent child relationship
// TODO this needs to be fixed for parent child relations
if (gridTab.getTabLevel() == 0)
{
tabString.append("baseParentTabStyle unselectedTabStyle\" rendered=\"#{!(uiStateBean.tabNo eq " + gridTab.getTabNo() + ")}\""
+ " actionListener=\"#{actionListener_lookup[" + gridTab.getTabNo() + "].focus}\" onmouseover=\"this.className='baseParentTabStyle "
+ "unselectedMouseOverTabStyle';\" onmouseout=\"this.className='baseParentTabStyle unselectedTabStyle';\" />\n"
+ "<t:commandButton id=\"" + tabName + "TabButton1\" value=\"" + gridTab.getName() + "\" styleClass=\"baseParentTabStyle "
+ "selectedTabStyle\" rendered=\"#{uiStateBean.tabNo eq " + gridTab.getTabNo() + "}\" "
+ "actionListener=\"#{actionListener_lookup[" + gridTab.getTabNo() + "].focus}\" "
+ "onmouseover=\"this.className='baseParentTabStyle selectedMouseOverTabStyle';\" onmouseout=\"this.className='baseParentTabStyle "
+ "selectedTabStyle';\" />\n");
}
else if(gridTab.getTabLevel() == 1)
{
tabString.append("baseIndentOneTabStyle unselectedTabStyle\" rendered=\"#{!(uiStateBean.tabNo eq " + gridTab.getTabNo() + ")}\""
+ " actionListener=\"#{actionListener_lookup[" + gridTab.getTabNo() + "].focus}\" onmouseover=\"this.className='baseIndentOneTabStyle "
+ "unselectedMouseOverTabStyle';\" onmouseout=\"this.className='baseIndentOneTabStyle unselectedTabStyle';\" />\n"
+ "<t:commandButton id=\"" + tabName + "TabButton1\" value=\"" + gridTab.getName() + "\" styleClass=\"baseIndentOneTabStyle "
+ "selectedTabStyle\" rendered=\"#{uiStateBean.tabNo eq " + gridTab.getTabNo() + "}\" "
+ "actionListener=\"#{actionListener_lookup[" + gridTab.getTabNo() + "].focus}\" "
+ "onmouseover=\"this.className='baseIndentOneTabStyle selectedMouseOverTabStyle';\" onmouseout=\"this.className='baseIndentOneTabStyle "
+ "selectedTabStyle';\" />\n");
}
else if(gridTab.getTabLevel() == 2)
{
tabString.append("baseIndentTwoTabStyle unselectedTabStyle\" rendered=\"#{!(uiStateBean.tabNo eq " + gridTab.getTabNo() + ")}\""
+ " actionListener=\"#{actionListener_lookup[" + gridTab.getTabNo() + "].focus}\" onmouseover=\"this.className='baseIndentTwoTabStyle "
+ "unselectedMouseOverTabStyle';\" onmouseout=\"this.className='baseIndentTwoTabStyle unselectedTabStyle';\" />\n"
+ "<t:commandButton id=\"" + tabName + "TabButton1\" value=\"" + gridTab.getName() + "\" styleClass=\"baseIndentTwoTabStyle "
+ "selectedTabStyle\" rendered=\"#{uiStateBean.tabNo eq " + gridTab.getTabNo() + "}\" "
+ "actionListener=\"#{actionListener_lookup[" + gridTab.getTabNo() + "].focus}\" "
+ "onmouseover=\"this.className='baseIndentTwoTabStyle selectedMouseOverTabStyle';\" onmouseout=\"this.className='baseIndentTwoTabStyle "
+ "selectedTabStyle';\" />\n");
}
tabString.append("<f:verbatim></span></td></f:verbatim>\n<f:verbatim></tr></f:verbatim>\n");
}
return tabString;
}
// Generate Detail jsp page
private void createDetailPage(String realContextPath)
{
File detailFile = null;
for (int i = 0; i < tabCount; i ++)
{
StringBuilder detailJSP = new StringBuilder();
detailJSP.append(createAdempiereHeader());
detailJSP.append(createHeader());
detailJSP.append("<f:verbatim><table></f:verbatim>\n");
GridTab gridTab = gridWindow.getTab(i);
String fileName = formatNameWithFirstLowerCase(gridTab.getName()) + "Detail";
String jsfFile = realContextPath + "window/" + fileName + ".jsp";
detailFile = new File(jsfFile);
gridTab.dataRefreshAll();
boolean isSolo = false; // true if not same line as previous
for (int j = 0; j < gridTab.getFieldCount(); j++)
{
GridField gridField = gridTab.getField(j);
// check if displayed
if (gridField.isDisplayed())
{
int displayType = gridField.getDisplayType();
// check display type to genereate jsf code for each specific component
switch(displayType)
{
case 10:
case 11:
case 12:
case 13:
case 14:
case 15: // this is a Date format. Comes as Date + Time and needs to be chopped in Backing Bean
case 16: // this is a Date + Time format.
case 21: // complete address comma seperated ex: street, city, state, zip
case 22:
case 29:
case 33:
case 34:
case 35:
case 36:
case 37:
// text box
// check if same line. make sure that it isn't the first field. It is possible that the
// first field can have same line checked and that would cause formatting issues.
if(gridField.isSameLine() && j != 0)
{
isSolo = false;
}
else
{
if (isSolo)
{
detailJSP.append("<f:verbatim></tr></f:verbatim>\n");
}
detailJSP.append("<f:verbatim><tr></f:verbatim>\n");
isSolo = true;
}
detailJSP.append("<f:verbatim><td class=\"rightLabel\"></f:verbatim>"
+ "<t:outputText value = \"#{tab_lookup[" + gridTab.getTabNo() + "]." + gridField.getColumnName() + ".label}\" />\n"
+ "<f:verbatim></td></f:verbatim>\n<f:verbatim><td></f:verbatim><t:inputText value=\"#{tab_lookup[" + gridTab.getTabNo()
+ "]." + gridField.getColumnName() + ".value}\" />\n<f:verbatim></td></f:verbatim>\n");
// check if same line. if yes and not first field, close table row
if (gridField.isSameLine() && j != 0)
{
detailJSP.append("<f:verbatim></tr></f:verbatim>\n");
}
break;
case 17:
case 18:
case 19:
// lookup
// check if same line. make sure that it isn't the first field. It is possible that the
// first field can have same line checked and that would cause formatting issues.
ArrayList al = gridField.getLookup().getData(true, true, true, true);
if(gridField.isSameLine() && j != 0)
{
isSolo = false;
}
else
{
if (isSolo)
{
detailJSP.append("<f:verbatim></tr></f:verbatim>\n");
}
detailJSP.append("<f:verbatim><tr></f:verbatim>\n");
isSolo = true;
}
detailJSP.append("<f:verbatim><td class=\"rightLabel\"></f:verbatim><t:outputText value=\"#{tab_lookup[" + gridTab.getTabNo() + "]."
+ gridField.getColumnName() + ".label}\" /><f:verbatim></td></f:verbatim>\n<f:verbatim><td></f:verbatim>\n"
+ "<t:selectOneMenu styleClass=\"fixedWidthDropDown\">\n<f:selectItems value=\"#{tab_lookup[" + gridTab.getTabNo() + "]."
+ gridField.getColumnName() + ".value}\" />\n</t:selectOneMenu>\n<f:verbatim></td></f:verbatim>\n");
// check if same line. if yes and not first field, close table row
if (gridField.isSameLine() && j != 0)
{
detailJSP.append("<f:verbatim></tr></f:verbatim>\n");
}
break;
case 20:
// Check box
// check if same line. make sure that it isn't the first field. It is possible that the
// first field can have same line checked and that would cause formatting issues.
if(gridField.isSameLine() && j != 0)
{
isSolo = false;
}
else
{
if (isSolo)
{
detailJSP.append("<f:verbatim></tr></f:verbatim>\n");
}
detailJSP.append("<f:verbatim><tr></f:verbatim>\n");
isSolo = true;
}
detailJSP.append("<f:verbatim><td></td><td></f:verbatim>\n"
+ "<t:selectBooleanCheckbox value=\"#{tab_lookup[" + gridTab.getTabNo() + "]." + gridField.getColumnName() + ".value}\" "
+ "title=\"#{tab_lookup[" + gridTab.getTabNo() + "]." + gridField.getColumnName() + ".label}\" />\n"
+ "<t:outputText value=\"#{tab_lookup[" + gridTab.getTabNo() + "]." + gridField.getColumnName() + ".label}\" />\n"
+ "<f:verbatim></td></f:verbatim>\n");
// check if same line. if yes and not first field, close table row
if (gridField.isSameLine() && j != 0)
{
detailJSP.append("<f:verbatim></tr></f:verbatim>\n");
}
break;
case 23:
case 24:
case 25:
case 27:
case 28:
// custom component
// check if same line. make sure that it isn't the first field. It is possible that the
// first field can have same line checked and that would cause formatting issues.
if(gridField.isSameLine() && j != 0)
{
isSolo = false;
}
else
{
if (isSolo)
{
detailJSP.append("<f:verbatim></tr></f:verbatim>\n");
}
detailJSP.append("<f:verbatim><tr></f:verbatim>\n");
isSolo = true;
}
detailJSP.append("<f:verbatim><td></td></f:verbatim><f:verbatim><td class=\"leftLabel\"></f:verbatim>"
+ "<t:commandButton "
// FIXME get toolbar tips to work
// FIXME implement Action Listener
+ "value=\"#{tab_lookup[" + gridTab.getTabNo() + "]." + gridField.getColumnName() + ".label}\" />\n"
+ " \n<f:verbatim></td></f:verbatim>\n");
// check if same line. if yes and not first field, close table row
if (gridField.isSameLine() && j != 0)
{
detailJSP.append("<f:verbatim></tr></f:verbatim>\n");
}
break;
case 30:
// search
// check if same line. make sure that it isn't the first field. It is possible that the
// first field can have same line checked and that would cause formatting issues.
if(gridField.isSameLine() && j != 0)
{
isSolo = false;
}
else
{
if (isSolo)
{
detailJSP.append("<f:verbatim></tr></f:verbatim>\n");
}
detailJSP.append("<f:verbatim><tr></f:verbatim>\n");
isSolo = true;
}
detailJSP.append("<f:verbatim><td class=\"rightLabel\"></f:verbatim>"
+ "<t:outputText value = \"Search\" />\n"
+ "<f:verbatim></td></f:verbatim>\n<f:verbatim><td></f:verbatim><t:inputText value=\"Not Implemented\""
+ " />\n<f:verbatim></td></f:verbatim>\n");
// check if same line. if yes and not first field, close table row
if (gridField.isSameLine() && j != 0)
{
detailJSP.append("<f:verbatim></tr></f:verbatim>\n");
}
break;
case 31:
// locator
// check if same line. make sure that it isn't the first field. It is possible that the
// first field can have same line checked and that would cause formatting issues.
if(gridField.isSameLine() && j != 0)
{
isSolo = false;
}
else
{
if (isSolo)
{
detailJSP.append("<f:verbatim></tr></f:verbatim>\n");
}
detailJSP.append("<f:verbatim><tr></f:verbatim>\n");
isSolo = true;
}
detailJSP.append("<f:verbatim><td class=\"rightLabel\"></f:verbatim>"
+ "<t:outputText value = \"Locator\" />\n"
+ "<f:verbatim></td></f:verbatim>\n<f:verbatim><td></f:verbatim><t:inputText value=\"Not Implemented\""
+ " />\n<f:verbatim></td></f:verbatim>\n");
// check if same line. if yes and not first field, close table row
if (gridField.isSameLine() && j != 0)
{
detailJSP.append("<f:verbatim></tr></f:verbatim>\n");
}
break;
case 32:
// image
// check if same line. make sure that it isn't the first field. It is possible that the
// first field can have same line checked and that would cause formatting issues.
if(gridField.isSameLine() && j != 0)
{
isSolo = false;
}
else
{
if (isSolo)
{
detailJSP.append("<f:verbatim></tr></f:verbatim>\n");
}
detailJSP.append("<f:verbatim><tr></f:verbatim>\n");
isSolo = true;
}
detailJSP.append("<f:verbatim><td class=\"rightLabel\"></f:verbatim>"
+ "<t:outputText value = \"Image\" />\n"
+ "<f:verbatim></td></f:verbatim>\n<f:verbatim><td></f:verbatim><t:inputText value=\"Not Implemented\""
+ " />\n<f:verbatim></td></f:verbatim>\n");
// check if same line. if yes and not first field, close table row
if (gridField.isSameLine() && j != 0)
{
detailJSP.append("<f:verbatim></tr></f:verbatim>\n");
}
break;
default:
log.severe("Display Type not handled for " + gridField.getColumnName() + " with display type: " + gridField.getDisplayType());
break;
}
}
}
detailJSP.append("<f:verbatim></table></f:verbatim>");
saveFile(detailFile, detailJSP.toString());
}
}
// Generate Table jsp page
private void createTablePage(String realContextPath)
{
File tableFile = null;
for (int i = 0; i < tabCount; i ++)
{
StringBuilder tableJSP = new StringBuilder();
tableJSP.append(createAdempiereHeader());
tableJSP.append(createHeader());
GridTab gridTab = gridWindow.getTab(i);
String fileName = formatNameWithFirstLowerCase(gridTab.getName()) + "Table";
String jsfFile = realContextPath + "window/" + fileName + ".jsp";
tableFile = new File(jsfFile);
gridTab.dataRefreshAll();
// counter for subscripts
int subscriptCount = 0;
tableJSP.append("<t:dataTable var=\"dto\" value=\"#{tab_lookup[" + gridTab.getTabNo() + "].fields}\" renderedIfEmpty=\"true\" "
+ "styleClass=\"wideTableStyle\" headerClass=\"wideTableHeaderStyle\"rowStyleClass=\"wideTableRowStyle\">\n");
for (int j = 0; j < gridTab.getFieldCount(); j++)
{
GridField gridField = gridTab.getField(j);
tableJSP.append("<t:column>\n<f:facet name=\"header\"><t:outputText value=\"#{tab_lookup[" + gridTab.getTabNo() + "]." + gridField.getColumnName()
+ ".label}\" /></f:facet>\n");
// check if displayed
if (gridField.isDisplayed())
{
int displayType = gridField.getDisplayType();
// check display type to genereate jsf code for each specific component
switch(displayType)
{
case 10:
case 11:
case 12:
case 13:
case 14:
case 15: // this is a Date format. Comes as Date + Time and needs to be chopped in Backing Bean
case 16: // this is a Date + Time format.
case 21: // complete address comma seperated ex: street, city, state, zip
case 22:
case 29:
case 33:
case 34:
case 35:
case 36:
case 37:
// text box
tableJSP.append("<t:inputText value=\"#{dto[" + (subscriptCount++) + "].value}\" />\n");
break;
case 17:
case 18:
case 19:
// lookup
tableJSP.append("<t:selectOneMenu styleClass=\"rightLabel\">\n<f:selectItems value=\"#{dto[" + (subscriptCount++)
+ "].value}\" />\n</t:selectOneMenu>\n");
break;
case 20:
// check box
tableJSP.append("<t:selectBooleanCheckbox value=\"#{dto[" + (subscriptCount++) + "].value}\" />\n");
break;
case 23:
case 24:
case 25:
case 27:
case 28:
// custom component
tableJSP.append("<t:commandButton value=\"#{dto[" + (subscriptCount++) + "].value}\" />\n");
break;
case 30:
// search
tableJSP.append("<t:inputText value=\"Not Implemented\" />\n");
subscriptCount++;
break;
case 31:
// locator
tableJSP.append("<t:inputText value=\"Not Implemented\" />\n");
subscriptCount++;
break;
case 32:
// image
tableJSP.append("<t:inputText value=\"Not Implemented\" />\n");
subscriptCount++;
break;
default:
log.severe("Display Type not handled for " + gridField.getColumnName() + " with display type: " + gridField.getDisplayType());
subscriptCount++;
break;
}
}
tableJSP.append("</t:column>\n");
}
tableJSP.append("</t:dataTable>");
saveFile(tableFile, tableJSP.toString());
}
}
// Save GridWindow jsf test file
private void saveFile(File file, String generatedJSF)
{
try
{
FileWriter out = new FileWriter(file);
out.write(generatedJSF);
out.flush();
out.close();
}
catch (IOException ioe)
{
log.severe("Error " + ioe.toString() + " occurred in saveGridWindow");
}
}
// format name of file or tab
private String formatNameWithFirstLowerCase(String name)
{
String[] tempNameArray = name.split(" ");
for (int i = 0; i < tempNameArray.length; i++)
{
if (i == 0)
{
name = tempNameArray[i].toLowerCase();
}
else
{
name += tempNameArray[i];
}
}
return name;
}
// adempiere header
private StringBuilder createAdempiereHeader(){
StringBuilder adempiereHeader = new StringBuilder();
adempiereHeader.append("<%--/*************************************************************\n"
+ " **********\n"
+ " *******\n"
+ " * Product: Adempiere ERP & CRM Smart Business Solution\n"
+ " * Copyright (C) 1999-2006 ComPiere, Inc. All Rights Reserved.\n"
+ " * This program is free software; you can redistribute it and/or modify it\n"
+ " * under the terms version 2 of the GNU General Public License as published\n"
+ " * by the Free Software Foundation. This program is distributed in the hope\n"
+ " * that it will be useful, but WITHOUT ANY WARRANTY; without even the implied\n"
+ " * warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n"
+ " * See the GNU General Public License for more details.\n"
+ " * You should have received a copy of the GNU General Public License along\n"
+ " * with this program; if not, write to the Free Software Foundation, Inc.,\n"
+ " * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.\n"
+ " * You may reach us at: ComPiere, Inc. - http://www.adempiere.org/license.html\n"
+ " * 2620 Augustine Dr. #245, Santa Clara, CA 95054, USA or info@adempiere.org\n"
+ " **************************************************************\n"
+ " **********\n"
+ " *****/--%>\n");
return adempiereHeader;
}
// page header
private StringBuilder createHeader()
{
StringBuilder headerString = new StringBuilder();
headerString.append("<%@page contentType=\"text/html\"%>\n<%@page pageEncoding=\"UTF-8\"%>\n"
+ "<%@ taglib uri=\"http://java.sun.com/jsf/core\" prefix=\"f\"%>\n"
+ "<%@ taglib uri=\"http://java.sun.com/jsf/html\" prefix=\"h\"%>\n"
+ "<%@ taglib uri=\"http://myfaces.apache.org/tomahawk\" prefix=\"t\"%>\n");
return headerString;
}
// Get GridWindow TimeStamp
private long getGridWindowTimeStamp()
{
Timestamp timeStamp = gridWindow.getModelUpdated(true);
if(timeStamp.equals(null))
{
log.severe("Could not get GridWindow TimeStamp");
}
return timeStamp.getTime();
}
}

View File

@ -1,51 +0,0 @@
/******************************************************************************
* Product: Adempiere ERP & CRM Smart Business Solution *
* Copyright (C) 1999-2006 ComPiere, Inc. All Rights Reserved. *
* This program is free software; you can redistribute it and/or modify it *
* under the terms version 2 of the GNU General Public License as published *
* by the Free Software Foundation. This program is distributed in the hope *
* that it will be useful, but WITHOUT ANY WARRANTY; without even the implied *
* warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. *
* See the GNU General Public License for more details. *
* You should have received a copy of the GNU General Public License along *
* with this program; if not, write to the Free Software Foundation, Inc., *
* 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. *
* For the text or an alternative of this public license, you may reach us *
* ComPiere, Inc., 2620 Augustine Dr. #245, Santa Clara, CA 95054, USA *
* or via info@compiere.org or http://www.compiere.org/license.html *
*****************************************************************************/
package org.compiere.jsf;
import javax.servlet.ServletException;
import javax.servlet.UnavailableException;
import javax.servlet.http.HttpServlet;
import org.apache.log4j.xml.DOMConfigurator;
/**
* manually initializes the log4j system independent of adempiere's main logging;
* enables jsf components and other existing code to use log4j for their output.
* this should not be considered anything near a permanent solution, unless there is
* no better way to integrate the two logging systems
* init param, "log4j-init-file"; make sure to put an xml descriptor file somewhere this can see it
* @author rfreden
*/
public class Log4JInitServlet extends HttpServlet
{
private static final long serialVersionUID = 2294612125299399465L;
/**
* loads the log4j.xml logging descriptor
* @todo load the init file as a resource, also handle alternate configuration (properties file)
*/
public void init() throws ServletException
{
super.init();
String path=getServletContext().getRealPath("/");
String fn=getInitParameter("log4j-init-file");
if(fn!=null)
DOMConfigurator.configure(path+fn);
else
throw new UnavailableException("could not find log4j xml descriptor, make sure it exists and is specified in web.xml");
}
}

View File

@ -1,134 +0,0 @@
/******************************************************************************
* Product: Adempiere ERP & CRM Smart Business Solution *
* Copyright (C) 1999-2006 ComPiere, Inc. All Rights Reserved. *
* This program is free software; you can redistribute it and/or modify it *
* under the terms version 2 of the GNU General Public License as published *
* by the Free Software Foundation. This program is distributed in the hope *
* that it will be useful, but WITHOUT ANY WARRANTY; without even the implied *
* warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. *
* See the GNU General Public License for more details. *
* You should have received a copy of the GNU General Public License along *
* with this program; if not, write to the Free Software Foundation, Inc., *
* 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. *
* For the text or an alternative of this public license, you may reach us *
* ComPiere, Inc., 2620 Augustine Dr. #245, Santa Clara, CA 95054, USA *
* or via info@compiere.org or http://www.compiere.org/license.html *
*****************************************************************************/
package org.compiere.jsf;
import java.util.ArrayList;
import java.util.List;
import org.apache.myfaces.custom.navmenu.NavigationMenuItem;
import org.apache.log4j.Logger;
/**
* provides a model of the main menu bar
*
* @author rfreden
*/
public class MenuBean
{
private static final Logger log=Logger.getLogger(MenuBean.class);
private List<NavigationMenuItem> menu;
// label, icon, action
// all three null for menu break
// first element is the submenu title
private static final String[][] fileMenu= { { "File", null, null },
{ "Print Screen", "/images/PrintScreen16.gif", null },
{ "Screen Shot", "/images/ScreenShot16.gif", null },
{ "Report", "/images/Report16.gif", null }, { "Print", "/images/Print16.gif", null },
{ null, null, null }, { "End", "/images/End16.gif", null },
{ "Exit", "/images/Exit16.gif", null } };
private static final String[][] editMenu= { { "Edit", null, null },
{ "New Record", "/images/New16.gif", null }, { "Save", "/images/Save16.gif", null },
{ null, null, null }, { "Copy Record", "/images/Copy16.gif", null },
{ "Delete Record", "/images/Delete16.gif", null },
{ "Undo Changes", "/images/Undo16.gif", null },
{ "Requery", "/images/Refresh16.gif", null }, { null, null, null },
{ "Look Up Record", "/images/Find16.gif", null } };
private static final String[][] viewMenu= { { "View", null, null },
{ "Product Info", "/images/Product16.gif", null },
{ "Business Partner Info", "/images/BPartner16.gif", null },
{ "Account Info", "/images/InfoAccount16.gif", null },
{ "Schedule Info", "/images/InfoSchedule16.gif", null }, { null, null, null },
{ "Order Info", "/images/Info16.gif", null },
{ "Invoice Info", "/images/Info16.gif", null },
{ "Shipment Info", "/images/Info16.gif", null },
{ "Payment Info", "/images/Info16.gif", null },
{ "Cash Journal Info", "/images/Info16.gif", null },
{ "Resource Info", "/images/Info16.gif", null },
{ "Asset Info", "/images/Info16.gif", null }, { null, null, null },
{ "Attachment", "/images/Attachment16.gif", null },
{ "History Records", "/images/History16.gif", null }, { null, null, null },
{ "Grid Toggle", "/images/Multi16.gif", null } };
private static final String[][] goMenu= { { "Go", null, null },
{ "First Record", "/images/First16.gif", null },
{ "Previous Record", "/images/Previous16.gif", null },
{ "Next Record", "/images/Next16.gif", null },
{ "Last Record", "/images/Last16.gif", null }, { null, null, null },
{ "Parent Record", "/images/Parent16.gif", null },
{ "Detail Record", "/images/Detail16.gif", null }, { null, null, null },
{ "Zoom Across (Where Used)", "/images/ZoomAcross16.gif", null },
{ "Check Requests", "/images/Request16.gif", null },
{ "Archived Documents/Reports", "/images/Archive16.gif", null },
{ "Menu", "/images/Home16.gif", null } };
private static final String[][] toolsMenu= { { "Tools", null, null },
{ "Calculator", "/images/Calculator16.gif", null },
{ "Calendar", "/images/Calendar16.gif", null },
{ "Editor", "/images/Editor16.gif", null }, { "Script", "/images/Script16.gif", null },
{ "Active Workflows", "/images/WorkFlow16.gif", null }, { null, null, null },
{ "Preference", "/images/Preference16.gif", null } };
private static final String[][] helpMenu= { { "Help", null, null },
{ "Help", "/images/Help16.gif", null }, { "Online", "/images/Online16.gif", null },
{ "Email Support", "/images/EMailSupport16.gif", null },
{ "About", "/images/About16.gif", null } };
/** Creates a new instance of MenuBean */
public MenuBean()
{
menu=new ArrayList<NavigationMenuItem>();
menu.add(getNavigationItemListFromArray(fileMenu));
menu.add(getNavigationItemListFromArray(editMenu));
menu.add(getNavigationItemListFromArray(viewMenu));
menu.add(getNavigationItemListFromArray(goMenu));
menu.add(getNavigationItemListFromArray(toolsMenu));
menu.add(getNavigationItemListFromArray(helpMenu));
}
public List<NavigationMenuItem> getMenu()
{
return menu;
}
private NavigationMenuItem getNavigationItemListFromArray(String[][] sa)
{
NavigationMenuItem root=new NavigationMenuItem(sa[0][0], sa[0][2], sa[0][1], false);
List<NavigationMenuItem> tmp=new ArrayList<NavigationMenuItem>();
for (int i=1; i<sa.length; i++)
{
if(sa[i][0]==null)
{
// menu breaks are rendered above the item to which they are
// assigned, so we skip the menu break indicator
// (null,null,null) and go on to the
// next labeled item
++i;
tmp.add(new NavigationMenuItem(sa[i][0], sa[i][2], sa[i][1], true));
}
else
{
tmp.add(new NavigationMenuItem(sa[i][0], sa[i][2], sa[i][1], false));
}
}
root.setNavigationMenuItems(tmp);
return root;
}
}

View File

@ -1,45 +0,0 @@
package org.compiere.jsf;
import java.util.HashMap;
import java.util.Map;
import javax.faces.context.FacesContext;
import org.compiere.util.CLogger;
/**
* manages the session scoped map for "tabNo", which is of type Map<Long,String>, for windowNo and tab state string <tab[0-9]+Detail|Table>
* but... this class should be the only interface to that (currently there is an el expression that looks like #{sessionScope.tabNo[windowNo]} )
* this object is _only valid for the windowNo it is instantiated from_
* the class furthermore should be the interface to windowNo, which is a request parameter
* @author rfreden
*
*/
public class TabStateManager
{
private static final CLogger log=CLogger.getCLogger(TabStateManager.class);
// the map should be a non clobberable singleton
private static Map<Long,String> tabNo;
private FacesContext facesContext;
public TabStateManager(FacesContext fc)
{
facesContext=fc;
if(tabNo==null)
{
// if it doesn't exist in the session, then instantiate it and put it there
if((tabNo=(Map<Long,String>)facesContext.getExternalContext().getSessionMap().get("tabNo"))==null)
{
tabNo=new HashMap<Long,String>();
facesContext.getExternalContext().getSessionMap().put("tabNo",tabNo);
}
}
}
public UIStateBean getUIState()
{
return (UIStateBean)facesContext.getApplication().getVariableResolver().resolveVariable(facesContext,"uiStateBean");
}
}

View File

@ -1,84 +0,0 @@
package org.compiere.jsf;
import java.io.Serializable;
import javax.faces.context.FacesContext;
import javax.faces.event.ActionEvent;
import org.compiere.util.CLogger;
/**
* holds state for a window; currently it tracks only the windowNo attribute, provided on initial load
* an instance of this class should be available for any window page, as it is persisted throughout the view existence via t:saveState
* @author rfreden
*
*/
public class UIStateBean implements Serializable
{
private static final long serialVersionUID=2930846164351L;
private static final CLogger log=CLogger.getCLogger(UIStateBean.class);
// TODO: this should be an Integer
private String windowNo;
private boolean gridView;
private int tabNo;
public UIStateBean()
{
// int and boolean default initializers put this initial state at tab0Detail
String[] s=(String[])FacesContext.getCurrentInstance().getExternalContext().getRequestParameterValuesMap().get("windowNo");
if(s!=null)
{
windowNo=s[0];
log.info("got windowNo "+windowNo);
}
}
public void setWindowNo(String w)
{
log.info("setting windowNo "+w);
windowNo=w;
}
public String getWindowNo()
{
//log.info("getting windowNo "+windowNo);
return windowNo;
}
public Boolean getGridView()
{
return gridView;
}
public void setGridView(Boolean b)
{
gridView=b;
}
public Integer getTabNo()
{
return tabNo;
}
public void setTabNo(Integer i)
{
tabNo=i;
}
public String getTabState()
{
String s="tab"+String.valueOf(tabNo)+(gridView?"Table":"Detail");
log.info("returning "+s);
return s;
}
public void toggleGridView(ActionEvent ae)
{
log.info("called");
gridView=!gridView;
}
}

View File

@ -1,35 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE faces-config PUBLIC "-//Sun Microsystems, Inc.//DTD JavaServer Faces Config 1.0//EN" "http://java.sun.com/dtd/web-facesconfig_1_0.dtd">
<faces-config>
<application>
<locale-config>
<default-locale>en_US</default-locale>
</locale-config>
<variable-resolver>org.compiere.jsf.DynamicFieldVariableResolver</variable-resolver>
<variable-resolver>org.compiere.jsf.DynamicActionListenerVariableResolver</variable-resolver>
<property-resolver>org.compiere.jsf.DynamicFieldPropertyResolver</property-resolver>
<property-resolver>org.compiere.jsf.DynamicActionListenerPropertyResolver</property-resolver>
</application>
<managed-bean>
<managed-bean-name>menuBean</managed-bean-name>
<managed-bean-class>org.compiere.jsf.MenuBean</managed-bean-class>
<managed-bean-scope>request</managed-bean-scope>
</managed-bean>
<managed-bean>
<managed-bean-name>uiStateBean</managed-bean-name>
<managed-bean-class>org.compiere.jsf.UIStateBean</managed-bean-class>
<managed-bean-scope>request</managed-bean-scope>
</managed-bean>
<managed-bean>
<managed-bean-name>treeBacker</managed-bean-name>
<managed-bean-class>org.compiere.jsf.backing.TreeBacker</managed-bean-class>
<managed-bean-scope>request</managed-bean-scope>
</managed-bean>
</faces-config>

View File

@ -1,66 +0,0 @@
<?xml version="1.0" encoding="ISO-8859-1"?>
<!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN" "http://java.sun.com/dtd/web-app_2_3.dtd">
<web-app>
<!-- FIXME: this servlet is kind of a cheap hack; it allows log4j to function from jsf components -->
<servlet>
<servlet-name>log4jInitServlet</servlet-name>
<servlet-class>org.compiere.jsf.Log4JInitServlet</servlet-class>
<init-param>
<param-name>log4j-init-file</param-name>
<param-value>WEB-INF/classes/log4j.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<!-- FIXME: this servlet is for testing only, remove it-->
<servlet>
<servlet-name>adempiereInitServlet</servlet-name>
<servlet-class>
org.compiere.jsf.AdempiereInitServlet
</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<filter>
<filter-name>jsfFilter</filter-name>
<filter-class>org.compiere.jsf.JSFFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>jsfFilter</filter-name>
<url-pattern>/window/*</url-pattern>
</filter-mapping>
<filter>
<filter-name>extensionsFilter</filter-name>
<filter-class>
org.apache.myfaces.webapp.filter.ExtensionsFilter
</filter-class>
</filter>
<filter-mapping>
<filter-name>extensionsFilter</filter-name>
<url-pattern>*.jsf</url-pattern>
</filter-mapping>
<filter-mapping>
<filter-name>extensionsFilter</filter-name>
<url-pattern>/faces/myFacesExtensionResource/*</url-pattern>
</filter-mapping>
<servlet>
<servlet-name>facesServlet</servlet-name>
<servlet-class>javax.faces.webapp.FacesServlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>facesServlet</servlet-name>
<url-pattern>/faces/*</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>facesServlet</servlet-name>
<url-pattern>*.jsf</url-pattern>
</servlet-mapping>
</web-app>

View File

@ -1,294 +0,0 @@
/* ThemeAdempiereMenu Style Sheet */
.ThemeAdempiereMenu,.ThemeAdempiereSubMenuTable
{
font-family: verdana, arial, sans-serif;
font-size: 13px;
padding: 0;
white-space: nowrap;
cursor: default;
}
.ThemeAdempiereSubMenu
{
position: absolute;
visibility: hidden;
/*
Netscape/Mozilla renders borders by increasing
their z-index. The following line is necessary
to cover any borders underneath
*/
z-index: 100;
border: 0;
padding: 0;
overflow: visible;
border: 1px solid #8C867B;
filter:progid:DXImageTransform.Microsoft.Shadow(color=#BDC3BD, Direction=135, Strength=4);
}
.ThemeAdempiereSubMenuTable
{
overflow: visible;
}
.ThemeAdempiereMainItem,.ThemeAdempiereMainItemHover,.ThemeAdempiereMainItemActive,
.ThemeAdempiereMenuItem,.ThemeAdempiereMenuItemHover,.ThemeAdempiereMenuItemActive
{
border: 0;
cursor: default;
white-space: nowrap;
}
.ThemeAdempiereMainItem
{
/*background-color: BLUE;*/
}
.ThemeAdempiereMainItemHover,.ThemeAdempiereMainItemActive
{
background-color: #C6D3EF;
}
.ThemeAdempiereMenuItem
{
background-color: WHITE;
}
.ThemeAdempiereMenuItemHover,.ThemeAdempiereMenuItemActive
{
background-color: #C6D3EF;
}
/* horizontal main menu */
.ThemeAdempiereMainItem
{
padding: 1px;
border: 0;
}
td.ThemeAdempiereMainItemHover,td.ThemeAdempiereMainItemActive
{
padding: 0px;
border: 1px solid #3169C6;
}
.ThemeAdempiereMainFolderLeft,.ThemeAdempiereMainItemLeft,
.ThemeAdempiereMainFolderText,.ThemeAdempiereMainItemText,
.ThemeAdempiereMainFolderRight,.ThemeAdempiereMainItemRight
{
background-color: inherit;
}
/* vertical main menu sub components */
td.ThemeAdempiereMainFolderLeft,td.ThemeAdempiereMainItemLeft
{
padding-top: 2px;
padding-bottom: 2px;
padding-left: 0px;
padding-right: 2px;
border-top: 1px solid #3169C6;
border-bottom: 1px solid #3169C6;
border-left: 1px solid #3169C6;
background-color: inherit;
}
td.ThemeAdempiereMainFolderText,td.ThemeAdempiereMainItemText
{
padding-top: 2px;
padding-bottom: 2px;
padding-left: 5px;
padding-right: 5px;
border-top: 1px solid #3169C6;
border-bottom: 1px solid #3169C6;
background-color: inherit;
white-space: nowrap;
}
td.ThemeAdempiereMainFolderRight,td.ThemeAdempiereMainItemRight
{
padding-top: 2px;
padding-bottom: 2px;
padding-left: 0px;
padding-right: 0px;
border-top: 1px solid #3169C6;
border-bottom: 1px solid #3169C6;
border-right: 1px solid #3169C6;
background-color: inherit;
}
tr.ThemeAdempiereMainItem td.ThemeAdempiereMainFolderLeft,
tr.ThemeAdempiereMainItem td.ThemeAdempiereMainItemLeft
{
padding-top: 3px;
padding-bottom: 3px;
padding-left: 1px;
padding-right: 2px;
white-space: nowrap;
border: 0;
background-color: inherit;
}
tr.ThemeAdempiereMainItem td.ThemeAdempiereMainFolderText,
tr.ThemeAdempiereMainItem td.ThemeAdempiereMainItemText
{
padding-top: 3px;
padding-bottom: 3px;
padding-left: 5px;
padding-right: 5px;
border: 0;
background-color: inherit;
}
tr.ThemeAdempiereMainItem td.ThemeAdempiereMainItemRight,
tr.ThemeAdempiereMainItem td.ThemeAdempiereMainFolderRight
{
padding-top: 3px;
padding-bottom: 3px;
padding-left: 0px;
padding-right: 1px;
border: 0;
background-color: inherit;
}
/* sub menu sub components */
.ThemeAdempiereMenuFolderLeft,.ThemeAdempiereMenuItemLeft
{
padding-top: 2px;
padding-bottom: 2px;
padding-left: 1px;
padding-right: 3px;
border-top: 1px solid #3169C6;
border-bottom: 1px solid #3169C6;
border-left: 1px solid #3169C6;
background-color: inherit;
white-space: nowrap;
}
.ThemeAdempiereMenuFolderText,.ThemeAdempiereMenuItemText
{
padding-top: 2px;
padding-bottom: 2px;
padding-left: 5px;
padding-right: 5px;
border-top: 1px solid #3169C6;
border-bottom: 1px solid #3169C6;
background-color: inherit;
white-space: nowrap;
}
.ThemeAdempiereMenuFolderRight,.ThemeAdempiereMenuItemRight
{
padding-top: 2px;
padding-bottom: 2px;
padding-left: 0px;
padding-right: 0px;
border-top: 1px solid #3169C6;
border-bottom: 1px solid #3169C6;
border-right: 1px solid #3169C6;
background-color: inherit;
white-space: nowrap;
}
.ThemeAdempiereMenuItem .ThemeAdempiereMenuFolderLeft,
.ThemeAdempiereMenuItem .ThemeAdempiereMenuItemLeft
{
padding-top: 3px;
padding-bottom: 3px;
padding-left: 2px;
padding-right: 3px;
white-space: nowrap;
border: 0;
/* FIXME: pick a neutral color here or sync with the background */
background-color: #cfcfcf;
}
.ThemeAdempiereMenuItem .ThemeAdempiereMenuFolderText,
.ThemeAdempiereMenuItem .ThemeAdempiereMenuItemText
{
padding-top: 3px;
padding-bottom: 3px;
padding-left: 5px;
padding-right: 5px;
border: 0;
background-color: inherit;
}
.ThemeAdempiereMenuItem .ThemeAdempiereMenuFolderRight,
.ThemeAdempiereMenuItem .ThemeAdempiereMenuItemRight
{
padding-top: 3px;
padding-bottom: 3px;
padding-left: 0px;
padding-right: 1px;
border: 0;
background-color: inherit;
}
/* menu splits */
.ThemeAdempiereMenuSplit
{
margin: 2px;
height: 1px;
overflow: hidden;
background-color: inherit;
border-top: 1px solid #C6C3BD;
}
/* image shadow animation */
/*
seq1: image for normal
seq2: image for hover and active
To use, in the icon field, input the following:
<img class="seq1" src="normal.gif" /><img class="seq2" src="hover.gif" />
*/
.ThemeAdempiereMenuItem img.seq1
{
display: inline;
}
.ThemeAdempiereMenuItemHover seq2,
.ThemeAdempiereMenuItemActive seq2
{
display: inline;
}
.ThemeAdempiereMenuItem .seq2,
.ThemeAdempiereMenuItemHover .seq1,
.ThemeAdempiereMenuItemActive .seq1
{
display: none;
}