void addMultirowsForm(Buffer *buf, AnchorList *al) { int i, j, k, col, ecol, pos; Anchor a_form, *a; FormItemList *fi; Line *l, *ls; if (al == NULL || al->nanchor == 0) return; for (i = 0; i < al->nanchor; i++) { a_form = al->anchors[i]; al->anchors[i].rows = 1; if (a_form.hseq < 0 || a_form.rows <= 1) continue; for (l = buf->firstLine; l != NULL; l = l->next) { if (l->linenumber == a_form.y) break; } if (!l) continue; if (a_form.y == a_form.start.line) ls = l; else { for (ls = l; ls != NULL; ls = (a_form.y < a_form.start.line) ? ls->next : ls->prev) { if (ls->linenumber == a_form.start.line) break; } if (!ls) continue; } fi = (FormItemList *)a_form.url; col = COLPOS(ls, a_form.start.pos); ecol = COLPOS(ls, a_form.end.pos); for (j = 0; l && j < a_form.rows; l = l->next, j++) { pos = columnPos(l, col); if (j == 0) { buf->hmarklist->marks[a_form.hseq].line = l->linenumber; buf->hmarklist->marks[a_form.hseq].pos = pos; } if (a_form.start.line == l->linenumber) continue; buf->formitem = putAnchor(buf->formitem, a_form.url, a_form.target, &a, NULL, NULL, '\0', l->linenumber, pos); a->hseq = a_form.hseq; a->y = a_form.y; a->end.pos = pos + ecol - col; l->lineBuf[pos - 1] = '['; l->lineBuf[a->end.pos] = ']'; for (k = pos; k < a->end.pos; k++) l->propBuf[k] |= PE_FORM; } } }
int columnSkip(Buffer *buf, int offset) { int i, maxColumn; int column = buf->currentColumn + offset; int nlines = buf->LINES + 1; Line *l; maxColumn = 0; for (i = 0, l = buf->topLine; i < nlines && l != NULL; i++, l = l->next) { if (l->width < 0) l->width = COLPOS(l, l->len); if (l->width - 1 > maxColumn) maxColumn = l->width - 1; } maxColumn -= buf->COLS - 1; if (column < maxColumn) maxColumn = column; if (maxColumn < 0) maxColumn = 0; if (buf->currentColumn == maxColumn) return 0; buf->currentColumn = maxColumn; return 1; }
int columnPos(Line *line, int column) { int i; for (i = 1; i < line->len; i++) { if (COLPOS(line, i) > column) break; } #ifdef USE_M17N for (i--; i > 0 && line->propBuf[i] & PC_WCHAR2; i--) ; return i; #else return i - 1; #endif }
int getMapXY(Buffer *buf, Anchor *a, int *x, int *y) { if (!buf || !a || !a->image || !x || !y) return 0; *x = (int)((buf->currentColumn + buf->cursorX - COLPOS(buf->currentLine, a->start.pos) + 0.5) * pixel_per_char) - a->image->xoffset; *y = (int)((buf->currentLine->linenumber - a->image->y + 0.5) * pixel_per_line) - a->image->yoffset; if (*x <= 0) *x = 1; if (*y <= 0) *y = 1; return 1; }
void addMultirowsImg(Buffer *buf, AnchorList *al) { int i, j, k, col, ecol, pos; Image *img; Anchor a_img, a_href, a_form, *a; Line *l, *ls; if (al == NULL || al->nanchor == 0) return; for (i = 0; i < al->nanchor; i++) { a_img = al->anchors[i]; img = a_img.image; if (a_img.hseq < 0 || !img || img->rows <= 1) continue; for (l = buf->firstLine; l != NULL; l = l->next) { if (l->linenumber == img->y) break; } if (!l) continue; if (a_img.y == a_img.start.line) ls = l; else { for (ls = l; ls != NULL; ls = (a_img.y < a_img.start.line) ? ls->next : ls->prev) { if (ls->linenumber == a_img.start.line) break; } if (!ls) continue; } a = retrieveAnchor(buf->href, a_img.start.line, a_img.start.pos); if (a) a_href = *a; else a_href.url = NULL; a = retrieveAnchor(buf->formitem, a_img.start.line, a_img.start.pos); if (a) a_form = *a; else a_form.url = NULL; col = COLPOS(ls, a_img.start.pos); ecol = COLPOS(ls, a_img.end.pos); for (j = 0; l && j < img->rows; l = l->next, j++) { if (a_img.start.line == l->linenumber) continue; pos = columnPos(l, col); a = registerImg(buf, a_img.url, a_img.title, l->linenumber, pos); a->hseq = -a_img.hseq; a->slave = TRUE; a->image = img; a->end.pos = pos + ecol - col; for (k = pos; k < a->end.pos; k++) l->propBuf[k] |= PE_IMAGE; if (a_href.url) { a = registerHref(buf, a_href.url, a_href.target, a_href.referer, a_href.title, a_href.accesskey, l->linenumber, pos); a->hseq = a_href.hseq; a->slave = TRUE; a->end.pos = pos + ecol - col; for (k = pos; k < a->end.pos; k++) l->propBuf[k] |= PE_ANCHOR; } if (a_form.url) { buf->formitem = putAnchor(buf->formitem, a_form.url, a_form.target, &a, NULL, NULL, '\0', l->linenumber, pos); a->hseq = a_form.hseq; a->end.pos = pos + ecol - col; } } img->rows = 0; } }