From 4cb5649545d20405bfa0fc037ab20f7391ed4029 Mon Sep 17 00:00:00 2001 From: dan Date: Thu, 6 Jul 2000 01:28:13 +0000 Subject: [PATCH] Gaaah! This thing is completely broken! There are functions that take a completely different set of arguments than the ones currently used to call them. There are even functions that are not defined anywhere but called from wtext.c Please fix it before re-enabling it in Makefile.am --- WINGs/Makefile.am | 4 +- WINGs/testtext.c | 886 +++++++++++++++++++++++++++--------------------------- WINGs/wruler.c | 135 +++++---- WINGs/wtext.c | 20 +- 4 files changed, 532 insertions(+), 513 deletions(-) rewrite WINGs/testtext.c (88%) diff --git a/WINGs/Makefile.am b/WINGs/Makefile.am index d2f476e1..48a75baf 100644 --- a/WINGs/Makefile.am +++ b/WINGs/Makefile.am @@ -13,7 +13,7 @@ include_HEADERS = WINGs.h WUtil.h WINGsP.h bin_SCRIPTS = get-wings-flags get-wutil-flags noinst_PROGRAMS = wtest wmquery wmfile fontl testmywidget testcolorpanel\ - connect puzzle testtext + connect puzzle #testtext lib_LIBRARIES = libWINGs.a libWUtil.a @@ -65,13 +65,11 @@ libWINGs_a_SOURCES = \ wpixmap.c \ wpopupbutton.c \ wprogressindicator.c \ - wruler.c \ wscroller.c \ wscrollview.c \ wslider.c \ wsplitview.c \ wtabview.c \ - wtext.c \ wtextfield.c \ wwindow.c \ wview.c \ diff --git a/WINGs/testtext.c b/WINGs/testtext.c dissimilarity index 88% index 4a0f7b17..17a77807 100644 --- a/WINGs/testtext.c +++ b/WINGs/testtext.c @@ -1,441 +1,445 @@ -/* WINGsP.h should NEVER be included from user applications */ -#include -#include -#include -#include -#include - -#include - -void -wAbort() -{ - exit(0); -} - - -void Close(WMWidget *self, void *client) -{ - exit(0); -} - - - -/* =============== a rudimentary HTML parser ======================= */ - -/* due to the WMSetTextParser stuff, it should not -be too hard to add parsers. like dis :-] */ - - -/* - * A hack to speed up caseless_equal. Thanks to Quincey Koziol for - * developing it for the "chimera" folks so I could use it 7 years later ;-) - * Constraint: nothing but '\0' may map to 0 - */ -unsigned char map_table[256] = -{ -0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, -17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, -33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, -49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, -97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, -111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 91, 92, -93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, -108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, -122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, -136, 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, -150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, -164, 165, 166, 167, 168, 169, 170, 171, 172, 173, 174, 175, 176, 177, -178, 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, -192, 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, 205, -206, 207, 208, 209, 210, 211, 212, 213, 214, 215, 216, 217, 218, 219, -220, 221, 222, 223, 224, 225, 226, 227, 228, 229, 230, 231, 232, 233, -234, 235, 236, 237, 238, 239, 240, 241, 242, 243, 244, 245, 246, 247, -248, 249, 250, 251, 252, 253, 254, 255}; - -#define TOLOWER(x) (map_table[(int)x]) -static int -mystrcasecmp(const unsigned char *s1, const unsigned char *s2) -{ - if (!*s1 || !*s2) return 0; - while (*s2 != '\0') { - if (TOLOWER (*s1) != TOLOWER (*s2)) /* true if *s1 == 0 ! */ - return 0; - s1++; - s2++; - } - return (*s1=='\0' ||!isalnum(*s1))?1:0; -} - - -typedef struct _currentFormat { - void *para; - WMBag *fonts; - WMBag *colors; - WMColor *ccolor; - WMFont *cfont; - WMParserActions actions; - //WMBag *aligns; // for tables... - /* the following are "nested" - i.e.: - 1 2 1 1 2 0 get it? */ - short i; - short b; - short u; - short fmargin; - short bmargin; - WMAlignment align:2; - short type:1; - short ul:3; /* how "nested"... up to 8 levels deep */ - short comment:1; /* ignore text till --> */ - short RESERVED:10; -} CFMT; -CFMT cfmt; - - - -#if 0 -getArg(char *t, short type, void *arg) -{ - short d=0; - while(*(++t) && !d) { - if(type==0) { - if(*t>='0' && *t<='9') { - sscanf(t, "%d", arg); - while(*t&& (*t<'0' || *t>'9')) - t++; - d=1; - } - } - } -} -#endif - -void parseToken(WMText *tPtr, char *token, short tk) -{ - short mode=0; /* 0 starts, 1 closes */ - WMScreen *scr = (W_VIEW(tPtr))->screen; - - while(*token && isspace(*(token))) token++; - if(*token == '/') { - token++; - mode = 1; - while(isspace(*(token))) token++; - } - - if(strlen(token)==1) { - /* nice and fast for small tokens... no need for too much brain - power here */ - switch(TOLOWER(*token)) { - case 'i': - if(!mode) { - cfmt.cfont = WMGetFontItalic(scr, cfmt.cfont); - WMPutInBag(cfmt.fonts, (void *)cfmt.cfont); - } else { /*dun wanna remove the baseFont eh? */ - int count = WMGetBagItemCount(cfmt.fonts); - if(count>1) - WMDeleteFromBag(cfmt.fonts, count-1); - cfmt.cfont = (WMFont *)WMGetFromBag(cfmt.fonts, - WMGetBagItemCount(cfmt.fonts)-1); - } break; - case 'b': - if(!mode) { - cfmt.cfont = WMGetFontBold(scr, cfmt.cfont); - WMPutInBag(cfmt.fonts, (void *)cfmt.cfont); - } else { /*dun wanna remove the baseFont eh? */ - int count = WMGetBagItemCount(cfmt.fonts); - if(count>1) - WMDeleteFromBag(cfmt.fonts, count-1); - cfmt.cfont = (WMFont *)WMGetFromBag(cfmt.fonts, - WMGetBagItemCount(cfmt.fonts)-1); - } break; - case 'p': - cfmt.para = (cfmt.actions.createParagraph) (cfmt.fmargin, cfmt.bmargin, - WMWidgetWidth(tPtr)-30, NULL, 0, cfmt.align); - (cfmt.actions.insertParagraph) (tPtr, cfmt.para, cfmt.type); - cfmt.para = (cfmt.actions.createParagraph) (cfmt.fmargin, cfmt.bmargin, - WMWidgetWidth(tPtr)-30, NULL, 0, cfmt.align); - (cfmt.actions.insertParagraph) (tPtr, cfmt.para, cfmt.type); - break; - case 'u': cfmt.u = !mode; break; - } - } else { /* the tag is, as far as I'm concerned, useless */ - if(mystrcasecmp(token, "br")) { - cfmt.para = (cfmt.actions.createParagraph) (cfmt.fmargin, cfmt.bmargin, - WMWidgetWidth(tPtr)-30, NULL, 0, cfmt.align); - (cfmt.actions.insertParagraph) (tPtr, cfmt.para, cfmt.type); - } - else if(mystrcasecmp(token, "ul")) { - if(mode) { - if(cfmt.ul>1) cfmt.ul--; - } else cfmt.ul++; - if(cfmt.ul) { - cfmt.bmargin = cfmt.ul*30; - cfmt.fmargin = cfmt.bmargin-10; - } else cfmt.fmargin = cfmt.bmargin = 0; - } else if(mystrcasecmp(token, "li")) { - cfmt.para = (cfmt.actions.createParagraph) (cfmt.fmargin, cfmt.bmargin, - WMWidgetWidth(tPtr)-30, NULL, 0, cfmt.align); - (cfmt.actions.insertParagraph) (tPtr, cfmt.para, cfmt.type); - } else if(mystrcasecmp(token, "align")) - ;//printf("align"); - else if(mystrcasecmp(token, "img")) { - if(!mode) { - char *mark=NULL; - WMPixmap *pixmap; - void *chunk; - token+=3; - while(isspace(*(token))) token++; - do { - switch(TOLOWER(*token)) { - case 's': - if(TOLOWER(*(1+token)) == 'r' && TOLOWER(*(2+token)) == 'c') { - mark = strchr(token, '='); - if(mark) { - char img[256], *iptr; - token = mark+1; - if(!token) return; - sscanf(token, "%s", img); - iptr = img; - if(*img == '\"') { img[strlen(img)-1] = 0; iptr++;} - pixmap = WMCreatePixmapFromFile(scr, iptr); - chunk = (cfmt.actions.createPChunk)(pixmap, 0, False); - (cfmt.actions.insertChunk) (tPtr, chunk, False); - printf("[%s]\n", iptr); - } } break; } } while(*(token++)); - } - } else if(mystrcasecmp(token, "font")) { -#if 0 - if(mode) { - cfmt.cfont = (WMFont *)WMGetFromBag(cfmt.fonts, - WMGetBagItemCount(cfmt.fonts)-1); - } else - (WMColor *)WMGetFromBag(cfmt.colors, - WMGetBagItemCount(cfmt.colors)-1), -#endif - } - else if(mystrcasecmp(token, "center")) { -printf("center\n"); - if(mode) cfmt.align = WALeft; - else cfmt.align = WACenter; - cfmt.para = (cfmt.actions.createParagraph) (cfmt.fmargin, cfmt.bmargin, - WMWidgetWidth(tPtr)-30, NULL, 0, cfmt.align); - (cfmt.actions.insertParagraph) (tPtr, cfmt.para, cfmt.type); - } - } - - - - - //printf("parse token (%s)[%s]\n", mode?"close":"open", token); -#if 0 - i=0; - //while(*token && !isspace(*(token))) token++; -//printf("A:%d a:%d z%d Z%d\n", '1', 'a', 'Z', 'z'); - do { - if(!mm) { - if(c>=65 && c<=122) { major[i++] = c; - } else if(c==' ' || c=='='){ major[i] = 0; i=0; mm=1; - printf("\nmajor: [%s]", major);} - } else { - if(c!=' ') { - minor[i++] = c; - } else { minor[i] = 0; i=0; printf(" minor: [%s] ", minor);} - } - }while((c = *(++token))); -#endif - - - //printf("parse token (%s)[%s]\n", mode?"close":"open", token); -} - -void HTMLParser(WMWidget *w, void *clientData, short type) -{ - static short init=1; /* have we been here at least once before? */ - char *stream = (char *) clientData; - WMText *tPtr = (WMText *)w; - WMScreen *scr; - void *chunk; - char c; - #define MAX_TOKEN_SIZE 255 - char token[MAX_TOKEN_SIZE+1]; - #define MAX_TEXT_SIZE 1023 - char text[MAX_TEXT_SIZE+1]; - short mode=0; - short tk=0, txt=0; - short wasspace=0; - - if(!tPtr || !stream) - return; - - scr = (W_VIEW(tPtr))->screen; - cfmt.type = type; - if(init) { - cfmt.actions = WMGetTextParserActions(tPtr); - cfmt.fonts = WMCreateBag(4); /* there sould always be at least 1 font... */ - cfmt.cfont = WMSystemFontOfSize(scr, 12); - WMPutInBag(cfmt.fonts, (void *)cfmt.cfont); - cfmt.colors = WMCreateBag(4); - cfmt.ccolor = WMBlackColor(scr); - WMPutInBag(cfmt.colors, (void *)cfmt.ccolor); - cfmt.i = cfmt.b = cfmt.u = cfmt.ul = 0; - cfmt.align = WALeft; - cfmt.fmargin = cfmt.bmargin = 0; - cfmt.para = (cfmt.actions.createParagraph) (cfmt.fmargin, cfmt.bmargin, - WMWidgetWidth(tPtr)-30, NULL, 0, cfmt.align); - (cfmt.actions.insertParagraph) (tPtr, cfmt.para, cfmt.type); - init = 0; - } - -#if 1 - if(strlen(stream) == 1 && stream[0] == '\n') { - /* sometimes if the text entered is a single char AND is a newline, - the user prolly typed it */ - cfmt.para = (cfmt.actions.createParagraph) (cfmt.fmargin, cfmt.bmargin, - WMWidgetWidth(tPtr)-30, NULL, 0, cfmt.align); - (cfmt.actions.insertParagraph) (tPtr, cfmt.para, cfmt.type); - return; - } -#endif - - -/* -*/ - - while( (c=*(stream++))) { -//printf("%c", c); - if(c == '\n' || c =='\t') - //c = ' '; //continue; - continue; - if(c == ' ') { - if(wasspace) - continue; - wasspace = 1; - }else wasspace = 0; - - if(c == '<' && !mode) { - mode=1; - if(txt>0) { - text[txt] = 0; - chunk = (cfmt.actions.createTChunk)(text, txt, cfmt.cfont, - cfmt.ccolor, 0, (cfmt.u?1:0)); - (cfmt.actions.insertChunk) (tPtr, chunk, cfmt.type); -//printf("%s\n", text); - } - txt = 0; - } else if(c == '>' && mode) { - token[tk] = 0; - if(tk>0) parseToken(tPtr, token, tk); - mode=0; - tk=0; - } else { - if(mode) { - if(tk < MAX_TOKEN_SIZE) token[tk++] = c; - } else if(txt < MAX_TEXT_SIZE) text[txt++] = c; - } - } - - if(tk>0) { token[tk] = 0; parseToken(tPtr, token, tk);} - if(txt>0) { - text[txt] = 0; - //printf("%s\n", text); - chunk = (cfmt.actions.createTChunk)(text, txt, - (WMFont *)WMGetFromBag(cfmt.fonts, - WMGetBagItemCount(cfmt.fonts)-1), - (WMColor *)WMGetFromBag(cfmt.colors, - WMGetBagItemCount(cfmt.colors)-1), - 0, (cfmt.u?1:0)); - (cfmt.actions.insertChunk) (tPtr, chunk, cfmt.type); - } - -} - - -/* ================= the driver ================== */ - -WMWidget *win; -WMText *text; - -void NotificationObserver(void *self, WMNotification *notif) -{ - void *object = WMGetNotificationObject(notif); - unsigned short w = WMWidgetWidth(win); - unsigned short h = WMWidgetHeight(win); - - if (WMGetNotificationName(notif) == WMViewSizeDidChangeNotification) { - if (object == WMWidgetView(win)) { - WMResizeWidget(text, w-20, h-20); - } - } - -{static int i=0; -switch(i++) { -case 0: WMSetTextHasHorizontalScroller(text, False); break; -case 1: WMSetTextHasVerticalScroller(text, False); break; -case 2: WMSetTextHasVerticalScroller(text, True); break; -case 3: WMSetTextHasHorizontalScroller(text, True); break; -default: i=0; -} -} -} - -int -main(int argc, char **argv) -{ - Display *dpy; - WMScreen *scr; - - - WMInitializeApplication("WMText", &argc, argv); - dpy = XOpenDisplay(NULL); - if(!dpy) exit(1); - - scr = WMCreateSimpleApplicationScreen(dpy); - - win = WMCreateWindow(scr, "WMText Test"); - WMRealizeWidget(win); - WMResizeWidget(win, 500, 300); - //WMResizeWidget(win, 900, 600); - WMSetWindowTitle(win,"WMText Test"); - WMSetWindowCloseAction(win, Close, NULL); - - text = WMCreateText(win); - WMRealizeWidget(text); - WMResizeWidget(text, 480, 280); - WMMoveWidget(text, 10, 10); - WMSetTextUseFixedPitchFont(text, False); - WMSetTextMonoFont(text, False); - WMSetTextParser(text, HTMLParser); - WMSetTextEditable(text, True); - WMFreezeText(text); - if(1){ - FILE *f = fopen("./wm.html", "r"); - char data[1024]; - if(f) { - while(fgets(data, 1022,f)) - WMAppendTextStream(text, data); - fclose(f); - } else { - WMAppendTextStream(text, "can't open the wm.html file, but here's a text stream
that
needs parsing"); - } - } - - -//WMPrependTextStream(text, "this is prepended\n"); -//WMAppendTextStream(text, "blueplanet.rtf"); - - - WMThawText(text); - WMRefreshText(text, 0, 0); - -/* - WMAddNotificationObserver(NotificationObserver, win, - WMViewSizeDidChangeNotification, WMWidgetView(win)); -*/ - WMSetViewNotifySizeChanges(WMWidgetView(win), True); - WMMapSubwidgets(win); - WMMapWidget(win); - - WMScreenMainLoop(scr); -} - +/* WINGsP.h should NEVER be included from user applications */ +#include +#include +#include +#include +#include + +#include + +void +wAbort() +{ + exit(0); +} + + +void +Close(WMWidget *self, void *client) +{ + exit(0); +} + + + +/* =============== a rudimentary HTML parser ======================= */ + +/* due to the WMSetTextParser stuff, it should not + be too hard to add parsers. like dis :-] */ + + +/* + * A hack to speed up caseless_equal. Thanks to Quincey Koziol for + * developing it for the "chimera" folks so I could use it 7 years later ;-) + * Constraint: nothing but '\0' may map to 0 + */ +unsigned char map_table[256] = +{ + 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, + 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, + 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, + 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, + 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, + 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 91, 92, + 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, + 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, + 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, + 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, + 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, + 164, 165, 166, 167, 168, 169, 170, 171, 172, 173, 174, 175, 176, 177, + 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, + 192, 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, 205, + 206, 207, 208, 209, 210, 211, 212, 213, 214, 215, 216, 217, 218, 219, + 220, 221, 222, 223, 224, 225, 226, 227, 228, 229, 230, 231, 232, 233, + 234, 235, 236, 237, 238, 239, 240, 241, 242, 243, 244, 245, 246, 247, + 248, 249, 250, 251, 252, 253, 254, 255}; + +#define TOLOWER(x) (map_table[(int)x]) +static int +mystrcasecmp(const unsigned char *s1, const unsigned char *s2) +{ + if (!*s1 || !*s2) return 0; + while (*s2 != '\0') { + if (TOLOWER (*s1) != TOLOWER (*s2)) /* true if *s1 == 0 ! */ + return 0; + s1++; + s2++; + } + return (*s1=='\0' ||!isalnum(*s1))?1:0; +} + + +typedef struct _currentFormat { + void *para; + WMBag *fonts; + WMBag *colors; + WMColor *ccolor; + WMFont *cfont; + WMParserActions actions; + //WMBag *aligns; // for tables... + /* the following are "nested" + i.e.: + 1 2 1 1 2 0 get it? */ + short i; + short b; + short u; + short fmargin; + short bmargin; + WMAlignment align:2; + short type:1; + short ul:3; /* how "nested"... up to 8 levels deep */ + short comment:1; /* ignore text till --> */ + short RESERVED:10; +} CFMT; +CFMT cfmt; + + + +#if 0 +getArg(char *t, short type, void *arg) +{ + short d=0; + while(*(++t) && !d) { + if(type==0) { + if(*t>='0' && *t<='9') { + sscanf(t, "%d", arg); + while(*t&& (*t<'0' || *t>'9')) + t++; + d=1; + } + } + } +} +#endif + +void +parseToken(WMText *tPtr, char *token, short tk) +{ + short mode=0; /* 0 starts, 1 closes */ + WMScreen *scr = (W_VIEW(tPtr))->screen; + + while(*token && isspace(*(token))) token++; + if(*token == '/') { + token++; + mode = 1; + while(isspace(*(token))) token++; + } + + if(strlen(token)==1) { + /* nice and fast for small tokens... no need for too much brain + power here */ + switch(TOLOWER(*token)) { + case 'i': + if(!mode) { + cfmt.cfont = WMGetFontItalic(scr, cfmt.cfont); + WMPutInBag(cfmt.fonts, (void *)cfmt.cfont); + } else { /*dun wanna remove the baseFont eh? */ + int count = WMGetBagItemCount(cfmt.fonts); + if(count>1) + WMDeleteFromBag(cfmt.fonts, count-1); + cfmt.cfont = (WMFont *)WMGetFromBag(cfmt.fonts, + WMGetBagItemCount(cfmt.fonts)-1); + } break; + case 'b': + if(!mode) { + cfmt.cfont = WMGetFontBold(scr, cfmt.cfont); + WMPutInBag(cfmt.fonts, (void *)cfmt.cfont); + } else { /*dun wanna remove the baseFont eh? */ + int count = WMGetBagItemCount(cfmt.fonts); + if(count>1) + WMDeleteFromBag(cfmt.fonts, count-1); + cfmt.cfont = (WMFont *)WMGetFromBag(cfmt.fonts, + WMGetBagItemCount(cfmt.fonts)-1); + } break; + case 'p': + cfmt.para = (cfmt.actions.createParagraph) (cfmt.fmargin, cfmt.bmargin, + WMWidgetWidth(tPtr)-30, NULL, 0, cfmt.align); + (cfmt.actions.insertParagraph) (tPtr, cfmt.para, cfmt.type); + cfmt.para = (cfmt.actions.createParagraph) (cfmt.fmargin, cfmt.bmargin, + WMWidgetWidth(tPtr)-30, NULL, 0, cfmt.align); + (cfmt.actions.insertParagraph) (tPtr, cfmt.para, cfmt.type); + break; + case 'u': cfmt.u = !mode; break; + } + } else { /* the tag is, as far as I'm concerned, useless */ + if(mystrcasecmp(token, "br")) { + cfmt.para = (cfmt.actions.createParagraph) (cfmt.fmargin, cfmt.bmargin, + WMWidgetWidth(tPtr)-30, NULL, 0, cfmt.align); + (cfmt.actions.insertParagraph) (tPtr, cfmt.para, cfmt.type); + } + else if(mystrcasecmp(token, "ul")) { + if(mode) { + if(cfmt.ul>1) cfmt.ul--; + } else cfmt.ul++; + if(cfmt.ul) { + cfmt.bmargin = cfmt.ul*30; + cfmt.fmargin = cfmt.bmargin-10; + } else cfmt.fmargin = cfmt.bmargin = 0; + } else if(mystrcasecmp(token, "li")) { + cfmt.para = (cfmt.actions.createParagraph) (cfmt.fmargin, cfmt.bmargin, + WMWidgetWidth(tPtr)-30, NULL, 0, cfmt.align); + (cfmt.actions.insertParagraph) (tPtr, cfmt.para, cfmt.type); + } else if(mystrcasecmp(token, "align")) + ;//printf("align"); + else if(mystrcasecmp(token, "img")) { + if(!mode) { + char *mark=NULL; + WMPixmap *pixmap; + void *chunk; + token+=3; + while(isspace(*(token))) token++; + do { + switch(TOLOWER(*token)) { + case 's': + if(TOLOWER(*(1+token)) == 'r' && TOLOWER(*(2+token)) == 'c') { + mark = strchr(token, '='); + if(mark) { + char img[256], *iptr; + token = mark+1; + if(!token) return; + sscanf(token, "%s", img); + iptr = img; + if(*img == '\"') { img[strlen(img)-1] = 0; iptr++;} + pixmap = WMCreatePixmapFromFile(scr, iptr); + chunk = (cfmt.actions.createPChunk)(pixmap, 0, False); + (cfmt.actions.insertChunk) (tPtr, chunk, False); + printf("[%s]\n", iptr); + } } break; } } while(*(token++)); + } + } else if(mystrcasecmp(token, "font")) { +#if 0 + if(mode) { + cfmt.cfont = (WMFont *)WMGetFromBag(cfmt.fonts, + WMGetBagItemCount(cfmt.fonts)-1); + } else + (WMColor *)WMGetFromBag(cfmt.colors, + WMGetBagItemCount(cfmt.colors)-1), +#endif + } + else if(mystrcasecmp(token, "center")) { + printf("center\n"); + if(mode) cfmt.align = WALeft; + else cfmt.align = WACenter; + cfmt.para = (cfmt.actions.createParagraph) (cfmt.fmargin, cfmt.bmargin, + WMWidgetWidth(tPtr)-30, NULL, 0, cfmt.align); + (cfmt.actions.insertParagraph) (tPtr, cfmt.para, cfmt.type); + } + } + + + + + //printf("parse token (%s)[%s]\n", mode?"close":"open", token); +#if 0 + i=0; + //while(*token && !isspace(*(token))) token++; + //printf("A:%d a:%d z%d Z%d\n", '1', 'a', 'Z', 'z'); + do { + if(!mm) { + if(c>=65 && c<=122) { major[i++] = c; + } else if(c==' ' || c=='='){ major[i] = 0; i=0; mm=1; + printf("\nmajor: [%s]", major);} + } else { + if(c!=' ') { + minor[i++] = c; + } else { minor[i] = 0; i=0; printf(" minor: [%s] ", minor);} + } + }while((c = *(++token))); +#endif + + + //printf("parse token (%s)[%s]\n", mode?"close":"open", token); +} + +void +HTMLParser(WMWidget *w, void *clientData, short type) +{ + static short init=1; /* have we been here at least once before? */ + char *stream = (char *) clientData; + WMText *tPtr = (WMText *)w; + WMScreen *scr; + void *chunk; + char c; +#define MAX_TOKEN_SIZE 255 + char token[MAX_TOKEN_SIZE+1]; +#define MAX_TEXT_SIZE 1023 + char text[MAX_TEXT_SIZE+1]; + short mode=0; + short tk=0, txt=0; + short wasspace=0; + + if(!tPtr || !stream) + return; + + scr = (W_VIEW(tPtr))->screen; + cfmt.type = type; + if(init) { + cfmt.actions = WMGetTextParserActions(tPtr); + cfmt.fonts = WMCreateBag(4); /* there sould always be at least 1 font... */ + cfmt.cfont = WMSystemFontOfSize(scr, 12); + WMPutInBag(cfmt.fonts, (void *)cfmt.cfont); + cfmt.colors = WMCreateBag(4); + cfmt.ccolor = WMBlackColor(scr); + WMPutInBag(cfmt.colors, (void *)cfmt.ccolor); + cfmt.i = cfmt.b = cfmt.u = cfmt.ul = 0; + cfmt.align = WALeft; + cfmt.fmargin = cfmt.bmargin = 0; + cfmt.para = (cfmt.actions.createParagraph) (cfmt.fmargin, cfmt.bmargin, + WMWidgetWidth(tPtr)-30, NULL, 0, cfmt.align); + (cfmt.actions.insertParagraph) (tPtr, cfmt.para, cfmt.type); + init = 0; + } + +#if 1 + if(strlen(stream) == 1 && stream[0] == '\n') { + /* sometimes if the text entered is a single char AND is a newline, + the user prolly typed it */ + cfmt.para = (cfmt.actions.createParagraph) (cfmt.fmargin, cfmt.bmargin, + WMWidgetWidth(tPtr)-30, NULL, 0, cfmt.align); + (cfmt.actions.insertParagraph) (tPtr, cfmt.para, cfmt.type); + return; + } +#endif + + + /* + */ + + while( (c=*(stream++))) { + //printf("%c", c); + if(c == '\n' || c =='\t') + //c = ' '; //continue; + continue; + if(c == ' ') { + if(wasspace) + continue; + wasspace = 1; + }else wasspace = 0; + + if(c == '<' && !mode) { + mode=1; + if(txt>0) { + text[txt] = 0; + chunk = (cfmt.actions.createTChunk)(text, txt, cfmt.cfont, + cfmt.ccolor, 0, (cfmt.u?1:0)); + (cfmt.actions.insertChunk) (tPtr, chunk, cfmt.type); + //printf("%s\n", text); + } + txt = 0; + } else if(c == '>' && mode) { + token[tk] = 0; + if(tk>0) parseToken(tPtr, token, tk); + mode=0; + tk=0; + } else { + if(mode) { + if(tk < MAX_TOKEN_SIZE) token[tk++] = c; + } else if(txt < MAX_TEXT_SIZE) text[txt++] = c; + } + } + + if(tk>0) { token[tk] = 0; parseToken(tPtr, token, tk);} + if(txt>0) { + text[txt] = 0; + //printf("%s\n", text); + chunk = (cfmt.actions.createTChunk)(text, txt, + (WMFont *)WMGetFromBag(cfmt.fonts, + WMGetBagItemCount(cfmt.fonts)-1), + (WMColor *)WMGetFromBag(cfmt.colors, + WMGetBagItemCount(cfmt.colors)-1), + 0, (cfmt.u?1:0)); + (cfmt.actions.insertChunk) (tPtr, chunk, cfmt.type); + } + +} + + +/* ================= the driver ================== */ + +WMWidget *win; +WMText *text; + +void +NotificationObserver(void *self, WMNotification *notif) +{ + void *object = WMGetNotificationObject(notif); + unsigned short w = WMWidgetWidth(win); + unsigned short h = WMWidgetHeight(win); + + if (WMGetNotificationName(notif) == WMViewSizeDidChangeNotification) { + if (object == WMWidgetView(win)) { + WMResizeWidget(text, w-20, h-20); + } + } + + {static int i=0; + switch(i++) { + case 0: WMSetTextHasHorizontalScroller(text, False); break; + case 1: WMSetTextHasVerticalScroller(text, False); break; + case 2: WMSetTextHasVerticalScroller(text, True); break; + case 3: WMSetTextHasHorizontalScroller(text, True); break; + default: i=0; + } + } +} + +int +main(int argc, char **argv) +{ + Display *dpy; + WMScreen *scr; + + + WMInitializeApplication("WMText", &argc, argv); + dpy = XOpenDisplay(NULL); + if(!dpy) exit(1); + + scr = WMCreateSimpleApplicationScreen(dpy); + + win = WMCreateWindow(scr, "WMText Test"); + WMRealizeWidget(win); + WMResizeWidget(win, 500, 300); + //WMResizeWidget(win, 900, 600); + WMSetWindowTitle(win,"WMText Test"); + WMSetWindowCloseAction(win, Close, NULL); + + text = WMCreateText(win); + WMRealizeWidget(text); + WMResizeWidget(text, 480, 280); + WMMoveWidget(text, 10, 10); + WMSetTextUseFixedPitchFont(text, False); + WMSetTextMonoFont(text, False); + WMSetTextParser(text, HTMLParser); + WMSetTextEditable(text, True); + WMFreezeText(text); + if(1){ + FILE *f = fopen("./wm.html", "r"); + char data[1024]; + if(f) { + while(fgets(data, 1022,f)) + WMAppendTextStream(text, data); + fclose(f); + } else { + WMAppendTextStream(text, "can't open the wm.html file, but here's a text stream
that
needs parsing"); + } + } + + + //WMPrependTextStream(text, "this is prepended\n"); + //WMAppendTextStream(text, "blueplanet.rtf"); + + + WMThawText(text); + WMRefreshText(text, 0, 0); + + /* + WMAddNotificationObserver(NotificationObserver, win, + WMViewSizeDidChangeNotification, WMWidgetView(win)); + */ + WMSetViewNotifySizeChanges(WMWidgetView(win), True); + WMMapSubwidgets(win); + WMMapWidget(win); + + WMScreenMainLoop(scr); +} + diff --git a/WINGs/wruler.c b/WINGs/wruler.c index 9f13efe6..4431c911 100644 --- a/WINGs/wruler.c +++ b/WINGs/wruler.c @@ -40,7 +40,9 @@ typedef struct W_Ruler { | \ |__\ | -| */ +| + +*/ static void drawLeftMarker(Ruler *rPtr) { @@ -62,14 +64,16 @@ drawLeftMarker(Ruler *rPtr) rPtr->fg, points, 4, Convex, CoordModeOrigin); } + /* Marker for right margin /| / | /__| | -| */ +| +*/ static void drawRightMarker(Ruler *rPtr) { @@ -95,7 +99,9 @@ drawRightMarker(Ruler *rPtr) /* Marker for first line only _____ |___| - | */ + | + + */ static void drawFirstMarker(Ruler *rPtr) { @@ -110,7 +116,8 @@ drawFirstMarker(Ruler *rPtr) /* Marker for rest of body _____ \ / - \./ */ + \./ + */ static void drawBodyMarker(Ruler *rPtr) { @@ -127,6 +134,7 @@ drawBodyMarker(Ruler *rPtr) rPtr->fg, points, 3, Convex, CoordModeOrigin); } + static void createDrawBuffer(Ruler *rPtr) { @@ -139,6 +147,7 @@ createDrawBuffer(Ruler *rPtr) rPtr->bg, 0, 0, rPtr->view->size.width, 40); } + static void drawRulerOnPixmap(Ruler *rPtr) { @@ -146,52 +155,52 @@ drawRulerOnPixmap(Ruler *rPtr) char c[3]; int marks[9] = {11, 3, 5, 3, 7, 3, 5, 3}; -if(!rPtr->drawBuffer) - createDrawBuffer(rPtr); - -XFillRectangle(rPtr->view->screen->display, rPtr->drawBuffer, - rPtr->bg, 0, 0, rPtr->view->size.width, 40); - - -WMDrawString(rPtr->view->screen, rPtr->drawBuffer, - rPtr->fg, rPtr->font, rPtr->margins.left+2, 26, "0 inches", 10); + if(!rPtr->drawBuffer) + createDrawBuffer(rPtr); -/* marker ticks */ -i=j=m=0; -w = rPtr->view->size.width - rPtr->margins.left; -while(m < w) { - XDrawLine(rPtr->view->screen->display, rPtr->drawBuffer, - rPtr->fg, rPtr->margins.left+m, 23, - rPtr->margins.left+m, marks[i%8]+23); - if(i!=0 && i%8==0) { - if(j<10) - snprintf(c,3,"%d",++j); - else - snprintf(c,3,"%2d",++j); - WMDrawString(rPtr->view->screen, rPtr->drawBuffer, - rPtr->fg, rPtr->font, rPtr->margins.left+2+m, 26, c, 2); + XFillRectangle(rPtr->view->screen->display, rPtr->drawBuffer, + rPtr->bg, 0, 0, rPtr->view->size.width, 40); + + WMDrawString(rPtr->view->screen, rPtr->drawBuffer, rPtr->fg, + rPtr->font, rPtr->margins.left+2, 26, "0 inches", 10); + + /* marker ticks */ + i=j=m=0; + w = rPtr->view->size.width - rPtr->margins.left; + while(m < w) { + XDrawLine(rPtr->view->screen->display, rPtr->drawBuffer, + rPtr->fg, rPtr->margins.left+m, 23, + rPtr->margins.left+m, marks[i%8]+23); + if(i!=0 && i%8==0) { + if(j<10) + snprintf(c,3,"%d",++j); + else + snprintf(c,3,"%2d",++j); + WMDrawString(rPtr->view->screen, rPtr->drawBuffer, rPtr->fg, + rPtr->font, rPtr->margins.left+2+m, 26, c, 2); + } + m = (++i)*10; } - m = (++i)*10; -} -rPtr->end = rPtr->margins.left+m-10; -if(rPtr->margins.right > rPtr->end) - rPtr->margins.right = rPtr->end; -/* base line */ -XDrawLine(rPtr->view->screen->display, rPtr->drawBuffer, - rPtr->fg, rPtr->margins.left, 22, rPtr->margins.left+m-10, 22); - -drawLeftMarker(rPtr); -drawRightMarker(rPtr); -drawFirstMarker(rPtr); -drawBodyMarker(rPtr); + rPtr->end = rPtr->margins.left+m-10; + if(rPtr->margins.right > rPtr->end) + rPtr->margins.right = rPtr->end; + /* base line */ + XDrawLine(rPtr->view->screen->display, rPtr->drawBuffer, rPtr->fg, + rPtr->margins.left, 22, rPtr->margins.left+m-10, 22); + + drawLeftMarker(rPtr); + drawRightMarker(rPtr); + drawFirstMarker(rPtr); + drawBodyMarker(rPtr); } + static void paintRuler(Ruler *rPtr) { WMScreen *screen = rPtr->view->screen; - if(1||!rPtr->drawBuffer) { //first exposure + if(1||!rPtr->drawBuffer) { drawRulerOnPixmap(rPtr); } @@ -200,6 +209,7 @@ paintRuler(Ruler *rPtr) 0, 0); } + static Bool verifyMarkerMove(Ruler *rPtr, int x) { @@ -208,40 +218,37 @@ verifyMarkerMove(Ruler *rPtr, int x) switch(rPtr->flags.whichMarker) { case 1: - if( x > rPtr->margins.right - 10 - || rPtr->margins.body + x > rPtr->margins.right-MIN_DOC_WIDTH - || rPtr->margins.first + x > rPtr->margins.right-MIN_DOC_WIDTH - || x < rPtr->offset) + if(x > rPtr->margins.right - 10 || x < rPtr->offset || + rPtr->margins.body + x > rPtr->margins.right-MIN_DOC_WIDTH || + rPtr->margins.first + x > rPtr->margins.right-MIN_DOC_WIDTH) return False; break; case 2: - if( x < rPtr->margins.first+MIN_DOC_WIDTH - || x < rPtr->margins.body+MIN_DOC_WIDTH - || x < rPtr->margins.left+MIN_DOC_WIDTH - || x > rPtr->end) //rPtr->view->size.width) + if(x < rPtr->margins.first+MIN_DOC_WIDTH || + x < rPtr->margins.body+MIN_DOC_WIDTH || + x < rPtr->margins.left+MIN_DOC_WIDTH || + x > rPtr->end) /*rPtr->view->size.width)*/ return False; break; case 3: - if( x >= rPtr->margins.right-MIN_DOC_WIDTH - || x < rPtr->margins.left) + if(x >= rPtr->margins.right-MIN_DOC_WIDTH || x < rPtr->margins.left) return False; break; case 4: - if( x >= rPtr->margins.right-MIN_DOC_WIDTH - || x < rPtr->margins.left) + if(x >= rPtr->margins.right-MIN_DOC_WIDTH || x < rPtr->margins.left) return False; break; case 6: - if( x >= rPtr->margins.right-MIN_DOC_WIDTH - || x < rPtr->margins.left) + if(x >= rPtr->margins.right-MIN_DOC_WIDTH || x < rPtr->margins.left) return False; break; - default: return False; + default: + return False; } rPtr->motion = x; @@ -439,15 +446,17 @@ WMSetRulerMargins(WMRuler *rPtr, WMRulerMargins margins) rPtr->margins.right = margins.right + rPtr->offset; rPtr->margins.first = margins.first + rPtr->offset; rPtr->margins.body = margins.body + rPtr->offset; - rPtr->margins.tabs = margins.tabs; //for loop + rPtr->margins.tabs = margins.tabs; /*for loop*/ paintRuler(rPtr); } + WMRulerMargins WMGetRulerMargins(WMRuler *rPtr) { WMRulerMargins margins; + if(!rPtr) return margins; @@ -455,21 +464,23 @@ WMGetRulerMargins(WMRuler *rPtr) margins.right = rPtr->margins.right - rPtr->offset; margins.first = rPtr->margins.first - rPtr->offset; margins.body = rPtr->margins.body - rPtr->offset; - //for + /*for*/ margins.tabs = rPtr->margins.tabs; return rPtr->margins; } + void WMSetRulerOffset(WMRuler *rPtr, int pixels) { if(!rPtr || pixels<0 || pixels+MIN_DOC_WIDTH>=rPtr->view->size.width) return; rPtr->offset = pixels; - //rulerDidResize(rPtr, rPtr->view); + /*rulerDidResize(rPtr, rPtr->view);*/ } + int WMGetRulerOffset(WMRuler *rPtr) { @@ -478,6 +489,7 @@ WMGetRulerOffset(WMRuler *rPtr) return rPtr->offset; } + void WMSetRulerReleaseAction(WMRuler *rPtr, WMAction *action, void *clientData) { @@ -488,6 +500,7 @@ WMSetRulerReleaseAction(WMRuler *rPtr, WMAction *action, void *clientData) rPtr->clientData = clientData; } + void WMSetRulerMoveAction(WMRuler *rPtr, WMAction *action, void *clientData) { @@ -498,6 +511,7 @@ WMSetRulerMoveAction(WMRuler *rPtr, WMAction *action, void *clientData) rPtr->clientData = clientData; } + /* _which_ one was released */ int WMGetReleasedRulerMargin(WMRuler *rPtr) @@ -507,6 +521,7 @@ WMGetReleasedRulerMargin(WMRuler *rPtr) return rPtr->flags.whichMarker; } + /* _which_ one is being grabbed */ int WMGetGrabbedRulerMargin(WMRuler *rPtr) @@ -515,3 +530,5 @@ WMGetGrabbedRulerMargin(WMRuler *rPtr) return 0; return rPtr->flags.whichMarker; } + + diff --git a/WINGs/wtext.c b/WINGs/wtext.c index 42177988..aa8b2815 100644 --- a/WINGs/wtext.c +++ b/WINGs/wtext.c @@ -280,7 +280,7 @@ chunkSelectionRect(Text *tPtr, Paragraph *para, MyTextItems item, if(type == 1 && item.chunk->type == ctText) { /* partial coverage */ - lm = 2+WMGetRulerMargin(tPtr->ruler, WRulerDocLeft); + lm = 2+WMGetRulerMargins(tPtr->ruler, WRulerDocLeft); /* even I am still confused, so don't ask please */ if( (item.x+j+lm >= tPtr->sRect.pos.x && item.x+j+lm <= tPtr->sRect.pos.x+tPtr->sRect.size.width) @@ -571,8 +571,8 @@ putParagraphOnPixmap(Text *tPtr, Paragraph *para, Bool draw) if(!tPtr->view->flags.realized || !para) return 0; where.x = 0, where.y =0, nitems = 0; - m.left = WMGetRulerMargin(tPtr->ruler, WRulerDocLeft); - m.right = WMGetRulerMargin(tPtr->ruler, WRulerRight) - m.left; + m.left = WMGetRulerMargins(tPtr->ruler, WRulerDocLeft); + m.right = WMGetRulerMargins(tPtr->ruler, WRulerRight) - m.left; m.first = para->fmargin, m.body = para->bmargin; if(draw) { @@ -669,9 +669,9 @@ calcParaExtents(Text *tPtr, Paragraph *para) para->bmargin = 0; para->rmargin = tPtr->visibleW; } else { - para->width = WMGetRulerMargin(tPtr->ruler, WRulerRight) - - WMIN(para->fmargin, para->bmargin) - - WMGetRulerOffset(tPtr->ruler); + para->width = WMGetRulerMargins(tPtr->ruler, WRulerRight) - + WMIN(para->fmargin, para->bmargin) - + WMGetRulerOffset(tPtr->ruler); } if(!para->chunks) @@ -728,8 +728,8 @@ calcDocExtents(Text *tPtr) if(tPtr->monoFont) { tPtr->docWidth = tPtr->visibleW; } else { - tPtr->docWidth = WMGetRulerMargin(tPtr->ruler, WRulerRight) - - WMGetRulerMargin(tPtr->ruler, WRulerDocLeft); + tPtr->docWidth = WMGetRulerMargins(tPtr->ruler, WRulerRight) - + WMGetRulerMargins(tPtr->ruler, WRulerDocLeft); } tPtr->docHeight = 0; para = tPtr->paragraphs; @@ -2382,7 +2382,7 @@ WMSetTextRulerMargin(WMText *tPtr, char which, short pixels) { if(!tPtr) return; if(tPtr->monoFont) return; - WMSetRulerMargin(tPtr->ruler, which, pixels); + WMSetRulerMargins(tPtr->ruler, which, pixels); WMRefreshText(tPtr, tPtr->vpos, tPtr->hpos); } @@ -2392,7 +2392,7 @@ WMGetTextRulerMargin(WMText *tPtr, char which) if(!tPtr) return 0; if(tPtr->monoFont) return 0; - return WMGetRulerMargin(tPtr->ruler, which); + return WMGetRulerMargins(tPtr->ruler, which); } -- 2.11.4.GIT