root/libcore/swf/DefineEditTextTag.cpp

/* [<][>][^][v][top][bottom][index][help] */

DEFINITIONS

This source file includes following definitions.
  1. loader
  2. createDisplayObject
  3. read
  4. _leading

// 
//   Copyright (C) 2007, 2008, 2009, 2010, 2011 Free Software Foundation, Inc.
// 
// This program is free software; you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation; either version 3 of the License, or
// (at your option) any later version.
// 
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
// GNU General Public License for more details.
// 
// You should have received a copy of the GNU General Public License
// along with this program; if not, write to the Free Software
// Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA

#include "DefineEditTextTag.h"

#include "TypesParser.h"
#include "RunResources.h"
#include "TextField_as.h"
#include "TextField.h"
#include "movie_definition.h"
#include "Font.h"
#include "SWFStream.h"
#include "Global_as.h"

namespace gnash {
namespace SWF {

void
DefineEditTextTag::loader(SWFStream& in, TagType tag, movie_definition& m,
        const RunResources& /*r*/)
{
        assert(tag == SWF::DEFINEEDITTEXT); // 37

    in.ensureBytes(2);
    const boost::uint16_t id = in.read_u16();

    std::auto_ptr<DefineEditTextTag> editText(new DefineEditTextTag(in, m, id));

    m.addDisplayObject(id, editText.release());
}

DisplayObject*
DefineEditTextTag::createDisplayObject(Global_as& gl, DisplayObject* parent)
    const
{
        // Resolve the font, if possible
        getFont();
    as_object* obj = createTextFieldObject(gl);

    // If the TextField class is not present, the construction of a TextField
    // object will fail.
    // TODO: check what happens in this case (when the TextField class is
    // removed before this tag is processed).
    if (!obj) {
        // Note that it is expected that createDisplayObject() always returns
        // a DisplayObject and not null.
        log_error("Failed to construct a TextField object; using"
                "a substitute object");
        obj = new as_object(gl);
    }

        TextField* ch = new TextField(obj, parent, *this);

        return ch;
}


void
DefineEditTextTag::read(SWFStream& in, movie_definition& m)
{

        _rect = readRect(in);

        in.align();
        in.ensureBytes(2);
    
    int flags = in.read_u8();
        _hasText  = flags & (1 << 7);
        _wordWrap = flags & (1 << 6);
        _multiline = flags & (1 << 5);
        _password  = flags & (1 << 4);
        _readOnly  = flags & (1 << 3); 

    const bool hasColor = flags & (1 << 2); 
        const bool hasMaxChars = flags & (1 << 1); 
        const bool hasFont = flags & (1 << 0); 

    flags = in.read_u8();
        // 0: no font class, 1 font class and height, can't be true if has_font was true
        bool hasFontClass = flags & (1 << 7);
        if (hasFontClass && hasFont )
        {
                IF_VERBOSE_MALFORMED_SWF(
                    log_swferror("DefineEditText: hasFontClass can't be true if "
                "hasFont is true, ignoring");
                );
                hasFontClass = false;
        }

        _autoSize = flags & (1 << 6); 
        bool hasLayout = flags & (1 << 5); 
        _noSelect = flags & (1 << 4); 
        _border = flags & (1 << 3);

    // authored as static text (not dynamic text)
        bool wasStatic = flags & (1 << 2);

    // TODO: what is this for?
    UNUSED(wasStatic);

    _html = flags & (1 << 1); 
        _useOutlines = flags & (1 << 0); 

        if (hasFont)
        {
                in.ensureBytes(4);
                _fontID = in.read_u16();
                _font = m.get_font(_fontID);
                if (!_font)
                {
            IF_VERBOSE_MALFORMED_SWF(
                            log_swferror("DefineEditText: tag refers to unknown font "
                    "id %d", _fontID);
                        );
                }
        _textHeight = in.read_u16();
        }
        else if (hasFontClass)
        {
                std::string fontClassName;
                in.read_string(fontClassName);
                log_unimpl("Font class support for DefineEditText (%d)",
                fontClassName);
        }
        
        if (hasColor) {
                _color = readRGBA(in);
        }

        if (hasMaxChars)
        {
                in.ensureBytes(2);
                _maxChars = in.read_u16();
        }

        if (hasLayout)
        {
                in.ensureBytes(9); //1 + 2 + 2 + 2 + 2
                _alignment = static_cast<TextField::TextAlignment>(in.read_u8());
                _leftMargin = in.read_u16();
                _rightMargin = in.read_u16();
                _indent = in.read_s16();
                _leading = in.read_s16();
        }

        in.read_string(_variableName);

        if (_hasText)
        {
                in.read_string(_defaultText);
        }

        IF_VERBOSE_PARSE (
                log_parse("edit_text_char:\n"
                        " varname = %s\n"
                        " text = \"%s\"\n"
                        " font_id: %d\n"
                        " text_height: %d",
                        _variableName, _defaultText, _fontID, _textHeight);
        );
}

DefineEditTextTag::DefineEditTextTag(SWFStream& in, movie_definition& m,
        boost::uint16_t id)
    :
    DefinitionTag(id),
        _hasText(true),
        _wordWrap(false),
        _multiline(false),
        _password(false),
        _readOnly(true),
        _autoSize(false),
        _noSelect(false),
        _border(false),
        _html(false),
        _useOutlines(false),
        _fontID(-1),
        _textHeight(240),
        _maxChars(0),
        _alignment(TextField::ALIGN_LEFT),
        _leftMargin(0),
        _rightMargin(0),
        _indent(0),
        _leading(0)
{
        _color.set(0, 0, 0, 255);
    
    // Parse the tag from the stream.
    read(in, m);
}

}
}

/* [<][>][^][v][top][bottom][index][help] */