package org.gjt.sp.jedit.print;
import java.util.Locale;
import javax.print.attribute.Attribute;
import javax.print.attribute.DocAttribute;
import javax.print.attribute.PrintJobAttribute;
import javax.print.attribute.PrintRequestAttribute;
import static javax.print.attribute.Size2DSyntax.*;
/**
* Custom printing attribute to represent page margins.
*/
public class Margins implements DocAttribute, PrintRequestAttribute, PrintJobAttribute
{
// margins are stored in micromillimeters
private float top;
private float left;
private float right;
private float bottom;
// need serial version since this is serialized
private static final long serialVersionUID = 5343792322705104289L;
/**
* @param units One of INCH or MM.
*/
public Margins( float top, float left, float right, float bottom )
{
if ( top < 0.0 || left < 0.0 || right < 0.0 || bottom < 0.0 )
{
// this shouldn't happen since the printer dialog margin text fields
// only accept positive numbers
throw new IllegalArgumentException( "Invalid margin." );
}
float u = new Integer( getUnits() ).floatValue();
this.top = top * u;
this.left = left * u;
this.right = right * u;
this.bottom = bottom * u;
}
// returns INCH or MM depending on Locale
// note that while Canada is mostly metric, Canadian paper sizes
// are essentially US ANSI sizes rounded to the nearest 5 mm
private int getUnits()
{
String country = Locale.getDefault().getCountry();
if ( "".equals( country ) || Locale.US.getCountry().equals( country ) || Locale.CANADA.getCountry().equals( country ) )
{
return INCH;
}
return MM;
}
/**
* Get the margins as an array of 4 values in the order
* top, left, right, bottom. The values returned are in the given units.
* @param units Unit conversion factor, either INCH or MM.
*
* @return margins as array of top, left, right, bottom in the specified units.
*
* @exception IllegalArgumentException on invalid units.
*/
public float[] getMargins( int units )
{
switch ( units )
{
case INCH:
case MM:
break;
default:
throw new IllegalArgumentException( "Invalid units." );
}
return new float[] {getTop( units ), getLeft( units ), getRight( units ), getBottom( units )};
}
public float getTop( int units )
{
return convertFromMicrometers( top, units );
}
public float getLeft( int units )
{
return convertFromMicrometers( left, units );
}
public float getRight( int units )
{
return convertFromMicrometers( right, units );
}
public float getBottom( int units )
{
return convertFromMicrometers( bottom, units );
}
public final Class<? extends Attribute> getCategory()
{
return Margins.class;
}
public final String getName()
{
return "margins";
}
private float convertFromMicrometers( float margin, int units )
{
return margin / new Integer( units ).floatValue();
}
public String toString()
{
return toString(INCH);
}
public String toString( int units )
{
String uom = "";
switch ( units )
{
case INCH:
uom = "in";
break;
case MM:
uom = "mm";
break;
default:
throw new IllegalArgumentException( "Invalid units." );
}
float[] margins = getMargins( units );
StringBuilder sb = new StringBuilder(128);
sb.append( "Margins(" ).append( uom ).append( ")[top:" ).append( margins[0] ).append( ", left:" );
sb.append( margins[1] ).append( ", right:" ).append( margins[2] ).append( ", bottom:" ).append( margins[3] ).append( ']' );
return sb.toString();
}
public boolean equals( Object object )
{
boolean toReturn = false;
if ( object instanceof Margins )
{
Margins margins = ( Margins )object;
if ( top == margins.top && left == margins.left && bottom == margins.bottom && right == margins.right )
{
toReturn = true;
}
}
return toReturn;
}
public int hashCode()
{
return new Float(top).intValue() + 37 * new Float(left).intValue() + 43 * new Float(right).intValue() + 47 * new Float(bottom).intValue();
}
}