📄 layoutengine.java
字号:
}
else if (m_area == AREA_CONTENT)
newPage();
else // footer/header
{
m_position[m_area].setLocation(part.x, m_position[m_area].y + m_maxHeightSinceNewLine[m_area]);
log.error("newLine - 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.error("getPage - No page #" + pageNo);
return null;
}
Page retValue = (Page)m_pages.get(pageNo-1);
return retValue;
} // getPage
/**
* Het Page Count
* @return Page Count
*/
public int getPageCount ()
{
return m_pages.size();
} // getPageCount
/**
* 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.error("setPage - 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
/*************************************************************************/
/**
* 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());
if (Log.isTraceLevel(10))
log.debug("setPosition - 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;
if (Log.isTraceLevel(10))
log.debug("setX - 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;
if (Log.isTraceLevel(10))
log.debug("addX - 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;
if (Log.isTraceLevel(10))
log.debug("setY - 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;
if (Log.isTraceLevel(10))
log.debug("addY - Page=" + m_pageNo + " [" + m_area + "] " + m_position[m_area].x + "/" + m_position[m_area].y);
}
else if (m_area == AREA_CONTENT)
newPage();
else
{
m_position[m_area].y += yOffset;
log.error("addY - 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
/*************************************************************************/
/**
* Set Current Font
* @param font font
*/
protected void setFont (Font font)
{
if (font != null)
m_font = font;
} // setFont
/**
* Get current Font
* @return font
*/
public Font getFont()
{
return m_font;
} // setFont
/**
* Set Current Font Name
* @param name font name like Dialog, DialogInput, Monospaced, Serif, or SansSerif
*/
protected void setFontName (String name)
{
m_font = new Font(name, m_font.getStyle(), m_font.getSize());
} // setFontSize
/**
* Set Current Font Style
* @param style font style - Font.PLAIN, Font.BOLD, Font.ITALIC, Font.BOLD|Font.ITALIC
*/
protected void setFontStyle (int style)
{
m_font = new Font(m_font.getName(), style, m_font.getSize());
} // setFontStyle
/**
* Set Current Font Size
* @param size font size in points
*/
protected void setFontSize (int size)
{
m_font = new Font(m_font.getName(), m_font.getStyle(), size);
} // setFontSize
/*************************************************************************/
/**
* Set Current Foreground Paint
* @param paint Color, GardientPaint, TexturePaint
*/
protected void setPaint (Paint paint)
{
if (paint != null)
m_paint = paint;
} // setPaint
/**
* Get Current Foreground Paint
* @return Color, GardientPaint, TexturePaint
*/
public Paint getPaint ()
{
return m_paint;
} // getPaint
/**
* Set the alpha value (transparency) of a color - if the current paint is a Color.
* An alpha value of 255 means that the color is completely opaque
* and an alpha value of 0 means that the color is completely transparent.
* @param alpha 0 - 255
*/
protected void setPaintAlpha (int alpha)
{
if (m_paint instanceof Color)
{
Color c = (Color)m_paint;
m_paint = new Color (c.getRed(), c.getGreen(), c.getBlue(), alpha);
}
} // setPaintAlpha
/*************************************************************************/
/**
* Set Current Stroke
* @param stroke Stroke
*/
protected void setStroke (Stroke stroke)
{
if (stroke != null)
m_stroke = stroke;
} // setStroke
/**
* Get Current Stroke
* @return Stroke
*/
public Stroke getStroke()
{
return m_stroke;
} // setStroke
/*************************************************************************/
/**
* Create Standard Header/Footer
* <pre>
* title C Page x of x
* Copyright who date&time
* </pre>
*/
private void createStandardHeaderFooter()
{
// element = new ImageElement(org.compiere.Compiere.getImageLogo()); // 100x30
PrintElement element = new ImageElement(org.compiere.Compiere.getImageLogoSmall()); // 48x15
element.layout(m_header.width, 0, false, MPrintFormatItem.FIELD_ALIGN_LEADING);
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.FIELD_ALIGN_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.FIELD_ALIGN_TRAILING);
element.setLocation(m_header.getLocation());
m_headerFooter.addElement(element);
// Footer
font = tf.getPageFooter_Font();
color = tf.getPageFooterFG_Color();
//
element = new StringElement("@CopyRight@", font, color, null, true);
element.layout (m_footer.width, 0, true, MPrintFormatItem.FIELD_ALIGN_LEADING);
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.FIELD_ALIGN_CENTER);
element.setLocation(ft);
m_headerFooter.addElement(element);
//
element = new StringElement("@*CurrentDateTime@", font, color, null, true);
element.layout (m_footer.width, 0, true, MPrintFormatItem.FIELD_ALIGN_TRAILING);
element.setLocation(ft);
m_headerFooter.addElement(element);
} // createStandardHeaderFooter
/*************************************************************************/
/**
* Layout Form.
* For every Row, loop through the Format
* and calculate element size and position.
*/
private void layoutForm()
{
log.info("layoutForm");
m_columnCount = 0;
float lastHeight[] = new float[] {0f, 0f, 0f};
float lastWidth[] = new float[] {0f, 0f, 0f};
// for every row
for (int row = 0; row < m_data.getRowCount(); row++)
{
log.debug("layoutForm - Row=" + row);
m_data.setRowIndex(row);
boolean somethingPrinted = true; // prevent NL of nothing printed and supress null
// for every item
for (int i = 0; i < m_format.getItemCount(); i++)
{
MPrintFormatItem item = m_format.getItem(i);
if (!item.isPrinted())
continue;
m_columnCount++;
// Read Header/Footer just once
if (row > 0 && (item.isHeader() || item.isFooter()))
continue;
// Position
if (item.isHeader()) // Area
setArea(AREA_HEADER);
else if (item.isFooter())
setArea(AREA_FOOTER);
else
setArea(AREA_CONTENT);
//
if (item.isSetNLPosition() && item.isRelativePosition())
m_tempNLPositon = 0;
if (item.isNextPage()) // item.isPageBreak() // new page
newPage();
else if (item.isNextLine() && somethingPrinted) // new line
{
newLine ();
somethingPrinted = false;
}
else
addX(lastWidth[m_area]);
if (item.isRelativePosition())
{
addX(item.getXspace());
addY(item.getYspace());
}
else // Absolute relative position
setRelativePosition(item.getXposition(), item.getYposition());
// Temporary NL Position when absolute positioned
if (item.isSetNLPosition() && !item.isRelativePosition())
m_tempNLPositon = (int)getPosition().getX();
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -