@@ -11,7 +11,7 @@ function TypeDictionnary(m_name) | |||||
function CmdVarObj() { } | function CmdVarObj() { } | ||||
function CmdVar(m_type, m_syntax) | function CmdVar(m_type, m_syntax) | ||||
{ | { | ||||
var current_mesh_dict = GetCmdDictionnary(); | |||||
var current_dict = GetCmdDictionnary(); | |||||
new_obj = new CmdVarObj(); | new_obj = new CmdVarObj(); | ||||
new_obj.m_type = m_type; | new_obj.m_type = m_type; | ||||
new_obj.m_syntax = m_syntax; | new_obj.m_syntax = m_syntax; | ||||
@@ -22,7 +22,7 @@ function CmdVar(m_type, m_syntax) | |||||
for (var i = 0; i < m_syntax.length; i++) | for (var i = 0; i < m_syntax.length; i++) | ||||
res += m_syntax[i] + ' '; | res += m_syntax[i] + ' '; | ||||
} | } | ||||
current_mesh_dict.m_vars[current_mesh_dict.m_vars.length] = new_obj; | |||||
current_dict.m_vars[current_dict.m_vars.length] = new_obj; | |||||
} | } | ||||
//----------------------------------------------------------------------------- | //----------------------------------------------------------------------------- | ||||
@@ -50,7 +50,7 @@ function CmdArg(m_type, m_name, m_optional) | |||||
function CmdTypeObj() { } | function CmdTypeObj() { } | ||||
function CmdType(m_name, m_comment, m_arg) | function CmdType(m_name, m_comment, m_arg) | ||||
{ | { | ||||
var current_mesh_dict = GetCmdDictionnary(); | |||||
var current_dict = GetCmdDictionnary(); | |||||
new_obj = new CmdTypeObj(); | new_obj = new CmdTypeObj(); | ||||
new_obj.m_name = m_name; | new_obj.m_name = m_name; | ||||
new_obj.m_comment = m_comment; | new_obj.m_comment = m_comment; | ||||
@@ -95,7 +95,7 @@ function CmdType(m_name, m_comment, m_arg) | |||||
} | } | ||||
return false; | return false; | ||||
} | } | ||||
current_mesh_dict.m_cmds[current_mesh_dict.m_cmds.length] = new_obj; | |||||
current_dict.m_cmds[current_dict.m_cmds.length] = new_obj; | |||||
} | } | ||||
//----------------------------------------------------------------------------- | //----------------------------------------------------------------------------- | ||||
@@ -105,7 +105,7 @@ function FindMatchingCommand(src_text_area) | |||||
{ | { | ||||
if (src_text_area != undefined) | if (src_text_area != undefined) | ||||
{ | { | ||||
var current_mesh_dict = GetCmdDictionnary(); | |||||
var current_dict = GetCmdDictionnary(); | |||||
var found_match = ""; | var found_match = ""; | ||||
var check = true; | var check = true; | ||||
var cursor = Math.min(src_text_area.selectionStart, src_text_area.value.length - 1); | var cursor = Math.min(src_text_area.selectionStart, src_text_area.value.length - 1); | ||||
@@ -149,10 +149,201 @@ function FindMatchingCommand(src_text_area) | |||||
var match_data = new Object(); | var match_data = new Object(); | ||||
match_data.match = found_match; | match_data.match = found_match; | ||||
match_data.match_list = new Array(); | match_data.match_list = new Array(); | ||||
for (cursor = 0; cursor < current_mesh_dict.m_cmds.length; cursor++) | |||||
if (current_mesh_dict.m_cmds[cursor].CheckCommand(found_match)) | |||||
for (cursor = 0; cursor < current_dict.m_cmds.length; cursor++) | |||||
if (current_dict.m_cmds[cursor].CheckCommand(found_match)) | |||||
match_data.match_list[match_data.match_list.length] = cursor; | match_data.match_list[match_data.match_list.length] = cursor; | ||||
return match_data; | return match_data; | ||||
} | } | ||||
} | } | ||||
//----------------------------------------------------------------------------- | |||||
//Build a TOC from all commands first letter | |||||
//----------------------------------------------------------------------------- | |||||
function BuildTOC(with_dot) | |||||
{ | |||||
var res = ''; | |||||
var current_dict = GetCmdDictionnary(); | |||||
for (var a = 'a'.charCodeAt(0); a <= 'z'.charCodeAt(0); a++) | |||||
{ | |||||
var stop = false; | |||||
for (var i = 0; !stop && i < current_dict.m_cmds.length; i++) | |||||
{ | |||||
for (var j = 0; j < current_dict.m_cmds[i].m_name.length; j++) | |||||
{ | |||||
if (current_dict.m_cmds[i].m_name[j][0] == String.fromCharCode(a)) | |||||
{ | |||||
res += String.fromCharCode(a); | |||||
stop = true; | |||||
break; | |||||
} | |||||
} | |||||
} | |||||
if (!stop && with_dot) | |||||
res += '.'; | |||||
} | |||||
return res; | |||||
} | |||||
//----------------------------------------------------------------------------- | |||||
//Setup code lookup logic | |||||
//----------------------------------------------------------------------------- | |||||
function CmdLookup(div_cmds, div_args, div_cmnt, div_vars, text_src) | |||||
{ | |||||
var cur_dict = GetCmdDictionnary(); | |||||
if (text_src != undefined) | |||||
{ | |||||
var cmd_size = 8; | |||||
var found = FindMatchingCommand(text_src); | |||||
if (found.match_list.length > 0) | |||||
{ | |||||
var perfect_match = false; | |||||
var best_match = 0; | |||||
var best_length = 300000; | |||||
//Find the best match to put it in first in the list | |||||
for (var i = 0; i < found.match_list.length && best_length > 0; i++) | |||||
{ | |||||
var cur_match = cur_dict.m_cmds[found.match_list[i]]; | |||||
for (var j = 0; j < cur_match.m_name.length && best_length > 0; j++) | |||||
{ | |||||
if (cur_match.m_name[j].length == found.match.length) | |||||
{ | |||||
perfect_match = true; | |||||
best_match = i; | |||||
best_length = 0; | |||||
} | |||||
else if (cur_match.m_name[j].length < best_length && | |||||
cur_match.m_name[j].length > found.match.length) | |||||
{ | |||||
best_match = i; | |||||
best_length = cur_match.m_name[j].length; | |||||
} | |||||
} | |||||
} | |||||
var tmp = found.match_list[0]; | |||||
found.match_list[0] = found.match_list[best_match]; | |||||
found.match_list[best_match] = tmp; | |||||
var type_list = new Array(); | |||||
div_cmds[0].innerHTML = ""; | |||||
div_cmds[1].innerHTML = ""; | |||||
div_args.innerHTML = ""; | |||||
div_cmnt.innerHTML = ""; | |||||
//Go through the found matches and show them. | |||||
for (var i = 0; i < found.match_list.length; i++) | |||||
{ | |||||
var cur_match = cur_dict.m_cmds[found.match_list[i]]; | |||||
div_cmds[0].innerHTML += '['; | |||||
var max = cur_match.m_name.length; | |||||
var word = 0; | |||||
for (var j = 0; j < max; j++) | |||||
{ | |||||
var mth = found.match; | |||||
var cmd = cur_match.m_name[j]; | |||||
//Matching start caracters should be bold | |||||
if (mth == cmd.slice(0, mth.length)) | |||||
{ | |||||
div_cmds[word].innerHTML += ' '; | |||||
div_cmds[word].innerHTML += '<b>' + mth + '</b>'; | |||||
div_cmds[word].innerHTML += cmd.slice(mth.length, cmd.length); | |||||
word++; | |||||
} | |||||
} | |||||
//Complete empty command by <br> so commands in the two columns are on the same line | |||||
word = (word > 0)?(2):(0); | |||||
while (word-- > 0) | |||||
div_cmds[word].innerHTML += "<br>"; | |||||
//Go through the arguments and show them, force if we found the perfect match | |||||
if (perfect_match || (found.match_list.length < 4 && i == 0)) | |||||
{ | |||||
div_args.innerHTML += " > "; | |||||
if (cur_match.m_arg != undefined) | |||||
{ | |||||
max = cur_match.m_arg.length; | |||||
var found_optional = false; | |||||
for (var j = 0; j < max; j++) | |||||
{ | |||||
if (cur_match.m_arg[j].m_optional != undefined && found_optional == false) | |||||
{ | |||||
var tab = '<br>'; for (var l = 0; l < 5; l++) tab += ' '; | |||||
div_args.innerHTML += tab + 'Opt: ['; | |||||
found_optional = true; | |||||
} | |||||
else if (j > 0) | |||||
div_args.innerHTML += ', '; | |||||
//Types are bold | |||||
div_args.innerHTML += '<b>' + cur_match.m_arg[j].m_type + '</b> '; | |||||
type_list[type_list.length] = cur_match.m_arg[j].m_type; | |||||
//Names are not | |||||
div_args.innerHTML += cur_match.m_arg[j].m_name; | |||||
if (cur_match.m_arg[j].m_optional != undefined) | |||||
div_args.innerHTML += ' = <b>' + cur_match.m_arg[j].m_optional + '</b>'; | |||||
} | |||||
if (found_optional == true) | |||||
div_args.innerHTML += '] '; | |||||
div_args.innerHTML += ' <br>'; | |||||
} | |||||
//Add the comment | |||||
if (cur_match.m_comment != undefined) | |||||
{ | |||||
var tb_i = 16; var in_i = 8; | |||||
var tab = '<br>'; | |||||
if (cur_match.m_arg == undefined) { tb_i -= 8; in_i -= 8; } | |||||
for (var l = 0; l < in_i; l++) div_args.innerHTML += ' '; | |||||
for (var l = 0; l < tb_i; l++) tab += ' '; | |||||
div_args.innerHTML += cur_match.m_comment + ' '; | |||||
while (div_args.innerHTML.indexOf('\n') > -1) | |||||
div_args.innerHTML = div_args.innerHTML.replace('\n', tab); | |||||
} | |||||
} | |||||
} | |||||
//Go through the type list and bold the used ones. | |||||
if (cur_dict.m_vars != undefined) | |||||
{ | |||||
div_vars.innerHTML = ""; | |||||
var max = cur_dict.m_vars.length; | |||||
for (var j = 0; j < max; j++) | |||||
{ | |||||
var cur_var = cur_dict.m_vars[j]; | |||||
div_vars.innerHTML += " > "; | |||||
var k = 0; | |||||
for (; k < type_list.length; k++) | |||||
if (cur_var.m_type == type_list[k]) | |||||
break; | |||||
//Bold the used variables | |||||
if (k < type_list.length) | |||||
div_vars.innerHTML += "<b>" + cur_var.m_type + "</b>"; | |||||
else | |||||
div_vars.innerHTML += cur_var.m_type; | |||||
if (cur_var.m_syntax != undefined) | |||||
{ | |||||
var align_size = 9; | |||||
var cmd_size = cur_var.m_type.length + 3; | |||||
for (var m = 0; m < cur_var.m_syntax.length; m++) | |||||
{ | |||||
for (var l = 0; l < align_size - cmd_size; l++) | |||||
div_vars.innerHTML += " "; | |||||
div_vars.innerHTML += cur_var.m_syntax[m] + "<br>"; | |||||
cmd_size = 0; | |||||
} | |||||
var tab = ''; | |||||
for (var l = 0; l < align_size - cmd_size; l++) | |||||
tab += " "; | |||||
while (div_vars.innerHTML.indexOf('\n') > -1) | |||||
div_vars.innerHTML = div_vars.innerHTML.replace('\n', '<br>' + tab); | |||||
} | |||||
} | |||||
} | |||||
} | |||||
else | |||||
{ | |||||
div_cmds[0].innerHTML = "[ ... "; | |||||
div_cmds[1].innerHTML = ""; | |||||
div_args.innerHTML = ""; | |||||
div_cmnt.innerHTML = ""; | |||||
} | |||||
} | |||||
} |
@@ -60,14 +60,21 @@ | |||||
<None Include="data\mesh-buffer.txt"> | <None Include="data\mesh-buffer.txt"> | ||||
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">true</ExcludedFromBuild> | <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">true</ExcludedFromBuild> | ||||
</None> | </None> | ||||
<None Include="EasyMeshDictionnary.js" /> | |||||
<None Include="easy_mesh_dictionnary.js"> | |||||
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">true</ExcludedFromBuild> | |||||
</None> | |||||
<None Include="meshviewer_index.html"> | <None Include="meshviewer_index.html"> | ||||
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">true</ExcludedFromBuild> | <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">true</ExcludedFromBuild> | ||||
</None> | </None> | ||||
<None Include="meshviewer_nacl.nmf"> | <None Include="meshviewer_nacl.nmf"> | ||||
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">true</ExcludedFromBuild> | <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">true</ExcludedFromBuild> | ||||
</None> | </None> | ||||
<None Include="TypeDictionnary.js" /> | |||||
<None Include="nacl_loading.js"> | |||||
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">true</ExcludedFromBuild> | |||||
</None> | |||||
<None Include="TypeDictionnary.js"> | |||||
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">true</ExcludedFromBuild> | |||||
</None> | |||||
</ItemGroup> | </ItemGroup> | ||||
<ItemGroup> | <ItemGroup> | ||||
<LolFxCompile Include="mviewer_em_test.lolfx" /> | <LolFxCompile Include="mviewer_em_test.lolfx" /> | ||||
@@ -14,10 +14,6 @@ body | |||||
{ | { | ||||
font:12px Consolas; | font:12px Consolas; | ||||
} | } | ||||
#status_field | |||||
{ | |||||
font:12px Consolas; | |||||
} | |||||
button | button | ||||
{ | { | ||||
font:14px Consolas; | font:14px Consolas; | ||||
@@ -26,13 +22,25 @@ textarea | |||||
{ | { | ||||
font:14px Consolas; | font:14px Consolas; | ||||
} | } | ||||
#id_div_progress_status | |||||
{ | |||||
font:12px Consolas; | |||||
} | |||||
#id_div_progress | |||||
{ | |||||
position: absolute; | |||||
top: 40%; | |||||
left: 30%; | |||||
right: 30%; | |||||
z-index: 3; | |||||
} | |||||
progress | progress | ||||
{ | { | ||||
background-color: #f3f3f3; | background-color: #f3f3f3; | ||||
border: 0; | border: 0; | ||||
height: 18px; | height: 18px; | ||||
width: 200px; | width: 200px; | ||||
border-radius: 9px; | |||||
border-radius: 9px; | |||||
} | } | ||||
progress::-webkit-progress-bar | progress::-webkit-progress-bar | ||||
{ | { | ||||
@@ -49,18 +57,11 @@ progress::-webkit-progress-value | |||||
height: 14px; | height: 14px; | ||||
border-radius: 0px; | border-radius: 0px; | ||||
} | } | ||||
#listener | |||||
#id_div_listener | |||||
{ | { | ||||
position: relative; | position: relative; | ||||
} | } | ||||
#progress_bar | |||||
{ | |||||
position: absolute; | |||||
top: 40%; | |||||
left: 40%; | |||||
z-index: 3; | |||||
} | |||||
#DIV_nacl_div | |||||
#id_div_embed_data | |||||
{ | { | ||||
position: absolute; | position: absolute; | ||||
top: 2px; | top: 2px; | ||||
@@ -71,7 +72,7 @@ progress::-webkit-progress-value | |||||
{ | { | ||||
border:1px solid #000000; | border:1px solid #000000; | ||||
} | } | ||||
#DIV_command0 | |||||
#id_div_helper_cmd_0 | |||||
{ | { | ||||
margin-left: 5px; | margin-left: 5px; | ||||
} | } | ||||
@@ -79,331 +80,146 @@ progress::-webkit-progress-value | |||||
<title>Mesh Viewer NaCl</title> | <title>Mesh Viewer NaCl</title> | ||||
<script type="text/javascript"> | |||||
//Base data Setup | |||||
g_div_embed_data_save = null; | |||||
g_div_embed_data = null; // Global application object. | |||||
g_embed_nacl_module = null; // Global application object. | |||||
g_txtarea_code_src = null; | |||||
g_div_helper_cmd = [null, null]; | |||||
g_div_helper_args = null; | |||||
g_div_helper_cmnt = null; | |||||
g_div_helper_vars = null; | |||||
g_div_alphabet = null; | |||||
g_div_progress = null; | |||||
g_div_progress_status = null; | |||||
g_progress_bar = null; | |||||
g_var_progress_bar = -1; | |||||
function GetNaClListenerDiv() { return document.getElementById('id_div_listener'); } | |||||
function GetNaClModuleVar() { return g_embed_nacl_module; } | |||||
function InitNaClModuleVar() { g_embed_nacl_module = document.getElementById('id_embed_nacl_module'); } | |||||
function GetTextAreaCodeSrc() { return g_txtarea_code_src; } | |||||
function GetDivProgress() { return g_div_progress; } | |||||
function GetProgressBar() { return g_progress_bar; } | |||||
function GetDivProgressStatus() { return g_div_progress_status; } | |||||
function GetDivEmbedData() { return g_div_embed_data; } | |||||
function GetDivEmbedDataSave() { return g_div_embed_data_save; } | |||||
function IsUsingNaCl() { return true; } | |||||
</script> | |||||
<script src="./TypeDictionnary.js"></script> | <script src="./TypeDictionnary.js"></script> | ||||
<script type="text/javascript"> | <script type="text/javascript"> | ||||
var EasyMeshDict = new TypeDictionnary("EasyMesh"); | var EasyMeshDict = new TypeDictionnary("EasyMesh"); | ||||
function GetCmdDictionnary() { return EasyMeshDict; } | |||||
function GetCmdDictionnary() { return EasyMeshDict; } | |||||
</script> | </script> | ||||
<script src="./EasyMeshDictionnary.js"></script> | <script src="./EasyMeshDictionnary.js"></script> | ||||
<script src="./nacl_loading.js"></script> | |||||
<script type="text/javascript"> | <script type="text/javascript"> | ||||
nacl_div = null; // Global application object. | |||||
nacl_module = null; // Global application object. | |||||
mesh_code_module = null; | |||||
code_helper_cmd = [null, null]; | |||||
code_helper_arg = null; | |||||
code_helper_cmt = null; | |||||
code_helper_var = null; | |||||
code_helper_alpha = null; | |||||
status_text = 'NO-STATUS'; | |||||
window.setTimeout("Tick()", 100); | |||||
//Init should always start before the first tick | |||||
window.setTimeout("Init()", 100); | window.setTimeout("Init()", 100); | ||||
window.setTimeout("Tick()", 200); | |||||
//Base init for all datas | |||||
function Init() | function Init() | ||||
{ | { | ||||
nacl_div = document.getElementById('DIV_nacl_div'); | |||||
mesh_code_module = document.getElementById('DIV_MeshCode'); | |||||
code_helper_cmd[0] = document.getElementById('DIV_command0'); | |||||
code_helper_cmd[1] = document.getElementById('DIV_command1'); | |||||
code_helper_arg = document.getElementById('DIV_args'); | |||||
code_helper_cmt = document.getElementById('DIV_comment'); | |||||
code_helper_var = document.getElementById('DIV_var_usage'); | |||||
code_helper_alpha = document.getElementById('DIV_alphabet'); | |||||
code_helper_alpha.innerHTML = ' Table of content ['; | |||||
for (var a = 'a'.charCodeAt(0); a <= 'z'.charCodeAt(0); a++) | |||||
{ | |||||
var stop = false; | |||||
for (var i = 0; !stop && i < EasyMeshDict.m_cmds.length; i++) | |||||
{ | |||||
for (var j = 0; j < EasyMeshDict.m_cmds[i].m_name.length; j++) | |||||
{ | |||||
if (EasyMeshDict.m_cmds[i].m_name[j][0] == String.fromCharCode(a)) | |||||
{ | |||||
code_helper_alpha.innerHTML += '<b>' + String.fromCharCode(a) + '</b>'; | |||||
stop = true; | |||||
break; | |||||
} | |||||
} | |||||
} | |||||
if (!stop) | |||||
code_helper_alpha.innerHTML += '.'; | |||||
} | |||||
code_helper_alpha.innerHTML += '] <br> '; | |||||
g_div_embed_data = document.getElementById('id_div_embed_data'); | |||||
g_txtarea_code_src = document.getElementById('id_txtarea_code_src'); | |||||
g_div_helper_cmd[0] = document.getElementById('id_div_helper_cmd_0'); | |||||
g_div_helper_cmd[1] = document.getElementById('id_div_helper_cmd_1'); | |||||
g_div_helper_args = document.getElementById('id_div_helper_args'); | |||||
g_div_helper_cmnt = document.getElementById('id_div_helper_cmnt'); | |||||
g_div_helper_vars = document.getElementById('id_div_helper_vars'); | |||||
g_div_alphabet = document.getElementById('id_div_alphabet'); | |||||
g_div_progress = document.getElementById('id_div_progress'); | |||||
g_div_progress_status = document.getElementById('id_div_progress_status'); | |||||
g_progress_bar = document.getElementById('id_progress_bar'); | |||||
//Fill the TOC | |||||
g_div_alphabet.innerHTML = ' Table of content<br> ['; | |||||
var new_toc = BuildTOC(true); | |||||
var pattern = new RegExp("^[a-zA-Z\.]"); | |||||
while (pattern.test(new_toc)) | |||||
new_toc = new_toc.replace(pattern, "<b>$&"); | |||||
pattern = new RegExp("[a-zA-Z\.]$"); | |||||
while (pattern.test(new_toc)) | |||||
new_toc = new_toc.replace(pattern, "$&</b>"); | |||||
pattern = new RegExp("([a-zA-Z])([\.])"); | |||||
while (pattern.test(new_toc)) | |||||
new_toc = new_toc.replace(pattern, "$1</b>$2"); | |||||
pattern = new RegExp("([\.])([a-zA-Z])"); | |||||
while (pattern.test(new_toc)) | |||||
new_toc = new_toc.replace(pattern, "$1<b>$2"); | |||||
g_div_alphabet.innerHTML += new_toc + '] <br> '; | |||||
} | } | ||||
function Tick() | function Tick() | ||||
{ | { | ||||
window.setTimeout("Tick()", 100); | window.setTimeout("Tick()", 100); | ||||
/* -- cmd lookup code. */ | |||||
if (mesh_code_module != undefined) | |||||
{ | |||||
var cmd_size = 8; | |||||
var found = FindMatchingCommand(mesh_code_module); | |||||
if (found.match_list.length > 0) | |||||
{ | |||||
var type_list = new Array(); | |||||
code_helper_cmd[0].innerHTML = ""; | |||||
code_helper_cmd[1].innerHTML = ""; | |||||
code_helper_arg.innerHTML = ""; | |||||
code_helper_cmt.innerHTML = ""; | |||||
//Go through the found matches and show them. | |||||
for (var i = 0; i < found.match_list.length; i++) | |||||
{ | |||||
var cur_match = EasyMeshDict.m_cmds[found.match_list[i]]; | |||||
code_helper_cmd[0].innerHTML += '['; | |||||
var max = cur_match.m_name.length; | |||||
var word = 0; | |||||
for (var j = 0; j < max; j++) | |||||
{ | |||||
var mth = found.match; | |||||
var cmd = cur_match.m_name[j]; | |||||
//Matching start caracters should be bold | |||||
if (mth == cmd.slice(0, mth.length)) | |||||
{ | |||||
code_helper_cmd[word].innerHTML += ' '; | |||||
code_helper_cmd[word].innerHTML += '<b>' + mth + '</b>'; | |||||
code_helper_cmd[word].innerHTML += cmd.slice(mth.length, cmd.length); | |||||
word++; | |||||
} | |||||
} | |||||
//Complete empty command by <br> so commands in the two columns are on the same line | |||||
word = (word > 0)?(2):(0); | |||||
while (word-- > 0) | |||||
code_helper_cmd[word].innerHTML += "<br>"; | |||||
//Go through the arguments and show them | |||||
if (found.match_list.length < 4 && i == 0) | |||||
{ | |||||
code_helper_arg.innerHTML += " > "; | |||||
if (cur_match.m_arg != undefined) | |||||
{ | |||||
max = cur_match.m_arg.length; | |||||
var found_optional = false; | |||||
for (var j = 0; j < max; j++) | |||||
{ | |||||
if (cur_match.m_arg[j].m_optional != undefined && found_optional == false) | |||||
{ | |||||
var tab = '<br>'; for (var l = 0; l < 5; l++) tab += ' '; | |||||
code_helper_arg.innerHTML += tab + 'Opt: ['; | |||||
found_optional = true; | |||||
} | |||||
else if (j > 0) | |||||
code_helper_arg.innerHTML += ', '; | |||||
//Types are bold | |||||
code_helper_arg.innerHTML += '<b>' + cur_match.m_arg[j].m_type + '</b> '; | |||||
type_list[type_list.length] = cur_match.m_arg[j].m_type; | |||||
//Names are not | |||||
code_helper_arg.innerHTML += cur_match.m_arg[j].m_name; | |||||
if (cur_match.m_arg[j].m_optional != undefined) | |||||
code_helper_arg.innerHTML += ' = <b>' + cur_match.m_arg[j].m_optional + '</b>'; | |||||
} | |||||
if (found_optional == true) | |||||
code_helper_arg.innerHTML += '] '; | |||||
code_helper_arg.innerHTML += ' <br>'; | |||||
} | |||||
//Add the comment | |||||
if (cur_match.m_comment != undefined) | |||||
{ | |||||
var tb_i = 16; var in_i = 8; | |||||
var tab = '<br>'; | |||||
if (cur_match.m_arg == undefined) { tb_i -= 8; in_i -= 8; } | |||||
for (var l = 0; l < in_i; l++) code_helper_arg.innerHTML += ' '; | |||||
for (var l = 0; l < tb_i; l++) tab += ' '; | |||||
code_helper_arg.innerHTML += cur_match.m_comment + ' '; | |||||
while (code_helper_arg.innerHTML.indexOf('\n') > -1) | |||||
code_helper_arg.innerHTML = code_helper_arg.innerHTML.replace('\n', tab); | |||||
} | |||||
} | |||||
} | |||||
//Go through the type list and bold the used ones. | |||||
if (EasyMeshDict.m_vars != undefined) | |||||
{ | |||||
code_helper_var.innerHTML = ""; | |||||
var max = EasyMeshDict.m_vars.length; | |||||
for (var j = 0; j < max; j++) | |||||
{ | |||||
var cur_var = EasyMeshDict.m_vars[j]; | |||||
code_helper_var.innerHTML += " > "; | |||||
var k = 0; | |||||
for (; k < type_list.length; k++) | |||||
if (cur_var.m_type == type_list[k]) | |||||
break; | |||||
//Bold the used variables | |||||
if (k < type_list.length) | |||||
code_helper_var.innerHTML += "<b>" + cur_var.m_type + "</b>"; | |||||
else | |||||
code_helper_var.innerHTML += cur_var.m_type; | |||||
if (cur_var.m_syntax != undefined) | |||||
{ | |||||
var align_size = 9; | |||||
var cmd_size = cur_var.m_type.length + 3; | |||||
for (var m = 0; m < cur_var.m_syntax.length; m++) | |||||
{ | |||||
for (var l = 0; l < align_size - cmd_size; l++) | |||||
code_helper_var.innerHTML += " "; | |||||
code_helper_var.innerHTML += cur_var.m_syntax[m] + "<br>"; | |||||
cmd_size = 0; | |||||
} | |||||
} | |||||
} | |||||
} | |||||
} | |||||
else | |||||
{ | |||||
code_helper_cmd[0].innerHTML = "[ ... "; | |||||
code_helper_cmd[1].innerHTML = ""; | |||||
code_helper_arg.innerHTML = ""; | |||||
code_helper_cmt.innerHTML = ""; | |||||
} | |||||
} | |||||
/* -- */ | |||||
} | |||||
// Indicate load success. | |||||
function moduleDidLoad() { | |||||
nacl_module = document.getElementById('ID_NaClModule'); | |||||
mesh_code_module = document.getElementById('DIV_MeshCode'); | |||||
updateStatus('Rock n\' Roll !!'); | |||||
var progress_bar = document.getElementById('progress_bar'); | |||||
progress_bar.style.visibility = "hidden"; | |||||
} | |||||
// The 'message' event handler. This handler is fired when the NaCl module | |||||
// posts a message to the browser by calling PPB_Messaging.PostMessage() | |||||
// (in C) or pp::Instance.PostMessage() (in C++). This implementation | |||||
// simply displays the content of the message in an alert panel. | |||||
function handleMessage(message_event) { | |||||
alert(message_event.data); | |||||
} | |||||
// If the page loads before the Native Client module loads, then set the | |||||
// status message indicating that the module is still loading. Otherwise, | |||||
// do not change the status message. | |||||
function pageDidLoad() { | |||||
if (nacl_module == null) { | |||||
updateStatus('Please wait, loading ...'); | |||||
} else { | |||||
// It's possible that the Native Client module onload event fired | |||||
// before the page's onload event. In this case, the status message | |||||
// will reflect 'SUCCESS', but won't be displayed. This call will | |||||
// display the current message. | |||||
updateStatus(); | |||||
} | |||||
var text_src = g_txtarea_code_src; | |||||
var div_cmds = g_div_helper_cmd; | |||||
var div_args = g_div_helper_args; | |||||
var div_cmnt = g_div_helper_cmnt; | |||||
var div_vars = g_div_helper_vars; | |||||
CmdLookup(div_cmds, div_args, div_cmnt, div_vars, text_src); | |||||
} | } | ||||
// Set the global status message. If the element with id 'statusField' | |||||
// exists, then set its HTML to the status message as well. | |||||
// opt_message The message test. If this is null or undefined, then | |||||
// attempt to set the element with id 'statusField' to the value of | |||||
// |status_text|. | |||||
function updateStatus(opt_message) { | |||||
if (opt_message) | |||||
status_text = opt_message; | |||||
var statusField = document.getElementById('status_field'); | |||||
if (statusField) { | |||||
statusField.innerHTML = status_text; | |||||
} | |||||
} | |||||
function moduleCrash(event) | |||||
{ | |||||
alert("Module has crashed !"); | |||||
//nacl_module.src = null; | |||||
} | |||||
function moduleLoadProgress(event) | |||||
{ | |||||
var progressBar = document.getElementById("p"); | |||||
var statusField = document.getElementById('status_field'); | |||||
if (event.lengthComputable) | |||||
{ | |||||
progressBar.max = event.total; | |||||
progressBar.value = event.loaded; | |||||
var load_progress = ((event.loaded / event.total) * 100.0); | |||||
status_field.innerHTML = 'Please wait, loading [' + load_progress.toFixed(0) + '%]'; | |||||
} | |||||
else | |||||
{ | |||||
progressBar.value = -1; | |||||
status_field.innerHTML = 'Computing progress ...' | |||||
} | |||||
} | |||||
//Called by the "Send Mesh Command !" button | |||||
function SendMeshData() | |||||
{ | |||||
if (nacl_module) | |||||
nacl_module.postMessage(mesh_code_module.value); | |||||
else | |||||
alert("Module not loaded"); | |||||
} | |||||
</script> | </script> | ||||
</head> | </head> | ||||
<body onload="pageDidLoad()"> | |||||
<body onload="PageDidLoad()"> | |||||
<h1>Mesh Viewer : Native Client version.</h1> | <h1>Mesh Viewer : Native Client version.</h1> | ||||
<p> | <p> | ||||
<div id="final_div"> | <div id="final_div"> | ||||
<div id="listener" align="center" style="width:770px;height:200px"> | |||||
<div id="id_div_listener" align="center" style="width:770px;height:200px"> | |||||
<canvas id="BGCanvas" width="772" height="202"></canvas> | <canvas id="BGCanvas" width="772" height="202"></canvas> | ||||
<div id="progress_bar"> | |||||
<div id="status_field">NO-STATUS</div> | |||||
<progress id="p" align="left" width="200"></progress> | |||||
<div id="id_div_progress"> | |||||
<div id="id_div_progress_status">....</div> | |||||
<progress id="id_progress_bar" align="left"></progress> | |||||
</div> | </div> | ||||
<div id="DIV_nacl_div"> | |||||
<div id="id_div_embed_data"> | |||||
<!-- | |||||
<param name="wmode" value="opaque"/> | <param name="wmode" value="opaque"/> | ||||
<embed name="nacl_module" | |||||
id="ID_NaClModule" | |||||
<embed name="g_embed_nacl_module" | |||||
id="id_embed_nacl_module" | |||||
width=770 height=200 | width=770 height=200 | ||||
src="meshviewer_nacl.nmf" | src="meshviewer_nacl.nmf" | ||||
type="application/x-nacl" /> | type="application/x-nacl" /> | ||||
--> | |||||
</div> | </div> | ||||
<script type="text/javascript"> | |||||
var listener = document.getElementById('listener'); | |||||
listener.addEventListener('load', moduleDidLoad, true); | |||||
listener.addEventListener('progress', moduleLoadProgress, true); | |||||
listener.addEventListener('message', handleMessage, true); | |||||
listener.addEventListener('crash', moduleCrash, true); | |||||
</script> | |||||
</div> | </div> | ||||
</div> | </div> | ||||
</p> | </p> | ||||
<div><button onclick="SendMeshData()">Send Mesh Command !</button></div> | |||||
<div><button onclick="SendMessageToModule()">Send Mesh Command !</button></div> | |||||
<table border="0" cellpadding="0" cellspacing="0"> | <table border="0" cellpadding="0" cellspacing="0"> | ||||
<tr> | <tr> | ||||
<td> | <td> | ||||
<div id="bouton"> | <div id="bouton"> | ||||
<textarea autofocus id="DIV_MeshCode" rows="6" cols="94" style="font: 14px Consolas; resize: none;">//This is a comment | |||||
<textarea autofocus id="id_txtarea_code_src" rows="6" cols="94" style="font: 14px Consolas; resize: none;">//This is a comment | |||||
sc#f8f afcb 1 1 1 0</textarea> | sc#f8f afcb 1 1 1 0</textarea> | ||||
</div> | </div> | ||||
</td> | </td> | ||||
<td valign="top" rowspan="3"> </td> | <td valign="top" rowspan="3"> </td> | ||||
<td valign="top" rowspan="3"> | <td valign="top" rowspan="3"> | ||||
<div><b><u>Variable Types usage :</u></b></div> | <div><b><u>Variable Types usage :</u></b></div> | ||||
<div id="DIV_var_usage"></div> | |||||
<div id="id_div_helper_vars"></div> | |||||
</td> | </td> | ||||
</tr> | </tr> | ||||
<tr> | <tr> | ||||
<td> | <td> | ||||
<div id="DIV_alphabet"></div> | |||||
<div id="id_div_alphabet"></div> | |||||
</td> | </td> | ||||
</tr> | </tr> | ||||
<tr> | <tr> | ||||
<td valign="top"> | <td valign="top"> | ||||
<table border="0" cellpadding="0" cellspacing="0"> | <table border="0" cellpadding="0" cellspacing="0"> | ||||
<tr> | <tr> | ||||
<td valign="top"><div id="DIV_command0"></div></td> | |||||
<td valign="top"><div id="DIV_command1"></div></td> | |||||
<td valign="top"><div id="DIV_args" ></div></td> | |||||
<td valign="top"><div id="DIV_comment" ></div></td> | |||||
<td valign="top"><div id="id_div_helper_cmd_0"></div></td> | |||||
<td valign="top"><div id="id_div_helper_cmd_1"></div></td> | |||||
<td valign="top"><div id="id_div_helper_args" ></div></td> | |||||
<td valign="top"><div id="id_div_helper_cmnt" ></div></td> | |||||
</tr> | </tr> | ||||
</table> | </table> | ||||
</td> | </td> | ||||
@@ -0,0 +1,211 @@ | |||||
g_status_text = [null]; | |||||
g_status_timer = [-1.0]; | |||||
g_var_progress_bar = -1; | |||||
window.setTimeout("RegisterListener()", 200); | |||||
function RegisterListener() | |||||
{ | |||||
//Register all the correct functions to the listener | |||||
var div_listener = GetNaClListenerDiv(); | |||||
if (div_listener) | |||||
{ | |||||
div_listener.addEventListener('loadstart', ModuleStartedLoad, true); | |||||
div_listener.addEventListener('load', ModuleDidLoad, true); | |||||
div_listener.addEventListener('error', ModuleError, true); | |||||
div_listener.addEventListener('progress', ModuleLoadUpdate, true); | |||||
div_listener.addEventListener('message', ModuleSentMessage, true); | |||||
div_listener.addEventListener('crash', ModuleCrash, true); | |||||
window.setTimeout("UpdateTextStatus()", 100); | |||||
} | |||||
else if (IsUsingNaCl()) | |||||
window.setTimeout("RegisterListener()", 200); | |||||
} | |||||
//------------------------------------------------------------------------- | |||||
// MODULE LOADING FUNCTIONS | |||||
//------------------------------------------------------------------------- | |||||
//Indicate page has been loaded. | |||||
function PageDidLoad() | |||||
{ | |||||
//Page did load before NaCl module | |||||
if (GetNaClModuleVar() == null) | |||||
AddTextStatus('Please wait for module loading'); | |||||
} | |||||
//Module starts load | |||||
function ModuleStartedLoad() | |||||
{ | |||||
AddTextStatus('Module Started Loading'); | |||||
InitNaClModuleVar(); | |||||
} | |||||
//Module progress event | |||||
function ModuleLoadUpdate(event) | |||||
{ | |||||
var progress_bar = GetProgressBar(); | |||||
if (progress_bar) | |||||
{ | |||||
if (event.lengthComputable) | |||||
{ | |||||
if (progress_bar.value < 0) | |||||
g_var_progress_bar = -1; | |||||
var loading_text = 'Please wait, loading [' + (Math.min(1.0, event.loaded / event.total) * 100.0).toFixed(0) + '%]'; | |||||
//update the progress status. | |||||
progress_bar.max = event.total; | |||||
progress_bar.value = event.loaded; | |||||
g_var_progress_bar = AddTextStatus(loading_text, g_var_progress_bar); | |||||
} | |||||
//Load length is not usable. | |||||
else | |||||
{ | |||||
progress_bar.value = -1; | |||||
g_var_progress_bar = AddTextStatus('Please wait, calculating load balance ...', g_var_progress_bar); | |||||
} | |||||
} | |||||
} | |||||
//Indicate module load success. | |||||
function ModuleDidLoad() | |||||
{ | |||||
if (GetNaClModuleVar() == null) | |||||
InitNaClModuleVar(); | |||||
//Hide the progress div | |||||
AddTextStatus('Module is live, thank you for your patience.'); | |||||
window.setTimeout('HideProgressStatus(true)', 4000); | |||||
} | |||||
//Module did crash | |||||
function ModuleCrash(event) | |||||
{ | |||||
RestartModule(); | |||||
AddTextStatus("Module has crashed ! Restarting ..."); | |||||
} | |||||
//Module had an error | |||||
function ModuleError(event) | |||||
{ | |||||
RestartModule(); | |||||
AddTextStatus("Module Load/start Error ! Restarting ..."); | |||||
} | |||||
//Used to restart module on crash/error/load fail .... | |||||
function RestartModule() | |||||
{ | |||||
var div_embed_data = GetDivEmbedData(); | |||||
var div_embed_data_save = GetDivEmbedDataSave(); | |||||
if (div_embed_data && div_embed_data_save) | |||||
{ | |||||
HideProgressStatus(false); | |||||
div_embed_data_save = div_embed_data.innerHTML; | |||||
div_embed_data.innerHTML = ''; | |||||
window.setTimeout('RestartModuleRestoreEmbed()', 1000); | |||||
} | |||||
} | |||||
function RestartModuleRestoreEmbed() | |||||
{ | |||||
var div_embed_data = GetDivEmbedData(); | |||||
var div_embed_data_save = GetDivEmbedDataSave(); | |||||
if (div_embed_data && div_embed_data_save) | |||||
{ | |||||
div_embed_data.innerHTML = div_embed_data_save; | |||||
div_embed_data.innerHTML = ''; | |||||
HideProgressStatus(false); | |||||
} | |||||
} | |||||
//------------------------------------------------------------------------- | |||||
// MODULE COMMUNICATION FUNCTIONS | |||||
//------------------------------------------------------------------------- | |||||
//Handle message from the NaCl module | |||||
function ModuleSentMessage(message) | |||||
{ | |||||
alert('Module sent message: ' + message.data); | |||||
} | |||||
//Called by the "Send Mesh Command !" button | |||||
function SendMessageToModule() | |||||
{ | |||||
if (GetNaClModuleVar()) | |||||
GetNaClModuleVar().postMessage(GetTextAreaCodeSrc().value); | |||||
else | |||||
alert("Module not loaded !"); | |||||
} | |||||
//------------------------------------------------------------------------- | |||||
// PROGRESS BAR STATUS FUNCTIONS | |||||
//------------------------------------------------------------------------- | |||||
//Update progress bar status | |||||
function UpdateTextStatus(seconds) | |||||
{ | |||||
var div_progress_status = GetDivProgressStatus(); | |||||
if (div_progress_status) | |||||
{ | |||||
div_progress_status.innerHTML = ''; | |||||
for (var i = 0; i < g_status_text.length; i++) | |||||
{ | |||||
if (g_status_timer[i] == undefined || g_status_timer[i] < 0.0) | |||||
{ | |||||
g_status_timer[i] = -1.0; | |||||
g_status_text[i] = undefined; | |||||
} | |||||
else | |||||
{ | |||||
g_status_timer[i] -= seconds; | |||||
div_progress_status.innerHTML += g_status_text[i]; | |||||
if (i < g_status_text.length - 1) | |||||
div_progress_status.innerHTML += '<br>'; | |||||
} | |||||
} | |||||
window.setTimeout("UpdateTextStatus()", 100); | |||||
} | |||||
} | |||||
//Add text status to the stack | |||||
function AddTextStatus(message, message_id) | |||||
{ | |||||
if (message_id == undefined || message_id < 0) | |||||
{ | |||||
g_status_text[g_status_text.length] = message; | |||||
g_status_timer[g_status_timer.length] = 5.0; | |||||
return g_status_timer.length - 1; | |||||
} | |||||
else | |||||
{ | |||||
g_status_text[message_id] = message; | |||||
g_status_timer[message_id] = 5.0; | |||||
return message_id; | |||||
} | |||||
} | |||||
//Hide Progress Status and empty status texts | |||||
function HideProgressStatus(should_hide) | |||||
{ | |||||
var progress_bar = GetProgressBar(); | |||||
var div_progress = GetDivProgress(); | |||||
if (div_progress && progress_bar) | |||||
{ | |||||
if (should_hide == true) | |||||
{ | |||||
div_progress.style.visibility = "hidden"; | |||||
g_status_text.splice(0, g_status_text.length); | |||||
g_status_timer.splice(0, g_status_timer.length); | |||||
progress_bar.value = -1; | |||||
UpdateTextStatus(0.1); | |||||
} | |||||
else | |||||
{ | |||||
div_progress.style.visibility = "visible"; | |||||
progress_bar.value = -1; | |||||
AddTextStatus('Please wait for module loading'); | |||||
UpdateTextStatus(0.1); | |||||
} | |||||
} | |||||
} |