levelledexpressionlist.java
来自「swing编写的库存管理程序。毕业设计类」· Java 代码 · 共 1,180 行 · 第 1/2 页
JAVA
1,180 行
*
* @param event the event.
*/
public void itemsFinished(final ReportEvent event)
{
// clearError(); done in the prepare event ...
for (int i = 0; i < levels.length; i++)
{
final int level = levels[i];
if (level < getLevel())
{
break;
}
final Object[] itLevel = levelData[i];
for (int l = 0; l < itLevel.length; l++)
{
final Expression e = (Expression) itLevel[l];
if (e instanceof Function)
{
final Function f = (Function) e;
try
{
f.itemsFinished(event);
}
catch (Exception ex)
{
addError(ex);
}
}
else
{
try
{
if (e.isActive())
{
e.getValue();
}
}
catch (Exception ex)
{
addError(ex);
}
}
}
}
}
/**
* Receives notification that a new row has been read.
* <P>
* This event is raised before an ItemBand is printed.
*
* @param event the event.
*/
public void itemsAdvanced(final ReportEvent event)
{
// clearError(); done in the prepare event ...
for (int i = 0; i < levels.length; i++)
{
final int level = levels[i];
if (level < getLevel())
{
break;
}
final Object[] itLevel = levelData[i];
for (int l = 0; l < itLevel.length; l++)
{
final Expression e = (Expression) itLevel[l];
if (e instanceof Function)
{
final Function f = (Function) e;
try
{
f.itemsAdvanced(event);
}
catch (Exception ex)
{
addError(ex);
}
}
else
{
try
{
if (e.isActive())
{
e.getValue();
}
}
catch (Exception ex)
{
addError(ex);
}
}
}
}
}
/**
* Receives notification that the band layouting has completed.
* <P>
* The event carries the current report state.
*
* @param event The event.
*/
public void layoutComplete(final LayoutEvent event)
{
// this is an internal event, no need to handle prepare outside ..
// clearError();
firePrepareEventLayoutListener(event);
for (int i = 0; i < levels.length; i++)
{
final int level = levels[i];
if (level < getLevel())
{
break;
}
final Object[] itLevel = levelData[i];
for (int l = 0; l < itLevel.length; l++)
{
final Expression e = (Expression) itLevel[l];
if (e instanceof LayoutListener && e instanceof Function)
{
final LayoutListener f = (LayoutListener) e;
try
{
f.layoutComplete(event);
}
catch (Exception ex)
{
addError(ex);
}
}
}
}
}
/**
* Receives notification that report generation has completed, the report footer was printed,
* no more output is done. This is a helper event to shut down the output service.
*
* @param event The event.
*/
public void reportDone(final ReportEvent event)
{
// clearError(); done in the prepare event ...
for (int i = 0; i < levels.length; i++)
{
final int level = levels[i];
if (level < getLevel())
{
break;
}
final Object[] itLevel = levelData[i];
for (int l = 0; l < itLevel.length; l++)
{
final Expression e = (Expression) itLevel[l];
if (e instanceof Function)
{
final Function f = (Function) e;
try
{
f.reportDone(event);
}
catch (Exception ex)
{
addError(ex);
}
}
else
{
try
{
if (e.isActive())
{
e.getValue();
}
}
catch (Exception ex)
{
addError(ex);
}
}
}
}
}
/**
* Connects the given datarow to the expression collection and all expressions contained in
* this collection.
*
* @param dr the datarow to be connected (null not permitted).
*
* @throws IllegalStateException if there is a datarow already connected.
* @throws NullPointerException if the given datarow is null.
*/
public void setDataRow(final DataRow dr)
{
if (dr != null && dataRow != null)
{
// be paranoid and make sure that we dont replace the datarow
// by accident
throw new IllegalStateException
("Paranoia: Update calls must be done using the updateDataRow method.");
}
updateDataRow(dr);
}
/**
* Updates the datarow for all expressions. Does not perform validity
* checks, so use this function with care.
*
* @param dr the datarow to be connected.
*
* @throws NullPointerException if the given datarow is null.
* @throws IllegalStateException if there is no datarow connected.
*/
public void updateDataRow(final DataRow dr)
{
dataRow = dr;
for (int i = 0; i < levelData.length; i++)
{
for (int j = 0; j < levelData[i].length; j++)
{
final Expression f = levelData[i][j];
f.setDataRow(dr);
}
}
}
/**
* Returns the currently connected dataRow.
*
* @return the dataRow.
*/
public DataRow getDataRow()
{
return dataRow;
}
/**
* Initialises the expressions.
*
* @param expressionCollection the expression collection.
* @param functionCollection the function collection.
*/
private void initialize(final ExpressionCollection expressionCollection,
final ExpressionCollection functionCollection)
{
final LevelList expressionList = new LevelList();
int size = expressionCollection.size();
for (int i = 0; i < size; i++)
{
Expression f = expressionCollection.getExpression(i);
if (f != null)
{
f = f.getInstance();
expressionList.add(f);
expressionList.setLevel(f, f.getDependencyLevel());
}
}
if (functionCollection != null)
{
size = functionCollection.size();
for (int i = 0; i < size; i++)
{
// Explicit cast to Function to test all contained elements to be Functions!
// this may be just paranoid.
// todo 090 next redesign should unify functions and expressions in the
// report object.
Function f = (Function) functionCollection.getExpression(i);
if (f != null)
{
f = (Function) f.getInstance();
expressionList.add(f);
expressionList.setLevel(f, f.getDependencyLevel());
}
}
}
initializeFromLevelList(expressionList);
}
/**
* Initializes the expression list from the given levellist.
*
* @param expressionList the list containing the expressions and
* functions.
*/
private void initializeFromLevelList (final LevelList expressionList)
{
this.size = 0;
this.levels = buildLevels(expressionList);
this.levelData = new Expression[levels.length][];
this.flatData = new Expression[expressionList.size()];
for (int i = 0; i < levels.length; i++)
{
final int currentLevel = levels[i];
final Expression[] data = (Expression[])
expressionList.getElementArrayForLevel(currentLevel,
new Expression[expressionList.getElementCountForLevel(currentLevel)]);
this.levelData[i] = data;
System.arraycopy(data, 0, this.flatData, this.size, data.length);
this.size += data.length;
}
}
/**
* Size does not change, so it is cached.
*
* @return the size.
*/
public int size()
{
return size;
}
/**
* Creates and returns a copy of this object. The precise meaning
* of "copy" may depend on the class of the object.
* <p>
* The cloned LevelledExpressionList will no longer be connected to
* a datarow.
*
* @return a clone of this instance.
* @exception CloneNotSupportedException if the object's class does not
* support the <code>Cloneable</code> interface.
* @exception OutOfMemoryError if there is not enough memory.
* @see java.lang.Cloneable
*/
public Object clone() throws CloneNotSupportedException
{
final LevelledExpressionList ft = (LevelledExpressionList) super.clone();
// ft.levels = levels; // no need to clone them ...
// ft.size = size; // already copied during cloning ...
ft.dataRow = null;
ft.errorList = (ArrayList) errorList.clone();
ft.levelData = new Expression[levelData.length][];
ft.flatData = new Expression[flatData.length];
int flatDataPos = 0;
for (int level = 0; level < levelData.length; level++)
{
ft.levelData[level] = new Expression[levelData[level].length];
for (int i = 0; i < levelData[level].length; i++)
{
final Expression ex = levelData[level][i];
if (ex instanceof Function)
{
final Expression exClone = (Expression) ex.clone();
exClone.setDataRow(null);
ft.levelData[level][i] = exClone;
ft.flatData[flatDataPos] = exClone;
}
else
{
final Expression exClone = ex.getInstance();
exClone.setDataRow(null);
ft.levelData[level][i] = exClone;
ft.flatData[flatDataPos] = exClone;
}
flatDataPos++;
}
}
return ft;
}
/**
* Returns the preview instance of the levelled expression list. This list
* does no longer contain any Function instances.
*
* @return the preview (expressions only) instance of the levelled expression list.
*/
public LevelledExpressionList getPreviewInstance()
{
final LevelledExpressionList ft = new LevelledExpressionList();
ft.errorList = new ArrayList();
final LevelList expressionList = new LevelList();
for (int level = 0; level < levelData.length; level++)
{
for (int i = 0; i < levelData[level].length; i++)
{
final Expression ex = levelData[level][i];
if (ex instanceof Function)
{
// ignore it, functions are state dependent and cannot be used
// to compute group changes ...
}
else
{
expressionList.add(ex.getInstance(), level);
}
}
}
ft.initializeFromLevelList(expressionList);
return ft;
}
/**
* Sets the level.
*
* @param level the level.
*/
public void setLevel(final int level)
{
this.level = level;
}
/**
* Gets the current level.
*
* @return the current level.
*/
public int getLevel()
{
return level;
}
/**
* Returns an iterator that provides access to the levels in descending order.
*
* @return the iterator.
*/
public Iterator getLevelsDescending()
{
final Integer[] levelIntegers = new Integer[levels.length];
for (int i = 0; i < levels.length; i++)
{
levelIntegers[i] = new Integer(levels[i]);
}
return Collections.unmodifiableList(Arrays.asList(levelIntegers)).iterator();
}
/**
* Returns an iterator that provides access to the levels in ascending order.
*
* @return the iterator.
*/
public Iterator getLevelsAscending()
{
final Integer[] levelIntegers = new Integer[levels.length];
for (int i = 0; i < levels.length; i++)
{
levelIntegers[levels.length - i - 1] = new Integer(levels[i]);
}
return Collections.unmodifiableList(Arrays.asList(levelIntegers)).iterator();
}
/**
* Returns the values of an expression.
*
* @param index the function/expression index.
*
* @return the value.
*/
public Object getValue(final int index)
{
return flatData[index].getValue();
}
/**
* Returns an expression.
*
* @param index the function/expression index.
*
* @return the function/expression.
*/
public Expression getExpression(final int index)
{
return flatData[index];
}
/**
* Returns the list of errors, that occured during the last event handling.
*
* @return the list of errors.
*/
public List getErrors()
{
return Collections.unmodifiableList(errorList);
}
/**
* Returns true, if this list has detected at least one error in the last operation.
*
* @return true, if there were errors, false otherwise.
*/
public boolean hasErrors()
{
return errorList.size() != 0;
}
/**
* Adds the error to the current list of errors.
*
* @param e the new exception that occured during the event dispatching.
*/
protected void addError(final Exception e)
{
errorList.add(e);
}
/**
* Clears the error list.
*/
protected void clearError()
{
errorList.clear();
}
/**
* Fires a prepare event.
*
* @param event the event.
*/
public void firePrepareEvent(final ReportEvent event)
{
clearError();
for (int i = 0; i < levels.length; i++)
{
final int level = levels[i];
if (level < getLevel())
{
break;
}
final Object[] itLevel = levelData[i];
for (int l = 0; l < itLevel.length; l++)
{
final Expression e = (Expression) itLevel[l];
if (e instanceof Function && e instanceof PrepareEventListener)
{
final PrepareEventListener f = (PrepareEventListener) e;
try
{
f.prepareEvent(event);
}
catch (Exception ex)
{
addError(ex);
}
}
}
}
}
/**
* Fires a prepare event layout listeners.
*
* @param event the event.
*/
protected void firePrepareEventLayoutListener(final ReportEvent event)
{
// no clear error here ...
for (int i = 0; i < levels.length; i++)
{
final int level = levels[i];
if (level < getLevel())
{
break;
}
final Object[] itLevel = levelData[i];
for (int l = 0; l < itLevel.length; l++)
{
final Expression e = (Expression) itLevel[l];
if (e instanceof Function && e instanceof PrepareEventListener
&& e instanceof LayoutListener)
{
final PrepareEventListener f = (PrepareEventListener) e;
try
{
f.prepareEvent(event);
}
catch (Exception ex)
{
addError(ex);
}
}
}
}
}
}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?