* remove jsf files

This commit is contained in:
Heng Sin Low 2007-01-12 09:24:34 +00:00
parent 0202b0fe89
commit a0bff99044
19 changed files with 0 additions and 3877 deletions

View File

@ -8,7 +8,5 @@
<classpathentry kind="src" path="/looks"/> <classpathentry kind="src" path="/looks"/>
<classpathentry kind="src" path="/print"/> <classpathentry kind="src" path="/print"/>
<classpathentry combineaccessrules="false" kind="src" path="/client"/> <classpathentry combineaccessrules="false" kind="src" path="/client"/>
<classpathentry kind="lib" path="src/web/WEB-INF/lib/myfaces-api-1.1.3.jar"/>
<classpathentry kind="lib" path="src/web/WEB-INF/lib/tomahawk-1.1.3.jar"/>
<classpathentry kind="output" path="build/war"/> <classpathentry kind="output" path="build/war"/>
</classpath> </classpath>

View File

@ -17,18 +17,13 @@
<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="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.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/"/>
<target name="serverAppsInit"> <target name="serverAppsInit">
<echo message="=========== Build Server Application"/> <echo message="=========== Build Server Application"/>
<tstamp/> <tstamp/>
@ -39,8 +34,6 @@
<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>

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 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

@ -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 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

@ -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 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

@ -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 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

@ -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,934 +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.*;
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

@ -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,61 +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 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,100 +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.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,15 +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>
<filter>
<filter-name>jsfFilter</filter-name>
<filter-class>org.compiere.webApp.JSFFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>jsfFilter</filter-name>
<url-pattern>/window/*</url-pattern>
</filter-mapping>
</web-app>

View File

@ -1,730 +0,0 @@
/***********************************************/
/* HTML tag styles */
/********************************************** */
body{
font-family: Arial, sans-serif;
color: #000000;
line-height: normal;
margin: 0px;
padding: 0px;
background-image: url(../images/page_bkgd3.jpg);
background-color: #fbf8f1;
background-repeat: repeat-x;
}
a{
color: #006699;
text-decoration: none;
}
a:link{
color: #006699;
text-decoration: none;
font-weight: normal;
}
a:visited{
color: #006699;
font-weight: normal;
text-decoration: none;
}
a:hover{
color: #006699;
text-decoration: underline;
}
h1, h2, h3, h4, h5, h6, h7 {
font-family: Arial,sans-serif;
margin: 0px;
padding: 0px;
}
ul{
list-style-type: square;
list-style-position: inside;
margin-right: 10px;
}
ul ul{
list-style-type: disc;
}
ul ul ul{
list-style-type: none;
}
label{
color: #333333;
font-family: Arial,sans-serif;
font-size: 80%;
}
ol{
list-style-position: inside;
margin-right: 10px;
}
img{
text-decoration: none;
}
/***********************************************/
/* Layout Divs */
/***********************************************/
/************** #container div styles ************* */
#indexProductbar{
padding: 0px;
background-color: #FFFFFF;
width: 160px;
float: left;
}
#content{
float:right;
width: 596px;
margin: 0px 0px 0px 0px;
color:#333333;
padding: 0px 0px 0px 0px;
}
#indexContent{
width: 419px;
margin: 0px 0px 0px 0px;
color:#333333;
padding: 0px 0px 0px 0px;
background-color: #FFFFFF;
float: left;
}
#fullcontent{
width: 760px;
margin: 0px 0px 0px 0px;
color:#333333;
padding: 0px 0px 0px 0px;
}
#leftPod{
float: left;
margin: 0px;
padding: 0px;
background-repeat: no-repeat;
height: 320px;
width: 160px;
background-image: url(/images/adempiere_guy.jpg);
}
#leftPod2{
width: 127px;
margin: 0px;
padding: 7px 0px 0px 2px;
background-image: url(../images/title_bkgd.jpg);
height: 23px;
float: left;
border-left: solid #CCCCCC 1px;
border-right: solid #CCCCCC 1px;
border-top: solid #CCCCCC 1px;
}
#leftPod3{
width: 129px;
padding: 0px 0px 0px 0px;
text-align: center;
float: left;
border-right: solid #CCCCCC 1px;
border-left: solid #CCCCCC 1px;
}
#leftPod4{
float: none;
margin: 0px;
padding: 0px;
width: 129px;
background-color: #FFFFFF;
}
#rightPod{
float:right;
width: 100%;
border-left: 1px solid #cccccc;
border-bottom: 1px solid #cccccc;
}
#rightPod2{
float:none;
width: 160px;
background-image: url(../images/title_bkgd.jpg);
height: 23px;
text-align: left;
padding: 7px 0px 0px 0px;
background-repeat: no-repeat;
}
#rightPod3{
float:none;
width: 158px;
text-align: center;
margin: 0px 0px 0px 0px;
background-color: #FFFFFF;
}
#rightPod5{
float:none;
width: 158px;
text-align: center;
margin: 0px 0px 0px 0px;
background-color: #FFFFFF;
height: 280px;
padding-top: 25px;
}
/************** #topNav styles ************* */
#topNav{
position: relative;
top: 4px;
height: 22px;
padding: 0px;
margin: -95px 0px 0px 400px;
left: 5px;
width: 350px;
text-align: right;
font-size: 60%;
vertical-align: middle;
}
#topLink{
position: relative;
top: 4px;
height: 22px;
padding: 0px;
margin: 0px;
left: 190px;
width: 500px;
}
a.toplink, a.toplink:visited{
color: #003366;
font-weight: bold;
margin: 0px;
padding: 2px 5px 4px 5px;
text-decoration: none;
border-right-width: 1px;
border-right-style: solid;
border-right-color: #999999;
}
a.toplink:hover{
color: #003366;
font-weight: bold;
text-decoration: underline;
}
a.alttoplink, a.alttoplink:visited{
color: #003366;
font-weight: bold;
margin: 0px;
padding: 2px 5px 4px 5px;
text-decoration: none;
}
a.alttoplink:hover{
color: #003366;
font-weight: bold;
text-decoration: underline;
}
/************* #globalNav styles ************* */
#globalNav{
color: #003366;
white-space: nowrap;
background-image: url(../images/navbar_adempiere.jpg);
background-repeat: no-repeat;
font-family: Arial, Helvetica, sans-serif;
height: 28px;
width: 100%;
}
#globalNav img{
display: block;
}
#globalNav a {
font-size: 90%;
padding: 0 4px 0 0;
}
#globalLink{
position: relative;
top: 4px;
height: 22px;
padding: 0px;
margin: 0px;
left: 190px;
width: 400px;
}
a.glink, a.glink:visited{
font-size: small;
color: #99FFFF;
font-weight: bold;
margin: 0px;
padding: 2px 5px 4px 5px;
text-decoration: none;
border-right-width: 0px;
border-right-style: solid;
border-right-color: #999999;
}
a.glink:hover{
color: #FFFFFF;
text-decoration: none;
}
a.altlink, a.altlink:visited{
font-size: small;
color: #99FFFF;
font-weight: bold;
margin: 0px;
padding: 2px 5px 4px 5px;
text-decoration: none;
}
a.altlink:hover{
color: #FFFFFF;
text-decoration: none;
}
/************** #tabNav styles ************* */
#tabNav{
position: relative;
padding: -10px 0px 5px 20px;
margin: 0px;
left: 25px;
width: 520px;
}
a.tabNav, a.tabNav:visited{
color: #ffffff;
font-weight: bold;
margin: 0px;
padding: 2px 5px 4px 5px;
text-decoration: underline;
}
a.tabNav:hover{
color: #ffffff;
font-weight: bold;
text-decoration: underline;
}
/************** Header styles ************* */
#masthead{
width: 100%;
border-bottom: 1px solid #cccccc;
}
#header{
font-family: Arial, Helvetica, sans-serif;
height: 94px;
width: 100%;
margin: 0;
background-color: #0099CC;
background-image: url(../images/adempiere_5a.jpg);
background-repeat: no-repeat;
font-weight: bolder;
}
#logoHeader{
font-family: Arial, Helvetica, sans-serif;
height: 94px;
width: 100%;
z-index: 10;
}
#navBar{
padding: 0px;
background-color: #eeeeee;
width: 159px;
}
#fullheightcontainer{
margin-left:auto;
margin-right:auto;
position:inherit;
width:760px;
height:100%;
background-color: #FFFFFF;
}
#wrapper{
min-height:100%;
height:100%;
background:#FFFFFF;
}
#wrapp\65 r{
height:auto;
}
* html #wrapper{
height:100%;
width: 760px;
background-color: #FFFFFF;
}
#outer{
z-index:1;
position:relative;
margin-left:160px;
width:440px;
background:#FFFFFF;
height:100%;
}
/***********************************************/
/* Components */
/***********************************************/
/*************** title styles ************* */
#index1{
text-align: center;
background-color: #FFFFFF;
color: #003366;
font-weight: bolder;
font-size: 1.2em;
height: auto;
padding-top: 10px;
}
#index2{
text-align: right;
background-color: #FFFFFF;
color: #0099cc;
font-weight: bold;
font-size: .9em;
padding-right: 10px;
height: auto;
margin-top: 0px;
}
#index3{
text-align: left;
color: #003366;
font-weight: bold;
font-size: 1.0em;
}
#pageName{
margin: 25px 0px 0px 5px;
padding: 0px 0px 0px 20px;
color: #003366;
font-size: 150%;
}
#pageNameimg{
margin: 5px 0px 20px 25px;
padding: 0px 0px 0px 0px;
}
#sectionTitle{
font-weight: bold;
color: #003366;
margin: 0px 0px 0px 0px;
padding: 10px 0px 10px 10px;
}
#sectionTitle2{
font-size: 90%;
font-weight: bold;
color: #003366;
margin: 0px 0px 0px 0px;
padding: 5px 0px 10px 0px;
}
#storyTitle1{
font-size: 115%;
font-weight: bold;
color: #003366;
margin: 20px 10px 10px 25px;
padding: 0px;
}
#storyTitle2{
font-size: 105%;
font-weight: bold;
color: #333333;
margin: 0px 0px 10px 30px;
padding: 0px;
}
#storyTabletitle1{
font-size: 105%;
font-weight: bold;
color: #333333;
margin: 0px 0px 5px 15px;
padding: 0px;
}
#storyTabletitle2{
font-size: 115%;
font-weight: bold;
color: #003366;
margin: 0px 0px 10px 0px;
padding: 0px;
}
#dynamicTitle{
font-size: 100%;
font-weight: bolder;
color: #333333;
margin: 0px 0px 0px 0px;
padding: 0px 0px 0px 3px;
}
#siteMap1{
font-size: 120%;
font-weight: bold;
color: #006699;
margin: 20px 15px 10px 25px;
padding: 0px;
}
#siteMap2{
font-size: 90%;
font-weight: bold;
color: #006699;
margin: 0px 0px 5px 40px;
padding: 0px;
font-style: normal;
}
#aboutNav{
position: relative;
top: 4px;
height: 22px;
padding: 4px 0px 0px 0px;
margin: 2px 0px 8px 0px;
width: 410px;
text-align: center;
font-size: 90%;
vertical-align: middle;
}
a.aboutNav, a.aboutNav:visited{
font-weight: bold;
margin: 0px;
padding: 2px 5px 4px 5px;
text-decoration: underline;
}
a.aboutNav:hover{
font-weight: bold;
text-decoration: underline;
}
/************* #breadCrumb styles *************/
#breadCrumb{
font-size: 70%;
margin: 5px 0px 0px 20px;
}
/************** .centerPod styles ***************/
.centerPod{
padding: 0px 0px 0px 0px;
font-size: 0.91em;
background-color: #FFFFFF;
margin: 0px 0px 0px 0px;
}
.centerPod2{
background-image: url(../images/title_bkgd.jpg);
height: 31px;
}
.centerPod3{
}
/************** .story styles *****************/
.story{
font-size: 80%;
width: 100%;
}
.story p{
padding: 0px 0px 10px 0px;
margin: 0px 20px 0px 35px;
}
#storyImg{
margin: 10px 10px 10px 30px;
text-align: center;
}
.story a{
text-decoration:underline
}
.story a:visited{
text-decoration:underline
}
.story a:hover{
text-decoration: underline;
}
#storySidebar{
float:right;
width: 158px;
text-align: left;
margin: 0px 1px 10px 10px;
background-color: #FFFFFF;
border: 1px solid #cccccc;
}
/************** .webStore styles *****************/
#webStorecontent{
float:right;
width: 750px;
margin: 0px 0px 0px 0px;
color:#333333;
padding: 0px 10px 0px 0px;
}
.webStore{
font-size: 80%;
width: 100%;
}
.webStore p{
padding: 0px 0px 10px 0px;
margin: 0px 20px 0px 35px;
}
/************* #siteInfo styles ***************/
#siteInfo{
clear: both;
font-size: 75%;
color: #999999;
padding: 5px 5px 5px 5px;
text-align: center;
border-top: 1px solid #cccccc;
}
/************* #search styles ***************/
#search{
padding: 5px 0px 5px 10px;
font-size: 90%;
margin-top: -24px;
margin-left: 596px;
}
#search form{
margin: 0px;
padding: 0px;
}
#search label{
display: block;
margin: 0px;
padding: 0px;
}
#searchStore{
padding: 5px 0px 5px 10px;
font-size: 90%;
margin-top: -24px;
margin-left: 30px;
}
/*********** #navBar link styles ***********/
#navBar ul a:link, #navBar ul a:visited{
display: block;
}
#navBar ul {
list-style: none; margin: 0; padding: 0;
}
#navBar li {border-bottom: 1px solid #EEE;}
html>body #navBar li {border-bottom: none;}
/*********** leftNav styles ***********/
#sectionLinks{
position: relative;
margin: 0px;
padding: 0px;
font-size: 88%;
border-right: 1px solid #cccccc;
border-bottom: 1px solid #cccccc;
}
#sectionLinks h3{
padding: 10px 0px 2px 10px;
}
#sectionLinks a:link{
padding: 2px 0px 2px 10px;
border-top: 1px solid #cccccc;
width: auto;
voice-family: "\"}\"";
voice-family:inherit;
width: auto;
}
#sectionLinks a:visited{
border-top: 1px solid #cccccc;
padding: 2px 0px 2px 10px;
}
#sectionLinks a:hover{
border-top: 1px solid #cccccc;
background-color: #dddddd;
padding: 2px 0px 2px 10px;
}
#lnavFade{
width: 160px;
border: 0px;
height: 100px;
background-color: #FFFFFF;
background-image: url(../images/lnav_fade.jpg);
}
/*********** #login styles ***********/
#login{
position: relative;
margin: 0px;
padding: 10px 0px 10px 10px;
background-color: #FFFFFF;
border-right: 1px solid #cccccc;
}
#loginNew{
font-family: Arial, sans-serif;
color: #FF0000;
font-size: 80%;
text-align: left;
background-color: #FFFFFF;
padding: 10px 0px 10px 10px;
border-right: 1px solid #cccccc;
}
/*********** #subscribe styles ***********/
#subscribe{
text-align: left;
background-color: #eeeeee;
padding: 10px 0px 10px 10px;
border-right: 1px solid #cccccc;
border-top: 1px solid #cccccc;
}
#subscribeLink{
font-family: Arial, sans-serif;
color: #FF0000;
font-size: 90%;
padding-right: 5px;
}
#subscribeLink ul a:link, #navBar ul a:visited, #navBar ul a:link{
display: block;
color: #006699;
}
#subscribeLink ul {
list-style: none; margin: 0; padding: 0;
}
#subscribeLink li {border-bottom: 1px solid #EEE;}
html>body #subscribeLink li {border-bottom: none;}
/*********** .relatedLinks styles ***********/
.relatedLinks{
position: relative;
margin: 0px;
padding: 0px 0px 10px 10px;
font-size: 80%;
color: #006699;
}
.relatedLinks h3{
padding: 10px 0px 2px 0px;
}
.relatedLinks a:link,
.relatedLinks a:visited{
display: block;
color: #000033;
}
.relatedLinks a:hover {
display: block;
color: #000033;
text-decoration: underline;
}
.sitemapLinks1{
position: relative;
margin: 0px;
padding: 3px 0px 5px 65px;
font-size: 80%;
}
.sitemapLinks2{
position: relative;
margin: 0px;
padding: 0px 0px 5px 65px;
font-size: 80%;
}
.sitemapLinks3{
position: relative;
margin: 0px;
padding: 0px 0px 10px 65px;
font-size: 80%;
}
/************** #headlines styles ************* */
#headlines{
margin: 0px;
padding: 0px 0px 0px 0px;
width: 160px;
float: right;
background-color: #FFFFFF;
}
#headlines2{
margin: 0px;
padding: 0px 0px 0px 0px;
width: 160px;
float: right;
background-color: #FFFFFF;
border-left: solid #CCCCCC 1px;
border-right: solid #CCCCCC 1px;
border-top: solid #CCCCCC 1px;
}
#headlines3{
margin: 0px;
padding: 0px 0px 0px 0px;
width: 162px;
float: right;
background-color: #FFFFFF;
}
#headlines p{
padding: 5px 0px 5px 0px;
}
/************** #table styles ************* */
#tableText{
color: #333333;
font-size: 0.7em;
}

View File

@ -1,15 +0,0 @@
.mainDocumentStyle {
background-color: #cfcfcf;
}
/* used in toolbar buttons */
.iconButtonStyle {
background-color: #cfcfcf;
border: 3px groove #e0e0e0;
margin: 0px;
}
.rightLabel {
text-align: right;
white-space: nowrap;
}

View File

@ -1,45 +0,0 @@
/*
if you could do multiple inheritance in css this would be perfect for it
not every aspect of this setup is as styled as it should be;
the buttons aren't properly squished together
*/
.baseParentTabStyle {
background-color: inherit;
width: 100px;
}
/* indented child style tab button */
.baseChildTabStyle {
background-color: inherit;
width: 85px;
}
.selectedTabStyle {
border-left: 2px inset;
border-top: 2px inset;
border-bottom: 2px inset;
border-right: none;
}
.unselectedTabStyle {
border: 2px outset;
}
/* inherits from selectedTabStyle */
.selectedMouseOverTabStyle {
color: WHITE;
border-left: 2px inset BLACK;
border-top: 2px inset BLACK;
border-bottom: 2px inset BLACK;
border-right: none;
}
.unselectedMouseOverTabStyle {
color: WHITE;
border: 2px outset BLACK;
}
.thing {
padding-left: 15px;
}

View File

@ -1,21 +0,0 @@
.wideTableStyle {
table-layout: fixed;
border-style: solid;
border-width: 1px;
}
.wideTableHeaderStyle {
white-space: nowrap;
border-right: solid;
border-left: solid;
border-width: 1px;
}
wideTableRowStyle {
border-style: solid;
border-width: 1px;
}
.wideTableCellStyle {
border-style: solid;
border-width: 1px;
}

View File

@ -1,764 +0,0 @@
/*
Copyright 2005 Vitaliy Shevchuk (shevit@users.sourceforge.net)
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
*/
AjaxAnywhere.defaultInstanceName = "default";
// constructor;
function AjaxAnywhere() {
this.id = AjaxAnywhere.defaultInstanceName;
this.formName = null;
this.notSupported = false;
this.delayBeforeContentUpdate = true;
this.delayInMillis = 100;
if (window.XMLHttpRequest) {
this.req = new XMLHttpRequest();
} else if (window.ActiveXObject) {
try {
this.req = new ActiveXObject("Msxml2.XMLHTTP");
} catch(e) {
try {
this.req = new ActiveXObject("Microsoft.XMLHTTP");
} catch(e1) {
this.notSupported = true;
/* XMLHTTPRequest not supported */
}
}
}
if (this.req == null || typeof this.req == "undefined")
this.notSupported = true;
}
/**
* Stores substitutes SubmitButton names in to redo sustitution if a button was eventually inside a refresh zone.
*/
AjaxAnywhere.prototype.substitutedSubmitButtons = new Array();
AjaxAnywhere.prototype.substitutedSubmitButtonsInfo = new Object();
/**
* Returns a Form object that corresponds to formName property of this AjaxAnywhere class instance.
*/
AjaxAnywhere.prototype.findForm = function () {
var form;
if (this.formName != null)
form = document.forms[this.formName];
else if (document.forms.length > 0)
form = document.forms[0];
if (typeof form != "object")
alert("AjaxAnywhere error: Form with name [" + this.formName + "] not found");
return form;
}
/**
* Binds this instance to window object using "AjaxAnywhere."+this.id as a key.
*/
AjaxAnywhere.prototype.bindById = function () {
var key = "AjaxAnywhere." + this.id;
window[key] = this;
}
/**
* Finds an instance by id.
*/
AjaxAnywhere.findInstance = function(id) {
var key = "AjaxAnywhere." + id;
return window[key];
}
/**
* This function is used to submit all form fields by AJAX request to the server.
* If the form is submited with &lt;input type=submit|image&gt;, submitButton should be a reference to the DHTML object. Otherwise - undefined.
*/
AjaxAnywhere.prototype.submitAJAX = function(additionalPostData, submitButton) {
if (this.notSupported)
return this.onSubmitAjaxNotSupported(additionalPostData, submitButton);
if (additionalPostData == null || typeof additionalPostData == "undefined")
additionalPostData = "";
this.bindById();
var form = this.findForm();
var actionAttrNode = form.attributes["action"].nodeValue;
var url = actionAttrNode == null?null:actionAttrNode.nodeValue;
if ((url == null) || (url == ""))
url = location.href;
var pos = url.indexOf("#");
if (pos!=-1)
url = url.substring(0,pos);
if ((url == null) || (url == ""))
url = location.href;
pos = url.indexOf("#");
if (pos!=-1)
url = url.substring(0,pos);
var zones = this.getZonesToReload(url, submitButton);
if (zones == null) {
// submit in tradiditional way :
this.submitOld(form,submitButton)
return;
}
this.dropPreviousRequest();
this.req.open("POST", url, true);
this.req.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
this.req.setRequestHeader("Accept", "text/xml");
var postData = this.preparePostData(submitButton);
if (zones != "")
postData = '&aazones=' + encodeURIComponent(zones) + "&" + postData + "&" + additionalPostData;
else
postData += "&" + additionalPostData;
this.sendPreparedRequest(postData);
}
/**
* sends a GET request to the server.
*/
AjaxAnywhere.prototype.getAJAX = function(url, zonesToRefresh) {
if (this.notSupported)
return this.onGetAjaxNotSupported(url);
this.bindById();
if (zonesToRefresh == null || typeof zonesToRefresh == "undefined")
zonesToRefresh = "";
var urlDependentZones = this.getZonesToReload(url);
if (urlDependentZones == null) {
location.href = url;
return;
}
if (urlDependentZones.length != 0)
zonesToRefresh += "," + urlDependentZones;
this.dropPreviousRequest();
url += (url.indexOf("?") != -1) ? "&" : "?";
url += "aaxmlrequest=true&aa_rand=" + Math.random();
// avoid caching
if (zonesToRefresh != null && zonesToRefresh != "")
url += '&aazones=' + encodeURIComponent(zonesToRefresh);
this.req.open("GET", url, true);
this.req.setRequestHeader("Accept", "text/xml");
this.sendPreparedRequest("");
}
/**
* @private
*/
AjaxAnywhere.prototype.sendPreparedRequest = function (postData) {
var callbackKey = this.id + "_callbackFunction";
if (typeof window[callbackKey] == "undefined")
window[callbackKey] = new Function("AjaxAnywhere.findInstance(\"" + this.id + "\").callback(); ");
this.req.onreadystatechange = window[callbackKey];
this.showLoadingMessage();
this.req.send(postData);
}
/**
* Used internally by AjaxAnywhere. Aborts previous request if not completed.
*/
AjaxAnywhere.prototype.dropPreviousRequest = function() {
if (this.req.readyState != 0 && this.req.readyState != 4) {
// abort previous request if not completed
this.req.abort();
this.handlePrevousRequestAborted();
}
}
/**
* Internally used to prepare Post data.
* If the form is submited with &lt;input type=submit|image&gt;, submitButton is a reference to the DHTML object. Otherwise - undefined.
*/
AjaxAnywhere.prototype.preparePostData = function(submitButton) {
var form = this.findForm();
var result = "&aaxmlrequest=true";
for (var i = 0; i < form.elements.length; i++) {
var el = form.elements[i];
if (el.tagName.toLowerCase() == "select") {
for (var j = 0; j < el.options.length; j++) {
var op = el.options[j];
if (op.selected)
result += "&" + encodeURIComponent(el.name) + "=" + encodeURIComponent(op.value);
}
} else if (el.tagName.toLowerCase() == "textarea") {
result += "&" + encodeURIComponent(el.name) + "=" + encodeURIComponent(el.value);
} else if (el.tagName.toLowerCase() == "input") {
if (el.type.toLowerCase() == "checkbox" || el.type.toLowerCase() == "radio") {
if (el.checked)
result += "&" + encodeURIComponent(el.name) + "=" + encodeURIComponent(el.value);
} else if (el.type.toLowerCase() == "submit") {
if (el == submitButton) // is "el" the submit button that fired the form submit?
result += "&" + encodeURIComponent(el.name) + "=" + encodeURIComponent(el.value);
} else if (el.type.toLowerCase() != "button") {
result += "&" + encodeURIComponent(el.name) + "=" + encodeURIComponent(el.value);
}
}
}
if (typeof submitButton != 'undefined' && submitButton != null && submitButton.type.toLowerCase() == "image") {
if (submitButton.name == null || submitButton.name == "" || typeof submitButton.name == "undefined")
result += "&x=1&y=1"; // .x and .y coordinates calculation is not supported.
else
result += "&" + encodeURIComponent(submitButton.name) + ".x=1&" +
encodeURIComponent(submitButton.name) + ".y=1";
}
return result;
}
/**
* Pauses the thread of execution for the specified number of milliseconds
* @private
*/
function delay(millis) {
date = new Date();
var curDate = null;
do {
curDate = new Date();
}
while (curDate - date < millis);
}
/**
* A callback. internally used
*/
AjaxAnywhere.prototype.callback = function() {
if (this.req.readyState == 4) {
this.onBeforeResponseProcessing();
this.hideLoadingMessage();
if (this.req.status == 200) {
if (this.req.getResponseHeader('content-type').toLowerCase().substring(0, 8) != 'text/xml')
alert("AjaxAnywhere error : content-type in not text/xml : [" + this.req.getResponseHeader('content-type') + "]");
var docs = this.req.responseXML.getElementsByTagName("document");
var redirects = this.req.responseXML.getElementsByTagName("redirect");
var zones = this.req.responseXML.getElementsByTagName("zone");
var exceptions = this.req.responseXML.getElementsByTagName("exception");
var scripts = this.req.responseXML.getElementsByTagName("script");
var images = this.req.responseXML.getElementsByTagName("image");
if (redirects.length != 0) {
var newURL = redirects[0].firstChild.data;
location.href = newURL;
}
if (docs.length != 0) {
var newContent = docs[0].firstChild.data;
//cleanup ressources
delete this.req;
document.close();
document.write(newContent);
document.close();
}
if (images.length != 0) {
var preLoad = new Array(images.length);
for (var i = 0; i < images.length; i++) {
var img = images[i].firstChild;
if (img != null) {
preLoad[i] = new Image();
preLoad[i].src = img.data;
}
}
if (this.delayBeforeContentUpdate) {
delay(this.delayInMillis);
}
}
if (zones.length != 0) {
for (var i = 0; i < zones.length; i++) {
var zoneNode = zones[i];
var name = zoneNode.getAttribute("name");
var id = zoneNode.getAttribute("id");
var fc = zoneNode.firstChild;
var html = (fc == null)?"":fc.data;
var zoneHolder = name!=null?
document.getElementById("aazone." + name):
document.getElementById(id);
if (zoneHolder != null && typeof(zoneHolder) != "undefined") {
zoneHolder.innerHTML = html;
}
}
}
if (exceptions.length != 0) {
var e = exceptions[0];
var type = e.getAttribute("type");
var stackTrace = e.firstChild.data;
this.handleException(type, stackTrace);
}
if (scripts.length != 0) {
for (var $$$$i = 0; $$$$i < scripts.length; $$$$i++) {
// use $$$$i variable to avoid collision with "i" inside user script
var script = scripts[$$$$i].firstChild;
if (script != null) {
script = script.data;
if (script.indexOf("document.write") != -1) {
this.handleException("document.write", "This script contains document.write(), which is not compatible with AjaxAnywhere : \n\n" + script);
} else {
eval(script);
}
}
}
var globals = this.getGlobalScriptsDeclarationsList(script);
if (globals != null)
for (var i in globals) {
var objName = globals[i];
try {
window[objName] = eval(objName);
} catch(e) {
}
}
}
} else {
if (this.req.status != 0)
this.handleHttpErrorCode(this.req.status);
}
this.restoreSubstitutedSubmitButtons();
this.onAfterResponseProcessing();
}
}
/**
* Default sample loading message show function. Overrride it if you like.
*/
AjaxAnywhere.prototype.showLoadingMessage = function() {
var div = document.getElementById("AA_" + this.id + "_loading_div");
if (div == null) {
div = document.createElement("DIV");
document.body.appendChild(div);
div.id = "AA_" + this.id + "_loading_div";
div.innerHTML = "&nbsp;Loading...";
div.style.position = "absolute";
div.style.border = "1 solid black";
div.style.color = "white";
div.style.backgroundColor = "blue";
div.style.width = "100px";
div.style.heigth = "50px";
div.style.fontFamily = "Arial, Helvetica, sans-serif";
div.style.fontWeight = "bold";
div.style.fontSize = "11px";
}
div.style.top = document.body.scrollTop + "px";
div.style.left = (document.body.offsetWidth - 100 - (document.all?20:0)) + "px";
div.style.display = "";
}
/**
* Default sample loading message hide function. Overrride it if you like.
*/
AjaxAnywhere.prototype.hideLoadingMessage = function() {
var div = document.getElementById("AA_" + this.id + "_loading_div");
if (div != null)
div.style.display = "none";
}
/**
* This function is used to facilitatte AjaxAnywhere integration with existing projects/frameworks.
* It substitutes default Form.sumbit().
* The new implementation calls AjaxAnywhere.isFormSubmitByAjax() function to find out if the form
* should be submitted in traditional way or by AjaxAnywhere.
*/
AjaxAnywhere.prototype.substituteFormSubmitFunction = function() {
if (this.notSupported)
return;
this.bindById();
var form = this.findForm();
form.submit_old = form.submit;
var code = "var ajax = AjaxAnywhere.findInstance(\"" + this.id + "\"); " +
"if (typeof ajax !='object' || ! ajax.isFormSubmitByAjax() ) " +
"ajax.findForm().submit_old();" +
" else " +
"ajax.submitAJAX();"
form.submit = new Function(code);
}
/**
* Substitutes the default behavior of &lt;input type=submit|image&gt; to submit the form via AjaxAnywhere.
*
* @param {boolean} indicates if existing onClick handlers should be preserved.
* If keepExistingOnClickHandler==true,
* Existing handler will be called first if it returns false, or if event.returnValue==false, AjaxAnywhere will not
* continue form submission.
* If keepExistingOnClickHandler==false or undefines, existing onClick event handlers will be replaced.
*
* @param {Array} list of submitButtons and submitImages names. If the parameter is omitted or undefined,
* all elements will be processed
*/
AjaxAnywhere.prototype.substituteSubmitButtonsBehavior = function (keepExistingOnClickHandler, elements) {
if (this.notSupported)
return;
var form = this.findForm();
if (elements == null || typeof elements == "undefined") { // process all elements
elements = new Array();
for (var i = 0; i < form.elements.length; i++) {
elements.push(form.elements[i]);
}
var inputs = document.getElementsByTagName("input");
for (var i = 0; i < inputs.length; i++) {
var input = inputs[i];
if (input.type != null && typeof input.type != "undefined" &&
input.type.toLowerCase() == "image" && input.form == form) {
elements.push(input);
}
}
for (var i = 0; i < elements.length; i++) {
var el = elements[i];
if (el.tagName.toLowerCase() == "input" && (el.type.toLowerCase() == "submit"
|| el.type.toLowerCase() == "image")) {
this.substituteSubmitBehavior(el, keepExistingOnClickHandler);
}
}
} else { //process only specified elements
for (var i = 0; i < elements.length; i++) {
var el = elements[i];
if (el == null)
continue;
if (typeof el != "object")
el = form.elements[el];
if (typeof el != "undefined") {
if (el.tagName.toLowerCase() == "input" && (el.type.toLowerCase() == "submit"
|| el.type.toLowerCase() == "image"))
this.substituteSubmitBehavior(el, keepExistingOnClickHandler);
}
}
}
}
/**
* Performs a single element behavior substitution
*
* @private
*/
AjaxAnywhere.prototype.substituteSubmitBehavior = function (el, keepExistingOnClickHandler) {
var inList = false;
for (var i = 0; i < this.substitutedSubmitButtons.length; i++) {
var btnName = this.substitutedSubmitButtons[i];
if (btnName == el.name) {
inList = true;
break;
}
}
if (!inList)
this.substitutedSubmitButtons.push(el.name);
this.substitutedSubmitButtonsInfo[el.name] = keepExistingOnClickHandler;
if (keepExistingOnClickHandler && (typeof el.onclick != "undefined") && ( el.onclick != null) && ( el.onclick != "")) {
el.AA_old_onclick = el.onclick;
}
el.onclick = handleSubmitButtonClick;
el.ajaxAnywhereId = this.id;
}
/**
*
* @private
*/
AjaxAnywhere.prototype.restoreSubstitutedSubmitButtons = function() {
if (this.substitutedSubmitButtons.length == 0)
return;
var form = this.findForm();
for (var i = 0; i < this.substitutedSubmitButtons.length; i++) {
var name = this.substitutedSubmitButtons[i];
var el = form.elements[name];
if (el != null && typeof el != "undefined") {
if (el.onclick != handleSubmitButtonClick) {
var keepExistingOnClickHandler = this.substitutedSubmitButtonsInfo[el.name];
this.substituteSubmitBehavior(el, keepExistingOnClickHandler);
}
} else {
//input type=image
if (name != null && typeof name != "undefined" && name.length != 0) {
var elements = document.getElementsByName(name);
if (elements != null)
for (var j = 0; j < elements.length; j++) {
el = elements[j];
if (el != null && typeof el != "undefined"
&& el.tagName.toLowerCase() == "input"
&& typeof el.type != "undefined" && el.type.toLowerCase() == "image") {
if (el.onclick != handleSubmitButtonClick) {
var keepExistingOnClickHandler = this.substitutedSubmitButtonsInfo[el.name];
this.substituteSubmitBehavior(el, keepExistingOnClickHandler);
}
}
}
}
}
}
}
/**
* @private
*/
function handleSubmitButtonClick(_event) {
if (typeof this.AA_old_onclick != "undefined") {
if (false == this.AA_old_onclick(_event))
return false;
if (typeof window.event != "undefined")
if (window.event.returnValue == false)
return false;
}
var onsubmit = this.form.onsubmit;
if (typeof onsubmit == "function") {
if (false == onsubmit(_event))
return false;
if (typeof window.event != "undefined")
if (window.event.returnValue == false)
return false;
}
AjaxAnywhere.findInstance(this.ajaxAnywhereId).submitAJAX('', this);
return false;
}
/**
* Override this function if you use AjaxAnywhere.substituteFormSubmitFunction() to
* dynamically inform AjaxAnywhere of the method you want to use for the form submission.
*/
AjaxAnywhere.prototype.isFormSubmitByAjax = function () {
return true;
}
/**
* Some browsers (notably IE) do not load images from thier cache when content is updated using
* innerHTML. As a result, each image is re-requested from the server even though the image exists
* in the cache. To work around this issue, AjaxAnywhere preloads images present in the new content
* and intrduces a brief dely (default of 100 milleseconds) before calling innerHTML.
* See http://support.microsoft.com/default.aspx?scid=kb;en-us;319546 for further details.
* This function can be used to change this behaviour.
* @param (boolean) isDelay
*/
AjaxAnywhere.prototype.setDelayBeforeLoad = function (isDelay) {
this.delayBeforeContentUpdate = isDelay;
}
/**
* Returns the current delay behavior.
*/
AjaxAnywhere.prototype.isDelayBeforeLoad = function () {
return this.delayBeforeContentUpdate;
}
/**
* Sets the delay period in milliseconds. The default delay is 100 milliseconds.
* @param (int) delayMillis
*/
AjaxAnywhere.prototype.setDelayTime = function (delayMillis) {
this.delayInMillis = delayMillis;
}
/**
* Returns the delay period in milliseconds.
*/
AjaxAnywhere.prototype.getDelayTime = function () {
return this.delayInMillis;
}
/**
* If an exception is throws on the server-side during AJAX request, it will be processed
* by this function. The default implementation is alert(stackTrace);
* Override it if you need.
*/
AjaxAnywhere.prototype.handleException = function(type, details) {
alert(details);
}
/**
* If an HTTP Error code returned during AJAX request, it will be processed
* by this function. The default implementation is alert(code);
* Override it if you need.
*/
AjaxAnywhere.prototype.handleHttpErrorCode = function(code) {
var details = confirm("AjaxAnywhere default error handler. XMLHttpRequest HTTP Error code:" + code + " \n\n Would you like to view the response content in a new window?");
if (details) {
var win = window.open("", this.id + "_debug_window");
if (win != null) {
win.document.write("<html><body><xmp>" + this.req.responseText);
win.document.close();
win.focus();
} else {
alert("Please, disable your pop-up blocker for this site first.");
}
}
}
/**
* Override it if you need.
*/
AjaxAnywhere.prototype.handlePrevousRequestAborted = function() {
alert("AjaxAnywhere default error handler. INFO: previous AJAX request dropped")
}
/**
* If the HTML received in responce to AJAX request contains JavaScript that defines new
* functions/variables, they must be propagated to the proper context. Override this method
* to return the Array of function/variable names.
*/
AjaxAnywhere.prototype.getGlobalScriptsDeclarationsList = function(script) {
return null;
}
/**
* This function should be overridden by AjaxAnywhere user to implement client-side
* determination of zones to reload.
*
* If the form is submited with &lt;input type=submit|image&gt;, submitButton is a reference to the DHTML object. Otherwise - undefined.
*
* @Returns a comma separated list of zones to reload, or "document.all" to reload
* the whole page. Returns null if the request must be sent in traditional way
*
*/
AjaxAnywhere.prototype.getZonesToReload = function(url, submitButton) {
return this.getZonesToReaload();
// backward compatibility only
}
/**
* depreceted : wrond spelling : Reaload will be removed in later versions
*/
AjaxAnywhere.prototype.getZonesToReaload = function(url, submitButton) {
return "";
}
/**
* Override this method to implement a custom action
*/
AjaxAnywhere.prototype.onRequestSent = function () {
};
/**
* Override this method to implement a custom action
*/
AjaxAnywhere.prototype.onBeforeResponseProcessing = function () {
};
/**
* Override this method to implement a custom action
*/
AjaxAnywhere.prototype.onAfterResponseProcessing = function () {
};
/**
* Provides a default implementation from graceful degradation for getAJAX()
* calls location.href=url if XMLHttpRequest is unavailable, reloading the entire page .
*/
AjaxAnywhere.prototype.onGetAjaxNotSupported = function (url) {
location.href = url;
return false;
};
/**
* Provides a default implementation from graceful degradation for submitAJAX()
* calls form.submit() if XMLHttpRequest is unavailable, reloading the entire page
*/
AjaxAnywhere.prototype.onSubmitAjaxNotSupported = function (additionalPostData, submitButton) {
var form = this.findForm();
var actionAttrNode = form.attributes["action"].nodeValue;
var url = actionAttrNode == null?null:actionAttrNode.nodeValue;
var url_backup = url;
if (typeof additionalPostData != 'undefined' && additionalPostData != null) {
url += (url.indexOf("?") != -1) ? "&" : "?";
url += additionalPostData;
form.attributes["action"].nodeValue= url;
// only POST method allows sending additional
// date by altering form action URL.
form.setAttribute("method", "post");
}
this.submitOld(form,submitButton);
form.attributes["action"].nodeValue= url_backup;
return false;
};
/**
* submit the form in tradiditional way :
* @private
*/
AjaxAnywhere.prototype.submitOld = function (form,submitButton){
var submitHolder = null;
if (submitButton!=null && typeof submitButton!="undefined"){
submitHolder = document.createElement("input");
submitHolder.setAttribute("type","hidden");
submitHolder.setAttribute("name",submitButton.name);
submitHolder.setAttribute("value",submitButton.value);
form.appendChild(submitHolder);
}
if (typeof form.submit_old == "undefined")
form.submit();
else
form.submit_old();
if (submitButton!=null ){
form.removeChild(submitHolder);
}
}
// default instance.
ajaxAnywhere = new AjaxAnywhere();
ajaxAnywhere.bindById();