Merge remote-tracking branch 'upstream/develop' into ryzomcore
This commit is contained in:
commit
520b8d1bb9
264 changed files with 9421 additions and 7446 deletions
24
code/.clang-format
Normal file
24
code/.clang-format
Normal file
|
@ -0,0 +1,24 @@
|
||||||
|
---
|
||||||
|
BasedOnStyle: WebKit
|
||||||
|
AllowShortFunctionsOnASingleLine: All
|
||||||
|
BraceWrapping:
|
||||||
|
AfterClass: true
|
||||||
|
AfterControlStatement: true
|
||||||
|
AfterEnum: true
|
||||||
|
AfterFunction: true
|
||||||
|
AfterNamespace: true
|
||||||
|
AfterObjCDeclaration: true
|
||||||
|
AfterStruct: true
|
||||||
|
AfterUnion: true
|
||||||
|
BeforeCatch: true
|
||||||
|
BeforeElse: true
|
||||||
|
IndentBraces: false
|
||||||
|
BreakBeforeBraces: Custom
|
||||||
|
BreakConstructorInitializersBeforeComma: 'false'
|
||||||
|
NamespaceIndentation: None
|
||||||
|
PointerAlignment: Right
|
||||||
|
SortIncludes: 'false'
|
||||||
|
TabWidth: '4'
|
||||||
|
UseTab: ForIndentation
|
||||||
|
|
||||||
|
...
|
23
code/.editorconfig
Normal file
23
code/.editorconfig
Normal file
|
@ -0,0 +1,23 @@
|
||||||
|
; Top-most EditorConfig file
|
||||||
|
root = true
|
||||||
|
|
||||||
|
; 4-column tab indentation
|
||||||
|
[*.cpp]
|
||||||
|
indent_style = tab
|
||||||
|
indent_size = 4
|
||||||
|
|
||||||
|
[*.c]
|
||||||
|
indent_style = tab
|
||||||
|
indent_size = 4
|
||||||
|
|
||||||
|
[*.h]
|
||||||
|
indent_style = tab
|
||||||
|
indent_size = 4
|
||||||
|
|
||||||
|
[*.py]
|
||||||
|
indent_style = tab
|
||||||
|
indent_size = 4
|
||||||
|
|
||||||
|
[*.config]
|
||||||
|
indent_style = space
|
||||||
|
indent_size = 2
|
|
@ -11,18 +11,56 @@ if(MAXSDK_INCLUDE_DIR)
|
||||||
SET(MAXSDK_FIND_QUIETLY TRUE)
|
SET(MAXSDK_FIND_QUIETLY TRUE)
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
|
set(_pf_x86 "PROGRAMFILES(x86)")
|
||||||
|
|
||||||
FIND_PATH(MAXSDK_DIR
|
FIND_PATH(MAXSDK_DIR
|
||||||
"include/maxversion.h"
|
"include/maxversion.h"
|
||||||
HINTS
|
HINTS
|
||||||
"$ENV{MAXSDK_DIR}"
|
"$ENV{MAXSDK_DIR}"
|
||||||
PATHS
|
PATHS
|
||||||
|
"$ENV{ADSK_3DSMAX_SDK_2021}/maxsdk"
|
||||||
|
"$ENV{ADSK_3DSMAX_SDK_2020}/maxsdk"
|
||||||
|
"$ENV{ADSK_3DSMAX_SDK_2019}/maxsdk"
|
||||||
|
"$ENV{ADSK_3DSMAX_SDK_2018}/maxsdk"
|
||||||
|
"$ENV{ADSK_3DSMAX_SDK_2017}/maxsdk"
|
||||||
|
"$ENV{ADSK_3DSMAX_SDK_2016}/maxsdk"
|
||||||
|
"$ENV{ADSK_3DSMAX_SDK_2015}/maxsdk"
|
||||||
|
"$ENV{ADSK_3DSMAX_SDK_2014}/maxsdk"
|
||||||
|
"$ENV{ADSK_3DSMAX_SDK_2013}/maxsdk"
|
||||||
"$ENV{ADSK_3DSMAX_SDK_2012}/maxsdk"
|
"$ENV{ADSK_3DSMAX_SDK_2012}/maxsdk"
|
||||||
"$ENV{3DSMAX_2011_SDK_PATH}/maxsdk"
|
"$ENV{3DSMAX_2011_SDK_PATH}/maxsdk"
|
||||||
|
"$ENV{${_pf_x86}}/Autodesk/3ds Max 2021 SDK/maxsdk"
|
||||||
|
"$ENV{${_pf_x86}}/Autodesk/3ds Max 2020 SDK/maxsdk"
|
||||||
|
"$ENV{${_pf_x86}}/Autodesk/3ds Max 2019 SDK/maxsdk"
|
||||||
|
"$ENV{${_pf_x86}}/Autodesk/3ds Max 2018 SDK/maxsdk"
|
||||||
|
"$ENV{${_pf_x86}}/Autodesk/3ds Max 2017 SDK/maxsdk"
|
||||||
|
"$ENV{${_pf_x86}}/Autodesk/3ds Max 2016 SDK/maxsdk"
|
||||||
|
"$ENV{${_pf_x86}}/Autodesk/3ds Max 2015 SDK/maxsdk"
|
||||||
|
"$ENV{${_pf_x86}}/Autodesk/3ds Max 2014 SDK/maxsdk"
|
||||||
|
"$ENV{${_pf_x86}}/Autodesk/3ds Max 2013 SDK/maxsdk"
|
||||||
|
"$ENV{${_pf_x86}}/Autodesk/3ds Max 2012 SDK/maxsdk"
|
||||||
|
"$ENV{${_pf_x86}}/Autodesk/3ds Max 2011 SDK/maxsdk"
|
||||||
|
"$ENV{${_pf_x86}}/Autodesk/3ds Max 2010 SDK/maxsdk"
|
||||||
|
"$ENV{${_pf_x86}}/Autodesk/3ds Max 2009 SDK/maxsdk"
|
||||||
|
"$ENV{${_pf_x86}}/Autodesk/3ds Max 2008 SDK/maxsdk"
|
||||||
|
"$ENV{${_pf_x86}}/Autodesk/3ds Max 9 SDK/maxsdk"
|
||||||
|
"$ENV{${_pf_x86}}/Autodesk/3dsMax8/maxsdk"
|
||||||
|
"$ENV{PROGRAMFILES}/Autodesk/3ds Max 2021 SDK/maxsdk"
|
||||||
|
"$ENV{PROGRAMFILES}/Autodesk/3ds Max 2020 SDK/maxsdk"
|
||||||
|
"$ENV{PROGRAMFILES}/Autodesk/3ds Max 2019 SDK/maxsdk"
|
||||||
|
"$ENV{PROGRAMFILES}/Autodesk/3ds Max 2018 SDK/maxsdk"
|
||||||
"$ENV{PROGRAMFILES}/Autodesk/3ds Max 2017 SDK/maxsdk"
|
"$ENV{PROGRAMFILES}/Autodesk/3ds Max 2017 SDK/maxsdk"
|
||||||
|
"$ENV{PROGRAMFILES}/Autodesk/3ds Max 2016 SDK/maxsdk"
|
||||||
|
"$ENV{PROGRAMFILES}/Autodesk/3ds Max 2015 SDK/maxsdk"
|
||||||
|
"$ENV{PROGRAMFILES}/Autodesk/3ds Max 2014 SDK/maxsdk"
|
||||||
|
"$ENV{PROGRAMFILES}/Autodesk/3ds Max 2013 SDK/maxsdk"
|
||||||
|
"$ENV{PROGRAMFILES}/Autodesk/3ds Max 2012 SDK/maxsdk"
|
||||||
|
"$ENV{PROGRAMFILES}/Autodesk/3ds Max 2011 SDK/maxsdk"
|
||||||
"$ENV{PROGRAMFILES}/Autodesk/3ds Max 2010 SDK/maxsdk"
|
"$ENV{PROGRAMFILES}/Autodesk/3ds Max 2010 SDK/maxsdk"
|
||||||
"$ENV{PROGRAMFILES}/Autodesk/3ds Max 2009 SDK/maxsdk"
|
"$ENV{PROGRAMFILES}/Autodesk/3ds Max 2009 SDK/maxsdk"
|
||||||
"$ENV{PROGRAMFILES}/Autodesk/3ds Max 2008 SDK/maxsdk"
|
"$ENV{PROGRAMFILES}/Autodesk/3ds Max 2008 SDK/maxsdk"
|
||||||
"$ENV{PROGRAMFILES}/Autodesk/3ds Max 9 SDK/maxsdk"
|
"$ENV{PROGRAMFILES}/Autodesk/3ds Max 9 SDK/maxsdk"
|
||||||
|
"$ENV{PROGRAMFILES}/Autodesk/3dsMax8/maxsdk"
|
||||||
)
|
)
|
||||||
|
|
||||||
FIND_PATH(MAXSDK_INCLUDE_DIR
|
FIND_PATH(MAXSDK_INCLUDE_DIR
|
||||||
|
|
|
@ -16,10 +16,12 @@ IF(MYSQL_INCLUDE_DIR AND MYSQL_LIBRARIES)
|
||||||
ELSE()
|
ELSE()
|
||||||
|
|
||||||
FIND_PATH(MYSQL_INCLUDE_DIR mysql.h
|
FIND_PATH(MYSQL_INCLUDE_DIR mysql.h
|
||||||
PATH_SUFFIXES mysql
|
PATH_SUFFIXES mysql mariadb
|
||||||
PATHS
|
PATHS
|
||||||
/usr/include/mysql
|
/usr/include/mysql
|
||||||
|
/usr/include/mariadb
|
||||||
/usr/local/include/mysql
|
/usr/local/include/mysql
|
||||||
|
/usr/local/include/mariadb
|
||||||
/opt/local/include/mysql5/mysql
|
/opt/local/include/mysql5/mysql
|
||||||
/opt/local/include/mysql55/mysql
|
/opt/local/include/mysql55/mysql
|
||||||
/opt/local/include/mysql51/mysql
|
/opt/local/include/mysql51/mysql
|
||||||
|
@ -27,28 +29,29 @@ ELSE()
|
||||||
$ENV{SystemDrive}/MySQL/*/include)
|
$ENV{SystemDrive}/MySQL/*/include)
|
||||||
|
|
||||||
IF(WIN32 AND MSVC)
|
IF(WIN32 AND MSVC)
|
||||||
FIND_LIBRARY(MYSQL_LIBRARY_RELEASE NAMES libmysql mysqlclient
|
FIND_LIBRARY(MYSQL_LIBRARY_RELEASE NAMES libmysql mysqlclient libmariadb mariadbclient
|
||||||
PATHS
|
PATHS
|
||||||
$ENV{ProgramFiles}/MySQL/*/lib/opt
|
$ENV{ProgramFiles}/MySQL/*/lib/opt
|
||||||
$ENV{SystemDrive}/MySQL/*/lib/opt)
|
$ENV{SystemDrive}/MySQL/*/lib/opt)
|
||||||
|
FIND_LIBRARY(MYSQL_LIBRARY_DEBUG NAMES libmysqld mysqlclientd libmariadb mariadbclient
|
||||||
FIND_LIBRARY(MYSQL_LIBRARY_DEBUG NAMES libmysqld mysqlclientd
|
|
||||||
PATHS
|
PATHS
|
||||||
$ENV{ProgramFiles}/MySQL/*/lib/opt
|
$ENV{ProgramFiles}/MySQL/*/lib/opt
|
||||||
$ENV{SystemDrive}/MySQL/*/lib/opt)
|
$ENV{SystemDrive}/MySQL/*/lib/opt)
|
||||||
ELSE()
|
ELSE()
|
||||||
FIND_LIBRARY(MYSQL_LIBRARY_RELEASE NAMES mysqlclient
|
FIND_LIBRARY(MYSQL_LIBRARY_RELEASE NAMES mysqlclient mariadbclient
|
||||||
PATHS
|
PATHS
|
||||||
/usr/lib
|
/usr/lib
|
||||||
/usr/local/lib
|
/usr/local/lib
|
||||||
|
/usr/lib/mariadb
|
||||||
/usr/lib/mysql
|
/usr/lib/mysql
|
||||||
/usr/local/lib/mysql
|
/usr/local/lib/mysql
|
||||||
|
/usr/local/lib/mariadb
|
||||||
/opt/local/lib/mysql5/mysql
|
/opt/local/lib/mysql5/mysql
|
||||||
/opt/local/lib/mysql55/mysql
|
/opt/local/lib/mysql55/mysql
|
||||||
/opt/local/lib/mysql51/mysql
|
/opt/local/lib/mysql51/mysql
|
||||||
)
|
)
|
||||||
|
|
||||||
FIND_LIBRARY(MYSQL_LIBRARY_DEBUG NAMES mysqlclientd
|
FIND_LIBRARY(MYSQL_LIBRARY_DEBUG NAMES mysqlclientd mariadbclientd
|
||||||
PATHS
|
PATHS
|
||||||
/usr/lib
|
/usr/lib
|
||||||
/usr/local/lib
|
/usr/local/lib
|
||||||
|
@ -80,6 +83,10 @@ ELSE()
|
||||||
IF(MYSQL_INCLUDE_DIR AND MYSQL_LIBRARIES)
|
IF(MYSQL_INCLUDE_DIR AND MYSQL_LIBRARIES)
|
||||||
SET(MYSQL_FOUND TRUE)
|
SET(MYSQL_FOUND TRUE)
|
||||||
MESSAGE(STATUS "Found MySQL: ${MYSQL_INCLUDE_DIR}, ${MYSQL_LIBRARIES}")
|
MESSAGE(STATUS "Found MySQL: ${MYSQL_INCLUDE_DIR}, ${MYSQL_LIBRARIES}")
|
||||||
|
IF (MYSQL_LIBRARIES MATCHES "libmariadb" OR MYSQL_LIBRARIES MATCHES "mariadbclient")
|
||||||
|
SET(MARIADB_FOUND TRUE)
|
||||||
|
MESSAGE(STATUS "Found MariaDB.")
|
||||||
|
ENDIF()
|
||||||
ELSE()
|
ELSE()
|
||||||
SET(MYSQL_FOUND FALSE)
|
SET(MYSQL_FOUND FALSE)
|
||||||
MESSAGE(STATUS "MySQL not found.")
|
MESSAGE(STATUS "MySQL not found.")
|
||||||
|
|
|
@ -568,6 +568,11 @@ MACRO(NL_SETUP_BUILD)
|
||||||
ADD_PLATFORM_FLAGS("-DENABLE_LOGS")
|
ADD_PLATFORM_FLAGS("-DENABLE_LOGS")
|
||||||
ENDIF()
|
ENDIF()
|
||||||
|
|
||||||
|
SET(CUSTOM_FLAGS "" CACHE STRING "Custom compile flags (useful for /MPn)")
|
||||||
|
IF(NOT ${CUSTOM_FLAGS} STREQUAL "")
|
||||||
|
ADD_PLATFORM_FLAGS(${CUSTOM_FLAGS})
|
||||||
|
ENDIF()
|
||||||
|
|
||||||
IF(MSVC)
|
IF(MSVC)
|
||||||
# Ignore default include paths
|
# Ignore default include paths
|
||||||
ADD_PLATFORM_FLAGS("/X")
|
ADD_PLATFORM_FLAGS("/X")
|
||||||
|
|
150
code/nel/include/nel/gui/css_parser.h
Normal file
150
code/nel/include/nel/gui/css_parser.h
Normal file
|
@ -0,0 +1,150 @@
|
||||||
|
// Ryzom - MMORPG Framework <http://dev.ryzom.com/projects/ryzom/>
|
||||||
|
// Copyright (C) 2010 Winch Gate Property Limited
|
||||||
|
//
|
||||||
|
// This program is free software: you can redistribute it and/or modify
|
||||||
|
// it under the terms of the GNU Affero 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 Affero General Public License for more details.
|
||||||
|
//
|
||||||
|
// You should have received a copy of the GNU Affero General Public License
|
||||||
|
// along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
|
||||||
|
#ifndef CL_CSS_PARSER_H
|
||||||
|
#define CL_CSS_PARSER_H
|
||||||
|
|
||||||
|
#include "nel/misc/types_nl.h"
|
||||||
|
#include "nel/gui/css_style.h"
|
||||||
|
#include "nel/gui/css_selector.h"
|
||||||
|
|
||||||
|
namespace NLGUI
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* \brief CSS style parsing
|
||||||
|
* \date 2019-03-15 10:50 GMT
|
||||||
|
* \author Meelis Mägi (Nimetu)
|
||||||
|
*/
|
||||||
|
class CCssParser {
|
||||||
|
public:
|
||||||
|
// parse style declaration, eg "color: red; font-size: 10px;"
|
||||||
|
static TStyle parseDecls(const std::string &styleString);
|
||||||
|
|
||||||
|
// parse css stylesheet
|
||||||
|
void parseStylesheet(const std::string &cssString, std::vector<CCssStyle::SStyleRule> &rules);
|
||||||
|
|
||||||
|
private:
|
||||||
|
// stylesheet currently parsed
|
||||||
|
ucstring _Style;
|
||||||
|
// keep track of current position in _Style
|
||||||
|
size_t _Position;
|
||||||
|
|
||||||
|
std::vector<CCssStyle::SStyleRule> _Rules;
|
||||||
|
|
||||||
|
private:
|
||||||
|
// @media ( .. ) { .. }
|
||||||
|
void readAtRule();
|
||||||
|
|
||||||
|
// a#id.class[attr=val] { .. }
|
||||||
|
void readRule();
|
||||||
|
|
||||||
|
// move past whitespace
|
||||||
|
void skipWhitespace();
|
||||||
|
|
||||||
|
// skip valid IDENT
|
||||||
|
bool skipIdentifier();
|
||||||
|
|
||||||
|
// skip over {}, (), or [] block
|
||||||
|
void skipBlock();
|
||||||
|
|
||||||
|
// skip over string quoted with ' or "
|
||||||
|
void skipString();
|
||||||
|
|
||||||
|
// backslash escape
|
||||||
|
void escape();
|
||||||
|
|
||||||
|
// normalize newline chars and remove comments
|
||||||
|
void preprocess();
|
||||||
|
|
||||||
|
// parse selectors + combinators
|
||||||
|
std::vector<CCssSelector> parse_selector(const ucstring &sel, std::string &pseudoElement) const;
|
||||||
|
|
||||||
|
// parse selector and style
|
||||||
|
void parseRule(const ucstring &selectorString, const ucstring &styleString);
|
||||||
|
|
||||||
|
inline bool is_eof() const
|
||||||
|
{
|
||||||
|
return _Position >= _Style.size();
|
||||||
|
}
|
||||||
|
|
||||||
|
inline bool is_whitespace(ucchar ch) const
|
||||||
|
{
|
||||||
|
return (ch == (ucchar)' ' || ch == (ucchar)'\t' || ch == (ucchar)'\n');
|
||||||
|
}
|
||||||
|
|
||||||
|
inline bool is_hex(ucchar ch) const
|
||||||
|
{
|
||||||
|
return ((ch >= (ucchar)'0' && ch <= (ucchar)'9') ||
|
||||||
|
(ch >= (ucchar)'a' && ch <= (ucchar)'f') ||
|
||||||
|
(ch >= (ucchar)'A' && ch <= (ucchar)'F'));
|
||||||
|
}
|
||||||
|
|
||||||
|
inline bool maybe_escape() const
|
||||||
|
{
|
||||||
|
// escaping newline (\n) only allowed inside strings
|
||||||
|
return (_Style.size() - _Position) >= 1 && _Style[_Position] == (ucchar)'\\' && _Style[_Position+1] != '\n';
|
||||||
|
}
|
||||||
|
|
||||||
|
inline bool is_quote(ucchar ch) const
|
||||||
|
{
|
||||||
|
return ch== (ucchar)'"' || ch == (ucchar)'\'';
|
||||||
|
}
|
||||||
|
|
||||||
|
inline bool is_block_open(ucchar ch) const
|
||||||
|
{
|
||||||
|
return ch == (ucchar)'{' || ch == (ucchar)'[' || ch == (ucchar)'(';
|
||||||
|
}
|
||||||
|
|
||||||
|
inline bool is_block_close(ucchar ch, ucchar open) const
|
||||||
|
{
|
||||||
|
return ((open == '{' && ch == (ucchar)'}') ||
|
||||||
|
(open == '[' && ch == (ucchar)']') ||
|
||||||
|
(open == '(' && ch == (ucchar)')'));
|
||||||
|
}
|
||||||
|
|
||||||
|
inline bool is_comment_open() const
|
||||||
|
{
|
||||||
|
if (_Position+1 > _Style.size())
|
||||||
|
return false;
|
||||||
|
|
||||||
|
return _Style[_Position] == (ucchar)'/' && _Style[_Position+1] == (ucchar)'*';
|
||||||
|
}
|
||||||
|
|
||||||
|
inline bool is_nonascii(ucchar ch) const
|
||||||
|
{
|
||||||
|
return ch >= 0x80 /*&& ch <= 255*/;
|
||||||
|
}
|
||||||
|
|
||||||
|
inline bool is_alpha(ucchar ch) const
|
||||||
|
{
|
||||||
|
return (ch >= 'a' && ch <= 'z') || (ch >= 'A' && ch <= 'Z');
|
||||||
|
}
|
||||||
|
|
||||||
|
inline bool is_digit(ucchar ch) const
|
||||||
|
{
|
||||||
|
return ch >= '0' && ch <= '9';
|
||||||
|
}
|
||||||
|
|
||||||
|
inline bool is_nmchar(ucchar ch) const
|
||||||
|
{
|
||||||
|
// checking escape here does not check if next char is '\n' or not
|
||||||
|
return ch == '_' || ch == '-' || is_alpha(ch) || is_digit(ch) || is_nonascii(ch) || ch == '\\'/*is_escape(ch)*/;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
}//namespace
|
||||||
|
|
||||||
|
#endif // CL_CSS_PARSER_H
|
||||||
|
|
107
code/nel/include/nel/gui/css_selector.h
Normal file
107
code/nel/include/nel/gui/css_selector.h
Normal file
|
@ -0,0 +1,107 @@
|
||||||
|
// Ryzom - MMORPG Framework <http://dev.ryzom.com/projects/ryzom/>
|
||||||
|
// Copyright (C) 2010 Winch Gate Property Limited
|
||||||
|
//
|
||||||
|
// This program is free software: you can redistribute it and/or modify
|
||||||
|
// it under the terms of the GNU Affero 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 Affero General Public License for more details.
|
||||||
|
//
|
||||||
|
// You should have received a copy of the GNU Affero General Public License
|
||||||
|
// along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
|
||||||
|
#ifndef CL_CSS_SELECTOR_H
|
||||||
|
#define CL_CSS_SELECTOR_H
|
||||||
|
|
||||||
|
#include "nel/misc/types_nl.h"
|
||||||
|
|
||||||
|
namespace NLGUI
|
||||||
|
{
|
||||||
|
class CHtmlElement;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \brief CSS selector
|
||||||
|
* \date 2019-03-15 10:50 GMT
|
||||||
|
* \author Meelis Mägi (Nimetu)
|
||||||
|
*/
|
||||||
|
class CCssSelector
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
enum ECombinator {
|
||||||
|
NONE = 0,
|
||||||
|
GENERAL_CHILD,
|
||||||
|
ADJACENT_SIBLING,
|
||||||
|
GENERAL_SIBLING,
|
||||||
|
CHILD_OF
|
||||||
|
};
|
||||||
|
|
||||||
|
struct SAttribute {
|
||||||
|
std::string key;
|
||||||
|
std::string value;
|
||||||
|
char op; // =, ~, |, ^, $, *
|
||||||
|
SAttribute(const std::string &k, const std::string &v, char o)
|
||||||
|
:key(k),value(v),op(o)
|
||||||
|
{}
|
||||||
|
};
|
||||||
|
|
||||||
|
std::string Element;
|
||||||
|
std::string Id;
|
||||||
|
std::vector<std::string> Class;
|
||||||
|
std::vector<SAttribute> Attr;
|
||||||
|
std::vector<std::string> PseudoClass;
|
||||||
|
|
||||||
|
// css combinator or \0 missing (first element)
|
||||||
|
char Combinator;
|
||||||
|
|
||||||
|
public:
|
||||||
|
// TODO: rewrite for ECombinator enum
|
||||||
|
CCssSelector(std::string elm="", std::string id="", std::string cls="", char comb = '\0');
|
||||||
|
|
||||||
|
// helper for sorting
|
||||||
|
uint32 specificity() const;
|
||||||
|
|
||||||
|
// set classes used, eg 'class1 class2'
|
||||||
|
void setClass(const std::string &cls);
|
||||||
|
|
||||||
|
// add attribute to selector
|
||||||
|
// ' ' op means 'key exists, ignore value'
|
||||||
|
void addAttribute(const std::string &key, const std::string &val = "", char op = ' ');
|
||||||
|
|
||||||
|
// add pseudo class to selector, eg 'first-child'
|
||||||
|
void addPseudoClass(const std::string &key);
|
||||||
|
|
||||||
|
// true if no rules have been defined
|
||||||
|
bool empty() const
|
||||||
|
{
|
||||||
|
return Element.empty() && Id.empty() && Class.empty() && Attr.empty() && PseudoClass.empty();
|
||||||
|
}
|
||||||
|
|
||||||
|
// Test current selector to html DOM element
|
||||||
|
// NOTE: Does not check combinator
|
||||||
|
bool match(const CHtmlElement &elm) const;
|
||||||
|
|
||||||
|
private:
|
||||||
|
bool matchClass(const CHtmlElement &elm) const;
|
||||||
|
bool matchAttributes(const CHtmlElement &elm) const;
|
||||||
|
bool matchPseudoClass(const CHtmlElement &elm) const;
|
||||||
|
|
||||||
|
// match An+B rule to child index (1 based)
|
||||||
|
bool matchNth(sint childNr, sint a, sint b) const;
|
||||||
|
|
||||||
|
// parse nth-child string to 'a' and 'b' components
|
||||||
|
// :nth-child(odd)
|
||||||
|
// :nth-child(even)
|
||||||
|
// :nth-child(An+B)
|
||||||
|
// :nth-child(-An+b)
|
||||||
|
void parseNth(const std::string &pseudo, sint &a, sint &b) const;
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
|
}//namespace
|
||||||
|
|
||||||
|
#endif // CL_CSS_SELECTOR_H
|
||||||
|
|
227
code/nel/include/nel/gui/css_style.h
Normal file
227
code/nel/include/nel/gui/css_style.h
Normal file
|
@ -0,0 +1,227 @@
|
||||||
|
// Ryzom - MMORPG Framework <http://dev.ryzom.com/projects/ryzom/>
|
||||||
|
// Copyright (C) 2010 Winch Gate Property Limited
|
||||||
|
//
|
||||||
|
// This program is free software: you can redistribute it and/or modify
|
||||||
|
// it under the terms of the GNU Affero 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 Affero General Public License for more details.
|
||||||
|
//
|
||||||
|
// You should have received a copy of the GNU Affero General Public License
|
||||||
|
// along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
|
||||||
|
#ifndef CL_CSS_STYLE_H
|
||||||
|
#define CL_CSS_STYLE_H
|
||||||
|
|
||||||
|
#include "nel/misc/types_nl.h"
|
||||||
|
#include "nel/misc/rgba.h"
|
||||||
|
#include "nel/gui/css_selector.h"
|
||||||
|
|
||||||
|
namespace NLGUI
|
||||||
|
{
|
||||||
|
class CHtmlElement;
|
||||||
|
|
||||||
|
typedef std::map<std::string, std::string> TStyle;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \brief CSS style rules
|
||||||
|
* \date 2019-03-15 10:50 GMT
|
||||||
|
* \author Meelis Mägi (Nimetu)
|
||||||
|
*/
|
||||||
|
class CStyleParams
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
struct STextShadow
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
STextShadow(bool enabled = false, bool outline = false, sint32 x=1, sint32 y=1, NLMISC::CRGBA color=NLMISC::CRGBA::Black)
|
||||||
|
: Enabled(enabled), Outline(outline), X(x), Y(y), Color(color)
|
||||||
|
{ }
|
||||||
|
|
||||||
|
bool Enabled;
|
||||||
|
bool Outline;
|
||||||
|
sint32 X;
|
||||||
|
sint32 Y;
|
||||||
|
NLMISC::CRGBA Color;
|
||||||
|
};
|
||||||
|
public:
|
||||||
|
CStyleParams () : FontFamily(""), TextColor(255,255,255,255), TextShadow()
|
||||||
|
{
|
||||||
|
FontSize=10;
|
||||||
|
FontWeight=400;
|
||||||
|
FontOblique=false;
|
||||||
|
Underlined=false;
|
||||||
|
StrikeThrough=false;
|
||||||
|
GlobalColor=false;
|
||||||
|
Width=-1;
|
||||||
|
Height=-1;
|
||||||
|
MaxWidth=-1;
|
||||||
|
MaxHeight=-1;
|
||||||
|
BorderWidth=1;
|
||||||
|
BackgroundColor=NLMISC::CRGBA::Black;
|
||||||
|
BackgroundColorOver=NLMISC::CRGBA::Black;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool hasStyle(const std::string &key) const
|
||||||
|
{
|
||||||
|
return StyleRules.find(key) != StyleRules.end();
|
||||||
|
}
|
||||||
|
|
||||||
|
std::string getStyle(const std::string &key) const
|
||||||
|
{
|
||||||
|
TStyle::const_iterator it = StyleRules.find(key);
|
||||||
|
return (it != StyleRules.end() ? it->second : "");
|
||||||
|
}
|
||||||
|
|
||||||
|
public:
|
||||||
|
uint FontSize;
|
||||||
|
uint FontWeight;
|
||||||
|
bool FontOblique;
|
||||||
|
std::string FontFamily;
|
||||||
|
NLMISC::CRGBA TextColor;
|
||||||
|
STextShadow TextShadow;
|
||||||
|
bool GlobalColor;
|
||||||
|
bool Underlined;
|
||||||
|
bool StrikeThrough;
|
||||||
|
sint32 Width;
|
||||||
|
sint32 Height;
|
||||||
|
sint32 MaxWidth;
|
||||||
|
sint32 MaxHeight;
|
||||||
|
sint32 BorderWidth;
|
||||||
|
NLMISC::CRGBA BackgroundColor;
|
||||||
|
NLMISC::CRGBA BackgroundColorOver;
|
||||||
|
|
||||||
|
std::string WhiteSpace;
|
||||||
|
std::string TextAlign;
|
||||||
|
std::string VerticalAlign;
|
||||||
|
|
||||||
|
TStyle StyleRules;
|
||||||
|
};
|
||||||
|
|
||||||
|
class CCssStyle {
|
||||||
|
public:
|
||||||
|
struct SStyleRule {
|
||||||
|
std::vector<CCssSelector> Selector;
|
||||||
|
TStyle Properties;
|
||||||
|
|
||||||
|
// pseudo element like ':before'
|
||||||
|
std::string PseudoElement;
|
||||||
|
|
||||||
|
// returns selector specificity
|
||||||
|
uint specificity() const;
|
||||||
|
};
|
||||||
|
|
||||||
|
// 'browser' style, overwriten with '<html>'
|
||||||
|
CStyleParams Root;
|
||||||
|
|
||||||
|
// current element style
|
||||||
|
CStyleParams Current;
|
||||||
|
|
||||||
|
// known style rules sorted by specificity
|
||||||
|
std::vector<SStyleRule> _StyleRules;
|
||||||
|
|
||||||
|
private:
|
||||||
|
std::vector<CStyleParams> _StyleStack;
|
||||||
|
|
||||||
|
// test if str is one of "thin/medium/thick" and return its pixel value
|
||||||
|
bool scanCssLength(const std::string& str, uint32 &px) const;
|
||||||
|
|
||||||
|
// read style attribute
|
||||||
|
void getStyleParams(const std::string &styleString, CStyleParams &style, const CStyleParams ¤t) const;
|
||||||
|
void getStyleParams(const TStyle &styleRules, CStyleParams &style, const CStyleParams ¤t) const;
|
||||||
|
|
||||||
|
// extract from styleRules into style.StyleRules (expand shorthand, normalize, calculate current font-size)
|
||||||
|
void normalize(const TStyle &styleRules, CStyleParams &style, const CStyleParams ¤t) const;
|
||||||
|
|
||||||
|
// apply style.StyleRyles
|
||||||
|
void apply(CStyleParams &style, const CStyleParams ¤t) const;
|
||||||
|
|
||||||
|
// merge src into dest by overwriting key in dest
|
||||||
|
void merge(TStyle &dst, const TStyle &src) const;
|
||||||
|
|
||||||
|
// match selector to dom path
|
||||||
|
bool match(const std::vector<CCssSelector> &selector, const CHtmlElement &elm) const;
|
||||||
|
|
||||||
|
// parse 'background' into 'background-color', 'background-image', etc
|
||||||
|
void parseBackgroundShorthand(const std::string &value, CStyleParams &style) const;
|
||||||
|
|
||||||
|
public:
|
||||||
|
void reset();
|
||||||
|
|
||||||
|
// parse <style>..</style> tag or css file content
|
||||||
|
void parseStylesheet(const std::string &styleString);
|
||||||
|
|
||||||
|
// set element style from matching css rules
|
||||||
|
void getStyleFor(CHtmlElement &elm) const;
|
||||||
|
|
||||||
|
inline uint getFontSizeSmaller() const
|
||||||
|
{
|
||||||
|
if (Current.FontSize < 5)
|
||||||
|
return 3;
|
||||||
|
return Current.FontSize-2;
|
||||||
|
}
|
||||||
|
|
||||||
|
sint styleStackIndex = 0;
|
||||||
|
|
||||||
|
inline void pushStyle()
|
||||||
|
{
|
||||||
|
styleStackIndex++;
|
||||||
|
_StyleStack.push_back(Current);
|
||||||
|
|
||||||
|
Current.Width=-1;
|
||||||
|
Current.Height=-1;
|
||||||
|
Current.MaxWidth=-1;
|
||||||
|
Current.MaxHeight=-1;
|
||||||
|
Current.BorderWidth=1;
|
||||||
|
|
||||||
|
Current.StyleRules.clear();
|
||||||
|
}
|
||||||
|
|
||||||
|
inline void popStyle()
|
||||||
|
{
|
||||||
|
styleStackIndex--;
|
||||||
|
if (_StyleStack.empty())
|
||||||
|
{
|
||||||
|
Current = Root;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
Current = _StyleStack.back();
|
||||||
|
_StyleStack.pop_back();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// apply style to this.Root
|
||||||
|
void applyRootStyle(const std::string &styleString);
|
||||||
|
void applyRootStyle(const TStyle &styleRules);
|
||||||
|
|
||||||
|
// apply style to this.Current
|
||||||
|
void applyStyle(const std::string &styleString);
|
||||||
|
void applyStyle(const TStyle &styleRules);
|
||||||
|
|
||||||
|
void applyCssMinMax(sint32 &width, sint32 &height, sint32 minw=0, sint32 minh=0, sint32 maxw=0, sint32 maxh=0) const;
|
||||||
|
|
||||||
|
// check if current style property matches value
|
||||||
|
bool checkStyle(const std::string &key, const std::string &val) const
|
||||||
|
{
|
||||||
|
return Current.hasStyle(key) && Current.getStyle(key) == val;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool hasStyle(const std::string &key) const
|
||||||
|
{
|
||||||
|
return Current.hasStyle(key);
|
||||||
|
}
|
||||||
|
|
||||||
|
std::string getStyle(const std::string &key) const
|
||||||
|
{
|
||||||
|
return Current.getStyle(key);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
}//namespace
|
||||||
|
|
||||||
|
#endif // CL_CSS_STYLE_H
|
||||||
|
|
|
@ -23,13 +23,12 @@
|
||||||
#include "nel/gui/group_tree.h"
|
#include "nel/gui/group_tree.h"
|
||||||
#include "nel/gui/ctrl_button.h"
|
#include "nel/gui/ctrl_button.h"
|
||||||
#include "nel/gui/group_table.h"
|
#include "nel/gui/group_table.h"
|
||||||
#include "nel/gui/libwww_types.h"
|
#include "nel/gui/html_element.h"
|
||||||
|
#include "nel/gui/css_style.h"
|
||||||
|
|
||||||
// forward declaration
|
// forward declaration
|
||||||
typedef void CURLM;
|
typedef void CURLM;
|
||||||
|
|
||||||
typedef std::map<std::string, std::string> TStyle;
|
|
||||||
|
|
||||||
namespace NLGUI
|
namespace NLGUI
|
||||||
{
|
{
|
||||||
class CCtrlButton;
|
class CCtrlButton;
|
||||||
|
@ -69,67 +68,15 @@ namespace NLGUI
|
||||||
/// Maximum concurrent MultiCurl connections per CGroupHTML instance
|
/// Maximum concurrent MultiCurl connections per CGroupHTML instance
|
||||||
sint32 curlMaxConnections;
|
sint32 curlMaxConnections;
|
||||||
|
|
||||||
SWebOptions(): curlMaxConnections(2)
|
SWebOptions(): curlMaxConnections(5)
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
static SWebOptions options;
|
static SWebOptions options;
|
||||||
|
|
||||||
// text-shadow
|
|
||||||
struct STextShadow
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
STextShadow(bool enabled = false, bool outline = false, sint32 x=1, sint32 y=1, NLMISC::CRGBA color=NLMISC::CRGBA::Black)
|
|
||||||
: Enabled(enabled), Outline(outline), X(x), Y(y), Color(color)
|
|
||||||
{ }
|
|
||||||
|
|
||||||
bool Enabled;
|
|
||||||
bool Outline;
|
|
||||||
sint32 X;
|
|
||||||
sint32 Y;
|
|
||||||
NLMISC::CRGBA Color;
|
|
||||||
};
|
|
||||||
|
|
||||||
class CStyleParams
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
CStyleParams () : FontFamily(""), TextColor(255,255,255,255), TextShadow()
|
|
||||||
{
|
|
||||||
FontSize=10;
|
|
||||||
FontWeight=400;
|
|
||||||
FontOblique=false;
|
|
||||||
Underlined=false;
|
|
||||||
StrikeThrough=false;
|
|
||||||
GlobalColor=false;
|
|
||||||
Width=-1;
|
|
||||||
Height=-1;
|
|
||||||
MaxWidth=-1;
|
|
||||||
MaxHeight=-1;
|
|
||||||
BorderWidth=1;
|
|
||||||
BackgroundColor=NLMISC::CRGBA::Black;
|
|
||||||
BackgroundColorOver=NLMISC::CRGBA::Black;
|
|
||||||
}
|
|
||||||
uint FontSize;
|
|
||||||
uint FontWeight;
|
|
||||||
bool FontOblique;
|
|
||||||
std::string FontFamily;
|
|
||||||
NLMISC::CRGBA TextColor;
|
|
||||||
STextShadow TextShadow;
|
|
||||||
bool GlobalColor;
|
|
||||||
bool Underlined;
|
|
||||||
bool StrikeThrough;
|
|
||||||
sint32 Width;
|
|
||||||
sint32 Height;
|
|
||||||
sint32 MaxWidth;
|
|
||||||
sint32 MaxHeight;
|
|
||||||
sint32 BorderWidth;
|
|
||||||
NLMISC::CRGBA BackgroundColor;
|
|
||||||
NLMISC::CRGBA BackgroundColorOver;
|
|
||||||
};
|
|
||||||
|
|
||||||
// ImageDownload system
|
// ImageDownload system
|
||||||
enum TDataType {ImgType= 0, BnpType};
|
enum TDataType {ImgType= 0, BnpType, StylesheetType};
|
||||||
enum TImageType {NormalImage=0, OverImage};
|
enum TImageType {NormalImage=0, OverImage};
|
||||||
|
|
||||||
// Constructor
|
// Constructor
|
||||||
|
@ -150,8 +97,11 @@ namespace NLGUI
|
||||||
// Browse
|
// Browse
|
||||||
virtual void browse (const char *url);
|
virtual void browse (const char *url);
|
||||||
|
|
||||||
|
// load css from local file and insert into active stylesheet collection
|
||||||
|
void parseStylesheetFile(const std::string &fname);
|
||||||
|
|
||||||
// parse html string using libxml2 parser
|
// parse html string using libxml2 parser
|
||||||
virtual bool parseHtml(std::string htmlString);
|
bool parseHtml(const std::string &htmlString);
|
||||||
|
|
||||||
// Refresh
|
// Refresh
|
||||||
void refresh();
|
void refresh();
|
||||||
|
@ -162,13 +112,8 @@ namespace NLGUI
|
||||||
// Browse error
|
// Browse error
|
||||||
void browseError (const char *msg);
|
void browseError (const char *msg);
|
||||||
|
|
||||||
// stop browse
|
|
||||||
void stopBrowse ();
|
|
||||||
|
|
||||||
bool isBrowsing();
|
bool isBrowsing();
|
||||||
|
|
||||||
void clean() { stopBrowse(); updateRefreshButton(); removeContent(); }
|
|
||||||
|
|
||||||
// Update coords
|
// Update coords
|
||||||
void updateCoords();
|
void updateCoords();
|
||||||
|
|
||||||
|
@ -287,8 +232,6 @@ namespace NLGUI
|
||||||
int luaInsertText(CLuaState &ls);
|
int luaInsertText(CLuaState &ls);
|
||||||
int luaAddString(CLuaState &ls);
|
int luaAddString(CLuaState &ls);
|
||||||
int luaAddImage(CLuaState &ls);
|
int luaAddImage(CLuaState &ls);
|
||||||
int luaBeginElement(CLuaState &ls);
|
|
||||||
int luaEndElement(CLuaState &ls);
|
|
||||||
int luaShowDiv(CLuaState &ls);
|
int luaShowDiv(CLuaState &ls);
|
||||||
int luaParseHtml(CLuaState &ls);
|
int luaParseHtml(CLuaState &ls);
|
||||||
int luaRenderHtml(CLuaState &ls);
|
int luaRenderHtml(CLuaState &ls);
|
||||||
|
@ -302,8 +245,6 @@ namespace NLGUI
|
||||||
REFLECT_LUA_METHOD("insertText", luaInsertText)
|
REFLECT_LUA_METHOD("insertText", luaInsertText)
|
||||||
REFLECT_LUA_METHOD("addString", luaAddString)
|
REFLECT_LUA_METHOD("addString", luaAddString)
|
||||||
REFLECT_LUA_METHOD("addImage", luaAddImage)
|
REFLECT_LUA_METHOD("addImage", luaAddImage)
|
||||||
REFLECT_LUA_METHOD("beginElement", luaBeginElement)
|
|
||||||
REFLECT_LUA_METHOD("endElement", luaEndElement)
|
|
||||||
REFLECT_LUA_METHOD("showDiv", luaShowDiv)
|
REFLECT_LUA_METHOD("showDiv", luaShowDiv)
|
||||||
REFLECT_LUA_METHOD("parseHtml", luaParseHtml)
|
REFLECT_LUA_METHOD("parseHtml", luaParseHtml)
|
||||||
REFLECT_LUA_METHOD("renderHtml", luaRenderHtml)
|
REFLECT_LUA_METHOD("renderHtml", luaRenderHtml)
|
||||||
|
@ -316,26 +257,20 @@ namespace NLGUI
|
||||||
|
|
||||||
// \name callback from libwww
|
// \name callback from libwww
|
||||||
|
|
||||||
// Begin of the parsing of a HTML document
|
// Begin of the rendering of a HTML document
|
||||||
virtual void beginBuild ();
|
virtual void beginBuild ();
|
||||||
|
|
||||||
// End of the parsing of a HTML document
|
// End of the rendering of a HTML document
|
||||||
virtual void endBuild ();
|
virtual void endBuild ();
|
||||||
|
|
||||||
// A new text block has been parsed
|
// A new text block has been parsed
|
||||||
virtual void addText (const char * buf, int len);
|
virtual void addText (const char * buf, int len);
|
||||||
|
|
||||||
// A new begin HTML element has been parsed (<IMG> for exemple)
|
// A new begin HTML element has been parsed (<IMG> for exemple)
|
||||||
virtual void beginElement (uint element_number, const std::vector<bool> &present, const std::vector<const char *> &value);
|
virtual void beginElement(CHtmlElement &elm);
|
||||||
|
|
||||||
// A new end HTML element has been parsed (</IMG> for exemple)
|
// A new end HTML element has been parsed (</IMG> for exemple)
|
||||||
virtual void endElement (uint element_number);
|
virtual void endElement(CHtmlElement &elm);
|
||||||
|
|
||||||
// A new begin unparsed element has been found
|
|
||||||
virtual void beginUnparsedElement(const char *buffer, int length);
|
|
||||||
|
|
||||||
// A new end unparsed element has been found
|
|
||||||
virtual void endUnparsedElement(const char *buffer, int length);
|
|
||||||
|
|
||||||
// Add GET params to the url
|
// Add GET params to the url
|
||||||
virtual void addHTTPGetParams (std::string &url, bool trustedDomain);
|
virtual void addHTTPGetParams (std::string &url, bool trustedDomain);
|
||||||
|
@ -343,16 +278,12 @@ namespace NLGUI
|
||||||
// Add POST params to the libwww list
|
// Add POST params to the libwww list
|
||||||
virtual void addHTTPPostParams (SFormFields &formfields, bool trustedDomain);
|
virtual void addHTTPPostParams (SFormFields &formfields, bool trustedDomain);
|
||||||
|
|
||||||
// the current request is terminated
|
|
||||||
virtual void requestTerminated();
|
|
||||||
|
|
||||||
// libxml2 html parser functions
|
|
||||||
void htmlElement(xmlNode *node, int element_number);
|
|
||||||
void htmlWalkDOM(xmlNode *a_node);
|
|
||||||
|
|
||||||
// Get Home URL
|
// Get Home URL
|
||||||
virtual std::string home();
|
virtual std::string home();
|
||||||
|
|
||||||
|
// parse dom node and all child nodes recursively
|
||||||
|
void renderDOM(CHtmlElement &elm);
|
||||||
|
|
||||||
// Clear style stack and restore default style
|
// Clear style stack and restore default style
|
||||||
void resetCssStyle();
|
void resetCssStyle();
|
||||||
|
|
||||||
|
@ -383,7 +314,7 @@ namespace NLGUI
|
||||||
void addString(const ucstring &str);
|
void addString(const ucstring &str);
|
||||||
|
|
||||||
// Add an image in the current paragraph
|
// Add an image in the current paragraph
|
||||||
void addImage(const std::string &id, const char *image, bool reloadImg=false, const CStyleParams &style = CStyleParams());
|
void addImage(const std::string &id, const std::string &img, bool reloadImg=false, const CStyleParams &style = CStyleParams());
|
||||||
|
|
||||||
// Add a text area in the current paragraph
|
// Add a text area in the current paragraph
|
||||||
CInterfaceGroup *addTextArea (const std::string &templateName, const char *name, uint rows, uint cols, bool multiLine, const ucstring &content, uint maxlength);
|
CInterfaceGroup *addTextArea (const std::string &templateName, const char *name, uint rows, uint cols, bool multiLine, const ucstring &content, uint maxlength);
|
||||||
|
@ -422,6 +353,14 @@ namespace NLGUI
|
||||||
// Current URL
|
// Current URL
|
||||||
std::string _DocumentUrl;
|
std::string _DocumentUrl;
|
||||||
std::string _DocumentDomain;
|
std::string _DocumentDomain;
|
||||||
|
std::string _DocumentHtml; // not updated, only set by first render
|
||||||
|
// If true, then render _DocumentHtml on next update (replaces content)
|
||||||
|
bool _RenderNextTime;
|
||||||
|
// true if renderer is waiting for css files to finish downloading (link rel=stylesheet)
|
||||||
|
bool _WaitingForStylesheet;
|
||||||
|
// list of css file urls that are queued up for download
|
||||||
|
std::vector<std::string> _StylesheetQueue;
|
||||||
|
|
||||||
// Valid base href was found
|
// Valid base href was found
|
||||||
bool _IgnoreBaseUrlTag;
|
bool _IgnoreBaseUrlTag;
|
||||||
// Fragment from loading url
|
// Fragment from loading url
|
||||||
|
@ -454,7 +393,6 @@ namespace NLGUI
|
||||||
|
|
||||||
// Browsing..
|
// Browsing..
|
||||||
bool _Browsing;
|
bool _Browsing;
|
||||||
bool _Connecting;
|
|
||||||
double _TimeoutValue; // the timeout in seconds
|
double _TimeoutValue; // the timeout in seconds
|
||||||
double _ConnectingTimeout;
|
double _ConnectingTimeout;
|
||||||
sint _RedirectsRemaining;
|
sint _RedirectsRemaining;
|
||||||
|
@ -539,33 +477,13 @@ namespace NLGUI
|
||||||
// IL mode
|
// IL mode
|
||||||
bool _LI;
|
bool _LI;
|
||||||
|
|
||||||
// Current active style
|
// Keep track of current element style
|
||||||
CStyleParams _Style;
|
CCssStyle _Style;
|
||||||
// Default style
|
CHtmlElement _HtmlDOM;
|
||||||
CStyleParams _StyleDefault;
|
CHtmlElement *_CurrentHTMLElement;
|
||||||
// Nested style stack
|
// Backup of CurrentHTMLElement->nextSibling before ::beginElement() is called
|
||||||
std::vector<CStyleParams> _StyleParams;
|
// for luaParseHtml() to insert nodes into right place in right order
|
||||||
inline void pushStyle()
|
CHtmlElement *_CurrentHTMLNextSibling;
|
||||||
{
|
|
||||||
_StyleParams.push_back(_Style);
|
|
||||||
}
|
|
||||||
inline void popStyle()
|
|
||||||
{
|
|
||||||
if (_StyleParams.empty())
|
|
||||||
_Style = _StyleDefault;
|
|
||||||
else
|
|
||||||
{
|
|
||||||
_Style = _StyleParams.back();
|
|
||||||
_StyleParams.pop_back();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
inline uint getFontSizeSmaller() const
|
|
||||||
{
|
|
||||||
if (_Style.FontSize < 5)
|
|
||||||
return 3;
|
|
||||||
return _Style.FontSize-2;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Current link
|
// Current link
|
||||||
std::vector<std::string> _Link;
|
std::vector<std::string> _Link;
|
||||||
|
@ -629,14 +547,6 @@ namespace NLGUI
|
||||||
return _TR.back();
|
return _TR.back();
|
||||||
}
|
}
|
||||||
|
|
||||||
std::vector<STextShadow> _TextShadow;
|
|
||||||
inline STextShadow getTextShadow() const
|
|
||||||
{
|
|
||||||
if (_TextShadow.empty())
|
|
||||||
return STextShadow();
|
|
||||||
return _TextShadow.back();
|
|
||||||
}
|
|
||||||
|
|
||||||
// Forms
|
// Forms
|
||||||
class CForm
|
class CForm
|
||||||
{
|
{
|
||||||
|
@ -798,10 +708,6 @@ namespace NLGUI
|
||||||
typedef std::map<uint32, NLMISC::CRefPtr<CGroupHTML> > TGroupHtmlByUIDMap;
|
typedef std::map<uint32, NLMISC::CRefPtr<CGroupHTML> > TGroupHtmlByUIDMap;
|
||||||
static TGroupHtmlByUIDMap _GroupHtmlByUID;
|
static TGroupHtmlByUIDMap _GroupHtmlByUID;
|
||||||
|
|
||||||
// read style attribute
|
|
||||||
void getStyleParams(const std::string &styleString, CStyleParams &style, const CStyleParams ¤t);
|
|
||||||
void applyCssMinMax(sint32 &width, sint32 &height, sint32 minw=0, sint32 minh=0, sint32 maxw=0, sint32 maxh=0);
|
|
||||||
|
|
||||||
// load and render local html file (from bnp for example)
|
// load and render local html file (from bnp for example)
|
||||||
void doBrowseLocalFile(const std::string &filename);
|
void doBrowseLocalFile(const std::string &filename);
|
||||||
|
|
||||||
|
@ -815,6 +721,11 @@ namespace NLGUI
|
||||||
void buildHTTPPostParams (SFormFields &formfields);
|
void buildHTTPPostParams (SFormFields &formfields);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
friend class CHtmlParser;
|
||||||
|
|
||||||
|
// move src->Children into CurrentHtmlElement.parent.children element
|
||||||
|
void spliceFragment(std::list<CHtmlElement>::iterator src);
|
||||||
|
|
||||||
// decode all HTML entities
|
// decode all HTML entities
|
||||||
static ucstring decodeHTMLEntities(const ucstring &str);
|
static ucstring decodeHTMLEntities(const ucstring &str);
|
||||||
|
|
||||||
|
@ -834,10 +745,11 @@ namespace NLGUI
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
CDataDownload(const std::string &u, const std::string &d, TDataType t, CViewBase *i, const std::string &s, const std::string &m, const CStyleParams &style = CStyleParams(), const TImageType imagetype = NormalImage)
|
CDataDownload(const std::string &u, const std::string &d, TDataType t, CViewBase *i, const std::string &s, const std::string &m, const CStyleParams &style = CStyleParams(), const TImageType imagetype = NormalImage)
|
||||||
: data(NULL), fp(NULL), url(u), dest(d), type(t), luaScript(s), md5sum(m), redirects(0)
|
: data(NULL), fp(NULL), url(u), dest(d), type(t), luaScript(s), md5sum(m), redirects(0), ConnectionTimeout(60)
|
||||||
{
|
{
|
||||||
if (t == ImgType) imgs.push_back(CDataImageDownload(i, style, imagetype));
|
if (t == ImgType) imgs.push_back(CDataImageDownload(i, style, imagetype));
|
||||||
}
|
}
|
||||||
|
~CDataDownload();
|
||||||
|
|
||||||
public:
|
public:
|
||||||
CCurlWWWData *data;
|
CCurlWWWData *data;
|
||||||
|
@ -849,13 +761,16 @@ namespace NLGUI
|
||||||
uint32 redirects;
|
uint32 redirects;
|
||||||
FILE *fp;
|
FILE *fp;
|
||||||
std::vector<CDataImageDownload> imgs;
|
std::vector<CDataImageDownload> imgs;
|
||||||
|
uint32 ConnectionTimeout;
|
||||||
};
|
};
|
||||||
|
|
||||||
std::vector<CDataDownload> Curls;
|
std::list<CDataDownload> Curls;
|
||||||
CURLM *MultiCurl;
|
CURLM *MultiCurl;
|
||||||
int RunningCurls;
|
int RunningCurls;
|
||||||
|
|
||||||
bool startCurlDownload(CDataDownload &download);
|
bool startCurlDownload(CDataDownload &download);
|
||||||
|
void finishCurlDownload(const CDataDownload &download);
|
||||||
|
void pumpCurlQueue();
|
||||||
|
|
||||||
void initImageDownload();
|
void initImageDownload();
|
||||||
void checkImageDownload();
|
void checkImageDownload();
|
||||||
|
@ -874,11 +789,103 @@ namespace NLGUI
|
||||||
bool addBnpDownload(std::string url, const std::string &action, const std::string &script, const std::string &md5sum);
|
bool addBnpDownload(std::string url, const std::string &action, const std::string &script, const std::string &md5sum);
|
||||||
std::string localBnpName(const std::string &url);
|
std::string localBnpName(const std::string &url);
|
||||||
|
|
||||||
|
// add css file from <link href=".." rel="stylesheet"> to download queue
|
||||||
|
void addStylesheetDownload(std::vector<std::string> links);
|
||||||
|
|
||||||
|
// stop all curl downalods (html and data)
|
||||||
void releaseDownloads();
|
void releaseDownloads();
|
||||||
void checkDownloads();
|
void checkDownloads();
|
||||||
|
|
||||||
|
// _CurlWWW download finished
|
||||||
|
void htmlDownloadFinished(bool success, const std::string &error);
|
||||||
|
// images, stylesheets, etc finished downloading
|
||||||
|
void dataDownloadFinished(bool success, const std::string &error, CDataDownload &data);
|
||||||
|
|
||||||
// HtmlType download finished
|
// HtmlType download finished
|
||||||
void htmlDownloadFinished(const std::string &content, const std::string &type, long code);
|
void htmlDownloadFinished(const std::string &content, const std::string &type, long code);
|
||||||
|
|
||||||
|
// stylesheet finished downloading. if local file does not exist, then it failed (404)
|
||||||
|
void cssDownloadFinished(const std::string &url, const std::string &local);
|
||||||
|
|
||||||
|
// read common table/tr/td parameters and push them to _CellParams
|
||||||
|
void getCellsParameters(const CHtmlElement &elm, bool inherit);
|
||||||
|
|
||||||
|
// render _HtmlDOM
|
||||||
|
void renderDocument();
|
||||||
|
|
||||||
|
// :before, :after rendering
|
||||||
|
void renderPseudoElement(const std::string &pseudo, const CHtmlElement &elm);
|
||||||
|
|
||||||
|
// apply background from current style (for html, body)
|
||||||
|
void applyBackground(const CHtmlElement &elm);
|
||||||
|
|
||||||
|
// HTML elements
|
||||||
|
void htmlA(const CHtmlElement &elm);
|
||||||
|
void htmlAend(const CHtmlElement &elm);
|
||||||
|
void htmlBASE(const CHtmlElement &elm);
|
||||||
|
void htmlBODY(const CHtmlElement &elm);
|
||||||
|
void htmlBR(const CHtmlElement &elm);
|
||||||
|
void htmlDD(const CHtmlElement &elm);
|
||||||
|
void htmlDDend(const CHtmlElement &elm);
|
||||||
|
//void htmlDEL(const CHtmlElement &elm);
|
||||||
|
void htmlDIV(const CHtmlElement &elm);
|
||||||
|
void htmlDIVend(const CHtmlElement &elm);
|
||||||
|
void htmlDL(const CHtmlElement &elm);
|
||||||
|
void htmlDLend(const CHtmlElement &elm);
|
||||||
|
void htmlDT(const CHtmlElement &elm);
|
||||||
|
void htmlDTend(const CHtmlElement &elm);
|
||||||
|
//void htmlEM(const CHtmlElement &elm);
|
||||||
|
void htmlFONT(const CHtmlElement &elm);
|
||||||
|
void htmlFORM(const CHtmlElement &elm);
|
||||||
|
void htmlH(const CHtmlElement &elm);
|
||||||
|
void htmlHend(const CHtmlElement &elm);
|
||||||
|
void htmlHEAD(const CHtmlElement &elm);
|
||||||
|
void htmlHEADend(const CHtmlElement &elm);
|
||||||
|
void htmlHR(const CHtmlElement &elm);
|
||||||
|
void htmlHTML(const CHtmlElement &elm);
|
||||||
|
void htmlI(const CHtmlElement &elm);
|
||||||
|
void htmlIend(const CHtmlElement &elm);
|
||||||
|
void htmlIMG(const CHtmlElement &elm);
|
||||||
|
void htmlINPUT(const CHtmlElement &elm);
|
||||||
|
void htmlLI(const CHtmlElement &elm);
|
||||||
|
void htmlLIend(const CHtmlElement &elm);
|
||||||
|
void htmlLUA(const CHtmlElement &elm);
|
||||||
|
void htmlLUAend(const CHtmlElement &elm);
|
||||||
|
void htmlMETA(const CHtmlElement &elm);
|
||||||
|
void htmlOBJECT(const CHtmlElement &elm);
|
||||||
|
void htmlOBJECTend(const CHtmlElement &elm);
|
||||||
|
void htmlOL(const CHtmlElement &elm);
|
||||||
|
void htmlOLend(const CHtmlElement &elm);
|
||||||
|
void htmlOPTION(const CHtmlElement &elm);
|
||||||
|
void htmlOPTIONend(const CHtmlElement &elm);
|
||||||
|
void htmlP(const CHtmlElement &elm);
|
||||||
|
void htmlPend(const CHtmlElement &elm);
|
||||||
|
void htmlPRE(const CHtmlElement &elm);
|
||||||
|
void htmlPREend(const CHtmlElement &elm);
|
||||||
|
void htmlSCRIPT(const CHtmlElement &elm);
|
||||||
|
void htmlSCRIPTend(const CHtmlElement &elm);
|
||||||
|
void htmlSELECT(const CHtmlElement &elm);
|
||||||
|
void htmlSELECTend(const CHtmlElement &elm);
|
||||||
|
//void htmlSMALL(const CHtmlElement &elm);
|
||||||
|
//void htmlSPAN(const CHtmlElement &elm);
|
||||||
|
//void htmlSTRONG(const CHtmlElement &elm);
|
||||||
|
void htmlSTYLE(const CHtmlElement &elm);
|
||||||
|
void htmlSTYLEend(const CHtmlElement &elm);
|
||||||
|
void htmlTABLE(const CHtmlElement &elm);
|
||||||
|
void htmlTABLEend(const CHtmlElement &elm);
|
||||||
|
void htmlTD(const CHtmlElement &elm);
|
||||||
|
void htmlTDend(const CHtmlElement &elm);
|
||||||
|
void htmlTEXTAREA(const CHtmlElement &elm);
|
||||||
|
void htmlTEXTAREAend(const CHtmlElement &elm);
|
||||||
|
void htmlTH(const CHtmlElement &elm);
|
||||||
|
void htmlTHend(const CHtmlElement &elm);
|
||||||
|
void htmlTITLE(const CHtmlElement &elm);
|
||||||
|
void htmlTITLEend(const CHtmlElement &elm);
|
||||||
|
void htmlTR(const CHtmlElement &elm);
|
||||||
|
void htmlTRend(const CHtmlElement &elm);
|
||||||
|
//void htmlU(const CHtmlElement &elm);
|
||||||
|
void htmlUL(const CHtmlElement &elm);
|
||||||
|
void htmlULend(const CHtmlElement &elm);
|
||||||
};
|
};
|
||||||
|
|
||||||
// adapter group that store y offset for inputs inside an html form
|
// adapter group that store y offset for inputs inside an html form
|
||||||
|
|
86
code/nel/include/nel/gui/html_element.h
Normal file
86
code/nel/include/nel/gui/html_element.h
Normal file
|
@ -0,0 +1,86 @@
|
||||||
|
// Ryzom - MMORPG Framework <http://dev.ryzom.com/projects/ryzom/>
|
||||||
|
// Copyright (C) 2010 Winch Gate Property Limited
|
||||||
|
//
|
||||||
|
// This program is free software: you can redistribute it and/or modify
|
||||||
|
// it under the terms of the GNU Affero 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 Affero General Public License for more details.
|
||||||
|
//
|
||||||
|
// You should have received a copy of the GNU Affero General Public License
|
||||||
|
// along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
|
||||||
|
#ifndef CL_HTML_ELEMENT_H
|
||||||
|
#define CL_HTML_ELEMENT_H
|
||||||
|
|
||||||
|
#include "nel/misc/types_nl.h"
|
||||||
|
#include "nel/gui/css_style.h"
|
||||||
|
|
||||||
|
namespace NLGUI
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* \brief HTML element
|
||||||
|
* \date 2019-04-25 18:23 GMT
|
||||||
|
* \author Meelis Mägi (Nimetu)
|
||||||
|
*/
|
||||||
|
class CHtmlElement
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
enum ENodeType {
|
||||||
|
NONE = 0,
|
||||||
|
ELEMENT_NODE = 1,
|
||||||
|
TEXT_NODE = 3,
|
||||||
|
};
|
||||||
|
|
||||||
|
uint ID; // libwww element enum
|
||||||
|
ENodeType Type;
|
||||||
|
std::string Value; // text node value or element node name
|
||||||
|
std::map<std::string, std::string> Attributes;
|
||||||
|
std::list<CHtmlElement> Children;
|
||||||
|
|
||||||
|
// class names for css matching
|
||||||
|
std::set<std::string> ClassNames;
|
||||||
|
|
||||||
|
// defined style and :before/:after pseudo elements
|
||||||
|
TStyle Style;
|
||||||
|
TStyle StyleBefore;
|
||||||
|
TStyle StyleAfter;
|
||||||
|
|
||||||
|
// hierarchy
|
||||||
|
CHtmlElement *parent;
|
||||||
|
CHtmlElement *previousSibling;
|
||||||
|
CHtmlElement *nextSibling;
|
||||||
|
|
||||||
|
// n'th ELEMENT_NODE in parent.Children, for :nth-child() rules
|
||||||
|
uint childIndex;
|
||||||
|
|
||||||
|
CHtmlElement(ENodeType type = NONE, std::string value = "");
|
||||||
|
|
||||||
|
// returns true if rhs is same pointer
|
||||||
|
friend bool operator==(const CHtmlElement &lhs, const CHtmlElement &rhs)
|
||||||
|
{
|
||||||
|
return &lhs == &rhs;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool hasAttribute(const std::string &key) const;
|
||||||
|
|
||||||
|
bool hasNonEmptyAttribute(const std::string &key) const;
|
||||||
|
|
||||||
|
std::string getAttribute(const std::string &key) const;
|
||||||
|
|
||||||
|
bool hasClass(const std::string &key) const;
|
||||||
|
|
||||||
|
// update Children index/parent/next/prevSibling pointers
|
||||||
|
void reindexChilds();
|
||||||
|
|
||||||
|
// debug
|
||||||
|
std::string toString(bool tree = false, uint depth = 0) const;
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
52
code/nel/include/nel/gui/html_parser.h
Normal file
52
code/nel/include/nel/gui/html_parser.h
Normal file
|
@ -0,0 +1,52 @@
|
||||||
|
// Ryzom - MMORPG Framework <http://dev.ryzom.com/projects/ryzom/>
|
||||||
|
// Copyright (C) 2010 Winch Gate Property Limited
|
||||||
|
//
|
||||||
|
// This program is free software: you can redistribute it and/or modify
|
||||||
|
// it under the terms of the GNU Affero 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 Affero General Public License for more details.
|
||||||
|
//
|
||||||
|
// You should have received a copy of the GNU Affero General Public License
|
||||||
|
// along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
|
||||||
|
#ifndef CL_HTML_PARSER_H
|
||||||
|
#define CL_HTML_PARSER_H
|
||||||
|
|
||||||
|
#include "nel/misc/types_nl.h"
|
||||||
|
|
||||||
|
namespace NLGUI
|
||||||
|
{
|
||||||
|
class CHtmlElement;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \brief HTML parsing
|
||||||
|
* \date 2019-03-15 10:50 GMT
|
||||||
|
* \author Meelis Mägi (Nimetu)
|
||||||
|
*/
|
||||||
|
class CHtmlParser
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
bool parseHtml(std::string htmlString) const;
|
||||||
|
|
||||||
|
// parse html string into DOM, extract <style> tags into styleString, <link stylesheet> urls into links
|
||||||
|
void getDOM(std::string htmlString, CHtmlElement &parent, std::string &styleString, std::vector<std::string> &links) const;
|
||||||
|
|
||||||
|
private:
|
||||||
|
// iterate over libxml html tree, build DOM, and join all <style> tags together
|
||||||
|
void parseNode(xmlNode *a_node, CHtmlElement &parent, std::string &styleString, std::vector<std::string> &links) const;
|
||||||
|
|
||||||
|
// read <style> tag and add its content to styleString
|
||||||
|
void parseStyle(xmlNode *a_node, std::string &styleString) const;
|
||||||
|
|
||||||
|
// update parent/sibling in elm.Children
|
||||||
|
void reindexChilds(CHtmlElement &elm) const;
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
|
@ -21,7 +21,6 @@
|
||||||
#define CL_LIB_WWW_H
|
#define CL_LIB_WWW_H
|
||||||
|
|
||||||
#include "nel/misc/rgba.h"
|
#include "nel/misc/rgba.h"
|
||||||
#include "nel/gui/libwww_types.h"
|
|
||||||
|
|
||||||
// forward declaration to avoid curl.h inclusion everywhere
|
// forward declaration to avoid curl.h inclusion everywhere
|
||||||
typedef void CURL;
|
typedef void CURL;
|
||||||
|
@ -32,252 +31,152 @@ namespace NLGUI
|
||||||
class CCtrlScroll;
|
class CCtrlScroll;
|
||||||
class CGroupList;
|
class CGroupList;
|
||||||
|
|
||||||
// ***************************************************************************
|
// List of HTML elements. Does not need to be sorted
|
||||||
|
typedef enum _HTMLElement {
|
||||||
|
HTML_HTML,
|
||||||
|
HTML_BODY,
|
||||||
|
// meta
|
||||||
|
HTML_BASE,
|
||||||
|
HTML_HEAD,
|
||||||
|
HTML_LINK,
|
||||||
|
HTML_META,
|
||||||
|
HTML_STYLE,
|
||||||
|
HTML_TITLE,
|
||||||
|
// content sectioning
|
||||||
|
HTML_ADDRESS,
|
||||||
|
HTML_ARTICLE,
|
||||||
|
HTML_ASIDE,
|
||||||
|
HTML_FOOTER,
|
||||||
|
HTML_HEADER,
|
||||||
|
HTML_H1,
|
||||||
|
HTML_H2,
|
||||||
|
HTML_H3,
|
||||||
|
HTML_H4,
|
||||||
|
HTML_H5,
|
||||||
|
HTML_H6,
|
||||||
|
HTML_HGROUP,
|
||||||
|
HTML_MAIN,
|
||||||
|
HTML_NAV,
|
||||||
|
HTML_SECTION,
|
||||||
|
// text content
|
||||||
|
HTML_BLOCKQUOTE,
|
||||||
|
HTML_DD,
|
||||||
|
HTML_DIR,
|
||||||
|
HTML_DIV,
|
||||||
|
HTML_DL,
|
||||||
|
HTML_DT,
|
||||||
|
HTML_FIGCAPTION,
|
||||||
|
HTML_FIGURE,
|
||||||
|
HTML_HR,
|
||||||
|
HTML_LI,
|
||||||
|
HTML_OL,
|
||||||
|
HTML_P,
|
||||||
|
HTML_PRE,
|
||||||
|
HTML_UL,
|
||||||
|
// inline text
|
||||||
|
HTML_A,
|
||||||
|
HTML_ABBR,
|
||||||
|
HTML_B,
|
||||||
|
HTML_BDI,
|
||||||
|
HTML_BDO,
|
||||||
|
HTML_BR,
|
||||||
|
HTML_CITE,
|
||||||
|
HTML_CODE,
|
||||||
|
HTML_DATA,
|
||||||
|
HTML_DFN,
|
||||||
|
HTML_EM,
|
||||||
|
HTML_I,
|
||||||
|
HTML_KBD,
|
||||||
|
HTML_MARK,
|
||||||
|
HTML_Q,
|
||||||
|
HTML_RB,
|
||||||
|
HTML_RP,
|
||||||
|
HTML_RT,
|
||||||
|
HTML_RTC,
|
||||||
|
HTML_RUBY,
|
||||||
|
HTML_S,
|
||||||
|
HTML_SAMP,
|
||||||
|
HTML_SMALL,
|
||||||
|
HTML_SPAN,
|
||||||
|
HTML_STRONG,
|
||||||
|
HTML_SUB,
|
||||||
|
HTML_SUP,
|
||||||
|
HTML_TIME,
|
||||||
|
HTML_TT,
|
||||||
|
HTML_U,
|
||||||
|
HTML_VAR,
|
||||||
|
HTML_WBR,
|
||||||
|
// image, multimedia
|
||||||
|
HTML_AREA,
|
||||||
|
HTML_AUDIO,
|
||||||
|
HTML_IMG,
|
||||||
|
HTML_MAP,
|
||||||
|
HTML_TRACK,
|
||||||
|
HTML_VIDEO,
|
||||||
|
// embedded content
|
||||||
|
HTML_APPLET,
|
||||||
|
HTML_EMBED,
|
||||||
|
HTML_IFRAME,
|
||||||
|
HTML_NOEMBED,
|
||||||
|
HTML_OBJECT,
|
||||||
|
HTML_PARAM,
|
||||||
|
HTML_PICTURE,
|
||||||
|
HTML_SOURCE,
|
||||||
|
// scripting
|
||||||
|
HTML_CANVAS,
|
||||||
|
HTML_NOSCRIPT,
|
||||||
|
HTML_SCRIPT,
|
||||||
|
// demarcating edits
|
||||||
|
HTML_DEL,
|
||||||
|
HTML_INS,
|
||||||
|
// table
|
||||||
|
HTML_CAPTION,
|
||||||
|
HTML_COL,
|
||||||
|
HTML_COLGROUP,
|
||||||
|
HTML_TABLE,
|
||||||
|
HTML_TBODY,
|
||||||
|
HTML_TD,
|
||||||
|
HTML_TFOOT,
|
||||||
|
HTML_TH,
|
||||||
|
HTML_THEAD,
|
||||||
|
HTML_TR,
|
||||||
|
// forms
|
||||||
|
HTML_BUTTON,
|
||||||
|
HTML_DATALIST,
|
||||||
|
HTML_FIELDSET,
|
||||||
|
HTML_FORM,
|
||||||
|
HTML_INPUT,
|
||||||
|
HTML_LABEL,
|
||||||
|
HTML_LEGEND,
|
||||||
|
HTML_METER,
|
||||||
|
HTML_OPTGROUP,
|
||||||
|
HTML_OPTION,
|
||||||
|
HTML_OUTPUT,
|
||||||
|
HTML_PROGRESS,
|
||||||
|
HTML_SELECT,
|
||||||
|
HTML_TEXTAREA,
|
||||||
|
// interactive elements
|
||||||
|
HTML_DETAILS,
|
||||||
|
HTML_DIALOG,
|
||||||
|
HTML_MENU,
|
||||||
|
HTML_MENUITEM,
|
||||||
|
HTML_SUMMARY,
|
||||||
|
// -- tags for ryzom --
|
||||||
|
HTML_FONT,
|
||||||
|
HTML_LUA,
|
||||||
|
// last entry for unknown elements
|
||||||
|
HTML_NB_ELEMENTS
|
||||||
|
} HTMLElement;
|
||||||
|
|
||||||
// Legacy function from libwww
|
// case insensitive lookup for HTMLElement enum by name
|
||||||
SGML_dtd * HTML_dtd (void);
|
// return HTML_NB_ELEMENTS if no match
|
||||||
|
HTMLElement htmlElementLookup(const char *name);
|
||||||
// Init the libwww
|
|
||||||
void initLibWWW();
|
|
||||||
|
|
||||||
// ***************************************************************************
|
// ***************************************************************************
|
||||||
|
// Read HTML color value from src and set dest
|
||||||
// Some DTD table
|
// Can handle #rgb(a), #rrggbb(aa) or rgb()/rgba(), hsl(), hsla() formats
|
||||||
|
// or color name directly
|
||||||
// Here, modify the DTD table to change the HTML parser (add new tags for exemples)
|
bool scanHTMLColor(const char *src, NLMISC::CRGBA &dest);
|
||||||
|
|
||||||
#undef HTML_ATTR
|
|
||||||
#define HTML_ATTR(t,a) MY_HTML_##t##_##a
|
|
||||||
|
|
||||||
enum
|
|
||||||
{
|
|
||||||
HTML_ATTR(HTML,DIR) = 0,
|
|
||||||
HTML_ATTR(HTML,LANG),
|
|
||||||
HTML_ATTR(HTML,VERSION),
|
|
||||||
HTML_ATTR(HTML,STYLE),
|
|
||||||
};
|
|
||||||
|
|
||||||
enum
|
|
||||||
{
|
|
||||||
HTML_ATTR(A,ACCESSKEY) = 0,
|
|
||||||
HTML_ATTR(A,CHARSET),
|
|
||||||
HTML_ATTR(A,CLASS),
|
|
||||||
HTML_ATTR(A,COORDS),
|
|
||||||
HTML_ATTR(A,DIR),
|
|
||||||
HTML_ATTR(A,HREF),
|
|
||||||
HTML_ATTR(A,HREFLANG),
|
|
||||||
HTML_ATTR(A,ID),
|
|
||||||
HTML_ATTR(A,NAME),
|
|
||||||
HTML_ATTR(A,REL),
|
|
||||||
HTML_ATTR(A,REV),
|
|
||||||
HTML_ATTR(A,SHAPE),
|
|
||||||
HTML_ATTR(A,STYLE),
|
|
||||||
HTML_ATTR(A,TABINDEX),
|
|
||||||
HTML_ATTR(A,TARGET),
|
|
||||||
HTML_ATTR(A,TYPE),
|
|
||||||
HTML_ATTR(A,TITLE),
|
|
||||||
HTML_ATTR(A,Z_ACTION_CATEGORY),
|
|
||||||
HTML_ATTR(A,Z_ACTION_PARAMS),
|
|
||||||
HTML_ATTR(A,Z_ACTION_SHORTCUT),
|
|
||||||
};
|
|
||||||
|
|
||||||
enum
|
|
||||||
{
|
|
||||||
HTML_ATTR(TABLE,ALIGN) = 0,
|
|
||||||
HTML_ATTR(TABLE,BGCOLOR),
|
|
||||||
HTML_ATTR(TABLE,BORDER),
|
|
||||||
HTML_ATTR(TABLE,BORDERCOLOR),
|
|
||||||
HTML_ATTR(TABLE,CELLPADDING),
|
|
||||||
HTML_ATTR(TABLE,CELLSPACING),
|
|
||||||
HTML_ATTR(TABLE,CLASS),
|
|
||||||
HTML_ATTR(TABLE,DIR),
|
|
||||||
HTML_ATTR(TABLE,FRAME),
|
|
||||||
HTML_ATTR(TABLE,ID),
|
|
||||||
HTML_ATTR(TABLE,L_MARGIN),
|
|
||||||
HTML_ATTR(TABLE,LANG),
|
|
||||||
HTML_ATTR(TABLE,NOWRAP),
|
|
||||||
HTML_ATTR(TABLE,RULES),
|
|
||||||
HTML_ATTR(TABLE,SUMMARY),
|
|
||||||
HTML_ATTR(TABLE,STYLE),
|
|
||||||
HTML_ATTR(TABLE,TITLE),
|
|
||||||
HTML_ATTR(TABLE,VALIGN),
|
|
||||||
HTML_ATTR(TABLE,WIDTH)
|
|
||||||
};
|
|
||||||
|
|
||||||
enum
|
|
||||||
{
|
|
||||||
HTML_ATTR(TR,ALIGN) = 0,
|
|
||||||
HTML_ATTR(TR,BGCOLOR),
|
|
||||||
HTML_ATTR(TR,L_MARGIN),
|
|
||||||
HTML_ATTR(TR,NOWRAP),
|
|
||||||
HTML_ATTR(TR,VALIGN),
|
|
||||||
HTML_ATTR(TR,STYLE),
|
|
||||||
};
|
|
||||||
|
|
||||||
enum
|
|
||||||
{
|
|
||||||
HTML_ATTR(TD,ABBR) = 0,
|
|
||||||
HTML_ATTR(TD,ALIGN),
|
|
||||||
HTML_ATTR(TD,AXIS),
|
|
||||||
HTML_ATTR(TD,BGCOLOR),
|
|
||||||
HTML_ATTR(TD,CHAR),
|
|
||||||
HTML_ATTR(TD,CHAROFF),
|
|
||||||
HTML_ATTR(TD,CLASS),
|
|
||||||
HTML_ATTR(TD,COLSPAN),
|
|
||||||
HTML_ATTR(TD,DIR),
|
|
||||||
HTML_ATTR(TD,ID),
|
|
||||||
HTML_ATTR(TD,HEADERS),
|
|
||||||
HTML_ATTR(TD,HEIGHT),
|
|
||||||
HTML_ATTR(TD,L_MARGIN),
|
|
||||||
HTML_ATTR(TD,LANG),
|
|
||||||
HTML_ATTR(TD,NOWRAP),
|
|
||||||
HTML_ATTR(TD,ROWSPAN),
|
|
||||||
HTML_ATTR(TD,SCOPE),
|
|
||||||
HTML_ATTR(TD,STYLE),
|
|
||||||
HTML_ATTR(TD,TITLE),
|
|
||||||
HTML_ATTR(TD,VALIGN),
|
|
||||||
HTML_ATTR(TD,WIDTH),
|
|
||||||
};
|
|
||||||
|
|
||||||
enum
|
|
||||||
{
|
|
||||||
HTML_ATTR(IMG,ALIGN) = 0,
|
|
||||||
HTML_ATTR(IMG,ALT),
|
|
||||||
HTML_ATTR(IMG,BORDER),
|
|
||||||
HTML_ATTR(IMG,CLASS),
|
|
||||||
HTML_ATTR(IMG,DIR),
|
|
||||||
HTML_ATTR(IMG,GLOBAL_COLOR),
|
|
||||||
HTML_ATTR(IMG,HEIGHT),
|
|
||||||
HTML_ATTR(IMG,HSPACE),
|
|
||||||
HTML_ATTR(IMG,ID),
|
|
||||||
HTML_ATTR(IMG,ISMAP),
|
|
||||||
HTML_ATTR(IMG,LANG),
|
|
||||||
HTML_ATTR(IMG,LONGDESC),
|
|
||||||
HTML_ATTR(IMG,SRC),
|
|
||||||
HTML_ATTR(IMG,STYLE),
|
|
||||||
HTML_ATTR(IMG,TITLE),
|
|
||||||
HTML_ATTR(IMG,USEMAP),
|
|
||||||
HTML_ATTR(IMG,VSPACE),
|
|
||||||
HTML_ATTR(IMG,WIDTH),
|
|
||||||
// not sorted to keep enum values
|
|
||||||
HTML_ATTR(IMG,DATA_OVER_SRC),
|
|
||||||
};
|
|
||||||
|
|
||||||
enum
|
|
||||||
{
|
|
||||||
HTML_ATTR(INPUT,ACCEPT) = 0,
|
|
||||||
HTML_ATTR(INPUT,ACCESSKEY),
|
|
||||||
HTML_ATTR(INPUT,ALIGN),
|
|
||||||
HTML_ATTR(INPUT,ALT),
|
|
||||||
HTML_ATTR(INPUT,CHECKED),
|
|
||||||
HTML_ATTR(INPUT,CLASS),
|
|
||||||
HTML_ATTR(INPUT,DIR),
|
|
||||||
HTML_ATTR(INPUT,DISABLED),
|
|
||||||
HTML_ATTR(INPUT,GLOBAL_COLOR),
|
|
||||||
HTML_ATTR(INPUT,ID),
|
|
||||||
HTML_ATTR(INPUT,LANG),
|
|
||||||
HTML_ATTR(INPUT,MAXLENGTH),
|
|
||||||
HTML_ATTR(INPUT,NAME),
|
|
||||||
HTML_ATTR(INPUT,READONLY),
|
|
||||||
HTML_ATTR(INPUT,SIZE),
|
|
||||||
HTML_ATTR(INPUT,SRC),
|
|
||||||
HTML_ATTR(INPUT,STYLE),
|
|
||||||
HTML_ATTR(INPUT,TABINDEX),
|
|
||||||
HTML_ATTR(INPUT,TITLE),
|
|
||||||
HTML_ATTR(INPUT,TYPE),
|
|
||||||
HTML_ATTR(INPUT,USEMAP),
|
|
||||||
HTML_ATTR(INPUT,VALUE),
|
|
||||||
HTML_ATTR(INPUT,Z_BTN_TMPL),
|
|
||||||
HTML_ATTR(INPUT,Z_INPUT_TMPL),
|
|
||||||
HTML_ATTR(INPUT,Z_INPUT_WIDTH),
|
|
||||||
};
|
|
||||||
|
|
||||||
enum
|
|
||||||
{
|
|
||||||
HTML_ATTR(TEXTAREA,CLASS) = 0,
|
|
||||||
HTML_ATTR(TEXTAREA,COLS),
|
|
||||||
HTML_ATTR(TEXTAREA,DIR),
|
|
||||||
HTML_ATTR(TEXTAREA,DISABLED),
|
|
||||||
HTML_ATTR(TEXTAREA,ID),
|
|
||||||
HTML_ATTR(TEXTAREA,LANG),
|
|
||||||
HTML_ATTR(TEXTAREA,MAXLENGTH),
|
|
||||||
HTML_ATTR(TEXTAREA,NAME),
|
|
||||||
HTML_ATTR(TEXTAREA,READONLY),
|
|
||||||
HTML_ATTR(TEXTAREA,ROWS),
|
|
||||||
HTML_ATTR(TEXTAREA,STYLE),
|
|
||||||
HTML_ATTR(TEXTAREA,TABINDEX),
|
|
||||||
HTML_ATTR(TEXTAREA,TITLE),
|
|
||||||
HTML_ATTR(TEXTAREA,Z_INPUT_TMPL),
|
|
||||||
};
|
|
||||||
|
|
||||||
enum
|
|
||||||
{
|
|
||||||
HTML_ATTR(P,QUICK_HELP_CONDITION) = 0,
|
|
||||||
HTML_ATTR(P,QUICK_HELP_EVENTS),
|
|
||||||
HTML_ATTR(P,QUICK_HELP_LINK),
|
|
||||||
HTML_ATTR(P,NAME),
|
|
||||||
HTML_ATTR(P,STYLE),
|
|
||||||
};
|
|
||||||
|
|
||||||
enum
|
|
||||||
{
|
|
||||||
HTML_ATTR(DIV,CLASS) = 0,
|
|
||||||
HTML_ATTR(DIV,ID),
|
|
||||||
HTML_ATTR(DIV,NAME),
|
|
||||||
HTML_ATTR(DIV,STYLE),
|
|
||||||
};
|
|
||||||
|
|
||||||
enum
|
|
||||||
{
|
|
||||||
HTML_ATTR(SPAN,CLASS) = 0,
|
|
||||||
HTML_ATTR(SPAN,ID),
|
|
||||||
HTML_ATTR(SPAN,STYLE),
|
|
||||||
};
|
|
||||||
|
|
||||||
enum
|
|
||||||
{
|
|
||||||
HTML_ATTR(H1,CLASS) = 0,
|
|
||||||
HTML_ATTR(H1,ID),
|
|
||||||
HTML_ATTR(H1,STYLE),
|
|
||||||
};
|
|
||||||
|
|
||||||
enum
|
|
||||||
{
|
|
||||||
HTML_ATTR(H2,CLASS) = 0,
|
|
||||||
HTML_ATTR(H2,ID),
|
|
||||||
HTML_ATTR(H2,STYLE),
|
|
||||||
};
|
|
||||||
|
|
||||||
enum
|
|
||||||
{
|
|
||||||
HTML_ATTR(H3,CLASS) = 0,
|
|
||||||
HTML_ATTR(H3,ID),
|
|
||||||
HTML_ATTR(H3,STYLE),
|
|
||||||
};
|
|
||||||
|
|
||||||
enum
|
|
||||||
{
|
|
||||||
HTML_ATTR(H4,CLASS) = 0,
|
|
||||||
HTML_ATTR(H4,ID),
|
|
||||||
HTML_ATTR(H4,STYLE),
|
|
||||||
};
|
|
||||||
|
|
||||||
enum
|
|
||||||
{
|
|
||||||
HTML_ATTR(H5,CLASS) = 0,
|
|
||||||
HTML_ATTR(H5,ID),
|
|
||||||
HTML_ATTR(H5,STYLE),
|
|
||||||
};
|
|
||||||
|
|
||||||
enum
|
|
||||||
{
|
|
||||||
HTML_ATTR(H6,CLASS) = 0,
|
|
||||||
HTML_ATTR(H6,ID),
|
|
||||||
HTML_ATTR(H6,STYLE),
|
|
||||||
};
|
|
||||||
|
|
||||||
|
|
||||||
#undef HTML_ATTR
|
|
||||||
|
|
||||||
// ***************************************************************************
|
// ***************************************************************************
|
||||||
// Read a CSS length value, return true if one of supported units '%, rem, em, px, pt'
|
// Read a CSS length value, return true if one of supported units '%, rem, em, px, pt'
|
||||||
|
@ -292,6 +191,9 @@ namespace NLGUI
|
||||||
// Parse a HTML color
|
// Parse a HTML color
|
||||||
NLMISC::CRGBA getColor (const char *color);
|
NLMISC::CRGBA getColor (const char *color);
|
||||||
|
|
||||||
|
// return css color in rgba() format
|
||||||
|
std::string getRGBAString(const NLMISC::CRGBA &color);
|
||||||
|
|
||||||
// ***************************************************************************
|
// ***************************************************************************
|
||||||
|
|
||||||
const std::string &setCurrentDomain(const std::string &uri);
|
const std::string &setCurrentDomain(const std::string &uri);
|
||||||
|
|
File diff suppressed because it is too large
Load diff
|
@ -276,6 +276,17 @@ template <class T> T trimRightWhiteSpaces (const T &str)
|
||||||
return str.substr (0, end);
|
return str.substr (0, end);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// if both first and last char are quotes (' or "), then remove them
|
||||||
|
template <class T> T trimQuotes (const T &str)
|
||||||
|
{
|
||||||
|
typename T::size_type size = str.size();
|
||||||
|
if (size == 0)
|
||||||
|
return str;
|
||||||
|
if (str[0] != str[size-1] && (str[0] != '"' || str[0] != '\''))
|
||||||
|
return str;
|
||||||
|
return str.substr(1, size - 1);
|
||||||
|
}
|
||||||
|
|
||||||
//////////////////////////////////////////////////////////////////////////
|
//////////////////////////////////////////////////////////////////////////
|
||||||
// **** DEPRECATED *****: PLEASE DON'T USE THESE METHODS BUT FUNCTIONS ABOVE toLower() and toUpper()
|
// **** DEPRECATED *****: PLEASE DON'T USE THESE METHODS BUT FUNCTIONS ABOVE toLower() and toUpper()
|
||||||
//////////////////////////////////////////////////////////////////////////
|
//////////////////////////////////////////////////////////////////////////
|
||||||
|
@ -303,28 +314,23 @@ inline sint nlstricmp(const std::string &lhs, const std::string &rhs) { return s
|
||||||
inline sint nlstricmp(const std::string &lhs, const char *rhs) { return stricmp(lhs.c_str(),rhs); }
|
inline sint nlstricmp(const std::string &lhs, const char *rhs) { return stricmp(lhs.c_str(),rhs); }
|
||||||
inline sint nlstricmp(const char *lhs, const std::string &rhs) { return stricmp(lhs,rhs.c_str()); }
|
inline sint nlstricmp(const char *lhs, const std::string &rhs) { return stricmp(lhs,rhs.c_str()); }
|
||||||
|
|
||||||
// macros helper to convert UTF-8 std::string and wchar_t*
|
#if (NL_COMP_VC_VERSION <= 90)
|
||||||
#define wideToUtf8(str) (ucstring((ucchar*)str).toUtf8())
|
inline float nlroundf(float x)
|
||||||
#define utf8ToWide(str) ((wchar_t*)ucstring::makeFromUtf8(str).c_str())
|
{
|
||||||
|
return x >= 0.0f ? floorf(x + 0.5f) : ceilf(x - 0.5f);
|
||||||
// macros helper to convert UTF-8 std::string and TCHAR*
|
}
|
||||||
#ifdef _UNICODE
|
#define roundf(x) NLMISC::nlroundf(x)
|
||||||
#define tStrToUtf8(str) (ucstring((ucchar*)(LPCWSTR)str).toUtf8())
|
|
||||||
#define utf8ToTStr(str) ((wchar_t*)ucstring::makeFromUtf8(str).c_str())
|
|
||||||
#else
|
|
||||||
#define tStrToUtf8(str) (std::string((LPCSTR)str))
|
|
||||||
#define utf8ToTStr(str) (str.c_str())
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
// wrapper for fopen to be able to open files with an UTF-8 filename
|
// Wrapper for fopen to be able to open files with an UTF-8 filename
|
||||||
FILE* nlfopen(const std::string &filename, const std::string &mode);
|
FILE *nlfopen(const std::string &filename, const std::string &mode);
|
||||||
|
|
||||||
/** Signed 64 bit fseek. Same interface as fseek
|
/** Signed 64 bit fseek. Same interface as fseek
|
||||||
*/
|
*/
|
||||||
int nlfseek64( FILE *stream, sint64 offset, int origin );
|
int nlfseek64(FILE *stream, sint64 offset, int origin);
|
||||||
|
|
||||||
// Retrieve position in a file, same interface as ftell
|
// Retrieve position in a file, same interface as ftell
|
||||||
sint64 nlftell64(FILE *stream);
|
sint64 nlftell64(FILE *stream);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Base class for all NeL exception.
|
* Base class for all NeL exception.
|
||||||
|
|
|
@ -242,54 +242,11 @@ inline bool fromString(const std::string &str, sint64 &val) { bool ret = sscanf(
|
||||||
inline bool fromString(const std::string &str, float &val) { bool ret = sscanf(str.c_str(), "%f", &val) == 1; if (!ret) val = 0.0f; return ret; }
|
inline bool fromString(const std::string &str, float &val) { bool ret = sscanf(str.c_str(), "%f", &val) == 1; if (!ret) val = 0.0f; return ret; }
|
||||||
inline bool fromString(const std::string &str, double &val) { bool ret = sscanf(str.c_str(), "%lf", &val) == 1; if (!ret) val = 0.0; return ret; }
|
inline bool fromString(const std::string &str, double &val) { bool ret = sscanf(str.c_str(), "%lf", &val) == 1; if (!ret) val = 0.0; return ret; }
|
||||||
|
|
||||||
inline bool fromString(const std::string &str, bool &val)
|
// Fast string to bool, reliably defined for strings starting with 0, 1, t, T, f, F, y, Y, n, N, anything else is undefined.
|
||||||
{
|
// (str[0] == '1' || (str[0] & 0xD2) == 0x50)
|
||||||
if (str.length() == 1)
|
// - Kaetemi
|
||||||
{
|
|
||||||
const char c = str[0];
|
|
||||||
|
|
||||||
switch(c)
|
bool fromString(const std::string &str, bool &val);
|
||||||
{
|
|
||||||
case '1':
|
|
||||||
case 't':
|
|
||||||
case 'T':
|
|
||||||
case 'y':
|
|
||||||
case 'Y':
|
|
||||||
val = true;
|
|
||||||
break;
|
|
||||||
|
|
||||||
case '0':
|
|
||||||
case 'f':
|
|
||||||
case 'F':
|
|
||||||
case 'n':
|
|
||||||
case 'N':
|
|
||||||
val = false;
|
|
||||||
break;
|
|
||||||
|
|
||||||
default:
|
|
||||||
val = false;
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
if (str == "true" || str == "yes")
|
|
||||||
{
|
|
||||||
val = true;
|
|
||||||
}
|
|
||||||
else if (str == "false" || str == "no")
|
|
||||||
{
|
|
||||||
val = false;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
val = false;
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
inline bool fromString(const std::string &str, std::string &val) { val = str; return true; }
|
inline bool fromString(const std::string &str, std::string &val) { val = str; return true; }
|
||||||
|
|
||||||
|
@ -300,6 +257,105 @@ inline bool fromString(const std::string &str, uint &val) { return sscanf(str.c_
|
||||||
inline bool fromString(const std::string &str, sint &val) { return sscanf(str.c_str(), "%d", &val) == 1; }
|
inline bool fromString(const std::string &str, sint &val) { return sscanf(str.c_str(), "%d", &val) == 1; }
|
||||||
#endif // NL_COMP_VC6
|
#endif // NL_COMP_VC6
|
||||||
|
|
||||||
|
// Convert local codepage to UTF-8
|
||||||
|
// On Windows, the local codepage is undetermined
|
||||||
|
// On Linux, the local codepage is always UTF-8 (no-op)
|
||||||
|
std::string mbcsToUtf8(const char *str, size_t len = 0);
|
||||||
|
std::string mbcsToUtf8(const std::string &str);
|
||||||
|
|
||||||
|
// Convert wide codepage to UTF-8
|
||||||
|
// On Windows, the wide codepage is UTF-16
|
||||||
|
// On Linux, the wide codepage is UTF-32
|
||||||
|
std::string wideToUtf8(const wchar_t *str, size_t len = 0);
|
||||||
|
std::string wideToUtf8(const std::wstring &str);
|
||||||
|
|
||||||
|
// Convert UTF-8 to wide character set
|
||||||
|
std::wstring utf8ToWide(const char *str, size_t len = 0);
|
||||||
|
std::wstring utf8ToWide(const std::string &str);
|
||||||
|
|
||||||
|
// Convert UTF-8 to local multibyte character set
|
||||||
|
std::string utf8ToMbcs(const char *str, size_t len = 0);
|
||||||
|
std::string utf8ToMbcs(const std::string &str);
|
||||||
|
|
||||||
|
// Convert wide to local multibyte character set
|
||||||
|
std::string wideToMbcs(const wchar_t *str, size_t len = 0);
|
||||||
|
std::string wideToMbcs(const std::wstring &str);
|
||||||
|
|
||||||
|
// Convert local multibyte to wide character set
|
||||||
|
std::wstring mbcsToWide(const char *str, size_t len = 0);
|
||||||
|
std::wstring mbcsToWide(const std::string &str);
|
||||||
|
|
||||||
|
inline const char *asCStr(const char *str) { return str; }
|
||||||
|
inline const char *asCStr(const std::string &str) { return str.c_str(); }
|
||||||
|
inline const wchar_t *asCStr(const wchar_t *str) { return str; }
|
||||||
|
inline const wchar_t *asCStr(const std::wstring &str) { return str.c_str(); }
|
||||||
|
|
||||||
|
#if defined(NL_OS_WINDOWS)
|
||||||
|
#define nlUtf8ToMbcs(str) (NLMISC::utf8ToMbcs(str).c_str())
|
||||||
|
#define nlMbcsToUtf8(str) (NLMISC::mbcsToUtf8(str).c_str())
|
||||||
|
#else
|
||||||
|
#define nlUtf8ToMbcs(str) (NLMISC::asCStr(str))
|
||||||
|
#define nlMbcsToUtf8(str) (NLMISC::asCStr(str))
|
||||||
|
#endif
|
||||||
|
#define nlWideToUtf8(str) (NLMISC::wideToUtf8(str).c_str())
|
||||||
|
#define nlUtf8ToWide(str) (NLMISC::utf8ToWide(str).c_str())
|
||||||
|
#define nlWideToMbcs(str) (NLMISC::wideToMbcs(str).c_str())
|
||||||
|
#define nlMbcsToWide(str) (NLMISC::mbcsToWide(str).c_str())
|
||||||
|
|
||||||
|
// On Windows, tstring is either local multibyte or utf-16 wide
|
||||||
|
// On Linux, tstring is always utf-8
|
||||||
|
|
||||||
|
#if defined(NL_OS_WINDOWS) && (defined(UNICODE) || defined(_UNICODE))
|
||||||
|
typedef std::wstring tstring;
|
||||||
|
typedef wchar_t tchar;
|
||||||
|
inline std::string tStrToUtf8(const tchar *str) { return wideToUtf8((const wchar_t *)str); }
|
||||||
|
inline std::string tStrToUtf8(const tstring &str) { return wideToUtf8((const std::wstring &)str); }
|
||||||
|
inline std::wstring tStrToWide(const tchar *str) { return (const wchar_t *)str; }
|
||||||
|
inline std::wstring tStrToWide(const tstring &str) { return (const std::wstring &)str; }
|
||||||
|
inline std::string tStrToMbcs(const tchar *str) { return wideToMbcs((const wchar_t *)str); }
|
||||||
|
inline std::string tStrToMbcs(const tstring &str) { return wideToMbcs((const std::wstring &)str); }
|
||||||
|
#define nlTStrToUtf8(str) (NLMISC::tStrToUtf8(str).c_str())
|
||||||
|
#define nlTStrToWide(str) ((const wchar_t *)NLMISC::asCStr(str))
|
||||||
|
#define nlTStrToMbcs(str) (NLMISC::tStrToMbcs(str).c_str())
|
||||||
|
inline tstring utf8ToTStr(const char *str) {return (const tstring &)utf8ToWide(str); }
|
||||||
|
inline tstring utf8ToTStr(const std::string &str) { return (const tstring &)utf8ToWide(str); }
|
||||||
|
inline tstring wideToTStr(const wchar_t *str) { return (const tchar *)str; }
|
||||||
|
inline tstring wideToTStr(const std::wstring &str) { return (const tstring &)str; }
|
||||||
|
inline tstring mbcsToTStr(const char *str) { return (const tstring &)mbcsToWide(str); }
|
||||||
|
inline tstring mbcsToTStr(const std::string &str) { return (const tstring &)mbcsToWide(str); }
|
||||||
|
#define nlUtf8ToTStr(str) (NLMISC::utf8ToTStr(str).c_str())
|
||||||
|
#define nlWideToTStr(str) ((const tchar *)NLMISC::asCStr(str))
|
||||||
|
#define nlMbcsToTStr(str) (NLMISC::mbcsToTStr(str).c_str())
|
||||||
|
#else
|
||||||
|
typedef std::string tstring;
|
||||||
|
typedef char tchar;
|
||||||
|
inline std::string tStrToUtf8(const tchar *str) { return mbcsToUtf8((const char *)str); }
|
||||||
|
inline std::string tStrToUtf8(const tstring &str) { return mbcsToUtf8((const std::string &)str); }
|
||||||
|
inline std::wstring tStrToWide(const tchar *str) { return mbcsToWide((const char *)str); }
|
||||||
|
inline std::wstring tStrToWide(const tstring &str) { return mbcsToWide((const std::string &)str); }
|
||||||
|
inline std::string tStrToMbcs(const tchar *str) { return (const char *)str; }
|
||||||
|
inline std::string tStrToMbcs(const tstring &str) { return (const std::string &)str; }
|
||||||
|
#if defined(NL_OS_WINDOWS)
|
||||||
|
#define nlTStrToUtf8(str) (NLMISC::tStrToUtf8(str).c_str())
|
||||||
|
#else
|
||||||
|
#define nlTStrToUtf8(str) ((const char *)NLMISC::asCStr(str))
|
||||||
|
#endif
|
||||||
|
#define nlTStrToWide(str) (NLMISC::tStrToWide(str).c_str())
|
||||||
|
#define nlTStrToMbcs(str) ((const char *)NLMISC::asCStr(str))
|
||||||
|
inline tstring utf8ToTStr(const char *str) { return (const tstring &)utf8ToMbcs(str); }
|
||||||
|
inline tstring utf8ToTStr(const std::string &str) { return (const tstring &)utf8ToMbcs(str); }
|
||||||
|
inline tstring wideToTStr(const wchar_t *str) { return (const tstring &)wideToMbcs(str); }
|
||||||
|
inline tstring wideToTStr(const std::wstring &str) { return (const tstring &)wideToMbcs(str); }
|
||||||
|
inline tstring mbcsToTStr(const char *str) { return (const tchar *)str; }
|
||||||
|
inline tstring mbcsToTStr(const std::string &str) { return (const tstring &)str; }
|
||||||
|
#if defined(NL_OS_WINDOWS)
|
||||||
|
#define nlUtf8ToTStr(str) (NLMISC::utf8ToTStr(str).c_str())
|
||||||
|
#else
|
||||||
|
#define nlUtf8ToTStr(str) ((const tchar *)NLMISC::asCStr(str))
|
||||||
|
#endif
|
||||||
|
#define nlWideToTStr(str) (NLMISC::wideToTStr(str).c_str())
|
||||||
|
#define nlMbcsToTStr(str) ((const tchar *)NLMISC::asCStr(str))
|
||||||
|
#endif
|
||||||
|
|
||||||
} // NLMISC
|
} // NLMISC
|
||||||
|
|
||||||
|
|
|
@ -70,10 +70,10 @@ public:
|
||||||
static void setRootKey(const std::string &root);
|
static void setRootKey(const std::string &root);
|
||||||
|
|
||||||
/// Read a value from registry.
|
/// Read a value from registry.
|
||||||
static std::string getRegKey(const std::string &Entry);
|
static std::string getRegKey(const std::string &entry);
|
||||||
|
|
||||||
/// Write a value to registry.
|
/// Write a value to registry.
|
||||||
static bool setRegKey(const std::string &ValueName, const std::string &Value);
|
static bool setRegKey(const std::string &valueName, const std::string &value);
|
||||||
|
|
||||||
/// Get desktop current color depth without using UDriver.
|
/// Get desktop current color depth without using UDriver.
|
||||||
static uint getCurrentColorDepth();
|
static uint getCurrentColorDepth();
|
||||||
|
|
|
@ -173,6 +173,12 @@
|
||||||
# define NL_NO_EXCEPTION_SPECS
|
# define NL_NO_EXCEPTION_SPECS
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#if defined(NL_COMP_VC) && (NL_COMP_VC_VERSION >= 140)
|
||||||
|
#define nlmove(v) std::move(v)
|
||||||
|
#else
|
||||||
|
#define nlmove(v) (v)
|
||||||
|
#endif
|
||||||
|
|
||||||
// gcc 3.4 introduced ISO C++ with tough template rules
|
// gcc 3.4 introduced ISO C++ with tough template rules
|
||||||
//
|
//
|
||||||
// NL_ISO_SYNTAX can be used using #if NL_ISO_SYNTAX or #if !NL_ISO_SYNTAX
|
// NL_ISO_SYNTAX can be used using #if NL_ISO_SYNTAX or #if !NL_ISO_SYNTAX
|
||||||
|
@ -220,6 +226,7 @@
|
||||||
# if defined(NL_COMP_VC8) || defined(NL_COMP_VC9) || defined(NL_COMP_VC10)
|
# if defined(NL_COMP_VC8) || defined(NL_COMP_VC9) || defined(NL_COMP_VC10)
|
||||||
# pragma warning (disable : 4005) // don't warn on redefinitions caused by xp platform sdk
|
# pragma warning (disable : 4005) // don't warn on redefinitions caused by xp platform sdk
|
||||||
# endif // NL_COMP_VC8 || NL_COMP_VC9
|
# endif // NL_COMP_VC8 || NL_COMP_VC9
|
||||||
|
# pragma warning (disable : 26495) // Variable is uninitialized. Always initialize a member variable. (On purpose for performance.)
|
||||||
#endif // NL_OS_WINDOWS
|
#endif // NL_OS_WINDOWS
|
||||||
|
|
||||||
|
|
||||||
|
@ -519,6 +526,15 @@ template<> struct hash<uint64>
|
||||||
*/
|
*/
|
||||||
typedef uint16 ucchar;
|
typedef uint16 ucchar;
|
||||||
|
|
||||||
|
#if defined(NL_OS_WINDOWS) && (defined(UNICODE) || defined(_UNICODE))
|
||||||
|
#define nltmain wmain
|
||||||
|
#define nltWinMain wWinMain
|
||||||
|
#else
|
||||||
|
#define nltmain main
|
||||||
|
#if defined(NL_OS_WINDOWS)
|
||||||
|
#define nltWinMain WinMain
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
|
||||||
// To define a 64bits constant; ie: UINT64_CONSTANT(0x123456781234)
|
// To define a 64bits constant; ie: UINT64_CONSTANT(0x123456781234)
|
||||||
#ifdef NL_COMP_VC
|
#ifdef NL_COMP_VC
|
||||||
|
|
|
@ -54,7 +54,17 @@ struct HINSTANCE__;
|
||||||
typedef struct HINSTANCE__ *HINSTANCE;
|
typedef struct HINSTANCE__ *HINSTANCE;
|
||||||
|
|
||||||
typedef char CHAR;
|
typedef char CHAR;
|
||||||
|
typedef wchar_t WCHAR;
|
||||||
|
|
||||||
typedef CHAR *LPSTR;
|
typedef CHAR *LPSTR;
|
||||||
|
typedef WCHAR *LPWSTR;
|
||||||
|
|
||||||
|
#if defined(UNICODE) || defined(_UNICODE)
|
||||||
|
typedef LPWSTR LPTSTR;
|
||||||
|
#else
|
||||||
|
typedef LPSTR LPTSTR;
|
||||||
|
#endif
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
namespace NLNET
|
namespace NLNET
|
||||||
|
@ -117,11 +127,11 @@ class IServiceUpdatable;
|
||||||
#if defined(NL_OS_WINDOWS) && defined(_WINDOWS)
|
#if defined(NL_OS_WINDOWS) && defined(_WINDOWS)
|
||||||
#define NLNET_SERVICE_MAIN(__ServiceClassName, __ServiceShortName, __ServiceLongName, __ServicePort, __ServiceCallbackArray, __ConfigDir, __LogDir) \
|
#define NLNET_SERVICE_MAIN(__ServiceClassName, __ServiceShortName, __ServiceLongName, __ServicePort, __ServiceCallbackArray, __ConfigDir, __LogDir) \
|
||||||
\
|
\
|
||||||
int APIENTRY WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) \
|
int APIENTRY nltWinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance, LPTSTR lpCmdLine, int nCmdShow) \
|
||||||
{ \
|
{ \
|
||||||
NLMISC::CApplicationContext serviceContext; \
|
NLMISC::CApplicationContext serviceContext; \
|
||||||
__ServiceClassName *scn = new __ServiceClassName; \
|
__ServiceClassName *scn = new __ServiceClassName; \
|
||||||
scn->setArgs (lpCmdLine); \
|
scn->setArgs (nlTStrToUtf8(lpCmdLine)); \
|
||||||
createDebug(NULL,!scn->haveLongArg("nolog"));\
|
createDebug(NULL,!scn->haveLongArg("nolog"));\
|
||||||
scn->setCallbackArray (__ServiceCallbackArray, sizeof(__ServiceCallbackArray)/sizeof(__ServiceCallbackArray[0])); \
|
scn->setCallbackArray (__ServiceCallbackArray, sizeof(__ServiceCallbackArray)/sizeof(__ServiceCallbackArray[0])); \
|
||||||
sint retval = scn->main (__ServiceShortName, __ServiceLongName, __ServicePort, __ConfigDir, __LogDir, __DATE__ " " __TIME__); \
|
sint retval = scn->main (__ServiceShortName, __ServiceLongName, __ServicePort, __ConfigDir, __LogDir, __DATE__ " " __TIME__); \
|
||||||
|
@ -132,7 +142,7 @@ int APIENTRY WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdL
|
||||||
#else
|
#else
|
||||||
#define NLNET_SERVICE_MAIN(__ServiceClassName, __ServiceShortName, __ServiceLongName, __ServicePort, __ServiceCallbackArray, __ConfigDir, __LogDir) \
|
#define NLNET_SERVICE_MAIN(__ServiceClassName, __ServiceShortName, __ServiceLongName, __ServicePort, __ServiceCallbackArray, __ConfigDir, __LogDir) \
|
||||||
\
|
\
|
||||||
int main(int argc, const char **argv) \
|
int nltmain(int argc, const NLMISC::tchar **argv) \
|
||||||
{ \
|
{ \
|
||||||
NLMISC::CApplicationContext serviceContext; \
|
NLMISC::CApplicationContext serviceContext; \
|
||||||
__ServiceClassName *scn = new __ServiceClassName; \
|
__ServiceClassName *scn = new __ServiceClassName; \
|
||||||
|
@ -340,6 +350,9 @@ public:
|
||||||
/// Sets the command line and init _Args variable. You must call this before calling main()
|
/// Sets the command line and init _Args variable. You must call this before calling main()
|
||||||
void setArgs (int argc, const char **argv);
|
void setArgs (int argc, const char **argv);
|
||||||
|
|
||||||
|
/// Sets the command line and init _Args variable. You must call this before calling main()
|
||||||
|
void setArgs (int argc, const wchar_t **argv);
|
||||||
|
|
||||||
/// Sets the command line and init _Args variable. You must call this before calling main()
|
/// Sets the command line and init _Args variable. You must call this before calling main()
|
||||||
void setArgs (const char *args);
|
void setArgs (const char *args);
|
||||||
|
|
||||||
|
|
|
@ -18,6 +18,8 @@
|
||||||
#define NLSOUND_AUDIO_DECODER_MP3_H
|
#define NLSOUND_AUDIO_DECODER_MP3_H
|
||||||
#include <nel/misc/types_nl.h>
|
#include <nel/misc/types_nl.h>
|
||||||
|
|
||||||
|
#if (NL_COMP_VC_VERSION > 90) /* VS2008 does not have stdint.h */
|
||||||
|
|
||||||
#include <nel/sound/audio_decoder.h>
|
#include <nel/sound/audio_decoder.h>
|
||||||
|
|
||||||
// disable drmp3_init_file()
|
// disable drmp3_init_file()
|
||||||
|
@ -91,6 +93,8 @@ public:
|
||||||
|
|
||||||
} /* namespace NLSOUND */
|
} /* namespace NLSOUND */
|
||||||
|
|
||||||
|
#endif /* (NL_COMP_VC_VERSION > 90) */
|
||||||
|
|
||||||
#endif // NLSOUND_AUDIO_DECODER_MP3_H
|
#endif // NLSOUND_AUDIO_DECODER_MP3_H
|
||||||
|
|
||||||
/* end of file */
|
/* end of file */
|
||||||
|
|
|
@ -1810,7 +1810,7 @@ emptyProc CDriverD3D::getWindowProc()
|
||||||
|
|
||||||
IDriver::TMessageBoxId CDriverD3D::systemMessageBox (const char* message, const char* title, TMessageBoxType type, TMessageBoxIcon icon)
|
IDriver::TMessageBoxId CDriverD3D::systemMessageBox (const char* message, const char* title, TMessageBoxType type, TMessageBoxIcon icon)
|
||||||
{
|
{
|
||||||
switch (::MessageBoxW (_HWnd, utf8ToWide(message), utf8ToWide(title), ((type==retryCancelType)?MB_RETRYCANCEL:
|
switch (::MessageBoxW(_HWnd, nlUtf8ToWide(message), nlUtf8ToWide(title), ((type == retryCancelType) ? MB_RETRYCANCEL :
|
||||||
(type==yesNoCancelType)?MB_YESNOCANCEL:
|
(type==yesNoCancelType)?MB_YESNOCANCEL:
|
||||||
(type==okCancelType)?MB_OKCANCEL:
|
(type==okCancelType)?MB_OKCANCEL:
|
||||||
(type==abortRetryIgnoreType)?MB_ABORTRETRYIGNORE:
|
(type==abortRetryIgnoreType)?MB_ABORTRETRYIGNORE:
|
||||||
|
|
|
@ -2644,7 +2644,7 @@ IDriver::TMessageBoxId CDriverGL::systemMessageBox (const char* message, const c
|
||||||
{
|
{
|
||||||
H_AUTO_OGL(CDriverGL_systemMessageBox)
|
H_AUTO_OGL(CDriverGL_systemMessageBox)
|
||||||
#ifdef NL_OS_WINDOWS
|
#ifdef NL_OS_WINDOWS
|
||||||
switch (::MessageBoxW (NULL, utf8ToWide(message), utf8ToWide(title), ((type==retryCancelType)?MB_RETRYCANCEL:
|
switch (::MessageBoxW(NULL, nlUtf8ToWide(message), nlUtf8ToWide(title), ((type == retryCancelType) ? MB_RETRYCANCEL :
|
||||||
(type==yesNoCancelType)?MB_YESNOCANCEL:
|
(type==yesNoCancelType)?MB_YESNOCANCEL:
|
||||||
(type==okCancelType)?MB_OKCANCEL:
|
(type==okCancelType)?MB_OKCANCEL:
|
||||||
(type==abortRetryIgnoreType)?MB_ABORTRETRYIGNORE:
|
(type==abortRetryIgnoreType)?MB_ABORTRETRYIGNORE:
|
||||||
|
|
|
@ -25,6 +25,8 @@ using namespace NLMISC;
|
||||||
#define new DEBUG_NEW
|
#define new DEBUG_NEW
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
void vertex_buffer_heap_dummy_cpp() { }
|
||||||
|
|
||||||
// This code is not used actually and doesn't compile
|
// This code is not used actually and doesn't compile
|
||||||
// just preproc comment it
|
// just preproc comment it
|
||||||
#if 0
|
#if 0
|
||||||
|
|
716
code/nel/src/gui/css_parser.cpp
Normal file
716
code/nel/src/gui/css_parser.cpp
Normal file
|
@ -0,0 +1,716 @@
|
||||||
|
// Ryzom - MMORPG Framework <http://dev.ryzom.com/projects/ryzom/>
|
||||||
|
// Copyright (C) 2010 Winch Gate Property Limited
|
||||||
|
//
|
||||||
|
// This program is free software: you can redistribute it and/or modify
|
||||||
|
// it under the terms of the GNU Affero 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 Affero General Public License for more details.
|
||||||
|
//
|
||||||
|
// You should have received a copy of the GNU Affero General Public License
|
||||||
|
// along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
|
||||||
|
#include "stdpch.h"
|
||||||
|
|
||||||
|
#include <string>
|
||||||
|
#include "nel/misc/types_nl.h"
|
||||||
|
#include "nel/gui/css_parser.h"
|
||||||
|
#include "nel/gui/css_style.h"
|
||||||
|
#include "nel/gui/css_selector.h"
|
||||||
|
|
||||||
|
using namespace NLMISC;
|
||||||
|
|
||||||
|
#ifdef DEBUG_NEW
|
||||||
|
#define new DEBUG_NEW
|
||||||
|
#endif
|
||||||
|
|
||||||
|
namespace NLGUI
|
||||||
|
{
|
||||||
|
// ***************************************************************************
|
||||||
|
// Parse style declarations style, eg. "color:red; font-size: 10px;"
|
||||||
|
//
|
||||||
|
// key is converted to lowercase
|
||||||
|
// value is left as is
|
||||||
|
TStyle CCssParser::parseDecls(const std::string &styleString)
|
||||||
|
{
|
||||||
|
TStyle styles;
|
||||||
|
std::vector<std::string> elements;
|
||||||
|
NLMISC::splitString(styleString, ";", elements);
|
||||||
|
|
||||||
|
for(uint i = 0; i < elements.size(); ++i)
|
||||||
|
{
|
||||||
|
std::string::size_type pos;
|
||||||
|
pos = elements[i].find_first_of(':');
|
||||||
|
if (pos != std::string::npos)
|
||||||
|
{
|
||||||
|
std::string key = trim(toLower(elements[i].substr(0, pos)));
|
||||||
|
std::string value = trim(elements[i].substr(pos+1));
|
||||||
|
styles[key] = value;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return styles;
|
||||||
|
}
|
||||||
|
|
||||||
|
// ***************************************************************************
|
||||||
|
// Parse stylesheet, eg content from main.css file
|
||||||
|
//
|
||||||
|
// Return all found rules
|
||||||
|
void CCssParser::parseStylesheet(const std::string &cssString, std::vector<CCssStyle::SStyleRule> &result)
|
||||||
|
{
|
||||||
|
_Rules.clear();
|
||||||
|
_Style.clear();
|
||||||
|
|
||||||
|
_Style.fromUtf8(cssString);
|
||||||
|
preprocess();
|
||||||
|
|
||||||
|
_Position = 0;
|
||||||
|
while(!is_eof())
|
||||||
|
{
|
||||||
|
skipWhitespace();
|
||||||
|
|
||||||
|
if (_Style[_Position] == (ucchar)'@')
|
||||||
|
readAtRule();
|
||||||
|
else
|
||||||
|
readRule();
|
||||||
|
}
|
||||||
|
|
||||||
|
result.insert(result.end(), _Rules.begin(), _Rules.end());
|
||||||
|
_Rules.clear();
|
||||||
|
}
|
||||||
|
|
||||||
|
// ***************************************************************************
|
||||||
|
// Parse selector with style string
|
||||||
|
// selector: "a#id .class"
|
||||||
|
// style: "color: red; font-size: 10px;"
|
||||||
|
//
|
||||||
|
// @internal
|
||||||
|
void CCssParser::parseRule(const ucstring &selectorString, const ucstring &styleString)
|
||||||
|
{
|
||||||
|
std::vector<ucstring> selectors;
|
||||||
|
NLMISC::explode(selectorString, ucstring(","), selectors);
|
||||||
|
|
||||||
|
TStyle props;
|
||||||
|
props = parseDecls(styleString.toUtf8());
|
||||||
|
|
||||||
|
// duplicate props to each selector in selector list,
|
||||||
|
// example 'div > p, h1' creates 'div>p' and 'h1'
|
||||||
|
for(uint i=0; i<selectors.size(); ++i)
|
||||||
|
{
|
||||||
|
CCssStyle::SStyleRule rule;
|
||||||
|
|
||||||
|
rule.Selector = parse_selector(trim(selectors[i]), rule.PseudoElement);
|
||||||
|
rule.Properties = props;
|
||||||
|
|
||||||
|
if (!rule.Selector.empty())
|
||||||
|
{
|
||||||
|
_Rules.push_back(rule);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// ***************************************************************************
|
||||||
|
// Skip over at-rule
|
||||||
|
// @import ... ;
|
||||||
|
// @charset ... ;
|
||||||
|
// @media query { .. }
|
||||||
|
//
|
||||||
|
// @internal
|
||||||
|
void CCssParser::readAtRule()
|
||||||
|
{
|
||||||
|
// skip '@'
|
||||||
|
_Position++;
|
||||||
|
|
||||||
|
// skip 'import', 'media', etc
|
||||||
|
skipIdentifier();
|
||||||
|
|
||||||
|
// skip at-rule statement
|
||||||
|
while(!is_eof() && _Style[_Position] != (ucchar)';')
|
||||||
|
{
|
||||||
|
if (maybe_escape())
|
||||||
|
{
|
||||||
|
escape();
|
||||||
|
}
|
||||||
|
else if (is_quote(_Style[_Position]))
|
||||||
|
{
|
||||||
|
skipString();
|
||||||
|
}
|
||||||
|
else if (is_block_open(_Style[_Position]))
|
||||||
|
{
|
||||||
|
bool mustBreak = (_Style[_Position] == '{');
|
||||||
|
skipBlock();
|
||||||
|
|
||||||
|
if(mustBreak)
|
||||||
|
{
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
_Position++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// skip ';' or '}'
|
||||||
|
_Position++;
|
||||||
|
}
|
||||||
|
|
||||||
|
// ***************************************************************************
|
||||||
|
// skip over "elm#id.selector[attr]:peseudo, .sel2 { rule }" block
|
||||||
|
// @internal
|
||||||
|
void CCssParser::readRule()
|
||||||
|
{
|
||||||
|
size_t start;
|
||||||
|
|
||||||
|
// selector
|
||||||
|
start = _Position;
|
||||||
|
while(!is_eof())
|
||||||
|
{
|
||||||
|
if (maybe_escape())
|
||||||
|
_Position++;
|
||||||
|
else if (is_quote(_Style[_Position]))
|
||||||
|
skipString();
|
||||||
|
else if (_Style[_Position] == (ucchar)'[')
|
||||||
|
skipBlock();
|
||||||
|
else if (_Style[_Position] == (ucchar)'{')
|
||||||
|
break;
|
||||||
|
else
|
||||||
|
_Position++;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!is_eof())
|
||||||
|
{
|
||||||
|
ucstring selector;
|
||||||
|
selector.append(_Style, start, _Position - start);
|
||||||
|
|
||||||
|
skipWhitespace();
|
||||||
|
|
||||||
|
// declaration block
|
||||||
|
start = _Position;
|
||||||
|
skipBlock();
|
||||||
|
if (_Position <= _Style.size())
|
||||||
|
{
|
||||||
|
ucstring rules;
|
||||||
|
rules.append(_Style, start + 1, _Position - start - 2);
|
||||||
|
|
||||||
|
parseRule(selector, rules);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// ***************************************************************************
|
||||||
|
// skip over \abcdef escaped sequence or escaped newline char
|
||||||
|
// @internal
|
||||||
|
void CCssParser::escape()
|
||||||
|
{
|
||||||
|
// skip '\'
|
||||||
|
_Position++;
|
||||||
|
if (is_hex(_Style[_Position]))
|
||||||
|
{
|
||||||
|
// TODO: '\abc def' should be considered one string
|
||||||
|
for(uint i=0; i<6 && is_hex(_Style[_Position]); i++)
|
||||||
|
_Position++;
|
||||||
|
|
||||||
|
if (_Style[_Position] == (ucchar)' ')
|
||||||
|
_Position++;
|
||||||
|
}
|
||||||
|
else if (_Style[_Position] != 0x0A)
|
||||||
|
_Position++;
|
||||||
|
}
|
||||||
|
|
||||||
|
// ***************************************************************************
|
||||||
|
// @internal
|
||||||
|
bool CCssParser::skipIdentifier()
|
||||||
|
{
|
||||||
|
size_t start = _Position;
|
||||||
|
bool valid = true;
|
||||||
|
while(!is_eof() && valid)
|
||||||
|
{
|
||||||
|
if (maybe_escape())
|
||||||
|
{
|
||||||
|
escape();
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
else if (is_alpha(_Style[_Position]))
|
||||||
|
{
|
||||||
|
// valid
|
||||||
|
}
|
||||||
|
else if (is_digit(_Style[_Position]))
|
||||||
|
{
|
||||||
|
if (_Position == start)
|
||||||
|
{
|
||||||
|
// cannot start with digit
|
||||||
|
valid = false;
|
||||||
|
}
|
||||||
|
else if ((_Position - start) == 0 && _Style[_Position-1] == (ucchar)'-')
|
||||||
|
{
|
||||||
|
// cannot start with -#
|
||||||
|
valid = false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if (_Style[_Position] == (ucchar)'_')
|
||||||
|
{
|
||||||
|
// valid
|
||||||
|
}
|
||||||
|
else if (_Style[_Position] >= 0x0080)
|
||||||
|
{
|
||||||
|
// valid
|
||||||
|
}
|
||||||
|
else if (_Style[_Position] == (ucchar)'-')
|
||||||
|
{
|
||||||
|
if ((_Position - start) == 1 && _Style[_Position-1] == (ucchar)'-')
|
||||||
|
{
|
||||||
|
// cannot start with --
|
||||||
|
valid = false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
// we're done
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
_Position++;
|
||||||
|
}
|
||||||
|
|
||||||
|
return valid && !is_eof();
|
||||||
|
}
|
||||||
|
|
||||||
|
// ***************************************************************************
|
||||||
|
// skip over (..), [..], or {..} blocks
|
||||||
|
// @internal
|
||||||
|
void CCssParser::skipBlock()
|
||||||
|
{
|
||||||
|
ucchar startChar = _Style[_Position];
|
||||||
|
|
||||||
|
// block start
|
||||||
|
_Position++;
|
||||||
|
while(!is_eof() && !is_block_close(_Style[_Position], startChar))
|
||||||
|
{
|
||||||
|
if (maybe_escape())
|
||||||
|
// skip backslash and next char
|
||||||
|
_Position += 2;
|
||||||
|
else if (is_quote(_Style[_Position]))
|
||||||
|
skipString();
|
||||||
|
else if (is_block_open(_Style[_Position]))
|
||||||
|
skipBlock();
|
||||||
|
else
|
||||||
|
_Position++;
|
||||||
|
}
|
||||||
|
|
||||||
|
// block end
|
||||||
|
_Position++;
|
||||||
|
}
|
||||||
|
|
||||||
|
// ***************************************************************************
|
||||||
|
// skip over quoted string
|
||||||
|
// @internal
|
||||||
|
void CCssParser::skipString()
|
||||||
|
{
|
||||||
|
ucchar endChar = _Style[_Position];
|
||||||
|
|
||||||
|
// quote start
|
||||||
|
_Position++;
|
||||||
|
while(!is_eof() && _Style[_Position] != endChar)
|
||||||
|
{
|
||||||
|
if (maybe_escape())
|
||||||
|
_Position++;
|
||||||
|
|
||||||
|
_Position++;
|
||||||
|
}
|
||||||
|
|
||||||
|
// quote end
|
||||||
|
_Position++;
|
||||||
|
}
|
||||||
|
|
||||||
|
// ***************************************************************************
|
||||||
|
// @internal
|
||||||
|
void CCssParser::skipWhitespace()
|
||||||
|
{
|
||||||
|
while(!is_eof() && is_whitespace(_Style[_Position]))
|
||||||
|
_Position++;
|
||||||
|
}
|
||||||
|
|
||||||
|
// ***************************************************************************
|
||||||
|
// parse selector list
|
||||||
|
// @internal
|
||||||
|
std::vector<CCssSelector> CCssParser::parse_selector(const ucstring &sel, std::string &pseudoElement) const
|
||||||
|
{
|
||||||
|
std::vector<CCssSelector> result;
|
||||||
|
CCssSelector current;
|
||||||
|
|
||||||
|
pseudoElement.clear();
|
||||||
|
|
||||||
|
bool failed = false;
|
||||||
|
ucstring::size_type start = 0, pos = 0;
|
||||||
|
while(pos < sel.size())
|
||||||
|
{
|
||||||
|
ucstring uc;
|
||||||
|
uc = sel[pos];
|
||||||
|
if (is_nmchar(sel[pos]) && current.empty())
|
||||||
|
{
|
||||||
|
pos++;
|
||||||
|
|
||||||
|
while(pos < sel.size() && is_nmchar(sel[pos]))
|
||||||
|
pos++;
|
||||||
|
|
||||||
|
current.Element = toLower(sel.substr(start, pos - start).toUtf8());
|
||||||
|
start = pos;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
if(sel[pos] == '#')
|
||||||
|
{
|
||||||
|
pos++;
|
||||||
|
start=pos;
|
||||||
|
|
||||||
|
while(pos < sel.size() && is_nmchar(sel[pos]))
|
||||||
|
pos++;
|
||||||
|
|
||||||
|
current.Id = toLower(sel.substr(start, pos - start).toUtf8());
|
||||||
|
start = pos;
|
||||||
|
}
|
||||||
|
else if (sel[pos] == '.')
|
||||||
|
{
|
||||||
|
pos++;
|
||||||
|
start=pos;
|
||||||
|
|
||||||
|
// .classA.classB
|
||||||
|
while(pos < sel.size() && (is_nmchar(sel[pos]) || sel[pos] == '.'))
|
||||||
|
pos++;
|
||||||
|
|
||||||
|
current.setClass(toLower(sel.substr(start, pos - start).toUtf8()));
|
||||||
|
start = pos;
|
||||||
|
}
|
||||||
|
else if (sel[pos] == '[')
|
||||||
|
{
|
||||||
|
pos++;
|
||||||
|
start = pos;
|
||||||
|
|
||||||
|
if (is_whitespace(sel[pos]))
|
||||||
|
{
|
||||||
|
while(pos < sel.size() && is_whitespace(sel[pos]))
|
||||||
|
pos++;
|
||||||
|
|
||||||
|
start = pos;
|
||||||
|
}
|
||||||
|
|
||||||
|
ucstring key;
|
||||||
|
ucstring value;
|
||||||
|
ucchar op = ' ';
|
||||||
|
|
||||||
|
// key
|
||||||
|
while(pos < sel.size() && is_nmchar(sel[pos]))
|
||||||
|
pos++;
|
||||||
|
|
||||||
|
key = sel.substr(start, pos - start);
|
||||||
|
if (pos == sel.size()) break;
|
||||||
|
|
||||||
|
if (is_whitespace(sel[pos]))
|
||||||
|
{
|
||||||
|
while(pos < sel.size() && is_whitespace(sel[pos]))
|
||||||
|
pos++;
|
||||||
|
|
||||||
|
if (pos == sel.size()) break;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (sel[pos] == ']')
|
||||||
|
{
|
||||||
|
current.addAttribute(key.toUtf8());
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
// operand
|
||||||
|
op = sel[pos];
|
||||||
|
if (op == '~' || op == '|' || op == '^' || op == '$' || op == '*')
|
||||||
|
{
|
||||||
|
pos++;
|
||||||
|
if (pos == sel.size()) break;
|
||||||
|
}
|
||||||
|
|
||||||
|
// invalid rule?, eg [attr^value]
|
||||||
|
if (sel[pos] != '=')
|
||||||
|
{
|
||||||
|
while(pos < sel.size() && sel[pos] != ']')
|
||||||
|
pos++;
|
||||||
|
|
||||||
|
if (pos == sel.size()) break;
|
||||||
|
|
||||||
|
start = pos;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
// skip '='
|
||||||
|
pos++;
|
||||||
|
|
||||||
|
if (is_whitespace(sel[pos]))
|
||||||
|
{
|
||||||
|
while(pos < sel.size() && is_whitespace(sel[pos]))
|
||||||
|
pos++;
|
||||||
|
|
||||||
|
if (pos == sel.size()) break;
|
||||||
|
}
|
||||||
|
|
||||||
|
// value
|
||||||
|
start = pos;
|
||||||
|
bool quote = false;
|
||||||
|
char quoteOpen;
|
||||||
|
while(pos < sel.size())
|
||||||
|
{
|
||||||
|
if (sel[pos] == '\'' || sel[pos] == '"')
|
||||||
|
{
|
||||||
|
// value is quoted
|
||||||
|
start = pos;
|
||||||
|
pos++;
|
||||||
|
while(pos < sel.size() && sel[pos] != sel[start])
|
||||||
|
{
|
||||||
|
if (sel[pos] == '\\')
|
||||||
|
{
|
||||||
|
pos++;
|
||||||
|
}
|
||||||
|
pos++;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (pos == sel.size()) break;
|
||||||
|
|
||||||
|
value = sel.substr(start + 1, pos - start - 1);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
else if (sel[pos] == '\\')
|
||||||
|
{
|
||||||
|
pos++;
|
||||||
|
}
|
||||||
|
else if (!quote && sel[pos] == ']')
|
||||||
|
{
|
||||||
|
// unquoted value
|
||||||
|
value = sel.substr(start, pos - start);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
pos++;
|
||||||
|
} // while 'value'
|
||||||
|
|
||||||
|
// TODO: scan for sel[pos] == ']'
|
||||||
|
if (pos == sel.size()) break;
|
||||||
|
// whitespace between quote and ], ie '[ attr $= "val" ]'
|
||||||
|
if (sel[pos] != ']')
|
||||||
|
{
|
||||||
|
while(pos < sel.size() && sel[pos] != ']')
|
||||||
|
pos++;
|
||||||
|
}
|
||||||
|
if (pos == sel.size()) break;
|
||||||
|
|
||||||
|
current.addAttribute(key.toUtf8(), value.toUtf8(), (char)op);
|
||||||
|
} // op error
|
||||||
|
} // no value
|
||||||
|
|
||||||
|
// skip ']'
|
||||||
|
pos++;
|
||||||
|
|
||||||
|
start = pos;
|
||||||
|
}
|
||||||
|
else if (sel[pos] == ':')
|
||||||
|
{
|
||||||
|
pos++;
|
||||||
|
start=pos;
|
||||||
|
// pseudo element, eg '::before'
|
||||||
|
if (pos < sel.size() && sel[pos] == ':')
|
||||||
|
{
|
||||||
|
pos++;
|
||||||
|
}
|
||||||
|
// :first-child
|
||||||
|
// :nth-child(2n+0)
|
||||||
|
// :not(h1, div#main)
|
||||||
|
// :not(:nth-child(2n+0))
|
||||||
|
// has no support for quotes, eg :not(h1[attr=")"]) fails
|
||||||
|
while(pos < sel.size() && (is_nmchar(sel[pos]) || sel[pos] == '('))
|
||||||
|
{
|
||||||
|
if (sel[pos] == '(')
|
||||||
|
{
|
||||||
|
uint open = 1;
|
||||||
|
pos++;
|
||||||
|
while(pos < sel.size() && open > 0)
|
||||||
|
{
|
||||||
|
if (sel[pos] == ')')
|
||||||
|
open--;
|
||||||
|
else if (sel[pos] == '(')
|
||||||
|
open++;
|
||||||
|
|
||||||
|
pos++;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
pos++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
std::string key = toLower(sel.substr(start, pos - start).toUtf8());
|
||||||
|
if (key.empty())
|
||||||
|
{
|
||||||
|
failed = true;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (key[0] == ':' || key == "after" || key == "before" || key == "cue" || key == "first-letter" || key == "first-line")
|
||||||
|
{
|
||||||
|
if (!pseudoElement.empty())
|
||||||
|
{
|
||||||
|
failed = true;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
if (key[0] != ':')
|
||||||
|
{
|
||||||
|
pseudoElement = ":" + key;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
pseudoElement = key;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
current.addPseudoClass(key);
|
||||||
|
}
|
||||||
|
|
||||||
|
start = pos;
|
||||||
|
}
|
||||||
|
else if (!current.empty())
|
||||||
|
{
|
||||||
|
// pseudo element like ':before' can only be set on the last selector
|
||||||
|
// user action pseudo classes can be used after pseudo element (ie, :focus, :hover)
|
||||||
|
// there is no support for those and its safe to just fail the selector
|
||||||
|
if (!result.empty() && !pseudoElement.empty())
|
||||||
|
{
|
||||||
|
failed = true;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
// start new selector as combinator is part of next selector
|
||||||
|
result.push_back(current);
|
||||||
|
current = CCssSelector();
|
||||||
|
|
||||||
|
// detect and remove whitespace around combinator, eg ' > '
|
||||||
|
bool isSpace = is_whitespace(sel[pos]);;
|
||||||
|
while(pos < sel.size() && is_whitespace(sel[pos]))
|
||||||
|
pos++;
|
||||||
|
|
||||||
|
if (sel[pos] == '>' || sel[pos] == '+' || sel[pos] == '~')
|
||||||
|
{
|
||||||
|
current.Combinator = sel[pos];
|
||||||
|
pos++;
|
||||||
|
|
||||||
|
while(pos < sel.size() && is_whitespace(sel[pos]))
|
||||||
|
pos++;
|
||||||
|
}
|
||||||
|
else if (isSpace)
|
||||||
|
{
|
||||||
|
current.Combinator = ' ';
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
// unknown
|
||||||
|
current.Combinator = sel[pos];
|
||||||
|
pos++;
|
||||||
|
}
|
||||||
|
|
||||||
|
start = pos;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
pos++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (failed)
|
||||||
|
{
|
||||||
|
result.clear();
|
||||||
|
}
|
||||||
|
else if (result.empty() || !current.empty())
|
||||||
|
{
|
||||||
|
// pseudo element like ':before' can only be set on the last selector
|
||||||
|
if (!result.empty() && !pseudoElement.empty())
|
||||||
|
{
|
||||||
|
// failed
|
||||||
|
result.clear();
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
result.push_back(current);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
// ***************************************************************************
|
||||||
|
// @internal
|
||||||
|
void CCssParser::preprocess()
|
||||||
|
{
|
||||||
|
_Position = 0;
|
||||||
|
|
||||||
|
size_t start;
|
||||||
|
size_t charsLeft;
|
||||||
|
bool quote = false;
|
||||||
|
ucchar quoteChar;
|
||||||
|
while(!is_eof())
|
||||||
|
{
|
||||||
|
charsLeft = _Style.size() - _Position - 1;
|
||||||
|
|
||||||
|
// FF, CR
|
||||||
|
if (_Style[_Position] == 0x0C || _Style[_Position] == 0x0D)
|
||||||
|
{
|
||||||
|
uint len = 1;
|
||||||
|
// CR, LF
|
||||||
|
if (charsLeft >= 1 && _Style[_Position] == 0x0D && _Style[_Position+1] == 0x0A)
|
||||||
|
len++;
|
||||||
|
|
||||||
|
ucstring tmp;
|
||||||
|
tmp += 0x000A;
|
||||||
|
_Style.replace(_Position, 1, tmp);
|
||||||
|
}
|
||||||
|
else if (_Style[_Position] == 0x00)
|
||||||
|
{
|
||||||
|
// Unicode replacement character
|
||||||
|
_Style[_Position] = 0xFFFD;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
// strip comments for easier parsing
|
||||||
|
if (_Style[_Position] == '\\')
|
||||||
|
{
|
||||||
|
_Position++;
|
||||||
|
}
|
||||||
|
else if (is_quote(_Style[_Position]))
|
||||||
|
{
|
||||||
|
if (!quote)
|
||||||
|
quoteChar = _Style[_Position];
|
||||||
|
|
||||||
|
if (quote && _Style[_Position] == quoteChar)
|
||||||
|
quote = !quote;
|
||||||
|
}
|
||||||
|
else if (!quote && is_comment_open())
|
||||||
|
{
|
||||||
|
size_t pos = _Style.find(ucstring("*/"), _Position + 2);
|
||||||
|
if (pos == std::string::npos)
|
||||||
|
pos = _Style.size();
|
||||||
|
|
||||||
|
_Style.erase(_Position, pos - _Position + 2);
|
||||||
|
ucstring uc;
|
||||||
|
uc = _Style[_Position];
|
||||||
|
|
||||||
|
// _Position is already at correct place
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
_Position++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} // namespace
|
||||||
|
|
314
code/nel/src/gui/css_selector.cpp
Normal file
314
code/nel/src/gui/css_selector.cpp
Normal file
|
@ -0,0 +1,314 @@
|
||||||
|
// Ryzom - MMORPG Framework <http://dev.ryzom.com/projects/ryzom/>
|
||||||
|
// Copyright (C) 2010 Winch Gate Property Limited
|
||||||
|
//
|
||||||
|
// This program is free software: you can redistribute it and/or modify
|
||||||
|
// it under the terms of the GNU Affero 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 Affero General Public License for more details.
|
||||||
|
//
|
||||||
|
// You should have received a copy of the GNU Affero General Public License
|
||||||
|
// along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
|
||||||
|
#include "stdpch.h"
|
||||||
|
|
||||||
|
#include <string>
|
||||||
|
#include "nel/misc/types_nl.h"
|
||||||
|
#include "nel/gui/css_selector.h"
|
||||||
|
#include "nel/gui/html_element.h"
|
||||||
|
|
||||||
|
using namespace NLMISC;
|
||||||
|
|
||||||
|
#ifdef DEBUG_NEW
|
||||||
|
#define new DEBUG_NEW
|
||||||
|
#endif
|
||||||
|
|
||||||
|
namespace NLGUI
|
||||||
|
{
|
||||||
|
CCssSelector::CCssSelector(std::string elm, std::string id, std::string cls, char comb)
|
||||||
|
: Element(elm), Id(id), Class(), Attr(), PseudoClass(), Combinator(comb)
|
||||||
|
{
|
||||||
|
if (!cls.empty())
|
||||||
|
{
|
||||||
|
setClass(cls);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
uint32 CCssSelector::specificity() const
|
||||||
|
{
|
||||||
|
uint ret = 0;
|
||||||
|
|
||||||
|
if (!Element.empty() && Element != "*") ret += 0x000001;
|
||||||
|
// Pseudo Element is added in CCssStyle
|
||||||
|
//if (!PseudoElement.empty()) ret += 0x000001;
|
||||||
|
|
||||||
|
if (!Class.empty()) ret += 0x000100 * Class.size();
|
||||||
|
if (!Attr.empty()) ret += 0x000100 * Attr.size();
|
||||||
|
// TODO: has different cases
|
||||||
|
if (!PseudoClass.empty()) ret += 0x000100 * PseudoClass.size();
|
||||||
|
|
||||||
|
if (!Id.empty()) ret += 0x010000;
|
||||||
|
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
void CCssSelector::setClass(const std::string &cls)
|
||||||
|
{
|
||||||
|
std::vector<std::string> parts;
|
||||||
|
NLMISC::splitString(toLower(cls), ".", parts);
|
||||||
|
|
||||||
|
for(uint i = 0; i< parts.size(); i++)
|
||||||
|
{
|
||||||
|
std::string cname = trim(parts[i]);
|
||||||
|
if (!cname.empty())
|
||||||
|
{
|
||||||
|
Class.push_back(cname);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void CCssSelector::addAttribute(const std::string &key, const std::string &val, char op)
|
||||||
|
{
|
||||||
|
Attr.push_back(SAttribute(key, val, op));
|
||||||
|
}
|
||||||
|
|
||||||
|
void CCssSelector::addPseudoClass(const std::string &key)
|
||||||
|
{
|
||||||
|
if (key.empty()) return;
|
||||||
|
|
||||||
|
PseudoClass.push_back(key);
|
||||||
|
}
|
||||||
|
|
||||||
|
bool CCssSelector::match(const CHtmlElement &elm) const
|
||||||
|
{
|
||||||
|
if (!Element.empty() && Element != "*" && Element != elm.Value)
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!Id.empty() && Id != elm.getAttribute("id"))
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!Class.empty() && !matchClass(elm))
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!Attr.empty() && !matchAttributes(elm))
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!PseudoClass.empty() && !matchPseudoClass(elm))
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool CCssSelector::matchClass(const CHtmlElement &elm) const
|
||||||
|
{
|
||||||
|
// make sure all class names we have, other has as well
|
||||||
|
for(uint i = 0; i< Class.size(); ++i)
|
||||||
|
{
|
||||||
|
if (!elm.hasClass(Class[i]))
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool CCssSelector::matchAttributes(const CHtmlElement &elm) const
|
||||||
|
{
|
||||||
|
// TODO: refactor into matchAttributeSelector
|
||||||
|
for(uint i = 0; i< Attr.size(); ++i)
|
||||||
|
{
|
||||||
|
if (!elm.hasAttribute(Attr[i].key)) return false;
|
||||||
|
|
||||||
|
std::string value = elm.getAttribute(Attr[i].key);
|
||||||
|
switch(Attr[i].op)
|
||||||
|
{
|
||||||
|
case '=':
|
||||||
|
if (Attr[i].value != value) return false;
|
||||||
|
break;
|
||||||
|
case '~':
|
||||||
|
{
|
||||||
|
// exact match to any of whitespace separated words from element attribute
|
||||||
|
if (Attr[i].value.empty()) return false;
|
||||||
|
|
||||||
|
std::vector<std::string> parts;
|
||||||
|
NLMISC::splitString(value, " ", parts);
|
||||||
|
bool found = false;
|
||||||
|
for(uint j = 0; j < parts.size(); j++)
|
||||||
|
{
|
||||||
|
if (Attr[i].value == parts[j])
|
||||||
|
{
|
||||||
|
found = true;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (!found) return false;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case '|':
|
||||||
|
// exact value, or start with val+'-'
|
||||||
|
if (value != Attr[i].value && value.find(Attr[i].value + "-") == std::string::npos) return false;
|
||||||
|
break;
|
||||||
|
case '^':
|
||||||
|
// prefix, starts with
|
||||||
|
if (Attr[i].value.empty()) return false;
|
||||||
|
if (value.find(Attr[i].value) != 0) return false;
|
||||||
|
break;
|
||||||
|
case '$':
|
||||||
|
// suffic, ends with
|
||||||
|
if (Attr[i].value.empty() || value.size() < Attr[i].value.size()) return false;
|
||||||
|
if (Attr[i].value == value.substr(value.size() - Attr[i].value.size())) return false;
|
||||||
|
break;
|
||||||
|
case '*':
|
||||||
|
if (Attr[i].value.empty()) return false;
|
||||||
|
if (value.find(Attr[i].value) == std::string::npos) return false;
|
||||||
|
break;
|
||||||
|
case ' ':
|
||||||
|
// contains key, ignore value
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
// unknown comparison
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool CCssSelector::matchPseudoClass(const CHtmlElement &elm) const
|
||||||
|
{
|
||||||
|
for(uint i = 0; i< PseudoClass.size(); i++)
|
||||||
|
{
|
||||||
|
if (PseudoClass[i] == "root")
|
||||||
|
{
|
||||||
|
// ':root' is just 'html' with higher specificity
|
||||||
|
if (elm.Value != "html") return false;
|
||||||
|
}
|
||||||
|
else if (PseudoClass[i] == "only-child")
|
||||||
|
{
|
||||||
|
if (elm.parent && !elm.parent->Children.empty()) return false;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if (PseudoClass[i] == "first-child")
|
||||||
|
{
|
||||||
|
if (elm.previousSibling) return false;
|
||||||
|
}
|
||||||
|
else if (PseudoClass[i] == "last-child")
|
||||||
|
{
|
||||||
|
if (elm.nextSibling) return false;
|
||||||
|
}
|
||||||
|
else if (PseudoClass[i].find("nth-child(") != std::string::npos)
|
||||||
|
{
|
||||||
|
sint a, b;
|
||||||
|
// TODO: there might be multiple :nth-child() on single selector, so current can't cache it
|
||||||
|
parseNth(PseudoClass[i], a, b);
|
||||||
|
|
||||||
|
// 1st child should be '1' and not '0'
|
||||||
|
if (!matchNth(elm.childIndex+1, a, b)) return false;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
void CCssSelector::parseNth(const std::string &pseudo, sint &a, sint &b) const
|
||||||
|
{
|
||||||
|
a = 0;
|
||||||
|
b = 0;
|
||||||
|
|
||||||
|
std::string::size_type start = pseudo.find_first_of("(") + 1;
|
||||||
|
std::string::size_type end = pseudo.find_first_of(")");
|
||||||
|
|
||||||
|
if (start == std::string::npos) return;
|
||||||
|
|
||||||
|
std::string expr = toLower(pseudo.substr(start, end - start));
|
||||||
|
|
||||||
|
if (expr.empty()) return;
|
||||||
|
|
||||||
|
if (expr == "even")
|
||||||
|
{
|
||||||
|
// 2n+0
|
||||||
|
a = 2;
|
||||||
|
b = 0;
|
||||||
|
}
|
||||||
|
else if (expr == "odd")
|
||||||
|
{
|
||||||
|
// 2n+1
|
||||||
|
a = 2;
|
||||||
|
b = 1;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
// -An+B, An+B, An-B
|
||||||
|
std::string::size_type pos;
|
||||||
|
|
||||||
|
start = 0;
|
||||||
|
pos = expr.find_first_of("n", start);
|
||||||
|
if (pos == std::string::npos)
|
||||||
|
{
|
||||||
|
fromString(expr, b);
|
||||||
|
}
|
||||||
|
else if (pos == 0)
|
||||||
|
{
|
||||||
|
// 'n' == '1n'
|
||||||
|
a = 1;
|
||||||
|
}
|
||||||
|
else if (expr[0] == '-' && pos == 1)
|
||||||
|
{
|
||||||
|
// '-n' == '-1n'
|
||||||
|
a = -1;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
fromString(expr.substr(start, pos - start), a);
|
||||||
|
}
|
||||||
|
|
||||||
|
start = pos;
|
||||||
|
pos = expr.find_first_of("+-", start);
|
||||||
|
if (pos != std::string::npos && (expr[pos] == '+' || expr[pos] == '-'))
|
||||||
|
{
|
||||||
|
// copy with sign char
|
||||||
|
fromString(expr.substr(pos, end - pos), b);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
bool CCssSelector::matchNth(sint childNr, sint a, sint b) const
|
||||||
|
{
|
||||||
|
if (a == 0)
|
||||||
|
{
|
||||||
|
return childNr == b;
|
||||||
|
}
|
||||||
|
else if (a > 0)
|
||||||
|
{
|
||||||
|
return childNr >= b && (childNr - b) % a == 0;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
// a is negative from '-An+B'
|
||||||
|
return childNr <= b && (b - childNr) % (-a) == 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
} // namespace
|
||||||
|
|
1259
code/nel/src/gui/css_style.cpp
Normal file
1259
code/nel/src/gui/css_style.cpp
Normal file
File diff suppressed because it is too large
Load diff
File diff suppressed because it is too large
Load diff
|
@ -843,6 +843,19 @@ namespace NLGUI
|
||||||
ratio -= _Columns[i].TableRatio;
|
ratio -= _Columns[i].TableRatio;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// force table width to fit all columns
|
||||||
|
// if width is set, then use column min width
|
||||||
|
if (ForceWidthMin > 0)
|
||||||
|
tableWidthMax = std::min(_LastParentW - borderWidth, std::max(tableWidthMax, tableWidth));
|
||||||
|
else
|
||||||
|
tableWidthMax = std::min(_LastParentW - borderWidth, std::max(tableWidthMax, tableMaxContentWidth));
|
||||||
|
|
||||||
|
if (tableWidthMax < 0)
|
||||||
|
tableWidthMax = 0;
|
||||||
|
|
||||||
|
if (tableWidthMax < tableWidthMin)
|
||||||
|
std::swap(tableWidthMin, tableWidthMax);
|
||||||
|
|
||||||
// Eval table size with all percent cells resized
|
// Eval table size with all percent cells resized
|
||||||
sint32 tableWidthSizeAfterPercent = tableWidth;
|
sint32 tableWidthSizeAfterPercent = tableWidth;
|
||||||
for (i=0; i<_Columns.size(); i++)
|
for (i=0; i<_Columns.size(); i++)
|
||||||
|
|
168
code/nel/src/gui/html_element.cpp
Normal file
168
code/nel/src/gui/html_element.cpp
Normal file
|
@ -0,0 +1,168 @@
|
||||||
|
// Ryzom - MMORPG Framework <http://dev.ryzom.com/projects/ryzom/>
|
||||||
|
// Copyright (C) 2010 Winch Gate Property Limited
|
||||||
|
//
|
||||||
|
// This program is free software: you can redistribute it and/or modify
|
||||||
|
// it under the terms of the GNU Affero 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 Affero General Public License for more details.
|
||||||
|
//
|
||||||
|
// You should have received a copy of the GNU Affero General Public License
|
||||||
|
// along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
|
||||||
|
|
||||||
|
#include "stdpch.h"
|
||||||
|
|
||||||
|
#include "nel/gui/html_element.h"
|
||||||
|
|
||||||
|
using namespace std;
|
||||||
|
using namespace NLMISC;
|
||||||
|
|
||||||
|
#ifdef DEBUG_NEW
|
||||||
|
#define new DEBUG_NEW
|
||||||
|
#endif
|
||||||
|
|
||||||
|
namespace NLGUI
|
||||||
|
{
|
||||||
|
// ***************************************************************************
|
||||||
|
CHtmlElement::CHtmlElement(ENodeType type, std::string value)
|
||||||
|
: ID(0), Type(type), Value(value), parent(NULL), previousSibling(NULL), nextSibling(NULL), childIndex(0)
|
||||||
|
{}
|
||||||
|
|
||||||
|
// ***************************************************************************
|
||||||
|
bool CHtmlElement::hasAttribute(const std::string &key) const
|
||||||
|
{
|
||||||
|
return Attributes.find(key) != Attributes.end();
|
||||||
|
}
|
||||||
|
|
||||||
|
// ***************************************************************************
|
||||||
|
bool CHtmlElement::hasNonEmptyAttribute(const std::string &key) const
|
||||||
|
{
|
||||||
|
return !getAttribute(key).empty();
|
||||||
|
}
|
||||||
|
|
||||||
|
// ***************************************************************************
|
||||||
|
std::string CHtmlElement::getAttribute(const std::string &key) const
|
||||||
|
{
|
||||||
|
std::map<std::string, std::string>::const_iterator it = Attributes.find(key);
|
||||||
|
return (it != Attributes.end() ? it->second : "");
|
||||||
|
}
|
||||||
|
|
||||||
|
// ***************************************************************************
|
||||||
|
bool CHtmlElement::hasClass(const std::string &key) const
|
||||||
|
{
|
||||||
|
return ClassNames.find(key) != ClassNames.end();
|
||||||
|
}
|
||||||
|
|
||||||
|
// ***************************************************************************
|
||||||
|
void CHtmlElement::reindexChilds()
|
||||||
|
{
|
||||||
|
uint index = 0;
|
||||||
|
CHtmlElement *prev = NULL;
|
||||||
|
std::list<CHtmlElement>::iterator it;
|
||||||
|
for(it = Children.begin(); it != Children.end(); ++it)
|
||||||
|
{
|
||||||
|
if (it->Type == ELEMENT_NODE)
|
||||||
|
{
|
||||||
|
it->parent = this;
|
||||||
|
it->previousSibling = prev;
|
||||||
|
it->nextSibling = NULL;
|
||||||
|
if (prev)
|
||||||
|
{
|
||||||
|
prev->nextSibling = &(*it);
|
||||||
|
}
|
||||||
|
it->childIndex = index;
|
||||||
|
index++;
|
||||||
|
prev = &(*it);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// ***************************************************************************
|
||||||
|
std::string CHtmlElement::toString(bool tree, uint depth) const
|
||||||
|
{
|
||||||
|
std::string result;
|
||||||
|
if (depth > 0)
|
||||||
|
{
|
||||||
|
result = NLMISC::toString("[%d]", depth);
|
||||||
|
result.append(depth, '-');
|
||||||
|
}
|
||||||
|
if (Type == NONE || Type == ELEMENT_NODE)
|
||||||
|
{
|
||||||
|
result += "<" + Value;
|
||||||
|
for(std::map<std::string, std::string>::const_iterator it = Attributes.begin(); it != Attributes.end(); ++it)
|
||||||
|
{
|
||||||
|
if (it->first == "class")
|
||||||
|
{
|
||||||
|
result += " class=\"";
|
||||||
|
for(std::set<std::string>::const_iterator it2 = ClassNames.begin(); it2 != ClassNames.end(); ++it2)
|
||||||
|
{
|
||||||
|
if (it2 != ClassNames.begin())
|
||||||
|
{
|
||||||
|
result += " ";
|
||||||
|
}
|
||||||
|
result += *it2;
|
||||||
|
}
|
||||||
|
result += "\"";
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
result += " " + it->first + "=\"" + it->second + "\"";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
result += NLMISC::toString(" data-debug=\"childIndex: %d\"", childIndex);
|
||||||
|
result += ">";
|
||||||
|
|
||||||
|
if (tree)
|
||||||
|
{
|
||||||
|
result += "\n";
|
||||||
|
for(std::list<CHtmlElement>::const_iterator it = Children.begin(); it != Children.end(); ++it)
|
||||||
|
{
|
||||||
|
result += it->toString(tree, depth+1);
|
||||||
|
}
|
||||||
|
if (depth > 0)
|
||||||
|
{
|
||||||
|
result += NLMISC::toString("[%d]", depth);
|
||||||
|
result.append(depth, '-');
|
||||||
|
}
|
||||||
|
result += "</" + Value + ">\n";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if (Value.find("\n") == std::string::npos)
|
||||||
|
{
|
||||||
|
result += "{" + Value + "}";
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
result += "{";
|
||||||
|
std::string::size_type start = 0;
|
||||||
|
std::string::size_type pos = Value.find_first_of("\n\r\t");
|
||||||
|
while(pos != std::string::npos)
|
||||||
|
{
|
||||||
|
result += Value.substr(start, pos - start);
|
||||||
|
if (Value[pos] == '\n')
|
||||||
|
{
|
||||||
|
result += "⏎";
|
||||||
|
}
|
||||||
|
else if (Value[pos] == '\t')
|
||||||
|
{
|
||||||
|
result += "⇥";
|
||||||
|
}
|
||||||
|
|
||||||
|
start = pos+1;
|
||||||
|
pos = Value.find_first_of("\n\r\t", start);
|
||||||
|
}
|
||||||
|
result += "}";
|
||||||
|
}
|
||||||
|
if (tree) result += "\n";
|
||||||
|
}
|
||||||
|
|
||||||
|
return result;
|
||||||
|
};
|
||||||
|
} // namespace
|
|
@ -17,13 +17,14 @@
|
||||||
|
|
||||||
#include "stdpch.h"
|
#include "stdpch.h"
|
||||||
|
|
||||||
|
#include "nel/gui/html_parser.h"
|
||||||
|
|
||||||
#include <string>
|
#include <string>
|
||||||
#include <libxml/HTMLparser.h>
|
#include <libxml/HTMLparser.h>
|
||||||
|
|
||||||
#include "nel/misc/types_nl.h"
|
#include "nel/misc/types_nl.h"
|
||||||
#include "nel/gui/libwww.h"
|
#include "nel/gui/libwww.h"
|
||||||
#include "nel/gui/group_html.h"
|
#include "nel/gui/group_html.h"
|
||||||
#include "nel/gui/lua_ihm.h"
|
|
||||||
|
|
||||||
using namespace std;
|
using namespace std;
|
||||||
using namespace NLMISC;
|
using namespace NLMISC;
|
||||||
|
@ -34,83 +35,162 @@ using namespace NLMISC;
|
||||||
|
|
||||||
namespace NLGUI
|
namespace NLGUI
|
||||||
{
|
{
|
||||||
|
|
||||||
// ***************************************************************************
|
// ***************************************************************************
|
||||||
void CGroupHTML::htmlElement(xmlNode *node, int element_number)
|
void CHtmlParser::parseStyle(xmlNode *a_node, std::string &styleString) const
|
||||||
{
|
{
|
||||||
SGML_dtd *HTML_DTD = HTML_dtd ();
|
xmlNode *node = a_node;
|
||||||
|
while(node)
|
||||||
if (element_number < HTML_ELEMENTS)
|
|
||||||
{
|
{
|
||||||
CXMLAutoPtr ptr;
|
if (node->type == XML_CDATA_SECTION_NODE)
|
||||||
// load attributes into libwww structs
|
|
||||||
std::vector<bool> present;
|
|
||||||
std::vector<const char *>value;
|
|
||||||
std::string strvalues[MAX_ATTRIBUTES];
|
|
||||||
present.resize(30, false);
|
|
||||||
value.resize(30);
|
|
||||||
|
|
||||||
uint nbAttributes = std::min(MAX_ATTRIBUTES, HTML_DTD->tags[element_number].number_of_attributes);
|
|
||||||
for(uint i=0; i<nbAttributes; i++)
|
|
||||||
{
|
{
|
||||||
std::string name;
|
styleString += (const char*)node->content;
|
||||||
name = toLower(std::string(HTML_DTD->tags[element_number].attributes[i].name));
|
}
|
||||||
ptr = xmlGetProp(node, (const xmlChar *)name.c_str());
|
else
|
||||||
if (ptr)
|
{
|
||||||
{
|
nlwarning("<style> tag has child elements other than cdata[%d]", node->type);
|
||||||
// copy xmlChar to string (xmlChar will be released)
|
|
||||||
strvalues[i] = (const char *)(ptr);
|
|
||||||
// now use string pointer in value[] array
|
|
||||||
value[i] = strvalues[i].c_str();
|
|
||||||
present[i] = true;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
beginElement(element_number, present, value);
|
node = node->next;
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
beginUnparsedElement((const char *)(node->name), xmlStrlen(node->name));
|
|
||||||
}
|
|
||||||
|
|
||||||
// recursive - text content / child nodes
|
|
||||||
htmlWalkDOM(node->children);
|
|
||||||
|
|
||||||
// closing tag
|
|
||||||
if (element_number < HTML_ELEMENTS)
|
|
||||||
{
|
|
||||||
endElement(element_number);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
endUnparsedElement((const char *)(node->name), xmlStrlen(node->name));
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// ***************************************************************************
|
// ***************************************************************************
|
||||||
// recursive function to walk html document
|
// recursive function to walk html document
|
||||||
void CGroupHTML::htmlWalkDOM(xmlNode *a_node)
|
void CHtmlParser::parseNode(xmlNode *a_node, CHtmlElement &parent, std::string &styleString, std::vector<std::string> &links) const
|
||||||
{
|
{
|
||||||
SGML_dtd *HTML_DTD = HTML_dtd ();
|
uint childIndex = 0;
|
||||||
|
|
||||||
uint element_number;
|
uint element_number;
|
||||||
xmlNode *node = a_node;
|
xmlNode *node = a_node;
|
||||||
while(node)
|
while(node)
|
||||||
{
|
{
|
||||||
if (node->type == XML_TEXT_NODE)
|
if (node->type == XML_TEXT_NODE)
|
||||||
{
|
{
|
||||||
addText((const char *)(node->content), xmlStrlen(node->content));
|
parent.Children.push_back(CHtmlElement(CHtmlElement::TEXT_NODE, (const char*)(node->content)));
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
if (node->type == XML_ELEMENT_NODE)
|
if (node->type == XML_ELEMENT_NODE)
|
||||||
{
|
{
|
||||||
// find libwww tag
|
// find html element
|
||||||
for(element_number = 0; element_number<HTML_ELEMENTS; ++element_number)
|
element_number = htmlElementLookup((const char*)node->name);
|
||||||
|
|
||||||
|
// get pointer to previous sibling
|
||||||
|
CHtmlElement *prevSibling = NULL;
|
||||||
|
if (!parent.Children.empty())
|
||||||
{
|
{
|
||||||
if (xmlStrncasecmp(node->name, (const xmlChar *)HTML_DTD->tags[element_number].name.c_str(), xmlStrlen(node->name)) == 0)
|
// skip text nodes
|
||||||
break;
|
for(std::list<CHtmlElement>::reverse_iterator it = parent.Children.rbegin(); it != parent.Children.rend(); ++it)
|
||||||
|
{
|
||||||
|
if (it->Type == CHtmlElement::ELEMENT_NODE)
|
||||||
|
{
|
||||||
|
prevSibling = &(*it);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
htmlElement(node, element_number);
|
parent.Children.push_back(CHtmlElement(CHtmlElement::ELEMENT_NODE, toLower((const char*)node->name)));
|
||||||
|
CHtmlElement &elm = parent.Children.back();
|
||||||
|
elm.ID = element_number;
|
||||||
|
elm.parent = &parent;
|
||||||
|
elm.childIndex = childIndex;
|
||||||
|
|
||||||
|
// previous/next sibling that is ELEMENT_NODE
|
||||||
|
elm.previousSibling = prevSibling;
|
||||||
|
if (prevSibling)
|
||||||
|
{
|
||||||
|
prevSibling->nextSibling = &parent.Children.back();
|
||||||
|
}
|
||||||
|
|
||||||
|
childIndex++;
|
||||||
|
|
||||||
|
// TODO: harvest <link type="css">, <style>, <img>
|
||||||
|
|
||||||
|
elm.Attributes.clear();
|
||||||
|
|
||||||
|
for (xmlAttr *cur_attr = node->properties; cur_attr; cur_attr = cur_attr->next) {
|
||||||
|
std::string key(toLower((const char *)(cur_attr->name)));
|
||||||
|
std::string value;
|
||||||
|
if (cur_attr->children)
|
||||||
|
{
|
||||||
|
value = (const char *)(cur_attr->children->content);
|
||||||
|
}
|
||||||
|
elm.Attributes[key] = value;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (elm.hasAttribute("class"))
|
||||||
|
{
|
||||||
|
std::vector<std::string> parts;
|
||||||
|
NLMISC::splitString(elm.getAttribute("class"), " ", parts);
|
||||||
|
for(uint i = 0; i<parts.size();++i)
|
||||||
|
{
|
||||||
|
elm.ClassNames.insert(toLower(trim(parts[i])));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (elm.Value == "style")
|
||||||
|
{
|
||||||
|
// <style type="text/css" media="all, screen">
|
||||||
|
// ...
|
||||||
|
// </style>
|
||||||
|
bool useStyle = true;
|
||||||
|
if (elm.hasAttribute("media"))
|
||||||
|
{
|
||||||
|
std::string media = trim(toLower(elm.Attributes["media"]));
|
||||||
|
useStyle = media.empty() || media.find("all") != std::string::npos || media.find("screen") != std::string::npos;
|
||||||
|
|
||||||
|
// <style media="ryzom"> for ingame browser
|
||||||
|
useStyle = useStyle || media == "ryzom";
|
||||||
|
}
|
||||||
|
|
||||||
|
if (useStyle)
|
||||||
|
{
|
||||||
|
parseStyle(node->children, styleString);
|
||||||
|
}
|
||||||
|
// style tag is kept in dom
|
||||||
|
}
|
||||||
|
if (elm.Value == "link" && elm.getAttribute("rel") == "stylesheet")
|
||||||
|
{
|
||||||
|
bool useStyle = true;
|
||||||
|
if (elm.hasAttribute("media"))
|
||||||
|
{
|
||||||
|
std::string media = trim(toLower(elm.Attributes["media"]));
|
||||||
|
useStyle = media.empty() || media.find("all") != std::string::npos || media.find("screen") != std::string::npos;
|
||||||
|
|
||||||
|
// <style media="ryzom"> for ingame browser
|
||||||
|
useStyle = useStyle || media == "ryzom";
|
||||||
|
}
|
||||||
|
|
||||||
|
if (useStyle)
|
||||||
|
{
|
||||||
|
links.push_back(elm.getAttribute("href"));
|
||||||
|
}
|
||||||
|
// link tag is kept in dom
|
||||||
|
}
|
||||||
|
else if (node->children)
|
||||||
|
{
|
||||||
|
parseNode(node->children, elm, styleString, links);
|
||||||
|
|
||||||
|
// must cleanup nested tags that libxml2 does not fix
|
||||||
|
// dt without end tag: <dl><dt><dt></dl>
|
||||||
|
// dd without end tag: <dl><dd><dd></dl>
|
||||||
|
if (!elm.Children.empty() && (elm.Value == "dt" || elm.Value == "dd"))
|
||||||
|
{
|
||||||
|
std::string tag = elm.Value;
|
||||||
|
std::list<CHtmlElement>::iterator it;
|
||||||
|
for(it = elm.Children.begin(); it != elm.Children.end(); ++it)
|
||||||
|
{
|
||||||
|
if (it->Type == CHtmlElement::ELEMENT_NODE && it->Value == tag)
|
||||||
|
{
|
||||||
|
// relocate this and remaining elements over to parent
|
||||||
|
parent.Children.splice(parent.Children.end(), elm.Children, it, elm.Children.end());
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
elm.reindexChilds();
|
||||||
|
parent.reindexChilds();
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// move into next sibling
|
// move into next sibling
|
||||||
|
@ -297,13 +377,13 @@ namespace NLGUI
|
||||||
}
|
}
|
||||||
|
|
||||||
// ***************************************************************************
|
// ***************************************************************************
|
||||||
bool CGroupHTML::parseHtml(std::string htmlString)
|
void CHtmlParser::getDOM(std::string htmlString, CHtmlElement &dom, std::string &styleString, std::vector<std::string> &links) const
|
||||||
{
|
{
|
||||||
htmlParserCtxtPtr parser = htmlCreatePushParserCtxt(NULL, NULL, NULL, 0, NULL, XML_CHAR_ENCODING_UTF8);
|
htmlParserCtxtPtr parser = htmlCreatePushParserCtxt(NULL, NULL, NULL, 0, NULL, XML_CHAR_ENCODING_UTF8);
|
||||||
if (!parser)
|
if (!parser)
|
||||||
{
|
{
|
||||||
nlwarning("Creating html parser context failed");
|
nlwarning("Creating html parser context failed");
|
||||||
return false;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
htmlCtxtUseOptions(parser, HTML_PARSE_NOBLANKS | HTML_PARSE_NOERROR | HTML_PARSE_NOWARNING | HTML_PARSE_NONET);
|
htmlCtxtUseOptions(parser, HTML_PARSE_NOBLANKS | HTML_PARSE_NOERROR | HTML_PARSE_NOWARNING | HTML_PARSE_NONET);
|
||||||
|
@ -314,43 +394,28 @@ namespace NLGUI
|
||||||
htmlParseChunk(parser, htmlString.c_str(), htmlString.size(), 0);
|
htmlParseChunk(parser, htmlString.c_str(), htmlString.size(), 0);
|
||||||
htmlParseChunk(parser, "", 0, 1);
|
htmlParseChunk(parser, "", 0, 1);
|
||||||
|
|
||||||
bool success = true;
|
|
||||||
if (parser->myDoc)
|
if (parser->myDoc)
|
||||||
{
|
{
|
||||||
xmlNode *root = xmlDocGetRootElement(parser->myDoc);
|
xmlNode *root = xmlDocGetRootElement(parser->myDoc);
|
||||||
if (root)
|
if (root)
|
||||||
{
|
{
|
||||||
htmlWalkDOM(root);
|
styleString.clear();
|
||||||
|
parseNode(root, dom, styleString, links);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
nlwarning("html root node failed");
|
nlwarning("html root node failed");
|
||||||
success = false;
|
|
||||||
}
|
}
|
||||||
xmlFreeDoc(parser->myDoc);
|
xmlFreeDoc(parser->myDoc);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
nlwarning("htmlstring parsing failed");
|
nlwarning("htmlstring parsing failed");
|
||||||
success = false;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
htmlFreeParserCtxt(parser);
|
htmlFreeParserCtxt(parser);
|
||||||
return success;
|
|
||||||
}
|
|
||||||
|
|
||||||
// ***************************************************************************
|
|
||||||
int CGroupHTML::luaParseHtml(CLuaState &ls)
|
|
||||||
{
|
|
||||||
const char *funcName = "parseHtml";
|
|
||||||
CLuaIHM::checkArgCount(ls, funcName, 1);
|
|
||||||
CLuaIHM::checkArgType(ls, funcName, 1, LUA_TSTRING);
|
|
||||||
std::string html = ls.toString(1);
|
|
||||||
|
|
||||||
parseHtml(html);
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -29,6 +29,167 @@ using namespace NLMISC;
|
||||||
|
|
||||||
namespace NLGUI
|
namespace NLGUI
|
||||||
{
|
{
|
||||||
|
struct CNameToHtmlElement
|
||||||
|
{
|
||||||
|
HTMLElement ID;
|
||||||
|
const char* Name;
|
||||||
|
CNameToHtmlElement(HTMLElement id, const char*name)
|
||||||
|
: ID(id), Name(name) {}
|
||||||
|
};
|
||||||
|
|
||||||
|
// sorted list of HTML_ELEMENT enum to TAG name
|
||||||
|
static CNameToHtmlElement htmlElementToName[] =
|
||||||
|
{
|
||||||
|
CNameToHtmlElement(HTML_A, "a"),
|
||||||
|
CNameToHtmlElement(HTML_ABBR, "abbr"),
|
||||||
|
CNameToHtmlElement(HTML_ADDRESS, "address"),
|
||||||
|
CNameToHtmlElement(HTML_APPLET, "applet"),
|
||||||
|
CNameToHtmlElement(HTML_AREA, "area"),
|
||||||
|
CNameToHtmlElement(HTML_ARTICLE, "article"),
|
||||||
|
CNameToHtmlElement(HTML_ASIDE, "aside"),
|
||||||
|
CNameToHtmlElement(HTML_AUDIO, "audio"),
|
||||||
|
CNameToHtmlElement(HTML_B, "b"),
|
||||||
|
CNameToHtmlElement(HTML_BASE, "base"),
|
||||||
|
CNameToHtmlElement(HTML_BDI, "bdi"),
|
||||||
|
CNameToHtmlElement(HTML_BDO, "bdo"),
|
||||||
|
CNameToHtmlElement(HTML_BLOCKQUOTE, "blockquote"),
|
||||||
|
CNameToHtmlElement(HTML_BODY, "body"),
|
||||||
|
CNameToHtmlElement(HTML_BR, "br"),
|
||||||
|
CNameToHtmlElement(HTML_BUTTON, "button"),
|
||||||
|
CNameToHtmlElement(HTML_CANVAS, "canvas"),
|
||||||
|
CNameToHtmlElement(HTML_CAPTION, "caption"),
|
||||||
|
CNameToHtmlElement(HTML_CITE, "cite"),
|
||||||
|
CNameToHtmlElement(HTML_CODE, "code"),
|
||||||
|
CNameToHtmlElement(HTML_COL, "col"),
|
||||||
|
CNameToHtmlElement(HTML_COLGROUP, "colgroup"),
|
||||||
|
CNameToHtmlElement(HTML_DATA, "data"),
|
||||||
|
CNameToHtmlElement(HTML_DATALIST, "datalist"),
|
||||||
|
CNameToHtmlElement(HTML_DD, "dd"),
|
||||||
|
CNameToHtmlElement(HTML_DEL, "del"),
|
||||||
|
CNameToHtmlElement(HTML_DETAILS, "details"),
|
||||||
|
CNameToHtmlElement(HTML_DFN, "dfn"),
|
||||||
|
CNameToHtmlElement(HTML_DIALOG, "dialog"),
|
||||||
|
CNameToHtmlElement(HTML_DIR, "dir"),
|
||||||
|
CNameToHtmlElement(HTML_DIV, "div"),
|
||||||
|
CNameToHtmlElement(HTML_DL, "dl"),
|
||||||
|
CNameToHtmlElement(HTML_DT, "dt"),
|
||||||
|
CNameToHtmlElement(HTML_EM, "em"),
|
||||||
|
CNameToHtmlElement(HTML_EMBED, "embed"),
|
||||||
|
CNameToHtmlElement(HTML_FIELDSET, "fieldset"),
|
||||||
|
CNameToHtmlElement(HTML_FIGCAPTION, "figcaption"),
|
||||||
|
CNameToHtmlElement(HTML_FIGURE, "figure"),
|
||||||
|
CNameToHtmlElement(HTML_FONT, "font"),
|
||||||
|
CNameToHtmlElement(HTML_FOOTER, "footer"),
|
||||||
|
CNameToHtmlElement(HTML_FORM, "form"),
|
||||||
|
CNameToHtmlElement(HTML_H1, "h1"),
|
||||||
|
CNameToHtmlElement(HTML_H2, "h2"),
|
||||||
|
CNameToHtmlElement(HTML_H3, "h3"),
|
||||||
|
CNameToHtmlElement(HTML_H4, "h4"),
|
||||||
|
CNameToHtmlElement(HTML_H5, "h5"),
|
||||||
|
CNameToHtmlElement(HTML_H6, "h6"),
|
||||||
|
CNameToHtmlElement(HTML_HEAD, "head"),
|
||||||
|
CNameToHtmlElement(HTML_HEADER, "header"),
|
||||||
|
CNameToHtmlElement(HTML_HGROUP, "hgroup"),
|
||||||
|
CNameToHtmlElement(HTML_HR, "hr"),
|
||||||
|
CNameToHtmlElement(HTML_HTML, "html"),
|
||||||
|
CNameToHtmlElement(HTML_I, "i"),
|
||||||
|
CNameToHtmlElement(HTML_IFRAME, "iframe"),
|
||||||
|
CNameToHtmlElement(HTML_IMG, "img"),
|
||||||
|
CNameToHtmlElement(HTML_INPUT, "input"),
|
||||||
|
CNameToHtmlElement(HTML_INS, "ins"),
|
||||||
|
CNameToHtmlElement(HTML_KBD, "kbd"),
|
||||||
|
CNameToHtmlElement(HTML_LABEL, "label"),
|
||||||
|
CNameToHtmlElement(HTML_LEGEND, "legend"),
|
||||||
|
CNameToHtmlElement(HTML_LI, "li"),
|
||||||
|
CNameToHtmlElement(HTML_LINK, "link"),
|
||||||
|
CNameToHtmlElement(HTML_LUA, "lua"),
|
||||||
|
CNameToHtmlElement(HTML_MAIN, "main"),
|
||||||
|
CNameToHtmlElement(HTML_MAP, "map"),
|
||||||
|
CNameToHtmlElement(HTML_MARK, "mark"),
|
||||||
|
CNameToHtmlElement(HTML_MENU, "menu"),
|
||||||
|
CNameToHtmlElement(HTML_MENUITEM, "menuitem"),
|
||||||
|
CNameToHtmlElement(HTML_META, "meta"),
|
||||||
|
CNameToHtmlElement(HTML_METER, "meter"),
|
||||||
|
CNameToHtmlElement(HTML_NAV, "nav"),
|
||||||
|
CNameToHtmlElement(HTML_NOEMBED, "noembed"),
|
||||||
|
CNameToHtmlElement(HTML_NOSCRIPT, "noscript"),
|
||||||
|
CNameToHtmlElement(HTML_OBJECT, "object"),
|
||||||
|
CNameToHtmlElement(HTML_OL, "ol"),
|
||||||
|
CNameToHtmlElement(HTML_OPTGROUP, "optgroup"),
|
||||||
|
CNameToHtmlElement(HTML_OPTION, "option"),
|
||||||
|
CNameToHtmlElement(HTML_OUTPUT, "output"),
|
||||||
|
CNameToHtmlElement(HTML_P, "p"),
|
||||||
|
CNameToHtmlElement(HTML_PARAM, "param"),
|
||||||
|
CNameToHtmlElement(HTML_PICTURE, "picture"),
|
||||||
|
CNameToHtmlElement(HTML_PRE, "pre"),
|
||||||
|
CNameToHtmlElement(HTML_PROGRESS, "progress"),
|
||||||
|
CNameToHtmlElement(HTML_Q, "q"),
|
||||||
|
CNameToHtmlElement(HTML_RB, "rb"),
|
||||||
|
CNameToHtmlElement(HTML_RP, "rp"),
|
||||||
|
CNameToHtmlElement(HTML_RT, "rt"),
|
||||||
|
CNameToHtmlElement(HTML_RTC, "rtc"),
|
||||||
|
CNameToHtmlElement(HTML_RUBY, "ruby"),
|
||||||
|
CNameToHtmlElement(HTML_S, "s"),
|
||||||
|
CNameToHtmlElement(HTML_SAMP, "samp"),
|
||||||
|
CNameToHtmlElement(HTML_SCRIPT, "script"),
|
||||||
|
CNameToHtmlElement(HTML_SECTION, "section"),
|
||||||
|
CNameToHtmlElement(HTML_SELECT, "select"),
|
||||||
|
CNameToHtmlElement(HTML_SMALL, "small"),
|
||||||
|
CNameToHtmlElement(HTML_SOURCE, "source"),
|
||||||
|
CNameToHtmlElement(HTML_SPAN, "span"),
|
||||||
|
CNameToHtmlElement(HTML_STRONG, "strong"),
|
||||||
|
CNameToHtmlElement(HTML_STYLE, "style"),
|
||||||
|
CNameToHtmlElement(HTML_SUB, "sub"),
|
||||||
|
CNameToHtmlElement(HTML_SUMMARY, "summary"),
|
||||||
|
CNameToHtmlElement(HTML_SUP, "sup"),
|
||||||
|
CNameToHtmlElement(HTML_TABLE, "table"),
|
||||||
|
CNameToHtmlElement(HTML_TBODY, "tbody"),
|
||||||
|
CNameToHtmlElement(HTML_TD, "td"),
|
||||||
|
CNameToHtmlElement(HTML_TEXTAREA, "textarea"),
|
||||||
|
CNameToHtmlElement(HTML_TFOOT, "tfoot"),
|
||||||
|
CNameToHtmlElement(HTML_TH, "th"),
|
||||||
|
CNameToHtmlElement(HTML_THEAD, "thead"),
|
||||||
|
CNameToHtmlElement(HTML_TIME, "time"),
|
||||||
|
CNameToHtmlElement(HTML_TITLE, "title"),
|
||||||
|
CNameToHtmlElement(HTML_TR, "tr"),
|
||||||
|
CNameToHtmlElement(HTML_TRACK, "track"),
|
||||||
|
CNameToHtmlElement(HTML_TT, "tt"),
|
||||||
|
CNameToHtmlElement(HTML_U, "u"),
|
||||||
|
CNameToHtmlElement(HTML_UL, "ul"),
|
||||||
|
CNameToHtmlElement(HTML_VAR, "var"),
|
||||||
|
CNameToHtmlElement(HTML_VIDEO, "video"),
|
||||||
|
CNameToHtmlElement(HTML_WBR, "wbr")
|
||||||
|
};
|
||||||
|
|
||||||
|
HTMLElement htmlElementLookup(const char* name)
|
||||||
|
{
|
||||||
|
uint end = sizeofarray(htmlElementToName);
|
||||||
|
uint mid = end >> 1;
|
||||||
|
sint ret;
|
||||||
|
while(mid < end)
|
||||||
|
{
|
||||||
|
sint ret = nlstricmp(name, htmlElementToName[mid].Name);
|
||||||
|
if (ret == 0)
|
||||||
|
{
|
||||||
|
return htmlElementToName[mid].ID;
|
||||||
|
}
|
||||||
|
else if (ret < 0)
|
||||||
|
{
|
||||||
|
// lower half
|
||||||
|
end = mid;
|
||||||
|
mid = end >> 1;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
// upper half
|
||||||
|
mid++;
|
||||||
|
mid += (end - mid) >> 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// not found
|
||||||
|
return HTML_NB_ELEMENTS;
|
||||||
|
}
|
||||||
|
|
||||||
// ***************************************************************************
|
// ***************************************************************************
|
||||||
|
|
||||||
|
@ -40,258 +201,6 @@ namespace NLGUI
|
||||||
|
|
||||||
// ***************************************************************************
|
// ***************************************************************************
|
||||||
|
|
||||||
// Some DTD table
|
|
||||||
|
|
||||||
// Here, modify the DTD table to change the HTML parser (add new tags for examples)
|
|
||||||
|
|
||||||
#undef HTML_ATTR
|
|
||||||
#define HTML_ATTR(a,b) { (char*) #b }
|
|
||||||
|
|
||||||
HTAttr html_attr[] =
|
|
||||||
{
|
|
||||||
HTML_ATTR(HTML,DIR),
|
|
||||||
HTML_ATTR(HTML,LANG),
|
|
||||||
HTML_ATTR(HTML,VERSION),
|
|
||||||
HTML_ATTR(HTML,STYLE),
|
|
||||||
{ 0 }
|
|
||||||
};
|
|
||||||
|
|
||||||
HTAttr a_attr[] =
|
|
||||||
{
|
|
||||||
HTML_ATTR(A,ACCESSKEY),
|
|
||||||
HTML_ATTR(A,CHARSET),
|
|
||||||
HTML_ATTR(A,CLASS),
|
|
||||||
HTML_ATTR(A,COORDS),
|
|
||||||
HTML_ATTR(A,DIR),
|
|
||||||
HTML_ATTR(A,HREF),
|
|
||||||
HTML_ATTR(A,HREFLANG),
|
|
||||||
HTML_ATTR(A,ID),
|
|
||||||
HTML_ATTR(A,NAME),
|
|
||||||
HTML_ATTR(A,REL),
|
|
||||||
HTML_ATTR(A,REV),
|
|
||||||
HTML_ATTR(A,SHAPE),
|
|
||||||
HTML_ATTR(A,STYLE),
|
|
||||||
HTML_ATTR(A,TABINDEX),
|
|
||||||
HTML_ATTR(A,TARGET),
|
|
||||||
HTML_ATTR(A,TYPE),
|
|
||||||
HTML_ATTR(A,TITLE),
|
|
||||||
HTML_ATTR(A,Z_ACTION_CATEGORY),
|
|
||||||
HTML_ATTR(A,Z_ACTION_PARAMS),
|
|
||||||
HTML_ATTR(A,Z_ACTION_SHORTCUT),
|
|
||||||
{ 0 }
|
|
||||||
};
|
|
||||||
|
|
||||||
HTAttr table_attr[] =
|
|
||||||
{
|
|
||||||
HTML_ATTR(TABLE,ALIGN),
|
|
||||||
HTML_ATTR(TABLE,BGCOLOR),
|
|
||||||
HTML_ATTR(TABLE,BORDER),
|
|
||||||
HTML_ATTR(TABLE,BORDERCOLOR),
|
|
||||||
HTML_ATTR(TABLE,CELLPADDING),
|
|
||||||
HTML_ATTR(TABLE,CELLSPACING),
|
|
||||||
HTML_ATTR(TABLE,CLASS),
|
|
||||||
HTML_ATTR(TABLE,DIR),
|
|
||||||
HTML_ATTR(TABLE,FRAME),
|
|
||||||
HTML_ATTR(TABLE,ID),
|
|
||||||
HTML_ATTR(TABLE,L_MARGIN),
|
|
||||||
HTML_ATTR(TABLE,LANG),
|
|
||||||
HTML_ATTR(TABLE,NOWRAP),
|
|
||||||
HTML_ATTR(TABLE,RULES),
|
|
||||||
HTML_ATTR(TABLE,SUMMARY),
|
|
||||||
HTML_ATTR(TABLE,STYLE),
|
|
||||||
HTML_ATTR(TABLE,TITLE),
|
|
||||||
HTML_ATTR(TABLE,VALIGN),
|
|
||||||
HTML_ATTR(TABLE,WIDTH),
|
|
||||||
{ 0 }
|
|
||||||
};
|
|
||||||
|
|
||||||
HTAttr tr_attr[] =
|
|
||||||
{
|
|
||||||
HTML_ATTR(TR,ALIGN),
|
|
||||||
HTML_ATTR(TR,BGCOLOR),
|
|
||||||
HTML_ATTR(TR,L_MARGIN),
|
|
||||||
HTML_ATTR(TR,NOWRAP),
|
|
||||||
HTML_ATTR(TR,VALIGN),
|
|
||||||
HTML_ATTR(TR,STYLE),
|
|
||||||
{ 0 }
|
|
||||||
};
|
|
||||||
|
|
||||||
HTAttr td_attr[] =
|
|
||||||
{
|
|
||||||
HTML_ATTR(TD,ABBR),
|
|
||||||
HTML_ATTR(TD,ALIGN),
|
|
||||||
HTML_ATTR(TD,AXIS),
|
|
||||||
HTML_ATTR(TD,BGCOLOR),
|
|
||||||
HTML_ATTR(TD,CHAR),
|
|
||||||
HTML_ATTR(TD,CHAROFF),
|
|
||||||
HTML_ATTR(TD,CLASS),
|
|
||||||
HTML_ATTR(TD,COLSPAN),
|
|
||||||
HTML_ATTR(TD,DIR),
|
|
||||||
HTML_ATTR(TD,ID),
|
|
||||||
HTML_ATTR(TD,HEADERS),
|
|
||||||
HTML_ATTR(TD,HEIGHT),
|
|
||||||
HTML_ATTR(TD,L_MARGIN),
|
|
||||||
HTML_ATTR(TD,LANG),
|
|
||||||
HTML_ATTR(TD,NOWRAP),
|
|
||||||
HTML_ATTR(TD,ROWSPAN),
|
|
||||||
HTML_ATTR(TD,SCOPE),
|
|
||||||
HTML_ATTR(TD,STYLE),
|
|
||||||
HTML_ATTR(TD,TITLE),
|
|
||||||
HTML_ATTR(TD,VALIGN),
|
|
||||||
HTML_ATTR(TD,WIDTH),
|
|
||||||
{ 0 }
|
|
||||||
};
|
|
||||||
|
|
||||||
HTAttr img_attr[] =
|
|
||||||
{
|
|
||||||
HTML_ATTR(IMG,ALIGN),
|
|
||||||
HTML_ATTR(IMG,ALT),
|
|
||||||
HTML_ATTR(IMG,BORDER),
|
|
||||||
HTML_ATTR(IMG,CLASS),
|
|
||||||
HTML_ATTR(IMG,DIR),
|
|
||||||
HTML_ATTR(IMG,GLOBAL_COLOR),
|
|
||||||
HTML_ATTR(IMG,HEIGHT),
|
|
||||||
HTML_ATTR(IMG,HSPACE),
|
|
||||||
HTML_ATTR(IMG,ID),
|
|
||||||
HTML_ATTR(IMG,ISMAP),
|
|
||||||
HTML_ATTR(IMG,LANG),
|
|
||||||
HTML_ATTR(IMG,LONGDESC),
|
|
||||||
HTML_ATTR(IMG,SRC),
|
|
||||||
HTML_ATTR(IMG,STYLE),
|
|
||||||
HTML_ATTR(IMG,TITLE),
|
|
||||||
HTML_ATTR(IMG,USEMAP),
|
|
||||||
HTML_ATTR(IMG,VSPACE),
|
|
||||||
HTML_ATTR(IMG,WIDTH),
|
|
||||||
// not sorted to keep enum values
|
|
||||||
HTML_ATTR(IMG,DATA-OVER-SRC),
|
|
||||||
{ 0 }
|
|
||||||
};
|
|
||||||
|
|
||||||
HTAttr input_attr[] =
|
|
||||||
{
|
|
||||||
HTML_ATTR(INPUT,ACCEPT),
|
|
||||||
HTML_ATTR(INPUT,ACCESSKEY),
|
|
||||||
HTML_ATTR(INPUT,ALIGN),
|
|
||||||
HTML_ATTR(INPUT,ALT),
|
|
||||||
HTML_ATTR(INPUT,CHECKED),
|
|
||||||
HTML_ATTR(INPUT,CLASS),
|
|
||||||
HTML_ATTR(INPUT,DIR),
|
|
||||||
HTML_ATTR(INPUT,DISABLED),
|
|
||||||
HTML_ATTR(INPUT,GLOBAL_COLOR),
|
|
||||||
HTML_ATTR(INPUT,ID),
|
|
||||||
HTML_ATTR(INPUT,LANG),
|
|
||||||
HTML_ATTR(INPUT,MAXLENGTH),
|
|
||||||
HTML_ATTR(INPUT,NAME),
|
|
||||||
HTML_ATTR(INPUT,READONLY),
|
|
||||||
HTML_ATTR(INPUT,SIZE),
|
|
||||||
HTML_ATTR(INPUT,SRC),
|
|
||||||
HTML_ATTR(INPUT,STYLE),
|
|
||||||
HTML_ATTR(INPUT,TABINDEX),
|
|
||||||
HTML_ATTR(INPUT,TITLE),
|
|
||||||
HTML_ATTR(INPUT,TYPE),
|
|
||||||
HTML_ATTR(INPUT,USEMAP),
|
|
||||||
HTML_ATTR(INPUT,VALUE),
|
|
||||||
HTML_ATTR(INPUT,Z_BTN_TMPL),
|
|
||||||
HTML_ATTR(INPUT,Z_INPUT_TMPL),
|
|
||||||
HTML_ATTR(INPUT,Z_INPUT_WIDTH),
|
|
||||||
{ 0 }
|
|
||||||
};
|
|
||||||
|
|
||||||
HTAttr textarea_attr[] =
|
|
||||||
{
|
|
||||||
HTML_ATTR(TEXTAREA,CLASS),
|
|
||||||
HTML_ATTR(TEXTAREA,COLS),
|
|
||||||
HTML_ATTR(TEXTAREA,DIR),
|
|
||||||
HTML_ATTR(TEXTAREA,DISABLED),
|
|
||||||
HTML_ATTR(TEXTAREA,ID),
|
|
||||||
HTML_ATTR(TEXTAREA,LANG),
|
|
||||||
HTML_ATTR(TEXTAREA,MAXLENGTH),
|
|
||||||
HTML_ATTR(TEXTAREA,NAME),
|
|
||||||
HTML_ATTR(TEXTAREA,READONLY),
|
|
||||||
HTML_ATTR(TEXTAREA,ROWS),
|
|
||||||
HTML_ATTR(TEXTAREA,STYLE),
|
|
||||||
HTML_ATTR(TEXTAREA,TABINDEX),
|
|
||||||
HTML_ATTR(TEXTAREA,TITLE),
|
|
||||||
HTML_ATTR(TEXTAREA,Z_INPUT_TMPL),
|
|
||||||
{ 0 }
|
|
||||||
};
|
|
||||||
|
|
||||||
HTAttr p_attr[] =
|
|
||||||
{
|
|
||||||
HTML_ATTR(P,QUICK_HELP_CONDITION),
|
|
||||||
HTML_ATTR(P,QUICK_HELP_EVENTS),
|
|
||||||
HTML_ATTR(P,QUICK_HELP_LINK),
|
|
||||||
HTML_ATTR(P,NAME),
|
|
||||||
HTML_ATTR(P,STYLE),
|
|
||||||
{ 0 }
|
|
||||||
};
|
|
||||||
|
|
||||||
|
|
||||||
HTAttr div_attr[] =
|
|
||||||
{
|
|
||||||
HTML_ATTR(DIV,CLASS),
|
|
||||||
HTML_ATTR(DIV,ID),
|
|
||||||
HTML_ATTR(DIV,NAME),
|
|
||||||
HTML_ATTR(DIV,STYLE),
|
|
||||||
{ 0 }
|
|
||||||
};
|
|
||||||
|
|
||||||
HTAttr span_attr[] =
|
|
||||||
{
|
|
||||||
HTML_ATTR(SPAN,CLASS),
|
|
||||||
HTML_ATTR(SPAN,ID),
|
|
||||||
HTML_ATTR(SPAN,STYLE),
|
|
||||||
{ 0 }
|
|
||||||
};
|
|
||||||
|
|
||||||
HTAttr h1_attr[] =
|
|
||||||
{
|
|
||||||
HTML_ATTR(H1,CLASS),
|
|
||||||
HTML_ATTR(H1,ID),
|
|
||||||
HTML_ATTR(H1,STYLE),
|
|
||||||
{ 0 }
|
|
||||||
};
|
|
||||||
|
|
||||||
HTAttr h2_attr[] =
|
|
||||||
{
|
|
||||||
HTML_ATTR(H2,CLASS),
|
|
||||||
HTML_ATTR(H2,ID),
|
|
||||||
HTML_ATTR(H2,STYLE),
|
|
||||||
{ 0 }
|
|
||||||
};
|
|
||||||
|
|
||||||
HTAttr h3_attr[] =
|
|
||||||
{
|
|
||||||
HTML_ATTR(H3,CLASS),
|
|
||||||
HTML_ATTR(H3,ID),
|
|
||||||
HTML_ATTR(H3,STYLE),
|
|
||||||
{ 0 }
|
|
||||||
};
|
|
||||||
|
|
||||||
HTAttr h4_attr[] =
|
|
||||||
{
|
|
||||||
HTML_ATTR(H4,CLASS),
|
|
||||||
HTML_ATTR(H4,ID),
|
|
||||||
HTML_ATTR(H4,STYLE),
|
|
||||||
{ 0 }
|
|
||||||
};
|
|
||||||
|
|
||||||
HTAttr h5_attr[] =
|
|
||||||
{
|
|
||||||
HTML_ATTR(H5,CLASS),
|
|
||||||
HTML_ATTR(H5,ID),
|
|
||||||
HTML_ATTR(H5,STYLE),
|
|
||||||
{ 0 }
|
|
||||||
};
|
|
||||||
|
|
||||||
HTAttr h6_attr[] =
|
|
||||||
{
|
|
||||||
HTML_ATTR(H6,CLASS),
|
|
||||||
HTML_ATTR(H6,ID),
|
|
||||||
HTML_ATTR(H6,STYLE),
|
|
||||||
{ 0 }
|
|
||||||
};
|
|
||||||
|
|
||||||
// ***************************************************************************
|
// ***************************************************************************
|
||||||
bool getCssLength (float &value, std::string &unit, const std::string &str)
|
bool getCssLength (float &value, std::string &unit, const std::string &str)
|
||||||
{
|
{
|
||||||
|
@ -345,6 +254,373 @@ namespace NLGUI
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static bool isHexa(char c)
|
||||||
|
{
|
||||||
|
return isdigit(c) || (tolower(c) >= 'a' && tolower(c) <= 'f');
|
||||||
|
}
|
||||||
|
|
||||||
|
static uint8 convertHexa(char c)
|
||||||
|
{
|
||||||
|
return (uint8) (tolower(c) - (isdigit(c) ? '0' : ('a' - 10)));
|
||||||
|
}
|
||||||
|
|
||||||
|
// scan a color component, and return pointer to next position
|
||||||
|
static const char *scanColorComponent(const char *src, uint8 &intensity)
|
||||||
|
{
|
||||||
|
if (!src) return NULL;
|
||||||
|
if (!isHexa(*src)) return NULL;
|
||||||
|
uint8 value = convertHexa(*src++) << 4;
|
||||||
|
if (!isHexa(*src)) return NULL;
|
||||||
|
value += convertHexa(*src++);
|
||||||
|
intensity = value;
|
||||||
|
return src;
|
||||||
|
}
|
||||||
|
|
||||||
|
static float hueToRgb(float m1, float m2, float h)
|
||||||
|
{
|
||||||
|
if (h < 0) h += 1.0f;
|
||||||
|
if (h > 1) h -= 1.0f;
|
||||||
|
if (h*6 < 1.0f) return m1 + (m2 - m1)*h*6;
|
||||||
|
if (h*2 < 1.0f) return m2;
|
||||||
|
if (h*3 < 2.0f) return m1 + (m2 - m1) * (2.0f/3.0f - h)*6;
|
||||||
|
return m1;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void hslToRgb(float h, float s, float l, CRGBA &result)
|
||||||
|
{
|
||||||
|
float m1, m2;
|
||||||
|
if (l <= 0.5f)
|
||||||
|
m2 = l * (s + 1.0f);
|
||||||
|
else
|
||||||
|
m2 = l + s - l * s;
|
||||||
|
m1 = l*2 - m2;
|
||||||
|
|
||||||
|
result.R = 255 * hueToRgb(m1, m2, h + 1.0f/3.0f);
|
||||||
|
result.G = 255 * hueToRgb(m1, m2, h);
|
||||||
|
result.B = 255 * hueToRgb(m1, m2, h - 1.0f/3.0f);
|
||||||
|
result.A = 255;
|
||||||
|
}
|
||||||
|
|
||||||
|
class CNameToCol
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
const char *Name;
|
||||||
|
CRGBA Color;
|
||||||
|
CNameToCol(const char *name, CRGBA color) : Name(name), Color(color) {}
|
||||||
|
};
|
||||||
|
|
||||||
|
static CNameToCol htmlColorNameToRGBA[] =
|
||||||
|
{
|
||||||
|
CNameToCol("AliceBlue", CRGBA(0xF0, 0xF8, 0xFF)),
|
||||||
|
CNameToCol("AntiqueWhite", CRGBA(0xFA, 0xEB, 0xD7)),
|
||||||
|
CNameToCol("Aqua", CRGBA(0x00, 0xFF, 0xFF)),
|
||||||
|
CNameToCol("Aquamarine", CRGBA(0x7F, 0xFF, 0xD4)),
|
||||||
|
CNameToCol("Azure", CRGBA(0xF0, 0xFF, 0xFF)),
|
||||||
|
CNameToCol("Beige", CRGBA(0xF5, 0xF5, 0xDC)),
|
||||||
|
CNameToCol("Bisque", CRGBA(0xFF, 0xE4, 0xC4)),
|
||||||
|
CNameToCol("Black", CRGBA(0x00, 0x00, 0x00)),
|
||||||
|
CNameToCol("BlanchedAlmond", CRGBA(0xFF, 0xEB, 0xCD)),
|
||||||
|
CNameToCol("Blue", CRGBA(0x00, 0x00, 0xFF)),
|
||||||
|
CNameToCol("BlueViolet", CRGBA(0x8A, 0x2B, 0xE2)),
|
||||||
|
CNameToCol("Brown", CRGBA(0xA5, 0x2A, 0x2A)),
|
||||||
|
CNameToCol("BurlyWood", CRGBA(0xDE, 0xB8, 0x87)),
|
||||||
|
CNameToCol("CadetBlue", CRGBA(0x5F, 0x9E, 0xA0)),
|
||||||
|
CNameToCol("Chartreuse", CRGBA(0x7F, 0xFF, 0x00)),
|
||||||
|
CNameToCol("Chocolate", CRGBA(0xD2, 0x69, 0x1E)),
|
||||||
|
CNameToCol("Coral", CRGBA(0xFF, 0x7F, 0x50)),
|
||||||
|
CNameToCol("CornflowerBlue", CRGBA(0x64, 0x95, 0xED)),
|
||||||
|
CNameToCol("Cornsilk", CRGBA(0xFF, 0xF8, 0xDC)),
|
||||||
|
CNameToCol("Crimson", CRGBA(0xDC, 0x14, 0x3C)),
|
||||||
|
CNameToCol("Cyan", CRGBA(0x00, 0xFF, 0xFF)),
|
||||||
|
CNameToCol("DarkBlue", CRGBA(0x00, 0x00, 0x8B)),
|
||||||
|
CNameToCol("DarkCyan", CRGBA(0x00, 0x8B, 0x8B)),
|
||||||
|
CNameToCol("DarkGoldenRod", CRGBA(0xB8, 0x86, 0x0B)),
|
||||||
|
CNameToCol("DarkGray", CRGBA(0xA9, 0xA9, 0xA9)),
|
||||||
|
CNameToCol("DarkGreen", CRGBA(0x00, 0x64, 0x00)),
|
||||||
|
CNameToCol("DarkKhaki", CRGBA(0xBD, 0xB7, 0x6B)),
|
||||||
|
CNameToCol("DarkMagenta", CRGBA(0x8B, 0x00, 0x8B)),
|
||||||
|
CNameToCol("DarkOliveGreen", CRGBA(0x55, 0x6B, 0x2F)),
|
||||||
|
CNameToCol("Darkorange", CRGBA(0xFF, 0x8C, 0x00)),
|
||||||
|
CNameToCol("DarkOrchid", CRGBA(0x99, 0x32, 0xCC)),
|
||||||
|
CNameToCol("DarkRed", CRGBA(0x8B, 0x00, 0x00)),
|
||||||
|
CNameToCol("DarkSalmon", CRGBA(0xE9, 0x96, 0x7A)),
|
||||||
|
CNameToCol("DarkSeaGreen", CRGBA(0x8F, 0xBC, 0x8F)),
|
||||||
|
CNameToCol("DarkSlateBlue", CRGBA(0x48, 0x3D, 0x8B)),
|
||||||
|
CNameToCol("DarkSlateGray", CRGBA(0x2F, 0x4F, 0x4F)),
|
||||||
|
CNameToCol("DarkTurquoise", CRGBA(0x00, 0xCE, 0xD1)),
|
||||||
|
CNameToCol("DarkViolet", CRGBA(0x94, 0x00, 0xD3)),
|
||||||
|
CNameToCol("DeepPink", CRGBA(0xFF, 0x14, 0x93)),
|
||||||
|
CNameToCol("DeepSkyBlue", CRGBA(0x00, 0xBF, 0xFF)),
|
||||||
|
CNameToCol("DimGray", CRGBA(0x69, 0x69, 0x69)),
|
||||||
|
CNameToCol("DodgerBlue", CRGBA(0x1E, 0x90, 0xFF)),
|
||||||
|
CNameToCol("Feldspar", CRGBA(0xD1, 0x92, 0x75)),
|
||||||
|
CNameToCol("FireBrick", CRGBA(0xB2, 0x22, 0x22)),
|
||||||
|
CNameToCol("FloralWhite", CRGBA(0xFF, 0xFA, 0xF0)),
|
||||||
|
CNameToCol("ForestGreen", CRGBA(0x22, 0x8B, 0x22)),
|
||||||
|
CNameToCol("Fuchsia", CRGBA(0xFF, 0x00, 0xFF)),
|
||||||
|
CNameToCol("Gainsboro", CRGBA(0xDC, 0xDC, 0xDC)),
|
||||||
|
CNameToCol("GhostWhite", CRGBA(0xF8, 0xF8, 0xFF)),
|
||||||
|
CNameToCol("Gold", CRGBA(0xFF, 0xD7, 0x00)),
|
||||||
|
CNameToCol("GoldenRod", CRGBA(0xDA, 0xA5, 0x20)),
|
||||||
|
CNameToCol("Gray", CRGBA(0x80, 0x80, 0x80)),
|
||||||
|
CNameToCol("Green", CRGBA(0x00, 0x80, 0x00)),
|
||||||
|
CNameToCol("GreenYellow", CRGBA(0xAD, 0xFF, 0x2F)),
|
||||||
|
CNameToCol("HoneyDew", CRGBA(0xF0, 0xFF, 0xF0)),
|
||||||
|
CNameToCol("HotPink", CRGBA(0xFF, 0x69, 0xB4)),
|
||||||
|
CNameToCol("IndianRed ", CRGBA(0xCD, 0x5C, 0x5C)),
|
||||||
|
CNameToCol("Indigo ", CRGBA(0x4B, 0x00, 0x82)),
|
||||||
|
CNameToCol("Ivory", CRGBA(0xFF, 0xFF, 0xF0)),
|
||||||
|
CNameToCol("Khaki", CRGBA(0xF0, 0xE6, 0x8C)),
|
||||||
|
CNameToCol("Lavender", CRGBA(0xE6, 0xE6, 0xFA)),
|
||||||
|
CNameToCol("LavenderBlush", CRGBA(0xFF, 0xF0, 0xF5)),
|
||||||
|
CNameToCol("LawnGreen", CRGBA(0x7C, 0xFC, 0x00)),
|
||||||
|
CNameToCol("LemonChiffon", CRGBA(0xFF, 0xFA, 0xCD)),
|
||||||
|
CNameToCol("LightBlue", CRGBA(0xAD, 0xD8, 0xE6)),
|
||||||
|
CNameToCol("LightCoral", CRGBA(0xF0, 0x80, 0x80)),
|
||||||
|
CNameToCol("LightCyan", CRGBA(0xE0, 0xFF, 0xFF)),
|
||||||
|
CNameToCol("LightGoldenRodYellow", CRGBA(0xFA, 0xFA, 0xD2)),
|
||||||
|
CNameToCol("LightGrey", CRGBA(0xD3, 0xD3, 0xD3)),
|
||||||
|
CNameToCol("LightGreen", CRGBA(0x90, 0xEE, 0x90)),
|
||||||
|
CNameToCol("LightPink", CRGBA(0xFF, 0xB6, 0xC1)),
|
||||||
|
CNameToCol("LightSalmon", CRGBA(0xFF, 0xA0, 0x7A)),
|
||||||
|
CNameToCol("LightSeaGreen", CRGBA(0x20, 0xB2, 0xAA)),
|
||||||
|
CNameToCol("LightSkyBlue", CRGBA(0x87, 0xCE, 0xFA)),
|
||||||
|
CNameToCol("LightSlateBlue", CRGBA(0x84, 0x70, 0xFF)),
|
||||||
|
CNameToCol("LightSlateGray", CRGBA(0x77, 0x88, 0x99)),
|
||||||
|
CNameToCol("LightSteelBlue", CRGBA(0xB0, 0xC4, 0xDE)),
|
||||||
|
CNameToCol("LightYellow", CRGBA(0xFF, 0xFF, 0xE0)),
|
||||||
|
CNameToCol("Lime", CRGBA(0x00, 0xFF, 0x00)),
|
||||||
|
CNameToCol("LimeGreen", CRGBA(0x32, 0xCD, 0x32)),
|
||||||
|
CNameToCol("Linen", CRGBA(0xFA, 0xF0, 0xE6)),
|
||||||
|
CNameToCol("Magenta", CRGBA(0xFF, 0x00, 0xFF)),
|
||||||
|
CNameToCol("Maroon", CRGBA(0x80, 0x00, 0x00)),
|
||||||
|
CNameToCol("MediumAquaMarine", CRGBA(0x66, 0xCD, 0xAA)),
|
||||||
|
CNameToCol("MediumBlue", CRGBA(0x00, 0x00, 0xCD)),
|
||||||
|
CNameToCol("MediumOrchid", CRGBA(0xBA, 0x55, 0xD3)),
|
||||||
|
CNameToCol("MediumPurple", CRGBA(0x93, 0x70, 0xD8)),
|
||||||
|
CNameToCol("MediumSeaGreen", CRGBA(0x3C, 0xB3, 0x71)),
|
||||||
|
CNameToCol("MediumSlateBlue", CRGBA(0x7B, 0x68, 0xEE)),
|
||||||
|
CNameToCol("MediumSpringGreen", CRGBA(0x00, 0xFA, 0x9A)),
|
||||||
|
CNameToCol("MediumTurquoise", CRGBA(0x48, 0xD1, 0xCC)),
|
||||||
|
CNameToCol("MediumVioletRed", CRGBA(0xC7, 0x15, 0x85)),
|
||||||
|
CNameToCol("MidnightBlue", CRGBA(0x19, 0x19, 0x70)),
|
||||||
|
CNameToCol("MintCream", CRGBA(0xF5, 0xFF, 0xFA)),
|
||||||
|
CNameToCol("MistyRose", CRGBA(0xFF, 0xE4, 0xE1)),
|
||||||
|
CNameToCol("Moccasin", CRGBA(0xFF, 0xE4, 0xB5)),
|
||||||
|
CNameToCol("NavajoWhite", CRGBA(0xFF, 0xDE, 0xAD)),
|
||||||
|
CNameToCol("Navy", CRGBA(0x00, 0x00, 0x80)),
|
||||||
|
CNameToCol("OldLace", CRGBA(0xFD, 0xF5, 0xE6)),
|
||||||
|
CNameToCol("Olive", CRGBA(0x80, 0x80, 0x00)),
|
||||||
|
CNameToCol("OliveDrab", CRGBA(0x6B, 0x8E, 0x23)),
|
||||||
|
CNameToCol("Orange", CRGBA(0xFF, 0xA5, 0x00)),
|
||||||
|
CNameToCol("OrangeRed", CRGBA(0xFF, 0x45, 0x00)),
|
||||||
|
CNameToCol("Orchid", CRGBA(0xDA, 0x70, 0xD6)),
|
||||||
|
CNameToCol("PaleGoldenRod", CRGBA(0xEE, 0xE8, 0xAA)),
|
||||||
|
CNameToCol("PaleGreen", CRGBA(0x98, 0xFB, 0x98)),
|
||||||
|
CNameToCol("PaleTurquoise", CRGBA(0xAF, 0xEE, 0xEE)),
|
||||||
|
CNameToCol("PaleVioletRed", CRGBA(0xD8, 0x70, 0x93)),
|
||||||
|
CNameToCol("PapayaWhip", CRGBA(0xFF, 0xEF, 0xD5)),
|
||||||
|
CNameToCol("PeachPuff", CRGBA(0xFF, 0xDA, 0xB9)),
|
||||||
|
CNameToCol("Peru", CRGBA(0xCD, 0x85, 0x3F)),
|
||||||
|
CNameToCol("Pink", CRGBA(0xFF, 0xC0, 0xCB)),
|
||||||
|
CNameToCol("Plum", CRGBA(0xDD, 0xA0, 0xDD)),
|
||||||
|
CNameToCol("PowderBlue", CRGBA(0xB0, 0xE0, 0xE6)),
|
||||||
|
CNameToCol("Purple", CRGBA(0x80, 0x00, 0x80)),
|
||||||
|
CNameToCol("Red", CRGBA(0xFF, 0x00, 0x00)),
|
||||||
|
CNameToCol("RosyBrown", CRGBA(0xBC, 0x8F, 0x8F)),
|
||||||
|
CNameToCol("RoyalBlue", CRGBA(0x41, 0x69, 0xE1)),
|
||||||
|
CNameToCol("SaddleBrown", CRGBA(0x8B, 0x45, 0x13)),
|
||||||
|
CNameToCol("Salmon", CRGBA(0xFA, 0x80, 0x72)),
|
||||||
|
CNameToCol("SandyBrown", CRGBA(0xF4, 0xA4, 0x60)),
|
||||||
|
CNameToCol("SeaGreen", CRGBA(0x2E, 0x8B, 0x57)),
|
||||||
|
CNameToCol("SeaShell", CRGBA(0xFF, 0xF5, 0xEE)),
|
||||||
|
CNameToCol("Sienna", CRGBA(0xA0, 0x52, 0x2D)),
|
||||||
|
CNameToCol("Silver", CRGBA(0xC0, 0xC0, 0xC0)),
|
||||||
|
CNameToCol("SkyBlue", CRGBA(0x87, 0xCE, 0xEB)),
|
||||||
|
CNameToCol("SlateBlue", CRGBA(0x6A, 0x5A, 0xCD)),
|
||||||
|
CNameToCol("SlateGray", CRGBA(0x70, 0x80, 0x90)),
|
||||||
|
CNameToCol("Snow", CRGBA(0xFF, 0xFA, 0xFA)),
|
||||||
|
CNameToCol("SpringGreen", CRGBA(0x00, 0xFF, 0x7F)),
|
||||||
|
CNameToCol("SteelBlue", CRGBA(0x46, 0x82, 0xB4)),
|
||||||
|
CNameToCol("Tan", CRGBA(0xD2, 0xB4, 0x8C)),
|
||||||
|
CNameToCol("Teal", CRGBA(0x00, 0x80, 0x80)),
|
||||||
|
CNameToCol("Thistle", CRGBA(0xD8, 0xBF, 0xD8)),
|
||||||
|
CNameToCol("Tomato", CRGBA(0xFF, 0x63, 0x47)),
|
||||||
|
CNameToCol("Turquoise", CRGBA(0x40, 0xE0, 0xD0)),
|
||||||
|
CNameToCol("Violet", CRGBA(0xEE, 0x82, 0xEE)),
|
||||||
|
CNameToCol("VioletRed", CRGBA(0xD0, 0x20, 0x90)),
|
||||||
|
CNameToCol("Wheat", CRGBA(0xF5, 0xDE, 0xB3)),
|
||||||
|
CNameToCol("White", CRGBA(0xFF, 0xFF, 0xFF)),
|
||||||
|
CNameToCol("WhiteSmoke", CRGBA(0xF5, 0xF5, 0xF5)),
|
||||||
|
CNameToCol("Yellow", CRGBA(0xFF, 0xFF, 0x00)),
|
||||||
|
CNameToCol("YellowGreen", CRGBA(0x9A, 0xCD, 0x32))
|
||||||
|
};
|
||||||
|
|
||||||
|
// scan a color from a HTML form (#rrggbb format)
|
||||||
|
bool scanHTMLColor(const char *src, CRGBA &dest)
|
||||||
|
{
|
||||||
|
if (!src || *src == '\0') return false;
|
||||||
|
if (*src == '#')
|
||||||
|
{
|
||||||
|
++src;
|
||||||
|
if (strlen(src) == 3 || strlen(src) == 4)
|
||||||
|
{
|
||||||
|
bool hasAlpha = (strlen(src) == 4);
|
||||||
|
// check RGB for valid hex
|
||||||
|
if (isHexa(src[0]) && isHexa(src[1]) && isHexa(src[2]))
|
||||||
|
{
|
||||||
|
// check optional A for valid hex
|
||||||
|
if (hasAlpha && !isHexa(src[3])) return false;
|
||||||
|
|
||||||
|
dest.R = convertHexa(src[0]);
|
||||||
|
dest.G = convertHexa(src[1]);
|
||||||
|
dest.B = convertHexa(src[2]);
|
||||||
|
|
||||||
|
dest.R = dest.R << 4 | dest.R;
|
||||||
|
dest.G = dest.G << 4 | dest.G;
|
||||||
|
dest.B = dest.B << 4 | dest.B;
|
||||||
|
|
||||||
|
if (hasAlpha)
|
||||||
|
{
|
||||||
|
dest.A = convertHexa(src[3]);
|
||||||
|
dest.A = dest.A << 4 | dest.A;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
dest.A = 255;
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
CRGBA result;
|
||||||
|
src = scanColorComponent(src, result.R); if (!src) return false;
|
||||||
|
src = scanColorComponent(src, result.G); if (!src) return false;
|
||||||
|
src = scanColorComponent(src, result.B); if (!src) return false;
|
||||||
|
src = scanColorComponent(src, result.A);
|
||||||
|
if (!src)
|
||||||
|
{
|
||||||
|
// Alpha is optional
|
||||||
|
result.A = 255;
|
||||||
|
}
|
||||||
|
dest = result;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
// TODO: CSS Colors Level 4 support
|
||||||
|
// Whitespace syntax, aliases: rgb == rgba, hsl == hsla
|
||||||
|
// rgb(51 170 51 / 0.4) /* 40% opaque green */
|
||||||
|
// rgb(51 170 51 / 40%) /* 40% opaque green */
|
||||||
|
|
||||||
|
if (strnicmp(src, "rgb(", 4) == 0 || strnicmp(src, "rgba(", 5) == 0)
|
||||||
|
{
|
||||||
|
src += 4;
|
||||||
|
if (*src == '(') src++;
|
||||||
|
|
||||||
|
std::vector<std::string> parts;
|
||||||
|
NLMISC::splitString(src, ",", parts);
|
||||||
|
if (parts.size() >= 3)
|
||||||
|
{
|
||||||
|
CRGBA result;
|
||||||
|
sint tmpv;
|
||||||
|
float tmpf;
|
||||||
|
|
||||||
|
// R
|
||||||
|
if (getPercentage(tmpv, tmpf, parts[0].c_str())) tmpv = 255 * tmpf;
|
||||||
|
clamp(tmpv, 0, 255);
|
||||||
|
result.R = tmpv;
|
||||||
|
|
||||||
|
// G
|
||||||
|
if (getPercentage(tmpv, tmpf, parts[1].c_str())) tmpv = 255 * tmpf;
|
||||||
|
clamp(tmpv, 0, 255);
|
||||||
|
result.G = tmpv;
|
||||||
|
|
||||||
|
// B
|
||||||
|
if (getPercentage(tmpv, tmpf, parts[2].c_str())) tmpv = 255 * tmpf;
|
||||||
|
clamp(tmpv, 0, 255);
|
||||||
|
result.B = tmpv;
|
||||||
|
|
||||||
|
// A
|
||||||
|
if (parts.size() == 4)
|
||||||
|
{
|
||||||
|
if (!fromString(parts[3], tmpf)) return false;
|
||||||
|
if (parts[3].find_first_of("%") != std::string::npos)
|
||||||
|
tmpf /= 100;
|
||||||
|
|
||||||
|
tmpv = 255 * tmpf;
|
||||||
|
clamp(tmpv, 0, 255);
|
||||||
|
result.A = tmpv;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
result.A = 255;
|
||||||
|
|
||||||
|
dest = result;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (strnicmp(src, "hsl(", 4) == 0 || strnicmp(src, "hsla(", 5) == 0)
|
||||||
|
{
|
||||||
|
src += 4;
|
||||||
|
if (*src == '(') src++;
|
||||||
|
|
||||||
|
std::vector<std::string> parts;
|
||||||
|
NLMISC::splitString(src, ",", parts);
|
||||||
|
if (parts.size() >= 3)
|
||||||
|
{
|
||||||
|
sint tmpv;
|
||||||
|
float h, s, l;
|
||||||
|
// hue
|
||||||
|
if (!fromString(parts[0], tmpv)) return false;
|
||||||
|
tmpv = ((tmpv % 360) + 360) % 360;
|
||||||
|
h = (float) tmpv / 360.0f;
|
||||||
|
|
||||||
|
// saturation
|
||||||
|
if (!getPercentage(tmpv, s, parts[1].c_str())) return false;
|
||||||
|
clamp(s, 0.0f, 1.0f);
|
||||||
|
|
||||||
|
// lightness
|
||||||
|
if (!getPercentage(tmpv, l, parts[2].c_str())) return false;
|
||||||
|
clamp(l, 0.0f, 1.0f);
|
||||||
|
|
||||||
|
CRGBA result;
|
||||||
|
hslToRgb(h, s, l, result);
|
||||||
|
|
||||||
|
// A
|
||||||
|
if (parts.size() == 4)
|
||||||
|
{
|
||||||
|
float tmpf;
|
||||||
|
if (!fromString(parts[3], tmpf)) return false;
|
||||||
|
if (parts[3].find_first_of("%") != std::string::npos)
|
||||||
|
tmpf /= 100;
|
||||||
|
clamp(tmpf, 0.0f, 1.0f);
|
||||||
|
result.A = 255 * tmpf;
|
||||||
|
}
|
||||||
|
|
||||||
|
dest = result;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
{
|
||||||
|
// slow but should suffice for now
|
||||||
|
for(uint k = 0; k < sizeofarray(htmlColorNameToRGBA); ++k)
|
||||||
|
{
|
||||||
|
if (nlstricmp(src, htmlColorNameToRGBA[k].Name) == 0)
|
||||||
|
{
|
||||||
|
dest = htmlColorNameToRGBA[k].Color;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// ***************************************************************************
|
// ***************************************************************************
|
||||||
|
|
||||||
CRGBA getColor (const char *color)
|
CRGBA getColor (const char *color)
|
||||||
|
@ -381,6 +657,11 @@ namespace NLGUI
|
||||||
return dst;
|
return dst;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
std::string getRGBAString(const CRGBA &color)
|
||||||
|
{
|
||||||
|
return toString("rgba(%d, %d, %d, %.1f)", color.R, color.G, color.B, color.A / 255.f);
|
||||||
|
}
|
||||||
|
|
||||||
// update HTTPCookies list
|
// update HTTPCookies list
|
||||||
static void receiveCookie(const char *nsformat, const std::string &domain, bool trusted)
|
static void receiveCookie(const char *nsformat, const std::string &domain, bool trusted)
|
||||||
{
|
{
|
||||||
|
@ -501,58 +782,6 @@ namespace NLGUI
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void initLibWWW()
|
|
||||||
{
|
|
||||||
static bool initialized = false;
|
|
||||||
if (!initialized)
|
|
||||||
{
|
|
||||||
|
|
||||||
// Change the HTML DTD
|
|
||||||
SGML_dtd *HTML_DTD = HTML_dtd ();
|
|
||||||
HTML_DTD->tags[HTML_HTML].attributes = html_attr;
|
|
||||||
HTML_DTD->tags[HTML_HTML].number_of_attributes = sizeof(html_attr) / sizeof(HTAttr) - 1;
|
|
||||||
HTML_DTD->tags[HTML_TABLE].attributes = table_attr;
|
|
||||||
HTML_DTD->tags[HTML_TABLE].number_of_attributes = sizeof(table_attr) / sizeof(HTAttr) - 1;
|
|
||||||
HTML_DTD->tags[HTML_TR].attributes = tr_attr;
|
|
||||||
HTML_DTD->tags[HTML_TR].number_of_attributes = sizeof(tr_attr) / sizeof(HTAttr) - 1;
|
|
||||||
HTML_DTD->tags[HTML_TD].attributes = td_attr;
|
|
||||||
HTML_DTD->tags[HTML_TD].number_of_attributes = sizeof(td_attr) / sizeof(HTAttr) - 1;
|
|
||||||
HTML_DTD->tags[HTML_TH].attributes = td_attr;
|
|
||||||
HTML_DTD->tags[HTML_TH].number_of_attributes = sizeof(td_attr) / sizeof(HTAttr) - 1;
|
|
||||||
HTML_DTD->tags[HTML_IMG].attributes = img_attr;
|
|
||||||
HTML_DTD->tags[HTML_IMG].number_of_attributes = sizeof(img_attr) / sizeof(HTAttr) - 1;
|
|
||||||
HTML_DTD->tags[HTML_INPUT].attributes = input_attr;
|
|
||||||
HTML_DTD->tags[HTML_INPUT].number_of_attributes = sizeof(input_attr) / sizeof(HTAttr) - 1;
|
|
||||||
HTML_DTD->tags[HTML_TEXTAREA].attributes = textarea_attr;
|
|
||||||
HTML_DTD->tags[HTML_TEXTAREA].number_of_attributes = sizeof(textarea_attr) / sizeof(HTAttr) - 1;
|
|
||||||
HTML_DTD->tags[HTML_P].attributes = p_attr;
|
|
||||||
HTML_DTD->tags[HTML_P].number_of_attributes = sizeof(p_attr) / sizeof(HTAttr) - 1;
|
|
||||||
HTML_DTD->tags[HTML_A].attributes = a_attr;
|
|
||||||
HTML_DTD->tags[HTML_A].number_of_attributes = sizeof(a_attr) / sizeof(HTAttr) - 1;
|
|
||||||
//HTML_DTD->tags[HTML_I].attributes = a_attr;
|
|
||||||
HTML_DTD->tags[HTML_I].number_of_attributes = 0;
|
|
||||||
HTML_DTD->tags[HTML_DIV].attributes = div_attr;
|
|
||||||
HTML_DTD->tags[HTML_DIV].number_of_attributes = sizeof(div_attr) / sizeof(HTAttr) - 1;
|
|
||||||
HTML_DTD->tags[HTML_SPAN].attributes = span_attr;
|
|
||||||
HTML_DTD->tags[HTML_SPAN].number_of_attributes = sizeof(span_attr) / sizeof(HTAttr) - 1;
|
|
||||||
HTML_DTD->tags[HTML_H1].attributes = h1_attr;
|
|
||||||
HTML_DTD->tags[HTML_H1].number_of_attributes = sizeof(h1_attr) / sizeof(HTAttr) - 1;
|
|
||||||
HTML_DTD->tags[HTML_H2].attributes = h2_attr;
|
|
||||||
HTML_DTD->tags[HTML_H2].number_of_attributes = sizeof(h2_attr) / sizeof(HTAttr) - 1;
|
|
||||||
HTML_DTD->tags[HTML_H3].attributes = h3_attr;
|
|
||||||
HTML_DTD->tags[HTML_H3].number_of_attributes = sizeof(h3_attr) / sizeof(HTAttr) - 1;
|
|
||||||
HTML_DTD->tags[HTML_H4].attributes = h4_attr;
|
|
||||||
HTML_DTD->tags[HTML_H4].number_of_attributes = sizeof(h4_attr) / sizeof(HTAttr) - 1;
|
|
||||||
HTML_DTD->tags[HTML_H5].attributes = h5_attr;
|
|
||||||
HTML_DTD->tags[HTML_H5].number_of_attributes = sizeof(h5_attr) / sizeof(HTAttr) - 1;
|
|
||||||
HTML_DTD->tags[HTML_H6].attributes = h6_attr;
|
|
||||||
HTML_DTD->tags[HTML_H6].number_of_attributes = sizeof(h6_attr) / sizeof(HTAttr) - 1;
|
|
||||||
|
|
||||||
// Initialized
|
|
||||||
initialized = true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// ***************************************************************************
|
// ***************************************************************************
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -1,802 +0,0 @@
|
||||||
/**
|
|
||||||
libwww Copyright Notice
|
|
||||||
[This notice should be placed within redistributed or derivative software
|
|
||||||
code when appropriate. This particular formulation of W3C's notice for
|
|
||||||
inclusion in libwww code became active on August 14 1998.]
|
|
||||||
|
|
||||||
LIBWWW COPYRIGHT NOTICE
|
|
||||||
|
|
||||||
libwww: W3C's implementation of HTTP can be found at:
|
|
||||||
http://www.w3.org/Library/
|
|
||||||
|
|
||||||
Copyright ¨ 1995-2002 World Wide Web Consortium,
|
|
||||||
(Massachusetts Institute of Technology, Institut
|
|
||||||
National de Recherche en Informatique et en
|
|
||||||
Automatique, Keio University). All Rights Reserved.
|
|
||||||
This program is distributed under the W3C's
|
|
||||||
Intellectual Property License. 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 W3C License
|
|
||||||
http://www.w3.org/Consortium/Legal/ for more details.
|
|
||||||
|
|
||||||
Copyright ¨ 1995 CERN. "This product includes computer
|
|
||||||
software created and made available by CERN. This
|
|
||||||
acknowledgment shall be mentioned in full in any
|
|
||||||
product which includes the CERN computer software
|
|
||||||
included herein or parts thereof."
|
|
||||||
|
|
||||||
****************************************************************************/
|
|
||||||
|
|
||||||
#include "stdpch.h"
|
|
||||||
#include "nel/gui/libwww_types.h"
|
|
||||||
|
|
||||||
#ifdef DEBUG_NEW
|
|
||||||
#define new DEBUG_NEW
|
|
||||||
#endif
|
|
||||||
|
|
||||||
namespace NLGUI
|
|
||||||
{
|
|
||||||
|
|
||||||
/*
|
|
||||||
** ATTRIBUTE DEFINITION MACROS (see HTMLPDTD.h)
|
|
||||||
*/
|
|
||||||
|
|
||||||
/*
|
|
||||||
* redefine the macros, so that the "stringized" attribute name
|
|
||||||
* is generated
|
|
||||||
*/
|
|
||||||
|
|
||||||
#undef HTML_ATTR
|
|
||||||
#define HTML_ATTR(t,a) { (char *) #a }
|
|
||||||
#undef HTML_ATTRIBUTES
|
|
||||||
#define HTML_ATTRIBUTES(t) { 0 }
|
|
||||||
|
|
||||||
/*
|
|
||||||
** ATTRIBUTE LISTS
|
|
||||||
*/
|
|
||||||
|
|
||||||
static HTAttr no_attr[1] = {
|
|
||||||
{ 0 }
|
|
||||||
};
|
|
||||||
|
|
||||||
static HTAttr body_attr[HTML_BODY_ATTRIBUTES+1] = { /* to catch images */
|
|
||||||
HTML_ATTR(BODY,ALINK),
|
|
||||||
HTML_ATTR(BODY,BACKGROUND),
|
|
||||||
HTML_ATTR(BODY,BGCOLOR),
|
|
||||||
HTML_ATTR(BODY,CLASS),
|
|
||||||
HTML_ATTR(BODY,DIR),
|
|
||||||
HTML_ATTR(BODY,ID),
|
|
||||||
HTML_ATTR(BODY,LANG),
|
|
||||||
HTML_ATTR(BODY,LINK),
|
|
||||||
HTML_ATTR(BODY,STYLE),
|
|
||||||
HTML_ATTR(BODY,TEXT),
|
|
||||||
HTML_ATTR(BODY,TITLE),
|
|
||||||
HTML_ATTR(BODY,VLINK),
|
|
||||||
HTML_ATTRIBUTES(BODY)
|
|
||||||
};
|
|
||||||
|
|
||||||
static HTAttr frame_attr[HTML_FRAME_ATTRIBUTES+1] = { /* frame attributes */
|
|
||||||
HTML_ATTR(FRAME,CLASS),
|
|
||||||
HTML_ATTR(FRAME,FRAMEBORDER),
|
|
||||||
HTML_ATTR(FRAME,ID),
|
|
||||||
HTML_ATTR(FRAME,NAME),
|
|
||||||
HTML_ATTR(FRAME,MARGINHEIGHT),
|
|
||||||
HTML_ATTR(FRAME,MARGINWIDTH),
|
|
||||||
HTML_ATTR(FRAME,NORESIZE),
|
|
||||||
HTML_ATTR(FRAME,LONGDESC),
|
|
||||||
HTML_ATTR(FRAME,SCROLLING),
|
|
||||||
HTML_ATTR(FRAME,SRC),
|
|
||||||
HTML_ATTR(FRAME,STYLE),
|
|
||||||
HTML_ATTR(FRAME,TARGET),
|
|
||||||
HTML_ATTR(FRAME,TITLE),
|
|
||||||
HTML_ATTRIBUTES(FRAME)
|
|
||||||
};
|
|
||||||
|
|
||||||
static HTAttr frameset_attr[HTML_FRAMESET_ATTRIBUTES+1] = { /* frameset attributes */
|
|
||||||
HTML_ATTR(FRAMESET,CLASS),
|
|
||||||
HTML_ATTR(FRAMESET,COLS),
|
|
||||||
HTML_ATTR(FRAMESET,ID),
|
|
||||||
HTML_ATTR(FRAMESET,ROWS),
|
|
||||||
HTML_ATTR(FRAMESET,STYLE),
|
|
||||||
HTML_ATTR(FRAMESET,TITLE),
|
|
||||||
HTML_ATTRIBUTES(FRAMESET)
|
|
||||||
};
|
|
||||||
|
|
||||||
static HTAttr a_attr[HTML_A_ATTRIBUTES+1] = { /* Anchor attributes */
|
|
||||||
HTML_ATTR(A,ACCESSKEY),
|
|
||||||
HTML_ATTR(A,CHARSET),
|
|
||||||
HTML_ATTR(A,CLASS),
|
|
||||||
HTML_ATTR(A,COORDS),
|
|
||||||
HTML_ATTR(A,DIR),
|
|
||||||
HTML_ATTR(A,HREF),
|
|
||||||
HTML_ATTR(A,HREFLANG),
|
|
||||||
HTML_ATTR(A,ID),
|
|
||||||
HTML_ATTR(A,NAME),
|
|
||||||
HTML_ATTR(A,REL),
|
|
||||||
HTML_ATTR(A,REV),
|
|
||||||
HTML_ATTR(A,SHAPE),
|
|
||||||
HTML_ATTR(A,STYLE),
|
|
||||||
HTML_ATTR(A,TABINDEX),
|
|
||||||
HTML_ATTR(A,TARGET),
|
|
||||||
HTML_ATTR(A,TYPE),
|
|
||||||
HTML_ATTR(A,TITLE),
|
|
||||||
HTML_ATTRIBUTES(A)
|
|
||||||
};
|
|
||||||
|
|
||||||
static HTAttr applet_attr[HTML_APPLET_ATTRIBUTES+1] = {
|
|
||||||
HTML_ATTR(APPLET,ALIGN),
|
|
||||||
HTML_ATTR(APPLET,ALT),
|
|
||||||
HTML_ATTR(APPLET,ARCHIVE),
|
|
||||||
HTML_ATTR(APPLET,CLASS),
|
|
||||||
HTML_ATTR(APPLET,CODE),
|
|
||||||
HTML_ATTR(APPLET,CODEBASE),
|
|
||||||
HTML_ATTR(APPLET,HEIGHT),
|
|
||||||
HTML_ATTR(APPLET,HSPACE),
|
|
||||||
HTML_ATTR(APPLET,ID),
|
|
||||||
HTML_ATTR(APPLET,NAME),
|
|
||||||
HTML_ATTR(APPLET,OBJECT),
|
|
||||||
HTML_ATTR(APPLET,STYLE),
|
|
||||||
HTML_ATTR(APPLET,TITLE),
|
|
||||||
HTML_ATTR(APPLET,VSPACE),
|
|
||||||
HTML_ATTR(APPLET,WIDTH),
|
|
||||||
HTML_ATTRIBUTES(APPLET)
|
|
||||||
};
|
|
||||||
|
|
||||||
static HTAttr area_attr[HTML_AREA_ATTRIBUTES+1] = { /* Area attributes */
|
|
||||||
HTML_ATTR(AREA,ACCESSKEY),
|
|
||||||
HTML_ATTR(AREA,ALT),
|
|
||||||
HTML_ATTR(AREA,CLASS),
|
|
||||||
HTML_ATTR(AREA,COORDS),
|
|
||||||
HTML_ATTR(AREA,DIR),
|
|
||||||
HTML_ATTR(AREA,HREF),
|
|
||||||
HTML_ATTR(AREA,ID),
|
|
||||||
HTML_ATTR(AREA,NAME),
|
|
||||||
HTML_ATTR(AREA,NOHREF),
|
|
||||||
HTML_ATTR(AREA,LANG),
|
|
||||||
HTML_ATTR(AREA,SHAPE),
|
|
||||||
HTML_ATTR(AREA,STYLE),
|
|
||||||
HTML_ATTR(AREA,TABINDEX),
|
|
||||||
HTML_ATTR(AREA,TARGET),
|
|
||||||
HTML_ATTR(AREA,TITLE),
|
|
||||||
HTML_ATTRIBUTES(AREA)
|
|
||||||
};
|
|
||||||
|
|
||||||
static HTAttr base_attr[HTML_BASE_ATTRIBUTES+1] = { /* BASE attributes */
|
|
||||||
HTML_ATTR(BASE,HREF),
|
|
||||||
HTML_ATTR(BASE,TARGET),
|
|
||||||
HTML_ATTRIBUTES(BASE)
|
|
||||||
};
|
|
||||||
|
|
||||||
static HTAttr bdo_attr[HTML_BDO_ATTRIBUTES+1] = {
|
|
||||||
HTML_ATTR(BDO,CLASS),
|
|
||||||
HTML_ATTR(BDO,DIR),
|
|
||||||
HTML_ATTR(BDO,ID),
|
|
||||||
HTML_ATTR(BDO,LANG),
|
|
||||||
HTML_ATTR(BDO,STYLE),
|
|
||||||
HTML_ATTR(BDO,TITLE),
|
|
||||||
HTML_ATTRIBUTES(BDO)
|
|
||||||
};
|
|
||||||
|
|
||||||
static HTAttr bq_attr[HTML_BQ_ATTRIBUTES+1] = {
|
|
||||||
HTML_ATTR(BQ,CITE),
|
|
||||||
HTML_ATTR(BQ,CLASS),
|
|
||||||
HTML_ATTR(BQ,DIR),
|
|
||||||
HTML_ATTR(BQ,ID),
|
|
||||||
HTML_ATTR(BQ,LANG),
|
|
||||||
HTML_ATTR(BQ,STYLE),
|
|
||||||
HTML_ATTR(BQ,TITLE),
|
|
||||||
HTML_ATTRIBUTES(BQ)
|
|
||||||
};
|
|
||||||
|
|
||||||
static HTAttr br_attr[HTML_BR_ATTRIBUTES+1] = {
|
|
||||||
HTML_ATTR(BR,CLASS),
|
|
||||||
HTML_ATTR(BR,CLEAR),
|
|
||||||
HTML_ATTR(BR,ID),
|
|
||||||
HTML_ATTR(BR,STYLE),
|
|
||||||
HTML_ATTR(BR,TITLE),
|
|
||||||
HTML_ATTRIBUTES(BR)
|
|
||||||
};
|
|
||||||
|
|
||||||
static HTAttr button_attr[HTML_BUTTON_ATTRIBUTES+1] = {
|
|
||||||
HTML_ATTR(BUTTON,ACCESSKEY),
|
|
||||||
HTML_ATTR(BUTTON,CLASS),
|
|
||||||
HTML_ATTR(BUTTON,DIR),
|
|
||||||
HTML_ATTR(BUTTON,DISABLED),
|
|
||||||
HTML_ATTR(BUTTON,ID),
|
|
||||||
HTML_ATTR(BUTTON,LANG),
|
|
||||||
HTML_ATTR(BUTTON,NAME),
|
|
||||||
HTML_ATTR(BUTTON,STYLE),
|
|
||||||
HTML_ATTR(BUTTON,TABINDEX),
|
|
||||||
HTML_ATTR(BUTTON,TITLE),
|
|
||||||
HTML_ATTR(BUTTON,TYPE),
|
|
||||||
HTML_ATTR(BUTTON,VALUE),
|
|
||||||
HTML_ATTRIBUTES(BUTTON),
|
|
||||||
};
|
|
||||||
|
|
||||||
static HTAttr col_attr[HTML_COL_ATTRIBUTES+1] = {
|
|
||||||
HTML_ATTR(COL,CLASS),
|
|
||||||
HTML_ATTR(COL,DIR),
|
|
||||||
HTML_ATTR(COL,ID),
|
|
||||||
HTML_ATTR(COL,LANG),
|
|
||||||
HTML_ATTR(COL,SPAN),
|
|
||||||
HTML_ATTR(COL,STYLE),
|
|
||||||
HTML_ATTR(COL,TITLE),
|
|
||||||
HTML_ATTR(COL,WIDTH),
|
|
||||||
HTML_ATTRIBUTES(COL)
|
|
||||||
};
|
|
||||||
|
|
||||||
static HTAttr changes_attr[HTML_CHANGES_ATTRIBUTES+1] = {
|
|
||||||
HTML_ATTR(CHANGES,CITE),
|
|
||||||
HTML_ATTR(CHANGES,CLASS),
|
|
||||||
HTML_ATTR(CHANGES,DATETIME),
|
|
||||||
HTML_ATTR(CHANGES,DIR),
|
|
||||||
HTML_ATTR(CHANGES,ID),
|
|
||||||
HTML_ATTR(CHANGES,LANG),
|
|
||||||
HTML_ATTR(CHANGES,STYLE),
|
|
||||||
HTML_ATTR(CHANGES,TITLE),
|
|
||||||
HTML_ATTRIBUTES(CHANGES)
|
|
||||||
};
|
|
||||||
|
|
||||||
static HTAttr font_attr[HTML_FONT_ATTRIBUTES+1] = {
|
|
||||||
HTML_ATTR(FONT,CLASS),
|
|
||||||
HTML_ATTR(FONT,COLOR),
|
|
||||||
HTML_ATTR(FONT,DIR),
|
|
||||||
HTML_ATTR(FONT,FACE),
|
|
||||||
HTML_ATTR(FONT,ID),
|
|
||||||
HTML_ATTR(FONT,LANG),
|
|
||||||
HTML_ATTR(FONT,SIZE),
|
|
||||||
HTML_ATTR(FONT,STYLE),
|
|
||||||
HTML_ATTR(FONT,TITLE),
|
|
||||||
HTML_ATTRIBUTES(FONT)
|
|
||||||
};
|
|
||||||
|
|
||||||
static HTAttr form_attr[HTML_FORM_ATTRIBUTES+1] = {
|
|
||||||
HTML_ATTR(FORM,ACCEPT),
|
|
||||||
{ (char *) "ACCEPT-CHARSET" }, /* HTML_ATTR(FORM,ACCEPT_CHARSET) */
|
|
||||||
HTML_ATTR(FORM,ACTION),
|
|
||||||
HTML_ATTR(FORM,CLASS),
|
|
||||||
HTML_ATTR(FORM,DIR),
|
|
||||||
HTML_ATTR(FORM,ENCTYPE),
|
|
||||||
HTML_ATTR(FORM,ID),
|
|
||||||
HTML_ATTR(FORM,LANG),
|
|
||||||
HTML_ATTR(FORM,METHOD),
|
|
||||||
HTML_ATTR(FORM,STYLE),
|
|
||||||
HTML_ATTR(FORM,TARGET),
|
|
||||||
HTML_ATTR(FORM,TITLE),
|
|
||||||
HTML_ATTRIBUTES(FORM)
|
|
||||||
};
|
|
||||||
|
|
||||||
static HTAttr gen_attr[HTML_GEN_ATTRIBUTES+1] = { /* General, for many things */
|
|
||||||
HTML_ATTR(GEN,CLASS),
|
|
||||||
HTML_ATTR(GEN,DIR),
|
|
||||||
HTML_ATTR(GEN,ID),
|
|
||||||
HTML_ATTR(GEN,LANG),
|
|
||||||
HTML_ATTR(GEN,STYLE),
|
|
||||||
HTML_ATTR(GEN,TITLE),
|
|
||||||
HTML_ATTRIBUTES(GEN)
|
|
||||||
};
|
|
||||||
|
|
||||||
static HTAttr block_attr[HTML_BLOCK_ATTRIBUTES+1] = { /* DIV, SPAN, H1-H6 */
|
|
||||||
HTML_ATTR(BLOCK,ALIGN),
|
|
||||||
HTML_ATTR(BLOCK,CLASS),
|
|
||||||
HTML_ATTR(BLOCK,DIR),
|
|
||||||
HTML_ATTR(BLOCK,ID),
|
|
||||||
HTML_ATTR(BLOCK,LANG),
|
|
||||||
HTML_ATTR(BLOCK,STYLE),
|
|
||||||
HTML_ATTR(BLOCK,TITLE),
|
|
||||||
HTML_ATTRIBUTES(BLOCK)
|
|
||||||
};
|
|
||||||
|
|
||||||
static HTAttr head_attr[HTML_HEAD_ATTRIBUTES+1] = {
|
|
||||||
HTML_ATTR(HEAD,DIR),
|
|
||||||
HTML_ATTR(HEAD,LANG),
|
|
||||||
HTML_ATTR(HEAD,PROFILE),
|
|
||||||
HTML_ATTRIBUTES(HEAD)
|
|
||||||
};
|
|
||||||
|
|
||||||
static HTAttr hr_attr[HTML_HR_ATTRIBUTES+1] = {
|
|
||||||
HTML_ATTR(HR,ALIGN),
|
|
||||||
HTML_ATTR(HR,CLASS),
|
|
||||||
HTML_ATTR(HR,DIR),
|
|
||||||
HTML_ATTR(HR,ID),
|
|
||||||
HTML_ATTR(HR,LANG),
|
|
||||||
HTML_ATTR(HR,NOSHADE),
|
|
||||||
HTML_ATTR(HR,SIZE),
|
|
||||||
HTML_ATTR(HR,STYLE),
|
|
||||||
HTML_ATTR(HR,TITLE),
|
|
||||||
HTML_ATTR(HR,WIDTH),
|
|
||||||
HTML_ATTRIBUTES(HR)
|
|
||||||
};
|
|
||||||
|
|
||||||
static HTAttr html_attr[HTML_HTML_ATTRIBUTES+1] = {
|
|
||||||
HTML_ATTR(HTML,DIR),
|
|
||||||
HTML_ATTR(HTML,LANG),
|
|
||||||
HTML_ATTR(HTML,VERSION),
|
|
||||||
HTML_ATTRIBUTES(HTML)
|
|
||||||
};
|
|
||||||
|
|
||||||
static HTAttr iframe_attr[HTML_IFRAME_ATTRIBUTES+1] = {
|
|
||||||
HTML_ATTR(IFRAME,ALIGN),
|
|
||||||
HTML_ATTR(IFRAME,CLASS),
|
|
||||||
HTML_ATTR(IFRAME,FRAMEBORDER),
|
|
||||||
HTML_ATTR(IFRAME,HEIGHT),
|
|
||||||
HTML_ATTR(IFRAME,ID),
|
|
||||||
HTML_ATTR(IFRAME,LONGDESC),
|
|
||||||
HTML_ATTR(IFRAME,MARGINHEIGHT),
|
|
||||||
HTML_ATTR(IFRAME,MARGINWIDTH),
|
|
||||||
HTML_ATTR(IFRAME,NAME),
|
|
||||||
HTML_ATTR(IFRAME,SCROLLING),
|
|
||||||
HTML_ATTR(IFRAME,SRC),
|
|
||||||
HTML_ATTR(IFRAME,STYLE),
|
|
||||||
HTML_ATTR(IFRAME,TARGET),
|
|
||||||
HTML_ATTR(IFRAME,TITLE),
|
|
||||||
HTML_ATTR(IFRAME,WIDTH),
|
|
||||||
HTML_ATTRIBUTES(IFRAME)
|
|
||||||
};
|
|
||||||
|
|
||||||
static HTAttr img_attr[HTML_IMG_ATTRIBUTES+1] = { /* IMG attributes */
|
|
||||||
HTML_ATTR(IMG,ALIGN),
|
|
||||||
HTML_ATTR(IMG,ALT),
|
|
||||||
HTML_ATTR(IMG,BORDER),
|
|
||||||
HTML_ATTR(IMG,CLASS),
|
|
||||||
HTML_ATTR(IMG,DIR),
|
|
||||||
HTML_ATTR(IMG,HEIGHT),
|
|
||||||
HTML_ATTR(IMG,HSPACE),
|
|
||||||
HTML_ATTR(IMG,ID),
|
|
||||||
HTML_ATTR(IMG,ISMAP),
|
|
||||||
HTML_ATTR(IMG,LANG),
|
|
||||||
HTML_ATTR(IMG,LONGDESC),
|
|
||||||
HTML_ATTR(IMG,SRC),
|
|
||||||
HTML_ATTR(IMG,STYLE),
|
|
||||||
HTML_ATTR(IMG,TITLE),
|
|
||||||
HTML_ATTR(IMG,USEMAP),
|
|
||||||
HTML_ATTR(IMG,VSPACE),
|
|
||||||
HTML_ATTR(IMG,WIDTH),
|
|
||||||
HTML_ATTRIBUTES(IMG)
|
|
||||||
};
|
|
||||||
|
|
||||||
static HTAttr input_attr[HTML_INPUT_ATTRIBUTES+1] = {
|
|
||||||
HTML_ATTR(INPUT,ACCEPT),
|
|
||||||
HTML_ATTR(INPUT,ACCESSKEY),
|
|
||||||
HTML_ATTR(INPUT,ALIGN),
|
|
||||||
HTML_ATTR(INPUT,ALT),
|
|
||||||
HTML_ATTR(INPUT,CHECKED),
|
|
||||||
HTML_ATTR(INPUT,CLASS),
|
|
||||||
HTML_ATTR(INPUT,DIR),
|
|
||||||
HTML_ATTR(INPUT,DISABLED),
|
|
||||||
HTML_ATTR(INPUT,ID),
|
|
||||||
HTML_ATTR(INPUT,LANG),
|
|
||||||
HTML_ATTR(INPUT,MAXLENGTH),
|
|
||||||
HTML_ATTR(INPUT,NAME),
|
|
||||||
HTML_ATTR(INPUT,READONLY),
|
|
||||||
HTML_ATTR(INPUT,SIZE),
|
|
||||||
HTML_ATTR(INPUT,SRC),
|
|
||||||
HTML_ATTR(INPUT,STYLE),
|
|
||||||
HTML_ATTR(INPUT,TABINDEX),
|
|
||||||
HTML_ATTR(INPUT,TITLE),
|
|
||||||
HTML_ATTR(INPUT,TYPE),
|
|
||||||
HTML_ATTR(INPUT,USEMAP),
|
|
||||||
HTML_ATTR(INPUT,VALUE),
|
|
||||||
HTML_ATTRIBUTES(INPUT)
|
|
||||||
};
|
|
||||||
|
|
||||||
static HTAttr isindex_attr[HTML_ISINDEX_ATTRIBUTES+1] = {
|
|
||||||
HTML_ATTR(ISINDEX,CLASS),
|
|
||||||
HTML_ATTR(ISINDEX,DIR),
|
|
||||||
HTML_ATTR(ISINDEX,ID),
|
|
||||||
HTML_ATTR(ISINDEX,LANG),
|
|
||||||
HTML_ATTR(ISINDEX,PROMPT),
|
|
||||||
HTML_ATTR(ISINDEX,STYLE),
|
|
||||||
HTML_ATTR(ISINDEX,TITLE),
|
|
||||||
HTML_ATTRIBUTES(ISINDEX)
|
|
||||||
};
|
|
||||||
|
|
||||||
static HTAttr label_attr[HTML_LABEL_ATTRIBUTES+1] = {
|
|
||||||
HTML_ATTR(LABEL,ACCESSKEY),
|
|
||||||
HTML_ATTR(LABEL,CLASS),
|
|
||||||
HTML_ATTR(LABEL,DIR),
|
|
||||||
HTML_ATTR(LABEL,FOR),
|
|
||||||
HTML_ATTR(LABEL,ID),
|
|
||||||
HTML_ATTR(LABEL,LANG),
|
|
||||||
HTML_ATTR(LABEL,STYLE),
|
|
||||||
HTML_ATTR(LABEL,TITLE),
|
|
||||||
HTML_ATTRIBUTES(LABEL)
|
|
||||||
};
|
|
||||||
|
|
||||||
static HTAttr legend_attr[HTML_LEGEND_ATTRIBUTES+1] = {
|
|
||||||
HTML_ATTR(LEGEND,ACCESSKEY),
|
|
||||||
HTML_ATTR(LEGEND,ALIGN),
|
|
||||||
HTML_ATTR(LEGEND,CLASS),
|
|
||||||
HTML_ATTR(LEGEND,DIR),
|
|
||||||
HTML_ATTR(LEGEND,ID),
|
|
||||||
HTML_ATTR(LEGEND,LANG),
|
|
||||||
HTML_ATTR(LEGEND,STYLE),
|
|
||||||
HTML_ATTR(LEGEND,TITLE),
|
|
||||||
HTML_ATTRIBUTES(LEGEND)
|
|
||||||
};
|
|
||||||
|
|
||||||
static HTAttr li_attr[HTML_LI_ATTRIBUTES+1] = {
|
|
||||||
HTML_ATTR(LI,CLASS),
|
|
||||||
HTML_ATTR(LI,COMPACT),
|
|
||||||
HTML_ATTR(LI,DIR),
|
|
||||||
HTML_ATTR(LI,ID),
|
|
||||||
HTML_ATTR(LI,LANG),
|
|
||||||
HTML_ATTR(LI,STYLE),
|
|
||||||
HTML_ATTR(LI,TITLE),
|
|
||||||
HTML_ATTR(LI,TYPE),
|
|
||||||
HTML_ATTR(LI,VALUE),
|
|
||||||
HTML_ATTRIBUTES(LI)
|
|
||||||
};
|
|
||||||
|
|
||||||
static HTAttr link_attr[HTML_LINK_ATTRIBUTES+1] = { /* link attributes */
|
|
||||||
HTML_ATTR(LINK,CHARSET),
|
|
||||||
HTML_ATTR(LINK,CLASS),
|
|
||||||
HTML_ATTR(LINK,DIR),
|
|
||||||
HTML_ATTR(LINK,HREF),
|
|
||||||
HTML_ATTR(LINK,HREFLANG),
|
|
||||||
HTML_ATTR(LINK,ID),
|
|
||||||
HTML_ATTR(LINK,LANG),
|
|
||||||
HTML_ATTR(LINK,MEDIA),
|
|
||||||
HTML_ATTR(LINK,REL),
|
|
||||||
HTML_ATTR(LINK,REV),
|
|
||||||
HTML_ATTR(LINK,STYLE),
|
|
||||||
HTML_ATTR(LINK,TARGET),
|
|
||||||
HTML_ATTR(LINK,TITLE),
|
|
||||||
HTML_ATTR(LINK,TYPE),
|
|
||||||
HTML_ATTRIBUTES(LINK)
|
|
||||||
};
|
|
||||||
|
|
||||||
static HTAttr map_attr[HTML_MAP_ATTRIBUTES+1] = {
|
|
||||||
HTML_ATTR(MAP,CLASS),
|
|
||||||
HTML_ATTR(MAP,DIR),
|
|
||||||
HTML_ATTR(MAP,ID),
|
|
||||||
HTML_ATTR(MAP,LANG),
|
|
||||||
HTML_ATTR(MAP,NAME),
|
|
||||||
HTML_ATTR(MAP,STYLE),
|
|
||||||
HTML_ATTR(MAP,TITLE),
|
|
||||||
HTML_ATTRIBUTES(MAP)
|
|
||||||
};
|
|
||||||
|
|
||||||
static HTAttr meta_attr[HTML_META_ATTRIBUTES+1] = {
|
|
||||||
HTML_ATTR(META,CONTENT),
|
|
||||||
HTML_ATTR(META,DIR),
|
|
||||||
{ (char *)"HTTP-EQUIV" }, /* HTML_ATTR(META,HTTP_EQUIV) */
|
|
||||||
HTML_ATTR(META,LANG),
|
|
||||||
HTML_ATTR(META,NAME),
|
|
||||||
HTML_ATTR(META,SCHEME),
|
|
||||||
HTML_ATTRIBUTES(META)
|
|
||||||
};
|
|
||||||
|
|
||||||
static HTAttr nextid_attr[HTML_NEXTID_ATTRIBUTES+1] = {
|
|
||||||
{ (char *)"N" },
|
|
||||||
{ 0 } /* Terminate list */
|
|
||||||
};
|
|
||||||
|
|
||||||
static HTAttr object_attr[HTML_OBJECT_ATTRIBUTES+1] = { /* object attributes */
|
|
||||||
HTML_ATTR(OBJECT,ALIGN),
|
|
||||||
HTML_ATTR(OBJECT,ARCHIVE),
|
|
||||||
HTML_ATTR(OBJECT,BORDER),
|
|
||||||
HTML_ATTR(OBJECT,CLASS),
|
|
||||||
HTML_ATTR(OBJECT,CLASSID),
|
|
||||||
HTML_ATTR(OBJECT,CODEBASE),
|
|
||||||
HTML_ATTR(OBJECT,CODETYPE),
|
|
||||||
HTML_ATTR(OBJECT,DATA),
|
|
||||||
HTML_ATTR(OBJECT,DECLARE),
|
|
||||||
HTML_ATTR(OBJECT,DIR),
|
|
||||||
HTML_ATTR(OBJECT,HEIGHT),
|
|
||||||
HTML_ATTR(OBJECT,HSPACE),
|
|
||||||
HTML_ATTR(OBJECT,ID),
|
|
||||||
HTML_ATTR(OBJECT,LANG),
|
|
||||||
HTML_ATTR(OBJECT,NAME),
|
|
||||||
HTML_ATTR(OBJECT,STANDBY),
|
|
||||||
HTML_ATTR(OBJECT,STYLE),
|
|
||||||
HTML_ATTR(OBJECT,TABINDEX),
|
|
||||||
HTML_ATTR(OBJECT,TITLE),
|
|
||||||
HTML_ATTR(OBJECT,TYPE),
|
|
||||||
HTML_ATTR(OBJECT,USEMAP),
|
|
||||||
HTML_ATTR(OBJECT,VSPACE),
|
|
||||||
HTML_ATTR(OBJECT,WIDTH),
|
|
||||||
HTML_ATTRIBUTES(OBJECT)
|
|
||||||
};
|
|
||||||
|
|
||||||
static HTAttr ol_attr[HTML_OL_ATTRIBUTES+1] = {
|
|
||||||
HTML_ATTR(OL,CLASS),
|
|
||||||
HTML_ATTR(OL,COMPACT),
|
|
||||||
HTML_ATTR(OL,DIR),
|
|
||||||
HTML_ATTR(OL,ID),
|
|
||||||
HTML_ATTR(OL,LANG),
|
|
||||||
HTML_ATTR(OL,START),
|
|
||||||
HTML_ATTR(OL,STYLE),
|
|
||||||
HTML_ATTR(OL,TITLE),
|
|
||||||
HTML_ATTR(OL,TYPE),
|
|
||||||
HTML_ATTRIBUTES(OL)
|
|
||||||
};
|
|
||||||
|
|
||||||
static HTAttr optgroup_attr[HTML_OPTGROUP_ATTRIBUTES+1] = {
|
|
||||||
HTML_ATTR(OPTGROUP,CLASS),
|
|
||||||
HTML_ATTR(OPTGROUP,DISABLED),
|
|
||||||
HTML_ATTR(OPTGROUP,DIR),
|
|
||||||
HTML_ATTR(OPTGROUP,ID),
|
|
||||||
HTML_ATTR(OPTGROUP,LABEL),
|
|
||||||
HTML_ATTR(OPTGROUP,LANG),
|
|
||||||
HTML_ATTR(OPTGROUP,STYLE),
|
|
||||||
HTML_ATTR(OPTGROUP,TITLE),
|
|
||||||
HTML_ATTRIBUTES(OPTGROUP)
|
|
||||||
};
|
|
||||||
|
|
||||||
static HTAttr option_attr[HTML_OPTION_ATTRIBUTES+1] = {
|
|
||||||
HTML_ATTR(OPTION,CLASS),
|
|
||||||
HTML_ATTR(OPTION,DISABLED),
|
|
||||||
HTML_ATTR(OPTION,DIR),
|
|
||||||
HTML_ATTR(OPTION,ID),
|
|
||||||
HTML_ATTR(OPTION,LABEL),
|
|
||||||
HTML_ATTR(OPTION,LANG),
|
|
||||||
HTML_ATTR(OPTION,SELECTED),
|
|
||||||
HTML_ATTR(OPTION,STYLE),
|
|
||||||
HTML_ATTR(OPTION,TITLE),
|
|
||||||
HTML_ATTR(OPTION,VALUE),
|
|
||||||
HTML_ATTRIBUTES(OPTION)
|
|
||||||
};
|
|
||||||
|
|
||||||
static HTAttr param_attr[HTML_PARAM_ATTRIBUTES+1] = {
|
|
||||||
HTML_ATTR(PARAM,ID),
|
|
||||||
HTML_ATTR(PARAM,NAME),
|
|
||||||
HTML_ATTR(PARAM,TYPE),
|
|
||||||
HTML_ATTR(PARAM,VALUE),
|
|
||||||
HTML_ATTR(PARAM,VALUETYPE),
|
|
||||||
HTML_ATTRIBUTES(PARAM)
|
|
||||||
};
|
|
||||||
|
|
||||||
static HTAttr pre_attr[HTML_PRE_ATTRIBUTES+1] = {
|
|
||||||
HTML_ATTR(PRE,CLASS),
|
|
||||||
HTML_ATTR(PRE,DIR),
|
|
||||||
HTML_ATTR(PRE,ID),
|
|
||||||
HTML_ATTR(PRE,LANG),
|
|
||||||
HTML_ATTR(PRE,STYLE),
|
|
||||||
HTML_ATTR(PRE,TITLE),
|
|
||||||
HTML_ATTR(PRE,WIDTH),
|
|
||||||
HTML_ATTRIBUTES(PRE)
|
|
||||||
};
|
|
||||||
|
|
||||||
static HTAttr script_attr[HTML_SCRIPT_ATTRIBUTES+1] = {
|
|
||||||
HTML_ATTR(SCRIPT,CHARSET),
|
|
||||||
HTML_ATTR(SCRIPT,DEFER),
|
|
||||||
HTML_ATTR(SCRIPT,LANGUAGE),
|
|
||||||
HTML_ATTR(SCRIPT,SRC),
|
|
||||||
HTML_ATTR(SCRIPT,TYPE),
|
|
||||||
HTML_ATTRIBUTES(SCRIPT)
|
|
||||||
};
|
|
||||||
|
|
||||||
static HTAttr select_attr[HTML_SELECT_ATTRIBUTES+1] = {
|
|
||||||
HTML_ATTR(SELECT,CLASS),
|
|
||||||
HTML_ATTR(SELECT,DIR),
|
|
||||||
HTML_ATTR(SELECT,DISABLED),
|
|
||||||
HTML_ATTR(SELECT,ID),
|
|
||||||
HTML_ATTR(SELECT,LANG),
|
|
||||||
HTML_ATTR(SELECT,MULTIPLE),
|
|
||||||
HTML_ATTR(SELECT,NAME),
|
|
||||||
HTML_ATTR(SELECT,SIZE),
|
|
||||||
HTML_ATTR(SELECT,STYLE),
|
|
||||||
HTML_ATTR(SELECT,TABINDEX),
|
|
||||||
HTML_ATTR(SELECT,TITLE),
|
|
||||||
HTML_ATTRIBUTES(SELECT)
|
|
||||||
};
|
|
||||||
|
|
||||||
static HTAttr style_attr[HTML_STYLE_ATTRIBUTES+1] = {
|
|
||||||
HTML_ATTR(STYLE,DIR),
|
|
||||||
HTML_ATTR(STYLE,LANG),
|
|
||||||
HTML_ATTR(STYLE,MEDIA),
|
|
||||||
HTML_ATTR(STYLE,TITLE),
|
|
||||||
HTML_ATTR(STYLE,TYPE),
|
|
||||||
HTML_ATTRIBUTES(STYLE)
|
|
||||||
};
|
|
||||||
|
|
||||||
static HTAttr table_attr[HTML_TABLE_ATTRIBUTES+1] = {
|
|
||||||
HTML_ATTR(TABLE,ALIGN),
|
|
||||||
HTML_ATTR(TABLE,BGCOLOR),
|
|
||||||
HTML_ATTR(TABLE,BORDER),
|
|
||||||
HTML_ATTR(TABLE,CELLPADDING),
|
|
||||||
HTML_ATTR(TABLE,CELLSPACING),
|
|
||||||
HTML_ATTR(TABLE,CLASS),
|
|
||||||
HTML_ATTR(TABLE,DIR),
|
|
||||||
HTML_ATTR(TABLE,FRAME),
|
|
||||||
HTML_ATTR(TABLE,ID),
|
|
||||||
HTML_ATTR(TABLE,LANG),
|
|
||||||
HTML_ATTR(TABLE,RULES),
|
|
||||||
HTML_ATTR(TABLE,SUMMARY),
|
|
||||||
HTML_ATTR(TABLE,STYLE),
|
|
||||||
HTML_ATTR(TABLE,TITLE),
|
|
||||||
HTML_ATTR(TABLE,WIDTH),
|
|
||||||
HTML_ATTRIBUTES(TABLE)
|
|
||||||
};
|
|
||||||
|
|
||||||
static HTAttr tele_attr[HTML_TELE_ATTRIBUTES+1] = {
|
|
||||||
HTML_ATTR(TELE,ALIGN),
|
|
||||||
HTML_ATTR(TELE,CHAR),
|
|
||||||
HTML_ATTR(TELE,CHAROFF),
|
|
||||||
HTML_ATTR(TELE,CLASS),
|
|
||||||
HTML_ATTR(TELE,DIR),
|
|
||||||
HTML_ATTR(TELE,ID),
|
|
||||||
HTML_ATTR(TELE,LANG),
|
|
||||||
HTML_ATTR(TELE,STYLE),
|
|
||||||
HTML_ATTR(TELE,TITLE),
|
|
||||||
HTML_ATTR(TELE,VALIGN),
|
|
||||||
HTML_ATTRIBUTES(TELE)
|
|
||||||
};
|
|
||||||
|
|
||||||
static HTAttr td_attr[HTML_TD_ATTRIBUTES+1] = {
|
|
||||||
HTML_ATTR(TD,ABBR),
|
|
||||||
HTML_ATTR(TD,ALIGN),
|
|
||||||
HTML_ATTR(TD,AXIS),
|
|
||||||
HTML_ATTR(TD,BGCOLOR),
|
|
||||||
HTML_ATTR(TD,CHAR),
|
|
||||||
HTML_ATTR(TD,CHAROFF),
|
|
||||||
HTML_ATTR(TD,CLASS),
|
|
||||||
HTML_ATTR(TD,COLSPAN),
|
|
||||||
HTML_ATTR(TD,DIR),
|
|
||||||
HTML_ATTR(TD,ID),
|
|
||||||
HTML_ATTR(TD,HEADERS),
|
|
||||||
HTML_ATTR(TD,HEIGHT),
|
|
||||||
HTML_ATTR(TD,LANG),
|
|
||||||
HTML_ATTR(TD,NOWRAP),
|
|
||||||
HTML_ATTR(TD,ROWSPAN),
|
|
||||||
HTML_ATTR(TD,SCOPE),
|
|
||||||
HTML_ATTR(TD,STYLE),
|
|
||||||
HTML_ATTR(TD,TITLE),
|
|
||||||
HTML_ATTR(TD,VALIGN),
|
|
||||||
HTML_ATTR(TD,WIDTH),
|
|
||||||
HTML_ATTRIBUTES(TD)
|
|
||||||
};
|
|
||||||
|
|
||||||
static HTAttr textarea_attr[HTML_TEXTAREA_ATTRIBUTES+1] = {
|
|
||||||
HTML_ATTR(TEXTAREA,CLASS),
|
|
||||||
HTML_ATTR(TEXTAREA,COLS),
|
|
||||||
HTML_ATTR(TEXTAREA,DIR),
|
|
||||||
HTML_ATTR(TEXTAREA,DISABLED),
|
|
||||||
HTML_ATTR(TEXTAREA,ID),
|
|
||||||
HTML_ATTR(TEXTAREA,LANG),
|
|
||||||
HTML_ATTR(TEXTAREA,NAME),
|
|
||||||
HTML_ATTR(TEXTAREA,READONLY),
|
|
||||||
HTML_ATTR(TEXTAREA,ROWS),
|
|
||||||
HTML_ATTR(TEXTAREA,STYLE),
|
|
||||||
HTML_ATTR(TEXTAREA,TABINDEX),
|
|
||||||
HTML_ATTR(TEXTAREA,TITLE),
|
|
||||||
HTML_ATTRIBUTES(TEXTAREA)
|
|
||||||
};
|
|
||||||
|
|
||||||
static HTAttr title_attr[HTML_TITLE_ATTRIBUTES+1] = {
|
|
||||||
HTML_ATTR(TITLE,DIR),
|
|
||||||
HTML_ATTR(TITLE,LANG),
|
|
||||||
HTML_ATTRIBUTES(TITLE)
|
|
||||||
};
|
|
||||||
|
|
||||||
static HTAttr ul_attr[HTML_UL_ATTRIBUTES+1] = {
|
|
||||||
HTML_ATTR(UL,CLASS),
|
|
||||||
HTML_ATTR(UL,COMPACT),
|
|
||||||
HTML_ATTR(UL,DIR),
|
|
||||||
HTML_ATTR(UL,ID),
|
|
||||||
HTML_ATTR(UL,LANG),
|
|
||||||
HTML_ATTR(UL,STYLE),
|
|
||||||
HTML_ATTR(UL,TITLE),
|
|
||||||
HTML_ATTR(UL,TYPE),
|
|
||||||
HTML_ATTRIBUTES(UL)
|
|
||||||
};
|
|
||||||
|
|
||||||
/*
|
|
||||||
** ELEMENTS
|
|
||||||
** Must match definitions in HTMLPDTD.html!
|
|
||||||
** Must be in alphabetical order.
|
|
||||||
**
|
|
||||||
** Name, Attributes, content
|
|
||||||
*/
|
|
||||||
static HTTag tags[HTML_ELEMENTS] = {
|
|
||||||
{ "A" , a_attr, HTML_A_ATTRIBUTES },
|
|
||||||
{ "ABBR" , gen_attr, HTML_GEN_ATTRIBUTES },
|
|
||||||
{ "ACRONYM" , gen_attr, HTML_GEN_ATTRIBUTES },
|
|
||||||
{ "ADDRESS" , gen_attr, HTML_GEN_ATTRIBUTES },
|
|
||||||
{ "APPLET" , applet_attr, HTML_APPLET_ATTRIBUTES },
|
|
||||||
{ "AREA" , area_attr, HTML_AREA_ATTRIBUTES },
|
|
||||||
{ "B" , gen_attr, HTML_GEN_ATTRIBUTES },
|
|
||||||
{ "BASE" , base_attr, HTML_BASE_ATTRIBUTES },
|
|
||||||
{ "BASEFONT", font_attr, HTML_FONT_ATTRIBUTES },
|
|
||||||
{ "BDO" , bdo_attr, HTML_BDO_ATTRIBUTES },
|
|
||||||
{ "BIG" , gen_attr, HTML_GEN_ATTRIBUTES },
|
|
||||||
{ "BLOCKQUOTE", bq_attr, HTML_BQ_ATTRIBUTES },
|
|
||||||
{ "BODY" , body_attr, HTML_BODY_ATTRIBUTES },
|
|
||||||
{ "BR" , br_attr, HTML_BR_ATTRIBUTES },
|
|
||||||
{ "BUTTON" , button_attr, HTML_BUTTON_ATTRIBUTES },
|
|
||||||
{ "CAPTION" , block_attr, HTML_BLOCK_ATTRIBUTES },
|
|
||||||
{ "CENTER" , no_attr, 0 },
|
|
||||||
{ "CITE" , gen_attr, HTML_GEN_ATTRIBUTES },
|
|
||||||
{ "CODE" , gen_attr, HTML_GEN_ATTRIBUTES },
|
|
||||||
{ "COL" , col_attr, HTML_COL_ATTRIBUTES },
|
|
||||||
{ "COLGROUP", col_attr, HTML_COL_ATTRIBUTES },
|
|
||||||
{ "DD" , gen_attr, HTML_GEN_ATTRIBUTES },
|
|
||||||
{ "DEL" , changes_attr, HTML_CHANGES_ATTRIBUTES },
|
|
||||||
{ "DFN" , gen_attr, HTML_GEN_ATTRIBUTES },
|
|
||||||
{ "DIR" , gen_attr, HTML_GEN_ATTRIBUTES },
|
|
||||||
{ "DIV" , block_attr, HTML_BLOCK_ATTRIBUTES },
|
|
||||||
{ "DL" , gen_attr, HTML_GEN_ATTRIBUTES },
|
|
||||||
{ "DT" , gen_attr, HTML_GEN_ATTRIBUTES },
|
|
||||||
{ "EM" , gen_attr, HTML_GEN_ATTRIBUTES },
|
|
||||||
{ "FIELDSET", gen_attr, HTML_GEN_ATTRIBUTES },
|
|
||||||
{ "FONT" , font_attr, HTML_FONT_ATTRIBUTES },
|
|
||||||
{ "FORM" , form_attr, HTML_FORM_ATTRIBUTES },
|
|
||||||
{ "FRAME" , frame_attr, HTML_FRAME_ATTRIBUTES },
|
|
||||||
{ "FRAMESET", frameset_attr,HTML_FRAMESET_ATTRIBUTES },
|
|
||||||
{ "H1" , block_attr, HTML_BLOCK_ATTRIBUTES },
|
|
||||||
{ "H2" , block_attr, HTML_BLOCK_ATTRIBUTES },
|
|
||||||
{ "H3" , block_attr, HTML_BLOCK_ATTRIBUTES },
|
|
||||||
{ "H4" , block_attr, HTML_BLOCK_ATTRIBUTES },
|
|
||||||
{ "H5" , block_attr, HTML_BLOCK_ATTRIBUTES },
|
|
||||||
{ "H6" , block_attr, HTML_BLOCK_ATTRIBUTES },
|
|
||||||
{ "HEAD" , head_attr, HTML_HEAD_ATTRIBUTES },
|
|
||||||
{ "HR" , hr_attr, HTML_HR_ATTRIBUTES },
|
|
||||||
{ "HTML" , html_attr, HTML_HTML_ATTRIBUTES },
|
|
||||||
{ "I" , gen_attr, HTML_GEN_ATTRIBUTES },
|
|
||||||
{ "IFRAME" , iframe_attr, HTML_IFRAME_ATTRIBUTES },
|
|
||||||
{ "IMG" , img_attr, HTML_IMG_ATTRIBUTES },
|
|
||||||
{ "INPUT" , input_attr, HTML_INPUT_ATTRIBUTES },
|
|
||||||
{ "INS" , changes_attr, HTML_CHANGES_ATTRIBUTES },
|
|
||||||
{ "ISINDEX" , isindex_attr, HTML_ISINDEX_ATTRIBUTES },
|
|
||||||
{ "KBD" , gen_attr, HTML_GEN_ATTRIBUTES },
|
|
||||||
{ "LABEL" , label_attr, HTML_LABEL_ATTRIBUTES },
|
|
||||||
{ "LEGEND" , legend_attr, HTML_LEGEND_ATTRIBUTES },
|
|
||||||
{ "LI" , li_attr, HTML_LI_ATTRIBUTES },
|
|
||||||
{ "LINK" , link_attr, HTML_LINK_ATTRIBUTES },
|
|
||||||
{ "MAP" , map_attr, HTML_MAP_ATTRIBUTES },
|
|
||||||
{ "MENU" , gen_attr, HTML_GEN_ATTRIBUTES },
|
|
||||||
{ "META" , meta_attr, HTML_META_ATTRIBUTES },
|
|
||||||
{ "NEXTID" , nextid_attr, 1 },
|
|
||||||
{ "NOFRAMES", gen_attr, HTML_GEN_ATTRIBUTES },
|
|
||||||
{ "NOSCRIPT", gen_attr, HTML_GEN_ATTRIBUTES },
|
|
||||||
{ "OBJECT" , object_attr, HTML_OBJECT_ATTRIBUTES },
|
|
||||||
{ "OL" , ol_attr, HTML_OL_ATTRIBUTES },
|
|
||||||
{ "OPTGROUP", optgroup_attr,HTML_OPTGROUP_ATTRIBUTES },
|
|
||||||
{ "OPTION" , option_attr, HTML_OPTION_ATTRIBUTES },
|
|
||||||
{ "P" , block_attr, HTML_BLOCK_ATTRIBUTES },
|
|
||||||
{ "PARAM" , param_attr, HTML_PARAM_ATTRIBUTES },
|
|
||||||
{ "PRE" , pre_attr, HTML_PRE_ATTRIBUTES },
|
|
||||||
{ "Q" , gen_attr, HTML_GEN_ATTRIBUTES },
|
|
||||||
{ "S" , gen_attr, HTML_GEN_ATTRIBUTES },
|
|
||||||
{ "SAMP" , gen_attr, HTML_GEN_ATTRIBUTES },
|
|
||||||
{ "SCRIPT" , script_attr, HTML_SCRIPT_ATTRIBUTES },
|
|
||||||
{ "SELECT" , select_attr, HTML_SELECT_ATTRIBUTES },
|
|
||||||
{ "SMALL" , gen_attr, HTML_GEN_ATTRIBUTES },
|
|
||||||
{ "SPAN" , block_attr, HTML_BLOCK_ATTRIBUTES },
|
|
||||||
{ "STRIKE" , gen_attr, HTML_GEN_ATTRIBUTES },
|
|
||||||
{ "STRONG" , gen_attr, HTML_GEN_ATTRIBUTES },
|
|
||||||
{ "STYLE" , style_attr, HTML_STYLE_ATTRIBUTES },
|
|
||||||
{ "SUB" , gen_attr, HTML_GEN_ATTRIBUTES },
|
|
||||||
{ "SUP" , gen_attr, HTML_GEN_ATTRIBUTES },
|
|
||||||
{ "TABLE" , table_attr, HTML_TABLE_ATTRIBUTES },
|
|
||||||
{ "TBODY" , tele_attr, HTML_TELE_ATTRIBUTES },
|
|
||||||
{ "TD" , td_attr, HTML_TD_ATTRIBUTES },
|
|
||||||
{ "TEXTAREA", textarea_attr,HTML_TEXTAREA_ATTRIBUTES },
|
|
||||||
{ "TFOOT" , tele_attr, HTML_TELE_ATTRIBUTES },
|
|
||||||
{ "TH" , td_attr, HTML_TD_ATTRIBUTES },
|
|
||||||
{ "THEAD" , tele_attr, HTML_TELE_ATTRIBUTES },
|
|
||||||
{ "TITLE" , title_attr, HTML_TITLE_ATTRIBUTES },
|
|
||||||
{ "TR" , tele_attr, HTML_TELE_ATTRIBUTES },
|
|
||||||
{ "TT" , gen_attr, HTML_GEN_ATTRIBUTES },
|
|
||||||
{ "U" , gen_attr, HTML_GEN_ATTRIBUTES },
|
|
||||||
{ "UL" , ul_attr, HTML_UL_ATTRIBUTES },
|
|
||||||
{ "VAR" , gen_attr, HTML_GEN_ATTRIBUTES },
|
|
||||||
};
|
|
||||||
|
|
||||||
static SGML_dtd HTMLP_dtd = {
|
|
||||||
tags,
|
|
||||||
HTML_ELEMENTS
|
|
||||||
};
|
|
||||||
|
|
||||||
static SGML_dtd * DTD = &HTMLP_dtd;
|
|
||||||
|
|
||||||
SGML_dtd * HTML_dtd (void)
|
|
||||||
{
|
|
||||||
return DTD;
|
|
||||||
}
|
|
||||||
|
|
||||||
}// namespace
|
|
||||||
|
|
|
@ -115,7 +115,7 @@ namespace NLGUI
|
||||||
{
|
{
|
||||||
#if !FINAL_VERSION
|
#if !FINAL_VERSION
|
||||||
#ifdef NL_OS_WINDOWS
|
#ifdef NL_OS_WINDOWS
|
||||||
ShellExecuteW(NULL, utf8ToWide(operation), utf8ToWide(fileName), utf8ToWide(parameters), NULL, SW_SHOWDEFAULT);
|
ShellExecuteW(NULL, nlUtf8ToWide(operation), nlUtf8ToWide(fileName), nlUtf8ToWide(parameters), NULL, SW_SHOWDEFAULT);
|
||||||
#endif
|
#endif
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
|
@ -911,7 +911,7 @@ static bool createProcess(const std::string &programName, const std::string &arg
|
||||||
}
|
}
|
||||||
|
|
||||||
// or 0 for a window
|
// or 0 for a window
|
||||||
BOOL res = CreateProcessW(sProgramName, utf8ToWide(args), NULL, NULL, FALSE, CREATE_DEFAULT_ERROR_MODE | CREATE_NO_WINDOW, NULL, NULL /* current dir */, &si, &pi);
|
BOOL res = CreateProcessW(sProgramName, (LPWSTR)nlUtf8ToWide(args), NULL, NULL, FALSE, CREATE_DEFAULT_ERROR_MODE | CREATE_NO_WINDOW, NULL, NULL /* current dir */, &si, &pi);
|
||||||
|
|
||||||
if (sProgramName)
|
if (sProgramName)
|
||||||
{
|
{
|
||||||
|
@ -1453,7 +1453,7 @@ void displayDwordBits( uint32 b, uint nbits, sint beginpos, bool displayBegin, N
|
||||||
FILE* nlfopen(const std::string &filename, const std::string &mode)
|
FILE* nlfopen(const std::string &filename, const std::string &mode)
|
||||||
{
|
{
|
||||||
#ifdef NL_OS_WINDOWS
|
#ifdef NL_OS_WINDOWS
|
||||||
return _wfopen(utf8ToWide(filename), utf8ToWide(mode));
|
return _wfopen(nlUtf8ToWide(filename), nlUtf8ToWide(mode));
|
||||||
#else
|
#else
|
||||||
return fopen(filename.c_str(), mode.c_str());
|
return fopen(filename.c_str(), mode.c_str());
|
||||||
#endif
|
#endif
|
||||||
|
@ -1632,7 +1632,7 @@ static bool openDocWithExtension (const std::string &document, const std::string
|
||||||
{
|
{
|
||||||
#ifdef NL_OS_WINDOWS
|
#ifdef NL_OS_WINDOWS
|
||||||
// First try ShellExecute()
|
// First try ShellExecute()
|
||||||
HINSTANCE result = ShellExecuteW(NULL, L"open", utf8ToWide(document), NULL, NULL, SW_SHOWDEFAULT);
|
HINSTANCE result = ShellExecuteW(NULL, L"open", nlUtf8ToWide(document), NULL, NULL, SW_SHOWDEFAULT);
|
||||||
|
|
||||||
// If it failed, get the .htm regkey and lookup the program
|
// If it failed, get the .htm regkey and lookup the program
|
||||||
if ((uintptr_t)result <= HINSTANCE_ERROR)
|
if ((uintptr_t)result <= HINSTANCE_ERROR)
|
||||||
|
@ -1640,7 +1640,7 @@ static bool openDocWithExtension (const std::string &document, const std::string
|
||||||
wchar_t key[MAX_PATH + MAX_PATH];
|
wchar_t key[MAX_PATH + MAX_PATH];
|
||||||
|
|
||||||
// get the type of the extension
|
// get the type of the extension
|
||||||
if (GetRegKey(HKEY_CLASSES_ROOT, utf8ToWide("." + ext), key) == ERROR_SUCCESS)
|
if (GetRegKey(HKEY_CLASSES_ROOT, nlUtf8ToWide("." + ext), key) == ERROR_SUCCESS)
|
||||||
{
|
{
|
||||||
lstrcatW(key, L"\\shell\\open\\command");
|
lstrcatW(key, L"\\shell\\open\\command");
|
||||||
|
|
||||||
|
|
|
@ -1431,7 +1431,7 @@ int getLastError()
|
||||||
std::string formatErrorMessage(int errorCode)
|
std::string formatErrorMessage(int errorCode)
|
||||||
{
|
{
|
||||||
#ifdef NL_OS_WINDOWS
|
#ifdef NL_OS_WINDOWS
|
||||||
LPVOID lpMsgBuf = NULL;
|
LPWSTR lpMsgBuf = NULL;
|
||||||
DWORD len = FormatMessageW(
|
DWORD len = FormatMessageW(
|
||||||
FORMAT_MESSAGE_ALLOCATE_BUFFER |
|
FORMAT_MESSAGE_ALLOCATE_BUFFER |
|
||||||
FORMAT_MESSAGE_FROM_SYSTEM |
|
FORMAT_MESSAGE_FROM_SYSTEM |
|
||||||
|
@ -1439,7 +1439,7 @@ std::string formatErrorMessage(int errorCode)
|
||||||
NULL,
|
NULL,
|
||||||
errorCode,
|
errorCode,
|
||||||
MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), // Default language
|
MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), // Default language
|
||||||
(LPWSTR) &lpMsgBuf,
|
(LPWSTR)(&lpMsgBuf),
|
||||||
0,
|
0,
|
||||||
NULL
|
NULL
|
||||||
);
|
);
|
||||||
|
|
|
@ -286,14 +286,14 @@ void CStdDisplayer::doDisplay ( const CLog::TDisplayInfo& args, const char *mess
|
||||||
// WARNING: READ THIS !!!!!!!!!!!!!!!! ///////////////////////////
|
// WARNING: READ THIS !!!!!!!!!!!!!!!! ///////////////////////////
|
||||||
// If at the release time, it freezes here, it's a microsoft bug:
|
// If at the release time, it freezes here, it's a microsoft bug:
|
||||||
// http://support.microsoft.com/support/kb/articles/q173/2/60.asp
|
// http://support.microsoft.com/support/kb/articles/q173/2/60.asp
|
||||||
OutputDebugStringW(utf8ToWide(str2));
|
OutputDebugStringW(nlUtf8ToWide(str2));
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
sint count = 0;
|
sint count = 0;
|
||||||
uint n = (uint)strlen(message);
|
uint n = (uint)strlen(message);
|
||||||
std::string s(&str2.c_str()[0], (str2.size() - n));
|
std::string s(&str2.c_str()[0], (str2.size() - n));
|
||||||
OutputDebugStringW(utf8ToWide(s));
|
OutputDebugStringW(nlUtf8ToWide(s));
|
||||||
|
|
||||||
for(;;)
|
for(;;)
|
||||||
{
|
{
|
||||||
|
@ -301,14 +301,14 @@ void CStdDisplayer::doDisplay ( const CLog::TDisplayInfo& args, const char *mess
|
||||||
if((n - count) < maxOutString )
|
if((n - count) < maxOutString )
|
||||||
{
|
{
|
||||||
s = std::string(&message[count], (n - count));
|
s = std::string(&message[count], (n - count));
|
||||||
OutputDebugStringW(utf8ToWide(s));
|
OutputDebugStringW(nlUtf8ToWide(s));
|
||||||
OutputDebugStringW(L"\n");
|
OutputDebugStringW(L"\n");
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
s = std::string(&message[count] , count + maxOutString);
|
s = std::string(&message[count] , count + maxOutString);
|
||||||
OutputDebugStringW(utf8ToWide(s));
|
OutputDebugStringW(nlUtf8ToWide(s));
|
||||||
OutputDebugStringW(L"\n\t\t\t");
|
OutputDebugStringW(L"\n\t\t\t");
|
||||||
count += maxOutString;
|
count += maxOutString;
|
||||||
}
|
}
|
||||||
|
@ -323,13 +323,13 @@ void CStdDisplayer::doDisplay ( const CLog::TDisplayInfo& args, const char *mess
|
||||||
if (pos+1000 < args.CallstackAndLog.size ())
|
if (pos+1000 < args.CallstackAndLog.size ())
|
||||||
{
|
{
|
||||||
splited = args.CallstackAndLog.substr (pos, 1000);
|
splited = args.CallstackAndLog.substr (pos, 1000);
|
||||||
OutputDebugStringW(utf8ToWide(splited));
|
OutputDebugStringW(nlUtf8ToWide(splited));
|
||||||
pos += 1000;
|
pos += 1000;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
splited = args.CallstackAndLog.substr (pos);
|
splited = args.CallstackAndLog.substr (pos);
|
||||||
OutputDebugStringW(utf8ToWide(splited));
|
OutputDebugStringW(nlUtf8ToWide(splited));
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -32,7 +32,7 @@ NL_LIB_HANDLE nlLoadLibrary(const std::string &libName)
|
||||||
{
|
{
|
||||||
NL_LIB_HANDLE res = 0;
|
NL_LIB_HANDLE res = 0;
|
||||||
#ifdef NL_OS_WINDOWS
|
#ifdef NL_OS_WINDOWS
|
||||||
res = LoadLibraryW(utf8ToWide(libName));
|
res = LoadLibraryW(nlUtf8ToWide(libName));
|
||||||
#elif defined(NL_OS_UNIX)
|
#elif defined(NL_OS_UNIX)
|
||||||
res = dlopen(libName.c_str(), RTLD_NOW);
|
res = dlopen(libName.c_str(), RTLD_NOW);
|
||||||
#else
|
#else
|
||||||
|
|
|
@ -157,6 +157,14 @@ bool CIFile::open(const std::string &path, bool text)
|
||||||
|
|
||||||
close();
|
close();
|
||||||
|
|
||||||
|
if ((_IsInBigFile || _IsInXMLPackFile) && path.find('@') == string::npos)
|
||||||
|
{
|
||||||
|
// CIFile can be reused to load file from bnp and from regular files.
|
||||||
|
// Last open happened to be inside bnp and close() may not set _F to NULL.
|
||||||
|
// Opening regular file will fail as _F points to bnp file.
|
||||||
|
_F = NULL;
|
||||||
|
}
|
||||||
|
|
||||||
// can't open empty filename
|
// can't open empty filename
|
||||||
if(path.empty ())
|
if(path.empty ())
|
||||||
return false;
|
return false;
|
||||||
|
@ -185,7 +193,7 @@ bool CIFile::open(const std::string &path, bool text)
|
||||||
|
|
||||||
// Bigfile or xml pack access requested ?
|
// Bigfile or xml pack access requested ?
|
||||||
string::size_type pos;
|
string::size_type pos;
|
||||||
if (!CFile::fileExists(path) && (pos = path.find('@')) != string::npos)
|
if ((pos = path.find('@')) != string::npos)
|
||||||
{
|
{
|
||||||
// check for a double @ to identify XML pack file
|
// check for a double @ to identify XML pack file
|
||||||
if (pos+1 < path.size() && path[pos+1] == '@')
|
if (pos+1 < path.size() && path[pos+1] == '@')
|
||||||
|
@ -237,7 +245,9 @@ bool CIFile::open(const std::string &path, bool text)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
|
||||||
|
// not in bnp, but may have '@' in the name
|
||||||
|
if (_F == NULL)
|
||||||
{
|
{
|
||||||
_IsInBigFile = false;
|
_IsInBigFile = false;
|
||||||
_IsInXMLPackFile = false;
|
_IsInXMLPackFile = false;
|
||||||
|
|
|
@ -700,7 +700,7 @@ bool CFileContainer::setCurrentPath (const std::string &path)
|
||||||
int res;
|
int res;
|
||||||
//nldebug("Change current path to '%s' (current path is '%s')", path.c_str(), getCurrentPath().c_str());
|
//nldebug("Change current path to '%s' (current path is '%s')", path.c_str(), getCurrentPath().c_str());
|
||||||
#ifdef NL_OS_WINDOWS
|
#ifdef NL_OS_WINDOWS
|
||||||
res = _wchdir(utf8ToWide(path));
|
res = _wchdir(nlUtf8ToWide(path));
|
||||||
#else
|
#else
|
||||||
res = chdir(path.c_str());
|
res = chdir(path.c_str());
|
||||||
#endif
|
#endif
|
||||||
|
@ -792,7 +792,7 @@ dirent *readdir (DIR *dir)
|
||||||
// first visit in this directory : FindFirstFile()
|
// first visit in this directory : FindFirstFile()
|
||||||
if (hFind == NULL)
|
if (hFind == NULL)
|
||||||
{
|
{
|
||||||
hFind = FindFirstFileW (utf8ToWide(CPath::standardizePath(sDir) + "*"), &findData);
|
hFind = FindFirstFileW(nlUtf8ToWide(CPath::standardizePath(sDir) + "*"), &findData);
|
||||||
}
|
}
|
||||||
// directory already visited : FindNextFile()
|
// directory already visited : FindNextFile()
|
||||||
else
|
else
|
||||||
|
@ -1914,7 +1914,7 @@ string CFile::getPath (const string &filename)
|
||||||
bool CFile::isDirectory (const string &filename)
|
bool CFile::isDirectory (const string &filename)
|
||||||
{
|
{
|
||||||
#ifdef NL_OS_WINDOWS
|
#ifdef NL_OS_WINDOWS
|
||||||
DWORD res = GetFileAttributesW(utf8ToWide(filename));
|
DWORD res = GetFileAttributesW(nlUtf8ToWide(filename));
|
||||||
if (res == INVALID_FILE_ATTRIBUTES)
|
if (res == INVALID_FILE_ATTRIBUTES)
|
||||||
{
|
{
|
||||||
// nlwarning ("PATH: '%s' is not a valid file or directory name", filename.c_str ());
|
// nlwarning ("PATH: '%s' is not a valid file or directory name", filename.c_str ());
|
||||||
|
@ -1937,7 +1937,7 @@ bool CFile::isDirectory (const string &filename)
|
||||||
bool CFile::isExists (const string &filename)
|
bool CFile::isExists (const string &filename)
|
||||||
{
|
{
|
||||||
#ifdef NL_OS_WINDOWS
|
#ifdef NL_OS_WINDOWS
|
||||||
return GetFileAttributesW(utf8ToWide(filename)) != INVALID_FILE_ATTRIBUTES;
|
return GetFileAttributesW(nlUtf8ToWide(filename)) != INVALID_FILE_ATTRIBUTES;
|
||||||
#else // NL_OS_WINDOWS
|
#else // NL_OS_WINDOWS
|
||||||
struct stat buf;
|
struct stat buf;
|
||||||
return stat (filename.c_str (), &buf) == 0;
|
return stat (filename.c_str (), &buf) == 0;
|
||||||
|
@ -2017,7 +2017,7 @@ uint32 CFile::getFileSize (const std::string &filename)
|
||||||
{
|
{
|
||||||
#if defined (NL_OS_WINDOWS)
|
#if defined (NL_OS_WINDOWS)
|
||||||
struct _stat buf;
|
struct _stat buf;
|
||||||
int result = _wstat (utf8ToWide(filename), &buf);
|
int result = _wstat(nlUtf8ToWide(filename), &buf);
|
||||||
#elif defined (NL_OS_UNIX)
|
#elif defined (NL_OS_UNIX)
|
||||||
struct stat buf;
|
struct stat buf;
|
||||||
int result = stat (filename.c_str (), &buf);
|
int result = stat (filename.c_str (), &buf);
|
||||||
|
@ -2068,7 +2068,7 @@ uint32 CFile::getFileModificationDate(const std::string &filename)
|
||||||
// Use the WIN32 API to read the file times in UTC
|
// Use the WIN32 API to read the file times in UTC
|
||||||
|
|
||||||
// create a file handle (this does not open the file)
|
// create a file handle (this does not open the file)
|
||||||
HANDLE h = CreateFileW(utf8ToWide(fn), 0, 0, NULL, OPEN_EXISTING, 0, 0);
|
HANDLE h = CreateFileW(nlUtf8ToWide(fn), 0, 0, NULL, OPEN_EXISTING, 0, 0);
|
||||||
if (h == INVALID_HANDLE_VALUE)
|
if (h == INVALID_HANDLE_VALUE)
|
||||||
{
|
{
|
||||||
nlwarning("Can't get modification date on file '%s' : %s", fn.c_str(), NLMISC::formatErrorMessage(NLMISC::getLastError()).c_str());
|
nlwarning("Can't get modification date on file '%s' : %s", fn.c_str(), NLMISC::formatErrorMessage(NLMISC::getLastError()).c_str());
|
||||||
|
@ -2138,7 +2138,7 @@ bool CFile::setFileModificationDate(const std::string &filename, uint32 modTime)
|
||||||
// Use the WIN32 API to set the file times in UTC
|
// Use the WIN32 API to set the file times in UTC
|
||||||
|
|
||||||
// create a file handle (this does not open the file)
|
// create a file handle (this does not open the file)
|
||||||
HANDLE h = CreateFileW(utf8ToWide(fn), GENERIC_WRITE|GENERIC_READ, FILE_SHARE_WRITE|FILE_SHARE_READ, NULL, OPEN_EXISTING, 0, 0);
|
HANDLE h = CreateFileW(nlUtf8ToWide(fn), GENERIC_WRITE | GENERIC_READ, FILE_SHARE_WRITE | FILE_SHARE_READ, NULL, OPEN_EXISTING, 0, 0);
|
||||||
if (h == INVALID_HANDLE_VALUE)
|
if (h == INVALID_HANDLE_VALUE)
|
||||||
{
|
{
|
||||||
nlwarning("Can't set modification date on file '%s' (error accessing file) : %s", fn.c_str(), NLMISC::formatErrorMessage(NLMISC::getLastError()).c_str());
|
nlwarning("Can't set modification date on file '%s' (error accessing file) : %s", fn.c_str(), NLMISC::formatErrorMessage(NLMISC::getLastError()).c_str());
|
||||||
|
@ -2223,7 +2223,7 @@ uint32 CFile::getFileCreationDate(const std::string &filename)
|
||||||
|
|
||||||
#if defined (NL_OS_WINDOWS)
|
#if defined (NL_OS_WINDOWS)
|
||||||
struct _stat buf;
|
struct _stat buf;
|
||||||
int result = _wstat(utf8ToWide(fn), &buf);
|
int result = _wstat(nlUtf8ToWide(fn), &buf);
|
||||||
#elif defined (NL_OS_UNIX)
|
#elif defined (NL_OS_UNIX)
|
||||||
struct stat buf;
|
struct stat buf;
|
||||||
int result = stat(fn.c_str (), &buf);
|
int result = stat(fn.c_str (), &buf);
|
||||||
|
@ -2357,7 +2357,7 @@ static bool CopyMoveFile(const std::string &dest, const std::string &src, bool c
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
#ifdef NL_OS_WINDOWS
|
#ifdef NL_OS_WINDOWS
|
||||||
if (MoveFileW(utf8ToWide(ssrc), utf8ToWide(sdest)) == 0)
|
if (MoveFileW(nlUtf8ToWide(ssrc), nlUtf8ToWide(sdest)) == 0)
|
||||||
{
|
{
|
||||||
sint lastError = NLMISC::getLastError();
|
sint lastError = NLMISC::getLastError();
|
||||||
nlwarning ("PATH: CopyMoveFile error: can't link/move '%s' into '%s', error %u (%s)",
|
nlwarning ("PATH: CopyMoveFile error: can't link/move '%s' into '%s', error %u (%s)",
|
||||||
|
@ -2482,7 +2482,7 @@ bool CFile::moveFile(const std::string &dest, const std::string &src)
|
||||||
bool CFile::createDirectory(const std::string &filename)
|
bool CFile::createDirectory(const std::string &filename)
|
||||||
{
|
{
|
||||||
#ifdef NL_OS_WINDOWS
|
#ifdef NL_OS_WINDOWS
|
||||||
return _wmkdir(utf8ToWide(filename))==0;
|
return _wmkdir(nlUtf8ToWide(filename)) == 0;
|
||||||
#else
|
#else
|
||||||
// Set full permissions....
|
// Set full permissions....
|
||||||
return mkdir(filename.c_str(), 0xFFFF)==0;
|
return mkdir(filename.c_str(), 0xFFFF)==0;
|
||||||
|
@ -2751,7 +2751,7 @@ bool CFile::deleteFile(const std::string &filename)
|
||||||
{
|
{
|
||||||
setRWAccess(filename);
|
setRWAccess(filename);
|
||||||
#ifdef NL_OS_WINDOWS
|
#ifdef NL_OS_WINDOWS
|
||||||
sint res = _wunlink(utf8ToWide(filename));
|
sint res = _wunlink(nlUtf8ToWide(filename));
|
||||||
#else
|
#else
|
||||||
sint res = unlink(filename.c_str());
|
sint res = unlink(filename.c_str());
|
||||||
#endif
|
#endif
|
||||||
|
@ -2770,7 +2770,7 @@ bool CFile::deleteDirectory(const std::string &filename)
|
||||||
{
|
{
|
||||||
setRWAccess(filename);
|
setRWAccess(filename);
|
||||||
#ifdef NL_OS_WINDOWS
|
#ifdef NL_OS_WINDOWS
|
||||||
sint res = _wrmdir(utf8ToWide(filename));
|
sint res = _wrmdir(nlUtf8ToWide(filename));
|
||||||
#else
|
#else
|
||||||
sint res = rmdir(filename.c_str());
|
sint res = rmdir(filename.c_str());
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -17,23 +17,24 @@
|
||||||
#include "stdmisc.h"
|
#include "stdmisc.h"
|
||||||
|
|
||||||
#include "nel/misc/string_common.h"
|
#include "nel/misc/string_common.h"
|
||||||
|
#include "nel/misc/sstring.h"
|
||||||
|
|
||||||
using namespace std;
|
using namespace std;
|
||||||
|
|
||||||
#ifdef DEBUG_NEW
|
#ifdef DEBUG_NEW
|
||||||
#define new DEBUG_NEW
|
#define new DEBUG_NEW
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
namespace NLMISC
|
namespace NLMISC
|
||||||
{
|
{
|
||||||
|
|
||||||
string addSlashR (const string &str)
|
string addSlashR(const string &str)
|
||||||
{
|
{
|
||||||
string formatedStr;
|
string formatedStr;
|
||||||
// replace \n with \r\n
|
// replace \n with \r\n
|
||||||
for (uint i = 0; i < str.size(); i++)
|
for (uint i = 0; i < str.size(); i++)
|
||||||
{
|
{
|
||||||
if (str[i] == '\n' && i > 0 && str[i-1] != '\r')
|
if (str[i] == '\n' && i > 0 && str[i - 1] != '\r')
|
||||||
{
|
{
|
||||||
formatedStr += '\r';
|
formatedStr += '\r';
|
||||||
}
|
}
|
||||||
|
@ -42,7 +43,7 @@ string addSlashR (const string &str)
|
||||||
return formatedStr;
|
return formatedStr;
|
||||||
}
|
}
|
||||||
|
|
||||||
string removeSlashR (const string &str)
|
string removeSlashR(const string &str)
|
||||||
{
|
{
|
||||||
string formatedStr;
|
string formatedStr;
|
||||||
// remove \r
|
// remove \r
|
||||||
|
@ -54,4 +55,267 @@ string removeSlashR (const string &str)
|
||||||
return formatedStr;
|
return formatedStr;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool fromString(const std::string &str, bool &val)
|
||||||
|
{
|
||||||
|
if (str.length() == 1)
|
||||||
|
{
|
||||||
|
const char c = str[0];
|
||||||
|
|
||||||
|
switch (c)
|
||||||
|
{
|
||||||
|
case '1':
|
||||||
|
case 't':
|
||||||
|
case 'T':
|
||||||
|
case 'y':
|
||||||
|
case 'Y':
|
||||||
|
val = true;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case '0':
|
||||||
|
case 'f':
|
||||||
|
case 'F':
|
||||||
|
case 'n':
|
||||||
|
case 'N':
|
||||||
|
val = false;
|
||||||
|
break;
|
||||||
|
|
||||||
|
default:
|
||||||
|
val = false;
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
std::string strl = toLower(str);
|
||||||
|
if (strl == "true" || strl == "yes")
|
||||||
|
{
|
||||||
|
val = true;
|
||||||
|
}
|
||||||
|
else if (strl == "false" || strl == "no")
|
||||||
|
{
|
||||||
|
val = false;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
val = false;
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
#if defined(NL_OS_WINDOWS)
|
||||||
|
|
||||||
|
std::string winWideToCp(const wchar_t *str, size_t len, UINT cp)
|
||||||
|
{
|
||||||
|
if (!len)
|
||||||
|
len = wcslen(str);
|
||||||
|
if (!len)
|
||||||
|
return std::string();
|
||||||
|
|
||||||
|
// Convert from wide to codepage
|
||||||
|
char *tmp = (char *)_malloca((len + 1) * 4);
|
||||||
|
if (!tmp)
|
||||||
|
return std::string();
|
||||||
|
int tmpLen = WideCharToMultiByte(cp, 0,
|
||||||
|
str, (int)(len + 1),
|
||||||
|
tmp, (int)((len + 1) * 4),
|
||||||
|
NULL, NULL);
|
||||||
|
if (tmpLen <= 1)
|
||||||
|
{
|
||||||
|
_freea(tmp);
|
||||||
|
return std::string();
|
||||||
|
}
|
||||||
|
|
||||||
|
std::string res = tmp;
|
||||||
|
_freea(tmp);
|
||||||
|
return res;
|
||||||
|
}
|
||||||
|
|
||||||
|
std::string winCpToCp(const char *str, size_t len, UINT srcCp, UINT dstCp)
|
||||||
|
{
|
||||||
|
if (!len)
|
||||||
|
len = strlen(str);
|
||||||
|
if (!len)
|
||||||
|
return std::string();
|
||||||
|
|
||||||
|
// First convert from codepage to wide
|
||||||
|
wchar_t *tmp = (wchar_t *)_malloca((len + 1) * 4);
|
||||||
|
if (!tmp)
|
||||||
|
return std::string();
|
||||||
|
int tmpLen = MultiByteToWideChar(srcCp, MB_PRECOMPOSED,
|
||||||
|
str, (int)(len + 1), /* include null-termination */
|
||||||
|
tmp, (int)((len + 1) * 4));
|
||||||
|
if (tmpLen <= 1)
|
||||||
|
{
|
||||||
|
_freea(tmp);
|
||||||
|
return std::string();
|
||||||
|
}
|
||||||
|
|
||||||
|
// Then convert from wide to codepage
|
||||||
|
std::string res = winWideToCp(tmp, (size_t)tmpLen - 1, dstCp); /* tmpLen includes null-term */
|
||||||
|
_freea(tmp);
|
||||||
|
return res;
|
||||||
|
}
|
||||||
|
|
||||||
|
std::wstring winCpToWide(const char *str, size_t len, UINT cp)
|
||||||
|
{
|
||||||
|
if (!len)
|
||||||
|
len = strlen(str);
|
||||||
|
if (!len)
|
||||||
|
return std::wstring();
|
||||||
|
|
||||||
|
// Convert from codepage to wide
|
||||||
|
wchar_t *tmp = (wchar_t *)_malloca((len + 1) * 4);
|
||||||
|
if (!tmp)
|
||||||
|
return std::wstring();
|
||||||
|
int tmpLen = MultiByteToWideChar(cp, MB_PRECOMPOSED,
|
||||||
|
str, (int)(len + 1), /* include null-termination */
|
||||||
|
tmp, (int)((len + 1) * 4));
|
||||||
|
if (tmpLen <= 1)
|
||||||
|
{
|
||||||
|
_freea(tmp);
|
||||||
|
return std::wstring();
|
||||||
|
}
|
||||||
|
|
||||||
|
std::wstring res = tmp;
|
||||||
|
_freea(tmp);
|
||||||
|
return res;
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// Convert local codepage to UTF-8
|
||||||
|
// On Windows, the local codepage is undetermined
|
||||||
|
// On Linux, the local codepage is always UTF-8 (no-op)
|
||||||
|
std::string mbcsToUtf8(const char *str, size_t len)
|
||||||
|
{
|
||||||
|
#if defined(NL_OS_WINDOWS)
|
||||||
|
UINT codePage = GetACP();
|
||||||
|
// Windows 10 allows setting the local codepage to UTF-8
|
||||||
|
if (codePage == CP_UTF8) /* 65001 */
|
||||||
|
return str;
|
||||||
|
return winCpToCp(str, len, CP_ACP, CP_UTF8);
|
||||||
|
#else
|
||||||
|
return str; /* no-op */
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
std::string mbcsToUtf8(const std::string &str)
|
||||||
|
{
|
||||||
|
#if defined(NL_OS_WINDOWS)
|
||||||
|
if (str.empty())
|
||||||
|
return str;
|
||||||
|
UINT codePage = GetACP();
|
||||||
|
// Windows 10 allows setting the local codepage to UTF-8
|
||||||
|
if (codePage == CP_UTF8) /* 65001 */
|
||||||
|
return str;
|
||||||
|
return winCpToCp(str.c_str(), str.size(), CP_ACP, CP_UTF8);
|
||||||
|
#else
|
||||||
|
return str; /* no-op */
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
// Convert wide codepage to UTF-8
|
||||||
|
// On Windows, the wide codepage is UTF-16
|
||||||
|
// On Linux, the wide codepage is UTF-32
|
||||||
|
std::string wideToUtf8(const wchar_t *str, size_t len)
|
||||||
|
{
|
||||||
|
#if defined(NL_OS_WINDOWS)
|
||||||
|
return winWideToCp(str, len, CP_UTF8);
|
||||||
|
#else
|
||||||
|
// TODO: UTF-32 to UTF-8
|
||||||
|
nlassert(false);
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
std::string wideToUtf8(const std::wstring &str)
|
||||||
|
{
|
||||||
|
return wideToUtf8(str.c_str(), str.size());
|
||||||
|
}
|
||||||
|
|
||||||
|
// Convert UTF-8 to wide character set
|
||||||
|
std::wstring utf8ToWide(const char *str, size_t len)
|
||||||
|
{
|
||||||
|
#if defined(NL_OS_WINDOWS)
|
||||||
|
return winCpToWide(str, len, CP_UTF8);
|
||||||
|
#else
|
||||||
|
// TODO: UTF-32 to UTF-8
|
||||||
|
nlassert(false);
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
std::wstring utf8ToWide(const std::string &str)
|
||||||
|
{
|
||||||
|
return utf8ToWide(str.c_str(), str.size());
|
||||||
|
}
|
||||||
|
|
||||||
|
// Convert UTF-8 to local multibyte character set
|
||||||
|
std::string utf8ToMbcs(const char *str, size_t len)
|
||||||
|
{
|
||||||
|
#if defined(NL_OS_WINDOWS)
|
||||||
|
UINT codePage = GetACP();
|
||||||
|
// Windows 10 allows setting the local codepage to UTF-8
|
||||||
|
if (codePage == CP_UTF8) /* 65001 */
|
||||||
|
return str;
|
||||||
|
return winCpToCp(str, len, CP_UTF8, CP_ACP);
|
||||||
|
#else
|
||||||
|
return str; /* no-op */
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
std::string utf8ToMbcs(const std::string &str)
|
||||||
|
{
|
||||||
|
#if defined(NL_OS_WINDOWS)
|
||||||
|
if (str.empty())
|
||||||
|
return str;
|
||||||
|
UINT codePage = GetACP();
|
||||||
|
// Windows 10 allows setting the local codepage to UTF-8
|
||||||
|
if (codePage == CP_UTF8) /* 65001 */
|
||||||
|
return str;
|
||||||
|
return winCpToCp(str.c_str(), str.size(), CP_UTF8, CP_ACP);
|
||||||
|
#else
|
||||||
|
return str; /* no-op */
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
// Convert wide to local multibyte character set
|
||||||
|
std::string wideToMbcs(const wchar_t *str, size_t len)
|
||||||
|
{
|
||||||
|
#if defined(NL_OS_WINDOWS)
|
||||||
|
return winWideToCp(str, len, CP_ACP);
|
||||||
|
#else
|
||||||
|
return wideToUtf8(str, len);
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
std::string wideToMbcs(const std::wstring &str)
|
||||||
|
{
|
||||||
|
#if defined(NL_OS_WINDOWS)
|
||||||
|
return winWideToCp(str.c_str(), str.size(), CP_ACP);
|
||||||
|
#else
|
||||||
|
return wideToUtf8(str);
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
// Convert local multibyte to wide character set
|
||||||
|
std::wstring mbcsToWide(const char *str, size_t len)
|
||||||
|
{
|
||||||
|
#if defined(NL_OS_WINDOWS)
|
||||||
|
return winCpToWide(str, len, CP_ACP);
|
||||||
|
#else
|
||||||
|
return utf8ToWide(str, len);
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
std::wstring mbcsToWide(const std::string &str)
|
||||||
|
{
|
||||||
|
#if defined(NL_OS_WINDOWS)
|
||||||
|
return winCpToWide(str.c_str(), str.size(), CP_ACP);
|
||||||
|
#else
|
||||||
|
return utf8ToWide(str);
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -1460,7 +1460,7 @@ uint64 CSystemInfo::availableHDSpace (const string &filename)
|
||||||
return (uint64)stfs.f_bavail * (uint64)stfs.f_bsize;
|
return (uint64)stfs.f_bavail * (uint64)stfs.f_bsize;
|
||||||
#else
|
#else
|
||||||
ULARGE_INTEGER freeSpace = {0};
|
ULARGE_INTEGER freeSpace = {0};
|
||||||
BOOL bRes = ::GetDiskFreeSpaceExW(utf8ToWide(path), &freeSpace, NULL, NULL);
|
BOOL bRes = ::GetDiskFreeSpaceExW(nlUtf8ToWide(path), &freeSpace, NULL, NULL);
|
||||||
if (!bRes) return 0;
|
if (!bRes) return 0;
|
||||||
|
|
||||||
return (uint64)freeSpace.QuadPart;
|
return (uint64)freeSpace.QuadPart;
|
||||||
|
|
|
@ -323,58 +323,55 @@ void CSystemUtils::setRootKey(const std::string &root)
|
||||||
RootKey = root;
|
RootKey = root;
|
||||||
}
|
}
|
||||||
|
|
||||||
string CSystemUtils::getRegKey(const string &Entry)
|
string CSystemUtils::getRegKey(const string &entry)
|
||||||
{
|
{
|
||||||
string ret;
|
string ret;
|
||||||
#ifdef NL_OS_WINDOWS
|
#ifdef NL_OS_WINDOWS
|
||||||
HKEY hkey;
|
HKEY hkey;
|
||||||
|
|
||||||
if (RegOpenKeyExW(HKEY_CURRENT_USER, utf8ToWide(RootKey), 0, KEY_READ, &hkey) == ERROR_SUCCESS)
|
if (RegOpenKeyExW(HKEY_CURRENT_USER, nlUtf8ToWide(RootKey), 0, KEY_READ, &hkey) == ERROR_SUCCESS)
|
||||||
{
|
{
|
||||||
DWORD dwType = 0L;
|
DWORD dwType = 0L;
|
||||||
DWORD dwSize = KeyMaxLength;
|
DWORD dwSize = KeyMaxLength;
|
||||||
wchar_t Buffer[KeyMaxLength];
|
wchar_t buffer[KeyMaxLength];
|
||||||
|
|
||||||
if (RegQueryValueExW(hkey, utf8ToWide(Entry), NULL, &dwType, (LPBYTE)Buffer, &dwSize) != ERROR_SUCCESS)
|
if (RegQueryValueExW(hkey, nlUtf8ToWide(entry), NULL, &dwType, (LPBYTE)buffer, &dwSize) != ERROR_SUCCESS)
|
||||||
{
|
{
|
||||||
nlwarning("Can't get the reg key '%s'", Entry.c_str());
|
nlwarning("Can't get the reg key '%s'", entry.c_str());
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
ret = wideToUtf8(Buffer);
|
ret = wideToUtf8(buffer);
|
||||||
}
|
}
|
||||||
|
|
||||||
RegCloseKey(hkey);
|
RegCloseKey(hkey);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
nlwarning("Can't get the reg key '%s'", Entry.c_str());
|
nlwarning("Can't get the reg key '%s'", entry.c_str());
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool CSystemUtils::setRegKey(const string &ValueName, const string &Value)
|
bool CSystemUtils::setRegKey(const string &valueName, const string &value)
|
||||||
{
|
{
|
||||||
bool res = false;
|
bool res = false;
|
||||||
#ifdef NL_OS_WINDOWS
|
#ifdef NL_OS_WINDOWS
|
||||||
HKEY hkey;
|
HKEY hkey;
|
||||||
DWORD dwDisp;
|
DWORD dwDisp;
|
||||||
|
|
||||||
if (RegCreateKeyExW(HKEY_CURRENT_USER, utf8ToWide(RootKey), 0, NULL, REG_OPTION_NON_VOLATILE, KEY_ALL_ACCESS, NULL, &hkey, &dwDisp) == ERROR_SUCCESS)
|
if (RegCreateKeyExW(HKEY_CURRENT_USER, nlUtf8ToWide(RootKey), 0, NULL, REG_OPTION_NON_VOLATILE, KEY_ALL_ACCESS, NULL, &hkey, &dwDisp) == ERROR_SUCCESS)
|
||||||
{
|
{
|
||||||
ucstring utf16Value = ucstring::makeFromUtf8(Value);
|
|
||||||
|
|
||||||
// we must use the real Unicode string size in bytes
|
// we must use the real Unicode string size in bytes
|
||||||
DWORD size = (utf16Value.length() + 1) * 2;
|
std::wstring wvalue = nlUtf8ToWide(value);
|
||||||
|
if (RegSetValueExW(hkey, nlUtf8ToWide(valueName), 0, REG_SZ, (const BYTE *)wvalue.c_str(), (wvalue.size() + 1) * sizeof(WCHAR)) == ERROR_SUCCESS)
|
||||||
if (RegSetValueExW(hkey, utf8ToWide(ValueName), 0L, REG_SZ, (const BYTE *)utf16Value.c_str(), size) == ERROR_SUCCESS)
|
|
||||||
res = true;
|
res = true;
|
||||||
RegCloseKey(hkey);
|
RegCloseKey(hkey);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
nlwarning("Can't set the reg key '%s' '%s'", ValueName.c_str(), Value.c_str());
|
nlwarning("Can't set the reg key '%s' '%s'", valueName.c_str(), value.c_str());
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
|
@ -298,7 +298,7 @@ void CWinDisplayer::updateLabels ()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
SendMessageW ((HWND)access.value()[i].Hwnd, WM_SETTEXT, 0, (LPARAM) utf8ToWide(n));
|
SendMessageW((HWND)access.value()[i].Hwnd, WM_SETTEXT, 0, (LPARAM)nlUtf8ToWide(n));
|
||||||
access.value()[i].NeedUpdate = false;
|
access.value()[i].NeedUpdate = false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -492,6 +492,13 @@ void IService::setArgs (int argc, const char **argv)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void IService::setArgs(int argc, const wchar_t **argv)
|
||||||
|
{
|
||||||
|
for (sint i = 0; i < argc; i++)
|
||||||
|
{
|
||||||
|
_Args.push_back(nlWideToUtf8(argv[i]));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void cbLogFilter (CConfigFile::CVar &var)
|
void cbLogFilter (CConfigFile::CVar &var)
|
||||||
{
|
{
|
||||||
|
|
|
@ -103,10 +103,12 @@ IAudioDecoder *IAudioDecoder::createAudioDecoder(const std::string &type, NLMISC
|
||||||
{
|
{
|
||||||
return new CAudioDecoderVorbis(stream, loop);
|
return new CAudioDecoderVorbis(stream, loop);
|
||||||
}
|
}
|
||||||
|
#if (NL_COMP_VC_VERSION > 90) /* VS2008 does not have stdint.h */
|
||||||
else if (type_lower == "mp3")
|
else if (type_lower == "mp3")
|
||||||
{
|
{
|
||||||
return new CAudioDecoderMP3(stream, loop);
|
return new CAudioDecoderMP3(stream, loop);
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
nlwarning("Music file type unknown: '%s'", type_lower.c_str());
|
nlwarning("Music file type unknown: '%s'", type_lower.c_str());
|
||||||
|
@ -144,6 +146,7 @@ bool IAudioDecoder::getInfo(const std::string &filepath, std::string &artist, st
|
||||||
|
|
||||||
nlwarning("Unable to open: '%s'", filepath.c_str());
|
nlwarning("Unable to open: '%s'", filepath.c_str());
|
||||||
}
|
}
|
||||||
|
#if (NL_COMP_VC_VERSION > 90) /* VS2008 does not have stdint.h */
|
||||||
else if (type_lower == "mp3")
|
else if (type_lower == "mp3")
|
||||||
{
|
{
|
||||||
CIFile ifile;
|
CIFile ifile;
|
||||||
|
@ -154,6 +157,7 @@ bool IAudioDecoder::getInfo(const std::string &filepath, std::string &artist, st
|
||||||
|
|
||||||
nlwarning("Unable to open: '%s'", filepath.c_str());
|
nlwarning("Unable to open: '%s'", filepath.c_str());
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
nlwarning("Music file type unknown: '%s'", type_lower.c_str());
|
nlwarning("Music file type unknown: '%s'", type_lower.c_str());
|
||||||
|
|
|
@ -17,6 +17,8 @@
|
||||||
|
|
||||||
#include "stdsound.h"
|
#include "stdsound.h"
|
||||||
|
|
||||||
|
#if (NL_COMP_VC_VERSION > 90) /* VS2008 does not have stdint.h */
|
||||||
|
|
||||||
#include <nel/sound/audio_decoder_mp3.h>
|
#include <nel/sound/audio_decoder_mp3.h>
|
||||||
|
|
||||||
#define DR_MP3_IMPLEMENTATION
|
#define DR_MP3_IMPLEMENTATION
|
||||||
|
@ -221,4 +223,6 @@ void CAudioDecoderMP3::setLooping(bool loop)
|
||||||
|
|
||||||
} /* namespace NLSOUND */
|
} /* namespace NLSOUND */
|
||||||
|
|
||||||
|
#endif /* (NL_COMP_VC_VERSION > 90) */
|
||||||
|
|
||||||
/* end of file */
|
/* end of file */
|
||||||
|
|
|
@ -36,8 +36,11 @@ NL_ADD_LIB_SUFFIX(${NLDRV_AL_LIB})
|
||||||
IF(WIN32)
|
IF(WIN32)
|
||||||
# Find and include EFX-Util on Windows.
|
# Find and include EFX-Util on Windows.
|
||||||
FIND_PACKAGE(EFXUtil)
|
FIND_PACKAGE(EFXUtil)
|
||||||
INCLUDE_DIRECTORIES(${EFXUTIL_INCLUDE_DIR})
|
IF(EFXUTIL_FOUND)
|
||||||
TARGET_LINK_LIBRARIES(${NLDRV_AL_LIB} ${EFXUTIL_LIBRARY})
|
INCLUDE_DIRECTORIES(${EFXUTIL_INCLUDE_DIR})
|
||||||
|
TARGET_LINK_LIBRARIES(${NLDRV_AL_LIB} ${EFXUTIL_LIBRARY})
|
||||||
|
ADD_DEFINITIONS(-DEFX_CREATIVE_AVAILABLE=1)
|
||||||
|
ENDIF()
|
||||||
ENDIF()
|
ENDIF()
|
||||||
|
|
||||||
IF(WITH_PCH)
|
IF(WITH_PCH)
|
||||||
|
|
|
@ -17,12 +17,12 @@
|
||||||
#ifndef NL_EXT_AL_H
|
#ifndef NL_EXT_AL_H
|
||||||
#define NL_EXT_AL_H
|
#define NL_EXT_AL_H
|
||||||
|
|
||||||
#ifdef NL_OS_WINDOWS
|
#ifndef EFX_CREATIVE_AVAILABLE
|
||||||
# define EFX_CREATIVE_AVAILABLE 1
|
#define EFX_CREATIVE_AVAILABLE 0
|
||||||
# define EAX_AVAILABLE 0
|
#endif
|
||||||
#else
|
|
||||||
# define EFX_CREATIVE_AVAILABLE 0
|
#ifndef EAX_AVAILABLE
|
||||||
# define EAX_AVAILABLE 0
|
#define EAX_AVAILABLE 0
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if EAX_AVAILABLE
|
#if EAX_AVAILABLE
|
||||||
|
|
|
@ -226,7 +226,7 @@ ISoundDriver *ISoundDriver::createDriver(IStringMapperProvider *stringMapper, TD
|
||||||
*/
|
*/
|
||||||
#ifdef NL_OS_WINDOWS
|
#ifdef NL_OS_WINDOWS
|
||||||
wchar_t buffer[1024], *ptr;
|
wchar_t buffer[1024], *ptr;
|
||||||
uint len = SearchPathW (NULL, utf8ToWide(dllName), NULL, 1023, buffer, &ptr);
|
uint len = SearchPathW (NULL, nlUtf8ToWide(dllName), NULL, 1023, buffer, &ptr);
|
||||||
if( len )
|
if( len )
|
||||||
nlinfo ("Using the library '%s' that is in the directory: '%s'", dllName.c_str(), wideToUtf8(buffer).c_str());
|
nlinfo ("Using the library '%s' that is in the directory: '%s'", dllName.c_str(), wideToUtf8(buffer).c_str());
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -201,9 +201,9 @@ void LoadSceneScript (const char *ScriptName, CScene* pScene, vector<SDispCS> &D
|
||||||
// Main
|
// Main
|
||||||
// ---------------------------------------------------------------------------
|
// ---------------------------------------------------------------------------
|
||||||
#ifdef NL_OS_WINDOWS
|
#ifdef NL_OS_WINDOWS
|
||||||
int CALLBACK WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nShowCmd)
|
int APIENTRY nltWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPTSTR lpCmdLine, int nShowCmd)
|
||||||
#else // NL_OS_WINDOWS
|
#else // NL_OS_WINDOWS
|
||||||
int main(int argc, char **argv)
|
int nltmain(int argc, NLMISC::tchar **argv)
|
||||||
#endif // NL_OS_WINDOWS
|
#endif // NL_OS_WINDOWS
|
||||||
{
|
{
|
||||||
double rGlobalTime = 0;
|
double rGlobalTime = 0;
|
||||||
|
|
|
@ -38,6 +38,8 @@
|
||||||
#include "nel/ligo/ligo_error.h"
|
#include "nel/ligo/ligo_error.h"
|
||||||
#include "nel/misc/path.h"
|
#include "nel/misc/path.h"
|
||||||
|
|
||||||
|
#include "../../plugin_max/nel_3dsmax_shared/string_common.h"
|
||||||
|
|
||||||
using namespace std;
|
using namespace std;
|
||||||
using namespace NLMISC;
|
using namespace NLMISC;
|
||||||
extern HINSTANCE hInstance;
|
extern HINSTANCE hInstance;
|
||||||
|
@ -126,13 +128,13 @@ bool CMaxToLigo::loadLigoConfigFile (CLigoConfig& config, Interface& it, bool di
|
||||||
{
|
{
|
||||||
// Get the path
|
// Get the path
|
||||||
TCHAR sModulePath[256];
|
TCHAR sModulePath[256];
|
||||||
int res=GetModuleFileName(hModule, sModulePath, 256);
|
int res = GetModuleFileName(hModule, sModulePath, 256);
|
||||||
|
|
||||||
// Success ?
|
// Success ?
|
||||||
if (res)
|
if (res)
|
||||||
{
|
{
|
||||||
// Path
|
// Path
|
||||||
std::string path = NLMISC::CFile::getPath(tStrToUtf8(sModulePath) + "ligoscape.cfg");
|
std::string path = NLMISC::CFile::getPath(MCharStrToUtf8(sModulePath) + "ligoscape.cfg");
|
||||||
|
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
|
@ -164,16 +166,19 @@ void CMaxToLigo::errorMessage(const std::string &msg, const std::string &title,
|
||||||
if (dialog)
|
if (dialog)
|
||||||
{
|
{
|
||||||
// Dialog message
|
// Dialog message
|
||||||
MessageBox (it.GetMAXHWnd(), utf8ToTStr(msg), utf8ToTStr(title), MB_OK|MB_ICONEXCLAMATION);
|
ucstring ucmsg, uctitle;
|
||||||
|
ucmsg.fromUtf8(msg);
|
||||||
|
uctitle.fromUtf8(title);
|
||||||
|
MessageBoxW(it.GetMAXHWnd(), (LPCWSTR)ucmsg.c_str(), (LPCWSTR)uctitle.c_str(), MB_OK | MB_ICONEXCLAMATION);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
// Text message
|
// Text message
|
||||||
mprintf (utf8ToTStr(msg + "\n"));
|
mprintf(_M("%s\n"), MaxTStrFromUtf8(msg).data());
|
||||||
}
|
}
|
||||||
|
|
||||||
// Output in log
|
// Output in log
|
||||||
nlwarning ("LIGO ERROR : %s", msg.c_str());
|
nlwarning("LIGO ERROR : %s", msg.c_str());
|
||||||
}
|
}
|
||||||
|
|
||||||
// ***************************************************************************
|
// ***************************************************************************
|
||||||
|
|
|
@ -155,7 +155,7 @@ Value* export_material_cf (Value** arg_list, int count)
|
||||||
nlassert (node);
|
nlassert (node);
|
||||||
|
|
||||||
// The second arg
|
// The second arg
|
||||||
const std::string fileName = tStrToUtf8(arg_list[1]->to_string());
|
const std::string fileName = MCharStrToUtf8(arg_list[1]->to_string());
|
||||||
|
|
||||||
// The third arg
|
// The third arg
|
||||||
bool checkOnly = (arg_list[2]->to_bool() != FALSE);
|
bool checkOnly = (arg_list[2]->to_bool() != FALSE);
|
||||||
|
@ -321,12 +321,12 @@ Value* export_transition_cf (Value** arg_list, int count)
|
||||||
nlassert (is_array(nodes));
|
nlassert (is_array(nodes));
|
||||||
|
|
||||||
// The second arg
|
// The second arg
|
||||||
std::string fileName = tStrToUtf8(arg_list[1]->to_string());
|
std::string fileName = MCharStrToUtf8(arg_list[1]->to_string());
|
||||||
|
|
||||||
// The second arg
|
// The second arg
|
||||||
string matFilename[2];
|
string matFilename[2];
|
||||||
matFilename[0] = tStrToUtf8(arg_list[2]->to_string());
|
matFilename[0] = MCharStrToUtf8(arg_list[2]->to_string());
|
||||||
matFilename[1] = tStrToUtf8(arg_list[3]->to_string());
|
matFilename[1] = MCharStrToUtf8(arg_list[3]->to_string());
|
||||||
|
|
||||||
// The third arg
|
// The third arg
|
||||||
bool checkOnly = (arg_list[4]->to_bool() != FALSE);
|
bool checkOnly = (arg_list[4]->to_bool() != FALSE);
|
||||||
|
@ -696,7 +696,7 @@ Value* check_zone_with_material_cf (Value** arg_list, int count)
|
||||||
nlassert (node);
|
nlassert (node);
|
||||||
|
|
||||||
// The second arg
|
// The second arg
|
||||||
string fileName = tStrToUtf8(arg_list[1]->to_string());
|
string fileName = MCharStrToUtf8(arg_list[1]->to_string());
|
||||||
|
|
||||||
// The fourth arg
|
// The fourth arg
|
||||||
bool errorInDialog = (arg_list[2]->to_bool() != FALSE);
|
bool errorInDialog = (arg_list[2]->to_bool() != FALSE);
|
||||||
|
@ -830,7 +830,7 @@ Value* check_zone_with_transition_cf (Value** arg_list, int count)
|
||||||
nlassert (node);
|
nlassert (node);
|
||||||
|
|
||||||
// The second arg
|
// The second arg
|
||||||
string fileName = tStrToUtf8(arg_list[1]->to_string());
|
string fileName = MCharStrToUtf8(arg_list[1]->to_string());
|
||||||
|
|
||||||
// The second arg
|
// The second arg
|
||||||
int transitionNumber = arg_list[2]->to_int();
|
int transitionNumber = arg_list[2]->to_int();
|
||||||
|
@ -998,7 +998,7 @@ Value* export_zone_cf (Value** arg_list, int count)
|
||||||
nlassert (node);
|
nlassert (node);
|
||||||
|
|
||||||
// The second arg
|
// The second arg
|
||||||
string fileName = tStrToUtf8(arg_list[1]->to_string());
|
string fileName = MCharStrToUtf8(arg_list[1]->to_string());
|
||||||
|
|
||||||
// The thrid arg
|
// The thrid arg
|
||||||
Array *array = (Array*)arg_list[2];
|
Array *array = (Array*)arg_list[2];
|
||||||
|
@ -1043,8 +1043,8 @@ Value* export_zone_cf (Value** arg_list, int count)
|
||||||
type_check (cell->get(2), String, message);
|
type_check (cell->get(2), String, message);
|
||||||
|
|
||||||
// Get the strings
|
// Get the strings
|
||||||
categories[i].first = tStrToUtf8(cell->get(1)->to_string());
|
categories[i].first = MCharStrToUtf8(cell->get(1)->to_string());
|
||||||
categories[i].second = tStrToUtf8(cell->get(2)->to_string());
|
categories[i].second = MCharStrToUtf8(cell->get(2)->to_string());
|
||||||
}
|
}
|
||||||
|
|
||||||
// Get a Object pointer
|
// Get a Object pointer
|
||||||
|
@ -1352,7 +1352,7 @@ Value* get_error_string_cf (Value** arg_list, int count)
|
||||||
int errorCode = arg_list[0]->to_int()-1;
|
int errorCode = arg_list[0]->to_int()-1;
|
||||||
|
|
||||||
// Error code
|
// Error code
|
||||||
return new String (utf8ToTStr(CLigoError::getStringError ((CLigoError::TError)errorCode)));
|
return new String(MaxTStrFromUtf8(CLigoError::getStringError ((CLigoError::TError)errorCode)));
|
||||||
}
|
}
|
||||||
|
|
||||||
// ***************************************************************************
|
// ***************************************************************************
|
||||||
|
@ -1367,7 +1367,7 @@ Value* set_directory_cf (Value** arg_list, int count)
|
||||||
type_check(arg_list[0], String, message);
|
type_check(arg_list[0], String, message);
|
||||||
|
|
||||||
// The first arg
|
// The first arg
|
||||||
const std::string dir = tStrToUtf8(arg_list[0]->to_string());
|
const std::string dir = MCharStrToUtf8(arg_list[0]->to_string());
|
||||||
|
|
||||||
// Set the directory
|
// Set the directory
|
||||||
return (chdir (dir.c_str())==0)?&true_value:&false_value;
|
return (chdir (dir.c_str())==0)?&true_value:&false_value;
|
||||||
|
@ -1859,7 +1859,7 @@ Value* make_snapshot_cf (Value** arg_list, int count)
|
||||||
nlassert (node);
|
nlassert (node);
|
||||||
|
|
||||||
// The second arg
|
// The second arg
|
||||||
string fileName = tStrToUtf8(arg_list[1]->to_string());
|
string fileName = MCharStrToUtf8(arg_list[1]->to_string());
|
||||||
|
|
||||||
// The thrid arg
|
// The thrid arg
|
||||||
int xMin = arg_list[2]->to_int();
|
int xMin = arg_list[2]->to_int();
|
||||||
|
|
|
@ -158,7 +158,7 @@ void CAnimationSetDlg::OnAddAnimation ()
|
||||||
}
|
}
|
||||||
catch (const Exception& e)
|
catch (const Exception& e)
|
||||||
{
|
{
|
||||||
MessageBox (utf8ToTStr(e.what()), _T("NeL object viewer"), MB_OK|MB_ICONEXCLAMATION);
|
MessageBox (nlUtf8ToTStr(e.what()), _T("NeL object viewer"), MB_OK|MB_ICONEXCLAMATION);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -199,7 +199,7 @@ void CAnimationSetDlg::OnAddSkelWt()
|
||||||
}
|
}
|
||||||
catch (const Exception& e)
|
catch (const Exception& e)
|
||||||
{
|
{
|
||||||
MessageBox (utf8ToTStr(e.what()), _T("NeL object viewer"), MB_OK|MB_ICONEXCLAMATION);
|
MessageBox(nlUtf8ToTStr(e.what()), _T("NeL object viewer"), MB_OK | MB_ICONEXCLAMATION);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -234,7 +234,7 @@ void CAnimationSetDlg::refresh (BOOL update)
|
||||||
for (i=0; i<_ObjView->getNumInstance (); i++)
|
for (i=0; i<_ObjView->getNumInstance (); i++)
|
||||||
{
|
{
|
||||||
std::string name = NLMISC::CFile::getFilenameWithoutExtension(_ObjView->getInstance(i)->Saved.ShapeFilename);
|
std::string name = NLMISC::CFile::getFilenameWithoutExtension(_ObjView->getInstance(i)->Saved.ShapeFilename);
|
||||||
EditedObject.InsertString (-1, utf8ToTStr(name));
|
EditedObject.InsertString(-1, nlUtf8ToTStr(name));
|
||||||
}
|
}
|
||||||
|
|
||||||
// Get edited object
|
// Get edited object
|
||||||
|
@ -268,7 +268,7 @@ void CAnimationSetDlg::refresh (BOOL update)
|
||||||
CAnimation *anim = object->AnimationSet.getAnimation (object->AnimationSet.getAnimationIdByName (name));
|
CAnimation *anim = object->AnimationSet.getAnimation (object->AnimationSet.getAnimationIdByName (name));
|
||||||
|
|
||||||
// Insert an intem
|
// Insert an intem
|
||||||
HTREEITEM item=Tree.InsertItem(utf8ToTStr(name));
|
HTREEITEM item = Tree.InsertItem(nlUtf8ToTStr(name));
|
||||||
Tree.SetItemData (item, i);
|
Tree.SetItemData (item, i);
|
||||||
nlassert (item!=NULL);
|
nlassert (item!=NULL);
|
||||||
|
|
||||||
|
@ -279,7 +279,7 @@ void CAnimationSetDlg::refresh (BOOL update)
|
||||||
while (ite!=setString.end())
|
while (ite!=setString.end())
|
||||||
{
|
{
|
||||||
// Add this string
|
// Add this string
|
||||||
HTREEITEM newItem = Tree.InsertItem (utf8ToTStr(*ite), item);
|
HTREEITEM newItem = Tree.InsertItem(nlUtf8ToTStr(*ite), item);
|
||||||
Tree.SetItemData (newItem, 0xffffffff);
|
Tree.SetItemData (newItem, 0xffffffff);
|
||||||
|
|
||||||
// Get the track
|
// Get the track
|
||||||
|
@ -303,7 +303,7 @@ void CAnimationSetDlg::refresh (BOOL update)
|
||||||
name = toString("%s (%f - %f)", typeid(*track).name(), track->getBeginTime(), track->getEndTime());
|
name = toString("%s (%f - %f)", typeid(*track).name(), track->getBeginTime(), track->getEndTime());
|
||||||
}
|
}
|
||||||
|
|
||||||
HTREEITEM keyItem = Tree.InsertItem(utf8ToTStr(name), newItem);
|
HTREEITEM keyItem = Tree.InsertItem(nlUtf8ToTStr(name), newItem);
|
||||||
Tree.SetItemData(keyItem, 0xffffffff);
|
Tree.SetItemData(keyItem, 0xffffffff);
|
||||||
|
|
||||||
ite++;
|
ite++;
|
||||||
|
@ -320,7 +320,7 @@ void CAnimationSetDlg::refresh (BOOL update)
|
||||||
CSkeletonWeight *swt = object->AnimationSet.getSkeletonWeight(object->AnimationSet.getSkeletonWeightIdByName(name));
|
CSkeletonWeight *swt = object->AnimationSet.getSkeletonWeight(object->AnimationSet.getSkeletonWeightIdByName(name));
|
||||||
|
|
||||||
// Insert an intem
|
// Insert an intem
|
||||||
HTREEITEM item=SkelTree.InsertItem(utf8ToTStr(name));
|
HTREEITEM item = SkelTree.InsertItem(nlUtf8ToTStr(name));
|
||||||
nlassert (item!=NULL);
|
nlassert (item!=NULL);
|
||||||
|
|
||||||
// Get number of node in this skeleton weight
|
// Get number of node in this skeleton weight
|
||||||
|
@ -332,7 +332,7 @@ void CAnimationSetDlg::refresh (BOOL update)
|
||||||
std::string percent = toString("%s (%f%%)", swt->getNodeName(n).c_str(), swt->getNodeWeight(n)*100);
|
std::string percent = toString("%s (%f%%)", swt->getNodeName(n).c_str(), swt->getNodeWeight(n)*100);
|
||||||
|
|
||||||
// Add this string
|
// Add this string
|
||||||
SkelTree.InsertItem (utf8ToTStr(percent), item);
|
SkelTree.InsertItem(nlUtf8ToTStr(percent), item);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -340,7 +340,7 @@ void CAnimationSetDlg::refresh (BOOL update)
|
||||||
for (i=0; i<object->Saved.PlayList.size(); i++)
|
for (i=0; i<object->Saved.PlayList.size(); i++)
|
||||||
{
|
{
|
||||||
// Insert an intem
|
// Insert an intem
|
||||||
int item=PlayList.InsertString (-1, utf8ToTStr(object->Saved.PlayList[i]));
|
int item = PlayList.InsertString(-1, nlUtf8ToTStr(object->Saved.PlayList[i]));
|
||||||
nlassert (item!=LB_ERR);
|
nlassert (item!=LB_ERR);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -355,7 +355,7 @@ void CAttribDlg::init(HBITMAP bitmap, sint x, sint y, CWnd *pParent)
|
||||||
for (uint k = 0; k < getNumScheme(); ++k)
|
for (uint k = 0; k < getNumScheme(); ++k)
|
||||||
{
|
{
|
||||||
|
|
||||||
m_Scheme.InsertString(k, utf8ToTStr(getSchemeName(k)));
|
m_Scheme.InsertString(k, nlUtf8ToTStr(getSchemeName(k)));
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -33,7 +33,7 @@ CChooseName::CChooseName(const CString &initialName, CWnd* pParent /*=NULL*/)
|
||||||
|
|
||||||
std::string CChooseName::getName()
|
std::string CChooseName::getName()
|
||||||
{
|
{
|
||||||
return tStrToUtf8(m_Name);
|
return NLMISC::tStrToUtf8(m_Name);
|
||||||
}
|
}
|
||||||
|
|
||||||
void CChooseName::DoDataExchange(CDataExchange* pDX)
|
void CChooseName::DoDataExchange(CDataExchange* pDX)
|
||||||
|
|
|
@ -53,10 +53,10 @@ void CChoosePoolID::OnOK()
|
||||||
CString val;
|
CString val;
|
||||||
GetDlgItem(IDC_POOL_ID)->GetWindowText(val);
|
GetDlgItem(IDC_POOL_ID)->GetWindowText(val);
|
||||||
|
|
||||||
if (NLMISC::fromString(tStrToUtf8(val), PoolID))
|
if (NLMISC::fromString(NLMISC::tStrToUtf8(val), PoolID))
|
||||||
{
|
{
|
||||||
GetDlgItem(IDC_POOL_NAME)->GetWindowText(val);
|
GetDlgItem(IDC_POOL_NAME)->GetWindowText(val);
|
||||||
Name = tStrToUtf8(val);
|
Name = NLMISC::tStrToUtf8(val);
|
||||||
CDialog::OnOK();
|
CDialog::OnOK();
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
|
@ -71,8 +71,8 @@ BOOL CChoosePoolID::OnInitDialog()
|
||||||
|
|
||||||
std::string val = NLMISC::toString(PoolID);
|
std::string val = NLMISC::toString(PoolID);
|
||||||
|
|
||||||
GetDlgItem(IDC_POOL_ID)->SetWindowText(utf8ToTStr(val));
|
GetDlgItem(IDC_POOL_ID)->SetWindowText(nlUtf8ToTStr(val));
|
||||||
GetDlgItem(IDC_POOL_NAME)->SetWindowText(utf8ToTStr(Name));
|
GetDlgItem(IDC_POOL_NAME)->SetWindowText(nlUtf8ToTStr(Name));
|
||||||
|
|
||||||
if (_FreezeID)
|
if (_FreezeID)
|
||||||
{
|
{
|
||||||
|
|
|
@ -72,7 +72,7 @@ BOOL CCreateFileDlg::OnInitDialog()
|
||||||
{
|
{
|
||||||
CDialog::OnInitDialog();
|
CDialog::OnInitDialog();
|
||||||
SetWindowText((LPCTSTR) _Title);
|
SetWindowText((LPCTSTR) _Title);
|
||||||
GetDlgItem(IDC_LOCATION)->SetWindowText(utf8ToTStr(_DefaultBasePath));
|
GetDlgItem(IDC_LOCATION)->SetWindowText(nlUtf8ToTStr(_DefaultBasePath));
|
||||||
if (!_DefaultBasePath.empty())
|
if (!_DefaultBasePath.empty())
|
||||||
{
|
{
|
||||||
GetDlgItem(IDC_FILENAME)->SetFocus();
|
GetDlgItem(IDC_FILENAME)->SetFocus();
|
||||||
|
@ -90,10 +90,10 @@ void CCreateFileDlg::OnOK()
|
||||||
{
|
{
|
||||||
CString filename;
|
CString filename;
|
||||||
GetDlgItem(IDC_FILENAME)->GetWindowText(filename);
|
GetDlgItem(IDC_FILENAME)->GetWindowText(filename);
|
||||||
_Filename = tStrToUtf8(filename);
|
_Filename = NLMISC::tStrToUtf8(filename);
|
||||||
CString location;
|
CString location;
|
||||||
GetDlgItem(IDC_LOCATION)->GetWindowText(location);
|
GetDlgItem(IDC_LOCATION)->GetWindowText(location);
|
||||||
_Path = tStrToUtf8(location);
|
_Path = NLMISC::tStrToUtf8(location);
|
||||||
if (_Path.empty())
|
if (_Path.empty())
|
||||||
{
|
{
|
||||||
localizedMessageBox(*this, IDS_EMPTY_PATH, IDS_ERROR, MB_ICONEXCLAMATION);
|
localizedMessageBox(*this, IDS_EMPTY_PATH, IDS_ERROR, MB_ICONEXCLAMATION);
|
||||||
|
|
|
@ -173,7 +173,7 @@ void CDirectionAttr::OnDestroy()
|
||||||
void CDirectionAttr::OnGlobalDirection()
|
void CDirectionAttr::OnGlobalDirection()
|
||||||
{
|
{
|
||||||
nlassert(_DirectionWrapper);
|
nlassert(_DirectionWrapper);
|
||||||
CChooseName chooseName(utf8ToTStr(_DirectionWrapper->getGlobalVectorValueName()));
|
CChooseName chooseName(nlUtf8ToTStr(_DirectionWrapper->getGlobalVectorValueName()));
|
||||||
|
|
||||||
if (chooseName.DoModal() == IDOK)
|
if (chooseName.DoModal() == IDOK)
|
||||||
{
|
{
|
||||||
|
|
|
@ -76,7 +76,7 @@ std::string CEditEx::getString() const
|
||||||
{
|
{
|
||||||
TCHAR buf[128];
|
TCHAR buf[128];
|
||||||
GetWindowText(buf, sizeof(buf));
|
GetWindowText(buf, sizeof(buf));
|
||||||
return tStrToUtf8(buf);
|
return NLMISC::tStrToUtf8(buf);
|
||||||
}
|
}
|
||||||
|
|
||||||
void CEditEx::setSInt(sint value)
|
void CEditEx::setSInt(sint value)
|
||||||
|
|
|
@ -89,7 +89,7 @@ bool CEditMorphMeshDlg::getShapeNameFromDlg(std::string &name)
|
||||||
NLMISC::CPath::addSearchPath (NLMISC::CFile::getPath(tStrToUtf8(fd.GetPathName()));
|
NLMISC::CPath::addSearchPath (NLMISC::CFile::getPath(tStrToUtf8(fd.GetPathName()));
|
||||||
*/
|
*/
|
||||||
|
|
||||||
name = tStrToUtf8(fd.GetPathName());
|
name = NLMISC::tStrToUtf8(fd.GetPathName());
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
@ -123,7 +123,7 @@ void CEditMorphMeshDlg::OnAdd()
|
||||||
_CM->setShapes(&shapeNames[0], (uint)shapeNames.size());
|
_CM->setShapes(&shapeNames[0], (uint)shapeNames.size());
|
||||||
std::vector<sint> numVerts;
|
std::vector<sint> numVerts;
|
||||||
_CM->getShapeNumVerts(numVerts);
|
_CM->getShapeNumVerts(numVerts);
|
||||||
m_MeshList.AddString(utf8ToTStr(getShapeDescStr(index, numVerts[index])));
|
m_MeshList.AddString(nlUtf8ToTStr(getShapeDescStr(index, numVerts[index])));
|
||||||
GetDlgItem(IDC_REMOVE)->EnableWindow(TRUE);
|
GetDlgItem(IDC_REMOVE)->EnableWindow(TRUE);
|
||||||
}
|
}
|
||||||
touchPSState();
|
touchPSState();
|
||||||
|
@ -253,7 +253,7 @@ void CEditMorphMeshDlg::updateMeshList()
|
||||||
m_MeshList.ResetContent();
|
m_MeshList.ResetContent();
|
||||||
for (uint k = 0; k < _CM->getNumShapes(); ++k)
|
for (uint k = 0; k < _CM->getNumShapes(); ++k)
|
||||||
{
|
{
|
||||||
m_MeshList.AddString(utf8ToTStr(getShapeDescStr(k, numVerts[k])));
|
m_MeshList.AddString(nlUtf8ToTStr(getShapeDescStr(k, numVerts[k])));
|
||||||
}
|
}
|
||||||
m_MeshList.SetCurSel(0);
|
m_MeshList.SetCurSel(0);
|
||||||
updateValidFlag();
|
updateValidFlag();
|
||||||
|
@ -310,12 +310,12 @@ std::string CEditMorphMeshDlg::getShapeDescStr(uint shapeIndex, sint numVerts) c
|
||||||
{
|
{
|
||||||
CString verts;
|
CString verts;
|
||||||
verts.LoadString(IDS_VERTICES);
|
verts.LoadString(IDS_VERTICES);
|
||||||
std::string msg = _CM->getShape(shapeIndex) + " (" + NLMISC::toString(numVerts) + " " + tStrToUtf8(verts) + ")";
|
std::string msg = _CM->getShape(shapeIndex) + " (" + NLMISC::toString(numVerts) + " " + NLMISC::tStrToUtf8(verts) + ")";
|
||||||
return msg;
|
return msg;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
std::string result = _CM->getShape(shapeIndex) + " (" + tStrToUtf8(CMeshDlg::getShapeErrorString(numVerts)) + ")";
|
std::string result = _CM->getShape(shapeIndex) + " (" + NLMISC::tStrToUtf8(CMeshDlg::getShapeErrorString(numVerts)) + ")";
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -195,7 +195,7 @@ void CEditPSSound::OnChangeSoundName()
|
||||||
{
|
{
|
||||||
nlassert(_Sound);
|
nlassert(_Sound);
|
||||||
UpdateData();
|
UpdateData();
|
||||||
_Sound->setSoundName(NLMISC::CSheetId(tStrToUtf8(m_SoundName), "sound"));
|
_Sound->setSoundName(NLMISC::CSheetId(NLMISC::tStrToUtf8(m_SoundName), "sound"));
|
||||||
updateModifiedFlag();
|
updateModifiedFlag();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -209,7 +209,7 @@ void CEditPSSound::OnSpawn()
|
||||||
// play the currently selected sound
|
// play the currently selected sound
|
||||||
void CEditPSSound::OnPlaySound()
|
void CEditPSSound::OnPlaySound()
|
||||||
{
|
{
|
||||||
CSoundSystem::play(tStrToUtf8(m_SoundName));
|
CSoundSystem::play(NLMISC::tStrToUtf8(m_SoundName));
|
||||||
}
|
}
|
||||||
|
|
||||||
void CEditPSSound::OnMute()
|
void CEditPSSound::OnMute()
|
||||||
|
|
|
@ -317,7 +317,7 @@ inline void CEditableRangeT<float>::value2CString(float value, CString &dest)
|
||||||
|
|
||||||
inline const TCHAR *CEditableRangeT<float>::string2value(const CString &value, float &result)
|
inline const TCHAR *CEditableRangeT<float>::string2value(const CString &value, float &result)
|
||||||
{
|
{
|
||||||
if (NLMISC::fromString(tStrToUtf8(value), result))
|
if (NLMISC::fromString(NLMISC::tStrToUtf8(value), result))
|
||||||
{
|
{
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
@ -344,7 +344,7 @@ inline void CEditableRangeT<uint32>::value2CString(uint32 value, CString &dest)
|
||||||
inline const TCHAR *CEditableRangeT<uint32>::string2value(const CString &value, uint32 &result)
|
inline const TCHAR *CEditableRangeT<uint32>::string2value(const CString &value, uint32 &result)
|
||||||
{
|
{
|
||||||
sint32 tmp;
|
sint32 tmp;
|
||||||
if (NLMISC::fromString(tStrToUtf8(value), tmp))
|
if (NLMISC::fromString(NLMISC::tStrToUtf8(value), tmp))
|
||||||
{
|
{
|
||||||
if (value.Find(_T("-")) > -1)
|
if (value.Find(_T("-")) > -1)
|
||||||
{
|
{
|
||||||
|
@ -380,7 +380,7 @@ inline void CEditableRangeT<sint32>::value2CString(sint32 value, CString &dest)
|
||||||
inline const TCHAR *CEditableRangeT<sint32>::string2value(const CString &value, sint32 &result)
|
inline const TCHAR *CEditableRangeT<sint32>::string2value(const CString &value, sint32 &result)
|
||||||
{
|
{
|
||||||
sint32 tmp;
|
sint32 tmp;
|
||||||
if (NLMISC::fromString(tStrToUtf8(value), tmp))
|
if (NLMISC::fromString(NLMISC::tStrToUtf8(value), tmp))
|
||||||
{
|
{
|
||||||
result = tmp;
|
result = tmp;
|
||||||
return NULL;
|
return NULL;
|
||||||
|
|
|
@ -85,7 +85,7 @@ void CEmitterDlg::initEmittedType()
|
||||||
NL3D::CPSLocated *loc = dynamic_cast<NL3D::CPSLocated *>(ps->getProcess(k));
|
NL3D::CPSLocated *loc = dynamic_cast<NL3D::CPSLocated *>(ps->getProcess(k));
|
||||||
if (loc) // is this a located
|
if (loc) // is this a located
|
||||||
{
|
{
|
||||||
m_EmittedTypeCtrl.AddString(utf8ToTStr(loc->getName()));
|
m_EmittedTypeCtrl.AddString(nlUtf8ToTStr(loc->getName()));
|
||||||
_LocatedList.push_back(loc);
|
_LocatedList.push_back(loc);
|
||||||
if (loc == _Emitter->getEmittedType())
|
if (loc == _Emitter->getEmittedType())
|
||||||
{
|
{
|
||||||
|
|
|
@ -119,7 +119,7 @@ void CLBExternIDDlg::OnChangeIdValue()
|
||||||
TCHAR buf[6];
|
TCHAR buf[6];
|
||||||
::memset(buf, 0, 6);
|
::memset(buf, 0, 6);
|
||||||
GetDlgItem(IDC_ID_VALUE)->GetWindowText(buf, 6);
|
GetDlgItem(IDC_ID_VALUE)->GetWindowText(buf, 6);
|
||||||
_ID = StringToID(tStrToUtf8(buf).c_str());
|
_ID = StringToID(NLMISC::tStrToUtf8(buf).c_str());
|
||||||
if (_ID)
|
if (_ID)
|
||||||
{
|
{
|
||||||
GetDlgItem(IDOK)->EnableWindow(TRUE);
|
GetDlgItem(IDOK)->EnableWindow(TRUE);
|
||||||
|
|
|
@ -114,7 +114,7 @@ void CLocatedBindableDialog::init(CParticleDlg* pParent)
|
||||||
// z-test
|
// z-test
|
||||||
((CButton *) GetDlgItem(IDC_ZTEST))->SetCheck(material->isZTestEnabled() ? BST_CHECKED : BST_UNCHECKED);
|
((CButton *) GetDlgItem(IDC_ZTEST))->SetCheck(material->isZTestEnabled() ? BST_CHECKED : BST_UNCHECKED);
|
||||||
// z-bias
|
// z-bias
|
||||||
GetDlgItem(IDC_ZBIAS)->SetWindowText(utf8ToTStr(NLMISC::toString("%.2f", -material->getZBias())));
|
GetDlgItem(IDC_ZBIAS)->SetWindowText(nlUtf8ToTStr(NLMISC::toString("%.2f", -material->getZBias())));
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
|
|
@ -322,7 +322,7 @@ void CLocatedProperties::goPostRender()
|
||||||
_MaxNbParticles->update();
|
_MaxNbParticles->update();
|
||||||
}
|
}
|
||||||
// in all cases, show the current number of particles being used
|
// in all cases, show the current number of particles being used
|
||||||
GetDlgItem(IDC_CURR_NUM_PARTS)->SetWindowText(utf8ToTStr(NLMISC::toString(_Located->getSize())));
|
GetDlgItem(IDC_CURR_NUM_PARTS)->SetWindowText(nlUtf8ToTStr(NLMISC::toString(_Located->getSize())));
|
||||||
}
|
}
|
||||||
|
|
||||||
//****************************************************************************************************************
|
//****************************************************************************************************************
|
||||||
|
|
|
@ -112,7 +112,7 @@ void CLocatedTargetDlg::OnAddTarget()
|
||||||
nlassert(loc);
|
nlassert(loc);
|
||||||
_LBTarget->attachTarget(loc);
|
_LBTarget->attachTarget(loc);
|
||||||
m_AvailableTargets.DeleteString(indexs[k] - k);
|
m_AvailableTargets.DeleteString(indexs[k] - k);
|
||||||
int l = m_Targets.AddString(utf8ToTStr(loc->getName()));
|
int l = m_Targets.AddString(nlUtf8ToTStr(loc->getName()));
|
||||||
m_Targets.SetItemData(l, (DWORD_PTR) loc);
|
m_Targets.SetItemData(l, (DWORD_PTR) loc);
|
||||||
}
|
}
|
||||||
UpdateData(FALSE);
|
UpdateData(FALSE);
|
||||||
|
@ -135,7 +135,7 @@ void CLocatedTargetDlg::OnRemoveTarget()
|
||||||
nlassert(loc);
|
nlassert(loc);
|
||||||
_LBTarget->detachTarget(loc);
|
_LBTarget->detachTarget(loc);
|
||||||
m_Targets.DeleteString(indexs[k] - k);
|
m_Targets.DeleteString(indexs[k] - k);
|
||||||
int l = m_AvailableTargets.AddString(utf8ToTStr(loc->getName()));
|
int l = m_AvailableTargets.AddString(nlUtf8ToTStr(loc->getName()));
|
||||||
|
|
||||||
m_AvailableTargets.SetItemData(l, (DWORD_PTR) loc);
|
m_AvailableTargets.SetItemData(l, (DWORD_PTR) loc);
|
||||||
}
|
}
|
||||||
|
@ -159,7 +159,7 @@ BOOL CLocatedTargetDlg::OnInitDialog()
|
||||||
// fill the box thta tells us what the target are
|
// fill the box thta tells us what the target are
|
||||||
for(k = 0; k < nbTarg; ++k)
|
for(k = 0; k < nbTarg; ++k)
|
||||||
{
|
{
|
||||||
m_Targets.AddString(utf8ToTStr(_LBTarget->getTarget(k)->getName()));
|
m_Targets.AddString(nlUtf8ToTStr(_LBTarget->getTarget(k)->getName()));
|
||||||
m_Targets.SetItemData(k, (DWORD_PTR) _LBTarget->getTarget(k));
|
m_Targets.SetItemData(k, (DWORD_PTR) _LBTarget->getTarget(k));
|
||||||
targetSet.insert(_LBTarget->getTarget(k));
|
targetSet.insert(_LBTarget->getTarget(k));
|
||||||
};
|
};
|
||||||
|
@ -179,7 +179,7 @@ BOOL CLocatedTargetDlg::OnInitDialog()
|
||||||
{
|
{
|
||||||
if (targetSet.find(loc) == targetSet.end())
|
if (targetSet.find(loc) == targetSet.end())
|
||||||
{
|
{
|
||||||
int l = m_AvailableTargets.AddString(utf8ToTStr(loc->getName()));
|
int l = m_AvailableTargets.AddString(nlUtf8ToTStr(loc->getName()));
|
||||||
m_AvailableTargets.SetItemData(l, (DWORD_PTR) loc);
|
m_AvailableTargets.SetItemData(l, (DWORD_PTR) loc);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -592,7 +592,7 @@ void CMainFrame::OnFileLoadconfig()
|
||||||
}
|
}
|
||||||
catch (const Exception& e)
|
catch (const Exception& e)
|
||||||
{
|
{
|
||||||
MessageBox (utf8ToTStr(e.what()), _T("NeL object viewer"), MB_OK|MB_ICONEXCLAMATION);
|
MessageBox(nlUtf8ToTStr(e.what()), _T("NeL object viewer"), MB_OK | MB_ICONEXCLAMATION);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
|
@ -764,7 +764,7 @@ void CMainFrame::OnFileSaveconfig()
|
||||||
}
|
}
|
||||||
catch (const Exception& e)
|
catch (const Exception& e)
|
||||||
{
|
{
|
||||||
MessageBox (utf8ToTStr(e.what()), _T("NeL object viewer"), MB_OK|MB_ICONEXCLAMATION);
|
MessageBox(nlUtf8ToTStr(e.what()), _T("NeL object viewer"), MB_OK | MB_ICONEXCLAMATION);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
|
@ -1443,7 +1443,7 @@ void CMainFrame::OnUpdateSceneCamera(CCmdUI* pCmdUI)
|
||||||
CInstanceInfo *instance = ObjView->getInstance (ObjView->getCameraInstance (pCmdUI->m_nID - ID_SCENE_CAMERA_FIRST));
|
CInstanceInfo *instance = ObjView->getInstance (ObjView->getCameraInstance (pCmdUI->m_nID - ID_SCENE_CAMERA_FIRST));
|
||||||
nlassert (instance->Camera);
|
nlassert (instance->Camera);
|
||||||
std::string text = NLMISC::toString("Camera %s", instance->Saved.ShapeFilename.c_str());
|
std::string text = NLMISC::toString("Camera %s", instance->Saved.ShapeFilename.c_str());
|
||||||
pCmdUI->SetText(utf8ToTStr(text));
|
pCmdUI->SetText(nlUtf8ToTStr(text));
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
|
|
@ -94,7 +94,7 @@ void CMeshDlg::OnBrowseShape()
|
||||||
if (fd.DoModal() == IDOK)
|
if (fd.DoModal() == IDOK)
|
||||||
{
|
{
|
||||||
// Add to the path
|
// Add to the path
|
||||||
std::string fullPath = tStrToUtf8(fd.GetPathName());
|
std::string fullPath = NLMISC::tStrToUtf8(fd.GetPathName());
|
||||||
std::string fname = NLMISC::CFile::getFilenameWithoutExtension(fullPath);
|
std::string fname = NLMISC::CFile::getFilenameWithoutExtension(fullPath);
|
||||||
std::string ext = NLMISC::CFile::getExtension(fullPath);
|
std::string ext = NLMISC::CFile::getExtension(fullPath);
|
||||||
|
|
||||||
|
@ -104,12 +104,12 @@ void CMeshDlg::OnBrowseShape()
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
_ShapeParticle->setShape(fname + "." + ext);
|
_ShapeParticle->setShape(fname + "." + ext);
|
||||||
m_ShapeName = utf8ToTStr(fname + "." + ext);
|
m_ShapeName = nlUtf8ToTStr(fname + "." + ext);
|
||||||
touchPSState();
|
touchPSState();
|
||||||
}
|
}
|
||||||
catch (const NLMISC::Exception &e)
|
catch (const NLMISC::Exception &e)
|
||||||
{
|
{
|
||||||
MessageBox(utf8ToTStr(e.what()), _T("shape loading error"));
|
MessageBox(nlUtf8ToTStr(e.what()), _T("shape loading error"));
|
||||||
}
|
}
|
||||||
|
|
||||||
updateMeshErrorString();
|
updateMeshErrorString();
|
||||||
|
@ -159,7 +159,7 @@ void CMeshDlg::updateForMorph()
|
||||||
GetDlgItem(IDC_SHAPE_NAME)->EnableWindow(!enable);
|
GetDlgItem(IDC_SHAPE_NAME)->EnableWindow(!enable);
|
||||||
if (!enable)
|
if (!enable)
|
||||||
{
|
{
|
||||||
m_ShapeName = utf8ToTStr(cm->getShape());
|
m_ShapeName = nlUtf8ToTStr(cm->getShape());
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
|
|
@ -165,19 +165,19 @@ void CMultiTexDlg::readValues(bool alternate)
|
||||||
char buf[128];
|
char buf[128];
|
||||||
if (!alternate)
|
if (!alternate)
|
||||||
{
|
{
|
||||||
GetDlgItem(IDC_U_SPEED_1)->SetWindowText(utf8ToTStr(NLMISC::toString("%.3f", _MTP->getScrollSpeed(0).x)));
|
GetDlgItem(IDC_U_SPEED_1)->SetWindowText(nlUtf8ToTStr(NLMISC::toString("%.3f", _MTP->getScrollSpeed(0).x)));
|
||||||
GetDlgItem(IDC_V_SPEED_1)->SetWindowText(utf8ToTStr(NLMISC::toString("%.3f", _MTP->getScrollSpeed(0).y)));
|
GetDlgItem(IDC_V_SPEED_1)->SetWindowText(nlUtf8ToTStr(NLMISC::toString("%.3f", _MTP->getScrollSpeed(0).y)));
|
||||||
GetDlgItem(IDC_U_SPEED_2)->SetWindowText(utf8ToTStr(NLMISC::toString("%.3f", _MTP->getScrollSpeed(1).x)));
|
GetDlgItem(IDC_U_SPEED_2)->SetWindowText(nlUtf8ToTStr(NLMISC::toString("%.3f", _MTP->getScrollSpeed(1).x)));
|
||||||
GetDlgItem(IDC_V_SPEED_2)->SetWindowText(utf8ToTStr(NLMISC::toString("%.3f", _MTP->getScrollSpeed(1).y)));
|
GetDlgItem(IDC_V_SPEED_2)->SetWindowText(nlUtf8ToTStr(NLMISC::toString("%.3f", _MTP->getScrollSpeed(1).y)));
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
if (_MTP->isAlternateTexEnabled())
|
if (_MTP->isAlternateTexEnabled())
|
||||||
{
|
{
|
||||||
GetDlgItem(IDC_U_SPEED_1_ALTERNATE)->SetWindowText(utf8ToTStr(NLMISC::toString("%.3f", _MTP->getAlternateScrollSpeed(0).x)));
|
GetDlgItem(IDC_U_SPEED_1_ALTERNATE)->SetWindowText(nlUtf8ToTStr(NLMISC::toString("%.3f", _MTP->getAlternateScrollSpeed(0).x)));
|
||||||
GetDlgItem(IDC_V_SPEED_1_ALTERNATE)->SetWindowText(utf8ToTStr(NLMISC::toString("%.3f", _MTP->getAlternateScrollSpeed(0).y)));
|
GetDlgItem(IDC_V_SPEED_1_ALTERNATE)->SetWindowText(nlUtf8ToTStr(NLMISC::toString("%.3f", _MTP->getAlternateScrollSpeed(0).y)));
|
||||||
GetDlgItem(IDC_U_SPEED_2_ALTERNATE)->SetWindowText(utf8ToTStr(NLMISC::toString("%.3f", _MTP->getAlternateScrollSpeed(1).x)));
|
GetDlgItem(IDC_U_SPEED_2_ALTERNATE)->SetWindowText(nlUtf8ToTStr(NLMISC::toString("%.3f", _MTP->getAlternateScrollSpeed(1).x)));
|
||||||
GetDlgItem(IDC_V_SPEED_2_ALTERNATE)->SetWindowText(utf8ToTStr(NLMISC::toString("%.3f", _MTP->getAlternateScrollSpeed(1).y)));
|
GetDlgItem(IDC_V_SPEED_2_ALTERNATE)->SetWindowText(nlUtf8ToTStr(NLMISC::toString("%.3f", _MTP->getAlternateScrollSpeed(1).y)));
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
@ -188,7 +188,7 @@ void CMultiTexDlg::readValues(bool alternate)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
GetDlgItem(IDC_BUMP_FACTOR)->SetWindowText(utf8ToTStr(NLMISC::toString("%.3f", _MTP->getBumpFactor())));
|
GetDlgItem(IDC_BUMP_FACTOR)->SetWindowText(nlUtf8ToTStr(NLMISC::toString("%.3f", _MTP->getBumpFactor())));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -535,7 +535,7 @@ void CObjectViewer::loadConfigFile()
|
||||||
}
|
}
|
||||||
catch (const Exception& e)
|
catch (const Exception& e)
|
||||||
{
|
{
|
||||||
::MessageBox (NULL, utf8ToTStr(e.what()), _T("Objectviewer.cfg"), MB_OK|MB_ICONEXCLAMATION);
|
::MessageBox(NULL, nlUtf8ToTStr(e.what()), _T("Objectviewer.cfg"), MB_OK | MB_ICONEXCLAMATION);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -823,7 +823,7 @@ bool CObjectViewer::initUI (HWND parent)
|
||||||
catch (const NLMISC::EStream &e)
|
catch (const NLMISC::EStream &e)
|
||||||
{
|
{
|
||||||
std::string msg = toString("Unable to load the default scheme bank file : %s", e.what());
|
std::string msg = toString("Unable to load the default scheme bank file : %s", e.what());
|
||||||
::MessageBox(NULL, utf8ToTStr(msg), _T("Object Viewer"), MB_ICONEXCLAMATION);
|
::MessageBox(NULL, nlUtf8ToTStr(msg), _T("Object Viewer"), MB_ICONEXCLAMATION);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
iF.close();
|
iF.close();
|
||||||
|
@ -840,7 +840,7 @@ bool CObjectViewer::initUI (HWND parent)
|
||||||
catch (const Exception& e)
|
catch (const Exception& e)
|
||||||
{
|
{
|
||||||
std::string msg = toString("Error while loading default.ovcgf : %s", e.what());
|
std::string msg = toString("Error while loading default.ovcgf : %s", e.what());
|
||||||
::MessageBox (NULL, utf8ToTStr(msg), _T("NeL object viewer"), MB_OK|MB_ICONEXCLAMATION);
|
::MessageBox(NULL, nlUtf8ToTStr(msg), _T("NeL object viewer"), MB_OK | MB_ICONEXCLAMATION);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1312,7 +1312,7 @@ void CObjectViewer::go ()
|
||||||
);
|
);
|
||||||
|
|
||||||
// Display
|
// Display
|
||||||
_MainFrame->StatusBar.SetWindowText (utf8ToTStr(msgBar));
|
_MainFrame->StatusBar.SetWindowText(nlUtf8ToTStr(msgBar));
|
||||||
|
|
||||||
// Display Vegetable info.
|
// Display Vegetable info.
|
||||||
if(_VegetableDlg!=NULL)
|
if(_VegetableDlg!=NULL)
|
||||||
|
@ -1794,7 +1794,7 @@ void CObjectViewer::serial (NLMISC::IStream& f)
|
||||||
{
|
{
|
||||||
// Error message
|
// Error message
|
||||||
std::string message = toString("File not found %s", readed[i].ShapeFilename.c_str());
|
std::string message = toString("File not found %s", readed[i].ShapeFilename.c_str());
|
||||||
_MainFrame->MessageBox (utf8ToTStr(message), _T("NeL object viewer"), MB_OK|MB_ICONEXCLAMATION);
|
_MainFrame->MessageBox(nlUtf8ToTStr(message), _T("NeL object viewer"), MB_OK | MB_ICONEXCLAMATION);
|
||||||
|
|
||||||
// Stop loading
|
// Stop loading
|
||||||
break;
|
break;
|
||||||
|
@ -1829,7 +1829,7 @@ void CObjectViewer::serial (NLMISC::IStream& f)
|
||||||
{
|
{
|
||||||
// Error message
|
// Error message
|
||||||
std::string message = toString("Error loading shape %s: %s", readed[i].ShapeFilename.c_str(), e.what());
|
std::string message = toString("Error loading shape %s: %s", readed[i].ShapeFilename.c_str(), e.what());
|
||||||
_MainFrame->MessageBox (utf8ToTStr(message), _T("NeL object viewer"), MB_OK|MB_ICONEXCLAMATION);
|
_MainFrame->MessageBox(nlUtf8ToTStr(message), _T("NeL object viewer"), MB_OK | MB_ICONEXCLAMATION);
|
||||||
|
|
||||||
// Stop loading
|
// Stop loading
|
||||||
break;
|
break;
|
||||||
|
@ -1899,7 +1899,7 @@ bool CObjectViewer::loadInstanceGroup(const std::string &igFilename)
|
||||||
{
|
{
|
||||||
// clean
|
// clean
|
||||||
delete ig;
|
delete ig;
|
||||||
_MainFrame->MessageBox (utf8ToTStr(e.what()), _T("NeL object viewer"), MB_OK|MB_ICONEXCLAMATION);
|
_MainFrame->MessageBox(nlUtf8ToTStr(e.what()), _T("NeL object viewer"), MB_OK | MB_ICONEXCLAMATION);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1907,7 +1907,7 @@ bool CObjectViewer::loadInstanceGroup(const std::string &igFilename)
|
||||||
{
|
{
|
||||||
// Create a message
|
// Create a message
|
||||||
std::string msg = toString("Can't open the file %s for reading.", igFilename.c_str());
|
std::string msg = toString("Can't open the file %s for reading.", igFilename.c_str());
|
||||||
_MainFrame->MessageBox (utf8ToTStr(msg), _T("NeL object viewer"), MB_OK|MB_ICONEXCLAMATION);
|
_MainFrame->MessageBox(nlUtf8ToTStr(msg), _T("NeL object viewer"), MB_OK | MB_ICONEXCLAMATION);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1962,7 +1962,7 @@ bool CObjectViewer::loadMesh (std::vector<std::string> &meshFilename, const std:
|
||||||
}
|
}
|
||||||
catch (const Exception& e)
|
catch (const Exception& e)
|
||||||
{
|
{
|
||||||
_MainFrame->MessageBox (utf8ToTStr(e.what()), _T("NeL object viewer"), MB_OK|MB_ICONEXCLAMATION);
|
_MainFrame->MessageBox(nlUtf8ToTStr(e.what()), _T("NeL object viewer"), MB_OK | MB_ICONEXCLAMATION);
|
||||||
|
|
||||||
// error
|
// error
|
||||||
skelError=true;
|
skelError=true;
|
||||||
|
@ -1972,7 +1972,7 @@ bool CObjectViewer::loadMesh (std::vector<std::string> &meshFilename, const std:
|
||||||
{
|
{
|
||||||
// Create a message
|
// Create a message
|
||||||
std::string msg = NLMISC::toString("Can't open the file %s for reading.", skeleton.c_str());
|
std::string msg = NLMISC::toString("Can't open the file %s for reading.", skeleton.c_str());
|
||||||
_MainFrame->MessageBox (utf8ToTStr(msg), _T("NeL object viewer"), MB_OK|MB_ICONEXCLAMATION);
|
_MainFrame->MessageBox(nlUtf8ToTStr(msg), _T("NeL object viewer"), MB_OK | MB_ICONEXCLAMATION);
|
||||||
|
|
||||||
// error
|
// error
|
||||||
skelError=true;
|
skelError=true;
|
||||||
|
@ -2015,7 +2015,7 @@ bool CObjectViewer::loadMesh (std::vector<std::string> &meshFilename, const std:
|
||||||
}
|
}
|
||||||
catch (const Exception& e)
|
catch (const Exception& e)
|
||||||
{
|
{
|
||||||
_MainFrame->MessageBox (utf8ToTStr(e.what()), _T("NeL object viewer"), MB_OK|MB_ICONEXCLAMATION);
|
_MainFrame->MessageBox(nlUtf8ToTStr(e.what()), _T("NeL object viewer"), MB_OK | MB_ICONEXCLAMATION);
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -2023,7 +2023,7 @@ bool CObjectViewer::loadMesh (std::vector<std::string> &meshFilename, const std:
|
||||||
{
|
{
|
||||||
// Create a message
|
// Create a message
|
||||||
std::string msg = NLMISC::toString("Can't open the file %s for reading.", fileName.c_str());
|
std::string msg = NLMISC::toString("Can't open the file %s for reading.", fileName.c_str());
|
||||||
_MainFrame->MessageBox (utf8ToTStr(msg), _T("NeL object viewer"), MB_OK|MB_ICONEXCLAMATION);
|
_MainFrame->MessageBox(nlUtf8ToTStr(msg), _T("NeL object viewer"), MB_OK | MB_ICONEXCLAMATION);
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -2848,7 +2848,7 @@ void CObjectViewer::enableDynamicObjectLightingTest(NLPACS::CGlobalRetriever *gl
|
||||||
if (!_ObjectLightTestShape.empty())
|
if (!_ObjectLightTestShape.empty())
|
||||||
{
|
{
|
||||||
string str= string("Path not found for Light Test Shape: ") + _ObjectLightTestShape;
|
string str= string("Path not found for Light Test Shape: ") + _ObjectLightTestShape;
|
||||||
::MessageBox(NULL, utf8ToTStr(str.c_str()), _T("Dynamic Object Light Test"), MB_OK|MB_ICONEXCLAMATION);
|
::MessageBox(NULL, nlUtf8ToTStr(str.c_str()), _T("Dynamic Object Light Test"), MB_OK | MB_ICONEXCLAMATION);
|
||||||
}
|
}
|
||||||
// disable.
|
// disable.
|
||||||
_ObjectLightTest= NULL;
|
_ObjectLightTest= NULL;
|
||||||
|
@ -3223,7 +3223,7 @@ bool CObjectViewer::createVegetableLandscape()
|
||||||
// close the progress dialog
|
// close the progress dialog
|
||||||
dlgProgress.DestroyWindow();
|
dlgProgress.DestroyWindow();
|
||||||
|
|
||||||
MessageBox(_MainFrame->m_hWnd, utf8ToTStr(e.what()), _T("Failed to Load landscape"), MB_OK | MB_APPLMODAL);
|
MessageBox(_MainFrame->m_hWnd, nlUtf8ToTStr(e.what()), _T("Failed to Load landscape"), MB_OK | MB_APPLMODAL);
|
||||||
|
|
||||||
// remove first possibly created collisions objects.
|
// remove first possibly created collisions objects.
|
||||||
if(_VegetableCollisionEntity)
|
if(_VegetableCollisionEntity)
|
||||||
|
@ -3557,7 +3557,7 @@ void CObjectViewer::loadAnimation(const std::string &fileName, uint instance)
|
||||||
{
|
{
|
||||||
// Create a message
|
// Create a message
|
||||||
std::string msg = NLMISC::toString("Can't open the file %s for reading.", fileName.c_str());
|
std::string msg = NLMISC::toString("Can't open the file %s for reading.", fileName.c_str());
|
||||||
_MainFrame->MessageBox (utf8ToTStr(msg), _T("NeL object viewer"), MB_OK|MB_ICONEXCLAMATION);
|
_MainFrame->MessageBox(nlUtf8ToTStr(msg), _T("NeL object viewer"), MB_OK | MB_ICONEXCLAMATION);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -3587,7 +3587,7 @@ void CObjectViewer::loadSWT (const std::string &fileName, uint instance)
|
||||||
{
|
{
|
||||||
// Create a message
|
// Create a message
|
||||||
std::string msg = NLMISC::toString("Can't open the file %s for reading.", fileName.c_str());
|
std::string msg = NLMISC::toString("Can't open the file %s for reading.", fileName.c_str());
|
||||||
_MainFrame->MessageBox (utf8ToTStr(msg), _T("NeL object viewer"), MB_OK|MB_ICONEXCLAMATION);
|
_MainFrame->MessageBox(nlUtf8ToTStr(msg), _T("NeL object viewer"), MB_OK | MB_ICONEXCLAMATION);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -3771,14 +3771,14 @@ void CObjectViewer::shootScene()
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
std::string message = toString("Can't open the file %s for writing.", filenamefinal.c_str());
|
std::string message = toString("Can't open the file %s for writing.", filenamefinal.c_str());
|
||||||
_MainFrame->MessageBox (utf8ToTStr(message), _T("NeL object viewer"), MB_OK|MB_ICONEXCLAMATION);
|
_MainFrame->MessageBox(nlUtf8ToTStr(message), _T("NeL object viewer"), MB_OK | MB_ICONEXCLAMATION);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
catch (const Exception &e)
|
catch (const Exception &e)
|
||||||
{
|
{
|
||||||
std::string message = toString("Error during writing of the file %s: %s", filenamefinal.c_str(), e.what());
|
std::string message = toString("Error during writing of the file %s: %s", filenamefinal.c_str(), e.what());
|
||||||
_MainFrame->MessageBox (utf8ToTStr(message), _T("NeL object viewer"), MB_OK|MB_ICONEXCLAMATION);
|
_MainFrame->MessageBox(nlUtf8ToTStr(message), _T("NeL object viewer"), MB_OK | MB_ICONEXCLAMATION);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -428,7 +428,7 @@ bool CParticleDlg::savePSAs(HWND parent, CParticleWorkspace::CNode &psNode ,cons
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
::MessageBox(parent, utf8ToTStr(e.what()), getStrRsc(IDS_ERROR), MB_ICONEXCLAMATION);
|
::MessageBox(parent, nlUtf8ToTStr(e.what()), getStrRsc(IDS_ERROR), MB_ICONEXCLAMATION);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -474,7 +474,7 @@ bool CParticleDlg::loadPS(HWND parent, CParticleWorkspace::CNode &psNode, TLoadP
|
||||||
{
|
{
|
||||||
case Silent: return false; // no op
|
case Silent: return false; // no op
|
||||||
case ReportError:
|
case ReportError:
|
||||||
::MessageBox(parent, utf8ToTStr(e.what()), getStrRsc(IDS_ERROR), MB_OK|MB_ICONEXCLAMATION);
|
::MessageBox(parent, nlUtf8ToTStr(e.what()), getStrRsc(IDS_ERROR), MB_OK | MB_ICONEXCLAMATION);
|
||||||
return true;
|
return true;
|
||||||
break;
|
break;
|
||||||
case ReportErrorSkippable:
|
case ReportErrorSkippable:
|
||||||
|
@ -549,7 +549,7 @@ void CParticleDlg::OnCreateNewPsWorkspace()
|
||||||
}
|
}
|
||||||
catch(const NLMISC::EStream &e)
|
catch(const NLMISC::EStream &e)
|
||||||
{
|
{
|
||||||
MessageBox(utf8ToTStr(e.what()), getStrRsc(IDS_ERROR), MB_ICONEXCLAMATION);
|
MessageBox(nlUtf8ToTStr(e.what()), getStrRsc(IDS_ERROR), MB_ICONEXCLAMATION);
|
||||||
}
|
}
|
||||||
closeWorkspace();
|
closeWorkspace();
|
||||||
_PW = newPW;
|
_PW = newPW;
|
||||||
|
@ -567,7 +567,7 @@ void CParticleDlg::OnLoadPSWorkspace()
|
||||||
CFileDialog fd( TRUE, _T(".pws"), _T("*.pws"), 0, szFilter);
|
CFileDialog fd( TRUE, _T(".pws"), _T("*.pws"), 0, szFilter);
|
||||||
INT_PTR result = fd.DoModal();
|
INT_PTR result = fd.DoModal();
|
||||||
if (result != IDOK) return;
|
if (result != IDOK) return;
|
||||||
loadWorkspace(tStrToUtf8(fd.GetPathName()));
|
loadWorkspace(NLMISC::tStrToUtf8(fd.GetPathName()));
|
||||||
}
|
}
|
||||||
|
|
||||||
//**************************************************************************************************************************
|
//**************************************************************************************************************************
|
||||||
|
@ -585,7 +585,7 @@ void CParticleDlg::loadWorkspace(const std::string &fullPath)
|
||||||
}
|
}
|
||||||
catch(const NLMISC::EStream &e)
|
catch(const NLMISC::EStream &e)
|
||||||
{
|
{
|
||||||
MessageBox(utf8ToTStr(e.what()), getStrRsc(IDS_ERROR), MB_ICONEXCLAMATION);
|
MessageBox(nlUtf8ToTStr(e.what()), getStrRsc(IDS_ERROR), MB_ICONEXCLAMATION);
|
||||||
setStatusBarText(CString(e.what()));
|
setStatusBarText(CString(e.what()));
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
@ -635,7 +635,7 @@ void CParticleDlg::saveWorkspaceStructure()
|
||||||
}
|
}
|
||||||
catch(const NLMISC::EStream &e)
|
catch(const NLMISC::EStream &e)
|
||||||
{
|
{
|
||||||
localizedMessageBox(*this, utf8ToTStr(e.what()), IDS_ERROR, MB_ICONEXCLAMATION);
|
localizedMessageBox(*this, nlUtf8ToTStr(e.what()), IDS_ERROR, MB_ICONEXCLAMATION);
|
||||||
setStatusBarText(CString(e.what()));
|
setStatusBarText(CString(e.what()));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -213,7 +213,7 @@ HTREEITEM CParticleTreeCtrl::buildTreeFromPS(CParticleWorkspace::CNode &node, H
|
||||||
if (node.isLoaded())
|
if (node.isLoaded())
|
||||||
{
|
{
|
||||||
// bind particle system icon
|
// bind particle system icon
|
||||||
HTREEITEM psRoot = InsertItem(TVIF_IMAGE | TVIF_SELECTEDIMAGE | TVIF_TEXT, utf8ToTStr(computeCaption(node)), PSIconParticleSystem, PSIconParticleSystem, 0, 0, NULL, rootHandle, prevSibling);
|
HTREEITEM psRoot = InsertItem(TVIF_IMAGE | TVIF_SELECTEDIMAGE | TVIF_TEXT, nlUtf8ToTStr(computeCaption(node)), PSIconParticleSystem, PSIconParticleSystem, 0, 0, NULL, rootHandle, prevSibling);
|
||||||
// set the param (doesn't seems to work during first creation)
|
// set the param (doesn't seems to work during first creation)
|
||||||
SetItemData(psRoot, (LPARAM) nt);
|
SetItemData(psRoot, (LPARAM) nt);
|
||||||
// now, create each located
|
// now, create each located
|
||||||
|
@ -228,7 +228,7 @@ HTREEITEM CParticleTreeCtrl::buildTreeFromPS(CParticleWorkspace::CNode &node, H
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
// bind a bitmap that say that the PS hasn't been loaded
|
// bind a bitmap that say that the PS hasn't been loaded
|
||||||
HTREEITEM psRoot = InsertItem(TVIF_IMAGE | TVIF_SELECTEDIMAGE | TVIF_TEXT, utf8ToTStr(computeCaption(node)), PSIconParticleSystemNotLoaded, PSIconParticleSystemNotLoaded, 0, 0, NULL, rootHandle, prevSibling);
|
HTREEITEM psRoot = InsertItem(TVIF_IMAGE | TVIF_SELECTEDIMAGE | TVIF_TEXT, nlUtf8ToTStr(computeCaption(node)), PSIconParticleSystemNotLoaded, PSIconParticleSystemNotLoaded, 0, 0, NULL, rootHandle, prevSibling);
|
||||||
SetItemData(psRoot, (LPARAM) nt);
|
SetItemData(psRoot, (LPARAM) nt);
|
||||||
return psRoot;
|
return psRoot;
|
||||||
}
|
}
|
||||||
|
@ -242,7 +242,7 @@ void CParticleTreeCtrl::buildTreeFromWorkSpace(CParticleWorkspace &ws)
|
||||||
CNodeType *nt = new CNodeType(&ws);
|
CNodeType *nt = new CNodeType(&ws);
|
||||||
_NodeTypes.push_back(nt);
|
_NodeTypes.push_back(nt);
|
||||||
// bind particle system icon
|
// bind particle system icon
|
||||||
HTREEITEM rootHandle = InsertItem(TVIF_IMAGE | TVIF_SELECTEDIMAGE | TVIF_TEXT, utf8ToTStr(computeCaption(ws)), PSIconWorkspace, PSIconWorkspace, 0, 0, NULL, NULL, TVI_LAST);
|
HTREEITEM rootHandle = InsertItem(TVIF_IMAGE | TVIF_SELECTEDIMAGE | TVIF_TEXT, nlUtf8ToTStr(computeCaption(ws)), PSIconWorkspace, PSIconWorkspace, 0, 0, NULL, NULL, TVI_LAST);
|
||||||
// set the param (doesn't seems to work during first creation)
|
// set the param (doesn't seems to work during first creation)
|
||||||
SetItemData(rootHandle, (LPARAM) nt);
|
SetItemData(rootHandle, (LPARAM) nt);
|
||||||
// now, create each particle system
|
// now, create each particle system
|
||||||
|
@ -259,7 +259,7 @@ void CParticleTreeCtrl::createNodeFromLocated(NL3D::CPSLocated *loc, HTREEITEM
|
||||||
CNodeType *nt = new CNodeType(loc);
|
CNodeType *nt = new CNodeType(loc);
|
||||||
_NodeTypes.push_back(nt);
|
_NodeTypes.push_back(nt);
|
||||||
// bind located icon
|
// bind located icon
|
||||||
HTREEITEM nodeHandle = InsertItem(TVIF_IMAGE | TVIF_SELECTEDIMAGE | TVIF_PARAM |TVIF_TEXT, utf8ToTStr(loc->getName()) , PSIconLocated, PSIconLocated, 0, 0, (LPARAM) nt, rootHandle, TVI_LAST);
|
HTREEITEM nodeHandle = InsertItem(TVIF_IMAGE | TVIF_SELECTEDIMAGE | TVIF_PARAM | TVIF_TEXT, nlUtf8ToTStr(loc->getName()), PSIconLocated, PSIconLocated, 0, 0, (LPARAM)nt, rootHandle, TVI_LAST);
|
||||||
// now, insert each object that is bound to the located
|
// now, insert each object that is bound to the located
|
||||||
for (uint l = 0; l < loc->getNbBoundObjects(); ++l)
|
for (uint l = 0; l < loc->getNbBoundObjects(); ++l)
|
||||||
{
|
{
|
||||||
|
@ -273,7 +273,7 @@ void CParticleTreeCtrl::createNodeFromLocatedBindable(NL3D::CPSLocatedBindable *
|
||||||
// we ordered the image so that they match the type for a located bindable (force, particles, collision zones...)
|
// we ordered the image so that they match the type for a located bindable (force, particles, collision zones...)
|
||||||
CNodeType *nt = new CNodeType(lb);
|
CNodeType *nt = new CNodeType(lb);
|
||||||
_NodeTypes.push_back(nt);
|
_NodeTypes.push_back(nt);
|
||||||
InsertItem(TVIF_IMAGE | TVIF_SELECTEDIMAGE | TVIF_PARAM | TVIF_TEXT , utf8ToTStr(lb->getName()) , lb->getType(), lb->getType(), PSIconForce, PSIconForce, (LPARAM) nt, rootHandle, TVI_LAST);
|
InsertItem(TVIF_IMAGE | TVIF_SELECTEDIMAGE | TVIF_PARAM | TVIF_TEXT, nlUtf8ToTStr(lb->getName()), lb->getType(), lb->getType(), PSIconForce, PSIconForce, (LPARAM)nt, rootHandle, TVI_LAST);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -1004,7 +1004,7 @@ BOOL CParticleTreeCtrl::OnCmdMsg(UINT nID, int nCode, void* pExtra, AFX_CMDHA
|
||||||
nlassert(ownerNode);
|
nlassert(ownerNode);
|
||||||
|
|
||||||
// Add search path for the texture
|
// Add search path for the texture
|
||||||
NLMISC::CPath::addSearchPath (NLMISC::CFile::getPath(tStrToUtf8(fd.GetPathName())));
|
NLMISC::CPath::addSearchPath(NLMISC::CFile::getPath(NLMISC::tStrToUtf8(fd.GetPathName())));
|
||||||
|
|
||||||
CUniquePtr<NL3D::CShapeBank> sb(new NL3D::CShapeBank);
|
CUniquePtr<NL3D::CShapeBank> sb(new NL3D::CShapeBank);
|
||||||
CParticleSystemModel *psm = NULL;
|
CParticleSystemModel *psm = NULL;
|
||||||
|
@ -1012,9 +1012,9 @@ BOOL CParticleTreeCtrl::OnCmdMsg(UINT nID, int nCode, void* pExtra, AFX_CMDHA
|
||||||
{
|
{
|
||||||
NL3D::CShapeStream ss;
|
NL3D::CShapeStream ss;
|
||||||
NLMISC::CIFile inputFile;
|
NLMISC::CIFile inputFile;
|
||||||
inputFile.open(tStrToUtf8(fd.GetPathName()));
|
inputFile.open(NLMISC::tStrToUtf8(fd.GetPathName()));
|
||||||
ss.serial(inputFile);
|
ss.serial(inputFile);
|
||||||
std::string shapeName = NLMISC::CFile::getFilename(tStrToUtf8(fd.GetPathName()));
|
std::string shapeName = NLMISC::CFile::getFilename(NLMISC::tStrToUtf8(fd.GetPathName()));
|
||||||
sb->add(shapeName, ss.getShapePointer());
|
sb->add(shapeName, ss.getShapePointer());
|
||||||
NL3D::CShapeBank *oldSB = CNELU::Scene->getShapeBank();
|
NL3D::CShapeBank *oldSB = CNELU::Scene->getShapeBank();
|
||||||
CNELU::Scene->setShapeBank(sb.get());
|
CNELU::Scene->setShapeBank(sb.get());
|
||||||
|
@ -1039,7 +1039,7 @@ BOOL CParticleTreeCtrl::OnCmdMsg(UINT nID, int nCode, void* pExtra, AFX_CMDHA
|
||||||
}
|
}
|
||||||
catch(const NLMISC::EStream &e)
|
catch(const NLMISC::EStream &e)
|
||||||
{
|
{
|
||||||
MessageBox(utf8ToTStr(e.what()), getStrRsc(IDS_ERROR), MB_OK|MB_ICONEXCLAMATION);
|
MessageBox(nlUtf8ToTStr(e.what()), getStrRsc(IDS_ERROR), MB_OK | MB_ICONEXCLAMATION);
|
||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
ownerNode->setResetAutoCountFlag(false);
|
ownerNode->setResetAutoCountFlag(false);
|
||||||
|
@ -1096,10 +1096,10 @@ BOOL CParticleTreeCtrl::OnCmdMsg(UINT nID, int nCode, void* pExtra, AFX_CMDHA
|
||||||
_ParticleDlg->StartStopDlg->stop();
|
_ParticleDlg->StartStopDlg->stop();
|
||||||
std::string fileName = nt->PS->getFilename();
|
std::string fileName = nt->PS->getFilename();
|
||||||
static TCHAR BASED_CODE szFilter[] = _T("ps & shapes files(*.ps;*.shape)|*.ps; *.shape||");
|
static TCHAR BASED_CODE szFilter[] = _T("ps & shapes files(*.ps;*.shape)|*.ps; *.shape||");
|
||||||
CFileDialog fd(FALSE, _T(".ps"), utf8ToTStr(fileName), OFN_OVERWRITEPROMPT, szFilter, this);
|
CFileDialog fd(FALSE, _T(".ps"), nlUtf8ToTStr(fileName), OFN_OVERWRITEPROMPT, szFilter, this);
|
||||||
if (fd.DoModal() == IDOK)
|
if (fd.DoModal() == IDOK)
|
||||||
{
|
{
|
||||||
_ParticleDlg->savePSAs(*this, *nt->PS, tStrToUtf8(fd.GetPathName()), false);
|
_ParticleDlg->savePSAs(*this, *nt->PS, NLMISC::tStrToUtf8(fd.GetPathName()), false);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1249,7 +1249,7 @@ BOOL CParticleTreeCtrl::OnCmdMsg(UINT nID, int nCode, void* pExtra, AFX_CMDHA
|
||||||
}
|
}
|
||||||
getOwnerNode(nt)->setModified(true);
|
getOwnerNode(nt)->setModified(true);
|
||||||
// TODO : an enum for CPSLocatedBindable::getType would be better...
|
// TODO : an enum for CPSLocatedBindable::getType would be better...
|
||||||
InsertItem(TVIF_IMAGE | TVIF_SELECTEDIMAGE | TVIF_PARAM | TVIF_TEXT, utf8ToTStr(toCreate->getName()), toCreate->getType(), toCreate->getType(), 0, 0, (LPARAM) newNt, father, lastSon);
|
InsertItem(TVIF_IMAGE | TVIF_SELECTEDIMAGE | TVIF_PARAM | TVIF_TEXT, nlUtf8ToTStr(toCreate->getName()), toCreate->getType(), toCreate->getType(), 0, 0, (LPARAM)newNt, father, lastSon);
|
||||||
touchPSState(nt);
|
touchPSState(nt);
|
||||||
Invalidate();
|
Invalidate();
|
||||||
_ParticleDlg->StartStopDlg->resetAutoCount(getOwnerNode(nt));
|
_ParticleDlg->StartStopDlg->resetAutoCount(getOwnerNode(nt));
|
||||||
|
@ -1280,7 +1280,7 @@ std::pair<CParticleTreeCtrl::CNodeType *, HTREEITEM> CParticleTreeCtrl::createL
|
||||||
CNodeType *newNt = new CNodeType(loc);
|
CNodeType *newNt = new CNodeType(loc);
|
||||||
_NodeTypes.push_back(newNt);
|
_NodeTypes.push_back(newNt);
|
||||||
// insert item in tree
|
// insert item in tree
|
||||||
HTREEITEM insertedItem = InsertItem(TVIF_IMAGE | TVIF_SELECTEDIMAGE | TVIF_PARAM | TVIF_TEXT, utf8ToTStr(name), PSIconLocated, PSIconLocated, 0, 0, (LPARAM) newNt, headItem, TVI_LAST);
|
HTREEITEM insertedItem = InsertItem(TVIF_IMAGE | TVIF_SELECTEDIMAGE | TVIF_PARAM | TVIF_TEXT, nlUtf8ToTStr(name), PSIconLocated, PSIconLocated, 0, 0, (LPARAM)newNt, headItem, TVI_LAST);
|
||||||
touchPSState(newNt);
|
touchPSState(newNt);
|
||||||
return std::make_pair(newNt, insertedItem);
|
return std::make_pair(newNt, insertedItem);
|
||||||
}
|
}
|
||||||
|
@ -1299,7 +1299,7 @@ void CParticleTreeCtrl::OnEndlabeledit(NMHDR* pNMHDR, LRESULT* pResult)
|
||||||
{
|
{
|
||||||
case CNodeType::workspace:
|
case CNodeType::workspace:
|
||||||
{
|
{
|
||||||
nt->WS->setName(tStrToUtf8(info->item.pszText));
|
nt->WS->setName(NLMISC::tStrToUtf8(info->item.pszText));
|
||||||
workspaceModifiedFlagChanged(*nt->WS); // change name (this may be called twice because of the modification callback, but this doesn't matter)
|
workspaceModifiedFlagChanged(*nt->WS); // change name (this may be called twice because of the modification callback, but this doesn't matter)
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
@ -1311,10 +1311,10 @@ void CParticleTreeCtrl::OnEndlabeledit(NMHDR* pNMHDR, LRESULT* pResult)
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
nt->PS->getPSPointer()->setName(tStrToUtf8(info->item.pszText));
|
nt->PS->getPSPointer()->setName(NLMISC::tStrToUtf8(info->item.pszText));
|
||||||
nt->PS->setModified(true);
|
nt->PS->setModified(true);
|
||||||
}
|
}
|
||||||
this->SetItemText(info->item.hItem, utf8ToTStr(computeCaption(*nt->PS)));
|
this->SetItemText(info->item.hItem, nlUtf8ToTStr(computeCaption(*nt->PS)));
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case CNodeType::located:
|
case CNodeType::located:
|
||||||
|
@ -1322,7 +1322,7 @@ void CParticleTreeCtrl::OnEndlabeledit(NMHDR* pNMHDR, LRESULT* pResult)
|
||||||
nlassert(getOwnerNode(nt));
|
nlassert(getOwnerNode(nt));
|
||||||
getOwnerNode(nt)->setModified(true);
|
getOwnerNode(nt)->setModified(true);
|
||||||
this->SetItemText(info->item.hItem, info->item.pszText);
|
this->SetItemText(info->item.hItem, info->item.pszText);
|
||||||
nt->Loc->setName(tStrToUtf8(info->item.pszText));
|
nt->Loc->setName(NLMISC::tStrToUtf8(info->item.pszText));
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case CNodeType::locatedBindable:
|
case CNodeType::locatedBindable:
|
||||||
|
@ -1330,7 +1330,7 @@ void CParticleTreeCtrl::OnEndlabeledit(NMHDR* pNMHDR, LRESULT* pResult)
|
||||||
nlassert(getOwnerNode(nt));
|
nlassert(getOwnerNode(nt));
|
||||||
getOwnerNode(nt)->setModified(true);
|
getOwnerNode(nt)->setModified(true);
|
||||||
this->SetItemText(info->item.hItem, info->item.pszText);
|
this->SetItemText(info->item.hItem, info->item.pszText);
|
||||||
nt->Bind->setName(tStrToUtf8(info->item.pszText));
|
nt->Bind->setName(NLMISC::tStrToUtf8(info->item.pszText));
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
@ -1466,7 +1466,7 @@ void CParticleTreeCtrl::updateCaption(CParticleWorkspace::CNode &node)
|
||||||
HTREEITEM item = getTreeItem(&node);
|
HTREEITEM item = getTreeItem(&node);
|
||||||
if (!item) return;
|
if (!item) return;
|
||||||
// update name of ps to dipslay a star in front of it (this tells that the ps has been modified)
|
// update name of ps to dipslay a star in front of it (this tells that the ps has been modified)
|
||||||
SetItemText(item, utf8ToTStr(computeCaption(node)));
|
SetItemText(item, nlUtf8ToTStr(computeCaption(node)));
|
||||||
}
|
}
|
||||||
|
|
||||||
//****************************************************************************************************************
|
//****************************************************************************************************************
|
||||||
|
@ -1545,7 +1545,7 @@ void CParticleTreeCtrl::insertNewPS(CParticleWorkspace &pws)
|
||||||
while (pos)
|
while (pos)
|
||||||
{
|
{
|
||||||
CString path = fd.GetNextPathName(pos);
|
CString path = fd.GetNextPathName(pos);
|
||||||
CParticleWorkspace::CNode *node = pws.addNode(tStrToUtf8(path));
|
CParticleWorkspace::CNode *node = pws.addNode(NLMISC::tStrToUtf8(path));
|
||||||
if (!node)
|
if (!node)
|
||||||
{
|
{
|
||||||
if (diplayNodeAlreadyInserted)
|
if (diplayNodeAlreadyInserted)
|
||||||
|
@ -1558,7 +1558,7 @@ void CParticleTreeCtrl::insertNewPS(CParticleWorkspace &pws)
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
MessageBox(CString(utf8ToTStr(NLMISC::CFile::getFilename(tStrToUtf8(path)))) + getStrRsc(IDS_PS_ALREADY_INSERTED), getStrRsc(IDS_ERROR), MB_OK|MB_ICONEXCLAMATION);
|
MessageBox(CString(nlUtf8ToTStr(NLMISC::CFile::getFilename(NLMISC::tStrToUtf8(path)))) + getStrRsc(IDS_PS_ALREADY_INSERTED), getStrRsc(IDS_ERROR), MB_OK | MB_ICONEXCLAMATION);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
continue;
|
continue;
|
||||||
|
@ -1593,7 +1593,7 @@ void CParticleTreeCtrl::insertNewPS(CParticleWorkspace &pws)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
// update modified state
|
// update modified state
|
||||||
SetItemText(GetRootItem(), utf8ToTStr(computeCaption(pws)));
|
SetItemText(GetRootItem(), nlUtf8ToTStr(computeCaption(pws)));
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -1736,7 +1736,7 @@ void CParticleTreeCtrl::OnBeginlabeledit(NMHDR* pNMHDR, LRESULT* pResult)
|
||||||
switch (nt->Type)
|
switch (nt->Type)
|
||||||
{
|
{
|
||||||
case CNodeType::workspace:
|
case CNodeType::workspace:
|
||||||
pEdit->SetWindowText(utf8ToTStr(nt->WS->getName()));
|
pEdit->SetWindowText(nlUtf8ToTStr(nt->WS->getName()));
|
||||||
break;
|
break;
|
||||||
case CNodeType::particleSystem:
|
case CNodeType::particleSystem:
|
||||||
{
|
{
|
||||||
|
@ -1747,18 +1747,18 @@ void CParticleTreeCtrl::OnBeginlabeledit(NMHDR* pNMHDR, LRESULT* pResult)
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
pEdit->SetWindowText(utf8ToTStr(nt->PS->getPSPointer()->getName()));
|
pEdit->SetWindowText(nlUtf8ToTStr(nt->PS->getPSPointer()->getName()));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case CNodeType::located:
|
case CNodeType::located:
|
||||||
{
|
{
|
||||||
pEdit->SetWindowText(utf8ToTStr(nt->Loc->getName()));
|
pEdit->SetWindowText(nlUtf8ToTStr(nt->Loc->getName()));
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case CNodeType::locatedBindable:
|
case CNodeType::locatedBindable:
|
||||||
{
|
{
|
||||||
pEdit->SetWindowText(utf8ToTStr(nt->Bind->getName()));
|
pEdit->SetWindowText(nlUtf8ToTStr(nt->Bind->getName()));
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
@ -1855,10 +1855,10 @@ void CParticleTreeCtrl::updateAllCaptions()
|
||||||
switch(nt->Type)
|
switch(nt->Type)
|
||||||
{
|
{
|
||||||
case CNodeType::particleSystem:
|
case CNodeType::particleSystem:
|
||||||
SetItemText(curr, utf8ToTStr(computeCaption(*nt->PS)));
|
SetItemText(curr, nlUtf8ToTStr(computeCaption(*nt->PS)));
|
||||||
break;
|
break;
|
||||||
case CNodeType::workspace:
|
case CNodeType::workspace:
|
||||||
SetItemText(curr, utf8ToTStr(computeCaption(*nt->WS)));
|
SetItemText(curr, nlUtf8ToTStr(computeCaption(*nt->WS)));
|
||||||
break;
|
break;
|
||||||
case CNodeType::located:
|
case CNodeType::located:
|
||||||
case CNodeType::locatedBindable:
|
case CNodeType::locatedBindable:
|
||||||
|
|
|
@ -371,13 +371,13 @@ CParticleWorkspace::CNode *CParticleWorkspace::addNode(const std::string &filena
|
||||||
TCHAR resultPath[MAX_PATH];
|
TCHAR resultPath[MAX_PATH];
|
||||||
std::string dosPath = NLMISC::CPath::standardizeDosPath(getPath());
|
std::string dosPath = NLMISC::CPath::standardizeDosPath(getPath());
|
||||||
std::string relativePath;
|
std::string relativePath;
|
||||||
if (!PathRelativePathTo(resultPath, utf8ToTStr(dosPath), FILE_ATTRIBUTE_DIRECTORY, utf8ToTStr(filenameWithFullPath), 0))
|
if (!PathRelativePathTo(resultPath, nlUtf8ToTStr(dosPath), FILE_ATTRIBUTE_DIRECTORY, nlUtf8ToTStr(filenameWithFullPath), 0))
|
||||||
{
|
{
|
||||||
relativePath = filenameWithFullPath;
|
relativePath = filenameWithFullPath;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
relativePath = tStrToUtf8(resultPath);
|
relativePath = NLMISC::tStrToUtf8(resultPath);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (relativePath.size() >= 2)
|
if (relativePath.size() >= 2)
|
||||||
|
|
|
@ -74,7 +74,7 @@ BOOL CPickSound::OnInitDialog()
|
||||||
|
|
||||||
for (TNameVect::iterator it = _Names.begin(); it != _Names.end(); ++it)
|
for (TNameVect::iterator it = _Names.begin(); it != _Names.end(); ++it)
|
||||||
{
|
{
|
||||||
m_NameList.AddString(utf8ToTStr((*it).toString()));
|
m_NameList.AddString(nlUtf8ToTStr((*it).toString()));
|
||||||
}
|
}
|
||||||
|
|
||||||
_Timer = SetTimer (1, 100, NULL);
|
_Timer = SetTimer (1, 100, NULL);
|
||||||
|
@ -111,7 +111,7 @@ void CPickSound::OnSelchange()
|
||||||
nlassert(m_NameList.GetTextLen(m_NameList.GetCurSel()) < 1024);
|
nlassert(m_NameList.GetTextLen(m_NameList.GetCurSel()) < 1024);
|
||||||
|
|
||||||
m_NameList.GetText(m_NameList.GetCurSel(), str);
|
m_NameList.GetText(m_NameList.GetCurSel(), str);
|
||||||
_CurrName = NLMISC::CSheetId(tStrToUtf8(str), "sound");
|
_CurrName = NLMISC::CSheetId(NLMISC::tStrToUtf8(str), "sound");
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -123,7 +123,7 @@ void CPickSound::OnPlaySound()
|
||||||
stopCurrSource();
|
stopCurrSource();
|
||||||
CString sName;
|
CString sName;
|
||||||
m_NameList.GetText(curSel, sName);
|
m_NameList.GetText(curSel, sName);
|
||||||
CSoundSystem::create(tStrToUtf8(sName));
|
CSoundSystem::create(NLMISC::tStrToUtf8(sName));
|
||||||
}
|
}
|
||||||
|
|
||||||
//========================================================================================
|
//========================================================================================
|
||||||
|
@ -159,7 +159,7 @@ void CPickSound::OnDblclkList()
|
||||||
stopCurrSource();
|
stopCurrSource();
|
||||||
CString sName;
|
CString sName;
|
||||||
m_NameList.GetText(curSel, sName);
|
m_NameList.GetText(curSel, sName);
|
||||||
_CurrSource = CSoundSystem::create(tStrToUtf8(sName));
|
_CurrSource = CSoundSystem::create(NLMISC::tStrToUtf8(sName));
|
||||||
}
|
}
|
||||||
|
|
||||||
//========================================================================================
|
//========================================================================================
|
||||||
|
|
|
@ -126,7 +126,7 @@ void CPrecomputedRotationsDlg::OnUpdateMinRotSpeed()
|
||||||
nlassert(_RotatedParticle);
|
nlassert(_RotatedParticle);
|
||||||
UpdateData();
|
UpdateData();
|
||||||
float newValue, valueMin, valueMax;
|
float newValue, valueMin, valueMax;
|
||||||
if (NLMISC::fromString(tStrToUtf8(m_RotSpeedMin), newValue))
|
if (NLMISC::fromString(NLMISC::tStrToUtf8(m_RotSpeedMin), newValue))
|
||||||
{
|
{
|
||||||
uint32 nbModels = _RotatedParticle->checkHintRotateTheSame(valueMin, valueMax);
|
uint32 nbModels = _RotatedParticle->checkHintRotateTheSame(valueMin, valueMax);
|
||||||
valueMin = newValue;
|
valueMin = newValue;
|
||||||
|
@ -146,7 +146,7 @@ void CPrecomputedRotationsDlg::OnUpdateMaxRotSpeed()
|
||||||
nlassert(_RotatedParticle);
|
nlassert(_RotatedParticle);
|
||||||
UpdateData();
|
UpdateData();
|
||||||
float newValue, valueMin, valueMax;
|
float newValue, valueMin, valueMax;
|
||||||
if (NLMISC::fromString(tStrToUtf8(m_RotSpeedMax), newValue))
|
if (NLMISC::fromString(NLMISC::tStrToUtf8(m_RotSpeedMax), newValue))
|
||||||
{
|
{
|
||||||
uint32 nbModels = _RotatedParticle->checkHintRotateTheSame(valueMin, valueMax);
|
uint32 nbModels = _RotatedParticle->checkHintRotateTheSame(valueMin, valueMax);
|
||||||
valueMax = newValue;
|
valueMax = newValue;
|
||||||
|
@ -167,7 +167,7 @@ void CPrecomputedRotationsDlg::OnUpdateNbModels()
|
||||||
UpdateData();
|
UpdateData();
|
||||||
float valueMin, valueMax;
|
float valueMin, valueMax;
|
||||||
sint32 newNbModels;
|
sint32 newNbModels;
|
||||||
bool valid = (NLMISC::fromString(tStrToUtf8(m_NbModels), newNbModels) && newNbModels > 0);
|
bool valid = (NLMISC::fromString(NLMISC::tStrToUtf8(m_NbModels), newNbModels) && newNbModels > 0);
|
||||||
if (dynamic_cast<NL3D::CPSConstraintMesh *>(_RotatedParticle))
|
if (dynamic_cast<NL3D::CPSConstraintMesh *>(_RotatedParticle))
|
||||||
{
|
{
|
||||||
valid &= (newNbModels < NL3D::ConstraintMeshMaxNumPrerotatedModels);
|
valid &= (newNbModels < NL3D::ConstraintMeshMaxNumPrerotatedModels);
|
||||||
|
|
|
@ -120,7 +120,7 @@ void CPSMoverDlg::OnUpdateXpos()
|
||||||
UpdateData();
|
UpdateData();
|
||||||
NLMISC::CVector &pos = _EditedLocated->getPos()[_EditedLocatedIndex];
|
NLMISC::CVector &pos = _EditedLocated->getPos()[_EditedLocatedIndex];
|
||||||
float x;
|
float x;
|
||||||
if (NLMISC::fromString(tStrToUtf8(m_X), x))
|
if (NLMISC::fromString(NLMISC::tStrToUtf8(m_X), x))
|
||||||
{
|
{
|
||||||
pos.x = x;
|
pos.x = x;
|
||||||
updateListener();
|
updateListener();
|
||||||
|
@ -137,7 +137,7 @@ void CPSMoverDlg::OnUpdateYpos()
|
||||||
UpdateData();
|
UpdateData();
|
||||||
NLMISC::CVector &pos = _EditedLocated->getPos()[_EditedLocatedIndex];
|
NLMISC::CVector &pos = _EditedLocated->getPos()[_EditedLocatedIndex];
|
||||||
float y;
|
float y;
|
||||||
if (NLMISC::fromString(tStrToUtf8(m_Y), y))
|
if (NLMISC::fromString(NLMISC::tStrToUtf8(m_Y), y))
|
||||||
{
|
{
|
||||||
pos.y = y;
|
pos.y = y;
|
||||||
updateListener();
|
updateListener();
|
||||||
|
@ -154,7 +154,7 @@ void CPSMoverDlg::OnUpdateZpos()
|
||||||
UpdateData();
|
UpdateData();
|
||||||
NLMISC::CVector &pos = _EditedLocated->getPos()[_EditedLocatedIndex];
|
NLMISC::CVector &pos = _EditedLocated->getPos()[_EditedLocatedIndex];
|
||||||
float z;
|
float z;
|
||||||
if (NLMISC::fromString(tStrToUtf8(m_Z), z))
|
if (NLMISC::fromString(NLMISC::tStrToUtf8(m_Z), z))
|
||||||
{
|
{
|
||||||
pos.z = z;
|
pos.z = z;
|
||||||
updateListener();
|
updateListener();
|
||||||
|
@ -178,7 +178,7 @@ BOOL CPSMoverDlg::OnInitDialog()
|
||||||
{
|
{
|
||||||
if (dynamic_cast<NL3D::IPSMover *>(_EditedLocated->getBoundObject(k)))
|
if (dynamic_cast<NL3D::IPSMover *>(_EditedLocated->getBoundObject(k)))
|
||||||
{
|
{
|
||||||
uint insertedLine = m_SubComponentCtrl.AddString(utf8ToTStr(_EditedLocated->getBoundObject(k)->getName()));
|
uint insertedLine = m_SubComponentCtrl.AddString(nlUtf8ToTStr(_EditedLocated->getBoundObject(k)->getName()));
|
||||||
m_SubComponentCtrl.SetItemData(insertedLine, (DWORD_PTR) _EditedLocated->getBoundObject(k));
|
m_SubComponentCtrl.SetItemData(insertedLine, (DWORD_PTR) _EditedLocated->getBoundObject(k));
|
||||||
++nbCandidates;
|
++nbCandidates;
|
||||||
}
|
}
|
||||||
|
|
|
@ -84,7 +84,7 @@ void CSchemeBankDlg::buildList()
|
||||||
SchemeManager.getSchemes(_Type, schemes);
|
SchemeManager.getSchemes(_Type, schemes);
|
||||||
for (TSchemeVect::const_iterator it = schemes.begin(); it != schemes.end(); ++it)
|
for (TSchemeVect::const_iterator it = schemes.begin(); it != schemes.end(); ++it)
|
||||||
{
|
{
|
||||||
int index = m_SchemeList.AddString(utf8ToTStr(it->first));
|
int index = m_SchemeList.AddString(nlUtf8ToTStr(it->first));
|
||||||
m_SchemeList.SetItemData(index, (DWORD_PTR) it->second);
|
m_SchemeList.SetItemData(index, (DWORD_PTR) it->second);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -99,18 +99,18 @@ void CSchemeBankDlg::OnSaveBank()
|
||||||
if (fd.DoModal() == IDOK)
|
if (fd.DoModal() == IDOK)
|
||||||
{
|
{
|
||||||
// Add search path for the texture
|
// Add search path for the texture
|
||||||
NLMISC::CPath::addSearchPath (NLMISC::CFile::getPath(tStrToUtf8(fd.GetPathName())));
|
NLMISC::CPath::addSearchPath(NLMISC::CFile::getPath(NLMISC::tStrToUtf8(fd.GetPathName())));
|
||||||
|
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
NLMISC::COFile iF;
|
NLMISC::COFile iF;
|
||||||
iF.open(tStrToUtf8(fd.GetFileName()));
|
iF.open(NLMISC::tStrToUtf8(fd.GetFileName()));
|
||||||
iF.serial(SchemeManager);
|
iF.serial(SchemeManager);
|
||||||
}
|
}
|
||||||
catch (const std::exception &e)
|
catch (const std::exception &e)
|
||||||
{
|
{
|
||||||
std::string message = NLMISC::toString("Error saving scheme bank : %s", e.what());
|
std::string message = NLMISC::toString("Error saving scheme bank : %s", e.what());
|
||||||
MessageBox(utf8ToTStr(message), _T("Object viewer"), MB_ICONEXCLAMATION | MB_OK);
|
MessageBox(nlUtf8ToTStr(message), _T("Object viewer"), MB_ICONEXCLAMATION | MB_OK);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -124,20 +124,20 @@ void CSchemeBankDlg::OnLoadBank()
|
||||||
if (fd.DoModal() == IDOK)
|
if (fd.DoModal() == IDOK)
|
||||||
{
|
{
|
||||||
// Add search path for the texture
|
// Add search path for the texture
|
||||||
NLMISC::CPath::addSearchPath(NLMISC::CFile::getPath(tStrToUtf8(fd.GetPathName())));
|
NLMISC::CPath::addSearchPath(NLMISC::CFile::getPath(NLMISC::tStrToUtf8(fd.GetPathName())));
|
||||||
|
|
||||||
CSchemeManager sm;
|
CSchemeManager sm;
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
NLMISC::CIFile iF;
|
NLMISC::CIFile iF;
|
||||||
iF.open(NLMISC::CPath::lookup(tStrToUtf8(fd.GetFileName())));
|
iF.open(NLMISC::CPath::lookup(NLMISC::tStrToUtf8(fd.GetFileName())));
|
||||||
iF.serial(sm);
|
iF.serial(sm);
|
||||||
SchemeManager.swap(sm);
|
SchemeManager.swap(sm);
|
||||||
}
|
}
|
||||||
catch (const std::exception &e)
|
catch (const std::exception &e)
|
||||||
{
|
{
|
||||||
std::string message = NLMISC::toString("Error loading scheme bank : %s", e.what());
|
std::string message = NLMISC::toString("Error loading scheme bank : %s", e.what());
|
||||||
MessageBox(utf8ToTStr(message), _T("Object viewer"), MB_ICONEXCLAMATION | MB_OK);
|
MessageBox(nlUtf8ToTStr(message), _T("Object viewer"), MB_ICONEXCLAMATION | MB_OK);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
buildList();
|
buildList();
|
||||||
|
@ -167,7 +167,7 @@ void CSchemeBankDlg::OnRename()
|
||||||
SchemeManager.rename(scheme, cn.getName());
|
SchemeManager.rename(scheme, cn.getName());
|
||||||
int curSel = m_SchemeList.GetCurSel();
|
int curSel = m_SchemeList.GetCurSel();
|
||||||
m_SchemeList.DeleteString(curSel);
|
m_SchemeList.DeleteString(curSel);
|
||||||
int insertedPos = m_SchemeList.InsertString(curSel, utf8ToTStr(cn.getName()));
|
int insertedPos = m_SchemeList.InsertString(curSel, nlUtf8ToTStr(cn.getName()));
|
||||||
m_SchemeList.SetCurSel(insertedPos);
|
m_SchemeList.SetCurSel(insertedPos);
|
||||||
m_SchemeList.Invalidate();
|
m_SchemeList.Invalidate();
|
||||||
}
|
}
|
||||||
|
|
|
@ -77,14 +77,14 @@ BOOL CSelectString::OnInitDialog()
|
||||||
CDialog::OnInitDialog();
|
CDialog::OnInitDialog();
|
||||||
|
|
||||||
// Change title
|
// Change title
|
||||||
SetWindowText (utf8ToTStr(Title));
|
SetWindowText(nlUtf8ToTStr(Title));
|
||||||
|
|
||||||
// Empty button ?
|
// Empty button ?
|
||||||
EmptyCtrl.ShowWindow (Empty?SW_SHOW:SW_HIDE);
|
EmptyCtrl.ShowWindow (Empty?SW_SHOW:SW_HIDE);
|
||||||
|
|
||||||
// Add string
|
// Add string
|
||||||
for (uint s=0; s<Strings.size(); s++)
|
for (uint s=0; s<Strings.size(); s++)
|
||||||
ListCtrl.InsertString (-1, utf8ToTStr(Strings[s]));
|
ListCtrl.InsertString(-1, nlUtf8ToTStr(Strings[s]));
|
||||||
|
|
||||||
return TRUE; // return TRUE unless you set the focus to a control
|
return TRUE; // return TRUE unless you set the focus to a control
|
||||||
// EXCEPTION: OCX Property Pages should return FALSE
|
// EXCEPTION: OCX Property Pages should return FALSE
|
||||||
|
|
|
@ -209,7 +209,7 @@ void CSkeletonScaleDlg::setSkeletonToEdit(NL3D::CSkeletonModel *skel, const std
|
||||||
name = tabStr + name;
|
name = tabStr + name;
|
||||||
|
|
||||||
// append to the list
|
// append to the list
|
||||||
_BoneList.AddString(utf8ToTStr(name));
|
_BoneList.AddString(nlUtf8ToTStr(name));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -404,7 +404,7 @@ void CSkeletonScaleDlg::applyScaleSlider(sint scrollValue)
|
||||||
|
|
||||||
// update marker text
|
// update marker text
|
||||||
std::string str = NLMISC::toString("%d%%", (sint)(factor*100));
|
std::string str = NLMISC::toString("%d%%", (sint)(factor*100));
|
||||||
_StaticScaleMarkers[_SliderEdited]->SetWindowText(utf8ToTStr(str));
|
_StaticScaleMarkers[_SliderEdited]->SetWindowText(nlUtf8ToTStr(str));
|
||||||
}
|
}
|
||||||
|
|
||||||
// ***************************************************************************
|
// ***************************************************************************
|
||||||
|
@ -717,7 +717,7 @@ void CSkeletonScaleDlg::updateScalesFromText(UINT ctrlId)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
// get the scale info
|
// get the scale info
|
||||||
std::string str = tStrToUtf8(*_ScaleEdits[sid]);
|
std::string str = NLMISC::tStrToUtf8(*_ScaleEdits[sid]);
|
||||||
if(str.empty())
|
if(str.empty())
|
||||||
return;
|
return;
|
||||||
float f;
|
float f;
|
||||||
|
@ -846,13 +846,13 @@ void CSkeletonScaleDlg::OnSsdButtonSaveas()
|
||||||
return;
|
return;
|
||||||
|
|
||||||
// choose the file
|
// choose the file
|
||||||
CFileDialog fd(FALSE, _T("skel"), utf8ToTStr(_SkeletonFileName), OFN_OVERWRITEPROMPT, _T("SkelFiles (*.skel)|*.skel|All Files (*.*)|*.*||"), this) ;
|
CFileDialog fd(FALSE, _T("skel"), nlUtf8ToTStr(_SkeletonFileName), OFN_OVERWRITEPROMPT, _T("SkelFiles (*.skel)|*.skel|All Files (*.*)|*.*||"), this);
|
||||||
fd.m_ofn.lpstrTitle = _T("Save As Skeleton");
|
fd.m_ofn.lpstrTitle = _T("Save As Skeleton");
|
||||||
if (fd.DoModal() == IDOK)
|
if (fd.DoModal() == IDOK)
|
||||||
{
|
{
|
||||||
NLMISC::COFile f;
|
NLMISC::COFile f;
|
||||||
|
|
||||||
if( f.open(tStrToUtf8(fd.GetPathName())) )
|
if (f.open(NLMISC::tStrToUtf8(fd.GetPathName())))
|
||||||
{
|
{
|
||||||
if(saveCurrentInStream(f))
|
if(saveCurrentInStream(f))
|
||||||
{
|
{
|
||||||
|
@ -862,7 +862,7 @@ void CSkeletonScaleDlg::OnSsdButtonSaveas()
|
||||||
}
|
}
|
||||||
|
|
||||||
// bkup the valid fileName (new file edited)
|
// bkup the valid fileName (new file edited)
|
||||||
_SkeletonFileName= tStrToUtf8(fd.GetPathName());
|
_SkeletonFileName = NLMISC::tStrToUtf8(fd.GetPathName());
|
||||||
_StaticFileName= _SkeletonFileName.c_str();
|
_StaticFileName= _SkeletonFileName.c_str();
|
||||||
UpdateData(FALSE);
|
UpdateData(FALSE);
|
||||||
}
|
}
|
||||||
|
@ -1228,13 +1228,13 @@ void CSkeletonScaleDlg::OnSsdButtonSaveScale()
|
||||||
std::string defaultFileName = _SkeletonFileName;
|
std::string defaultFileName = _SkeletonFileName;
|
||||||
NLMISC::strFindReplace(defaultFileName, ".skel", ".scale");
|
NLMISC::strFindReplace(defaultFileName, ".skel", ".scale");
|
||||||
|
|
||||||
CFileDialog fd(FALSE, _T("scale"), utf8ToTStr(defaultFileName), OFN_OVERWRITEPROMPT, _T("SkelScaleFiles (*.scale)|*.scale|All Files (*.*)|*.*||"), this) ;
|
CFileDialog fd(FALSE, _T("scale"), nlUtf8ToTStr(defaultFileName), OFN_OVERWRITEPROMPT, _T("SkelScaleFiles (*.scale)|*.scale|All Files (*.*)|*.*||"), this);
|
||||||
fd.m_ofn.lpstrTitle = _T("Save As Skeleton Scale File");
|
fd.m_ofn.lpstrTitle = _T("Save As Skeleton Scale File");
|
||||||
|
|
||||||
if (fd.DoModal() == IDOK)
|
if (fd.DoModal() == IDOK)
|
||||||
{
|
{
|
||||||
NLMISC::COFile f;
|
NLMISC::COFile f;
|
||||||
if (f.open(tStrToUtf8(fd.GetPathName())))
|
if (f.open(NLMISC::tStrToUtf8(fd.GetPathName())))
|
||||||
{
|
{
|
||||||
saveSkelScaleInStream(f);
|
saveSkelScaleInStream(f);
|
||||||
}
|
}
|
||||||
|
@ -1256,13 +1256,13 @@ void CSkeletonScaleDlg::OnSsdButtonLoadScale()
|
||||||
std::string defaultFileName= _SkeletonFileName;
|
std::string defaultFileName= _SkeletonFileName;
|
||||||
NLMISC::strFindReplace(defaultFileName, ".skel", ".scale");
|
NLMISC::strFindReplace(defaultFileName, ".skel", ".scale");
|
||||||
|
|
||||||
CFileDialog fd(TRUE, _T("scale"), utf8ToTStr(defaultFileName), 0, _T("SkelScaleFiles (*.scale)|*.scale|All Files (*.*)|*.*||"), this) ;
|
CFileDialog fd(TRUE, _T("scale"), nlUtf8ToTStr(defaultFileName), 0, _T("SkelScaleFiles (*.scale)|*.scale|All Files (*.*)|*.*||"), this);
|
||||||
fd.m_ofn.lpstrTitle= _T("Load a Skeleton Scale File");
|
fd.m_ofn.lpstrTitle= _T("Load a Skeleton Scale File");
|
||||||
|
|
||||||
if (fd.DoModal() == IDOK)
|
if (fd.DoModal() == IDOK)
|
||||||
{
|
{
|
||||||
NLMISC::CIFile f;
|
NLMISC::CIFile f;
|
||||||
if (f.open(tStrToUtf8(fd.GetPathName())))
|
if (f.open(NLMISC::tStrToUtf8(fd.GetPathName())))
|
||||||
{
|
{
|
||||||
loadSkelScaleFromStream(f);
|
loadSkelScaleFromStream(f);
|
||||||
}
|
}
|
||||||
|
|
|
@ -472,7 +472,7 @@ void CSlotDlg::setWindowName ()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
GetDlgItem (IDC_SLOT_NAME)->SetWindowText (utf8ToTStr(tmp));
|
GetDlgItem(IDC_SLOT_NAME)->SetWindowText(nlUtf8ToTStr(tmp));
|
||||||
}
|
}
|
||||||
|
|
||||||
// ***************************************************************************
|
// ***************************************************************************
|
||||||
|
|
|
@ -183,7 +183,7 @@ void CSnapshotToolDlg::fromRegistry()
|
||||||
|
|
||||||
for (uint k = 0; k < filterList.size(); ++k)
|
for (uint k = 0; k < filterList.size(); ++k)
|
||||||
{
|
{
|
||||||
m_Filters.AddString(utf8ToTStr(filterList[k]));
|
m_Filters.AddString(nlUtf8ToTStr(filterList[k]));
|
||||||
}
|
}
|
||||||
|
|
||||||
integralTypeFromRegistry(hKey, _T("RecurseSubFolder"), (int &) m_RecurseSubFolder, FALSE);
|
integralTypeFromRegistry(hKey, _T("RecurseSubFolder"), (int &) m_RecurseSubFolder, FALSE);
|
||||||
|
@ -597,7 +597,7 @@ void CSnapshotToolDlg::OnTimer(UINT_PTR nIDEvent)
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
CShapeStream ss;
|
CShapeStream ss;
|
||||||
m_Log.AddString(utf8ToTStr(_FilteredFiles[0]));
|
m_Log.AddString(nlUtf8ToTStr(_FilteredFiles[0]));
|
||||||
CIFile stream(_FilteredFiles[0]);
|
CIFile stream(_FilteredFiles[0]);
|
||||||
ss.serial(stream);
|
ss.serial(stream);
|
||||||
nlassert(ss.getShapePointer());
|
nlassert(ss.getShapePointer());
|
||||||
|
|
|
@ -78,7 +78,7 @@ void CSoundAnimDlg::handle()
|
||||||
{
|
{
|
||||||
float sec = _AnimationDlg->getTime();
|
float sec = _AnimationDlg->getTime();
|
||||||
std::string text = toString("time: %.3f", sec);
|
std::string text = toString("time: %.3f", sec);
|
||||||
GetDlgItem(IDC_SOUNDANIMINFO)->SetWindowText(utf8ToTStr(text));
|
GetDlgItem(IDC_SOUNDANIMINFO)->SetWindowText(nlUtf8ToTStr(text));
|
||||||
|
|
||||||
_AnimView.updateCursor();
|
_AnimView.updateCursor();
|
||||||
}
|
}
|
||||||
|
@ -136,7 +136,7 @@ void CSoundAnimDlg::updateSounds()
|
||||||
|
|
||||||
for (iter = sounds.begin(); iter != sounds.end(); iter++)
|
for (iter = sounds.begin(); iter != sounds.end(); iter++)
|
||||||
{
|
{
|
||||||
list->AddString(utf8ToTStr((*iter).toString()));
|
list->AddString(nlUtf8ToTStr((*iter).toString()));
|
||||||
}
|
}
|
||||||
|
|
||||||
list->UpdateData();
|
list->UpdateData();
|
||||||
|
|
|
@ -217,7 +217,7 @@ void CSoundAnimView::save()
|
||||||
|
|
||||||
// Create a dialog
|
// Create a dialog
|
||||||
TCHAR BASED_CODE szFilter[] = _T("NeL Sound Animations (*.sound_anim)|*.sound_anim|All Files (*.*)|*.*||");
|
TCHAR BASED_CODE szFilter[] = _T("NeL Sound Animations (*.sound_anim)|*.sound_anim|All Files (*.*)|*.*||");
|
||||||
CFileDialog fileDlg( FALSE, _T(".sound_anim"), utf8ToTStr(filename), OFN_HIDEREADONLY|OFN_OVERWRITEPROMPT, szFilter);
|
CFileDialog fileDlg(FALSE, _T(".sound_anim"), nlUtf8ToTStr(filename), OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT, szFilter);
|
||||||
|
|
||||||
if (fileDlg.DoModal() == IDOK)
|
if (fileDlg.DoModal() == IDOK)
|
||||||
{
|
{
|
||||||
|
@ -236,7 +236,7 @@ void CSoundAnimView::save()
|
||||||
}
|
}
|
||||||
catch (const Exception& e)
|
catch (const Exception& e)
|
||||||
{
|
{
|
||||||
MessageBox (utf8ToTStr(e.what()), _T("NeL object viewer"), MB_OK|MB_ICONEXCLAMATION);
|
MessageBox(nlUtf8ToTStr(e.what()), _T("NeL object viewer"), MB_OK | MB_ICONEXCLAMATION);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -231,13 +231,13 @@ void CStartStopParticleSystem::updateUIFromState()
|
||||||
{
|
{
|
||||||
if (!_ActiveNode->getParentSkelName().empty())
|
if (!_ActiveNode->getParentSkelName().empty())
|
||||||
{
|
{
|
||||||
GetDlgItem(IDC_STICK_BONE)->SetWindowText(utf8ToTStr(_ActiveNode->getParentBoneName() + "." + _ActiveNode->getParentBoneName()));
|
GetDlgItem(IDC_STICK_BONE)->SetWindowText(nlUtf8ToTStr(_ActiveNode->getParentBoneName() + "." + _ActiveNode->getParentBoneName()));
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
GetDlgItem(IDC_STICK_BONE)->SetWindowText(_T(""));
|
GetDlgItem(IDC_STICK_BONE)->SetWindowText(_T(""));
|
||||||
}
|
}
|
||||||
GetDlgItem(IDC_ACTIVE_PS)->SetWindowText(utf8ToTStr(_ActiveNode->getFilename()));
|
GetDlgItem(IDC_ACTIVE_PS)->SetWindowText(nlUtf8ToTStr(_ActiveNode->getFilename()));
|
||||||
GetDlgItem(IDC_ENABLE_AUTO_COUNT)->EnableWindow(TRUE);
|
GetDlgItem(IDC_ENABLE_AUTO_COUNT)->EnableWindow(TRUE);
|
||||||
((CButton *) GetDlgItem(IDC_ENABLE_AUTO_COUNT))->SetCheck(getCurrPS()->getAutoCountFlag() ? 1 : 0);
|
((CButton *) GetDlgItem(IDC_ENABLE_AUTO_COUNT))->SetCheck(getCurrPS()->getAutoCountFlag() ? 1 : 0);
|
||||||
GetDlgItem(IDC_RESET_COUNT)->EnableWindow((_ActiveNode->getPSPointer()->getAutoCountFlag() && !_ActiveNode->getResetAutoCountFlag()) ? TRUE : FALSE);
|
GetDlgItem(IDC_RESET_COUNT)->EnableWindow((_ActiveNode->getPSPointer()->getAutoCountFlag() && !_ActiveNode->getResetAutoCountFlag()) ? TRUE : FALSE);
|
||||||
|
@ -844,7 +844,7 @@ void CStartStopParticleSystem::OnLinkToSkeleton()
|
||||||
uint boneIndex;
|
uint boneIndex;
|
||||||
std::string parentSkelName;
|
std::string parentSkelName;
|
||||||
std::string parentBoneName;
|
std::string parentBoneName;
|
||||||
if (ov->chooseBone(tStrToUtf8(chooseBoneForPS), skel, boneIndex, &parentSkelName, &parentBoneName))
|
if (ov->chooseBone(NLMISC::tStrToUtf8(chooseBoneForPS), skel, boneIndex, &parentSkelName, &parentBoneName))
|
||||||
{
|
{
|
||||||
_ParticleDlg->stickPSToSkeleton(_ActiveNode, skel, boneIndex, parentSkelName, parentBoneName);
|
_ParticleDlg->stickPSToSkeleton(_ActiveNode, skel, boneIndex, parentSkelName, parentBoneName);
|
||||||
}
|
}
|
||||||
|
@ -1017,11 +1017,11 @@ void CStartStopParticleSystem::OnBrowseAnim()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
std::vector<std::string> animList(animSet.begin(), animSet.end());
|
std::vector<std::string> animList(animSet.begin(), animSet.end());
|
||||||
CSelectString st(animList, tStrToUtf8(getStrRsc(IDS_SELECT_ANIMATION)), this, false);
|
CSelectString st(animList, NLMISC::tStrToUtf8(getStrRsc(IDS_SELECT_ANIMATION)), this, false);
|
||||||
if (st.DoModal() == IDOK && st.Selection != -1)
|
if (st.DoModal() == IDOK && st.Selection != -1)
|
||||||
{
|
{
|
||||||
m_TriggerAnim = animList[st.Selection].c_str();
|
m_TriggerAnim = animList[st.Selection].c_str();
|
||||||
_ActiveNode->setTriggerAnim(tStrToUtf8(m_TriggerAnim));
|
_ActiveNode->setTriggerAnim(NLMISC::tStrToUtf8(m_TriggerAnim));
|
||||||
GetDlgItem(IDC_CLEAR_ANIM)->EnableWindow(!_ActiveNode->getTriggerAnim().empty());
|
GetDlgItem(IDC_CLEAR_ANIM)->EnableWindow(!_ActiveNode->getTriggerAnim().empty());
|
||||||
}
|
}
|
||||||
_ParticleDlg->ParticleTreeCtrl->updateCaption(*_ActiveNode);
|
_ParticleDlg->ParticleTreeCtrl->updateCaption(*_ActiveNode);
|
||||||
|
|
|
@ -23,8 +23,13 @@
|
||||||
#endif // _MSC_VER > 1000
|
#endif // _MSC_VER > 1000
|
||||||
|
|
||||||
#define VC_EXTRALEAN // Exclude rarely-used stuff from Windows headers
|
#define VC_EXTRALEAN // Exclude rarely-used stuff from Windows headers
|
||||||
|
#define WIN32_LEAN_AND_MEAN
|
||||||
#define NOMINMAX
|
#define NOMINMAX
|
||||||
#define _WIN32_WINNT 0x0501
|
#ifdef _WIN64
|
||||||
|
#define _WIN32_WINNT 0x0600
|
||||||
|
#else
|
||||||
|
#define _WIN32_WINNT 0x0500
|
||||||
|
#endif
|
||||||
|
|
||||||
#include <afxwin.h> // MFC core and standard components
|
#include <afxwin.h> // MFC core and standard components
|
||||||
#include <afxext.h> // MFC extensions
|
#include <afxext.h> // MFC extensions
|
||||||
|
|
|
@ -179,22 +179,22 @@ void CTextureChooser::OnBrowseTexture()
|
||||||
{
|
{
|
||||||
texName = (static_cast<NL3D::CTextureFile *>(_Wrapper->get()))->getFileName();
|
texName = (static_cast<NL3D::CTextureFile *>(_Wrapper->get()))->getFileName();
|
||||||
}
|
}
|
||||||
CFileDialog fd(TRUE, _T(".tga"), utf8ToTStr(texName), 0, NULL, this);
|
CFileDialog fd(TRUE, _T(".tga"), nlUtf8ToTStr(texName), 0, NULL, this);
|
||||||
if (fd.DoModal() == IDOK)
|
if (fd.DoModal() == IDOK)
|
||||||
{
|
{
|
||||||
// Add search path for the texture
|
// Add search path for the texture
|
||||||
NLMISC::CPath::addSearchPath (NLMISC::CFile::getPath(tStrToUtf8(fd.GetPathName())));
|
NLMISC::CPath::addSearchPath(NLMISC::CFile::getPath(NLMISC::tStrToUtf8(fd.GetPathName())));
|
||||||
|
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
NL3D::CTextureFile *tf = new NL3D::CTextureFile(tStrToUtf8(fd.GetFileName()));
|
NL3D::CTextureFile *tf = new NL3D::CTextureFile(NLMISC::tStrToUtf8(fd.GetFileName()));
|
||||||
_Wrapper->setAndUpdateModifiedFlag(tf);
|
_Wrapper->setAndUpdateModifiedFlag(tf);
|
||||||
_Texture = tf;
|
_Texture = tf;
|
||||||
textureToBitmap();
|
textureToBitmap();
|
||||||
}
|
}
|
||||||
catch (const NLMISC::Exception &e)
|
catch (const NLMISC::Exception &e)
|
||||||
{
|
{
|
||||||
MessageBox(utf8ToTStr(e.what()), _T("error loading texture"));
|
MessageBox(nlUtf8ToTStr(e.what()), _T("error loading texture"));
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -249,7 +249,7 @@ BOOL CVegetableCopyDlg::OnInitDialog()
|
||||||
uint num= _VegetableDlg->getNumVegetables();
|
uint num= _VegetableDlg->getNumVegetables();
|
||||||
for(uint i=0; i<num; i++)
|
for(uint i=0; i<num; i++)
|
||||||
{
|
{
|
||||||
VegetableList.AddString(utf8ToTStr(_VegetableDlg->getVegetableName(i)));
|
VegetableList.AddString(nlUtf8ToTStr(_VegetableDlg->getVegetableName(i)));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -100,7 +100,7 @@ void CVegetableDensityPage::setVegetableToEdit(NL3D::CVegetable *vegetable)
|
||||||
{
|
{
|
||||||
// Init ShapeName
|
// Init ShapeName
|
||||||
// ----------
|
// ----------
|
||||||
StaticVegetableShape.SetWindowText(utf8ToTStr(_Vegetable->ShapeName));
|
StaticVegetableShape.SetWindowText(nlUtf8ToTStr(_Vegetable->ShapeName));
|
||||||
|
|
||||||
// init Creation Distance.
|
// init Creation Distance.
|
||||||
// ----------
|
// ----------
|
||||||
|
@ -228,7 +228,7 @@ void CVegetableDensityPage::updateAngleMinFromEditText()
|
||||||
TCHAR stmp[256];
|
TCHAR stmp[256];
|
||||||
AngleMinEdit.GetWindowText(stmp, 256);
|
AngleMinEdit.GetWindowText(stmp, 256);
|
||||||
float angleMin;
|
float angleMin;
|
||||||
NLMISC::fromString(tStrToUtf8(stmp), angleMin);
|
NLMISC::fromString(NLMISC::tStrToUtf8(stmp), angleMin);
|
||||||
NLMISC::clamp(angleMin, -90, 90);
|
NLMISC::clamp(angleMin, -90, 90);
|
||||||
// make a sinus, because 90 => 1, and -90 =>-1
|
// make a sinus, because 90 => 1, and -90 =>-1
|
||||||
float cosAngleMin= (float)sin(angleMin*NLMISC::Pi/180.f);
|
float cosAngleMin= (float)sin(angleMin*NLMISC::Pi/180.f);
|
||||||
|
@ -252,7 +252,7 @@ void CVegetableDensityPage::updateAngleMaxFromEditText()
|
||||||
TCHAR stmp[256];
|
TCHAR stmp[256];
|
||||||
AngleMaxEdit.GetWindowText(stmp, 256);
|
AngleMaxEdit.GetWindowText(stmp, 256);
|
||||||
float angleMax;
|
float angleMax;
|
||||||
NLMISC::fromString(tStrToUtf8(stmp), angleMax);
|
NLMISC::fromString(NLMISC::tStrToUtf8(stmp), angleMax);
|
||||||
NLMISC::clamp(angleMax, -90, 90);
|
NLMISC::clamp(angleMax, -90, 90);
|
||||||
// make a sinus, because 90 => 1, and -90 =>-1
|
// make a sinus, because 90 => 1, and -90 =>-1
|
||||||
float cosAngleMax= (float)sin(angleMax*NLMISC::Pi/180.f);
|
float cosAngleMax= (float)sin(angleMax*NLMISC::Pi/180.f);
|
||||||
|
@ -523,10 +523,10 @@ void CVegetableDensityPage::OnButtonVegetableBrowse()
|
||||||
if (fd.DoModal() == IDOK)
|
if (fd.DoModal() == IDOK)
|
||||||
{
|
{
|
||||||
// Add to the path
|
// Add to the path
|
||||||
std::string fileName = tStrToUtf8(fd.GetFileName());
|
std::string fileName = NLMISC::tStrToUtf8(fd.GetFileName());
|
||||||
|
|
||||||
// Add search path for the .veget
|
// Add search path for the .veget
|
||||||
std::string path = NLMISC::CFile::getPath(tStrToUtf8(fd.GetPathName()));
|
std::string path = NLMISC::CFile::getPath(NLMISC::tStrToUtf8(fd.GetPathName()));
|
||||||
NLMISC::CPath::addSearchPath (path);
|
NLMISC::CPath::addSearchPath (path);
|
||||||
|
|
||||||
try
|
try
|
||||||
|
@ -546,7 +546,7 @@ void CVegetableDensityPage::OnButtonVegetableBrowse()
|
||||||
}
|
}
|
||||||
catch (const NLMISC::EPathNotFound &ep)
|
catch (const NLMISC::EPathNotFound &ep)
|
||||||
{
|
{
|
||||||
MessageBox(utf8ToTStr(ep.what()), _T("Can't open file"));
|
MessageBox(nlUtf8ToTStr(ep.what()), _T("Can't open file"));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -196,7 +196,7 @@ void CVegetableDlg::updateCurSelVegetableName()
|
||||||
_Vegetables[id].updateVegetableName();
|
_Vegetables[id].updateVegetableName();
|
||||||
// replace name in the listBox: must delete, and re-insert
|
// replace name in the listBox: must delete, and re-insert
|
||||||
VegetableList.DeleteString(id);
|
VegetableList.DeleteString(id);
|
||||||
VegetableList.InsertString(id, utf8ToTStr(_Vegetables[id].VegetableName));
|
VegetableList.InsertString(id, nlUtf8ToTStr(_Vegetables[id].VegetableName));
|
||||||
VegetableList.SetCurSel(id);
|
VegetableList.SetCurSel(id);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -349,14 +349,14 @@ bool CVegetableDlg::loadVegetableSet(NL3D::CTileVegetableDesc &vegetSet, const
|
||||||
|
|
||||||
ok= true;
|
ok= true;
|
||||||
|
|
||||||
if( f.open(tStrToUtf8(fd.GetPathName())))
|
if (f.open(NLMISC::tStrToUtf8(fd.GetPathName())))
|
||||||
{
|
{
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
// read the vegetable
|
// read the vegetable
|
||||||
f.serial(vegetSet);
|
f.serial(vegetSet);
|
||||||
// bkup fileName.
|
// bkup fileName.
|
||||||
_LastVegetSetName = tStrToUtf8(fd.GetFileName());
|
_LastVegetSetName = NLMISC::tStrToUtf8(fd.GetFileName());
|
||||||
}
|
}
|
||||||
catch(const NLMISC::EStream &)
|
catch(const NLMISC::EStream &)
|
||||||
{
|
{
|
||||||
|
@ -439,7 +439,7 @@ void CVegetableDlg::appendVegetableSet(NL3D::CTileVegetableDesc &vegetSet)
|
||||||
_Vegetables[id].initVegetable(veget);
|
_Vegetables[id].initVegetable(veget);
|
||||||
|
|
||||||
// update view
|
// update view
|
||||||
VegetableList.AddString(utf8ToTStr(_Vegetables[id].VegetableName));
|
VegetableList.AddString(nlUtf8ToTStr(_Vegetables[id].VegetableName));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -529,7 +529,7 @@ void CVegetableDlg::OnButtonVegetableAdd()
|
||||||
_Vegetables[id].initDefaultVegetable();
|
_Vegetables[id].initDefaultVegetable();
|
||||||
|
|
||||||
// update view
|
// update view
|
||||||
VegetableList.AddString(utf8ToTStr(_Vegetables[id].VegetableName));
|
VegetableList.AddString(nlUtf8ToTStr(_Vegetables[id].VegetableName));
|
||||||
|
|
||||||
// update 3D view
|
// update 3D view
|
||||||
refreshVegetableDisplay();
|
refreshVegetableDisplay();
|
||||||
|
@ -559,7 +559,7 @@ void CVegetableDlg::OnButtonVegetableInsert()
|
||||||
_Vegetables[id].initDefaultVegetable();
|
_Vegetables[id].initDefaultVegetable();
|
||||||
|
|
||||||
// update view
|
// update view
|
||||||
VegetableList.InsertString(id, utf8ToTStr(_Vegetables[id].VegetableName));
|
VegetableList.InsertString(id, nlUtf8ToTStr(_Vegetables[id].VegetableName));
|
||||||
|
|
||||||
// update 3D view
|
// update 3D view
|
||||||
refreshVegetableDisplay();
|
refreshVegetableDisplay();
|
||||||
|
@ -611,7 +611,7 @@ void CVegetableDlg::OnButtonVegetableLoadDesc()
|
||||||
{
|
{
|
||||||
NLMISC::CIFile f;
|
NLMISC::CIFile f;
|
||||||
|
|
||||||
if( f.open(tStrToUtf8(fd.GetPathName())) )
|
if (f.open(NLMISC::tStrToUtf8(fd.GetPathName())))
|
||||||
{
|
{
|
||||||
NL3D::CVegetable veget;
|
NL3D::CVegetable veget;
|
||||||
try
|
try
|
||||||
|
@ -624,7 +624,7 @@ void CVegetableDlg::OnButtonVegetableLoadDesc()
|
||||||
_Vegetables[id].initVegetable(veget);
|
_Vegetables[id].initVegetable(veget);
|
||||||
|
|
||||||
// update view
|
// update view
|
||||||
VegetableList.AddString(utf8ToTStr(_Vegetables[id].VegetableName));
|
VegetableList.AddString(nlUtf8ToTStr(_Vegetables[id].VegetableName));
|
||||||
|
|
||||||
// update 3D view
|
// update 3D view
|
||||||
refreshVegetableDisplay();
|
refreshVegetableDisplay();
|
||||||
|
@ -651,13 +651,13 @@ void CVegetableDlg::OnButtonVegetableSaveDesc()
|
||||||
|
|
||||||
std::string fileName= _Vegetables[id].VegetableName + ".vegetdesc";
|
std::string fileName= _Vegetables[id].VegetableName + ".vegetdesc";
|
||||||
|
|
||||||
CFileDialog fd(FALSE, _T("vegetdesc"), utf8ToTStr(fileName), OFN_OVERWRITEPROMPT, _T("VegetDescFiles (*.vegetdesc)|*.vegetdesc|All Files (*.*)|*.*||"), this) ;
|
CFileDialog fd(FALSE, _T("vegetdesc"), nlUtf8ToTStr(fileName), OFN_OVERWRITEPROMPT, _T("VegetDescFiles (*.vegetdesc)|*.vegetdesc|All Files (*.*)|*.*||"), this);
|
||||||
fd.m_ofn.lpstrTitle = _T("Save Vegetable Descriptor");
|
fd.m_ofn.lpstrTitle = _T("Save Vegetable Descriptor");
|
||||||
if (fd.DoModal() == IDOK)
|
if (fd.DoModal() == IDOK)
|
||||||
{
|
{
|
||||||
NLMISC::COFile f;
|
NLMISC::COFile f;
|
||||||
|
|
||||||
if( f.open(tStrToUtf8(fd.GetPathName())) )
|
if (f.open(NLMISC::tStrToUtf8(fd.GetPathName())))
|
||||||
{
|
{
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
|
@ -722,13 +722,13 @@ void CVegetableDlg::OnButtonVegetableSaveSet()
|
||||||
buildVegetableSet(vegetSet);
|
buildVegetableSet(vegetSet);
|
||||||
|
|
||||||
// Then try to save it.
|
// Then try to save it.
|
||||||
CFileDialog fd(FALSE, _T("vegetset"), utf8ToTStr(_LastVegetSetName), OFN_OVERWRITEPROMPT, _T("VegetSetFiles (*.vegetset)|*.vegetset|All Files (*.*)|*.*||"), this) ;
|
CFileDialog fd(FALSE, _T("vegetset"), nlUtf8ToTStr(_LastVegetSetName), OFN_OVERWRITEPROMPT, _T("VegetSetFiles (*.vegetset)|*.vegetset|All Files (*.*)|*.*||"), this);
|
||||||
fd.m_ofn.lpstrTitle = _T("Save Vegetable Set");
|
fd.m_ofn.lpstrTitle = _T("Save Vegetable Set");
|
||||||
if (fd.DoModal() == IDOK)
|
if (fd.DoModal() == IDOK)
|
||||||
{
|
{
|
||||||
NLMISC::COFile f;
|
NLMISC::COFile f;
|
||||||
|
|
||||||
if( f.open(tStrToUtf8(fd.GetPathName())) )
|
if (f.open(NLMISC::tStrToUtf8(fd.GetPathName())))
|
||||||
{
|
{
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
|
|
|
@ -33,7 +33,7 @@ void CDirectEditableRangeFloat::init(uint32 x, uint32 y, CWnd *pParent)
|
||||||
|
|
||||||
CRect rect;
|
CRect rect;
|
||||||
rect.SetRect(x, y+10, x+dx, y+25);
|
rect.SetRect(x, y+10, x+dx, y+25);
|
||||||
_StaticText.Create(utf8ToTStr(_Title), WS_CHILD | WS_VISIBLE, rect, pParent);
|
_StaticText.Create(nlUtf8ToTStr(_Title), WS_CHILD | WS_VISIBLE, rect, pParent);
|
||||||
_StaticText.SetFont(pParent->GetFont());
|
_StaticText.SetFont(pParent->GetFont());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -154,7 +154,7 @@ BOOL CVegetableNoiseValueDlg::OnInitDialog()
|
||||||
|
|
||||||
|
|
||||||
// Set the name.
|
// Set the name.
|
||||||
NoiseValueName.SetWindowText(utf8ToTStr(_TitleName));
|
NoiseValueName.SetWindowText(nlUtf8ToTStr(_TitleName));
|
||||||
|
|
||||||
|
|
||||||
// if previously setuped, setup now the noiseValue.
|
// if previously setuped, setup now the noiseValue.
|
||||||
|
@ -264,5 +264,5 @@ void CVegetableNoiseValueDlg::applyScaleSlider(sint scrollValue)
|
||||||
_RandValue->updateValueFromReader();
|
_RandValue->updateValueFromReader();
|
||||||
|
|
||||||
// update marker text
|
// update marker text
|
||||||
StaticScaleMarker.SetWindowText(utf8ToTStr(NLMISC::toString("%d%%", (sint)(factor * 100))));
|
StaticScaleMarker.SetWindowText(nlUtf8ToTStr(NLMISC::toString("%d%%", (sint)(factor * 100))));
|
||||||
}
|
}
|
||||||
|
|
|
@ -63,7 +63,7 @@ BOOL CVegetableSelectDlg::OnInitDialog()
|
||||||
uint num= _VegetableDlg->getNumVegetables();
|
uint num= _VegetableDlg->getNumVegetables();
|
||||||
for(uint i=0; i<num; i++)
|
for(uint i=0; i<num; i++)
|
||||||
{
|
{
|
||||||
VegetableList.AddString(utf8ToTStr(_VegetableDlg->getVegetableName(i)));
|
VegetableList.AddString(nlUtf8ToTStr(_VegetableDlg->getVegetableName(i)));
|
||||||
}
|
}
|
||||||
|
|
||||||
return TRUE; // return TRUE unless you set the focus to a control
|
return TRUE; // return TRUE unless you set the focus to a control
|
||||||
|
|
|
@ -73,19 +73,19 @@ void CVegetableWindDlg::updateView()
|
||||||
|
|
||||||
// update Power.
|
// update Power.
|
||||||
a= _ObjViewer->getVegetableWindPower();
|
a= _ObjViewer->getVegetableWindPower();
|
||||||
StaticPower.SetWindowText(utf8ToTStr(NLMISC::toString("%.2f", a)));
|
StaticPower.SetWindowText(nlUtf8ToTStr(NLMISC::toString("%.2f", a)));
|
||||||
NLMISC::clamp(a, 0, NL_VEGETABLE_EDIT_WIND_MAX_POWER);
|
NLMISC::clamp(a, 0, NL_VEGETABLE_EDIT_WIND_MAX_POWER);
|
||||||
SliderPower.SetPos((sint)(a*NL_VEGETABLE_EDIT_WIND_SLIDER_RANGE / NL_VEGETABLE_EDIT_WIND_MAX_POWER));
|
SliderPower.SetPos((sint)(a*NL_VEGETABLE_EDIT_WIND_SLIDER_RANGE / NL_VEGETABLE_EDIT_WIND_MAX_POWER));
|
||||||
|
|
||||||
// update BendStart.
|
// update BendStart.
|
||||||
a= _ObjViewer->getVegetableWindBendStart();
|
a= _ObjViewer->getVegetableWindBendStart();
|
||||||
StaticBendStart.SetWindowText(utf8ToTStr(NLMISC::toString("%.2f", a)));
|
StaticBendStart.SetWindowText(nlUtf8ToTStr(NLMISC::toString("%.2f", a)));
|
||||||
NLMISC::clamp(a, 0, NL_VEGETABLE_EDIT_WIND_MAX_BENDSTART);
|
NLMISC::clamp(a, 0, NL_VEGETABLE_EDIT_WIND_MAX_BENDSTART);
|
||||||
SliderBendStart.SetPos((sint)(a*NL_VEGETABLE_EDIT_WIND_SLIDER_RANGE / NL_VEGETABLE_EDIT_WIND_MAX_BENDSTART));
|
SliderBendStart.SetPos((sint)(a*NL_VEGETABLE_EDIT_WIND_SLIDER_RANGE / NL_VEGETABLE_EDIT_WIND_MAX_BENDSTART));
|
||||||
|
|
||||||
// update Frequency.
|
// update Frequency.
|
||||||
a= _ObjViewer->getVegetableWindFrequency();
|
a= _ObjViewer->getVegetableWindFrequency();
|
||||||
StaticFrequency.SetWindowText(utf8ToTStr(NLMISC::toString("%.2f", a)));
|
StaticFrequency.SetWindowText(nlUtf8ToTStr(NLMISC::toString("%.2f", a)));
|
||||||
NLMISC::clamp(a, 0, NL_VEGETABLE_EDIT_WIND_MAX_FREQUENCY);
|
NLMISC::clamp(a, 0, NL_VEGETABLE_EDIT_WIND_MAX_FREQUENCY);
|
||||||
SliderFrequency.SetPos((sint)(a*NL_VEGETABLE_EDIT_WIND_SLIDER_RANGE / NL_VEGETABLE_EDIT_WIND_MAX_FREQUENCY));
|
SliderFrequency.SetPos((sint)(a*NL_VEGETABLE_EDIT_WIND_SLIDER_RANGE / NL_VEGETABLE_EDIT_WIND_MAX_FREQUENCY));
|
||||||
|
|
||||||
|
@ -129,20 +129,20 @@ void CVegetableWindDlg::OnHScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBa
|
||||||
{
|
{
|
||||||
a= (float)nPos * NL_VEGETABLE_EDIT_WIND_MAX_POWER / NL_VEGETABLE_EDIT_WIND_SLIDER_RANGE;
|
a= (float)nPos * NL_VEGETABLE_EDIT_WIND_MAX_POWER / NL_VEGETABLE_EDIT_WIND_SLIDER_RANGE;
|
||||||
_ObjViewer->setVegetableWindPower(a);
|
_ObjViewer->setVegetableWindPower(a);
|
||||||
StaticPower.SetWindowText(utf8ToTStr(NLMISC::toString("%.2f", a)));
|
StaticPower.SetWindowText(nlUtf8ToTStr(NLMISC::toString("%.2f", a)));
|
||||||
}
|
}
|
||||||
else if(sliderCtrl == &SliderBendStart)
|
else if(sliderCtrl == &SliderBendStart)
|
||||||
{
|
{
|
||||||
a= (float)nPos * NL_VEGETABLE_EDIT_WIND_MAX_BENDSTART / NL_VEGETABLE_EDIT_WIND_SLIDER_RANGE;
|
a= (float)nPos * NL_VEGETABLE_EDIT_WIND_MAX_BENDSTART / NL_VEGETABLE_EDIT_WIND_SLIDER_RANGE;
|
||||||
_ObjViewer->setVegetableWindBendStart(a);
|
_ObjViewer->setVegetableWindBendStart(a);
|
||||||
StaticBendStart.SetWindowText(utf8ToTStr(NLMISC::toString("%.2f", a)));
|
StaticBendStart.SetWindowText(nlUtf8ToTStr(NLMISC::toString("%.2f", a)));
|
||||||
}
|
}
|
||||||
else if(sliderCtrl == &SliderFrequency)
|
else if(sliderCtrl == &SliderFrequency)
|
||||||
{
|
{
|
||||||
|
|
||||||
a= (float)nPos * NL_VEGETABLE_EDIT_WIND_MAX_FREQUENCY / NL_VEGETABLE_EDIT_WIND_SLIDER_RANGE;
|
a= (float)nPos * NL_VEGETABLE_EDIT_WIND_MAX_FREQUENCY / NL_VEGETABLE_EDIT_WIND_SLIDER_RANGE;
|
||||||
_ObjViewer->setVegetableWindFrequency(a);
|
_ObjViewer->setVegetableWindFrequency(a);
|
||||||
StaticFrequency.SetWindowText(utf8ToTStr(NLMISC::toString("%.2f", a)));
|
StaticFrequency.SetWindowText(nlUtf8ToTStr(NLMISC::toString("%.2f", a)));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
|
|
|
@ -166,7 +166,7 @@ BOOL CWaterPoolEditor::OnInitDialog()
|
||||||
int CWaterPoolEditor::addPool(uint32 ID)
|
int CWaterPoolEditor::addPool(uint32 ID)
|
||||||
{
|
{
|
||||||
std::string poolId = NLMISC::toString("%d (%s)", ID, _Wpm->getPoolByID(ID).getName().c_str());
|
std::string poolId = NLMISC::toString("%d (%s)", ID, _Wpm->getPoolByID(ID).getName().c_str());
|
||||||
int index = m_PoolList.AddString(utf8ToTStr(poolId));
|
int index = m_PoolList.AddString(nlUtf8ToTStr(poolId));
|
||||||
nlassert(index != LB_ERR);
|
nlassert(index != LB_ERR);
|
||||||
m_PoolList.SetItemData(index, ID);
|
m_PoolList.SetItemData(index, ID);
|
||||||
return index;
|
return index;
|
||||||
|
@ -357,7 +357,7 @@ void CWaterPoolEditor::OnLoadPool()
|
||||||
{
|
{
|
||||||
NLMISC::CIXml iXml;
|
NLMISC::CIXml iXml;
|
||||||
NLMISC::CIFile iF;
|
NLMISC::CIFile iF;
|
||||||
if (iF.open(tStrToUtf8(fileDlg.GetPathName())))
|
if (iF.open(NLMISC::tStrToUtf8(fileDlg.GetPathName())))
|
||||||
{
|
{
|
||||||
if (iXml.init (iF))
|
if (iXml.init (iF))
|
||||||
{
|
{
|
||||||
|
@ -369,17 +369,17 @@ void CWaterPoolEditor::OnLoadPool()
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
iF.close();
|
iF.close();
|
||||||
MessageBox (utf8ToTStr(NLMISC::toString("Unable to init xml stream from file: %s", tStrToUtf8(fileDlg.GetPathName()).c_str())), _T("NeL object viewer"), MB_OK|MB_ICONEXCLAMATION);
|
MessageBox(nlUtf8ToTStr(NLMISC::toString("Unable to init xml stream from file: %s", NLMISC::tStrToUtf8(fileDlg.GetPathName()).c_str())), _T("NeL object viewer"), MB_OK | MB_ICONEXCLAMATION);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
MessageBox (utf8ToTStr(NLMISC::toString("Unable to open file: %s", tStrToUtf8(fileDlg.GetPathName()).c_str())), _T("NeL object viewer"), MB_OK|MB_ICONEXCLAMATION);
|
MessageBox(nlUtf8ToTStr(NLMISC::toString("Unable to open file: %s", NLMISC::tStrToUtf8(fileDlg.GetPathName()).c_str())), _T("NeL object viewer"), MB_OK | MB_ICONEXCLAMATION);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
catch (const NLMISC::Exception& e)
|
catch (const NLMISC::Exception& e)
|
||||||
{
|
{
|
||||||
MessageBox (utf8ToTStr(e.what()), _T("NeL object viewer"), MB_OK|MB_ICONEXCLAMATION);
|
MessageBox(nlUtf8ToTStr(e.what()), _T("NeL object viewer"), MB_OK | MB_ICONEXCLAMATION);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -395,7 +395,7 @@ void CWaterPoolEditor::OnSavePool()
|
||||||
{
|
{
|
||||||
NLMISC::COXml oXml;
|
NLMISC::COXml oXml;
|
||||||
NLMISC::COFile oF;
|
NLMISC::COFile oF;
|
||||||
if (oF.open(tStrToUtf8(fileDlg.GetPathName())))
|
if (oF.open(NLMISC::tStrToUtf8(fileDlg.GetPathName())))
|
||||||
{
|
{
|
||||||
if (oXml.init (&oF))
|
if (oXml.init (&oF))
|
||||||
{
|
{
|
||||||
|
@ -406,17 +406,17 @@ void CWaterPoolEditor::OnSavePool()
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
oF.close();
|
oF.close();
|
||||||
MessageBox (utf8ToTStr(NLMISC::toString("Unable to init xml stream from file: %s", tStrToUtf8(fileDlg.GetPathName()).c_str())), _T("NeL object viewer"), MB_OK|MB_ICONEXCLAMATION);
|
MessageBox(nlUtf8ToTStr(NLMISC::toString("Unable to init xml stream from file: %s", NLMISC::tStrToUtf8(fileDlg.GetPathName()).c_str())), _T("NeL object viewer"), MB_OK | MB_ICONEXCLAMATION);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
MessageBox (utf8ToTStr(NLMISC::toString("Unable to open file: %s", tStrToUtf8(fileDlg.GetPathName()).c_str())), _T("NeL object viewer"), MB_OK|MB_ICONEXCLAMATION);
|
MessageBox(nlUtf8ToTStr(NLMISC::toString("Unable to open file: %s", NLMISC::tStrToUtf8(fileDlg.GetPathName()).c_str())), _T("NeL object viewer"), MB_OK | MB_ICONEXCLAMATION);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
catch (const NLMISC::Exception& e)
|
catch (const NLMISC::Exception& e)
|
||||||
{
|
{
|
||||||
MessageBox (utf8ToTStr(e.what()), _T("NeL object viewer"), MB_OK|MB_ICONEXCLAMATION);
|
MessageBox(nlUtf8ToTStr(e.what()), _T("NeL object viewer"), MB_OK | MB_ICONEXCLAMATION);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -23,8 +23,13 @@
|
||||||
#endif // _MSC_VER > 1000
|
#endif // _MSC_VER > 1000
|
||||||
|
|
||||||
#define VC_EXTRALEAN // Exclude rarely-used stuff from Windows headers
|
#define VC_EXTRALEAN // Exclude rarely-used stuff from Windows headers
|
||||||
|
#define WIN32_LEAN_AND_MEAN
|
||||||
#define NOMINMAX
|
#define NOMINMAX
|
||||||
#define _WIN32_WINNT 0x0501
|
#ifdef _WIN64
|
||||||
|
#define _WIN32_WINNT 0x0600
|
||||||
|
#else
|
||||||
|
#define _WIN32_WINNT 0x0500
|
||||||
|
#endif
|
||||||
|
|
||||||
#include <windows.h>
|
#include <windows.h>
|
||||||
|
|
||||||
|
|
|
@ -18,3 +18,5 @@
|
||||||
// and not in this file
|
// and not in this file
|
||||||
|
|
||||||
#include "stdafx.h"
|
#include "stdafx.h"
|
||||||
|
|
||||||
|
void nlmax_shared_stdafx_dummy() { }
|
||||||
|
|
|
@ -72,3 +72,5 @@ NEL_3DSMAX_SHARED_API NLMISC::INelContext &GetSharedNelContext()
|
||||||
}
|
}
|
||||||
return NLMISC::INelContext::getInstance();
|
return NLMISC::INelContext::getInstance();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* end of file */
|
||||||
|
|
|
@ -25,3 +25,5 @@ class CPatchAllocator;
|
||||||
extern NEL_3DSMAX_SHARED_API CPatchAllocator& GetAllocator();
|
extern NEL_3DSMAX_SHARED_API CPatchAllocator& GetAllocator();
|
||||||
|
|
||||||
extern NEL_3DSMAX_SHARED_API NLMISC::INelContext &GetSharedNelContext();
|
extern NEL_3DSMAX_SHARED_API NLMISC::INelContext &GetSharedNelContext();
|
||||||
|
|
||||||
|
/* end of file */
|
||||||
|
|
|
@ -0,0 +1,75 @@
|
||||||
|
// NeL - MMORPG Framework <http://dev.ryzom.com/projects/nel/>
|
||||||
|
// Copyright (C) 2010 Winch Gate Property Limited
|
||||||
|
//
|
||||||
|
// This program is free software: you can redistribute it and/or modify
|
||||||
|
// it under the terms of the GNU Affero 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 Affero General Public License for more details.
|
||||||
|
//
|
||||||
|
// You should have received a copy of the GNU Affero General Public License
|
||||||
|
// along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
|
||||||
|
#ifndef NLMAX_STRING_COMMON_H
|
||||||
|
#define NLMAX_STRING_COMMON_H
|
||||||
|
|
||||||
|
#include <nel/misc/ucstring.h>
|
||||||
|
|
||||||
|
#if (MAX_VERSION_MAJOR < 15)
|
||||||
|
#define GET_OBJECT_NAME_CONST
|
||||||
|
#define NOTIFY_REF_PARAMS Interval changeInt, RefTargetHandle hTarget, PartID& partID, RefMessage message
|
||||||
|
#define NOTIFY_REF_PROPAGATE , BOOL propagate
|
||||||
|
#define nl_p_end end
|
||||||
|
#else
|
||||||
|
#define GET_OBJECT_NAME_CONST const
|
||||||
|
#define NOTIFY_REF_PARAMS const Interval &changeInt, RefTargetHandle hTarget, PartID& partID, RefMessage message, BOOL propagate
|
||||||
|
#define nl_p_end p_end
|
||||||
|
#endif
|
||||||
|
|
||||||
|
static TSTR MaxTStrFromUtf8(const std::string &src)
|
||||||
|
{
|
||||||
|
TSTR dst;
|
||||||
|
#if (MAX_VERSION_MAJOR < 15)
|
||||||
|
ucstring uc;
|
||||||
|
uc.fromUtf8(src);
|
||||||
|
dst = (const mwchar_t *)uc.c_str();
|
||||||
|
#else
|
||||||
|
dst.FromUTF8(src.c_str());
|
||||||
|
#endif
|
||||||
|
return dst;
|
||||||
|
}
|
||||||
|
|
||||||
|
static std::string MaxTStrToUtf8(const TSTR& src)
|
||||||
|
{
|
||||||
|
#if (MAX_VERSION_MAJOR < 15)
|
||||||
|
#ifdef _UNICODE
|
||||||
|
ucstring uc(src.data());
|
||||||
|
return uc.toUtf8();
|
||||||
|
#else
|
||||||
|
WStr ws = src;
|
||||||
|
ucstring uc((const ucchar *)ws.data());
|
||||||
|
return uc.toUtf8();
|
||||||
|
#endif
|
||||||
|
#else
|
||||||
|
return src.ToUTF8().data();
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
static std::string MCharStrToUtf8(const MCHAR *src)
|
||||||
|
{
|
||||||
|
#ifdef _UNICODE
|
||||||
|
ucstring uc((const ucchar *)src);
|
||||||
|
return uc.toUtf8();
|
||||||
|
#else
|
||||||
|
ucstring uc((const ucchar *)WStr(src).data());
|
||||||
|
return uc.toUtf8();
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif /* #ifndef NLMAX_STRING_COMMON_H */
|
||||||
|
|
||||||
|
/* end of file */
|
|
@ -94,7 +94,7 @@ INT_PTR CALLBACK OptionsDialogCallback (
|
||||||
else
|
else
|
||||||
SendMessage( GetDlgItem(hwndDlg,IDC_SHADOW), BM_SETCHECK, BST_UNCHECKED, 0 );
|
SendMessage( GetDlgItem(hwndDlg,IDC_SHADOW), BM_SETCHECK, BST_UNCHECKED, 0 );
|
||||||
|
|
||||||
SendMessage( GetDlgItem(hwndDlg,IDC_EDITEXPORTLIGHTING), WM_SETTEXT, 0, (LPARAM)utf8ToTStr(theExportSceneStruct.sExportLighting));
|
SendMessage( GetDlgItem(hwndDlg,IDC_EDITEXPORTLIGHTING), WM_SETTEXT, 0, (LPARAM)MaxTStrFromUtf8(theExportSceneStruct.sExportLighting).data());
|
||||||
|
|
||||||
if( theExportSceneStruct.nExportLighting == 0 )
|
if( theExportSceneStruct.nExportLighting == 0 )
|
||||||
SendMessage( GetDlgItem(hwndDlg,IDC_RADIONORMALEXPORTLIGHTING), BM_SETCHECK, BST_CHECKED, 0 );
|
SendMessage( GetDlgItem(hwndDlg,IDC_RADIONORMALEXPORTLIGHTING), BM_SETCHECK, BST_CHECKED, 0 );
|
||||||
|
@ -102,7 +102,7 @@ INT_PTR CALLBACK OptionsDialogCallback (
|
||||||
if( theExportSceneStruct.nExportLighting == 1 )
|
if( theExportSceneStruct.nExportLighting == 1 )
|
||||||
SendMessage( GetDlgItem(hwndDlg,IDC_RADIORADIOSITYEXPORTLIGHTING), BM_SETCHECK, BST_CHECKED, 0 );
|
SendMessage( GetDlgItem(hwndDlg,IDC_RADIORADIOSITYEXPORTLIGHTING), BM_SETCHECK, BST_CHECKED, 0 );
|
||||||
|
|
||||||
SendMessage( GetDlgItem(hwndDlg,IDC_EDITLUMELSIZE), WM_SETTEXT, 0, (LPARAM)utf8ToTStr(toString(theExportSceneStruct.rLumelSize)));
|
SendMessage( GetDlgItem(hwndDlg,IDC_EDITLUMELSIZE), WM_SETTEXT, 0, (LPARAM)MaxTStrFromUtf8(toString(theExportSceneStruct.rLumelSize)).data());
|
||||||
|
|
||||||
if( theExportSceneStruct.nOverSampling == 1 )
|
if( theExportSceneStruct.nOverSampling == 1 )
|
||||||
SendMessage( GetDlgItem(hwndDlg,IDC_RADIOSS1), BM_SETCHECK, BST_CHECKED, 0 );
|
SendMessage( GetDlgItem(hwndDlg,IDC_RADIOSS1), BM_SETCHECK, BST_CHECKED, 0 );
|
||||||
|
@ -132,8 +132,8 @@ INT_PTR CALLBACK OptionsDialogCallback (
|
||||||
else
|
else
|
||||||
SendMessage( GetDlgItem(hwndDlg,IDC_TEST_SURFACE_LIGHT), BM_SETCHECK, BST_UNCHECKED, 0 );
|
SendMessage( GetDlgItem(hwndDlg,IDC_TEST_SURFACE_LIGHT), BM_SETCHECK, BST_UNCHECKED, 0 );
|
||||||
|
|
||||||
SendMessage( GetDlgItem(hwndDlg,IDC_EDITCELLSIZE), WM_SETTEXT, 0, (LPARAM)utf8ToTStr(toString(theExportSceneStruct.SurfaceLightingCellSize)));
|
SendMessage( GetDlgItem(hwndDlg,IDC_EDITCELLSIZE), WM_SETTEXT, 0, (LPARAM)MaxTStrFromUtf8(toString(theExportSceneStruct.SurfaceLightingCellSize)).data());
|
||||||
SendMessage( GetDlgItem(hwndDlg,IDC_EDITCELLDELTAZ), WM_SETTEXT, 0, (LPARAM)utf8ToTStr(toString(theExportSceneStruct.SurfaceLightingDeltaZ)));
|
SendMessage( GetDlgItem(hwndDlg,IDC_EDITCELLDELTAZ), WM_SETTEXT, 0, (LPARAM)MaxTStrFromUtf8(toString(theExportSceneStruct.SurfaceLightingDeltaZ)).data());
|
||||||
|
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
@ -148,7 +148,7 @@ INT_PTR CALLBACK OptionsDialogCallback (
|
||||||
if( theCNelExport.SelectDir(hwndDlg, _T("LightMaps Directory"), sTemp ) )
|
if( theCNelExport.SelectDir(hwndDlg, _T("LightMaps Directory"), sTemp ) )
|
||||||
{
|
{
|
||||||
theExportSceneStruct.sExportLighting = sTemp;
|
theExportSceneStruct.sExportLighting = sTemp;
|
||||||
SendMessage( GetDlgItem(hwndDlg, IDC_EDITEXPORTLIGHTING), WM_SETTEXT, 0, (LPARAM)utf8ToTStr(theExportSceneStruct.sExportLighting) );
|
SendMessage(GetDlgItem(hwndDlg, IDC_EDITEXPORTLIGHTING), WM_SETTEXT, 0, (LPARAM)MaxTStrFromUtf8(theExportSceneStruct.sExportLighting).data());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
@ -180,7 +180,7 @@ INT_PTR CALLBACK OptionsDialogCallback (
|
||||||
|
|
||||||
TCHAR tmp[1024];
|
TCHAR tmp[1024];
|
||||||
SendMessage( GetDlgItem(hwndDlg,IDC_EDITEXPORTLIGHTING), WM_GETTEXT, 1024, (LPARAM)tmp );
|
SendMessage( GetDlgItem(hwndDlg,IDC_EDITEXPORTLIGHTING), WM_GETTEXT, 1024, (LPARAM)tmp );
|
||||||
theExportSceneStruct.sExportLighting = tStrToUtf8(tmp);
|
theExportSceneStruct.sExportLighting = MCharStrToUtf8(tmp);
|
||||||
|
|
||||||
if( SendMessage( GetDlgItem(hwndDlg,IDC_RADIONORMALEXPORTLIGHTING), BM_GETCHECK, 0, 0 ) == BST_CHECKED )
|
if( SendMessage( GetDlgItem(hwndDlg,IDC_RADIONORMALEXPORTLIGHTING), BM_GETCHECK, 0, 0 ) == BST_CHECKED )
|
||||||
theExportSceneStruct.nExportLighting = 0;
|
theExportSceneStruct.nExportLighting = 0;
|
||||||
|
@ -189,7 +189,7 @@ INT_PTR CALLBACK OptionsDialogCallback (
|
||||||
theExportSceneStruct.nExportLighting = 1;
|
theExportSceneStruct.nExportLighting = 1;
|
||||||
|
|
||||||
SendMessage( GetDlgItem(hwndDlg,IDC_EDITLUMELSIZE), WM_GETTEXT, 1024, (LPARAM)tmp );
|
SendMessage( GetDlgItem(hwndDlg,IDC_EDITLUMELSIZE), WM_GETTEXT, 1024, (LPARAM)tmp );
|
||||||
NLMISC::fromString(tStrToUtf8(tmp), theExportSceneStruct.rLumelSize);
|
NLMISC::fromString(MCharStrToUtf8(tmp), theExportSceneStruct.rLumelSize);
|
||||||
|
|
||||||
if( SendMessage( GetDlgItem(hwndDlg,IDC_RADIOSS1), BM_GETCHECK, 0, 0 ) == BST_CHECKED )
|
if( SendMessage( GetDlgItem(hwndDlg,IDC_RADIOSS1), BM_GETCHECK, 0, 0 ) == BST_CHECKED )
|
||||||
theExportSceneStruct.nOverSampling = 1;
|
theExportSceneStruct.nOverSampling = 1;
|
||||||
|
@ -214,10 +214,10 @@ INT_PTR CALLBACK OptionsDialogCallback (
|
||||||
theExportSceneStruct.bTestSurfaceLighting= (SendMessage( GetDlgItem(hwndDlg,IDC_TEST_SURFACE_LIGHT), BM_GETCHECK, 0, 0 ) == BST_CHECKED);
|
theExportSceneStruct.bTestSurfaceLighting= (SendMessage( GetDlgItem(hwndDlg,IDC_TEST_SURFACE_LIGHT), BM_GETCHECK, 0, 0 ) == BST_CHECKED);
|
||||||
|
|
||||||
SendMessage( GetDlgItem(hwndDlg,IDC_EDITCELLSIZE), WM_GETTEXT, 1024, (LPARAM)tmp );
|
SendMessage( GetDlgItem(hwndDlg,IDC_EDITCELLSIZE), WM_GETTEXT, 1024, (LPARAM)tmp );
|
||||||
NLMISC::fromString(tStrToUtf8(tmp), theExportSceneStruct.SurfaceLightingCellSize);
|
NLMISC::fromString(MCharStrToUtf8(tmp), theExportSceneStruct.SurfaceLightingCellSize);
|
||||||
|
|
||||||
SendMessage( GetDlgItem(hwndDlg,IDC_EDITCELLDELTAZ), WM_GETTEXT, 1024, (LPARAM)tmp );
|
SendMessage( GetDlgItem(hwndDlg,IDC_EDITCELLDELTAZ), WM_GETTEXT, 1024, (LPARAM)tmp );
|
||||||
NLMISC::fromString(tStrToUtf8(tmp), theExportSceneStruct.SurfaceLightingDeltaZ);
|
NLMISC::fromString(MCharStrToUtf8(tmp), theExportSceneStruct.SurfaceLightingDeltaZ);
|
||||||
|
|
||||||
// End the dialog
|
// End the dialog
|
||||||
EndDialog(hwndDlg, TRUE);
|
EndDialog(hwndDlg, TRUE);
|
||||||
|
@ -354,7 +354,7 @@ static INT_PTR CALLBACK CNelExportDlgProc(HWND hWnd, UINT msg, WPARAM wParam, LP
|
||||||
if (RPO::isZone (*pNode, time))
|
if (RPO::isZone (*pNode, time))
|
||||||
{
|
{
|
||||||
// Save path
|
// Save path
|
||||||
std::string sSavePath = tStrToUtf8(pNode->GetName());
|
std::string sSavePath = MCharStrToUtf8(pNode->GetName());
|
||||||
|
|
||||||
// Choose a file to export
|
// Choose a file to export
|
||||||
if (!CExportNel::getScriptAppData (pNode, NEL3D_APPDATA_DONTEXPORT, 0))
|
if (!CExportNel::getScriptAppData (pNode, NEL3D_APPDATA_DONTEXPORT, 0))
|
||||||
|
@ -364,15 +364,15 @@ static INT_PTR CALLBACK CNelExportDlgProc(HWND hWnd, UINT msg, WPARAM wParam, LP
|
||||||
if (!theCNelExport.exportZone (sSavePath, *pNode, time))
|
if (!theCNelExport.exportZone (sSavePath, *pNode, time))
|
||||||
{
|
{
|
||||||
// Error message
|
// Error message
|
||||||
std::string sErrorMsg = toString("Error exporting the zone %s in the file\n%s", tStrToUtf8(pNode->GetName()).c_str(), sSavePath.c_str());
|
std::string sErrorMsg = toString("Error exporting the zone %s in the file\n%s", MCharStrToUtf8(pNode->GetName()).c_str(), sSavePath.c_str());
|
||||||
MessageBox (hWnd, utf8ToTStr(sErrorMsg), L"NeL export", MB_OK|MB_ICONEXCLAMATION);
|
MessageBox (hWnd, MaxTStrFromUtf8(sErrorMsg), _T("NeL export"), MB_OK|MB_ICONEXCLAMATION);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else if (CExportNel::isVegetable (*pNode, time))
|
else if (CExportNel::isVegetable (*pNode, time))
|
||||||
{
|
{
|
||||||
// Save path
|
// Save path
|
||||||
std::string sSavePath = tStrToUtf8(pNode->GetName());
|
std::string sSavePath = MCharStrToUtf8(pNode->GetName());
|
||||||
|
|
||||||
// Choose a file to export
|
// Choose a file to export
|
||||||
if (!CExportNel::getScriptAppData (pNode, NEL3D_APPDATA_DONTEXPORT, 0))
|
if (!CExportNel::getScriptAppData (pNode, NEL3D_APPDATA_DONTEXPORT, 0))
|
||||||
|
@ -382,8 +382,8 @@ static INT_PTR CALLBACK CNelExportDlgProc(HWND hWnd, UINT msg, WPARAM wParam, LP
|
||||||
if (!theCNelExport.exportVegetable (sSavePath.c_str(), *pNode, time))
|
if (!theCNelExport.exportVegetable (sSavePath.c_str(), *pNode, time))
|
||||||
{
|
{
|
||||||
// Error message
|
// Error message
|
||||||
std::string sErrorMsg = toString("Error exporting the vegetable %s in the file\n%s", tStrToUtf8(pNode->GetName()).c_str(), sSavePath.c_str());
|
std::string sErrorMsg = toString("Error exporting the vegetable %s in the file\n%s", MCharStrToUtf8(pNode->GetName()).c_str(), sSavePath.c_str());
|
||||||
MessageBox (hWnd, utf8ToTStr(sErrorMsg), _T("NeL export"), MB_OK|MB_ICONEXCLAMATION);
|
MessageBox (hWnd, MaxTStrFromUtf8(sErrorMsg), _T("NeL export"), MB_OK|MB_ICONEXCLAMATION);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -391,7 +391,7 @@ static INT_PTR CALLBACK CNelExportDlgProc(HWND hWnd, UINT msg, WPARAM wParam, LP
|
||||||
else if (CExportNel::isLodCharacter (*pNode, time))
|
else if (CExportNel::isLodCharacter (*pNode, time))
|
||||||
{
|
{
|
||||||
// Save path
|
// Save path
|
||||||
std::string sSavePath = tStrToUtf8(pNode->GetName());
|
std::string sSavePath = MCharStrToUtf8(pNode->GetName());
|
||||||
|
|
||||||
// Choose a file to export
|
// Choose a file to export
|
||||||
if (!CExportNel::getScriptAppData (pNode, NEL3D_APPDATA_DONTEXPORT, 0))
|
if (!CExportNel::getScriptAppData (pNode, NEL3D_APPDATA_DONTEXPORT, 0))
|
||||||
|
@ -401,8 +401,8 @@ static INT_PTR CALLBACK CNelExportDlgProc(HWND hWnd, UINT msg, WPARAM wParam, LP
|
||||||
if (!theCNelExport.exportLodCharacter (sSavePath, *pNode, time))
|
if (!theCNelExport.exportLodCharacter (sSavePath, *pNode, time))
|
||||||
{
|
{
|
||||||
// Error message
|
// Error message
|
||||||
std::string sErrorMsg = toString("Error exporting the lod character %s in the file\n%s", tStrToUtf8(pNode->GetName()).c_str(), sSavePath.c_str());
|
std::string sErrorMsg = toString("Error exporting the lod character %s in the file\n%s", MCharStrToUtf8(pNode->GetName()).c_str(), sSavePath.c_str());
|
||||||
MessageBox (hWnd, utf8ToTStr(sErrorMsg), _T("NeL export"), MB_OK|MB_ICONEXCLAMATION);
|
MessageBox (hWnd, MaxTStrFromUtf8(sErrorMsg).data(), _T("NeL export"), MB_OK|MB_ICONEXCLAMATION);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -410,7 +410,7 @@ static INT_PTR CALLBACK CNelExportDlgProc(HWND hWnd, UINT msg, WPARAM wParam, LP
|
||||||
else if (CExportNel::isMesh (*pNode, time))
|
else if (CExportNel::isMesh (*pNode, time))
|
||||||
{
|
{
|
||||||
// Save path
|
// Save path
|
||||||
std::string sSavePath = tStrToUtf8(pNode->GetName());
|
std::string sSavePath = MCharStrToUtf8(pNode->GetName());
|
||||||
|
|
||||||
// Choose a file to export
|
// Choose a file to export
|
||||||
if (!CExportNel::getScriptAppData (pNode, NEL3D_APPDATA_DONTEXPORT, 0))
|
if (!CExportNel::getScriptAppData (pNode, NEL3D_APPDATA_DONTEXPORT, 0))
|
||||||
|
@ -424,8 +424,8 @@ static INT_PTR CALLBACK CNelExportDlgProc(HWND hWnd, UINT msg, WPARAM wParam, LP
|
||||||
if (!theCNelExport.exportMesh (sSavePath, *pNode, time))
|
if (!theCNelExport.exportMesh (sSavePath, *pNode, time))
|
||||||
{
|
{
|
||||||
// Error message
|
// Error message
|
||||||
std::string sErrorMsg = toString("Error exporting the mesh %s in the file\n%s", tStrToUtf8(pNode->GetName()).c_str(), sSavePath.c_str());
|
std::string sErrorMsg = toString("Error exporting the mesh %s in the file\n%s", MCharStrToUtf8(pNode->GetName()).c_str(), sSavePath.c_str());
|
||||||
MessageBox (hWnd, utf8ToTStr(sErrorMsg), _T("NeL export"), MB_OK|MB_ICONEXCLAMATION);
|
MessageBox (hWnd, MaxTStrFromUtf8(sErrorMsg).data(), _T("NeL export"), MB_OK|MB_ICONEXCLAMATION);
|
||||||
}
|
}
|
||||||
// Delete the skeleton pointer
|
// Delete the skeleton pointer
|
||||||
if (pSkinShape)
|
if (pSkinShape)
|
||||||
|
@ -463,7 +463,7 @@ static INT_PTR CALLBACK CNelExportDlgProc(HWND hWnd, UINT msg, WPARAM wParam, LP
|
||||||
// Name of the node
|
// Name of the node
|
||||||
|
|
||||||
// Save path
|
// Save path
|
||||||
std::string sSavePath = tStrToUtf8((*vectNode.begin())->GetName());
|
std::string sSavePath = MCharStrToUtf8((*vectNode.begin())->GetName());
|
||||||
|
|
||||||
// Choose a file to export
|
// Choose a file to export
|
||||||
if (theCNelExport.SelectFileForSave (hWnd, _T("Save animations..."), (LOWORD(wParam)==ID_SAVE_MODEL_ANIM)?animModelFilter:animModelFilter,
|
if (theCNelExport.SelectFileForSave (hWnd, _T("Save animations..."), (LOWORD(wParam)==ID_SAVE_MODEL_ANIM)?animModelFilter:animModelFilter,
|
||||||
|
@ -473,8 +473,8 @@ static INT_PTR CALLBACK CNelExportDlgProc(HWND hWnd, UINT msg, WPARAM wParam, LP
|
||||||
if (!theCNelExport.exportAnim (sSavePath, vectNode, time, LOWORD(wParam)==ID_SAVE_SCENE_ANIM))
|
if (!theCNelExport.exportAnim (sSavePath, vectNode, time, LOWORD(wParam)==ID_SAVE_SCENE_ANIM))
|
||||||
{
|
{
|
||||||
// Error message
|
// Error message
|
||||||
std::string sErrorMsg = toString("Error exporting animation %s in the file\n%s", tStrToUtf8((*vectNode.begin())->GetName()).c_str(), sSavePath.c_str());
|
std::string sErrorMsg = toString("Error exporting animation %s in the file\n%s", MCharStrToUtf8((*vectNode.begin())->GetName()).c_str(), sSavePath.c_str());
|
||||||
MessageBox(hWnd, utf8ToTStr(sErrorMsg), _T("NeL export"), MB_OK | MB_ICONEXCLAMATION);
|
MessageBox(hWnd, MaxTStrFromUtf8(sErrorMsg).data(), _T("NeL export"), MB_OK | MB_ICONEXCLAMATION);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -566,7 +566,7 @@ static INT_PTR CALLBACK CNelExportDlgProc(HWND hWnd, UINT msg, WPARAM wParam, LP
|
||||||
nlassert (vectNode.size()!=0);
|
nlassert (vectNode.size()!=0);
|
||||||
|
|
||||||
// Save path
|
// Save path
|
||||||
std::string sSavePath = tStrToUtf8((*vectNode.begin())->GetName());
|
std::string sSavePath = MCharStrToUtf8((*vectNode.begin())->GetName());
|
||||||
|
|
||||||
if (theCNelExport.SelectFileForSave (hWnd, _T("Save SWT..."), SWTFilter, sSavePath))
|
if (theCNelExport.SelectFileForSave (hWnd, _T("Save SWT..."), SWTFilter, sSavePath))
|
||||||
{
|
{
|
||||||
|
@ -574,8 +574,8 @@ static INT_PTR CALLBACK CNelExportDlgProc(HWND hWnd, UINT msg, WPARAM wParam, LP
|
||||||
if (!theCNelExport.exportSWT (sSavePath, vectNode))
|
if (!theCNelExport.exportSWT (sSavePath, vectNode))
|
||||||
{
|
{
|
||||||
// Error message
|
// Error message
|
||||||
std::string sErrorMsg = toString("Error exporting SWT %s in the file\n%s", tStrToUtf8((*vectNode.begin())->GetName()).c_str(), sSavePath.c_str());
|
std::string sErrorMsg = toString("Error exporting SWT %s in the file\n%s", MCharStrToUtf8((*vectNode.begin())->GetName()).c_str(), sSavePath.c_str());
|
||||||
MessageBox(hWnd, utf8ToTStr(sErrorMsg), _T("NeL export"), MB_OK | MB_ICONEXCLAMATION);
|
MessageBox(hWnd, MaxTStrFromUtf8(sErrorMsg).data(), _T("NeL export"), MB_OK | MB_ICONEXCLAMATION);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -588,7 +588,7 @@ static INT_PTR CALLBACK CNelExportDlgProc(HWND hWnd, UINT msg, WPARAM wParam, LP
|
||||||
nlassert (theIP);
|
nlassert (theIP);
|
||||||
theCNelExport.init (false, true, theIP, true);
|
theCNelExport.init (false, true, theIP, true);
|
||||||
|
|
||||||
std::string sConfigFileName = tStrToUtf8(theCNelExport._Ip->GetDir(APP_PLUGCFG_DIR)) + "\\NelExportScene.cfg";
|
std::string sConfigFileName = MCharStrToUtf8(theCNelExport._Ip->GetDir(APP_PLUGCFG_DIR)) + "\\NelExportScene.cfg";
|
||||||
|
|
||||||
// Do a modal dialog box to choose the scene export options
|
// Do a modal dialog box to choose the scene export options
|
||||||
if( DialogBox( hInstance,
|
if( DialogBox( hInstance,
|
||||||
|
@ -647,7 +647,7 @@ static INT_PTR CALLBACK CNelExportDlgProc(HWND hWnd, UINT msg, WPARAM wParam, LP
|
||||||
theCNelExport.getSelectedNode (vectNode);
|
theCNelExport.getSelectedNode (vectNode);
|
||||||
nlassert (vectNode.size()!=0);
|
nlassert (vectNode.size()!=0);
|
||||||
|
|
||||||
std::string sSavePath = tStrToUtf8((*vectNode.begin())->GetName());
|
std::string sSavePath = MCharStrToUtf8((*vectNode.begin())->GetName());
|
||||||
|
|
||||||
if (theCNelExport.SelectFileForSave (hWnd, _T("Save Instance group"), InstanceGroupFilter, sSavePath))
|
if (theCNelExport.SelectFileForSave (hWnd, _T("Save Instance group"), InstanceGroupFilter, sSavePath))
|
||||||
{
|
{
|
||||||
|
@ -656,7 +656,7 @@ static INT_PTR CALLBACK CNelExportDlgProc(HWND hWnd, UINT msg, WPARAM wParam, LP
|
||||||
{
|
{
|
||||||
// Error message
|
// Error message
|
||||||
std::string sErrorMsg = toString("Error exporting instance group %s", sSavePath.c_str());
|
std::string sErrorMsg = toString("Error exporting instance group %s", sSavePath.c_str());
|
||||||
MessageBox(hWnd, utf8ToTStr(sErrorMsg), _T("NeL export"), MB_OK | MB_ICONEXCLAMATION);
|
MessageBox(hWnd, MaxTStrFromUtf8(sErrorMsg).data(), _T("NeL export"), MB_OK | MB_ICONEXCLAMATION);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -690,8 +690,8 @@ static INT_PTR CALLBACK CNelExportDlgProc(HWND hWnd, UINT msg, WPARAM wParam, LP
|
||||||
if (!theCNelExport.exportSkeleton (sSavePath, pNode, theCNelExport._Ip->GetTime()))
|
if (!theCNelExport.exportSkeleton (sSavePath, pNode, theCNelExport._Ip->GetTime()))
|
||||||
{
|
{
|
||||||
// Error message
|
// Error message
|
||||||
std::string sErrorMsg = toString("Error exporting skeleton %s in the file\n%s", tStrToUtf8(pNode->GetName()).c_str(), sSavePath.c_str());
|
std::string sErrorMsg = toString("Error exporting skeleton %s in the file\n%s", MCharStrToUtf8(pNode->GetName()).c_str(), sSavePath.c_str());
|
||||||
MessageBox(hWnd, utf8ToTStr(sErrorMsg), _T("NeL export"), MB_OK | MB_ICONEXCLAMATION);
|
MessageBox(hWnd, MaxTStrFromUtf8(sErrorMsg).data(), _T("NeL export"), MB_OK | MB_ICONEXCLAMATION);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -736,7 +736,7 @@ static INT_PTR CALLBACK CNelExportDlgProc(HWND hWnd, UINT msg, WPARAM wParam, LP
|
||||||
}
|
}
|
||||||
catch(const std::exception &e)
|
catch(const std::exception &e)
|
||||||
{
|
{
|
||||||
::MessageBox(hWnd, utf8ToTStr(e.what()), _T("Error"), MB_OK | MB_ICONEXCLAMATION);
|
::MessageBoxA(hWnd, e.what(), "Error", MB_OK | MB_ICONEXCLAMATION);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -820,7 +820,7 @@ void CNelExport::getSelectedNode (std::vector<INode*>& vectNode)
|
||||||
void CNelExport::initOptions()
|
void CNelExport::initOptions()
|
||||||
{
|
{
|
||||||
// Initialization of theExportSceneStruct
|
// Initialization of theExportSceneStruct
|
||||||
std::string sConfigFileName = tStrToUtf8(theCNelExport._Ip->GetDir(APP_PLUGCFG_DIR)) + "\\NelExportScene.cfg";
|
std::string sConfigFileName = MCharStrToUtf8(theCNelExport._Ip->GetDir(APP_PLUGCFG_DIR)) + "\\NelExportScene.cfg";
|
||||||
|
|
||||||
// MessageBox (hWnd, sConfigFileName, "sConfigFileName", MB_OK|MB_ICONEXCLAMATION);
|
// MessageBox (hWnd, sConfigFileName, "sConfigFileName", MB_OK|MB_ICONEXCLAMATION);
|
||||||
if( CFile::fileExists(sConfigFileName) )
|
if( CFile::fileExists(sConfigFileName) )
|
||||||
|
|
Some files were not shown because too many files have changed in this diff Show more
Loading…
Reference in a new issue