From 2c4fa5e17399c1054f497e8d3659cebbbff25c6e Mon Sep 17 00:00:00 2001 From: "Kirill Lipatov (Leency)" Date: Sun, 29 Mar 2020 10:57:14 +0000 Subject: [PATCH] WebView 2.0 beta 4: highlight a link as a single item, more refactoring git-svn-id: svn://kolibrios.org@7757 a494cfbc-eb01-0410-851d-a64ba20cac60 --- programs/cmm/TWB/TWB.c | 45 +++--- programs/cmm/TWB/absolute_url.h | 33 ++-- programs/cmm/TWB/img_cache.h | 5 +- programs/cmm/TWB/links.h | 51 ++++-- programs/cmm/TWB/unicode_tags.h | 45 +++--- programs/cmm/aelia/aelia.c | 2 + programs/cmm/browser/WebView.c | 71 ++++---- programs/cmm/browser/show_src.h | 6 +- programs/cmm/codeview/codeview.c | 153 +++++++++--------- .../codeview/{show_src.h => highlight_c.h} | 13 +- programs/cmm/codeview/html/homepage.htm | 5 +- .../cmm/codeview/html/page_not_found_en.htm | 12 +- programs/cmm/eolite/Eolite.c | 2 + programs/cmm/lib/list_box.h | 3 + programs/cmm/lib/patterns/history.h | 2 +- programs/cmm/lib/strings.h | 80 +++++---- programs/cmm/liza/liza.c | 1 - 17 files changed, 268 insertions(+), 261 deletions(-) rename programs/cmm/codeview/{show_src.h => highlight_c.h} (86%) diff --git a/programs/cmm/TWB/TWB.c b/programs/cmm/TWB/TWB.c index fefe1217ac..6215b2eb17 100644 --- a/programs/cmm/TWB/TWB.c +++ b/programs/cmm/TWB/TWB.c @@ -2,8 +2,12 @@ #include "..\TWB\anchors.h" #include "..\TWB\parce_tag.h" #include "..\TWB\absolute_url.h" -char line[500]; #include "..\TWB\unicode_tags.h" +#include "..\TWB\img_cache.h" +dword page_bg; +dword link_color_inactive; +dword link_color_active; +#include "..\TWB\links.h" enum { ALIGN_LEFT, ALIGN_CENTER, ALIGN_RIGHT}; @@ -39,15 +43,10 @@ struct TWebBrowser { void BufEncode(); } WB1; -dword page_bg; -#include "..\TWB\img_cache.h" - -dword link_color_inactive; -dword link_color_active; +char line[500]; bool link, cur_encoding, t_html, t_body; -#include "..\TWB\links.h" dword bufpointer=0; dword bufsize=0; @@ -57,7 +56,7 @@ char header[150]; int body_magrin=6; int basic_line_h=22; -scroll_bar scroll_wv = { 15,NULL,NULL,NULL,0,2,NULL,15,0,0xeeeeee,0xBBBbbb,0xeeeeee}; +scroll_bar scroll_wv = { 15,NULL,NULL,NULL,0,2,NULL,0,0,0xeeeeee,0xBBBbbb,0xeeeeee}; //============================================================================================ void TWebBrowser::DrawStyle() @@ -128,8 +127,10 @@ void TWebBrowser::SetPageDefaults() stolbec = 0; line = 0; zoom = 1; - if (o_bufpointer) free(o_bufpointer); - o_bufpointer = 0; + //hold original buffer + if (o_bufpointer) o_bufpointer=free(o_bufpointer); + o_bufpointer = malloc(bufsize); + memmov(o_bufpointer, bufpointer, bufsize); } //============================================================================================ void TWebBrowser::AddCharToTheLine(unsigned char _char) @@ -187,7 +188,7 @@ void TWebBrowser::ParseHtml(){ bukva = ESBYTE[bufpos+j]; chrcat(#unicode_symbol, bukva); } - if (bukva = GetUnicodeSymbol(#unicode_symbol)) { + if (GetUnicodeSymbol(#line, #unicode_symbol, sizeof(line)-1)) { bufpos += j; CheckForLineBreak(); } else { @@ -242,7 +243,7 @@ void TWebBrowser::ParseHtml(){ if (tag.name[strlen(#tag.name)-1]=='/') tag.name[strlen(#tag.name)-1]=NULL; //for br/ !!!!!!!! if (tag.params) tag.parse_params(); - if (tag.name) && (!tag.is("i")) && (!tag.is("svg")) { + if (tag.name) { CheckForLineBreak(); DrawStyle(); if (tag.name) SetStyle(); @@ -300,12 +301,12 @@ void TWebBrowser::SetStyle() { t_html = tag.opened; return; } - if(tag.is("title")) { + if (tag.is("title")) { if (tag.opened) header=NULL; return; } - IF(tag.is("q")) + if (tag.is("q")) { if (tag.opened) { meta_encoding = strlen(#line); @@ -384,6 +385,7 @@ void TWebBrowser::SetStyle() { return; } if (tag.is("br")) { NewLine(); return; } + if (tag.is("td")) { if (tag.opened) AddCharToTheLine(' '); return; } if (tag.is("tr")) { if (tag.opened) NewLine(); return; } if (tag.is("b")) || (tag.is("strong")) || (tag.is("big")) { style.b = tag.opened; return; } if (tag.is("button")) { style.button = tag.opened; stolbec++; return; } @@ -459,7 +461,7 @@ void TWebBrowser::SetStyle() { if (tag.is("ul")) || (tag.is("ol")) { if (!tag.opened) { - style.li = tag.opened; + style.li = false; style.li_tab--; NewLine(); } @@ -495,17 +497,10 @@ void TWebBrowser::SetStyle() { //============================================================================================ void TWebBrowser::BufEncode(dword set_new_encoding) { - if (cur_encoding == set_new_encoding) return; - if (o_bufpointer==0) { - o_bufpointer = malloc(bufsize); - strcpy(o_bufpointer, bufpointer); - } else { - strcpy(bufpointer, o_bufpointer); + if (cur_encoding != set_new_encoding) { + cur_encoding = set_new_encoding; + bufpointer = ChangeCharset(charsets[cur_encoding], "CP866", bufpointer); } - //debugval("cur_encoding ", cur_encoding); - //debugval("set_new_encoding", set_new_encoding); - cur_encoding = set_new_encoding; - bufpointer = ChangeCharset(charsets[cur_encoding], "CP866", bufpointer); } //============================================================================================ void TWebBrowser::DrawScroller() diff --git a/programs/cmm/TWB/absolute_url.h b/programs/cmm/TWB/absolute_url.h index 9115f9c0ac..4f2ce146ed 100644 --- a/programs/cmm/TWB/absolute_url.h +++ b/programs/cmm/TWB/absolute_url.h @@ -1,40 +1,33 @@ -dword GetAbsoluteURL(dword in_URL) +:dword GetAbsoluteURL(dword new_URL, base_URL) { int i; - dword orig_URL = in_URL; + dword orig_URL = new_URL; char newurl[URL_SIZE+1]; + strcpy(#newurl, base_URL); - while (i=strstr(in_URL, "&")) + while (i=strstr(new_URL, "&")) { strcpy(i+1, i+5); } - if (check_is_the_url_absolute(in_URL)) return orig_URL; + if (check_is_the_url_absolute(new_URL)) return orig_URL; - IF (!strncmp(in_URL,"//", 2)) + IF (!strncmp(new_URL,"//", 2)) { strcpy(#newurl, "http:"); - strcat(#newurl, in_URL); + strcat(#newurl, new_URL); strcpy(orig_URL, #newurl); return orig_URL; } - IF (!strncmp(in_URL,"./", 2)) in_URL+=2; - if (!http.transfer) - { - strcpy(#newurl, history.current()); - } - else - { - strcpy(#newurl, history.items.get(history.active-2)); - } + IF (!strncmp(new_URL,"./", 2)) new_URL+=2; - if (ESBYTE[in_URL] == '/') //remove everything after site domain name + if (ESBYTE[new_URL] == '/') //remove everything after site domain name { i = strchr(#newurl+8, '/'); if (i) ESBYTE[i]=0; - in_URL+=1; + new_URL+=1; } _CUT_ST_LEVEL_MARK: @@ -44,16 +37,16 @@ dword GetAbsoluteURL(dword in_URL) newurl[strrchr(#newurl, '/')] = 0x00; } - IF (!strncmp(in_URL,"../",3)) + IF (!strncmp(new_URL,"../",3)) { - in_URL+=3; + new_URL+=3; newurl[strrchr(#newurl, '/')-1] = 0x00; goto _CUT_ST_LEVEL_MARK; } if (newurl[strlen(#newurl)-1]<>'/') strcat(#newurl, "/"); - strcat(#newurl, in_URL); + strcat(#newurl, new_URL); strcpy(orig_URL, #newurl); return orig_URL; } diff --git a/programs/cmm/TWB/img_cache.h b/programs/cmm/TWB/img_cache.h index 3f2be1acb3..471af4753c 100644 --- a/programs/cmm/TWB/img_cache.h +++ b/programs/cmm/TWB/img_cache.h @@ -52,7 +52,9 @@ void ImageCache::Images(dword left1, top1, width1) imgh = DSWORD[pics[cur_pic].image+8]; if (imgw > width1) imgw = width1; - //draw_y += imgh + 5; TEMPORARY TURN OFF!!! + /* + draw_y += imgh + 5; TEMPORARY TURN OFF!!! + if (top1+imghWB1.list.y+WB1.list.h-10) return; //if all image is out of visible area if (top1= MAXLINKS) return; page_links.add(lpath); + unic_count++; } void LinksArray::AddText(dword _x, _y, _w, _h, _link_underline, _underline_h) @@ -41,6 +45,7 @@ void LinksArray::AddText(dword _x, _y, _w, _h, _link_underline, _underline_h) links[count].underline = _link_underline; links[count].underline_h = _underline_h; links[count].link = page_links.get(page_links.count-1); + links[count].unic_id = unic_count; count++; } @@ -55,12 +60,24 @@ void LinksArray::Clear() page_links.realloc_size = 4096 * 32; count = 0; active = -1; + unic_count = 0; CursorPointer.Restore(); } +void LinksArray::DrawUnderline(dword und_id, list_first, list_y, color) +{ + int i; + for (i=0; i list_y) { + DrawBar(links[i].x, links[i].y + links[i].h - list_first, links[i].w, links[i].underline_h, color); + } + } +} + PathShow_data status_text = {0, 17,250, 6, 250, 0, 0, 0x0, 0xFFFfff, 0, NULL, 0}; -bool LinksArray::HoverAndProceed(dword mx, my) +bool LinksArray::HoverAndProceed(dword mx, my, list_y, list_first) { int i; if (!count) return true; @@ -68,10 +85,10 @@ bool LinksArray::HoverAndProceed(dword mx, my) { if (mx>links[i].x) && (my>links[i].y) && (mxWB1.list.y+WB1.list.first) + && (my>list_y+list_first) { if (mouse.lkm) && (mouse.down) { - DrawRectangle(links[active].x, -WB1.list.first + links[active].y, + DrawRectangle(links[active].x, -list_first + links[active].y, links[active].w, links[active].h, 0); return false; } @@ -91,10 +108,15 @@ bool LinksArray::HoverAndProceed(dword mx, my) if (active==i) return false; CursorPointer.Load(#CursorFile); CursorPointer.Set(); - if (links[active].underline) DrawUnderline(links[active].x, -WB1.list.first + links[active].y - + links[active].h, links[active].w, links[active].underline_h, link_color_inactive); - if (links[i].underline) DrawUnderline(links[i].x, -WB1.list.first + links[i].y - + links[i].h, links[i].w, links[i].underline_h, page_bg); + + if (links[active].underline) { + DrawUnderline(active, list_first, list_y, link_color_inactive); + } + + if (links[i].underline) { + DrawUnderline(i, list_first, list_y, page_bg); + } + active = i; DrawStatusBar(links[active].link); return true; @@ -104,15 +126,10 @@ bool LinksArray::HoverAndProceed(dword mx, my) { CursorPointer.Restore(); if (links[active].underline) { - DrawUnderline(links[active].x, -WB1.list.first + links[active].y + links[active].h,links[active].w, - links[active].underline_h, link_color_inactive); + DrawUnderline(active, list_first, list_y, link_color_inactive); } - DrawBar(status_text.start_x, status_text.start_y, status_text.area_size_x, 9, col_bg); + DrawStatusBar(NULL); active = -1; } } -void DrawUnderline(dword x,y,w,h,color) -{ - if (y>WB1.list.y) DrawBar(x,y,w,h,color); -} diff --git a/programs/cmm/TWB/unicode_tags.h b/programs/cmm/TWB/unicode_tags.h index d791574ce8..0f71c6dbe2 100644 --- a/programs/cmm/TWB/unicode_tags.h +++ b/programs/cmm/TWB/unicode_tags.h @@ -1,14 +1,9 @@ char *unicode_symbols[]={ -"#32", " ", -"#34", "\"", "quot","\"", -"#38", "&", "amp", "&", -"#39", "'", -"#039","'", -"#60", "<", "lt", "<", -"#62", ">", "gt", ">", -"#91", "[", -"#93", "]", -"#96", "'", +"quot","\"", +"amp", "&", +"lt", "<", +"gt", ">", +"#183","\31", "middot", "\31", "#149","-", "#151","-", "#160"," ", "nbsp", " ", @@ -32,11 +27,13 @@ char *unicode_symbols[]={ "#8211", "-", "#8217", "'", +"#8220", "\"", "#8222", "\"", "ldquo", "\"", "#8221", "\"", "rdquo", "\"", "#8470", "N", "#8722", "-", "#9642", "-", //square in the middle of the line +"#65122", "+", "uarr", "\24", "darr", "\25", @@ -53,33 +50,31 @@ char *unicode_symbols[]={ unsigned char unicode_chars[] = "АБВГДЕЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯабвгдежзийклмнопрстуфхцчшщъыьэюяЁёhг\243i\105\244\0"; -bool GetUnicodeSymbol(dword in_tag) +bool GetUnicodeSymbol(dword _line, in_tag, size) { - int j, specia1040; + int j; + int code; for (j=0; unicode_symbols[j]!=0; j+=2;) { if (!strcmp(in_tag, unicode_symbols[j])) { - strcat(#line, unicode_symbols[j+1]); + strncat(_line, unicode_symbols[j+1], size); return true; } } - specia1040 = atoi(in_tag + 1) - 1040; - - if (ESBYTE[in_tag+1] == '1') && (specia1040>=0) - && (specia1040<=72) && (strlen(in_tag) == 5) + if (ESBYTE[in_tag]=='#') { - if (strlen(#line)=0) && (code<=255) { + chrncat(_line, code, size); //NOT ALL ASCII CODES IN KOLIBRI ARE COMPATABLE WITH STANDARDS + return true; + } + if (code>=1040) && (code<=1040+72) { + chrncat(_line, unicode_chars[code-1040], size); + return true; } - return true; } return false; diff --git a/programs/cmm/aelia/aelia.c b/programs/cmm/aelia/aelia.c index 79622bd990..c80e44de84 100644 --- a/programs/cmm/aelia/aelia.c +++ b/programs/cmm/aelia/aelia.c @@ -23,6 +23,8 @@ llist list; #include "canvas.h" #include "favicon.h" +_history history; + char default_dir[] = "/rd/1"; od_filter filter2 = { 16, "TXT\0HTM\0HTML\0\0" }; diff --git a/programs/cmm/browser/WebView.c b/programs/cmm/browser/WebView.c index e1c5e70dd0..e3b9b95a67 100644 --- a/programs/cmm/browser/WebView.c +++ b/programs/cmm/browser/WebView.c @@ -23,13 +23,26 @@ #include "..\lib\obj\http.h" #include "..\lib\obj\iconv.h" #include "..\lib\obj\proc_lib.h" + //useful patterns #include "..\lib\patterns\history.h" #include "..\lib\patterns\http_downloader.h" #include "..\lib\patterns\simple_open_dialog.h" +#include "show_src.h" +_http http = {0, 0, 0, 0, 0, 0, 0}; +#include "download_manager.h" +_history history; +#include "history.h" + +bool debug_mode = false; +dword col_bg = 0xE3E2E2; +dword panel_color = 0xE3E2E2; +dword border_color = 0x787878; +#include "..\TWB\TWB.c" + #ifdef LANG_RUS -char version[]="Текстовый браузер 2.0 beta2"; +char version[]="Текстовый браузер 2.0 beta4"; char page_not_found[] = FROM "html\\page_not_found_ru.htm""\0"; char homepage[] = FROM "html\\homepage_ru.htm""\0"; char help[] = FROM "html\\help_ru.htm""\0"; @@ -43,7 +56,7 @@ char link_menu[] = "Копировать ссылку Скачать содержимое ссылки"; #else -char version[]="Text-based Browser 2.0 beta2"; +char version[]="Text-based Browser 2.0 beta4"; char page_not_found[] = FROM "html\\page_not_found_en.htm""\0"; char homepage[] = FROM "html\\homepage_en.htm""\0"; char help[] = FROM "html\\help_en.htm""\0"; @@ -60,19 +73,6 @@ Download link contents"; #define URL_SIZE 4000 -dword col_bg = 0xE3E2E2; -dword panel_color = 0xE3E2E2; -dword border_color = 0x787878; - -bool debug_mode = false; - -_http http = {0, 0, 0, 0, 0, 0, 0}; - -#include "..\TWB\TWB.c" -#include "history.h" -#include "show_src.h" -#include "download_manager.h" - #define URL_SERVICE_HISTORY "WebView:history" #define URL_SERVICE_HOMEPAGE "WebView:home" #define URL_SERVICE_HELP "WebView:help" @@ -158,7 +158,7 @@ void main() case evMouse: edit_box_mouse stdcall (#address_box); mouse.get(); - if (PageLinks.HoverAndProceed(mouse.x, WB1.list.first + mouse.y)) + if (PageLinks.HoverAndProceed(mouse.x, WB1.list.first + mouse.y, WB1.list.y, WB1.list.first)) && (mouse.pkm) && (mouse.up) { if (WB1.list.MouseOver(mouse.x, mouse.y)) EventShowPageMenu(mouse.x, mouse.y); break; @@ -250,7 +250,7 @@ void main() { http.handle_redirect(); http.free(); - GetAbsoluteURL(#http.redirect_url); + GetAbsoluteURL(#http.redirect_url, history.current()); debug("Redirect: "); debugln(#http.redirect_url); history.back(); OpenPage(#http.redirect_url); @@ -277,7 +277,7 @@ void SetElementSizes() WB1.list.column_max = WB1.list.w - scroll_wv.size_x / WB1.list.font_w + 1; WB1.list.visible = WB1.list.h; if (WB1.list.w!=WB1.DrawBuf.bufw) { - WB1.DrawBuf.Init(WB1.list.x, WB1.list.y, WB1.list.w, 800*20); + WB1.DrawBuf.Init(WB1.list.x, WB1.list.y, WB1.list.w, 400*20); OpenPage(history.current()); } } @@ -301,13 +301,12 @@ void draw_window() if (!header) { OpenPage(history.current()); WB1.DrawScroller(); - } - else { + } else { WB1.DrawPage(); DrawOmnibox(); + DrawRectangle(scroll_wv.start_x, scroll_wv.start_y, scroll_wv.size_x, + scroll_wv.size_y-1, scroll_wv.bckg_col); } - DrawRectangle(scroll_wv.start_x, scroll_wv.start_y, scroll_wv.size_x, - scroll_wv.size_y-1, scroll_wv.bckg_col); DrawProgress(); } @@ -401,21 +400,24 @@ void StopLoading() } //rewrite into -//bool strrpl(dword dst, from, to, dst_len); !!!!!!!! -void ReplaceSpaceInUrl(dword url, size) { +//bool strrpl(dword dst, from, into, dst_len); +bool ReplaceSpaceInUrl(dword url, size) { unsigned int i, j; - for (i=size-3; i>0; i--) + bool was_changed=false; + for (i=url+size-3; i>url; i--) { if (ESBYTE[i]!=' ') continue; - for (j=size-3; j>i; j--) { + for (j=url+size-3; j>=i; j--) { + ESBYTE[j+3]=ESBYTE[j+2]; ESBYTE[j+2]=ESBYTE[j+1]; ESBYTE[j+1]=ESBYTE[j]; } ESBYTE[i] = '%'; ESBYTE[i+1] = '2'; ESBYTE[i+2] = '0'; + was_changed = true; } - debugln(url); + return was_changed; } bool GetLocalFileData(dword _path) @@ -462,7 +464,11 @@ void OpenPage(dword _open_URL) img_draw stdcall(skin.image, address_box.left+address_box.width+1, address_box.top-3, 17, skin.h, 85, SKIN_Y); - //ReplaceSpaceInUrl(#new_url, URL_SIZE); + if (ReplaceSpaceInUrl(#new_url, URL_SIZE)) { + strcpy(#editURL, #new_url); + DrawOmnibox(); + } + if (!strncmp(#new_url,"http:",5)) { http.get(#new_url); } else if (!strncmp(#new_url,"https://",8)) { @@ -509,7 +515,7 @@ void EventClickLink(dword _click_URL) } strcpy(#new_url, _click_URL); - GetAbsoluteURL(#new_url); + GetAbsoluteURL(#new_url, history.current()); if (strrchr(#new_url, '#')!=0) { anchors.take_anchor_from(#new_url); @@ -594,14 +600,13 @@ void LoadInternalPage(dword _bufdata, _in_bufsize){ strcat(#editURL, #anchors.current); DrawOmnibox(); } + WB1.ParseHtml(); if (source_mode) { source_mode = false; - WB1.ParseHtml(); ShowSource(bufpointer, bufsize); - return; + } else { + WB1.DrawPage(); } - WB1.ParseHtml(); - WB1.DrawPage(); } } diff --git a/programs/cmm/browser/show_src.h b/programs/cmm/browser/show_src.h index 146ad05ceb..0c49c9c7eb 100644 --- a/programs/cmm/browser/show_src.h +++ b/programs/cmm/browser/show_src.h @@ -38,8 +38,8 @@ dword ShowSource(dword _bufdata, _in_bufsize) dword source_buf_start; opened_font_counter=0; - source_buf_end = malloc(_in_bufsize*5); - source_buf_start = source_buf_end; + source_buf_start = malloc(_in_bufsize*5); + source_buf_end = source_buf_start; SourceBufAdd(TEXT, "View Source
");
 
@@ -89,6 +89,6 @@ dword ShowSource(dword _bufdata, _in_bufsize)
 			source_buf_end++;
 	}
 	ESBYTE[source_buf_end] = 0;
-	LoadInternalPage(source_buf_start, _in_bufsize);
+	LoadInternalPage(source_buf_start, source_buf_end-source_buf_start);
 	free(source_buf_start);
 }
diff --git a/programs/cmm/codeview/codeview.c b/programs/cmm/codeview/codeview.c
index 6faac5c3cc..6d9b9ffbed 100644
--- a/programs/cmm/codeview/codeview.c
+++ b/programs/cmm/codeview/codeview.c
@@ -14,13 +14,11 @@
 #include "..\lib\obj\box_lib.h"
 #include "..\lib\obj\libio.h"
 #include "..\lib\obj\libimg.h"
-#include "..\lib\obj\http.h"
 #include "..\lib\obj\iconv.h"
+#include "..\lib\obj\proc_lib.h"
 
-#include "..\lib\patterns\history.h"
-#include "..\lib\patterns\http_downloader.h"
-
-_http http = {0, 0, 0, 0, 0, 0, 0};
+//useful patterns
+#include "..\lib\patterns\simple_open_dialog.h"
 
 char homepage[] = FROM "html\\homepage.htm""\0";
 char page_not_found[] = FROM "html\\page_not_found_en.htm""\0";
@@ -28,7 +26,7 @@ char page_not_found[] = FROM "html\\page_not_found_en.htm""\0";
 char version[]="C-- Code View";
 char accept_language[]= "Accept-Language: en\n";
 
-#define URL_SERVICE_HOME "CodeView://home"
+#define URL_SERVICE_HOME "CodeView:home"
 
 proc_info Form;
 
@@ -52,24 +50,33 @@ enum {
 
 #define URL_SIZE 4000;
 #include "..\TWB\TWB.c"
-#include "show_src.h"
+#include "highlight_c.h"
 
-char URL[URL_SIZE+1];
-char editURL[URL_SIZE+1];
+char default_dir[] = "/rd/1";
+od_filter filter2 = { 16, "C\0H\0C--\0H--\0CPP\0\0" };
+
+char current_path[URL_SIZE+1];
+char edit_path[URL_SIZE+1];
 int	mouse_twb;
-edit_box address_box = {250,60,30,0xffffff,0x94AECE,0xffffff,0xffffff,0x10000000,URL_SIZE-2,#editURL,#mouse_twb,2,19,19};
+edit_box address_box = {250,60,30,0xffffff,0x94AECE,0xffffff,0xffffff,0x10000000,URL_SIZE-2,#edit_path,#mouse_twb,2,19,19};
 
 #define SKIN_Y 24
 
-void main()
+void LoadLibraries()
 {
-	int i;
-	int id;
 	load_dll(boxlib, #box_lib_init,0);
 	load_dll(libio, #libio_init,1);
 	load_dll(libimg, #libimg_init,1);
 	load_dll(iconv_lib, #iconv_open,0);
-	if (param) strcpy(#URL, #param); else strcpy(#URL, URL_SERVICE_HOME);
+	load_dll(Proc_lib,  #OpenDialog_init,0);
+	OpenDialog_init stdcall (#o_dialog);
+}
+
+void main()
+{
+	int i;
+	LoadLibraries();
+	if (param) strcpy(#current_path, #param); else strcpy(#current_path, URL_SERVICE_HOME);
 	WB1.list.SetFont(8, 14, 10011000b);
 	WB1.list.no_selection = true;
 	SetEventMask(EVM_REDRAW + EVM_KEY + EVM_BUTTON + EVM_MOUSE + EVM_MOUSE_FILTER);
@@ -89,23 +96,28 @@ void main()
 			break;
 
 		case evButton:
-			id=GetButtonID();
-			if (1==id) ExitProcess();
+			if (GetButtonID()==1) ExitProcess();
 			break;
 
 		case evKey:
 			GetKeys();
 
 			if (SCAN_CODE_F5 == key_scancode) {
-				OpenPage();
+				OpenPage(#current_path);
 			}
 			if (SCAN_CODE_F3 == key_scancode) {
-				RunProgram("/rd/1/tinypad", #URL);
+				RunProgram("/rd/1/tinypad", #current_path);
+			}
+
+			if (key_modifier&KEY_LCTRL) || (key_modifier&KEY_RCTRL) {
+				if (key_scancode == SCAN_CODE_KEY_O) {EventOpenDialog();break;} 
 			}
 
 			if (address_box.flags & 0b10)  
 			{
-				if (key_ascii == ASCII_KEY_ENTER) EventGoToPage(); 
+				if (key_ascii == ASCII_KEY_ENTER) {
+					OpenPage(#edit_path);
+				}
 				else {
 					EAX = key_editbox; 
 					edit_box_key stdcall(#address_box);
@@ -126,7 +138,8 @@ void main()
 			if (Form.status_window>2) { DrawTitle(#header); break; }
 			if (Form.height<120) { MoveSize(OLD,OLD,OLD,120); break; }
 			if (Form.width<280) { MoveSize(OLD,OLD,280,OLD); break; }
-			Draw_Window();
+			SetElementSizes();
+			draw_window();
 			break;
 	}
 }
@@ -144,76 +157,48 @@ void SetElementSizes()
 	WB1.list.visible = WB1.list.h;
 	if (WB1.list.w!=WB1.DrawBuf.bufw) {
 		WB1.DrawBuf.Init(WB1.list.x, WB1.list.y, WB1.list.w, 32700);
-		OpenPage();
+		OpenPage(#current_path);
 	}
 }
 
-void Draw_Window()
+void draw_window()
 {
 	DrawBar(0,0, Form.cwidth,TOOLBAR_H-2, panel_color);
 	DrawBar(0,TOOLBAR_H-2, Form.cwidth,1, 0xD7D0D3);
 	DrawBar(0,TOOLBAR_H-1, Form.cwidth,1, border_color);
-	SetElementSizes();
 	DrawRectangle(address_box.left-3, address_box.top-3, address_box.width+4, 25,border_color);
 	DrawBar(0,Form.cheight - STATUSBAR_H, Form.cwidth,STATUSBAR_H, col_bg);
 	DrawBar(0,Form.cheight - STATUSBAR_H, Form.cwidth,1, border_color);
 	DrawEditBoxWebView();
-	if (!header) 
-		OpenPage(); 
-	else { 
+	if (!header) {
+		OpenPage(#current_path);
+	} else { 
 		WB1.DrawPage(); 
 		DrawEditBoxWebView(); 
 	}
 	DrawRectangle(scroll_wv.start_x, scroll_wv.start_y, scroll_wv.size_x, scroll_wv.size_y-1, scroll_wv.bckg_col);
 }
 
-void EventGoToPage()
-{
-	if (!editURL[0]) {
-		strcpy(#URL, URL_SERVICE_HOME);
-	}
-	else
-	{
-		strcpy(#URL, #editURL);
-	}
-	OpenPage();
-}
 
-
-void SetPageDefaults()
+void OpenPage(dword _path)
 {
-	strncpy(#header, #version, sizeof(header)-1);
-	WB1.list.count = WB1.list.first = 0;
-	cur_encoding = CH_NULL;
-}
-
-void OpenPage()
-{
-	char getUrl[URL_SIZE+1];
-	strcpy(#editURL, #URL);
-	history.add(#URL);
-	if (!strncmp(#URL,"CodeView:",8))
-	{
-		SetPageDefaults();
-		if (!strcmp(#URL, URL_SERVICE_HOME)) LoadInternalPage(#homepage, sizeof(homepage));
-		DrawEditBoxWebView();
+	dword buf, size;
+	strcpy(#current_path, _path);
+	if (streq(_path, URL_SERVICE_HOME)) {
+		LoadInternalPage(#homepage, sizeof(homepage)); 
 		return;
 	}
-	else
+	file_size stdcall (_path);
+	if (EBX)
 	{
-		file_size stdcall (#URL);
-		bufsize = EBX;
-		if (bufsize)
-		{
-			free(bufpointer);
-			bufpointer = malloc(bufsize);
-			SetPageDefaults();
-			ReadFile(0, bufsize, bufpointer, #URL);
-			ShowCodeSource();
-			LoadInternalPage(bufpointer, bufsize);	
-		}
-		ShowPage();
+		size = EBX;
+		buf = malloc(size);
+		ReadFile(0, size, buf, _path);
+		ShowCodeSource();
+		free(buf);
+		return;
 	}
+	LoadInternalPage(NULL,NULL);
 }
 
 DrawEditBoxWebView()
@@ -221,27 +206,43 @@ DrawEditBoxWebView()
 	int skin_x_offset;
 	DrawBar(address_box.left-2, address_box.top-2, address_box.width+3, 2, address_box.color);
 	DrawBar(address_box.left-2, address_box.top, 2, 22, address_box.color);
-	address_box.size = address_box.pos = address_box.shift = address_box.shift_old = strlen(#editURL);
+	address_box.size = address_box.pos = address_box.shift = address_box.shift_old = strlen(#edit_path);
 	address_box.offset = 0;
 	edit_box_draw stdcall(#address_box);
 	skin_x_offset = 51;
 	img_draw stdcall(skin.image, address_box.left+address_box.width+1, address_box.top-3, 17, skin.h, skin_x_offset, SKIN_Y);
 }
 
-void LoadInternalPage(dword bufpos, in_filesize){
-	bufsize = in_filesize;
-	bufpointer = bufpos;
-	ShowPage();
-}
-
-void ShowPage()
+void LoadInternalPage(dword _bufpos, _bufsize)
 {
+	if (bufpointer) free(bufpointer);
+
+	if (!_bufpos) || (!_bufsize) {
+		LoadInternalPage(#page_not_found, sizeof(page_not_found));
+		return;
+	}
+	strcpy(#edit_path, #current_path);
 	DrawEditBoxWebView();
-	if (!bufsize) LoadInternalPage(#page_not_found, sizeof(page_not_found));
+
+	bufpointer = _bufpos;
+	bufsize = _bufsize;
+	bufpointer = malloc(bufsize);
+	strcpy(bufpointer, _bufpos);
+
+	WB1.list.first = 0;
 	WB1.ParseHtml();
 	WB1.DrawPage();
 }
 
+void EventOpenDialog()
+{
+	OpenDialog_start stdcall (#o_dialog);
+	if (o_dialog.status) {
+		OpenPage(#openfile_path);
+	}
+}
+
+
 void DrawStatusBar() {return;};
 void EventClickLink() {return;};
 void EventShowLinkMenu() {return;};
diff --git a/programs/cmm/codeview/show_src.h b/programs/cmm/codeview/highlight_c.h
similarity index 86%
rename from programs/cmm/codeview/show_src.h
rename to programs/cmm/codeview/highlight_c.h
index a913bbb3b0..fc088b83f1 100644
--- a/programs/cmm/codeview/show_src.h
+++ b/programs/cmm/codeview/highlight_c.h
@@ -14,7 +14,7 @@ char* C_HL_keywords[] = {
     ":void ", ":int ", ":bool ", ":dword ", NULL
 };
 
-dword ShowCodeSource()
+dword ShowCodeSource(dword _bufpointer, _bufsize)
 {
 	dword new_buf, new_buf_start, i;
 	int mode = CODE;
@@ -24,11 +24,11 @@ dword ShowCodeSource()
 	dword keyn;
 	dword keycolor;
 
-	new_buf = malloc(bufsize*10);
+	new_buf = malloc(_bufsize*10);
 	new_buf_start = new_buf;
-	sprintf(new_buf,"
",#URL);
+	sprintf(new_buf,"%s
",#current_path);
 	new_buf += strlen(new_buf);
-	for (i=bufpointer; i
 
 
-CodeView is a sipmle C--/C/C++ code viewer based on TWB component. - +CodeView is a sipmle C--/C/C++ code viewer based on TWB component.
+
+Press Ctrl+O to open a file. \ No newline at end of file diff --git a/programs/cmm/codeview/html/page_not_found_en.htm b/programs/cmm/codeview/html/page_not_found_en.htm index 89a0ccede3..e1ab939c6a 100644 --- a/programs/cmm/codeview/html/page_not_found_en.htm +++ b/programs/cmm/codeview/html/page_not_found_en.htm @@ -1,14 +1,10 @@ - -File not found + + File not found -

 File not found

-
    -
  • - Check page address, there may have been made a typo.
    -
  • -
+

 File not found

+ Please, check file address, there may have been made a typo. \ No newline at end of file diff --git a/programs/cmm/eolite/Eolite.c b/programs/cmm/eolite/Eolite.c index 9960942e90..ef0060038e 100644 --- a/programs/cmm/eolite/Eolite.c +++ b/programs/cmm/eolite/Eolite.c @@ -50,6 +50,8 @@ enum { ONLY_OPEN }; +_history history; + struct Eolite_colors { bool def; diff --git a/programs/cmm/lib/list_box.h b/programs/cmm/lib/list_box.h index b953499358..e4f098696c 100644 --- a/programs/cmm/lib/list_box.h +++ b/programs/cmm/lib/list_box.h @@ -269,6 +269,8 @@ struct llist :void llist_copy(dword dest, src) { + memmov(dest, src, sizeof(llist)); + /* EDI = dest; ESI = src; EDI.llist.x = ESI.llist.x; @@ -286,6 +288,7 @@ struct llist EDI.llist.cur_y = ESI.llist.cur_y; EDI.llist.column_max = ESI.llist.column_max; EDI.llist.active = ESI.llist.active; + */ } #endif \ No newline at end of file diff --git a/programs/cmm/lib/patterns/history.h b/programs/cmm/lib/patterns/history.h index e4ea4ccb8f..37beb177c0 100644 --- a/programs/cmm/lib/patterns/history.h +++ b/programs/cmm/lib/patterns/history.h @@ -7,7 +7,7 @@ struct _history { int back(); int forward(); dword current(); -} history; +}; int _history::add(dword in) { diff --git a/programs/cmm/lib/strings.h b/programs/cmm/lib/strings.h index 501ad8ebd0..59261bce1d 100644 --- a/programs/cmm/lib/strings.h +++ b/programs/cmm/lib/strings.h @@ -114,6 +114,30 @@ L1: } } +/* +signed int strncmp(dword s1, s2, signed n) +unsigned char _s1,_s2; +{ + if (n == 0) + return 0; + do { + _s1 = DSBYTE[s1]; + _s2 = DSBYTE[s2]; + if (_s1 != _s2) + { + $dec s2 + return _s1 - _s2; + } + $inc s2 + if (_s1 == 0) + break; + $inc s1 + $dec n + } while (n); + return 0; +} +*/ + /* inline signed int strncmp(dword text1,text2,len) { @@ -134,7 +158,7 @@ inline fastcall unsigned int strlen( EDI) EAX-=2+ECX; } -inline strnlen(dword str, dword maxlen) +inline dword strnlen(dword str, dword maxlen) { dword cp; for (cp = str; (maxlen != 0) && (DSBYTE[cp] != '\0'); cp++, maxlen--); @@ -181,19 +205,6 @@ inline signed int strcmp(dword text1, text2) return 0; } -/* -TODO: rewrite streq() using pure assembliy - -inline fastcall void strcpy( EDI, ESI) -{ - $cld -L2: - $lodsb - $stosb - $test al,al - $jnz L2 -} -*/ inline fastcall streq(ESI, EDI) { @@ -212,31 +223,6 @@ inline fastcall streq(ESI, EDI) return true; } -/* -signed int strncmp(dword s1, s2, signed n) -unsigned char _s1,_s2; -{ - if (n == 0) - return 0; - do { - _s1 = DSBYTE[s1]; - _s2 = DSBYTE[s2]; - if (_s1 != _s2) - { - $dec s2 - return _s1 - _s2; - } - $inc s2 - if (_s1 == 0) - break; - $inc s1 - $dec n - } while (n); - return 0; -} -*/ - - inline fastcall void strcpy( EDI, ESI) { $cld @@ -395,13 +381,13 @@ inline fastcall void strcat( EDI, ESI) } } -:void strncat(dword dst, src, dword len) +:void strncat(dword dst, src, len) { while (ESBYTE[dst]) && (len) { dst++; len--; } - while (ESBYTE[src]) && (len) { + while (ESBYTE[src]) && (len>1) { ESBYTE[dst] = ESBYTE[src]; dst++; src++; @@ -410,6 +396,18 @@ inline fastcall void strcat( EDI, ESI) ESBYTE[dst] = 0; } +:void chrncat(dword dst, unsigned char s, dword len) +{ + while (ESBYTE[dst]) && (len) { + dst++; + len--; + } + if (len>1) { + ESBYTE[dst] = s; + ESBYTE[dst+1] = 0; + } +} + inline fastcall void chrcat(ESI, DI) { while (ESBYTE[ESI]) ESI++; diff --git a/programs/cmm/liza/liza.c b/programs/cmm/liza/liza.c index 117190d489..c1abc3ba8c 100644 --- a/programs/cmm/liza/liza.c +++ b/programs/cmm/liza/liza.c @@ -22,7 +22,6 @@ #include "../lib/obj/netcode.h" #include "../lib/obj/iconv.h" //patterns -#include "../lib/patterns/history.h" #include "../lib/patterns/http_downloader.h" //images byte letter_icons[sizeof(file "img/letter_icons.raw")] = FROM "img/letter_icons.raw";