static int JSTF_Script_OK(GGadget *g, GEvent *e) { if ( e->type==et_controlevent && e->u.control.subtype == et_buttonactivate ) { Jstf_Dlg *jd = GDrawGetUserData(GGadgetGetWindow(g)); SplineFont *sf = jd->sf; Justify *head=NULL, *last=NULL, *cur; int rows, i; int cols = GMatrixEditGetColCnt(GWidgetGetControl(jd->gw,CID_Scripts)); struct matrix_data *strings = GMatrixEditGet(GWidgetGetControl(jd->gw,CID_Scripts), &rows); for ( i=0; i<rows; ++i ) { cur = chunkalloc(sizeof(Justify)); cur->script = Str2Tag(strings[cols*i+0].u.md_str); cur->extenders = copy(strings[cols*i+1].u.md_str); cur->langs = strings[cols*i+3].u.md_addr; if ( head==NULL ) head = cur; else last->next = cur; last = cur; } JustifyFree(sf->justify); sf->justify = head; jd->done = true; } return( true ); }
static int BaseLang_OK(GGadget *g, GEvent *e) { if ( e->type==et_controlevent && e->u.control.subtype == et_buttonactivate ) { BaseLangDlg *b = GDrawGetUserData(GGadgetGetWindow(g)); GGadget *g = GWidgetGetControl(b->gw,CID_Languages); int r, rows, cols = GMatrixEditGetColCnt(g); struct matrix_data *md = GMatrixEditGet(g,&rows); struct baselangextent *cur, *last; if ( md==NULL ) return( true ); b->old = last = NULL; for ( r=0; r<rows; ++r ) { cur = XZALLOC(struct baselangextent); cur->lang = TagFromString(md[r*cols+0].u.md_str); cur->descent = md[r*cols+1].u.md_ival; cur->ascent = md[r*cols+2].u.md_ival; cur->features = (struct baselangextent *) md[r*cols+3].u.md_str; md[r*cols+3].u.md_str = NULL; if ( last==NULL ) b->old = cur; else last->next = cur; last = cur; } b->done = true; }
static char *JSTF_GlyphDlg(GGadget *g, int r, int c) { int rows; struct matrix_data *strings = GMatrixEditGet(g, &rows); int cols = GMatrixEditGetColCnt(g); char *glyphstr = strings[cols*r+c].u.md_str; Jstf_Dlg *jd = GDrawGetUserData(GGadgetGetWindow(g)); return( GlyphListDlg(jd->sf,glyphstr)); }
static void BaseLang_DoCancel(BaseLangDlg *b) { GGadget *g = GWidgetGetControl(b->gw,CID_Languages); int r, rows, cols = GMatrixEditGetColCnt(g); struct matrix_data *md = _GMatrixEditGet(g,&rows); for ( r=0; r<rows; ++r ) md[r*cols+cols-1].u.md_str = NULL; b->done = true; }
static void Jstf_Cancel(Jstf_Dlg *jd) { int rows, i; int cols = GMatrixEditGetColCnt(GWidgetGetControl(jd->gw,CID_Scripts)); struct matrix_data *strings = GMatrixEditGet(GWidgetGetControl(jd->gw,CID_Scripts), &rows); for ( i=0; i<rows; ++i ) { JstfLangFree(strings[cols*i+3].u.md_addr); } jd->done = true; }
static int JSTF_Language_OK(GGadget *g, GEvent *e) { if ( e->type==et_controlevent && e->u.control.subtype == et_buttonactivate ) { Jstf_Dlg *jd = GDrawGetUserData(GGadgetGetWindow(g)); int rows, i, j, k, cnt; struct matrix_data *strings = GMatrixEditGet(GWidgetGetControl(jd->lgw,CID_Languages), &rows); int cols = GMatrixEditGetColCnt(GWidgetGetControl(jd->lgw,CID_Languages)); struct jstf_lang *head=NULL, *last=NULL, *cur; for ( i=0; i<rows; ++i ) if ( !(strings[i*cols+0].u.md_str[0]&0x80) ) { for ( j=i, cnt=0; j<rows; ++j ) if ( strcmp(strings[j*cols+0].u.md_str, strings[i*cols+0].u.md_str)==0 ) ++cnt; cur = chunkalloc(sizeof(struct jstf_lang)); if ( head==NULL ) head = cur; else last->next = cur; last = cur; cur->lang = Str2Tag(strings[i*cols+0].u.md_str); cur->cnt = cnt; cur->prios=gcalloc(cnt,sizeof(struct jstf_prio)); for ( j=i, cnt=0; j<rows; ++j ) { if ( strcmp(strings[j*cols+0].u.md_str, strings[i*cols+0].u.md_str)==0 ) { cur->prios[cnt].enableExtend = Str2OTLList(jd->sf,strings[j*cols+1].u.md_str ); cur->prios[cnt].disableExtend = Str2OTLList(jd->sf,strings[j*cols+2].u.md_str ); cur->prios[cnt].maxExtend = Str2OTLList(jd->sf,strings[j*cols+3].u.md_str ); cur->prios[cnt].enableShrink = Str2OTLList(jd->sf,strings[j*cols+4].u.md_str ); cur->prios[cnt].disableShrink = Str2OTLList(jd->sf,strings[j*cols+5].u.md_str ); cur->prios[cnt].maxShrink = Str2OTLList(jd->sf,strings[j*cols+6].u.md_str ); if ( cur->prios[cnt].enableExtend == (OTLookup **) -1 || cur->prios[cnt].disableExtend == (OTLookup **) -1 || cur->prios[cnt].maxExtend == (OTLookup **) -1 || cur->prios[cnt].enableShrink == (OTLookup **) -1 || cur->prios[cnt].disableShrink == (OTLookup **) -1 || cur->prios[cnt].maxShrink == (OTLookup **) -1 ) { JstfLangFree(head); for ( k=0; k<rows; ++k ) strings[k*cols+0].u.md_str[0] &= ~0x80; return( true ); } ++cnt; } } for ( j=rows-1; j>=i; --j ) if ( strcmp(strings[j*cols+0].u.md_str, strings[i*cols+0].u.md_str)==0 ) strings[j*cols+0].u.md_str[0] |= 0x80; } JstfLangFree( *jd->here ); *jd->here = head; jd->ldone = true; } return( true ); }
static int BaseLang_Extents(GGadget *g, GEvent *e) { if ( e->type==et_controlevent && e->u.control.subtype == et_buttonactivate ) { BaseLangDlg *b = GDrawGetUserData(GGadgetGetWindow(g)); GGadget *gme = GWidgetGetControl(b->gw,CID_Languages); int rows, cols = GMatrixEditGetColCnt(gme); struct matrix_data *md = _GMatrixEditGet(gme,&rows); int r = GMatrixEditGetActiveRow(gme); if ( r<0 || r>=rows ) return( true ); md[r*cols+cols-1].u.md_str = (char *) SFBaselang(b->sf,(struct baselangextent *)md[r*cols+cols-1].u.md_str, b->vertical,false, b->script); } return( true ); }
static void BaseLang_FinishEdit(GGadget *g, int r, int c, int wasnew) { if ( wasnew && c==0 ) { BaseLangDlg *b = GDrawGetUserData(GGadgetGetWindow(g)); int rows, cols = GMatrixEditGetColCnt(g); struct matrix_data *md = GMatrixEditGet(g,&rows); uint32 lang = TagFromString(md[r*cols+0].u.md_str); int gid; SplineChar *sc; DBounds bnd, scb; memset(&bnd,0,sizeof(bnd)); for ( gid=0; gid<b->sf->glyphcnt; ++gid ) if ( (sc=b->sf->glyphs[gid])!=NULL ) { if ( lang==CHR('E','N','G',' ') && (sc->unicodeenc<0 || sc->unicodeenc>127)) /* English just uses ASCII */; else if ( b->script==CHR('l','a','t','n') && (sc->unicodeenc<0 || sc->unicodeenc>255) && lang!=CHR('V','I','T',' ') ) /* Most languages in latin script only use one accent per */ /* letter. So latin1 should provide a reasonable bounding */ /* box. Vietnamese is an exception. */; else if ( SCScriptFromUnicode(sc)!=b->script ) /* Not interesting */; else { SplineCharFindBounds(sc,&scb); if ( bnd.minx==bnd.maxx ) bnd = scb; else { if ( scb.minx<bnd.minx ) bnd.minx = scb.minx; if ( scb.miny<bnd.miny ) bnd.miny = scb.miny; if ( scb.maxx>bnd.maxx ) bnd.maxx = scb.maxx; if ( scb.maxy>bnd.maxy ) bnd.maxy = scb.maxy; } } } if ( b->vertical ) { md[r*cols+1].u.md_ival = floor(bnd.minx); md[r*cols+2].u.md_ival = ceil(bnd.maxx); } else { md[r*cols+1].u.md_ival = floor(bnd.miny); md[r*cols+2].u.md_ival = ceil(bnd.maxy); } } }
static char *JSTF_Langs(GGadget *g, int r, int c) { int rows, i, k, j; struct matrix_data *strings = GMatrixEditGet(g, &rows); int cols = GMatrixEditGetColCnt(g); Jstf_Dlg *jd = GDrawGetUserData(GGadgetGetWindow(g)); GRect pos; GWindow gw; GWindowAttrs wattrs; GGadgetCreateData gcd[4], boxes[3]; GGadgetCreateData *varray[6], *harray3[8]; GTextInfo label[4]; struct matrixinit mi; jd->ldone = false; jd->here = (struct jstf_lang **) &strings[cols*r+3].u.md_addr; memset(&wattrs,0,sizeof(wattrs)); wattrs.mask = wam_events|wam_cursor|wam_utf8_wtitle|wam_undercursor|wam_isdlg|wam_restrict; wattrs.event_masks = ~(1<<et_charup); wattrs.is_dlg = true; wattrs.restrict_input_to_me = 1; wattrs.undercursor = 1; wattrs.cursor = ct_pointer; wattrs.utf8_window_title = _("Justified Languages"); pos.x = pos.y = 0; pos.width =GDrawPointsToPixels(NULL,GGadgetScale(268)); pos.height = GDrawPointsToPixels(NULL,375); jd->lgw = gw = GDrawCreateTopWindow(NULL,&pos,langs_e_h,jd,&wattrs); memset(&gcd,0,sizeof(gcd)); memset(&boxes,0,sizeof(boxes)); memset(&label,0,sizeof(label)); k=j=0; JLanguageMatrixInit(&mi,*jd->here); gcd[k].gd.pos.x = 10; gcd[k].gd.pos.y = gcd[1].gd.pos.y+14; gcd[k].gd.pos.width = 900; gcd[k].gd.flags = gg_enabled | gg_visible | gg_utf8_popup; gcd[k].gd.cid = CID_Languages; gcd[k].gd.u.matrix = &mi; gcd[k].gd.popup_msg = (unichar_t *) _( "A list of languages and the lookups turned on and off\n" "for each to accomplish justification. A language may\n" "appear more than once, in which case second (or third,\n" "etc.) will be tried if the first fails."); gcd[k].creator = GMatrixEditCreate; varray[j++] = &gcd[k++]; varray[j++] = NULL; gcd[k].gd.pos.x = 30-3; gcd[k].gd.pos.width = -1; gcd[k].gd.pos.height = 0; gcd[k].gd.flags = gg_visible | gg_enabled | gg_but_default; label[k].text = (unichar_t *) _("_OK"); label[k].text_is_1byte = true; label[k].text_in_resource = true; gcd[k].gd.label = &label[k]; gcd[k].gd.handle_controlevent = JSTF_Language_OK; gcd[k].gd.cid = CID_OK; gcd[k++].creator = GButtonCreate; gcd[k].gd.pos.x = -30; gcd[k].gd.pos.width = -1; gcd[k].gd.pos.height = 0; gcd[k].gd.flags = gg_visible | gg_enabled | gg_but_cancel; label[k].text = (unichar_t *) _("_Cancel"); label[k].text_is_1byte = true; label[k].text_in_resource = true; gcd[k].gd.label = &label[k]; gcd[k].gd.handle_controlevent = JSTF_Language_Cancel; gcd[k].gd.cid = CID_Cancel; gcd[k++].creator = GButtonCreate; harray3[0] = harray3[2] = harray3[3] = harray3[4] = harray3[6] = GCD_Glue; harray3[7] = NULL; harray3[1] = &gcd[k-2]; harray3[5] = &gcd[k-1]; boxes[0].gd.flags = gg_enabled|gg_visible; boxes[0].gd.u.boxelements = harray3; boxes[0].creator = GHBoxCreate; varray[j++] = &boxes[0]; varray[j++] = NULL; varray[j] = NULL; boxes[1].gd.pos.x = boxes[1].gd.pos.y = 2; boxes[1].gd.flags = gg_enabled|gg_visible; boxes[1].gd.u.boxelements = varray; boxes[1].creator = GHVGroupCreate; GGadgetsCreate(gw,boxes+1); for ( i=0; i<mi.initial_row_cnt; ++i ) { free( mi.matrix_data[2*i+0].u.md_str ); } free( mi.matrix_data ); GMatrixEditSetNewText(gcd[0].ret,S_("Language|New")); GMatrixEditSetUpDownVisible(gcd[0].ret,true); GHVBoxSetExpandableCol(boxes[0].ret,gb_expandgluesame); GHVBoxFitWindow(boxes[1].ret); GDrawSetVisible(gw,true); while ( !jd->ldone ) GDrawProcessOneEvent(NULL); GDrawDestroyWindow(gw); return( NULL ); }
static char *JSTF_LookupListDlg(GGadget *g, int r, int c) { int rows, k, j; struct matrix_data *strings = GMatrixEditGet(g, &rows); int cols = GMatrixEditGetColCnt(g); char *lookupstr = strings[cols*r+c].u.md_str; Jstf_Dlg *jd = GDrawGetUserData(GGadgetGetWindow(g)); GRect pos; GWindow gw; GWindowAttrs wattrs; GGadgetCreateData gcd[4], boxes[3]; GGadgetCreateData *varray[6], *harray3[8]; GTextInfo label[4]; struct matrixinit mi; struct glyph_list_dlg gld; memset(&gld,0,sizeof(gld)); gld.sf = jd->sf; memset(&wattrs,0,sizeof(wattrs)); wattrs.mask = wam_events|wam_cursor|wam_utf8_wtitle|wam_undercursor|wam_isdlg|wam_restrict; wattrs.event_masks = ~(1<<et_charup); wattrs.is_dlg = true; wattrs.restrict_input_to_me = 1; wattrs.undercursor = 1; wattrs.cursor = ct_pointer; wattrs.utf8_window_title = c==1 ? _("Lookups turned ON to extend a line") : c==2 ? _("Lookups turned OFF to extend a line") : c==3 ? _("Lookups which specify the maximum size by which a glyph may grow") : c==4 ? _("Lookups turned ON to shrink a line") : c==5 ? _("Lookups turned OFF to shrink a line") : _("Lookups which specify the maximum size by which a glyph may shrink"); pos.x = pos.y = 0; pos.width =GDrawPointsToPixels(NULL,GGadgetScale(268)); pos.height = GDrawPointsToPixels(NULL,375); gld.gw = gw = GDrawCreateTopWindow(NULL,&pos,lookup_e_h,&gld,&wattrs); LookupMatrixInit(&mi,lookupstr,gld.sf,c); memset(&gcd,0,sizeof(gcd)); memset(&boxes,0,sizeof(boxes)); memset(&label,0,sizeof(label)); k=j=0; gcd[k].gd.pos.x = 10; gcd[k].gd.pos.y = gcd[1].gd.pos.y+14; gcd[k].gd.flags = gg_enabled | gg_visible | gg_utf8_popup; gcd[k].gd.cid = CID_Lookups; gcd[k].gd.u.matrix = &mi; gcd[k].gd.popup_msg = (unichar_t *) _( "A list of lookup names"); gcd[k].creator = GMatrixEditCreate; varray[j++] = &gcd[k++]; varray[j++] = NULL; gcd[k].gd.pos.x = 30-3; gcd[k].gd.pos.width = -1; gcd[k].gd.pos.height = 0; gcd[k].gd.flags = gg_visible | gg_enabled | gg_but_default; label[k].text = (unichar_t *) _("_OK"); label[k].text_is_1byte = true; label[k].text_in_resource = true; gcd[k].gd.label = &label[k]; gcd[k].gd.handle_controlevent = JSTF_Lookup_OK; gcd[k].gd.cid = CID_OK; gcd[k++].creator = GButtonCreate; gcd[k].gd.pos.x = -30; gcd[k].gd.pos.width = -1; gcd[k].gd.pos.height = 0; gcd[k].gd.flags = gg_visible | gg_enabled | gg_but_cancel; label[k].text = (unichar_t *) _("_Cancel"); label[k].text_is_1byte = true; label[k].text_in_resource = true; gcd[k].gd.label = &label[k]; gcd[k].gd.handle_controlevent = JSTF_Glyph_Cancel; gcd[k].gd.cid = CID_Cancel; gcd[k++].creator = GButtonCreate; harray3[0] = harray3[2] = harray3[3] = harray3[4] = harray3[6] = GCD_Glue; harray3[7] = NULL; harray3[1] = &gcd[k-2]; harray3[5] = &gcd[k-1]; boxes[0].gd.flags = gg_enabled|gg_visible; boxes[0].gd.u.boxelements = harray3; boxes[0].creator = GHBoxCreate; varray[j++] = &boxes[0]; varray[j++] = NULL; varray[j] = NULL; boxes[1].gd.pos.x = boxes[1].gd.pos.y = 2; boxes[1].gd.flags = gg_enabled|gg_visible; boxes[1].gd.u.boxelements = varray; boxes[1].creator = GHVGroupCreate; GGadgetsCreate(gw,boxes+1); free( mi.matrix_data ); GMatrixEditSetNewText(gcd[0].ret,S_("LookupName|New")); GHVBoxSetExpandableCol(boxes[0].ret,gb_expandgluesame); GHVBoxFitWindow(boxes[1].ret); GDrawSetVisible(gw,true); while ( !gld.done ) GDrawProcessOneEvent(NULL); GDrawDestroyWindow(gw); GTextInfoListFree(lookup_ci[0].enum_vals); lookup_ci[0].enum_vals = NULL; return( gld.ret ); }
static void Base_DelClean(GGadget *g, int r) { int rows, cols = GMatrixEditGetColCnt(g); struct matrix_data *md = _GMatrixEditGet(g,&rows); md[r*cols+cols-1].u.md_str = NULL; }