📄 layoutengine.java
字号:
* Get the current Print Area
* @return area see HEADER_.. constants
*/
public int getArea ()
{
return m_area;
} // getArea
/**
* Return bounds of current Area
* @return rectangle with bounds
*/
public Rectangle getAreaBounds()
{
Rectangle part = m_content;
if (m_area == AREA_HEADER)
part = m_header;
else if (m_area == AREA_FOOTER)
part = m_footer;
//
return part;
} // getAreaBounds
/**************************************************************************
* Create New Page, set position to top content
* @param force if false will check if nothing printed so far
* @param preserveXPos preserve X Position of content area
* @return new page no
*/
protected int newPage (boolean force, boolean preserveXPos)
{
// We are on a new page
if (!force
&& m_position[AREA_CONTENT].getX() == m_content.x
&& m_position[AREA_CONTENT].getY() == m_content.y)
{
log.fine("skipped");
return m_pageNo;
}
m_pageNo++;
m_currPage = new Page (m_printCtx, m_pageNo);
m_pages.add(m_currPage);
//
m_position[AREA_HEADER].setLocation(m_header.x, m_header.y);
if (preserveXPos)
m_position[AREA_CONTENT].setLocation(m_position[AREA_CONTENT].x, m_content.y);
else
m_position[AREA_CONTENT].setLocation(m_content.x, m_content.y);
m_position[AREA_FOOTER].setLocation(m_footer.x, m_footer.y);
m_maxHeightSinceNewLine = new float[] {0f, 0f, 0f};
log.finer("Page=" + m_pageNo);
return m_pageNo;
} // newPage
/**
* Move to New Line (may cause new page)
*/
protected void newLine ()
{
Rectangle part = m_content;
if (m_area == AREA_HEADER)
part = m_header;
else if (m_area == AREA_FOOTER)
part = m_footer;
// Temporary NL Position
int xPos = part.x;
if (m_tempNLPositon != 0)
xPos = m_tempNLPositon;
if (isYspaceFor(m_maxHeightSinceNewLine[m_area]))
{
m_position[m_area].setLocation(xPos, m_position[m_area].y + m_maxHeightSinceNewLine[m_area]);
log.finest("Page=" + m_pageNo + " [" + m_area + "] " + m_position[m_area].x + "/" + m_position[m_area].y);
}
else if (m_area == AREA_CONTENT)
{
log.finest("Not enough Y space "
+ m_lastHeight[m_area] + " - remaining " + getYspace() + " - Area=" + m_area);
newPage(true, false);
log.finest("Page=" + m_pageNo + " [" + m_area + "] " + m_position[m_area].x + "/" + m_position[m_area].y);
}
else // footer/header
{
m_position[m_area].setLocation(part.x, m_position[m_area].y + m_maxHeightSinceNewLine[m_area]);
log.log(Level.SEVERE, "Outside of Area(" + m_area + "): " + m_position[m_area]);
}
m_maxHeightSinceNewLine[m_area] = 0f;
} // newLine
/**
* Get current Page Number (not zero based)
* @return Page No
*/
public int getPageNo()
{
return m_pageNo;
} // getPageNo
/**
* Get Page No
* @param pageNo page number (NOT zero based)
* @return Page
*/
public Page getPage (int pageNo)
{
if (pageNo <= 0 || pageNo > m_pages.size())
{
log.log(Level.SEVERE, "No page #" + pageNo);
return null;
}
Page retValue = (Page)m_pages.get(pageNo-1);
return retValue;
} // getPage
/**
* Get Pages
* @return Pages in ArrayList
*/
public ArrayList getPages()
{
return m_pages;
} // getPages
/**
* Get Header & Footer info
* @return Header&Footer
*/
public HeaderFooter getHeaderFooter()
{
return m_headerFooter;
} // getPages
/**
* Set Current page to Page No
* @param pageNo page number (NOT zero based)
*/
protected void setPage (int pageNo)
{
if (pageNo <= 0 || pageNo > m_pages.size())
{
log.log(Level.SEVERE, "No page #" + pageNo);
return;
}
Page retValue = (Page)m_pages.get(pageNo-1);
m_currPage = retValue;
} // setPage
/**
* Get Page Info for Multi-Page tables
* @param pageNo page
* @return info e.g. (1,1)
*/
public String getPageInfo(int pageNo)
{
if (m_tableElement == null || m_tableElement.getPageXCount() == 1)
return "";
int pi = m_tableElement.getPageIndex(pageNo);
StringBuffer sb = new StringBuffer("(");
sb.append(m_tableElement.getPageYIndex(pi)+1).append(",")
.append(m_tableElement.getPageXIndex(pi)+1).append(")");
return sb.toString();
} // getPageInfo
/**
* Get Max Page Info for Multi-Page tables
* @return info e.g. (3,2)
*/
public String getPageInfoMax()
{
if (m_tableElement == null || m_tableElement.getPageXCount() == 1)
return "";
StringBuffer sb = new StringBuffer("(");
sb.append(m_tableElement.getPageYCount()).append(",")
.append(m_tableElement.getPageXCount()).append(")");
return sb.toString();
} // getPageInfoMax
/**
* Get Format Model
* @return model
*/
public MPrintFormat getFormat()
{
return m_format;
} // getFormat
/**
* Get Print Interface (Pageable, Printable, Doc)
* @param isCopy true if it is a document copy
* @return this if nothing to print
*/
public LayoutEngine getPageable (boolean isCopy)
{
setCopy(isCopy);
if (getNumberOfPages() == 0
|| !ArchiveEngine.isValid(this))
{
log.warning("Nothing to print - " + toString());
return null;
}
return this;
} // getPageable
/**************************************************************************
* Set Position on current page (no check)
* @param p point relative in area
*/
protected void setRelativePosition (Point2D p)
{
if (p == null)
return;
Rectangle part = m_content;
if (m_area == AREA_HEADER)
part = m_header;
else if (m_area == AREA_FOOTER)
part = m_footer;
m_position[m_area].setLocation(part.x + p.getX(), part.y + p.getY());
log.finest("Page=" + m_pageNo + " [" + m_area + "] " + m_position[m_area].x + "/" + m_position[m_area].y);
} // setPosition
/**
* Set Position on current page (no check)
* @param x x position in 1/72 inch
* @param y y position in 1/72 inch
*/
protected void setRelativePosition (float x, float y)
{
setRelativePosition(new Point2D.Float(x, y));
} // setPosition
/**
* Get the current position on current page
* @return current position
*/
public Point2D getPosition ()
{
return m_position[m_area];
} // getPosition
/**
* Set X Position on current page
* @param x x position in 1/72 inch
*/
protected void setX (float x)
{
m_position[m_area].x = x;
log.finest("Page=" + m_pageNo + " [" + m_area + "] " + m_position[m_area].x + "/" + m_position[m_area].y);
} // setX
/**
* Add to X Position on current page
* @param xOffset add offset to x position in 1/72 inch
*/
protected void addX (float xOffset)
{
if (xOffset == 0f)
return;
m_position[m_area].x += xOffset;
log.finest("Page=" + m_pageNo + " [" + m_area + "] " + m_position[m_area].x + "/" + m_position[m_area].y);
} // addX
/**
* Get X Position on current page
* @return x position in 1/72 inch
*/
public float getX ()
{
return (float)m_position[m_area].x;
} // getX
/**
* Set Y Position on current page
* @param y y position in 1/72 inch
*/
protected void setY (int y)
{
m_position[m_area].y = y;
log.finest("Page=" + m_pageNo + " [" + m_area + "] " + m_position[m_area].x + "/" + m_position[m_area].y);
} // setY
/**
* Add to Y Position - may cause New Page
* @param yOffset add offset to y position in 1/72 inch
*/
protected void addY (int yOffset)
{
if (yOffset == 0f)
return;
if (isYspaceFor(yOffset))
{
m_position[m_area].y += yOffset;
log.finest("Page=" + m_pageNo + " [" + m_area + "] " + m_position[m_area].x + "/" + m_position[m_area].y);
}
else if (m_area == AREA_CONTENT)
{
log.finest("Not enough Y space "
+ m_lastHeight[m_area] + " - remaining " + getYspace() + " - Area=" + m_area);
newPage(true, true);
log.finest("Page=" + m_pageNo + " [" + m_area + "] " + m_position[m_area].x + "/" + m_position[m_area].y);
}
else
{
m_position[m_area].y += yOffset;
log.log(Level.SEVERE, "Outside of Area: " + m_position);
}
} // addY
/**
* Get Y Position on current page
* @return y position in 1/72 inch
*/
public float getY ()
{
return (float)m_position[m_area].y;
} // getY
/**************************************************************************
* Return remaining X dimension space _ on current page in Area
* @return space in 1/72 inch remaining in line
*/
public float getXspace()
{
Rectangle part = m_content;
if (m_area == AREA_HEADER)
part = m_header;
else if (m_area == AREA_FOOTER)
part = m_footer;
//
return (float)(part.x + part.width - m_position[m_area].x);
} // getXspace
/**
* Remaining Space is OK for Width in Area
* @param width width
* @return true if width fits in area
*/
public boolean isXspaceFor (float width)
{
return (getXspace()-width) > 0f;
} // isXspaceFor
/**
* Return remaining Y dimension space | on current page in Area
* @return space in 1/72 inch remaining on page
*/
public float getYspace()
{
Rectangle part = m_content;
if (m_area == AREA_HEADER)
part = m_header;
else if (m_area == AREA_FOOTER)
part = m_footer;
//
return (float)(part.y + part.height - m_position[m_area].y);
} // getYspace
/**
* Remaining Space is OK for Height in Area
* @param height height
* @return true if height fits in area
*/
public boolean isYspaceFor (float height)
{
return (getYspace()-height) > 0f;
} // isYspaceFor
/**************************************************************************
* Create Standard Header/Footer
* <pre>
* title C Page x of x
* Copyright who date&time
* </pre>
*/
private void createStandardHeaderFooter()
{
/** Removing/modifying the Compiere logo/trademark/copyright is a violation of the license */
PrintElement element = new ImageElement(org.compiere.Compiere.getImageLogoSmall(true)); // 48x15
// element = new ImageElement(org.compiere.Compiere.getImageLogo()); // 100x30
element.layout(48, 15, false, MPrintFormatItem.FIELDALIGNMENTTYPE_LeadingLeft);
element.setLocation(m_header.getLocation());
m_headerFooter.addElement(element);
//
MPrintTableFormat tf = m_format.getTableFormat();
Font font = tf.getPageHeader_Font();
Color color = tf.getPageHeaderFG_Color();
//
element = new StringElement("@*ReportName@", font, color, null, true);
element.layout (m_header.width, 0, true, MPrintFormatItem.FIELDALIGNMENTTYPE_Center);
element.setLocation(m_header.getLocation());
m_headerFooter.addElement(element);
//
//
element = new StringElement("@Page@ @*Page@ @of@ @*PageCount@", font, color, null, true);
element.layout (m_header.width, 0, true, MPrintFormatItem.FIELDALIGNMENTTYPE_TrailingRight);
element.setLocation(m_header.getLocation());
m_headerFooter.addElement(element);
// Footer
font = tf.getPageFooter_Font();
color = tf.getPageFooterFG_Color();
//
/** Removing/modifying the Compiere logo/trademark/copyright is a violation of the license */
element = new StringElement(Compiere.COMPIERE_R, font, color, null, true);
/** If you have a valid ComPiere support contract, you can use the following */
// element = new StringElement(Compiere.NAME, font, color, null, true);
element.layout (m_footer.width, 0, true, MPrintFormatItem.FIELDALIGNMENTTYPE_LeadingLeft);
Point ft = m_footer.getLocation();
ft.y += m_footer.height - element.getHeight() - 2; // 2pt above min
element.setLocation(ft);
m_headerFooter.addElement(element);
//
element = new StringElement("@*Header@", font, color, null, true);
element.layout (m_footer.width, 0, true, MPrintFormatItem.FIELDALIGNMENTTYPE_Center);
element.setLocation(ft);
m_headerFooter.addElement(element);
//
element = new StringElement("@*CurrentDateTime@", font, color, null, true);
element.layout (m_footer.width, 0, true, MPrintFormatItem.FIELDALIGNMENTTYPE_TrailingRight);
element.setLocation(ft);
m_headerFooter.addElement(element);
} // createStandardHeaderFooter
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -