From e2062546c232d4b9920cf289d94773b81f88bfae Mon Sep 17 00:00:00 2001 From: "Kirill Lipatov (Leency)" Date: Sun, 23 Mar 2014 22:49:49 +0000 Subject: [PATCH] WebView 1.0 beta 3: fix for special pages, code optimization, remove tabs git-svn-id: svn://kolibrios.org@4692 a494cfbc-eb01-0410-851d-a64ba20cac60 --- programs/cmm/TWB/TWB.c | 72 ++++++++++++++++--------------- programs/cmm/browser/WebView.c | 59 ++++++++++++++++--------- programs/cmm/browser/history.h | 5 ++- programs/cmm/browser/wv_skin.png | Bin 2104 -> 2310 bytes programs/cmm/lib/strings.h | 29 ------------- 5 files changed, 78 insertions(+), 87 deletions(-) diff --git a/programs/cmm/TWB/TWB.c b/programs/cmm/TWB/TWB.c index 1ef586938c..27334cb7b9 100644 --- a/programs/cmm/TWB/TWB.c +++ b/programs/cmm/TWB/TWB.c @@ -247,12 +247,12 @@ void TWebBrowser::Parse(){ line[perenos_num] = 0x00; if (stroka-1 > list.visible) && (list.first <>0) break 1; //óõîäèì... DrawPage(); - strcpy(#line, #temp); - NewLine(list.x + 5, stroka * 10 + list.y + 5); //çàêðàøèâàåì ñëåäóùóþ ñòðîêó + strcpy(#line, #temp); + NewLine(); //çàêðàøèâàåì ñëåäóùóþ ñòðîêó } DrawPage(); line = NULL; - if (tag) SetTextStyle(list.x + 5, stroka * 10 + list.y + 5); //îáðàáîòêà òåãîâ + if (tag) SetTextStyle(list.x + 5, stroka * list.line_h + list.y + 5); //îáðàáîòêà òåãîâ tag = parametr = tagparam = ignor_param = NULL; break; default: @@ -275,18 +275,15 @@ void TWebBrowser::Parse(){ if (stroka-1 > list.visible) && (list.first <>0) break 1; DrawPage(); strcpy(#line, #temp); - NewLine(list.x + 5, stroka * 10 + list.y + 5); + NewLine(); } } } - DrawPage(); //ðèñóåò ïîñëåäíþþ ñòðîêó, ïîòîì ýòî íàäî óáðàòü, îïòèìèçèðîâàâ êîä - NewLine(list.x + 5, stroka * 10 + list.y + 5); //çàêðàøèâàåì ñëåäóùóþ ñòðîêó - - if (list.visible * 10 + 25 <= list.h) - DrawBar(list.x, list.visible * 10 + list.y + 25, list.w, -list.visible * 10 + list.h - 25, bg_color); - if (stroka * 10 + 5 <= list.h) - DrawBar(list.x, stroka * 10 + list.y + 5, list.w, -stroka * 10 + list.h - 5, bg_color); //çàêðàøèâàåì âñ¸ äî êîíöà + DrawPage(); + NewLine(); + DrawBar(list.x, stroka * list.line_h + list.y + 5, list.w, -stroka * list.line_h + list.h - 5, bg_color); + DrawBar(list.x, list.visible * list.line_h + list.y + 4, list.w, -list.visible * list.line_h + list.h - 4, bg_color); if (list.first == 0) list.count = stroka; if (anchor) //åñëè ïîñðåäè òåêñòà ïîÿâèòñÿ íîâûé ÿêîðü - áóäåò áåñêîíå÷íûé öèêë { @@ -334,13 +331,13 @@ void TWebBrowser::SetTextStyle(int left1, top1) { { if (opened) { - NewLine(left1, top1); + NewLine(); strcat(#line, ' \"'); } if (!opened) { chrcat(#line, '\"'); - NewLine(left1, top1); + NewLine(); } } @@ -424,23 +421,23 @@ void TWebBrowser::SetTextStyle(int left1, top1) { return; } if (isTag("br")) { - NewLine(left1, top1); + NewLine(); return; } if (isTag("div")) || (isTag("header")) || (isTag("article")) || (isTag("footer")) { - IF(oldtag[0] <>'h') NewLine(left1, top1); + IF(oldtag[0] <>'h') NewLine(); return; } if (isTag("p")) { IF(oldtag[0] == 'h') return; - NewLine(left1, top1); - IF(opened) NewLine(left1, top1 + 10); + NewLine(); + IF(opened) NewLine(); return; } if(isTag("table")) { table.active = opened; - NewLine(left1, top1); + NewLine(); if (opened) table.NewTable(); } @@ -453,9 +450,9 @@ void TWebBrowser::SetTextStyle(int left1, top1) { if (!strcmp(#parametr, "width=")) { table.col_w[table.cur_col] = atoi(#options); - // NewLine(left1, top1); + // NewLine(); // strcpy(#line, #options); - // NewLine(left1, top1); + // NewLine(); } } while(GetNextParam()); } @@ -474,7 +471,7 @@ void TWebBrowser::SetTextStyle(int left1, top1) { } else { - NewLine(left1, top1); + NewLine(); if (table.cur_row == 0) table.max_cols = table.cur_col; table.cur_row++; table.max_cols = table.cur_col; @@ -487,7 +484,7 @@ void TWebBrowser::SetTextStyle(int left1, top1) { if (opened) text_align = ALIGN_CENTER; if (!opened) { - NewLine(left1, top1); + NewLine(); text_align = ALIGN_LEFT; } return; @@ -497,15 +494,15 @@ void TWebBrowser::SetTextStyle(int left1, top1) { if (opened) text_align = ALIGN_RIGHT; if (!opened) { - NewLine(left1, top1); + NewLine(); text_align = ALIGN_LEFT; } return; } */ if (isTag("h1")) || (isTag("h2")) || (isTag("h3")) || (isTag("h4")) { - NewLine(left1, top1); - if (opened) && (stroka>1) NewLine(left1, top1 + 10); + NewLine(); + if (opened) && (stroka>1) NewLine(); strcpy(#oldtag, #tag); if (opened) { @@ -535,7 +532,7 @@ void TWebBrowser::SetTextStyle(int left1, top1) { { li_text = opened; IF(opened == 0) return; - NewLine(left1, top1); + NewLine(); return; } if (isTag("condition")) @@ -549,7 +546,7 @@ void TWebBrowser::SetTextStyle(int left1, top1) { li_text = opened; if (opened) { - NewLine(left1, top1); + NewLine(); if (stroka > -1) && (stroka - 2 < list.visible) DrawBuf.DrawBar(li_tab * 5 * 6 + left1 - 5, list.line_h/2-3, 2, 2, 0x555555); } return; @@ -560,7 +557,7 @@ void TWebBrowser::SetTextStyle(int left1, top1) { { li_text = opened; li_tab--; - NewLine(left1, top1); + NewLine(); } ELSE li_tab++; if (isTag("dd")) stolbec += 5; if (isTag("blockquote")) blq_text = opened; @@ -573,9 +570,9 @@ void TWebBrowser::SetTextStyle(int left1, top1) { return; } if (strcmp(#parametr, "color=") == 0) hr_color = GetColor(#options); else hr_color = 0x999999; - NewLine(left1, top1); + NewLine(); DrawBuf.DrawBar(5, list.line_h/2, list.w-10, 1, hr_color); - NewLine(left1, top1+list.line_h); + NewLine(); } if (isTag("img")) { @@ -617,15 +614,20 @@ void TWebBrowser::DrawScroller() } -void TWebBrowser::NewLine(int left1, top1) +void TWebBrowser::NewLine() { + int onleft; + int ontop; + + onleft = list.x + 5; + ontop = stroka * list.line_h + list.y + 5; if (!stroka) DrawBar(list.x, list.y, list.w, 5, bg_color); if (t_html) && (!t_body) return; - if (top1>=list.y) && ( top1 < list.h+list.y-10) && (!anchor) + if (ontop>=list.y) && ( ontop < list.h+list.y-10) && (!anchor) { - if (text_align == ALIGN_CENTER) DrawBuf.AlignCenter(left1,top1,list.w,list.line_h,stolbec * 6); - if (text_align == ALIGN_RIGHT) DrawBuf.AlignRight(left1,top1,list.w,list.line_h,stolbec * 6); - DrawBuf.bufy = top1; + if (text_align == ALIGN_CENTER) DrawBuf.AlignCenter(onleft,ontop,list.w,list.line_h,stolbec * 6); + if (text_align == ALIGN_RIGHT) DrawBuf.AlignRight(onleft,ontop,list.w,list.line_h,stolbec * 6); + DrawBuf.bufy = ontop; DrawBuf.Show(); DrawBuf.Fill(bg_color); } diff --git a/programs/cmm/browser/WebView.c b/programs/cmm/browser/WebView.c index 900b72059c..5513d8de90 100644 --- a/programs/cmm/browser/WebView.c +++ b/programs/cmm/browser/WebView.c @@ -29,14 +29,14 @@ char homepage[] = FROM "html\homepage.htm"; #ifdef LANG_RUS - char version[]=" ’¥ªáâ®¢ë© ¡à ã§¥à 1.0 Beta 2"; + char version[]=" ’¥ªáâ®¢ë© ¡à ã§¥à 1.0 Beta 3"; ?define IMAGES_CACHE_CLEARED "Šíè ª à⨭®ª ®ç¨é¥­" ?define T_LAST_SLIDE "â® ¯®á«¥¤­¨© á« ©¤" char loading[] = "‡ £à㧪  áâà ­¨æë...
"; char page_not_found[] = FROM "html\page_not_found_ru.htm"; char accept_language[]= "Accept-Language: ru\n"; #else - char version[]=" Text-based Browser 1.0 Beta 2"; + char version[]=" Text-based Browser 1.0 Beta 3"; ?define IMAGES_CACHE_CLEARED "Images cache cleared" ?define T_LAST_SLIDE "This slide is the last" char loading[] = "Loading...
"; @@ -59,10 +59,10 @@ int action_buf; dword http_transfer = 0; dword http_buffer; -dword TAB_H = 19; +dword TAB_H = false; //19; dword TAB_W = 150; -dword TOOLBAR_H = 50; -dword STATUSBAR_H =18; +dword TOOLBAR_H = 31; //50; +dword STATUSBAR_H =16; dword col_bg = 0xE4DFE1; dword panel_color = 0xF1F1F1; dword border_color = 0x9F9F9F; @@ -270,7 +270,7 @@ void SetElementSizes() address_box.width = Form.cwidth - address_box.left - 25 - 22; WB1.list.SetSizes(0, TOOLBAR_H, Form.width - 10 - scroll_wv.size_x, Form.cheight - TOOLBAR_H - STATUSBAR_H, 0, 10); WB1.list.column_max = WB1.list.w - scroll_wv.size_x / 6; - WB1.list.visible = WB1.list.h - 3 / WB1.list.line_h - 2; + WB1.list.visible = WB1.list.h - 5 / WB1.list.line_h; WB1.DrawBuf.Init(WB1.list.x, WB1.list.y, WB1.list.w, WB1.list.line_h); } @@ -283,17 +283,20 @@ void Draw_Window() if (Form.height<120) MoveSize(OLD,OLD,OLD,120); if (Form.width<280) MoveSize(OLD,OLD,280,OLD); // tab { - DrawBar(0, 0, TAB_W, TAB_H+1, panel_color); - WriteText(5, 7, 0x80, 0xfdfdFd, "Index.htm"); - WriteText(4, 6, 0x80, 0, "Index.htm"); + if (TAB_H) + { + DrawBar(0, 0, TAB_W, TAB_H+1, panel_color); + WriteText(5, 7, 0x80, 0xfdfdFd, "Index.htm"); + WriteText(4, 6, 0x80, 0, "Index.htm"); + DrawBar(TAB_W,0, Form.cwidth-TAB_W,TAB_H, col_bg); + DrawBar(TAB_W-1,TAB_H, Form.cwidth-TAB_W+1,1, border_color); + img_draw stdcall(skin.image, TAB_W-13, 0, 30, skin.h, 101, 0); + } + else DrawBar(0,0, Form.cwidth,1, col_bg); // } - DrawBar(TAB_W,0, Form.cwidth-TAB_W,TAB_H, col_bg); - DrawBar(TAB_W-1,TAB_H, Form.cwidth-TAB_W+1,1, border_color); DrawBar(0,TAB_H+1, Form.cwidth,TOOLBAR_H-TAB_H-3, panel_color); DrawBar(0,TOOLBAR_H-2, Form.cwidth,1, 0xe9e9e9); DrawBar(0,TOOLBAR_H-1, Form.cwidth,1, border_color); - img_draw stdcall(skin.image, TAB_W-13, 0, 30, skin.h, 101, 0); - SetElementSizes(); DrawRectangle(address_box.left-1, address_box.top-1, address_box.width+2, 16,address_box.color); DrawRectangle(address_box.left-2, address_box.top-2, address_box.width+4, 18,border_color); @@ -307,15 +310,14 @@ void Draw_Window() img_draw stdcall(skin.image, address_box.left+address_box.width+1, address_box.top-2, 17, skin.h, img_off, 0); // config DefineButton(Form.cwidth-23, address_box.top-2, 17, skin.h-1, 312+BT_HIDE, 0); - img_draw stdcall(skin.image, Form.cwidth-22, address_box.top-2, 16, skin.h, 85, 0); - - ShowPage(); - DrawRectangle(scroll_wv.start_x, scroll_wv.start_y, scroll_wv.size_x, scroll_wv.size_y-1, scroll_wv.bckg_col); + img_draw stdcall(skin.image, Form.cwidth-22, address_box.top-2, 16, skin.h, 85, 0); //status bar DrawBar(0,Form.cheight - STATUSBAR_H, Form.cwidth,STATUSBAR_H, col_bg); DrawBar(0,Form.cheight - STATUSBAR_H, Form.cwidth,1, border_color); progress_bar.top = Form.cheight - STATUSBAR_H + 4; DrawProgress(); + ShowPage(); + DrawRectangle(scroll_wv.start_x, scroll_wv.start_y, scroll_wv.size_x, scroll_wv.size_y-1, scroll_wv.bckg_col); } @@ -402,7 +404,12 @@ void Scan(int id) strcpy(#editURL, "http://kolibrios.org/"); case GOTOURL: case 0x0D: //enter - if ((strstr(#editURL,"ttp://")==0) && (editURL[0]!='/')) strcpy(#URL,"http://"); else URL[0] = 0; + if ((strncmp(#editURL,"http:",5)!=0) && (editURL[0]!='/') && ((strncmp(#editURL,"WebView:",8)!=0)) + { + strcpy(#URL,"http://"); + } + else + URL[0] = 0; strcat(#URL, #editURL); OpenPage(); return; @@ -554,7 +561,19 @@ void OpenPage() StopLoading(); strcpy(#editURL, #URL); BrowserHistory.AddUrl(); - if (strncmp(#URL,"WebView:",8)==0) return; + if (strncmp(#URL,"WebView:",8)==0) + { + SetPageDefaults(); + if (strcmp(#URL, URL_SERVICE_HOME)==0) + { + WB1.Prepare(#homepage, sizeof(homepage)); + } + if (strcmp(#URL, URL_SERVICE_HISTORY)==0) + { + ShowHistory(); + } + return; + } if (strncmp(#URL,"http:",5)==0) { img_draw stdcall(skin.image, address_box.left+address_box.width+1, address_box.top-2, 17, skin.h, 131, 0); @@ -590,8 +609,6 @@ void ShowPage() address_box.offset=0; edit_box_draw stdcall(#address_box); - if (strcmp(#URL, URL_SERVICE_HOME)==0) WB1.Prepare(#homepage, sizeof(homepage)); else - if (strcmp(#URL, URL_SERVICE_HISTORY)==0) ShowHistory(); else if (!bufsize) { PageLinks.Clear(); diff --git a/programs/cmm/browser/history.h b/programs/cmm/browser/history.h index e3d8dc7c1c..c01d887873 100644 --- a/programs/cmm/browser/history.h +++ b/programs/cmm/browser/history.h @@ -5,7 +5,7 @@ ShowHistory() free(history_pointer); history_pointer = malloc(64000); - strcat(history_pointer, " History

History

"); + strcat(history_pointer, "History

History

"); strcat(history_pointer, "

Visited pages


"); for (i=1; i
"); + strcat(history_pointer, "'>
"); strcat(history_pointer, #pics[i].path); } + strcat(history_pointer, ""); WB1.Prepare(history_pointer, strlen(history_pointer)); } \ No newline at end of file diff --git a/programs/cmm/browser/wv_skin.png b/programs/cmm/browser/wv_skin.png index 90bf50f3fb282e41a459ddad8e745ddcfb8c9e52..8351a0d143f050ede8f0f0dfeac5bf3aae595b41 100644 GIT binary patch delta 2299 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 - { - for(j=0;j