/*
 *  ====================================================================
 * Licensed to the Apache Software Foundation (ASF) under one or more
 * contributor license agreements.  See the NOTICE file distributed with
 * this work for additional information regarding copyright ownership.
 * The ASF licenses this file to You under the Apache License, Version 2.0
 * (the "License"); you may not use this file except in compliance with
 * the License.  You may obtain a copy of the License at
 *
 * http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 * ====================================================================
 */

package org.apache.poi.hwpf.model;

import java.util.Locale;

import org.apache.poi.util.Internal;

/**
 * Structure describing the Plex for fields (contained plclfd* in the spec).
 */
@Internal
public class PlexOfField
{

    private final GenericPropertyNode propertyNode;
    private final FieldDescriptor fld;

    @Deprecated
    public PlexOfField( int fcStart, int fcEnd, byte[] data )
    {
        propertyNode = new GenericPropertyNode( fcStart, fcEnd, data );
        fld = new FieldDescriptor( data );
    }

    public PlexOfField( GenericPropertyNode propertyNode )
    {
        this.propertyNode = propertyNode;
        fld = new FieldDescriptor( propertyNode.getBytes() );
    }

    public int getFcStart()
    {
        return propertyNode.getStart();
    }

    public int getFcEnd()
    {
        return propertyNode.getEnd();
    }

    public FieldDescriptor getFld()
    {
        return fld;
    }

    public String toString() {
        return String.format(Locale.ROOT, "[%d, %d) - FLD - 0x%x; 0x%x"
            , getFcStart(), getFcEnd(), fld.getBoundaryType(), fld.getFlt());
    }
}
