Adempiere 3.1.2

This commit is contained in:
vpj-cd 2006-12-07 03:41:27 +00:00
parent de1f1ac1ca
commit 3845274508
12 changed files with 2368 additions and 164 deletions

View File

@ -8,158 +8,84 @@
<property environment="env"/> <property environment="env"/>
<property name="src.dir" value="${basedir}/src"/> <property name="src.dir" value="${basedir}/src"/>
<property name="src.main.dir" value="${src.dir}/main"/> <property name="src.main.dir" value="${src.dir}/main"/>
<property name="src.client.dir" value="${src.main.dir}/client"/> <property name="src.client.dir" value="${src.main.dir}/client"/>
<property name="src.ejb.dir" value="${src.main.dir}/ejb"/> <property name="src.ejb.dir" value="${src.main.dir}/ejb"/>
<property name="src.servlet.dir" value="${src.main.dir}/servlet"/> <property name="src.servlet.dir" value="${src.main.dir}/servlet"/>
<property name="src.resources.dir" value="${src.dir}/resources"/> <property name="src.resources.dir" value="${src.dir}/resources"/>
<property name="src.web.dir" value="${src.dir}/web"/> <property name="src.web.dir" value="${src.dir}/web"/>
<property name="src.etc.dir" value="${src.dir}/etc"/> <property name="src.etc.dir" value="${src.dir}/etc"/>
<property name="src.server.dir" value="${src.main.dir}/server"/> <property name="src.server.dir" value="${src.main.dir}/server"/>
<property name="src.jsf.dir" value="${src.dir}/jsf/"/> <property name="src.jsf.dir" value="${src.dir}/jsf/"/>
<property name="build.dir" value="${basedir}/build"/> <property name="build.dir" value="${basedir}/build"/>
<property name="build.tmp.dir" value="${build.dir}/tmp"/> <property name="build.tmp.dir" value="${build.dir}/tmp"/>
<property name="build.deploy.dir" value="${build.dir}/deploy"/> <property name="build.deploy.dir" value="${build.dir}/deploy"/>
<property name="build.war.dir" value="${build.dir}/war"/> <property name="build.war.dir" value="${build.dir}/war"/>
<property name="build.jsf.dir" value="${build.dir}/jsf"/> <property name="build.jsf.dir" value="${build.dir}/jsf"/>
<property name="build.jar.dir" value="${build.dir}/jar"/> <property name="build.jar.dir" value="${build.dir}/jar"/>
<property name="jsf-lib.dir" value="${src.jsf.dir}/WEB-INF/lib/"/> <property name="jsf-lib.dir" value="${src.jsf.dir}/WEB-INF/lib/"/>
<target name="serverAppsInit"> <target name="serverAppsInit">
<echo message="=========== Build Server Application"/> <echo message="=========== Build Server Application"/>
<tstamp/> <tstamp/>
</target> </target>
<path id="base.path"> <path id="base.path">
<pathelement location="../lib/Adempiere.jar" /> <pathelement location="../lib/Adempiere.jar" />
<pathelement location="../lib/CSTools.jar" /> <pathelement location="../lib/CSTools.jar" />
<pathelement location="../tools/lib/j2ee.jar" /> <pathelement location="../tools/lib/j2ee.jar" />
<pathelement location="src/web/WEB-INF/lib/myfaces-api-1.1.3.jar" />
<pathelement location="src/web/WEB-INF/lib/tomahawk-1.1.3.jar" />
<pathelement location="${build.classes.dir}" /> <pathelement location="${build.classes.dir}" />
</path> </path>
<!-- ============================================== -->
<!-- Compiles the source code for the JSF interface -->
<!-- ============================================== -->
<target name="jsfAppsCompile" depends="serverAppsInit">
<!-- Compile Web -->
<mkdir dir="${build.jsf.dir}/WEB-INF/classes"/>
<mkdir dir="${build.jsf.dir}/window/"/>
<mkdir dir="${build.jsf.dir}/images/"/>
<mkdir dir="${build.jsf.dir}/mainMenu/"/>
<path id="jsf.path">
<path refid="base.path"/>
<pathelement location="${servlet-lib.path}"/>
<!-- pathelement dir="${jsf-lib.path}"/ -->
<fileset dir="${jsf-lib.dir}" includes="**/*.jar"/>
</path>
<javac
destdir="${build.jsf.dir}/WEB-INF/classes"
debug="on"
deprecation="off"
optimize="on"
classpathref="jsf.path">
<src path="${src.jsf.dir}"/>
</javac>
<copy todir="${build.jsf.dir}/images">
<fileset dir="${src.web.dir}/images">
<include name="**/*.gif"/>
<include name="**/*.png"/>
</fileset>
</copy>
<copy todir="${build.jsf.dir}">
<fileset dir="${src.jsf.dir}">
<include name="**/images/*"/>
<include name="**/mainMenu/*"/>
<include name="**/*.gif"/>
<include name="**/*.jpg"/>
<include name="**/*.wav"/>
<include name="**/*.htm"/>
<include name="**/*.html"/>
<include name="**/*.jar" />
<include name="**/*.css" />
<include name="**/*.properties"/>
<include name="**/*.js" />
<include name="**/*.xml" />
<exclude name="**/package.html"/>
</fileset>
</copy>
</target>
<!-- =========================================== -->
<!-- Creates the jsf war archives -->
<!-- =========================================== -->
<target name="jsfAppsWar" depends="jsfAppsCompile">
<mkdir dir="${build.deploy.dir}"/>
<!-- War Web Descriptor -->
<war
warfile="${build.deploy.dir}/adempiereJSFApps.war"
webxml="${src.jsf.dir}/WEB-INF/web.xml">
<fileset dir="${build.jsf.dir}" excludes="**/web.xml"/>
<manifest>
<attribute name="Specification-Title" value="AdempiereJSFAppsWar"/>
<attribute name="Specification-Version" value="${env.ADEMPIERE_VERSION}"/>
<attribute name="Specification-Vendor" value="Adempiere"/>
<attribute name="Implementation-Title" value="AdempiereJSFAppsWar ${env.ADEMPIERE_VERSION}"/>
<attribute name="Implementation-Version" value="${env.ADEMPIERE_VERSION} ${DSTAMP}-${TSTAMP}"/>
<attribute name="Implementation-Vendor" value="${env.ADEMPIERE_VENDOR}"/>
<attribute name="Implementation-URL" value="http://www.adempiere.com"/>
<attribute name="Class-Path" value="Adempiere.jar AdempiereSLib.jar"/>
</manifest>
</war>
<unwar src="${build.deploy.dir}/adempiereJSFApps.war" dest="${build.deploy.dir}/exploded/adempiereJSFApps.war" />
</target>
<!-- =========================================== --> <!-- =========================================== -->
<!-- Compiles the source code --> <!-- Compiles the source code -->
<!-- =========================================== --> <!-- =========================================== -->
<target name="serverAppsCompile" depends="serverAppsInit"> <target name="serverAppsCompile" depends="serverAppsInit">
<!-- Compile Web --> <!-- Compile Web -->
<mkdir dir="${build.war.dir}"/> <mkdir dir="${build.war.dir}"/>
<path id="web.path"> <path id="web.path">
<path refid="base.path"/> <path refid="base.path"/>
<pathelement location="${servlet-lib.path}"/> <pathelement location="${servlet-lib.path}"/>
</path> </path>
<javac <javac
destdir="${build.war.dir}" destdir="${build.war.dir}"
debug="on" debug="on"
deprecation="off" deprecation="off"
optimize="on" optimize="on"
classpathref="web.path"> classpathref="web.path">
<src path="${src.servlet.dir}"/> <src path="${src.servlet.dir}"/>
</javac> </javac>
<copy todir="${build.war.dir}"> <copy todir="${build.war.dir}">
<fileset dir="${src.servlet.dir}"> <fileset dir="${src.servlet.dir}">
<include name="**/images/*"/> <include name="**/images/*"/>
<include name="**/*.gif"/> <include name="**/*.gif"/>
<include name="**/*.jpg"/> <include name="**/*.jpg"/>
<include name="**/*.wav"/> <include name="**/*.wav"/>
<include name="**/*.htm"/> <include name="**/*.htm"/>
<include name="**/*.html"/> <include name="**/*.html"/>
<include name="**/*.properties"/> <include name="**/*.properties"/>
<exclude name="**/package.html"/> <exclude name="**/package.html"/>
</fileset> </fileset>
</copy> </copy>
</target> </target>
<!-- =========================================== --> <!-- =========================================== -->
<!-- Creates the jar archives --> <!-- Creates the jar archives -->
<!-- =========================================== --> <!-- =========================================== -->
<target name="serverAppsJar" depends="serverAppsCompile"> <target name="serverAppsJar" depends="serverAppsCompile">
<mkdir dir="${build.jar.dir}"/> <mkdir dir="${build.jar.dir}"/>
<!-- Jar Apps Code --> <!-- Jar Apps Code -->
<jar <jar
@ -180,13 +106,13 @@
</manifest> </manifest>
</jar> </jar>
</target> </target>
<!-- =========================================== --> <!-- =========================================== -->
<!-- Creates the war archives --> <!-- Creates the war archives -->
<!-- =========================================== --> <!-- =========================================== -->
<target name="serverAppsWar" depends="serverAppsJar"> <target name="serverAppsWar" depends="serverAppsJar">
<mkdir dir="${build.deploy.dir}"/> <mkdir dir="${build.deploy.dir}"/>
<!-- War Web Descriptor --> <!-- War Web Descriptor -->
<war <war
@ -205,21 +131,21 @@
</manifest> </manifest>
</war> </war>
</target> </target>
<!-- =========================================== --> <!-- =========================================== -->
<!-- Creates the server binary --> <!-- Creates the server binary -->
<!-- =========================================== --> <!-- =========================================== -->
<target name="serverAppsDeployServer" depends="serverAppsWar"> <target name="serverAppsDeployServer" depends="serverAppsWar">
<copy todir="../lib"> <copy todir="../lib">
<fileset dir="${build.deploy.dir}" <fileset dir="${build.deploy.dir}"
includes="*.jar,*.war,*.ear"/> includes="*.jar,*.war,*.ear"/>
<fileset dir="${build.jar.dir}" <fileset dir="${build.jar.dir}"
includes="*.jar,*.war,*.ear"/> includes="*.jar,*.war,*.ear"/>
</copy> </copy>
</target> </target>
<!-- =========================================== --> <!-- =========================================== -->
<!-- Creates the binary structure --> <!-- Creates the binary structure -->
<!-- =========================================== --> <!-- =========================================== -->
<target name="main" depends="serverAppsDeployServer"> <target name="main" depends="serverAppsDeployServer">
@ -227,8 +153,8 @@
</target> </target>
<!-- =========================================== --> <!-- =========================================== -->
<!-- Cleans up the current build --> <!-- Cleans up the current build -->
<!-- =========================================== --> <!-- =========================================== -->
<target name="clean"> <target name="clean">
<delete dir="${build.dir}"/> <delete dir="${build.dir}"/>

View File

@ -0,0 +1,106 @@
/******************************************************************************
* 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 AdempiereServlet implements Servlet
{
private static final CLogger log=CLogger.getCLogger(AdempiereServlet.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";
}
public ServletConfig getServletConfig()
{
return servletConfig;
}
/**
* @todo implement this method
*/
public void destroy()
{}
}

View File

@ -0,0 +1,222 @@
/******************************************************************************
* 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 compiere
// in case it will matter, it will also have a windowNo, a unique window identifier for compiere
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

@ -0,0 +1,116 @@
/******************************************************************************
* 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

@ -0,0 +1,49 @@
/******************************************************************************
* 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

@ -0,0 +1,333 @@
/******************************************************************************
* 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 compiere to get values for a
* field's label, tooltip text, and value from the compiere 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 compiere, 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

@ -0,0 +1,172 @@
/******************************************************************************
* 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 compiere 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

@ -0,0 +1,51 @@
/******************************************************************************
* 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

@ -0,0 +1,934 @@
/*******************************************************************************
* 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.*;
import java.sql.*;
import java.util.*;
import javax.servlet.*;
import javax.servlet.http.*;
import org.compiere.model.*;
import org.compiere.util.*;
/**
* 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);
}
// holds HashMap(WindowNo, GridWindow)
HashMap<Integer, GridWindow> grids = new HashMap<Integer, GridWindow> ();
StringBuilder generatedJSF = new StringBuilder ();
// get context and path to store file
// holds servlet context path
String realContextPath = session.getServletContext ().getRealPath ("/");
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 (createCompiereHeader ());
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=\"ThemeCompiere\" 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 (createCompiereHeader ());
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 (createCompiereHeader ());
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;
}
// compiere header
private StringBuilder createCompiereHeader()
{
StringBuilder compiereHeader = new StringBuilder ();
compiereHeader
.append ("<%--/*************************************************************\n"
+ " **********\n"
+ " *******\n"
+ " * Product: Compiere 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.compiere.org/license.html\n"
+ " * 2620 Augustine Dr. #245, Santa Clara, CA 95054, USA or info@compiere.org\n"
+ " **************************************************************\n"
+ " **********\n" + " *****/--%>\n");
return compiereHeader;
}
// 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

@ -0,0 +1,134 @@
/******************************************************************************
* 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

@ -0,0 +1,61 @@
/******************************************************************************
* 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 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

@ -0,0 +1,100 @@
/******************************************************************************
* 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.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;
}
}