/*:VRX Main */ /* Main */ Main: /* Process the arguments. Get the parent window. */ parse source . calledAs . parent = "" argCount = arg() argOff = 0 if( calledAs \= "COMMAND" )then do if argCount >= 1 then do parent = arg(1) argCount = argCount - 1 argOff = 1 end end; else do call VROptions 'ImplicitNames' call VROptions 'NoEchoQuit' end InitArgs.0 = argCount if( argCount > 0 )then do i = 1 to argCount InitArgs.i = arg( i + argOff ) end drop calledAs argCount argOff /* Load the windows */ call VRInit parse source . . spec _VREPrimaryWindowPath = , VRParseFileName( spec, "dpn" ) || ".VRW" _VREPrimaryWindow = , VRLoad( parent, _VREPrimaryWindowPath ) drop parent spec if( _VREPrimaryWindow == "" )then do call VRMessage "", "Cannot load window:" VRError(), , "Error!" _VREReturnValue = 32000 signal _VRELeaveMain end /* Process events */ call Init signal on halt do while( \ VRGet( _VREPrimaryWindow, "Shutdown" ) ) _VREEvent = VREvent() interpret _VREEvent end _VREHalt: _VREReturnValue = Fini() call VRDestroy _VREPrimaryWindow _VRELeaveMain: call VRFini exit _VREReturnValue VRLoadSecondary: __vrlsWait = abbrev( 'WAIT', translate(arg(2)), 1 ) if __vrlsWait then do call VRFlush end __vrlsHWnd = VRLoad( VRWindow(), VRWindowPath(), arg(1) ) if __vrlsHWnd = '' then signal __vrlsDone if __vrlsWait \= 1 then signal __vrlsDone call VRSet __vrlsHWnd, 'WindowMode', 'Modal' __vrlsTmp = __vrlsWindows.0 if( DataType(__vrlsTmp) \= 'NUM' ) then do __vrlsTmp = 1 end else do __vrlsTmp = __vrlsTmp + 1 end __vrlsWindows.__vrlsTmp = VRWindow( __vrlsHWnd ) __vrlsWindows.0 = __vrlsTmp do while( VRIsValidObject( VRWindow() ) = 1 ) __vrlsEvent = VREvent() interpret __vrlsEvent end __vrlsTmp = __vrlsWindows.0 __vrlsWindows.0 = __vrlsTmp - 1 call VRWindow __vrlsWindows.__vrlsTmp __vrlsHWnd = '' __vrlsDone: return __vrlsHWnd /*:VRX __StringTokenize */ __StringTokenize: PROCEDURE EXPOSE (__stem) PARSE ARG string, separator, tokens IF ( string = '') THEN RETURN string IF ( separator = '') THEN separator = ' ' i = 0 CALL VALUE tokens || '0', i string = STRIP( string, 'B', separator ) DO WHILE LENGTH( string ) > 0 x = 1 y = POS( separator, string, x ) IF y > 0 THEN DO current = SUBSTR( string, 1, y-1 ) x = y + 1 i = i + 1 CALL VALUE tokens || 'i', current END ELSE DO current = STRIP( string, 'B', separator ) i = i + 1 CALL VALUE tokens || 'i', current x = LENGTH( string ) + 1 END string = SUBSTR( string, x ) END CALL VALUE tokens || '0', i RETURN /*:VRX AdjustPos */ /* Determines whether or not the byte at the given position is part of a * double-byte character, and (if so) where that character's actual starting * position is. */ AdjustPos: PROCEDURE EXPOSE cwidth PARSE ARG flags, offset, shift cwidth = 0 start = 0 IF flags == '' THEN RETURN 1 IF offset < 1 THEN RETURN 1 SELECT WHEN SUBSTR( flags, offset, 1 ) == 1 THEN DO cwidth = 2 start = offset END WHEN SUBSTR( flags, offset, 1 ) == 2 THEN DO cwidth = 2 /* Shift = 0, move to start of previous char. * Shift = 1, move to start of next char. */ IF shift = 0 THEN start = offset - 1 ELSE start = offset + 1 END OTHERWISE DO cwidth = 1 start = offset END END RETURN start /*:VRX CharAttr */ /* Build a sequence of attribute flags for each byte in the text: * 0 = single-byte character * 1 = first byte of a double-byte character * 2 = second byte of a double-byte character */ CharAttr: PROCEDURE PARSE ARG text, offset flags = '' dbcs = 0 DO i = 1 TO LENGTH( text ) nextbyte = C2D( SUBSTR( text, i, 1 )) IF ( \dbcs ) THEN DO IF ( nextbyte > 128 & nextbyte < 160 ) | ( nextbyte > 223 & nextbyte < 253 ) THEN DO flags = flags || '1' dbcs = 1 END ELSE DO flags = flags || '0' END END ELSE DO flags = flags || '2' dbcs = 0 END END RETURN flags /*:VRX ClipCopyAction */ ClipCopyAction: state = 0 kana = '' CALL GetEditorInfo /* Adjust text selection to match character boundaries. */ markleft = AdjustPos( flags, markleft, 0 ) markright = AdjustPos( flags, markright, 1 ) IF marklength > 0 THEN marklength = markright - markleft IF marklength > 0 THEN DO /* Copy selected text. */ cliptext = SUBSTR( contents, markleft, marklength ) CALL DoCopy cliptext END ELSE DO /* Nothing selected, just empty the clipboard */ CALL VRMethod 'Application', 'PutClipboard', '' END RETURN /*:VRX ClipCutAction */ ClipCutAction: state = 0 kana = '' CALL GetEditorInfo /* Adjust text selection to match character boundaries. */ markleft = AdjustPos( flags, markleft, 0 ) markright = AdjustPos( flags, markright, 1 ) IF marklength > 0 THEN marklength = markright - markleft IF marklength > 0 THEN DO /* Save the undo buffer */ settings.!undobuf = contents settings.!undoipt = TranslateIPT( cursor ) /* Cut selected text */ cliptext = SUBSTR( contents, markleft, marklength ) contents = DELSTR( contents, markleft, marklength ) cursornew = markleft CALL VRSet 'MLE_INPUT', 'Value', contents ipt = TranslateIPT( cursornew ) CALL VRMethod 'MLE_INPUT', 'SetSel', ipt, ipt CALL DoCopy cliptext END ELSE DO /* Nothing selected, just empty the clipboard */ CALL VRMethod 'Application', 'PutClipboard', '' END RETURN /*:VRX ClipPasteAction */ ClipPasteAction: state = 0 kana = '' CALL GetEditorInfo /* Save the undo buffer */ settings.!undobuf = contents settings.!undoipt = TranslateIPT( cursor ) /* If there's text currently selected, delete it (adjusted to the character * boundaries). */ markleft = AdjustPos( flags, markleft, 0 ) markright = AdjustPos( flags, markright, 1 ) IF marklength > 0 THEN marklength = markright - markleft IF marklength > 0 THEN DO contents = DELSTR( contents, markleft, marklength ) CALL VRSet 'MLE_INPUT', 'Value', contents cursornew = markleft ipt = TranslateIPT( cursornew ) CALL VRMethod 'MLE_INPUT', 'SetSel', ipt, ipt END /* Now paste the clipboard text */ CALL DoPaste RETURN /*:VRX CodepageIsInstalled */ CodepageIsInstalled: PROCEDURE ARG codepage ulspath = VALUE('ULSPATH',,'OS2ENVIRONMENT') IF ulspath == '' THEN ulspath = SysBootDrive() || '\LANGUAGE' IF VRFileExists( ulspath'\CODEPAGE\IBM'codepage ) THEN RETURN 1 RETURN 0 /*:VRX ConvertFullwidth */ ConvertFullwidth: PARSE ARG letter SELECT WHEN letter == 'A' THEN out = '‚`' WHEN letter == 'B' THEN out = '‚a' WHEN letter == 'C' THEN out = '‚b' WHEN letter == 'D' THEN out = '‚c' WHEN letter == 'E' THEN out = '‚d' WHEN letter == 'F' THEN out = '‚e' WHEN letter == 'G' THEN out = '‚f' WHEN letter == 'H' THEN out = '‚g' WHEN letter == 'I' THEN out = '‚h' WHEN letter == 'J' THEN out = '‚i' WHEN letter == 'K' THEN out = '‚j' WHEN letter == 'L' THEN out = '‚k' WHEN letter == 'M' THEN out = '‚l' WHEN letter == 'N' THEN out = '‚m' WHEN letter == 'O' THEN out = '‚n' WHEN letter == 'P' THEN out = '‚o' WHEN letter == 'Q' THEN out = '‚p' WHEN letter == 'R' THEN out = '‚q' WHEN letter == 'S' THEN out = '‚r' WHEN letter == 'T' THEN out = '‚s' WHEN letter == 'U' THEN out = '‚t' WHEN letter == 'V' THEN out = '‚u' WHEN letter == 'W' THEN out = '‚v' WHEN letter == 'X' THEN out = '‚w' WHEN letter == 'Y' THEN out = '‚x' WHEN letter == 'Z' THEN out = '‚y' WHEN letter == 'a' THEN out = '‚' WHEN letter == 'b' THEN out = '‚‚' WHEN letter == 'c' THEN out = '‚ƒ' WHEN letter == 'd' THEN out = '‚„' WHEN letter == 'e' THEN out = '‚…' WHEN letter == 'f' THEN out = '‚†' WHEN letter == 'g' THEN out = '‚‡' WHEN letter == 'h' THEN out = '‚ˆ' WHEN letter == 'i' THEN out = '‚‰' WHEN letter == 'j' THEN out = '‚Š' WHEN letter == 'k' THEN out = '‚‹' WHEN letter == 'l' THEN out = '‚Œ' WHEN letter == 'm' THEN out = '‚' WHEN letter == 'n' THEN out = '‚Ž' WHEN letter == 'o' THEN out = '‚' WHEN letter == 'p' THEN out = '‚' WHEN letter == 'q' THEN out = '‚‘' WHEN letter == 'r' THEN out = '‚’' WHEN letter == 's' THEN out = '‚“' WHEN letter == 't' THEN out = '‚”' WHEN letter == 'u' THEN out = '‚•' WHEN letter == 'v' THEN out = '‚–' WHEN letter == 'w' THEN out = '‚—' WHEN letter == 'x' THEN out = '‚˜' WHEN letter == 'y' THEN out = '‚™' WHEN letter == 'z' THEN out = '‚š' WHEN letter == '0' THEN out = '‚O' WHEN letter == '1' THEN out = '‚P' WHEN letter == '2' THEN out = '‚Q' WHEN letter == '3' THEN out = '‚R' WHEN letter == '4' THEN out = '‚S' WHEN letter == '5' THEN out = '‚T' WHEN letter == '6' THEN out = '‚U' WHEN letter == '7' THEN out = '‚V' WHEN letter == '8' THEN out = '‚W' WHEN letter == '9' THEN out = '‚X' WHEN letter == '.' THEN out = 'D' WHEN letter == ',' THEN out = 'C' WHEN letter == '!' THEN out = 'I' WHEN letter == '@' THEN out = '—' WHEN letter == '#' THEN out = '”' WHEN letter == '$' THEN out = '' WHEN letter == '%' THEN out = '“' WHEN letter == '^' THEN out = 'O' WHEN letter == '`' THEN out = 'e' WHEN letter == '&' THEN out = '•' WHEN letter == '*' THEN out = '–' WHEN letter == '(' THEN out = 'i' WHEN letter == ')' THEN out = 'j' WHEN letter == '-' THEN out = ']' WHEN letter == '~' THEN out = 'P' WHEN letter == '+' THEN out = '{' WHEN letter == '_' THEN out = 'Q' WHEN letter == '=' THEN out = '' WHEN letter == '[' THEN out = 'm' WHEN letter == ']' THEN out = 'n' WHEN letter == '{' THEN out = 'o' WHEN letter == '}' THEN out = 'p' WHEN letter == '\' THEN out = '_' WHEN letter == '/' THEN out = '^' WHEN letter == ':' THEN out = 'F' WHEN letter == ';' THEN out = 'G' WHEN letter == '<' THEN out = 'q' WHEN letter == '>' THEN out = 'r' WHEN letter == '?' THEN out = 'H' WHEN letter == "'" THEN out = 'f' WHEN letter == '"' THEN out = '?' WHEN letter == ' ' THEN out = '@' WHEN letter == '' THEN out = '' OTHERWISE out = letter END RETURN out /*:VRX ConvertKana */ ConvertKana: PARSE ARG wapuro IF VRGet('MI_KANA', 'Checked') THEN DO /* Default (fullwidth) kana conversion mode. */ /* If the first letter is uppercase, treat the whole syllable as uppercase. */ IF VERIFY( LEFT( wapuro, 1 ), 'ABCDEFGHIJKLMNOPQRSTUVWXYZ') == 0 THEN wapuro = TRANSLATE( wapuro ) SELECT /* ideographic punctuation characters */ WHEN wapuro == ' ' THEN out = '@' WHEN wapuro == ',' THEN out = 'A' WHEN wapuro == '.' THEN out = 'B' WHEN wapuro == '-' | wapuro == '_' THEN out = '[' WHEN wapuro == '|' THEN out = 'E' WHEN wapuro == "'" THEN out = 'u' WHEN wapuro == '"' THEN out = 'v' /* hiragana */ WHEN wapuro == 'a' THEN DO IF smallkana == 1 THEN out = '‚Ÿ' ELSE out = '‚ ' END WHEN wapuro == 'i' THEN DO IF smallkana == 1 THEN out = '‚”' ELSE out = '‚¢' END WHEN wapuro == 'u' THEN DO IF smallkana == 1 THEN out = '‚£' ELSE out = '‚¤' END WHEN wapuro == 'e' THEN DO IF smallkana == 1 THEN out = '‚„' ELSE out = '‚¦' END WHEN wapuro == 'o' THEN DO IF smallkana == 1 THEN out = '‚§' ELSE out = '‚Ø' END WHEN wapuro == 'ka' THEN out = '‚©' WHEN wapuro == 'ki' THEN out = '‚«' WHEN wapuro == 'ku' THEN out = '‚­' WHEN wapuro == 'ke' THEN out = '‚Æ' WHEN wapuro == 'ko' THEN out = '‚±' WHEN wapuro == 'ga' THEN out = '‚Ŗ' WHEN wapuro == 'gi' THEN out = '‚¬' WHEN wapuro == 'gu' THEN out = '‚®' WHEN wapuro == 'ge' THEN out = '‚°' WHEN wapuro == 'go' THEN out = '‚²' WHEN wapuro == 'sa' THEN out = '‚³' WHEN wapuro == 'shi' | wapuro == 'si' THEN out = '‚µ' WHEN wapuro == 'su' THEN out = '‚·' WHEN wapuro == 'se' THEN out = '‚¹' WHEN wapuro == 'so' THEN out = '‚»' WHEN wapuro == 'za' THEN out = '‚“' WHEN wapuro == 'ji' | wapuro == 'zi' THEN out = '‚¶' WHEN wapuro == 'zu' THEN out = '‚ø' WHEN wapuro == 'ze' THEN out = '‚ŗ' WHEN wapuro == 'zo' THEN out = '‚¼' WHEN wapuro == 'ta' THEN out = '‚½' WHEN wapuro == 'chi' | wapuro == 'ti' THEN out = '‚æ' WHEN wapuro == 'tsu' | wapuro == 'tu' THEN DO IF smallkana == 1 THEN out = '‚Į' ELSE out = '‚Ā' END WHEN wapuro == 'te' THEN out = '‚Ä' WHEN wapuro == 'to' THEN out = '‚Ę' WHEN wapuro == 'da' THEN out = '‚¾' WHEN wapuro == 'di' | wapuro == 'dzi' THEN out = '‚Ą' WHEN wapuro == 'du' | wapuro == 'dzu' THEN out = '‚Ć' WHEN wapuro == 'de' THEN out = '‚Å' WHEN wapuro == 'do' THEN out = '‚Ē' WHEN wapuro == 'na' THEN out = '‚Č' WHEN wapuro == 'ni' THEN out = '‚É' WHEN wapuro == 'nu' THEN out = '‚Ź' WHEN wapuro == 'ne' THEN out = '‚Ė' WHEN wapuro == 'no' THEN out = '‚Ģ' WHEN wapuro == 'ha' THEN out = '‚Ķ' WHEN wapuro == 'hi' THEN out = '‚Š' WHEN wapuro == 'fu' THEN out = '‚Ó' WHEN wapuro == 'he' THEN out = '‚Ö' WHEN wapuro == 'ho' THEN out = '‚Ł' WHEN wapuro == 'ba' THEN out = '‚Ī' WHEN wapuro == 'bi' THEN out = '‚Ń' WHEN wapuro == 'bu' THEN out = '‚Ō' WHEN wapuro == 'be' THEN out = '‚×' WHEN wapuro == 'bo' THEN out = '‚Ś' WHEN wapuro == 'pa' THEN out = '‚Ļ' WHEN wapuro == 'pi' THEN out = '‚Ņ' WHEN wapuro == 'pu' THEN out = '‚Õ' WHEN wapuro == 'pe' THEN out = '‚Ų' WHEN wapuro == 'po' THEN out = '‚Ū' WHEN wapuro == 'ma' THEN out = '‚Ü' WHEN wapuro == 'mi' THEN out = '‚Ż' WHEN wapuro == 'mu' THEN out = '‚Ž' WHEN wapuro == 'me' THEN out = '‚ß' WHEN wapuro == 'mo' THEN out = '‚ą' WHEN wapuro == 'ya' THEN DO IF smallkana == 1 THEN out = '‚į' ELSE out = '‚ā' END WHEN wapuro == 'yu' THEN DO IF smallkana == 1 THEN out = '‚ć' ELSE out = '‚ä' END WHEN wapuro == 'yo' THEN DO IF smallkana == 1 THEN out = '‚å' ELSE out = '‚ę' END WHEN wapuro == 'ra' | wapuro == 'la' THEN out = '‚ē' WHEN wapuro == 'ri' | wapuro == 'li' THEN out = '‚č' WHEN wapuro == 'ru' | wapuro == 'lu' THEN out = '‚é' WHEN wapuro == 're' | wapuro == 'le' THEN out = '‚ź' WHEN wapuro == 'ro' | wapuro == 'lo' THEN out = '‚ė' WHEN wapuro == 'wa' THEN DO IF smallkana == 1 THEN out = '‚ģ' ELSE out = '‚ķ' END WHEN wapuro == 'wo' THEN out = '‚š' WHEN wapuro == 'n' | wapuro == 'm' THEN out = '‚ń' WHEN wapuro == 'kya' THEN out = '‚«‚į' WHEN wapuro == 'kyu' THEN out = '‚«‚ć' WHEN wapuro == 'kyo' THEN out = '‚«‚å' WHEN wapuro == 'gya' THEN out = '‚¬‚į' WHEN wapuro == 'gyu' THEN out = '‚«‚ć' WHEN wapuro == 'gyo' THEN out = '‚¬‚å' WHEN wapuro == 'sha' | wapuro == 'sya' THEN out = '‚µ‚į' WHEN wapuro == 'shu' | wapuro == 'syu' THEN out = '‚µ‚ć' WHEN wapuro == 'sho' | wapuro == 'syo' THEN out = '‚µ‚å' WHEN wapuro == 'ja' | wapuro == 'zya' THEN out = '‚¶‚į' WHEN wapuro == 'ju' | wapuro == 'zyu' THEN out = '‚¶‚ć' WHEN wapuro == 'jo' | wapuro == 'zyo' THEN out = '‚¶‚å' WHEN wapuro == 'cha' THEN out = '‚æ‚į' WHEN wapuro == 'chu' THEN out = '‚æ‚ć' WHEN wapuro == 'cho' THEN out = '‚æ‚å' WHEN wapuro == 'nya' THEN out = '‚É‚į' WHEN wapuro == 'nyu' THEN out = '‚É‚ć' WHEN wapuro == 'nyo' THEN out = '‚É‚å' WHEN wapuro == 'hya' THEN out = '‚Š‚į' WHEN wapuro == 'hyu' THEN out = '‚Š‚ć' WHEN wapuro == 'hyo' THEN out = '‚Š‚å' WHEN wapuro == 'bya' THEN out = '‚Ń‚į' WHEN wapuro == 'byu' THEN out = '‚Ń‚ć' WHEN wapuro == 'byo' THEN out = '‚Ń‚å' WHEN wapuro == 'pya' THEN out = '‚Ņ‚į' WHEN wapuro == 'pyu' THEN out = '‚Ņ‚ć' WHEN wapuro == 'pyo' THEN out = '‚Ņ‚å' WHEN wapuro == 'mya' THEN out = '‚Ż‚į' WHEN wapuro == 'myu' THEN out = '‚Ż‚ć' WHEN wapuro == 'myo' THEN out = '‚Ż‚å' WHEN wapuro == 'rya' THEN out = '‚č‚į' WHEN wapuro == 'ryu' THEN out = '‚č‚ć' WHEN wapuro == 'ryo' THEN out = '‚č‚å' /* katakana */ WHEN wapuro == 'A' THEN DO IF smallkana == 1 THEN out = 'ƒ@' ELSE out = 'ƒA' END WHEN wapuro == 'I' THEN DO IF smallkana == 1 THEN out = 'ƒB' ELSE out = 'ƒC' END WHEN wapuro == 'U' THEN DO IF smallkana == 1 THEN out = 'ƒD' ELSE out = 'ƒE' END WHEN wapuro == 'E' THEN DO IF smallkana == 1 THEN out = 'ƒF' ELSE out = 'ƒG' END WHEN wapuro == 'O' THEN DO IF smallkana == 1 THEN out = 'ƒH' ELSE out = 'ƒI' END WHEN wapuro == 'KA' THEN DO IF smallkana == 1 THEN out = 'ƒ•' ELSE out = 'ƒJ' END WHEN wapuro == 'KI' THEN out = 'ƒL' WHEN wapuro == 'KU' THEN out = 'ƒN' WHEN wapuro == 'KE' THEN DO IF smallkana == 1 THEN out = 'ƒ–' ELSE out = 'ƒP' END WHEN wapuro == 'KO' THEN out = 'ƒR' WHEN wapuro == 'GA' THEN out = 'ƒK' WHEN wapuro == 'GI' THEN out = 'ƒM' WHEN wapuro == 'GU' THEN out = 'ƒO' WHEN wapuro == 'GE' THEN out = 'ƒQ' WHEN wapuro == 'GO' THEN out = 'ƒS' WHEN wapuro == 'SA' THEN out = 'ƒT' WHEN wapuro == 'SHI' | wapuro == 'SI' THEN out = 'ƒV' WHEN wapuro == 'SU' THEN out = 'ƒX' WHEN wapuro == 'SE' THEN out = 'ƒZ' WHEN wapuro == 'SO' THEN out = 'ƒ\' WHEN wapuro == 'ZA' THEN out = 'ƒU' WHEN wapuro == 'JI' | wapuro == 'ZI' THEN out = 'ƒW' WHEN wapuro == 'ZU' THEN out = 'ƒY' WHEN wapuro == 'ZE' THEN out = 'ƒ[' WHEN wapuro == 'ZO' THEN out = 'ƒ]' WHEN wapuro == 'TA' THEN out = 'ƒ^' WHEN wapuro == 'CHI' THEN out = 'ƒ`' WHEN wapuro == 'TSU' THEN DO IF smallkana == 1 THEN out = 'ƒb' ELSE out = 'ƒc' END WHEN wapuro == 'TE' THEN out = 'ƒe' WHEN wapuro == 'TO' THEN out = 'ƒg' WHEN wapuro == 'DA' THEN out = 'ƒ_' WHEN wapuro == 'DZI' THEN out = 'ƒa' WHEN wapuro == 'DZU' THEN out = 'ƒd' WHEN wapuro == 'DE' THEN out = 'ƒf' WHEN wapuro == 'DO' THEN out = 'ƒh' WHEN wapuro == 'NA' THEN out = 'ƒi' WHEN wapuro == 'NI' THEN out = 'ƒj' WHEN wapuro == 'NU' THEN out = 'ƒk' WHEN wapuro == 'NE' THEN out = 'ƒl' WHEN wapuro == 'NO' THEN out = 'ƒm' WHEN wapuro == 'HA' THEN out = 'ƒn' WHEN wapuro == 'HI' THEN out = 'ƒq' WHEN wapuro == 'FU' | wapuro == 'HU' THEN out = 'ƒt' WHEN wapuro == 'HE' THEN out = 'ƒw' WHEN wapuro == 'HO' THEN out = 'ƒz' WHEN wapuro == 'BA' THEN out = 'ƒo' WHEN wapuro == 'BI' THEN out = 'ƒr' WHEN wapuro == 'BU' THEN out = 'ƒu' WHEN wapuro == 'BE' THEN out = 'ƒx' WHEN wapuro == 'BO' THEN out = 'ƒ{' WHEN wapuro == 'PA' THEN out = 'ƒp' WHEN wapuro == 'PI' THEN out = 'ƒs' WHEN wapuro == 'PU' THEN out = 'ƒv' WHEN wapuro == 'PE' THEN out = 'ƒy' WHEN wapuro == 'PO' THEN out = 'ƒ|' WHEN wapuro == 'MA' THEN out = 'ƒ}' WHEN wapuro == 'MI' THEN out = 'ƒ~' WHEN wapuro == 'MU' THEN out = 'ƒ€' WHEN wapuro == 'ME' THEN out = 'ƒ' WHEN wapuro == 'MO' THEN out = 'ƒ‚' WHEN wapuro == 'YA' THEN DO IF smallkana == 1 THEN out = 'ƒƒ' ELSE out = 'ƒ„' END WHEN wapuro == 'YU' THEN DO IF smallkana == 1 THEN out = 'ƒ…' ELSE out = 'ƒ†' END WHEN wapuro == 'YO' THEN DO IF smallkana == 1 THEN out = 'ƒ‡' ELSE out = 'ƒˆ' END WHEN wapuro == 'RA' | wapuro == 'LA' THEN out = 'ƒ‰' WHEN wapuro == 'RI' | wapuro == 'LI' THEN out = 'ƒŠ' WHEN wapuro == 'RU' | wapuro == 'LU' THEN out = 'ƒ‹' WHEN wapuro == 'RE' | wapuro == 'LE' THEN out = 'ƒŒ' WHEN wapuro == 'RO' | wapuro == 'LO' THEN out = 'ƒ' WHEN wapuro == 'WA' THEN DO IF smallkana == 1 THEN out = 'ƒŽ' ELSE out = 'ƒ' END WHEN wapuro == 'WO' THEN out = 'ƒ’' WHEN wapuro == 'N' | wapuro == 'M' THEN out = 'ƒ“' WHEN wapuro == 'KYA' THEN out = 'ƒLƒƒ' WHEN wapuro == 'KYU' THEN out = 'ƒLƒ…' WHEN wapuro == 'KYO' THEN out = 'ƒLƒ‡' WHEN wapuro == 'GYA' THEN out = 'ƒMƒƒ' WHEN wapuro == 'GYU' THEN out = 'ƒMƒ…' WHEN wapuro == 'GYO' THEN out = 'ƒMƒ‡' WHEN wapuro == 'SHA' | wapuro == 'SYA' THEN out = 'ƒVƒƒ' WHEN wapuro == 'SHU' | wapuro == 'SYU' THEN out = 'ƒVƒ…' WHEN wapuro == 'SHO' | wapuro == 'SYO' THEN out = 'ƒVƒ‡' WHEN wapuro == 'JA' | wapuro == 'ZYA' THEN out = 'ƒWƒƒ' WHEN wapuro == 'JU' | wapuro == 'ZYU' THEN out = 'ƒWƒ…' WHEN wapuro == 'JO' | wapuro == 'ZYO' THEN out = 'ƒWƒ‡' WHEN wapuro == 'CHA' THEN out = 'ƒ`ƒƒ' WHEN wapuro == 'CHU' THEN out = 'ƒ`ƒ…' WHEN wapuro == 'CHO' THEN out = 'ƒ`ƒ‡' WHEN wapuro == 'NYA' THEN out = 'ƒjƒƒ' WHEN wapuro == 'NYU' THEN out = 'ƒjƒ…' WHEN wapuro == 'NYO' THEN out = 'ƒjƒ‡' WHEN wapuro == 'HYA' THEN out = 'ƒqƒƒ' WHEN wapuro == 'HYU' THEN out = 'ƒqƒ…' WHEN wapuro == 'HYO' THEN out = 'ƒqƒ‡' WHEN wapuro == 'BYA' THEN out = 'ƒrƒƒ' WHEN wapuro == 'BYU' THEN out = 'ƒrƒ…' WHEN wapuro == 'BYO' THEN out = 'ƒrƒ‡' WHEN wapuro == 'PYA' THEN out = 'ƒsƒƒ' WHEN wapuro == 'PYU' THEN out = 'ƒsƒ…' WHEN wapuro == 'PYO' THEN out = 'ƒsƒ‡' WHEN wapuro == 'MYA' THEN out = 'ƒ~ƒƒ' WHEN wapuro == 'MYU' THEN out = 'ƒ~ƒ…' WHEN wapuro == 'MYO' THEN out = 'ƒ~ƒ‡' WHEN wapuro == 'RYA' THEN out = 'ƒŠƒƒ' WHEN wapuro == 'RYU' THEN out = 'ƒŠƒ…' WHEN wapuro == 'RYO' THEN out = 'ƒŠƒ‡' /* special katakana forms */ WHEN wapuro == 'KWA' THEN out = 'ƒNƒ@' /* WHEN wapuro == 'KWO' THEN out = 'ƒNƒH' */ WHEN wapuro == 'GWA' THEN out = 'ƒOƒ@' WHEN wapuro == 'SHE' THEN out = 'ƒVƒF' WHEN wapuro == 'JE' THEN out = 'ƒWƒF' WHEN wapuro == 'CHE' THEN out = 'ƒ`ƒF' WHEN wapuro == 'TSA' THEN out = 'ƒcƒ@' WHEN wapuro == 'TSE' THEN out = 'ƒcƒF' WHEN wapuro == 'TSO' THEN out = 'ƒcƒH' WHEN wapuro == 'TI' THEN out = 'ƒeƒB' WHEN wapuro == 'TU' THEN DO IF smallkana == 1 THEN out = 'ƒb' ELSE out = 'ƒgƒD' END WHEN wapuro == 'DI' THEN out = 'ƒfƒB' WHEN wapuro == 'DU' THEN out = 'ƒhƒD' WHEN wapuro == 'DYU' THEN out = 'ƒfƒ…' WHEN wapuro == 'FA' THEN out = 'ƒtƒ@' WHEN wapuro == 'FI' THEN out = 'ƒtƒB' WHEN wapuro == 'FE' THEN out = 'ƒtƒF' WHEN wapuro == 'FO' THEN out = 'ƒtƒH' WHEN wapuro == 'WI' THEN out = 'ƒEƒB' WHEN wapuro == 'WE' THEN out = 'ƒEƒF' WHEN wapuro == 'WO' THEN out = 'ƒEƒH' WHEN wapuro == 'YE' THEN out = 'ƒCƒF' WHEN wapuro == 'VA' THEN out = 'ƒ”ƒ@' WHEN wapuro == 'VI' THEN out = 'ƒ”ƒB' WHEN wapuro == 'VU' THEN out = 'ƒ”' WHEN wapuro == 'VE' THEN out = 'ƒ”ƒF' WHEN wapuro == 'VO' THEN out = 'ƒ”ƒH' WHEN wapuro == '' THEN out = '' OTHERWISE out = ConvertFullwidth( wapuro ) END END ELSE IF VRGet('MI_HALFWIDTH', 'Checked') THEN DO /* In halfwidth mode, all kana will be converted to halfwidth katakana. */ wapuro = TRANSLATE( wapuro ) SELECT /* Halfwidth punctuation */ WHEN wapuro == ',' THEN out = '¤' WHEN wapuro == '.' THEN out = '”' WHEN wapuro == '-' | wapuro == '_' THEN out = '°' WHEN wapuro == '|' THEN out = '„' WHEN wapuro == "'" THEN out = '¢' WHEN wapuro == '"' THEN out = '£' /* Halfwidth katakana */ WHEN wapuro == 'A' THEN DO IF smallkana == 1 THEN out = '§' ELSE out = '±' END WHEN wapuro == 'I' THEN DO IF smallkana == 1 THEN out = 'Ø' ELSE out = '²' END WHEN wapuro == 'U' THEN DO IF smallkana == 1 THEN out = '©' ELSE out = '³' END WHEN wapuro == 'E' THEN DO IF smallkana == 1 THEN out = 'Ŗ' ELSE out = '“' END WHEN wapuro == 'O' THEN DO IF smallkana == 1 THEN out = '«' ELSE out = 'µ' END WHEN wapuro == 'KA' THEN out = '¶' WHEN wapuro == 'KI' THEN out = '·' WHEN wapuro == 'KU' THEN out = 'ø' WHEN wapuro == 'KE' THEN out = '¹' WHEN wapuro == 'KO' THEN out = 'ŗ' WHEN wapuro == 'GA' THEN out = '¶Ž' WHEN wapuro == 'GI' THEN out = '·Ž' WHEN wapuro == 'GU' THEN out = 'øŽ' WHEN wapuro == 'GE' THEN out = '¹Ž' WHEN wapuro == 'GO' THEN out = 'ŗŽ' WHEN wapuro == 'SA' THEN out = '»' WHEN wapuro == 'SHI' | wapuro == 'SI' THEN out = '¼' WHEN wapuro == 'SU' THEN out = '½' WHEN wapuro == 'SE' THEN out = '¾' WHEN wapuro == 'SO' THEN out = 'æ' WHEN wapuro == 'ZA' THEN out = '»Ž' WHEN wapuro == 'JI' | wapuro == 'ZI' THEN out = '¼Ž' WHEN wapuro == 'ZU' THEN out = '½Ž' WHEN wapuro == 'ZE' THEN out = '¾Ž' WHEN wapuro == 'ZO' THEN out = 'æŽ' WHEN wapuro == 'TA' THEN out = 'Ą' WHEN wapuro == 'CHI' THEN out = 'Į' WHEN wapuro == 'TSU' THEN DO IF smallkana == 1 THEN out = 'Æ' ELSE out = 'Ā' END WHEN wapuro == 'TE' THEN out = 'Ć' WHEN wapuro == 'TO' THEN out = 'Ä' WHEN wapuro == 'DA' THEN out = 'ĄŽ' WHEN wapuro == 'DZI' THEN out = 'ĮŽ' WHEN wapuro == 'DZU' THEN out = 'ĀŽ' WHEN wapuro == 'DE' THEN out = 'ĆŽ' WHEN wapuro == 'DO' THEN out = 'ÄŽ' WHEN wapuro == 'NA' THEN out = 'Å' WHEN wapuro == 'NI' THEN out = 'Ę' WHEN wapuro == 'NU' THEN out = 'Ē' WHEN wapuro == 'NE' THEN out = 'Č' WHEN wapuro == 'NO' THEN out = 'É' WHEN wapuro == 'HA' THEN out = 'Ź' WHEN wapuro == 'HI' THEN out = 'Ė' WHEN wapuro == 'FU' | wapuro == 'HU' THEN out = 'Ģ' WHEN wapuro == 'HE' THEN out = 'Ķ' WHEN wapuro == 'HO' THEN out = 'Ī' WHEN wapuro == 'BA' THEN out = 'ŹŽ' WHEN wapuro == 'BI' THEN out = 'ĖŽ' WHEN wapuro == 'BU' THEN out = 'ĢŽ' WHEN wapuro == 'BE' THEN out = 'ĶŽ' WHEN wapuro == 'BO' THEN out = 'ĪŽ' WHEN wapuro == 'PA' THEN out = 'Źß' WHEN wapuro == 'PI' THEN out = 'Ėß' WHEN wapuro == 'PU' THEN out = 'Ģß' WHEN wapuro == 'PE' THEN out = 'Ķß' WHEN wapuro == 'PO' THEN out = 'Īß' WHEN wapuro == 'MA' THEN out = 'Ļ' WHEN wapuro == 'MI' THEN out = 'Š' WHEN wapuro == 'MU' THEN out = 'Ń' WHEN wapuro == 'ME' THEN out = 'Ņ' WHEN wapuro == 'MO' THEN out = 'Ó' WHEN wapuro == 'YA' THEN DO IF smallkana == 1 THEN out = '¬' ELSE out = 'Ō' END WHEN wapuro == 'YU' THEN DO IF smallkana == 1 THEN out = '­' ELSE out = 'Õ' END WHEN wapuro == 'YO' THEN DO IF smallkana == 1 THEN out = '®' ELSE out = 'Ö' END WHEN wapuro == 'RA' | wapuro == 'LA' THEN out = '×' WHEN wapuro == 'RI' | wapuro == 'LI' THEN out = 'Ų' WHEN wapuro == 'RU' | wapuro == 'LU' THEN out = 'Ł' WHEN wapuro == 'RE' | wapuro == 'LE' THEN out = 'Ś' WHEN wapuro == 'RO' | wapuro == 'LO' THEN out = 'Ū' WHEN wapuro == 'WA' THEN out = 'Ü' WHEN wapuro == 'WO' THEN out = '¦' WHEN wapuro == 'N' | wapuro == 'M' THEN out = 'Ż' WHEN wapuro == 'KYA' THEN out = '·¬' WHEN wapuro == 'KYU' THEN out = '·­' WHEN wapuro == 'KYO' THEN out = '·®' WHEN wapuro == 'GYA' THEN out = '·Ž¬' WHEN wapuro == 'GYU' THEN out = '·Ž­' WHEN wapuro == 'GYO' THEN out = '·Ž®' WHEN wapuro == 'SHA' | wapuro == 'SYA' THEN out = '¼¬' WHEN wapuro == 'SHU' | wapuro == 'SYU' THEN out = '¼­' WHEN wapuro == 'SHO' | wapuro == 'SYO' THEN out = '¼®' WHEN wapuro == 'JA' | wapuro == 'ZYA' THEN out = '¼Ž¬' WHEN wapuro == 'JU' | wapuro == 'ZYU' THEN out = '¼Ž­' WHEN wapuro == 'JO' | wapuro == 'ZYO' THEN out = '¼Ž®' WHEN wapuro == 'CHA' THEN out = 'Į¬' WHEN wapuro == 'CHU' THEN out = 'Į­' WHEN wapuro == 'CHO' THEN out = 'Į®' WHEN wapuro == 'NYA' THEN out = 'ʬ' WHEN wapuro == 'NYU' THEN out = 'Ę­' WHEN wapuro == 'NYO' THEN out = 'Ę®' WHEN wapuro == 'HYA' THEN out = 'ˬ' WHEN wapuro == 'HYU' THEN out = 'Ė­' WHEN wapuro == 'HYO' THEN out = 'Ė®' WHEN wapuro == 'BYA' THEN out = 'ĖŽ¬' WHEN wapuro == 'BYU' THEN out = 'ĖŽ­' WHEN wapuro == 'BYO' THEN out = 'ĖŽ®' WHEN wapuro == 'PYA' THEN out = 'Ė߬' WHEN wapuro == 'PYU' THEN out = 'Ėß­' WHEN wapuro == 'PYO' THEN out = 'Ėß®' WHEN wapuro == 'MYA' THEN out = 'Ь' WHEN wapuro == 'MYU' THEN out = 'Š­' WHEN wapuro == 'MYO' THEN out = 'Š®' WHEN wapuro == 'RYA' THEN out = 'Ų¬' WHEN wapuro == 'RYU' THEN out = 'Ų­' WHEN wapuro == 'RYO' THEN out = 'Ų®' WHEN wapuro == 'KWA' THEN out = 'ø§' /* WHEN wapuro == 'KWO' THEN out = 'ø«' */ WHEN wapuro == 'GWA' THEN out = 'øŽ§' WHEN wapuro == 'SHE' THEN out = '¼Ŗ' WHEN wapuro == 'JE' THEN out = '¼ŽŖ' WHEN wapuro == 'CHE' THEN out = 'ĮŖ' WHEN wapuro == 'TSA' THEN out = '§' WHEN wapuro == 'TSE' THEN out = 'ĀŖ' WHEN wapuro == 'TSO' THEN out = 'Ā«' WHEN wapuro == 'TI' THEN out = 'ĆØ' WHEN wapuro == 'TU' THEN DO IF smallkana == 1 THEN out = 'Æ' ELSE out = 'Ä©' END WHEN wapuro == 'DI' THEN out = 'ĆŽØ' WHEN wapuro == 'DU' THEN out = 'ÄŽ©' WHEN wapuro == 'DYU' THEN out = 'ĆŽ­' WHEN wapuro == 'FA' THEN out = '̧' WHEN wapuro == 'FI' THEN out = 'ĢØ' WHEN wapuro == 'FE' THEN out = 'ĢŖ' WHEN wapuro == 'FO' THEN out = 'Ģ«' WHEN wapuro == 'WI' THEN out = '³Ø' WHEN wapuro == 'WE' THEN out = '³Ŗ' WHEN wapuro == 'WO' THEN out = '³«' WHEN wapuro == 'YE' THEN out = '²Ŗ' WHEN wapuro == 'VA' THEN out = '³Ž§' WHEN wapuro == 'VI' THEN out = '³ŽØ' WHEN wapuro == 'VU' THEN out = '³Ž' WHEN wapuro == 'VE' THEN out = '³ŽŖ' WHEN wapuro == 'VO' THEN out = '³Ž«' OTHERWISE out = wapuro END END ELSE out = '' smallkana = 0 settings.!undobuf = VRGet('MLE_INPUT', 'Value') settings.!undoipt = VRMethod('MLE_INPUT', 'QuerySel', 'cursor') IF out <> '' THEN CALL VRMethod "MLE_INPUT", "Insert", out RETURN 1 /*:VRX ConvertKanji */ ConvertKanji: PROCEDURE EXPOSE settings. PARSE ARG target, lookup_mode target = STRIP( target ) IF target == '' THEN RETURN '' /* Remove partial characters */ len = LENGTH( target ) IF len == 1 THEN RETURN '' /* Single-byte character, do nothing */ ELSE IF len // 2 == 1 THEN target = LEFT( target, len-1 ) yomi = ULSConvertCodepage( target, 932, 954,, 'G', 'N') IF yomi == '' THEN DO RETURN '' END IF lookup_mode == 1 THEN DO IF \VRFileExists( settings.!kdict ) THEN RETURN '' CALL GetKanji yomi ini_app = 'KanjiHistory' END ELSE DO IF ( \ VRFileExists( settings.!edict )) & ( \ VRFileExists( settings.!adict )) THEN RETURN '' CALL GetWords yomi target ini_app = 'WordHistory' END kword = '' IF candidates.0 == 1 THEN DO kword = candidates.1 END ELSE IF candidates.0 > 1 THEN DO CALL VRLoadSecondary 'SW_KANJI', 'W' kword = selected_candidate END IF kword <> '' THEN DO CALL VRSetIni ini_app, yomi, kword, settings.!ini END RETURN kword /*:VRX DoCopy */ DoCopy: PROCEDURE EXPOSE rxuls PARSE ARG cliptext CALL VRMethod 'Application', 'PutClipboard', cliptext IF rxuls THEN DO CALL ULSPutUnicodeClipboard cliptext, 932 /* IF ULSERR \= '0' THEN SAY ULSERR CALL BEEP 262, 10 CALL BEEP 440, 10 */ END RETURN /*:VRX DoPaste */ DoPaste: PROCEDURE EXPOSE rxuls IF rxuls THEN DO cliptext = ULSGetUnicodeClipboard( 932,, 'L') /* IF ULSERR \= '0' THEN SAY ULSERR */ IF cliptext == '' THEN cliptext = VRMethod('Application', 'GetClipboard') /* ELSE DO CALL BEEP 440, 10 CALL BEEP 262, 10 END */ END ELSE cliptext = VRMethod('Application', 'GetClipboard') /* Remove hard tabs, since they seem to do Weird Things to the positioning * calculations. cliptext = TRANSLATE( cliptext, 'a5'x, '09'x ) */ CALL VRMethod 'MLE_INPUT', 'Insert', cliptext RETURN /*:VRX Fini */ Fini: window = VRWindow() call VRSet window, "Visible", 0 drop window return 0 /*:VRX GB_TOOLBAR_ContextMenu */ GB_TOOLBAR_ContextMenu: CALL VRMethod 'MN_INPUT', 'Popup' RETURN /*:VRX GetEditorInfo */ GetEditorInfo: /* Get the current contents, cursor position and selection attributes. * (1 represents the first character byte; the cursor position describes * the preceding character boundary. Note that SetSel and QuerySel * actually start from 0, so we have to adjust by one when using either.) */ contents = VRGet('MLE_INPUT', 'Value') cursor = VRMethod('MLE_INPUT', 'QuerySel', 'cursor') + 1 markleft = VRMethod('MLE_INPUT', 'QuerySel', 'minimum') + 1 markright = VRMethod('MLE_INPUT', 'QuerySel', 'maximum') + 1 marklength = markright - markleft /* The MLE adds extra newlines on line breaks, but doesn't include them in * the byte count. (This is what was throwing off the positioning logic.) ** No longer needed, we set MLFIE_NOTRANS via API now. editline = LineNumber( cursor, contents ); cursor = cursor + editline editline = LineNumber( markleft, contents ); markleft = markleft + editline editline = LineNumber( markright, contents ); markright = markright + editline */ /* Locate all the character boundaries (since this is variable-width text). */ flags = CharAttr( contents ) /* Now locate the "correct" cursor position (on a character boundary). * This also updates the 'cwidth' variable. */ cursor = AdjustPos( flags, cursor, 0 ) /**** FOR DEBUGGING say '[C:'cursor 'I:'TranslateIPT( cursor )'] ' do i = 1 to length( contents ) call charout, c2x( substr( contents, i, 1 ))' ' end say do i = 1 to length( contents ) if i == cursor then call charout, '^'substr( flags, i, 1 )' ' else call charout, ' 'substr( flags, i, 1 )' ' if i > 255 then leave end say ****/ RETURN /*:VRX GetKanji */ GetKanji: PROCEDURE EXPOSE settings. candidates. PARSE ARG yomi CALL VRSet 'WN_MAIN', 'Pointer', 'WAIT' candidates.0 = 0 c = 0 last_used = VRGetIni('KanjiHistory', yomi, settings.!ini ) IF last_used <> '' THEN DO c = c + 1 kcand.c = last_used 'F0000' END hira_yomi = ULSTransform( yomi, 'hiragana', 954, 'ja_JP') kata_yomi = ULSTransform( yomi, 'katakana', 954, 'ja_JP') ok = SysFileSearch( hira_yomi, settings.!kdict, 'matches.') DO i = 1 TO matches.0 kinfo = ParseKanjiEntry( hira_yomi, matches.i ) IF kinfo <> '' THEN DO c = c + 1 kcand.c = STRIP( ULSConvertCodepage( kinfo, 954, 932,, 'G', 'N')) END END ok = SysFileSearch( kata_yomi, settings.!kdict, 'matches.') DO i = 1 TO matches.0 kinfo = ParseKanjiEntry( kata_yomi, matches.i ) IF kinfo <> '' THEN DO c = c + 1 kcand.c = STRIP( ULSConvertCodepage( kinfo, 954, 932,, 'G', 'N')) END END kcand.0 = c IF c > 0 THEN DO /* Sort the results by kanji and remove any duplicates */ CALL SysStemSort 'kcand.', 'A' c = 0 DO i = 1 TO kcand.0 PARSE VAR kcand.i _kanji . IF i > 0 THEN DO h = i-1 PARSE VAR kcand.h _prevkanji . IF _prevkanji == _kanji THEN ITERATE END c = c + 1 candidates.c = kcand.i END candidates.0 = c /* Sort by frequency and then strip out the frequency numbers. */ CALL SysStemSort 'candidates.', 'A',,,, 4 DO i = 1 TO candidates.0 PARSE VAR candidates.i _kanji . candidates.i = _kanji END END CALL VRSet 'WN_MAIN', 'Pointer', '' RETURN /*:VRX GetScalingFactor */ /* Return the UI scaling factor based on the difference between the specified * font size and the design-default font size. */ GetScalingFactor: PROCEDURE EXPOSE settings. PARSE ARG newSize, orgSize IF orgSize == '' THEN orgSize = settings.!defaultSize IF newSize < settings.!defaultSize THEN newSize = settings.!defaultSize scaleFactor = newSize / orgSize RETURN scaleFactor /*:VRX GetWords */ GetWords: PROCEDURE EXPOSE settings. candidates. PARSE ARG yomi sjis CALL VRSet 'WN_MAIN', 'Pointer', 'WAIT' c = 0 last_used = VRGetIni('WordHistory', yomi, settings.!ini ) IF last_used <> '' THEN DO c = c + 1 candidates.c = last_used END IF settings.!edict <> '' THEN DO /* Generate both hiragana and katakana versions to search on */ hira_yomi = ULSTransform( yomi, 'hiragana', 954, 'ja_JP') kata_yomi = ULSTransform( yomi, 'katakana', 954, 'ja_JP') /* Search for hiragana in EDICT */ ok = SysFileSearch( hira_yomi, settings.!edict, 'matches.') DO i = 1 TO matches.0 PARSE VAR matches.i _kanji '['_reading']' . IF _reading == '' THEN DO _reading = WORD( _kanji, 1 ) _kanji = _reading END IF _reading == hira_yomi THEN DO c_reading = STRIP( ULSConvertCodepage( _kanji, 954, 932,, 'G', 'N')) IF last_used <> c_reading THEN DO c = c + 1 candidates.c = c_reading END END END /* Search for kagakana in EDICT */ ok = SysFileSearch( kata_yomi, settings.!edict, 'matches.') DO i = 1 TO matches.0 PARSE VAR matches.i _kanji '['_reading']' . IF _reading == '' THEN DO _reading = WORD( _kanji, 1 ) _kanji = _reading END IF _reading == kata_yomi THEN DO c_reading = STRIP( ULSConvertCodepage( _kanji, 954, 932,, 'G', 'N')) IF last_used <> c_reading THEN DO c = c + 1 candidates.c = c_reading END END END END IF settings.!adict <> '' THEN DO /* For auxiliary dictionary we use the Shift_JIS encoded string */ hira_sjis = ULSTransform( sjis, 'hiragana', 932, 'ja_JP') kata_sjis = ULSTransform( sjis, 'katakana', 932, 'ja_JP') /* Search for hiragana in auxiliary dictionary */ ok = SysFileSearch( hira_sjis, settings.!adict, 'matches.') DO i = 1 TO matches.0 PARSE VAR matches.i _kanji '['_reading']' . IF _reading == '' THEN DO _reading = WORD( _kanji, 1 ) _kanji = _reading END IF _reading == hira_sjis THEN DO c_reading = STRIP( _kanji) IF last_used <> c_reading THEN DO c = c + 1 candidates.c = c_reading END END END /* Search for katakana in auxiliary dictionary */ ok = SysFileSearch( kata_sjis, settings.!adict, 'matches.') DO i = 1 TO matches.0 PARSE VAR matches.i _kanji '['_reading']' . IF _reading == '' THEN DO _reading = WORD( _kanji, 1 ) _kanji = _reading END IF _reading == kata_sjis THEN DO c_reading = STRIP( _kanji ) IF last_used <> c_reading THEN DO c = c + 1 candidates.c = c_reading END END END END candidates.0 = c CALL VRSet 'WN_MAIN', 'Pointer', '' RETURN /*:VRX Halt */ Halt: signal _VREHalt return /*:VRX ICB_KANAFULL_Click */ ICB_KANAFULL_Click: CALL MI_KANA_Click CALL VRMethod 'MLE_INPUT', 'SetFocus' RETURN /*:VRX ICB_KANAHALF_Click */ ICB_KANAHALF_Click: CALL MI_HALFWIDTH_Click CALL VRMethod 'MLE_INPUT', 'SetFocus' RETURN /*:VRX ICB_LATNFULL_Click */ ICB_LATNFULL_Click: CALL MI_FULLWIDTH_Click CALL VRMethod 'MLE_INPUT', 'SetFocus' RETURN /*:VRX ICB_LATNHALF_Click */ ICB_LATNHALF_Click: CALL MI_ASCII_Click CALL VRMethod 'MLE_INPUT', 'SetFocus' RETURN /*:VRX Init */ Init: /* Hide the VX-REXX console window. */ CALL VRSet 'Console', 'WindowListTitle', '' CALL RxFuncAdd 'SysLoadFuncs', 'REXXUTIL', 'SysLoadFuncs' CALL SysLoadFuncs CALL RxFuncAdd 'VRXLoadFuncs', 'VROBJEX', 'VRXLoadFuncs' CALL VRXLoadFuncs buttons.0 = 1 buttons.1 = 'OK' IF RxFuncQuery('VRXSetMultiLineEditFormat') <> 0 THEN DO CALL VRMessage VRWindow(), 'VROBJEX.DLL is either missing or out of date.' || '0d0a'x , 'Please ensure that VROBJEX.DLL version 1.32 or later is installed.',, 'Missing Required DLL', 'E', 'buttons.', 1 CALL Quit RETURN END /* Set the MLE text format to MLFIE_NOTRANS (this prevents it from padding * line breaks with extra bytes, which throws off the positioning logic). */ CALL VRXSetMultiLineEditFormat 'MLE_INPUT', 'N' /* Attempt to load RXULS library (used for Unicode clipboard support). */ rxuls = 0 CALL RxFuncAdd 'ULSLoadFuncs', 'RXULS', 'ULSLoadFuncs' CALL ULSLoadFuncs IF RxFuncQuery('ULSGetUnicodeClipboard') == 0 THEN rxuls = 1 /* Set up the user interface defaults. */ CALL LoadPrefs CALL UpdateStatus CALL VRSet 'WN_MAIN', 'HelpFile', 'imerj.hlp' window = VRWindow() call VRSet window, "Visible", 1 call VRMethod window, "Activate" drop window /* Undo buffer (we have to manage this ourselves since MLE is readonly). */ settings.!undobuf = '' settings.!undoipt = 0 /* These global flags track the current input state. */ kana = '' /* Buffer for current kana input */ state = 0 /* Are we in the middle of typing a character? */ smallkana = 0 /* Is 'small kana' mode active? */ IF \ CodepageIsInstalled( 954 ) THEN DO /* CALL VRMessage VRWindow(), 'The translation table for EUC-JP (IBM954), is not installed.', 'Kanji conversion will not be available.',, 'Codepage Not Installed', 'W', 'buttons.', 1 */ CALL VRSet 'DT_Status', 'Caption', 'Codepage 954 is not installed.' CALL VRSet 'MN_CONVERT', 'Enabled', 0 END RETURN /*:VRX KanjiConversion */ KanjiConversion: ARG lookup_mode IF lookup_mode == '' THEN lookup_mode = 0 IF rxuls == 0 THEN RETURN /* Get the current text, cursor position and marking boundaries. */ CALL GetEditorInfo ipt = TranslateIPT( cursor ) /* Adjust text selection to match character boundaries. */ markleft = AdjustPos( flags, markleft, 0 ) markright = AdjustPos( flags, markright, 1 ) IF marklength > 0 THEN marklength = markright - markleft IF marklength == 0 THEN DO buttons.0 = 1 buttons.1 = 'OK' CALL VRMessage 'WN_MAIN',, 'You must select the text to be converted first.',, 'No Text Selected', 'W', 'buttons.', 1 RETURN END yomitext = SUBSTR( contents, markleft, marklength ) kanjitext = ConvertKanji( yomitext, lookup_mode ) IF kanjitext <> '' THEN DO settings.!undobuf = contents settings.!undoipt = ipt contents = DELSTR( contents, markleft, marklength ) contents = INSERT( kanjitext, contents, markleft - 1 ) cursornew = markleft + LENGTH( kanjitext ) CALL VRSet 'MLE_INPUT', 'Value', contents ipt = TranslateIPT( cursornew ) CALL VRMethod 'MLE_INPUT', 'SetSel', ipt, ipt END RETURN /*:VRX LB_KANJI_DoubleClick */ LB_KANJI_DoubleClick: CALL SW_KANJI_Close return /*:VRX LineNumber */ /* Return the line offset corresponding to the given character (byte) position. * We use this instead of the MultiLineEntryField LineFromChar() method, which * doesn't count newlines properly. Made more complicated since every time we * encounter a newline, the target position needs to be adjusted by one. * NOTE: the first line is 0. */ LineNumber: PROCEDURE ARG position, contents IF position < 1 THEN RETURN 0 RETURN VRMethod('MLE_INPUT', 'LineFromChar', position - 1 ) IF contents == '' THEN RETURN 0 /* count = 0 CALL StringTokenize contents, '0a'x, 'tokens.' adjusted = position total = 0 DO i = 1 TO tokens.0 total = total + LENGTH( tokens.i ) IF total >= adjusted THEN LEAVE IF ( i < tokens.0 ) | ( RIGHT( tokens.i, 1 ) == '0d'x ) THEN DO total = total + 1 count = count + 1 adjusted = position + count END END */ RETURN count /*:VRX LoadPrefs */ LoadPrefs: PROCEDURE EXPOSE settings. os2_ini = VALUE('USER_INI',,'OS2ENVIRONMENT') inipath = VRParseFilePath( os2_ini, 'DP') /* Update the window font using the system default */ settings.!defaultSize = 9 PARSE VALUE VRGetIni('PM_SystemFonts', 'WindowText') WITH settings.!windowText '00'x . IF settings.!windowText <> '' THEN DO CALL VRSet VRWindow(), 'Font', settings.!windowText END IF inipath == '' THEN inipath = SysBootDrive() || '\OS2' settings.!ini = inipath'\imerj.ini' IF STREAM( settings.!ini, 'C', 'QUERY EXISTS') == '' THEN DO CALL VRMethod VRWindow(), 'CenterWindow' settings.!bgclr = 'EntryField' settings.!fgclr = 'OutputText' settings.!font = '10.Times New Roman MT 30' settings.!nowarn = 0 settings.!edict = '' settings.!kdict = '' settings.!adict = '' RETURN END /* Load position and size settings */ settings.!x = VRGetIni('Window', 'Left', settings.!ini, 'NoClose') settings.!y = VRGetIni('Window', 'Top', settings.!ini, 'NoClose') settings.!width = VRGetIni('Window', 'Width', settings.!ini, 'NoClose') settings.!height = VRGetIni('Window', 'Height', settings.!ini, 'NoClose') IF settings.!x == '' THEN settings.!x = -1 IF settings.!y == '' THEN settings.!y = -1 IF settings.!width == '' THEN settings.!width = 0 IF settings.!height == '' THEN settings.!height = 0 /* Load font and colour settings */ settings.!bgclr = VRGetIni('Style', 'Background', settings.!ini, 'NoClose') settings.!fgclr = VRGetIni('Style', 'Foreground', settings.!ini, 'NoClose') settings.!font = VRGetIni('Style', 'Font', settings.!ini, 'NoClose' ) IF settings.!bgclr == '' THEN settings.!bgclr = 'EntryField' IF settings.!fgclr == '' THEN settings.!fgclr = 'OutputText' IF settings.!font == '' THEN settings.!font = '10.Times New Roman MT 30' /* Load other settings */ settings.!nowarn = VRGetIni('Options', 'NoWarn', settings.!ini, 'NoClose' ) IF settings.!nowarn == '' THEN settings.!nowarn = 0 settings.!edict = VRGetIni('Options', 'EDICT', settings.!ini, 'NoClose' ) settings.!kdict = VRGetIni('Options', 'KANJIDIC', settings.!ini, 'NoClose' ) settings.!adict = VRGetIni('Options', 'AUXDICT', settings.!ini ) IF \VRFileExists( settings.!edict ) THEN settings.!edict = '' IF \VRFileExists( settings.!kdict ) THEN settings.!kdict = '' IF \VRFileExists( settings.!adict ) THEN settings.!adict = '' IF ( settings.!edict <> '') | ( settings.!adict <> '') THEN CALL VRSet 'MI_CONVERT', 'Enabled', 1 IF settings.!kdict <> '' THEN CALL VRSet 'MI_KANJI', 'Enabled', 1 /* * Now apply the settings */ IF ( settings.!width > 0 ) & ( settings.!height > 0 ) THEN DO CALL VRSet VRWindow(), 'Width', settings.!width CALL VRSet VRWindow(), 'Height', settings.!height END IF ( settings.!x >= 0 ) & ( settings.!y >= 0 ) THEN DO CALL VRSet VRWindow(), 'Left', settings.!x CALL VRSet VRWindow(), 'Top', settings.!y END ELSE CALL VRMethod VRWindow(), 'CenterWindow' CALL VRSet 'MLE_INPUT', 'Font', settings.!font CALL VRSet 'MLE_INPUT', 'BackColor', settings.!bgclr CALL VRSet 'MLE_INPUT', 'ForeColor', settings.!fgclr RETURN /*:VRX MI_ABOUT_Click */ MI_ABOUT_Click: CALL VRLoadSecondary 'SW_ABOUT', 'W' return /*:VRX MI_ASCII_Click */ MI_ASCII_Click: CALL VRSet 'MI_KANA', 'Checked', 0 CALL VRSet 'MI_HALFWIDTH', 'Checked', 0 CALL VRSet 'MI_FULLWIDTH', 'Checked', 0 CALL VRSet 'MI_ASCII', 'Checked', 1 CALL VRSet 'ICB_KANAFULL', 'Pushed', 0 CALL VRSet 'ICB_KANAHALF', 'Pushed', 0 CALL VRSet 'ICB_LATNFULL', 'Pushed', 0 CALL VRSet 'ICB_LATNHALF', 'Pushed', 1 CALL UpdateStatus RETURN /*:VRX MI_CONVERT_Click */ MI_CONVERT_Click: CALL KanjiConversion RETURN /*:VRX MI_EDITCOPY_Click */ MI_EDITCOPY_Click: CALL GetEditorInfo CALL ClipCopyAction RETURN /*:VRX MI_EDITCUT_Click */ MI_EDITCUT_Click: CALL GetEditorInfo CALL ClipCutAction RETURN /*:VRX MI_EDITPASTE_Click */ MI_EDITPASTE_Click: CALL GetEditorInfo CALL ClipPasteAction RETURN /*:VRX MI_EXIT_Click */ MI_EXIT_Click: CALL Quit return /*:VRX MI_FULLWIDTH_Click */ MI_FULLWIDTH_Click: CALL VRSet 'MI_KANA', 'Checked', 0 CALL VRSet 'MI_HALFWIDTH', 'Checked', 0 CALL VRSet 'MI_FULLWIDTH', 'Checked', 1 CALL VRSet 'MI_ASCII', 'Checked', 0 CALL VRSet 'ICB_KANAFULL', 'Pushed', 0 CALL VRSet 'ICB_KANAHALF', 'Pushed', 0 CALL VRSet 'ICB_LATNFULL', 'Pushed', 1 CALL VRSet 'ICB_LATNHALF', 'Pushed', 0 CALL UpdateStatus RETURN /*:VRX MI_HALFWIDTH_Click */ MI_HALFWIDTH_Click: CALL VRSet 'MI_KANA', 'Checked', 0 CALL VRSet 'MI_HALFWIDTH', 'Checked', 1 CALL VRSet 'MI_FULLWIDTH', 'Checked', 0 CALL VRSet 'MI_ASCII', 'Checked', 0 CALL VRSet 'ICB_KANAFULL', 'Pushed', 0 CALL VRSet 'ICB_KANAHALF', 'Pushed', 1 CALL VRSet 'ICB_LATNFULL', 'Pushed', 0 CALL VRSet 'ICB_LATNHALF', 'Pushed', 0 CALL UpdateStatus RETURN /*:VRX MI_HELP_Click */ MI_HELP_Click: ok = VRMethod( "WN_MAIN", "InvokeHelp" ) RETURN /*:VRX MI_HELPKEYS_Click */ MI_HELPKEYS_Click: ok = VRMethod( "MI_HELPKEYS", "InvokeHelp" ) return /*:VRX MI_KANA_Click */ MI_KANA_Click: CALL VRSet 'MI_KANA', 'Checked', 1 CALL VRSet 'MI_HALFWIDTH', 'Checked', 0 CALL VRSet 'MI_FULLWIDTH', 'Checked', 0 CALL VRSet 'MI_ASCII', 'Checked', 0 CALL VRSet 'ICB_KANAFULL', 'Pushed', 1 CALL VRSet 'ICB_KANAHALF', 'Pushed', 0 CALL VRSet 'ICB_LATNFULL', 'Pushed', 0 CALL VRSet 'ICB_LATNHALF', 'Pushed', 0 CALL UpdateStatus RETURN /*:VRX MI_KANJI_Click */ MI_KANJI_Click: CALL KanjiConversion 1 RETURN /*:VRX MI_OPTIONS_Click */ MI_OPTIONS_Click: CALL VRLoadSecondary 'SW_PREFS', 'W' RETURN /*:VRX MI_UNDO_Click */ MI_UNDO_Click: CALL UndoAction RETURN /*:VRX MLE_INPUT_ContextMenu */ MLE_INPUT_ContextMenu: CALL VRMethod 'MN_EDIT', 'Popup' RETURN /*:VRX MLE_INPUT_KeyPress */ MLE_INPUT_KeyPress: /* Set up all the variables about the current editor data, positions, etc. */ CALL GetEditorInfo /* Now get the typed key and respond accordingly. */ inputchar = VRGet('MLE_INPUT', 'KeyString') /* For some reason, alphabetic keyboard accelerators aren't processed * when CapsLock is on. */ IF inputchar == '{Ctrl}K' THEN DO CALL MI_KANA_Click RETURN END ELSE IF inputchar == '{Ctrl}H' THEN DO CALL MI_HALFWIDTH_Click RETURN END ELSE IF inputchar == '{Ctrl}N' THEN DO CALL MI_ASCII_Click RETURN END ELSE IF inputchar == '{Ctrl}F' THEN DO CALL MI_FULLWIDTH_Click RETURN END ELSE IF inputchar == '{Ctrl}S' THEN DO CALL MI_KANJI_Click RETURN END /* A couple of special characters that require Alt as a modifier. */ IF inputchar == '{Alt}0' THEN inputchar = '~' IF inputchar == '{Alt}/' THEN inputchar = '\' /* Here we handle control keys that change the text contents. (The MLE * would normally handle most of these itself, except that we had to make it * read-only in order to override the text input behaviour. So we have to * handle all update actions ourselves.) */ IF LEFT( inputchar, 1 ) == '{' THEN DO SELECT /* Handle alternate clipboard shortcuts. (We check for the regular * ones too, since on some keyboards the menu logic may not pick * them up, probably due to differences in keypad handling.) */ WHEN ( inputchar == '{Shift}{Ins}') | ( inputchar == '{Ctrl}V') | ( inputchar == '{Ctrl}v') THEN DO CALL ClipPasteAction END WHEN ( inputchar == '{Ctrl}{Ins}') | ( inputchar == '{Ctrl}C') | ( inputchar == '{Ctrl}c') THEN DO CALL ClipCopyAction /* Clear the key event to prevent the MLE from doing its default * copy (which would erase the Unicode clipboard contents). */ CALL VRSet 'MLE_INPUT', 'KeyString', '' END WHEN ( inputchar == '{Shift}{Del}') | ( inputchar == '{Ctrl}X') | ( inputchar == '{Ctrl}x') THEN DO CALL ClipCutAction /* Clear the key event to prevent the MLE from doing its default * copy (which would erase the Unicode clipboard contents). */ CALL VRSet 'MLE_INPUT', 'KeyString', '' END /* Handle alternate undo shortcut */ WHEN ( inputchar == '{Ctrl}Z') | ( inputchar == '{Ctrl}z') THEN DO CALL UndoAction END WHEN ( inputchar == '{Ctrl}/') | ( inputchar == '{Ctrl}A') | ( inputchar == '{Ctrl}a') THEN DO CALL VRMethod 'MLE_INPUT', 'SetSel', 0, LENGTH( contents ) END WHEN inputchar == '{Esc}' THEN DO IF marklength > 0 THEN DO ipt = TranslateIPT( cursor ) CALL VRMethod 'MLE_INPUT', 'SetSel', ipt, ipt END END WHEN inputchar == '{Backspace}' THEN DO state = 0 kana = '' settings.!undobuf = contents settings.!undoipt = TranslateIPT( cursor ) /* Adjust text selection to match character boundaries. */ markleft = AdjustPos( flags, markleft, 0 ) markright = AdjustPos( flags, markright, 1 ) IF marklength > 0 THEN marklength = markright - markleft prior = AdjustPos( flags, cursor - 1, 0 ) /* Also updates cwidth */ /* IF SUBSTR( contents, prior, 1 ) == '0A'x THEN cwidth = 2 Handle preceding 0x0D */ IF marklength > 0 THEN DO /* Delete selected text only. */ contents = DELSTR( contents, markleft, marklength ) cursornew = markleft END ELSE IF cursor > cwidth THEN DO /* Delete single character ahead of cursor position (unless * there isn't a full character in front of it, i.e. we're * at the beginning of the text). */ contents = DELSTR( contents, cursor - cwidth, cwidth ) cursornew = prior END CALL VRSet 'MLE_INPUT', 'Value', contents /* cursornew = AdjustPos( flags, cursornew, 0 ) */ ipt = TranslateIPT( cursornew ) CALL VRMethod 'MLE_INPUT', 'SetSel', ipt, ipt END WHEN inputchar == '{Del}' THEN DO state = 0 kana = '' settings.!undobuf = contents settings.!undoipt = TranslateIPT( cursor ) /* Adjust text selection to match character boundaries. */ markleft = AdjustPos( flags, markleft, 0 ) markright = AdjustPos( flags, markright, 1 ) IF marklength > 0 THEN marklength = markright - markleft IF marklength > 0 THEN DO /* Delete selected text. */ contents = DELSTR( contents, markleft, marklength ) cursornew = markleft END ELSE DO /* Delete single character at cursor position. */ cursor = AdjustPos( flags, cursor, 0 ) /* Get the cursor cwidth */ /* IF SUBSTR( contents, cursor, 1 ) == '0D'x THEN cwidth = 2 Handle trailing 0x0A */ contents = DELSTR( contents, cursor, cwidth ) cursornew = cursor END CALL VRSet 'MLE_INPUT', 'Value', contents cursornew = AdjustPos( flags, cursornew, 0 ) ipt = TranslateIPT( cursornew ) CALL VRMethod 'MLE_INPUT', 'SetSel', ipt, ipt END WHEN ( inputchar == '{Enter}') | ( inputchar == '{Newline}') THEN DO /* Convert any outstanding characters (also saves the undo buffer) */ CALL ConvertKana kana CALL VRMethod 'MLE_INPUT', 'Insert', '0A'x state = 0 kana = '' END OTHERWISE DO state = 0 kana = '' END END RETURN 0 END /* When entering text, move the the cursor to the correct position before * doing anything else. We just did AdjustPos(cursor) above so this is safe. */ ipt = TranslateIPT( cursor ) CALL VRMethod 'MLE_INPUT', 'SetSel', ipt, ipt /* If we're not in romaji-to-kana conversion mode... */ IF VRGet('MI_ASCII', 'Checked') == 1 THEN DO settings.!undobuf = contents settings.!undoipt = ipt /* Direct input mode, simply output the character verbatim and return. */ CALL VRMethod 'MLE_INPUT', 'Insert', inputchar RETURN 0 END ELSE IF VRGet('MI_FULLWIDTH', 'Checked') == 1 THEN DO settings.!undobuf = contents settings.!undoipt = ipt /* Handle fullwidth ASCII characters. */ CALL VRMethod 'MLE_INPUT', 'Insert', ConvertFullwidth( inputchar ) RETURN 0 END /* Now handle (displayable) Japanese characters. */ IF ( VERIFY( inputchar, 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz') > 0 ) THEN DO /* If it's not an alphabetic character, it can't be romaji input. So * try and convert it immediately. (Some punctuation marks do have * ideographic versions.) */ IF kana \= '' THEN DO CALL ConvertKana kana END /* IF C2X( inputchar ) == '0D' THEN SAY */ IF ( TRANSLATE( kana ) == 'N' & inputchar == "'") THEN /* (This allows use of ' to force the standalone N syllable.) */ NOP ELSE CALL ConvertKana inputchar state = 0 kana = '' END ELSE IF state == 0 THEN DO /* We're not in the middle of a syllable, so start entering a new one. */ IF ( VERIFY( inputchar, 'AEIOUaeiou') == 0 ) THEN DO CALL ConvertKana inputchar kana = '' END ELSE IF TRANSLATE( inputchar ) == 'X' THEN smallkana = 1 ELSE DO state = 1 kana = inputchar END END ELSE DO /* There's a syllable already in progress, so attempt to continue it. */ IF inputchar == LEFT( kana, 1 ) THEN DO /* First, handle the case of "double" consonants. */ IF TRANSLATE( kana ) == 'N' THEN DO /* Double N is a special case. */ CALL ConvertKana kana kana = inputchar END ELSE DO /* Other double consonants must be indicated by prepending the * "small tsu" kana mark. */ IF VRGet('MI_KANA', 'Checked') THEN DO /* Fullwidth, insert hiragana or katakana version as needed. */ IF VERIFY( inputchar, 'ABCDEFGHIJKLMOPQRSTUVWXYZ') == 0 THEN CALL VRMethod 'MLE_INPUT', 'Insert', 'ƒb' ELSE CALL VRMethod 'MLE_INPUT', 'Insert', '‚Į' END ELSE /* Halfwidth katakana version. */ CALL VRMethod 'MLE_INPUT', 'Insert', 'Æ' END END ELSE DO /* First, if the "in progress" kana contains only N/M, and the new * character is not a valid second character for N- or M-, then we * assume we're dealing with the standalone N syllable. So convert * it and then start a new "in progress" kana using the new letter. */ IF ( TRANSLATE( kana ) == 'N' | TRANSLATE( kana ) == 'M') & ( VERIFY( inputchar, 'AEIOUYaeiouy') > 0 ) THEN DO CALL ConvertKana kana IF VERIFY( inputchar, 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz') == 0 THEN kana = inputchar ELSE DO kana = '' state = 0 END END /* Otherwise, if this is a valid trailing character, append it to * the current "in progress" kana. */ ELSE IF ( VERIFY( inputchar, 'AEIOUHYSZWaeiouhyszw') == 0 ) THEN DO kana = kana || inputchar IF ( VERIFY( inputchar, 'HYSZWhyszw') > 0 ) THEN DO CALL ConvertKana kana kana = '' state = 0 END END END END RETURN 0 /*:VRX ParseFontSize */ ParseFontSize: PROCEDURE EXPOSE settings. PARSE ARG font IF font == '' | font == '' THEN RETURN settings.!defaultSize PARSE VAR font _pts'.'. IF _pts < settings.!defaultSize THEN _pts = settings.!defaultSize RETURN _pts /*:VRX ParseKanjiEntry */ ParseKanjiEntry: PROCEDURE PARSE ARG yomi, entry PARSE VAR entry _kanji _kinfo '{' . IF _kinfo == '' THEN RETURN /* Parse out the kanji, the frequency number, and the readings */ freq = 'F9999' readings = '' DO i = 1 TO WORDS( _kinfo ) field = WORD( _kinfo, i ) fldid = LEFT( field, 1 ) IF VERIFY( fldid, 'UNBCSGHFPKLIQMEY') <> 0 THEN DO IF fldid == '-' THEN field = SUBSTR( field, 2 ) PARSE VAR field stem'.'okuri readings = readings stem END ELSE IF fldid == 'F' THEN DO PARSE VAR field 'F'_fno . freq = 'F' || LEFT( _fno, 4, '0') END END /* Make sure we have a match with at least one reading */ result = '' DO i = 1 TO WORDS( readings ) IF WORD( readings, i ) == yomi THEN DO result = _kanji freq LEAVE END END RETURN result /*:VRX PB_ABOUTOK_Click */ PB_ABOUTOK_Click: CALL SW_ABOUT_Close return /*:VRX PB_ADICT_Click */ PB_ADICT_Click: PROCEDURE defFile = VRGet('EF_ADICT', 'Value') IF defFile == '' THEN defFile = 'auxdict' FileName = VRFileDialog( VRWindow(), "Select File", "Open", defFile ) IF FileName == '' THEN RETURN IF \ VRFileExists( FileName ) THEN RETURN CALL VRSet 'EF_ADICT', 'Value', FileName RETURN /*:VRX PB_EDICT_Click */ PB_EDICT_Click: PROCEDURE defFile = VRGet('EF_EDICT', 'Value') IF defFile == '' THEN defFile = 'edict' FileName = VRFileDialog( VRWindow(), "Select File", "Open", defFile ) IF FileName == '' THEN RETURN IF \ VRFileExists( FileName ) THEN RETURN CALL VRSet 'EF_EDICT', 'Value', FileName RETURN /*:VRX PB_KDICT_Click */ PB_KDICT_Click: PROCEDURE defFile = VRGet('EF_KDICT', 'Value') IF defFile == '' THEN defFile = 'kanjidic' FileName = VRFileDialog( VRWindow(), "Select File", "Open", defFile ) IF FileName == '' THEN RETURN IF \ VRFileExists( FileName ) THEN RETURN CALL VRSet 'EF_KDICT', 'Value', FileName RETURN /*:VRX PB_PREFSCANCEL_Click */ PB_PREFSCANCEL_Click: CALL SW_PREFS_Close return /*:VRX PB_PREFSHELP_Click */ PB_PREFSHELP_Click: CALL VRMethod 'SW_PREFS', 'InvokeHelp' RETURN /*:VRX PB_PREFSOK_Click */ PB_PREFSOK_Click: settings.!nowarn = VRGet('CHK_NOWARN', 'Set') settings.!edict = VRGet('EF_EDICT', 'Value') settings.!kdict = VRGet('EF_KDICT', 'Value') settings.!adict = VRGet('EF_ADICT', 'Value') IF settings.!edict <> '' THEN CALL VRSet 'MI_CONVERT', 'Enabled', 1 IF settings.!kdict <> '' THEN CALL VRSet 'MI_KANJI', 'Enabled', 1 CALL SW_PREFS_Close RETURN /*:VRX Quit */ Quit: IF settings.!nowarn <> 1 THEN DO clip = VRMethod('Application', 'GetClipboard') text = VRGet('MLE_INPUT', 'Value') IF ( text <> '' & text <> clip ) THEN DO buttons.0 = 2 buttons.1 = '~Yes' buttons.2 = '~No' id = VRMessage('WN_MAIN',, 'The current text will be lost if you close this window without copying it to the clipboard first. Close anyway?',, 'Confirm Close', 'W', 'buttons.', 2 ) IF id \= 1 THEN RETURN END END CALL SavePrefs window = VRWindow() call VRSet window, "Shutdown", 1 drop window RETURN /*:VRX RescaleObject */ RescaleObject: PROCEDURE PARSE ARG object, factor, move x = VRGet( object, 'Left') y = VRGet( object, 'Top') w = VRGet( object, 'Width') h = VRGet( object, 'Height') nx = TRUNC( x * factor ) ny = TRUNC( y * factor ) nw = TRUNC( w * factor ) nh = TRUNC( h * factor ) IF move <> 0 THEN DO ok = VRSet( object, 'Left', nx ) ok = VRSet( object, 'Top', ny ) END ok = VRSet( object, 'Width', nw ) ok = VRSet( object, 'Height', nh ) RETURN /*:VRX SavePrefs */ SavePrefs: PROCEDURE EXPOSE settings. bgclr = VRGet('MLE_INPUT', 'BackColor') fgclr = VRGet('MLE_INPUT', 'ForeColor') font = VRGet('MLE_INPUT', 'Font') xpos = VRGet( VRWindow(), 'Left') ypos = VRGet( VRWindow(), 'Top') width = VRGet( VRWindow(), 'Width') height = VRGet( VRWindow(), 'Height') CALL VRSetIni 'Window', 'Left', xpos, settings.!ini, 'NoClose' CALL VRSetIni 'Window', 'Top', ypos, settings.!ini, 'NoClose' CALL VRSetIni 'Window', 'Width', width, settings.!ini, 'NoClose' CALL VRSetIni 'Window', 'Height', height, settings.!ini, 'NoClose' CALL VRSetIni 'Style', 'Background', bgclr, settings.!ini, 'NoClose' CALL VRSetIni 'Style', 'Foreground', fgclr, settings.!ini, 'NoClose' CALL VRSetIni 'Style', 'Font', font, settings.!ini, 'NoClose' CALL VRSetIni 'Options', 'NoWarn', settings.!nowarn, settings.!ini, 'NoClose' CALL VRSetIni 'Options', 'EDICT', settings.!edict, settings.!ini, 'NoClose' CALL VRSetIni 'Options', 'KANJIDIC', settings.!kdict, settings.!ini, 'NoClose' CALL VRSetIni 'Options', 'AUXDICT', settings.!adict, settings.!ini RETURN /*:VRX StringTokenize */ StringTokenize: PARSE ARG string, separator, __stem CALL __StringTokenize string, separator, __stem DROP __stem RETURN /*:VRX SW_ABOUT_Close */ SW_ABOUT_Close: call SW_ABOUT_Fini return /*:VRX SW_ABOUT_Create */ SW_ABOUT_Create: call SW_ABOUT_Init return /*:VRX SW_ABOUT_Fini */ SW_ABOUT_Fini: window = VRInfo( "Window" ) call VRDestroy window drop window return /*:VRX SW_ABOUT_Init */ SW_ABOUT_Init: /* CALL VRMethod 'MLE_TERMS', 'Insert', '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.' CALL VRMethod 'MLE_TERMS', 'Insert', '0d0a0d0a'x CALL VRMethod 'MLE_TERMS', 'Insert', '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.' CALL VRMethod 'MLE_TERMS', 'Insert', '0d0a0d0a'x CALL VRMethod 'MLE_TERMS', 'Insert', '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., 675 Mass Ave, Cambridge, MA 02139, USA.' CALL VRMethod 'MLE_TERMS', 'SetSel', 0, 0 */ IF settings.!windowText <> '' THEN DO CALL VRSet 'SW_ABOUT', 'Font', settings.!windowText CALL VRSet 'DT_1', 'Font', settings.!windowText || ' Bold' factor = GetScalingFactor( ParseFontSize( settings.!windowText )) CALL RescaleObject 'SW_ABOUT', factor, 0 CALL RescaleObject 'DT_1', factor CALL RescaleObject 'DT_2', factor CALL RescaleObject 'Pict_1', factor CALL RescaleObject 'Pict_2', factor CALL VRSet 'Pict_2', 'Height', 25 CALL RescaleObject 'DT_3', factor CALL RescaleObject 'DT_4', factor CALL RescaleObject 'PB_ABOUTOK', factor END window = VRInfo( "Object" ) if( \VRIsChildOf( window, "Notebook" ) ) then do call VRMethod window, "CenterWindow" call VRSet window, "Visible", 1 call VRMethod window, "Activate" end drop window return /*:VRX SW_KANJI_Close */ SW_KANJI_Close: selected_candidate = VRGet('LB_KANJI', 'SelectedString') call SW_KANJI_Fini RETURN /*:VRX SW_KANJI_Create */ SW_KANJI_Create: call SW_KANJI_Init return /*:VRX SW_KANJI_Fini */ SW_KANJI_Fini: window = VRInfo( "Window" ) call VRDestroy window drop window return /*:VRX SW_KANJI_Init */ SW_KANJI_Init: /* This is a very crude attempt to set the default list size to something * suitable for the current font size. */ PARSE VAR settings.font _pts'.'. IF VERIFY( _pts, '0123456789') <> 0 THEN _pts = 10 IF lookup_mode == 1 THEN width_factor = 80 ELSE width_factor = 160 CALL VRSet 'SW_KANJI', 'Width', _pts * width_factor CALL VRSet 'SW_KANJI', 'Height', _pts * 300 mle_font = VRGet('MLE_INPUT', 'Font') IF mle_font == '' THEN mle_font = settings.!font CALL VRSet 'LB_KANJI', 'Font', mle_font CALL VRMethod 'LB_KANJI', 'AddStringList', 'candidates.' CALL VRSet 'LB_KANJI', 'Selected', 1 window = VRInfo( "Object" ) if( \VRIsChildOf( window, "Notebook" ) ) then do call VRMethod window, "CenterWindow" top = VRGet( window, 'Top') call VRSet window, 'Top', top + 500 call VRSet window, "Visible", 1 call VRMethod window, "Activate" end drop window RETURN /*:VRX SW_KANJI_KeyPress */ SW_KANJI_KeyPress: obj = VRInfo( "Object" ) keystr = VRGet( obj, "KeyString") IF keystr == '{Newline}' | keystr == '{Space}' THEN CALL SW_KANJI_Close ELSE IF keystr == '{Esc}' THEN DO CALL VRSet 'LB_KANJI', 'Selected', 0 CALL SW_KANJI_Close END return /*:VRX SW_PREFS_Close */ SW_PREFS_Close: call SW_PREFS_Fini return /*:VRX SW_PREFS_Create */ SW_PREFS_Create: call SW_PREFS_Init return /*:VRX SW_PREFS_Fini */ SW_PREFS_Fini: window = VRInfo( "Window" ) call VRDestroy window drop window return /*:VRX SW_PREFS_Init */ SW_PREFS_Init: CALL VRSet 'EF_EDICT', 'VALUE', settings.!edict CALL VRSet 'EF_KDICT', 'VALUE', settings.!kdict CALL VRSet 'EF_ADICT', 'VALUE', settings.!adict CALL VRSet 'CHK_NOWARN', 'Set', settings.!nowarn IF settings.!windowText <> '' THEN DO CALL VRSet 'SW_PREFS', 'Font', settings.!windowText factor = GetScalingFactor( ParseFontSize( settings.!windowText )) CALL RescaleObject 'SW_PREFS', factor, 0 CALL RescaleObject 'GB_DICTS', factor CALL RescaleObject 'DT_EDICT', factor CALL RescaleObject 'EF_EDICT', factor CALL RescaleObject 'PB_EDICT', factor CALL RescaleObject 'DT_KDICT', factor CALL RescaleObject 'EF_KDICT', factor CALL RescaleObject 'PB_KDICT', factor CALL RescaleObject 'DT_ADICT', factor CALL RescaleObject 'EF_ADICT', factor CALL RescaleObject 'PB_ADICT', factor CALL RescaleObject 'CHK_NOWARN', factor CALL RescaleObject 'PB_PREFSOK', factor CALL RescaleObject 'PB_PREFSCANCEL', factor CALL RescaleObject 'PB_PREFSHELP', factor END window = VRInfo( "Object" ) if( \VRIsChildOf( window, "Notebook" ) ) then do call VRMethod window, "CenterWindow" call VRSet window, "Visible", 1 call VRMethod window, "Activate" end drop window return /*:VRX TranslateIPT */ /* Translate a cursor position for our internal character array into an * insertion point (IPT) as understood by the MLE. * Always make sure that AdjustPos() has been called on the argument before * calling this function. */ TranslateIPT: PROCEDURE PARSE ARG cursor ipt = cursor - 1 /* contents = VRGet('MLE_INPUT', 'Value') iptline = LineNumber( cursor, contents ) ipt = ipt - iptline */ RETURN ipt /*:VRX UndoAction */ UndoAction: kana = '' state = 0 smallkana = 0 /* IF settings.!undobuf <> '' THEN DO */ redobuf = VRGet('MLE_INPUT', 'Value') redoipt = VRMethod('MLE_INPUT', 'QuerySel', 'cursor') CALL VRSet 'MLE_INPUT', 'Value', settings.!undobuf CALL VRMethod 'MLE_INPUT', 'SetSel', settings.!undoipt, settings.!undoipt settings.!undobuf = redobuf settings.!undoipt = redoipt /* END */ RETURN /*:VRX UpdateStatus */ UpdateStatus: SELECT WHEN VRGet('MI_FULLWIDTH', 'Checked') THEN DO modetext = 'ASCII' widthtext = 'fullwidth' END WHEN VRGet('MI_HALFWIDTH', 'Checked') THEN DO modetext = 'Kana conversion' widthtext = 'halfwidth' END WHEN VRGet('MI_ASCII', 'Checked') THEN DO modetext = 'No conversion' widthtext = 'direct input' END OTHERWISE DO modetext = 'Kana conversion' widthtext = 'fullwidth' END END CALL VRSet 'DT_STATUS', 'Caption', modetext '-' widthtext RETURN /*:VRX WN_MAIN_Close */ WN_MAIN_Close: call Quit return