📄 mimerichtextinit.c
字号:
priv->hsbVal = priv->vsbVal = 0; priv->hsbMax = priv->vsbMax = 0; args.Reset(); args.ResizePolicy(XmRESIZE_NONE); args.MarginWidth(0); args.MarginHeight(0); args.ShadowThickness(0); args.BorderWidth(0); args.UserData(this); priv->textDA = XmCreateDrawingArea(parent, "richTextArea", ARGS);//// Read and load fonts so we can get size of rows and columns// priv->defPlainFontName = get_string(cl, MainWidget(), "font", "-misc-fixed-medium-r-normal--13*"); priv->defFixedFontName = get_string(cl, MainWidget(), "fixedFont", "-misc-fixed-medium-r-normal--13*"); priv->plainFont = priv->defPlainFontName; priv->fixedFont = priv->defFixedFontName; priv->lineSpacing = (char)get_int(cl, MainWidget(), "lineSpacing", 1); priv->forceFixed = get_boolean(cl, MainWidget(), "forceFixed", False);//// Set the margins// priv->marginWd = (Dimension)get_int(cl, MainWidget(), "marginWidth", 5); priv->marginHt = (Dimension)get_int(cl, MainWidget(), "marginHeight", 5); priv->marginWd2 = (Dimension)2 * priv->marginWd; priv->marginHt2 = (Dimension)2 * priv->marginHt;//// Set width based on row and column counts if necessary// priv->singleLine = get_boolean(cl, MainWidget(), "singleLine", False); int colCount = get_int(cl, MainWidget(), "columnCount", 0); int rowCount = get_int(cl, MainWidget(), "rowCount", 0);//// See if rows or columns was passed in// for (i=0; i<argc; i++) { Arg *arg = &argv[i]; if ( strcasecmp(arg->name, "rows") == 0 ) rowCount = (int)arg->value; else if ( strcasecmp(arg->name, "columns") == 0 ) colCount = (int)arg->value; } if ( priv->singleLine ) rowCount = 1;//// Set size based on rows and columns if necessary// if ( colCount > 0 ) { priv->drawWd = CharWidth() * colCount + priv->marginWd2; XtVaSetValues(priv->textDA, XmNwidth, priv->drawWd, NULL); } else XtVaGetValues(priv->textDA, XmNwidth, &priv->drawWd, NULL); if ( rowCount > 0 ) { priv->drawHt = ((CharHeight() + priv->lineSpacing) * rowCount) - priv->lineSpacing + 2/*for accents on top line*/ + priv->marginHt2; XtVaSetValues(priv->textDA, XmNheight, priv->drawHt, NULL); } else XtVaGetValues(priv->textDA, XmNheight, &priv->drawHt, NULL); priv->maxWd = priv->drawWd; priv->maxHt = priv->drawHt; XtManageChild(priv->textDA); if ( !priv->textSW ) { XtManageChild(priv->textFrame); XtManageChild(priv->hlForm); XtManageChild(priv->textHSB); XtManageChild(priv->textVSB); } XtAddCallback(priv->textDA, XmNexposeCallback, (XtCallbackProc)MimeRichTextP::HandleExpose, priv);//// Read resources// priv->tabStop = (char)get_int(cl, MainWidget(), "tabStop", 8); priv->indentWd = get_int(cl, MainWidget(), "indentWidth", 32); priv->autoScrollInterval = get_int(cl, MainWidget(), "autoScrollInterval", 10); priv->maxLength = get_int(cl, MainWidget(), "maxTextLength", 200000); priv->timerOk = get_boolean(cl, MainWidget(), "timerOk", True); StringC typeStr = get_string(cl, MainWidget(), "textType", "plain"); if ( strcasecmp(typeStr, "rich") == 0 || strcasecmp(typeStr, "richtext") == 0 || strcasecmp(typeStr, "text/richtext") == 0 ) priv->textType = TT_RICH; else if ( strcasecmp(typeStr, "enriched") == 0 || strcasecmp(typeStr, "text/enriched") == 0 ) priv->textType = TT_ENRICHED; else if ( strcasecmp(typeStr, "html") == 0 || strcasecmp(typeStr, "x-html") == 0 || strcasecmp(typeStr, "text/x-html") == 0 || strcasecmp(typeStr, "text/html") == 0 ) priv->textType = TT_HTML; else priv->textType = TT_PLAIN; if ( priv->singleLine ) priv->resizeWidth = True; else priv->resizeWidth = get_boolean(cl, MainWidget(), "resizeWidth", False); priv->fgColor = get_color(cl, MainWidget(), "foreground", XtDefaultForeground); priv->bgColor = get_color(cl, MainWidget(), "background", XtDefaultBackground); priv->urlColor = get_color(cl, MainWidget(), "urlColor", priv->fgColor); priv->linkColor = get_color(cl, MainWidget(), "linkColor", priv->urlColor); priv->hlColor = get_color(cl, MainWidget(), "highlightColor", priv->fgColor); if ( priv->hlForm ) XtVaGetValues(priv->hlForm, XmNbackground, &priv->hlFormBg, NULL); priv->cursorColor = priv->fgColor ^ priv->bgColor; XtVaSetValues(priv->textDA, XmNbackground, priv->bgColor, XmNforeground, priv->fgColor, NULL);//// Initialize character set// char *cs = StrCaseStr(priv->defPlainFontName, "iso8859"); if ( cs ) priv->defCharset = cs; else priv->defCharset = "us-ascii"; priv->defCharset = get_string(cl, MainWidget(), "charset", priv->defCharset); if ( priv->defCharset.StartsWith("iso-", IGNORE_CASE) ) priv->defCharset(3,1) = ""; // Remove '-' if ( debuglev > 1 ) cout <<"Character set is " <<priv->defCharset <<endl; priv->curCharset = AddCharset(priv->defCharset);//// Get size of excerpt string// priv->excerptStr = get_string(cl, MainWidget(), "excerptPrefix", "> "); int dir, asc, dsc; XCharStruct size; XTextExtents(priv->plainFont.xfont, priv->excerptStr, priv->excerptStr.size(), &dir, &asc, &dsc, &size); priv->excerptWd = size.width;//// Add actions and translations if necessary// static Boolean actionsAdded = False; if ( !actionsAdded ) { XtAppAddActions(halApp->context, priv->actions, XtNumber(priv->actions)); actionsAdded = True;//// These translations cannot be specified in a resource file due to the fact// that Motif overrides them after the resource file is processed.// priv->defaultTrans1 = XtParseTranslationTable("\c s <Key>osfLeft: MimeRichTextC-select-left-word()\n\c <Key>osfLeft: MimeRichTextC-move-left-word()\n\s <Key>osfLeft: MimeRichTextC-select-left-char()\n\ <Key>osfLeft: MimeRichTextC-move-left-char()\n\c s <Key>osfRight: MimeRichTextC-select-right-word()\n\c <Key>osfRight: MimeRichTextC-move-right-word()\n\s <Key>osfRight: MimeRichTextC-select-right-char()\n\ <Key>osfRight: MimeRichTextC-move-right-char()\n\c s <Key>osfUp: MimeRichTextC-select-up-para()\n\c <Key>osfUp: MimeRichTextC-move-up-para()\n\s <Key>osfUp: MimeRichTextC-select-up-line()\n\ <Key>osfUp: MimeRichTextC-move-up-line()\n\c s <Key>osfDown: MimeRichTextC-select-down-para()\n\c <Key>osfDown: MimeRichTextC-move-down-para()\n\s <Key>osfDown: MimeRichTextC-select-down-line()\n\ <Key>osfDown: MimeRichTextC-move-down-line()\n\c s <Key>osfBeginLine: MimeRichTextC-select-file-beg()\n\c <Key>osfBeginLine: MimeRichTextC-move-file-beg()\n\s <Key>osfBeginLine: MimeRichTextC-select-line-beg()\n\ <Key>osfBeginLine: MimeRichTextC-move-line-beg()\n\c s <Key>osfEndLine: MimeRichTextC-select-file-end()\n\c <Key>osfEndLine: MimeRichTextC-move-file-end()\n\s <Key>osfEndLine: MimeRichTextC-select-line-end()\n\ <Key>osfEndLine: MimeRichTextC-move-line-end()\n\s <Key>osfBeginData: MimeRichTextC-select-file-beg()\n\ <Key>osfBeginData: MimeRichTextC-move-file-beg()\n\s <Key>osfEndData: MimeRichTextC-select-file-end()\n\ <Key>osfEndData: MimeRichTextC-move-file-end()\n\c s <Key>osfBackSpace: MimeRichTextC-delete-line-beg()\n\c <Key>osfBackSpace: MimeRichTextC-delete-left-word()\n\s <Key>osfBackSpace: MimeRichTextC-delete-left-char()\n\ <Key>osfBackSpace: MimeRichTextC-delete-left-char()\n\c s <Key>osfDelete: MimeRichTextC-delete-line-end()\n\c <Key>osfDelete: MimeRichTextC-delete-right-word()\n\s <Key>osfDelete: MimeRichTextC-delete-right-char()\n\ <Key>osfDelete: MimeRichTextC-delete-right-char()\n\ <Key>osfClear: MimeRichTextC-delete-selection()\n\ <Key>osfCut: MimeRichTextC-cut-selection()\n\ <Key>osfCopy: MimeRichTextC-copy-selection()\n\c <Key>osfPageUp: MimeRichTextC-scroll-top()\n\ <Key>osfPageUp: MimeRichTextC-scroll-up-page()\n\c <Key>osfPageDown: MimeRichTextC-scroll-bottom()\n\ <Key>osfPageDown: MimeRichTextC-scroll-down-page()\n\ <Key>osfInsert: MimeRichTextC-paste()\n\ <Key>osfPaste: MimeRichTextC-paste()\n\ <Key>osfUndo: MimeRichTextC-undo()\n\c <Key>u: MimeRichTextC-delete-line-beg()\n\c <Key>w: MimeRichTextC-delete-left-word()\n\c <Key>h: MimeRichTextC-delete-left-char()\n\c <Key>v: MimeRichTextC-paste()\n\c <Key>z: MimeRichTextC-undo()\n\c <Key>p: MimeRichTextC-plain()\n\c <Key>b: MimeRichTextC-bold()\n\c <Key>i: MimeRichTextC-italic()\n\c <Key>f: MimeRichTextC-fixed()\n\c <Key>period: MimeRichTextC-bigger()\n\c <Key>comma: MimeRichTextC-smaller()\n\c <Key>-: MimeRichTextC-underline()\n\c <Key>=: MimeRichTextC-center()\n\c <Key>bracketleft: MimeRichTextC-flush-left()\n\c <Key>bracketright: MimeRichTextC-flush-right()\n\c s <Key>period: MimeRichTextC-left-margin-in()\n\c s <Key>comma: MimeRichTextC-left-margin-out()\n\Mod1 <Key>period: MimeRichTextC-excerpt-more()\n\Mod1 <Key>comma: MimeRichTextC-excerpt-less()\n\c <Key>l: MimeRichTextC-refresh()\n\c <Key>/: MimeRichTextC-search()\n\ <Key>: MimeRichTextC-insert-self()\n\!c <Btn1Down>: MimeRichTextC-follow-url()\n\!s <Btn1Down>: MimeRichTextC-select-extend()\n\~c ~s <Btn1Down>: MimeRichTextC-select-begin()\n\!s <Btn1Motion>: MimeRichTextC-select-extend()\n\~c ~s <Btn1Motion>: MimeRichTextC-select-motion()\n\~c <Btn1Up>: MimeRichTextC-select-end()\n\ <Btn2Up>: MimeRichTextC-paste()\n\ <Btn3Down>: MimeRichTextC-post-menu()\");/* <Btn1Down>: MimeRichTextC-select-begin()\n\ <Btn2Up>: MimeRichTextC-paste()\n\ <Btn3Down>: MimeRichTextC-post-menu()\n\c <Btn1Up>: MimeRichTextC-follow-url()\n\ <Btn1Up>: MimeRichTextC-select-end()\n\s <Btn1Down>: MimeRichTextC-select-extend()\n\s <Btn1Motion>: MimeRichTextC-select-extend()\n\ <Btn1Motion>: MimeRichTextC-select-motion()\n\*//*c <Btn1Down>,<Btn1Up>: MimeRichTextC-follow-url()\n\s <Btn1Down>: MimeRichTextC-select-extend()\n\ <Btn1Down>(4): MimeRichTextC-quad-click()\n\ <Btn1Down>(3): MimeRichTextC-trip-click()\n\ <Btn1Down>(2): MimeRichTextC-doub-click()\n\ <Btn1Down>: MimeRichTextC-sing-click()\n\s <Btn1Up>: MimeRichTextC-select-end()\n\ <Btn1Up>(4): MimeRichTextC-select-end()\n\ <Btn1Up>(3): MimeRichTextC-select-end()\n\ <Btn1Up>(2): MimeRichTextC-select-end()\n\ <Btn1Down>,<Btn1Up>: MimeRichTextC-select-end()\n\ <Btn2Up>: MimeRichTextC-paste()\n\*//*!c <Btn1Down>: MimeRichTextC-follow-url()\n\!s <Btn1Down>: MimeRichTextC-select-extend()\n\~c ~s <Btn1Down>: MimeRichTextC-select-begin()\n\!s <Btn1Motion>: MimeRichTextC-select-extend()\n\~c ~s <Btn1Motion>: MimeRichTextC-select-motion()\n\~c <Btn1Up>: MimeRichTextC-select-end()\n\ <Btn2Up>: MimeRichTextC-paste()\n\*///// These translations handle the behavior of the "delete" key. People are// so particular...// priv->delRightTrans = XtParseTranslationTable("\c s <Key>osfDelete: MimeRichTextC-delete-line-end()\n\c <Key>osfDelete: MimeRichTextC-delete-right-word()\n\s <Key>osfDelete: MimeRichTextC-delete-right-char()\n\ <Key>osfDelete: MimeRichTextC-delete-right-char()\n\"); priv->delLeftTrans = XtParseTranslationTable("\c s <Key>osfDelete: MimeRichTextC-delete-line-beg()\n\c <Key>osfDelete: MimeRichTextC-delete-left-word()\n\s <Key>osfDelete: MimeRichTextC-delete-left-char()\n\ <Key>osfDelete: MimeRichTextC-delete-left-char()\n\");//// These translations mimic emacs and override any default translations// priv->emacsTrans = XtParseTranslationTable("\c <Key>b: MimeRichTextC-move-left-char()\n\Mod1 <Key>b: MimeRichTextC-move-left-word()\n\c <Key>f: MimeRichTextC-move-right-char()\n\Mod1 <Key>f: MimeRichTextC-move-right-word()\n\c <Key>a: MimeRichTextC-move-line-beg()\n\c <Key>e: MimeRichTextC-move-line-end()\n\c <Key>p: MimeRichTextC-move-up-line()\n\Mod1 <Key>bracketleft: MimeRichTextC-move-up-para()\n\c <Key>n: MimeRichTextC-move-down-line()\n\Mod1 <Key>bracketright: MimeRichTextC-move-down-para()\n\Mod1 <Key>comma: MimeRichTextC-move-file-beg()\n\Mod1 <Key>period: MimeRichTextC-move-file-end()\n\c <Key>z: MimeRichTextC-scroll-up-line()\n\Mod1 <Key>z: MimeRichTextC-scroll-down-line()\n\c <Key>d: MimeRichTextC-delete-right-char()\n\c <Key>k: MimeRichTextC-delete-line-end()\n\c s <Key>b: MimeRichTextC-select-left-char()\n\Mod1 s <Key>b: MimeRichTextC-select-left-word()\n\c s <Key>f: MimeRichTextC-select-right-char()\n\Mod1 s <Key>f: MimeRichTextC-select-right-word()\n\c s <Key>a: MimeRichTextC-select-line-beg()\n\c s <Key>e: MimeRichTextC-select-line-end()\n\c s <Key>p: MimeRichTextC-select-up-line()\n\Mod1 s <Key>bracketleft: MimeRichTextC-select-up-para()\n\c s <Key>n: MimeRichTextC-select-down-line()\n\Mod1 s <Key>bracketright: MimeRichTextC-select-down-para()\n\Mod1 s <Key>comma: MimeRichTextC-select-file-beg()\n\Mod1 s <Key>period: MimeRichTextC-select-file-end()\n\c <Key>y: MimeRichTextC-undo()\n\c <Key>0: MimeRichTextC-plain()\n\c <Key>1: MimeRichTextC-bold()\n\c <Key>2: MimeRichTextC-italic()\n\c <Key>3: MimeRichTextC-fixed()\n\c <Key>4: MimeRichTextC-bigger()\n\Mod1 <Key>4: MimeRichTextC-smaller()\n\c <Key>5: MimeRichTextC-flush-left()\n\Mod1 <Key>5: MimeRichTextC-flush-right()\n\c <Key>6: MimeRichTextC-left-margin-in()\n\Mod1 <Key>6: MimeRichTextC-left-margin-out()\n\c <Key>7: MimeRichTextC-right-margin-in()\n\Mod1 <Key>7: MimeRichTextC-right-margin-out()\n\c <Key>8: MimeRichTextC-excerpt-more()\n\Mod1 <Key>8: MimeRichTextC-excerpt-less()\"); } // End if actions not added//// Read translation resources// priv->tabTraverses = get_boolean(cl, MainWidget(), "tabTraverses", False); priv->delLikeBs = get_boolean(cl, MainWidget(), "deleteMeansBackspace", False); priv->emacsMode = get_boolean(cl, MainWidget(), "emacsMode", False); priv->userTrans = get_string (cl, priv->textDA, "translations"); priv->userTrans.Trim(); priv->UpdateTranslations();//// Initialize character classes for double-click// StringC charClassDef = get_string(cl, MainWidget(), "charClass", ""); SetCharClasses(charClassDef);//// Initialize cursor// priv->editable = get_boolean(cl, MainWidget(), "editable", True); float rate = get_float (cl, MainWidget(), "cursorBlinkRate", 1.0); float onTime = get_float (cl, MainWidget(), "cursorOnPercent", 75.0); float blinkInterval = (rate > 0.0) ? (float)1000/rate : 0.0; priv->cursorOnTime = (int)(blinkInterval * (onTime/(float)100)); priv->cursorOffTime = (int)(blinkInterval - (float)priv->cursorOnTime);//// Add event handler for focus change// Widget shell = parent; while ( !XtIsShell(shell) ) shell = XtParent(shell); unsigned char focusPolicy; XtVaGetValues(shell, XmNkeyboardFocusPolicy, &focusPolicy, NULL); if ( focusPolicy == XmPOINTER ) XtAddEventHandler(priv->textDA, EnterWindowMask|LeaveWindowMask, False, (XtEventHandler)MimeRichTextP::HandleFocusChange, (XtPointer)priv); else XtAddEventHandler(priv->textDA, FocusChangeMask, False, (XtEventHandler)MimeRichTextP::HandleFocusChange, (XtPointer)priv);//// We took multi-click translation out of trans table. Go back to// ActSelectMotion//#if 0//// Add event handler for button 1 motion. This cannot co-exist in the// regular translation table because of the presence of multi-click// events. (Xt volume 5, page 876).// XtAddEventHandler(priv->textDA, Button1MotionMask, False, (XtEventHandler)MimeRichTextP::HandleButton1Motion, (XtPointer)priv);#endif//// Get the command to be used when a URL is clicked// priv->webCommand = get_string(cl, MainWidget(), "webBrowserCommand", "Mosaic %s");//// Create atom for cut and paste// if ( !MimeRichTextP::mimeRichAtom ) MimeRichTextP::mimeRichAtom = XmInternAtom(halApp->display, MIME_ENRICHED_ATOM_NAME, False);//// Add a blank line// priv->NewInputLine();
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -