/* ====================================================================
 * The Apache Software License, Version 1.1
 *
 * Copyright (c) 2003 The Apache Software Foundation.  All rights
 * reserved.
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions
 * are met:
 *
 * 1. Redistributions of source code must retain the above copyright
 *    notice, this list of conditions and the following disclaimer.
 *
 * 2. Redistributions in binary form must reproduce the above copyright
 *    notice, this list of conditions and the following disclaimer in
 *    the documentation and/or other materials provided with the
 *    distribution.
 *
 * 3. The end-user documentation included with the redistribution,
 *    if any, must include the following acknowledgment:
 *       "This product includes software developed by the
 *        Apache Software Foundation (http://www.apache.org/)."
 *    Alternately, this acknowledgment may appear in the software itself,
 *    if and wherever such third-party acknowledgments normally appear.
 *
 * 4. The names "Apache" and "Apache Software Foundation" and
 *    "Apache POI" must not be used to endorse or promote products
 *    derived from this software without prior written permission. For
 *    written permission, please contact apache@apache.org.
 *
 * 5. Products derived from this software may not be called "Apache",
 *    "Apache POI", nor may "Apache" appear in their name, without
 *    prior written permission of the Apache Software Foundation.
 *
 * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
 * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
 * DISCLAIMED.  IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
 * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
 * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
 * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
 * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
 * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
 * SUCH DAMAGE.
 * ====================================================================
 *
 * This software consists of voluntary contributions made by many
 * individuals on behalf of the Apache Software Foundation.  For more
 * information on the Apache Software Foundation, please see
 * <http://www.apache.org/>.
 */


package org.apache.poi.hssf.record;



import org.apache.poi.util.*;

/**
 * Record for the bottom margin.
 * NOTE: This source was automatically generated.
 * @author Shawn Laubach (slaubach at apache dot org)
 */
public class BottomMarginRecord
	 extends Record implements Margin
{
	 public final static short      sid                             = 0x29;
	 private  double     field_1_margin;


	 public BottomMarginRecord()
	 {

	 }

	 /**
	  * Constructs a BottomMargin record and sets its fields appropriately.
	  *
	  * @param id    id must be 0x29 or an exception
	  *              will be throw upon validation
	  * @param size  size the size of the data area of the record
	  * @param data  data of the record (should not contain sid/len)
	  */

	 public BottomMarginRecord(short id, short size, byte [] data)
	 {
		  super(id, size, data);
	 }

	 /**
	  * Constructs a BottomMargin record and sets its fields appropriately.
	  *
	  * @param id    id must be 0x29 or an exception
	  *              will be throw upon validation
	  * @param size  size the size of the data area of the record
	  * @param data  data of the record (should not contain sid/len)
	  * @param offset of the record's data
	  */

	 public BottomMarginRecord(short id, short size, byte [] data, int offset)
	 {
		  super(id, size, data, offset);
	 }

	 /**
	  * Checks the sid matches the expected side for this record
	  *
	  * @param id   the expected sid.
	  */
	 protected void validateSid(short id)
	 {
		  if (id != sid)
		  {
				throw new RecordFormatException("Not a BottomMargin record");
		  }
	 }

	 protected void fillFields(byte [] data, short size, int offset)
	 {
		  field_1_margin                  = LittleEndian.getDouble(data, 0x0 + offset);

	 }

	 public String toString()
	 {
		  StringBuffer buffer = new StringBuffer();

		  buffer.append("[BottomMargin]\n");

		  buffer.append("    .margin               = ")
				.append(" (").append(getMargin()).append(" )\n");

		  buffer.append("[/BottomMargin]\n");
		  return buffer.toString();
	 }

	 public int serialize(int offset, byte[] data)
	 {
		  LittleEndian.putShort(data, 0 + offset, sid);
		  LittleEndian.putShort(data, 2 + offset, (short)(getRecordSize() - 4));

		  LittleEndian.putDouble(data, 4 + offset, field_1_margin);

		  return getRecordSize();
	 }

	 /**
	  * Size of record (exluding 4 byte header)
	  */
	 public int getRecordSize()
	 {
		  return 4  + 8;
	 }

	 public short getSid()
	 {
		  return this.sid;
	 }


	 /**
	  * Get the margin field for the BottomMargin record.
	  */
	 public double getMargin()
	 {
		  return field_1_margin;
	 }

	 /**
	  * Set the margin field for the BottomMargin record.
	  */
	 public void setMargin(double field_1_margin)
	 {
		  this.field_1_margin = field_1_margin;
	 }
    
	  public Object clone() {
		  BottomMarginRecord rec = new BottomMarginRecord();
		  rec.field_1_margin = this.field_1_margin;
		  return rec;
	 }


}  // END OF CLASS