📄 mimerichtextinit.c
字号:
/* * $Id: MimeRichTextInit.C,v 1.3 2000/05/31 13:05:30 evgeny Exp $ * * Copyright (c) 1994 HAL Computer Systems International, Ltd. * * HAL COMPUTER SYSTEMS INTERNATIONAL, LTD. * 1315 Dell Avenue * Campbell, CA 95008 * * Author: Greg Hilton * Contributors: Tom Lang, Frank Bieser, and others * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * http://www.gnu.org/copyleft/gpl.html * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */#include <config.h>#include "MimeRichTextC.h"#include "MimeRichTextP.h"#include "rsrc.h"#include "HalAppC.h"#include "StrCase.h"#include "CharC.h"#include "WArgList.h"#include "RegexC.h"#include <Xm/Form.h>#include <Xm/Frame.h>#include <Xm/DrawingA.h>#include <Xm/ScrolledW.h>#include <Xm/ScrollBar.h>#include <Xm/AtomMgr.h>#include <X11/Xatom.h>#include <X11/Xmu/Atoms.h>extern int debuglev;Atom MimeRichTextP::mimeRichAtom = (Atom)NULL;//// Translations are shared by all//XtTranslations MimeRichTextP::defaultTrans1;XtTranslations MimeRichTextP::defaultTrans2;XtTranslations MimeRichTextP::delLeftTrans;XtTranslations MimeRichTextP::delRightTrans;XtTranslations MimeRichTextP::emacsTrans;XtActionsRec MimeRichTextP::actions[MIME_ACTION_COUNT] = { "MimeRichTextC-move-left-char", (XtActionProc)ActMoveLeftChar, "MimeRichTextC-move-left-word", (XtActionProc)ActMoveLeftWord, "MimeRichTextC-move-right-char", (XtActionProc)ActMoveRightChar, "MimeRichTextC-move-right-word", (XtActionProc)ActMoveRightWord, "MimeRichTextC-move-line-beg", (XtActionProc)ActMoveLineBeg, "MimeRichTextC-move-line-end", (XtActionProc)ActMoveLineEnd, "MimeRichTextC-move-up-line", (XtActionProc)ActMoveUpLine, "MimeRichTextC-move-up-para", (XtActionProc)ActMoveUpPara, "MimeRichTextC-move-down-line", (XtActionProc)ActMoveDownLine, "MimeRichTextC-move-down-para", (XtActionProc)ActMoveDownPara, "MimeRichTextC-move-file-beg", (XtActionProc)ActMoveFileBeg, "MimeRichTextC-move-file-end", (XtActionProc)ActMoveFileEnd, "MimeRichTextC-delete-left-char", (XtActionProc)ActDeleteLeftChar, "MimeRichTextC-delete-left-word", (XtActionProc)ActDeleteLeftWord, "MimeRichTextC-delete-right-char", (XtActionProc)ActDeleteRightChar, "MimeRichTextC-delete-right-word", (XtActionProc)ActDeleteRightWord, "MimeRichTextC-delete-line-beg", (XtActionProc)ActDeleteLineBeg, "MimeRichTextC-delete-line-end", (XtActionProc)ActDeleteLineEnd, "MimeRichTextC-select-begin", (XtActionProc)ActSelectBegin, "MimeRichTextC-select-motion", (XtActionProc)ActSelectMotion, "MimeRichTextC-select-extend", (XtActionProc)ActSelectExtend, "MimeRichTextC-select-end", (XtActionProc)ActSelectEnd, "MimeRichTextC-select-left-char", (XtActionProc)ActSelectLeftChar, "MimeRichTextC-select-left-word", (XtActionProc)ActSelectLeftWord, "MimeRichTextC-select-right-char", (XtActionProc)ActSelectRightChar, "MimeRichTextC-select-right-word", (XtActionProc)ActSelectRightWord, "MimeRichTextC-select-line-beg", (XtActionProc)ActSelectLineBeg, "MimeRichTextC-select-line-end", (XtActionProc)ActSelectLineEnd, "MimeRichTextC-select-up-line", (XtActionProc)ActSelectUpLine, "MimeRichTextC-select-up-para", (XtActionProc)ActSelectUpPara, "MimeRichTextC-select-down-line", (XtActionProc)ActSelectDownLine, "MimeRichTextC-select-down-para", (XtActionProc)ActSelectDownPara, "MimeRichTextC-select-file-beg", (XtActionProc)ActSelectFileBeg, "MimeRichTextC-select-file-end", (XtActionProc)ActSelectFileEnd, "MimeRichTextC-delete-selection", (XtActionProc)ActDeleteSelection, "MimeRichTextC-cut-selection", (XtActionProc)ActCutSelection, "MimeRichTextC-copy-selection", (XtActionProc)ActCopySelection, "MimeRichTextC-paste", (XtActionProc)ActPaste, "MimeRichTextC-undo", (XtActionProc)ActUndo, "MimeRichTextC-insert-self", (XtActionProc)ActInsertSelf, "MimeRichTextC-refresh", (XtActionProc)ActRefresh, "MimeRichTextC-plain", (XtActionProc)ActPlain, "MimeRichTextC-bold", (XtActionProc)ActBold, "MimeRichTextC-italic", (XtActionProc)ActItalic, "MimeRichTextC-fixed", (XtActionProc)ActFixed, "MimeRichTextC-smaller", (XtActionProc)ActSmaller, "MimeRichTextC-bigger", (XtActionProc)ActBigger, "MimeRichTextC-underline", (XtActionProc)ActUnderline, "MimeRichTextC-center", (XtActionProc)ActCenter, "MimeRichTextC-flush-left", (XtActionProc)ActFlushLeft, "MimeRichTextC-flush-right", (XtActionProc)ActFlushRight, "MimeRichTextC-flush-both", (XtActionProc)ActFlushBoth, "MimeRichTextC-no-fill", (XtActionProc)ActNoFill, "MimeRichTextC-left-margin-in", (XtActionProc)ActLeftMarginIn, "MimeRichTextC-left-margin-out", (XtActionProc)ActLeftMarginOut, "MimeRichTextC-right-margin-in", (XtActionProc)ActRightMarginIn, "MimeRichTextC-right-margin-out", (XtActionProc)ActRightMarginOut, "MimeRichTextC-excerpt-more", (XtActionProc)ActExcerptMore, "MimeRichTextC-excerpt-less", (XtActionProc)ActExcerptLess, "MimeRichTextC-scroll-up-line", (XtActionProc)ActScrollUpLine, "MimeRichTextC-scroll-up-page", (XtActionProc)ActScrollUpPage, "MimeRichTextC-scroll-down-line", (XtActionProc)ActScrollDownLine, "MimeRichTextC-scroll-down-page", (XtActionProc)ActScrollDownPage, "MimeRichTextC-scroll-top", (XtActionProc)ActScrollTop, "MimeRichTextC-scroll-bottom", (XtActionProc)ActScrollBottom, "MimeRichTextC-line-to-top", (XtActionProc)ActLineToTop, "MimeRichTextC-line-to-center", (XtActionProc)ActLineToCenter, "MimeRichTextC-line-to-bottom", (XtActionProc)ActLineToBottom, "MimeRichTextC-follow-url", (XtActionProc)ActFollowURL, "MimeRichTextC-search", (XtActionProc)ActSearch, "MimeRichTextC-ignore", (XtActionProc)ActIgnore, "MimeRichTextC-post-menu", (XtActionProc)ActPostMenu};#if 0#endif/*---------------------------------------------------------------------- * double click table for cut and paste in 8 bits * * This table is divided in four parts : * * - control characters [0,0x1f] U [0x80,0x9f] * - separators [0x20,0x3f] U [0xa0,0xb9] * - binding characters [0x40,0x7f] U [0xc0,0xff] * - execeptions */int MimeRichTextP::charClasses[256] = {/* NUL SOH STX ETX EOT ENQ ACK BEL */ 32, 1, 1, 1, 1, 1, 1, 1,/* BS HT NL VT NP CR SO SI */ 1, 32, 1, 1, 1, 1, 1, 1,/* DLE DC1 DC2 DC3 DC4 NAK SYN ETB */ 1, 1, 1, 1, 1, 1, 1, 1,/* CAN EM SUB ESC FS GS RS US */ 1, 1, 1, 1, 1, 1, 1, 1,/* SP ! " # $ % & ' */ 32, 33, 34, 35, 36, 37, 38, 39,/* ( ) * + , - . / */ 40, 41, 42, 43, 44, 45, 46, 47,/* 0 1 2 3 4 5 6 7 */ 48, 48, 48, 48, 48, 48, 48, 48,/* 8 9 : ; < = > ? */ 48, 48, 58, 59, 60, 61, 62, 63,/* @ A B C D E F G */ 64, 48, 48, 48, 48, 48, 48, 48,/* H I J K L M N O */ 48, 48, 48, 48, 48, 48, 48, 48,/* P Q R S T U V W */ 48, 48, 48, 48, 48, 48, 48, 48,/* X Y Z [ \ ] ^ _ */ 48, 48, 48, 91, 92, 93, 94, 48,/* ` a b c d e f g */ 96, 48, 48, 48, 48, 48, 48, 48,/* h i j k l m n o */ 48, 48, 48, 48, 48, 48, 48, 48,/* p q r s t u v w */ 48, 48, 48, 48, 48, 48, 48, 48,/* x y z { | } ~ DEL */ 48, 48, 48, 123, 124, 125, 126, 1,/* x80 x81 x82 x83 IND NEL SSA ESA */ 1, 1, 1, 1, 1, 1, 1, 1,/* HTS HTJ VTS PLD PLU RI SS2 SS3 */ 1, 1, 1, 1, 1, 1, 1, 1,/* DCS PU1 PU2 STS CCH MW SPA EPA */ 1, 1, 1, 1, 1, 1, 1, 1,/* x98 x99 x9A CSI ST OSC PM APC */ 1, 1, 1, 1, 1, 1, 1, 1,/* - i c/ L ox Y- | So */ 160, 161, 162, 163, 164, 165, 166, 167,/* .. c0 ip << _ R0 - */ 168, 169, 170, 171, 172, 173, 174, 175,/* o +- 2 3 ' u q| . */ 176, 177, 178, 179, 180, 181, 182, 183,/* , 1 2 >> 1/4 1/2 3/4 ? */ 184, 185, 186, 187, 188, 189, 190, 191,/* A` A' A^ A~ A: Ao AE C, */ 48, 48, 48, 48, 48, 48, 48, 48,/* E` E' E^ E: I` I' I^ I: */ 48, 48, 48, 48, 48, 48, 48, 48,/* D- N~ O` O' O^ O~ O: X */ 48, 48, 48, 48, 48, 48, 48, 216,/* O/ U` U' U^ U: Y' P B */ 48, 48, 48, 48, 48, 48, 48, 48,/* a` a' a^ a~ a: ao ae c, */ 48, 48, 48, 48, 48, 48, 48, 48,/* e` e' e^ e: i` i' i^ i: */ 48, 48, 48, 48, 48, 48, 48, 48,/* d n~ o` o' o^ o~ o: -: */ 48, 48, 48, 48, 48, 48, 48, 248,/* o/ u` u' u^ u: y' P y: */ 48, 48, 48, 48, 48, 48, 48, 48};/*---------------------------------------------------------------------- * Constructor */MimeRichTextC::MimeRichTextC(Widget parent, const char *name, ArgList argv, Cardinal argc){ priv = new MimeRichTextP; priv->pub = this; priv->realized = False; priv->defer = 0; priv->changed = False; priv->textGC = NULL; priv->cursorHideCount = 0; priv->hasFocus = False; priv->clickCount = 0; priv->cursorTimer = (XtIntervalId)NULL; priv->clickTimer = (XtIntervalId)NULL; priv->scrollTimer = (XtIntervalId)NULL; priv->selectOn = False; priv->okToEndSelection= False; priv->selectTime = 0; priv->mousePaste = False; priv->sendExcerpt = True; priv->topTextLine = NULL; priv->botTextLine = NULL; priv->topSaveLine = NULL; priv->botSaveLine = NULL; priv->topSoftLine = NULL; priv->botSoftLine = NULL; priv->inputLine = NULL; priv->inputCmd = NULL; priv->checkFroms = False; priv->inputTextBuf.AutoShrink(False); priv->textPm = (Pixmap)NULL; priv->stipplePm = (Pixmap)NULL; priv->hsbAlwaysOn = False; priv->vsbAlwaysOn = False;//// Save args passed in// WArgList args; int i=0; for (i=0; i<argc; i++) { Arg *arg = &argv[i]; args.Add(arg->name, arg->value); } char *cl = "MimeRichTextC";//// If we're in a scrolled window, this is the widget hierarchy://// ScrolledWindow textSW// Form nameForm// MimeRichTextC name// if ( XmIsScrolledWindow(parent) ) { priv->textSW = parent; priv->hlForm = NULL; priv->scrollForm = NULL; priv->textFrame = NULL; priv->textVSB = NULL; priv->textHSB = NULL; priv->hlThick = 0; }//// If we're not in a scrolled window, this is the widget hierarchy://// ??? parent// Form name// Form highlightForm// Frame textFrame// MimeRichTextC textArea// ScrollBar textVSB// ScrollBar textHSB// else { priv->textSW = NULL; priv->textClip = NULL; args.ResizePolicy(XmRESIZE_NONE); priv->scrollForm = XmCreateForm(parent, (char*)name, ARGS); args.Reset(); args.LeftAttachment(XmATTACH_FORM); args.RightAttachment(XmATTACH_FORM); args.TopAttachment(XmATTACH_FORM); args.BottomAttachment(XmATTACH_FORM); args.MarginWidth(0); args.MarginHeight(0); args.ShadowThickness(0); args.BorderWidth(0); priv->hlForm = XmCreateForm(priv->scrollForm, "richHighlightForm", ARGS); priv->hlThick = get_int(cl, MainWidget(), "highlightThickness", 1); args.Reset(); args.MarginWidth(0); args.MarginHeight(0); args.BorderWidth(0); args.LeftAttachment(XmATTACH_FORM, priv->hlThick); args.RightAttachment(XmATTACH_FORM, priv->hlThick); args.TopAttachment(XmATTACH_FORM, priv->hlThick); args.BottomAttachment(XmATTACH_FORM, priv->hlThick); priv->textFrame = XmCreateFrame(priv->hlForm, "richTextFrame", ARGS); args.Reset(); args.LeftAttachment(XmATTACH_OPPOSITE_WIDGET, priv->hlForm); args.RightAttachment(XmATTACH_OPPOSITE_WIDGET, priv->hlForm); args.TopAttachment(XmATTACH_NONE); args.BottomAttachment(XmATTACH_FORM); args.Orientation(XmHORIZONTAL); args.ProcessingDirection(XmMAX_ON_RIGHT); args.ShowArrows(True); args.MappedWhenManaged(False); priv->textHSB = XmCreateScrollBar(priv->scrollForm, "richTextHSB", ARGS); priv->hsbAlwaysOn = get_boolean(priv->textHSB, "alwaysOn", False); args.Reset(); args.LeftAttachment(XmATTACH_NONE); args.RightAttachment(XmATTACH_FORM); args.TopAttachment(XmATTACH_OPPOSITE_WIDGET, priv->hlForm); args.BottomAttachment(XmATTACH_OPPOSITE_WIDGET, priv->hlForm); args.Orientation(XmVERTICAL); args.ProcessingDirection(XmMAX_ON_BOTTOM); args.ShowArrows(True); args.MappedWhenManaged(False); priv->textVSB = XmCreateScrollBar(priv->scrollForm, "richTextVSB", ARGS); priv->vsbAlwaysOn = get_boolean(priv->textVSB, "alwaysOn", False); XtAddCallback(priv->textHSB, XmNdecrementCallback, (XtCallbackProc)MimeRichTextP::HandleHScroll, priv); XtAddCallback(priv->textHSB, XmNdragCallback, (XtCallbackProc)MimeRichTextP::HandleHScroll, priv); XtAddCallback(priv->textHSB, XmNincrementCallback, (XtCallbackProc)MimeRichTextP::HandleHScroll, priv); XtAddCallback(priv->textHSB, XmNpageDecrementCallback, (XtCallbackProc)MimeRichTextP::HandleHScroll, priv); XtAddCallback(priv->textHSB, XmNpageIncrementCallback, (XtCallbackProc)MimeRichTextP::HandleHScroll, priv); XtAddCallback(priv->textHSB, XmNtoBottomCallback, (XtCallbackProc)MimeRichTextP::HandleHScroll, priv); XtAddCallback(priv->textHSB, XmNtoTopCallback, (XtCallbackProc)MimeRichTextP::HandleHScroll, priv); XtAddCallback(priv->textHSB, XmNvalueChangedCallback, (XtCallbackProc)MimeRichTextP::HandleHScroll, priv); XtAddCallback(priv->textVSB, XmNdecrementCallback, (XtCallbackProc)MimeRichTextP::HandleVScroll, priv); XtAddCallback(priv->textVSB, XmNdragCallback, (XtCallbackProc)MimeRichTextP::HandleVScroll, priv); XtAddCallback(priv->textVSB, XmNincrementCallback, (XtCallbackProc)MimeRichTextP::HandleVScroll, priv); XtAddCallback(priv->textVSB, XmNpageDecrementCallback, (XtCallbackProc)MimeRichTextP::HandleVScroll, priv); XtAddCallback(priv->textVSB, XmNpageIncrementCallback, (XtCallbackProc)MimeRichTextP::HandleVScroll, priv); XtAddCallback(priv->textVSB, XmNtoBottomCallback, (XtCallbackProc)MimeRichTextP::HandleVScroll, priv); XtAddCallback(priv->textVSB, XmNtoTopCallback, (XtCallbackProc)MimeRichTextP::HandleVScroll, priv); XtAddCallback(priv->textVSB, XmNvalueChangedCallback, (XtCallbackProc)MimeRichTextP::HandleVScroll, priv); parent = priv->textFrame;//// Get offsets to use if scrollbars are not displayed// XtVaGetValues(priv->hlForm, XmNrightOffset, &priv->noScrollRoff, XmNbottomOffset, &priv->noScrollBoff, NULL);//// Get size and offset for scrollbars// int roff, boff; Dimension sbwd, sbht; XtVaGetValues(priv->textVSB, XmNrightOffset, &roff, XmNwidth, &sbwd, NULL); XtVaGetValues(priv->textHSB, XmNbottomOffset, &boff, XmNheight, &sbht, NULL);//// Get offsets to use if scrollbars are displayed// priv->scrollRoff = priv->noScrollRoff + sbwd + roff; priv->scrollBoff = priv->noScrollBoff + sbht + boff;//// Place scroll bars if they're always on// if ( priv->vsbAlwaysOn ) { XtVaSetValues(priv->hlForm, XmNrightOffset, priv->scrollRoff, NULL); XtVaSetValues(priv->textVSB, XmNmappedWhenManaged, True, NULL); } else { XtVaSetValues(priv->hlForm, XmNrightOffset, priv->noScrollRoff, NULL); } if ( priv->hsbAlwaysOn ) { XtVaSetValues(priv->hlForm, XmNbottomOffset, priv->scrollBoff, NULL); XtVaSetValues(priv->textHSB, XmNmappedWhenManaged, True, NULL); } else { XtVaSetValues(priv->hlForm, XmNbottomOffset, priv->noScrollBoff,NULL); } } // End if we're creating our own scroll bars priv->hsbOn = priv->hsbAlwaysOn; priv->vsbOn = priv->vsbAlwaysOn;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -