Screen5250.java
上传用户:xiekaiwei
上传日期:2015-07-04
资源大小:620k
文件大小:102k
源码类别:

Telnet客户端

开发平台:

Java

  1. /**
  2.  * Title: Screen5250.java
  3.  * Copyright:   Copyright (c) 2001 - 2004
  4.  * Company:
  5.  * @author  Kenneth J. Pouncey
  6.  * @version 0.5
  7.  *
  8.  * Description:
  9.  *
  10.  * This program is free software; you can redistribute it and/or modify
  11.  * it under the terms of the GNU General Public License as published by
  12.  * the Free Software Foundation; either version 2, or (at your option)
  13.  * any later version.
  14.  *
  15.  * This program is distributed in the hope that it will be useful,
  16.  * but WITHOUT ANY WARRANTY; without even the implied warranty of
  17.  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  18.  * GNU General Public License for more details.
  19.  *
  20.  * You should have received a copy of the GNU General Public License
  21.  * along with this software; see the file COPYING.  If not, write to
  22.  * the Free Software Foundation, Inc., 59 Temple Place, Suite 330,
  23.  * Boston, MA 02111-1307 USA
  24.  *
  25.  */
  26. package org.tn5250j.framework.tn5250;
  27. import java.text.*;
  28. import java.util.*;
  29. import java.awt.*;
  30. import java.awt.datatransfer.*;
  31. import java.awt.event.*;
  32. import org.tn5250j.event.*;
  33. import org.tn5250j.tools.logging.*;
  34. import org.tn5250j.TN5250jConstants;
  35. import org.tn5250j.framework.tn5250.KeyStrokenizer;
  36. public class Screen5250 implements TN5250jConstants{
  37. private ScreenFields screenFields;
  38. private int lastAttr;
  39. private int lastRow;
  40. private int lastCol;
  41. private int lastPos;
  42. private int lenScreen;
  43. private KeyStrokenizer strokenizer;
  44. private tnvt sessionVT;
  45. private int numRows = 0;
  46. private int numCols = 0;
  47. private boolean updateCursorLoc;
  48. private char char0 = 0;
  49. protected static final int initAttr = 32;
  50. protected static final char initChar = 0;
  51. private boolean statusErrorCode;
  52. private boolean statusXSystem;
  53. private Rectangle workR = new Rectangle();
  54. public boolean cursorActive = false;
  55. public boolean cursorShown = false;
  56. protected boolean insertMode = false;
  57. private boolean keyProcessed = false;
  58. private Rectangle dirtyScreen = new Rectangle();
  59. public int homePos = 0;
  60. public int saveHomePos = 0;
  61. private String bufferedKeys;
  62. public boolean pendingInsert = false;
  63. public final static byte STATUS_SYSTEM = 1;
  64. public final static byte STATUS_ERROR_CODE = 2;
  65. public final static byte STATUS_VALUE_ON = 1;
  66. public final static byte STATUS_VALUE_OFF = 2;
  67. private StringBuffer hsMore = new StringBuffer("More...");
  68. private StringBuffer hsBottom = new StringBuffer("Bottom");
  69. // error codes to be sent to the host on an error
  70. private final static int ERR_CURSOR_PROTECTED = 0x05;
  71. private final static int ERR_INVALID_SIGN = 0x11;
  72. private final static int ERR_NO_ROOM_INSERT = 0x12;
  73. private final static int ERR_NUMERIC_ONLY = 0x09;
  74. private final static int ERR_DUP_KEY_NOT_ALLOWED = 0x19;
  75. private final static int ERR_NUMERIC_09 = 0x10;
  76. private final static int ERR_FIELD_MINUS = 0x16;
  77. private final static int ERR_FIELD_EXIT_INVALID = 0x18;
  78. private final static int ERR_ENTER_NO_ALLOWED = 0x20;
  79. private final static int ERR_MANDITORY_ENTER = 0x21;
  80. private boolean guiInterface = false;
  81. private boolean restrictCursor = false;
  82. private Rectangle restriction;
  83. private boolean resetRequired = true;
  84. private boolean defaultPrinter;
  85.    private boolean backspaceError = true;
  86. private boolean feError;
  87.    // vector of listeners for changes to the screen.
  88.    Vector listeners = null;
  89.    // Operator Information Area
  90.    private ScreenOIA oia;
  91.    // screen planes
  92.    protected ScreenPlanes planes;
  93. //Added by Barry
  94. private StringBuffer keybuf;
  95. private TN5250jLogger log = TN5250jLogFactory.getLogger(this.getClass());
  96. public Screen5250() {
  97. //Added by Barry
  98. this.keybuf = new StringBuffer();
  99. try {
  100. jbInit();
  101. } catch (Exception ex) {
  102. log.warn("In constructor: ", ex);
  103. }
  104. }
  105. void jbInit() throws Exception {
  106. lastAttr = 32;
  107. // default number of rows and columns
  108. numRows = 24;
  109. numCols = 80;
  110. setCursor(1, 1); // set initial cursor position
  111. restriction = new Rectangle(0, 0);
  112. updateCursorLoc = false;
  113.       oia = new ScreenOIA(this);
  114.       oia.setKeyBoardLocked(true);
  115. lenScreen = numRows * numCols;
  116.       planes = new ScreenPlanes(this,numRows);
  117. screenFields = new ScreenFields(this);
  118. strokenizer = new KeyStrokenizer();
  119. }
  120.    protected ScreenPlanes getPlanes() {
  121.       return planes;
  122.    }
  123.    public final ScreenOIA getOIA() {
  124.       return oia;
  125.    }
  126. protected final void setRowsCols(int rows, int cols) {
  127.       int oldRows = numRows;
  128.       int oldCols = numCols;
  129. // default number of rows and columns
  130. numRows = rows;
  131. numCols = cols;
  132. lenScreen = numRows * numCols;
  133.       planes.setSize(rows);
  134.       //  If they are not the same then we need to inform the listeners that
  135.       //  the size changed.
  136.       if (oldRows != numRows || oldCols != numCols)
  137.          fireScreenSizeChanged();
  138. }
  139.    public boolean isCursorActive() {
  140.       return cursorActive;
  141.    }
  142.    public boolean isCursorShown() {
  143.    return cursorShown;
  144.    }
  145.    public void setUseGUIInterface(boolean gui) {
  146.       guiInterface = gui;
  147.    }
  148. public void toggleGUIInterface() {
  149. guiInterface = !guiInterface;
  150. }
  151.    public void setResetRequired(boolean reset) {
  152.       resetRequired = reset;
  153.    }
  154.    public void setBackspaceError(boolean onError) {
  155.       backspaceError = onError;
  156.    }
  157.    /**
  158.  *
  159.  * Copy & Paste start code
  160.  *
  161.  */
  162. public final void copyMe(Rectangle area) {
  163. Clipboard cb = Toolkit.getDefaultToolkit().getSystemClipboard();
  164. StringBuffer s = new StringBuffer();
  165.       workR.setBounds(area);
  166. log.debug("Copying" + workR);
  167. // loop through all the screen characters to send them to the clip board
  168. int m = workR.x;
  169. int i = 0;
  170. int t = 0;
  171. while (workR.height-- > 0) {
  172. t = workR.width;
  173. i = workR.y;
  174. while (t-- > 0) {
  175. // only copy printable characters (in this case >= ' ')
  176. char c = planes.getChar(getPos(m - 1, i - 1));
  177. if (c >= ' ' && (planes.screenExtended[getPos(m - 1, i - 1)] & EXTENDED_5250_NON_DSP)
  178.                               == 0)
  179. s.append(c);
  180. else
  181. s.append(' ');
  182. i++;
  183. }
  184. s.append('n');
  185. m++;
  186. }
  187.       // uncomment the next block of code when we implement the copy append
  188.       //  functionality.  This was a test just to see if it was possible.
  189. //      String trString = "";
  190. //      try {
  191. //      trString= (String)(cb.getContents(this).getTransferData(DataFlavor.stringFlavor));
  192. //      }
  193. //      catch (Exception e) {
  194. //         System.out.println(e.getMessage());
  195. //      }
  196. // StringSelection contents = new StringSelection(trString + s.toString());
  197. StringSelection contents = new StringSelection(s.toString());
  198. cb.setContents(contents, null);
  199. }
  200. public final void pasteMe(boolean special) {
  201. setCursorActive(false);
  202. Clipboard cb = Toolkit.getDefaultToolkit().getSystemClipboard();
  203. Transferable content = cb.getContents(this);
  204. try {
  205. StringBuffer sb = new StringBuffer((String) content
  206. .getTransferData(DataFlavor.stringFlavor));
  207. StringBuffer pd = new StringBuffer();
  208.          // character counters within the string to be pasted.
  209. int nextChar = 0;
  210. int nChars = sb.length();
  211. int lr = getRow(lastPos);
  212. int lc = getCol(lastPos);
  213. resetDirty(lastPos);
  214.          int cpos = lastPos;
  215.          int length = getScreenLength();
  216.          char c = 0;
  217.          boolean setIt;
  218.          // save our current place within the FFT.
  219. screenFields.saveCurrentField();
  220.          for (int x = nextChar; x < nChars; x++) {
  221.             c = sb.charAt(x);
  222.             if ((c == 'n') || (c == 'r')) {
  223.                log.info("pasted cr-lf>" + pd + "<");
  224.                pd.setLength(0);
  225.                // if we read in a cr lf in the data stream we need to go
  226.                // to the starting column of the next row and start from there
  227.                cpos = getPos(getRow(cpos)+1,lc);
  228.                // If we go paste the end of the screen then let's start over from
  229.                //   the beginning of the screen space.
  230.                if (cpos > length)
  231.                   cpos = 0;
  232.             }
  233.             else {
  234.                // we will default to set the character always.
  235.                setIt = true;
  236.                // If we are in a special paste scenario then we check for valid
  237.                //   characters to paste.
  238.                if (special && (!Character.isLetter(c) && !Character.isDigit(c)))
  239.                   setIt = false;
  240.                // we will only push a character to the screen space if we are in
  241.                //  a field
  242.                if (isInField(cpos) && setIt) {
  243.                   planes.setChar(cpos, c);
  244.                   setDirty(cpos);
  245.                   screenFields.setCurrentFieldMDT();
  246.                }
  247.                //  If we placed a character then we go to the next position.
  248.                if (setIt)
  249.                   cpos++;
  250.                // we will append the information to our debug buffer.
  251.                pd.append(c);
  252.             }
  253.          }
  254.          // if we have anything else not logged then log it out.
  255.          if (pd.length() > 0)
  256.             log.info("pasted >" + pd + "<");
  257.          // restore out position within the FFT.
  258. screenFields.restoreCurrentField();
  259. updateDirty();
  260.          // restore our cursor position.
  261. setCursor(lr + 1, lc + 1);
  262. setCursorActive(true);
  263. } catch (Throwable exc) {
  264. log.warn("" + exc.getMessage());
  265. }
  266. }
  267. public final void copyField(int pos) {
  268. Clipboard cb = Toolkit.getDefaultToolkit().getSystemClipboard();
  269. StringBuffer s = new StringBuffer();
  270. screenFields.saveCurrentField();
  271. isInField(pos);
  272. log.debug("Copying");
  273. StringSelection contents = new StringSelection(screenFields
  274. .getCurrentFieldText());
  275. cb.setContents(contents, null);
  276. screenFields.restoreCurrentField();
  277. }
  278. /**
  279.  *
  280.  * Copy & Paste end code
  281.  *
  282.  */
  283. /**
  284.  * Sum them
  285.  *
  286.  * @param which
  287.  *            formatting option to use
  288.  * @return vector string of numberic values
  289.  */
  290. public final Vector sumThem(boolean which, Rectangle area) {
  291. StringBuffer s = new StringBuffer();
  292.       workR.setBounds(area);
  293. //      gui.rubberband.reset();
  294. //      gui.repaint();
  295. log.debug("Summing");
  296. // obtain the decimal format for parsing
  297. DecimalFormat df = (DecimalFormat) NumberFormat.getInstance();
  298. DecimalFormatSymbols dfs = df.getDecimalFormatSymbols();
  299. if (which) {
  300. dfs.setDecimalSeparator('.');
  301. dfs.setGroupingSeparator(',');
  302. } else {
  303. dfs.setDecimalSeparator(',');
  304. dfs.setGroupingSeparator('.');
  305. }
  306. df.setDecimalFormatSymbols(dfs);
  307. Vector sumVector = new Vector();
  308. // loop through all the screen characters to send them to the clip board
  309. int m = workR.x;
  310. int i = 0;
  311. int t = 0;
  312. double sum = 0.0;
  313. while (workR.height-- > 0) {
  314. t = workR.width;
  315. i = workR.y;
  316. while (t-- > 0) {
  317. // only copy printable numeric characters (in this case >= ' ')
  318. // char c = screen[getPos(m - 1, i - 1)].getChar();
  319. char c = planes.getChar(getPos(m - 1, i - 1));
  320. // if (((c >= '0' && c <= '9') || c == '.' || c == ',' || c == '-')
  321. // && !screen[getPos(m - 1, i - 1)].nonDisplay) {
  322.             // TODO: update me here to implement the nonDisplay check as well
  323. if (((c >= '0' && c <= '9') || c == '.' || c == ',' || c == '-')) {
  324. s.append(c);
  325. }
  326. i++;
  327. }
  328. if (s.length() > 0) {
  329. if (s.charAt(s.length() - 1) == '-') {
  330. s.insert(0, '-');
  331. s.deleteCharAt(s.length() - 1);
  332. }
  333. try {
  334. Number n = df.parse(s.toString());
  335. //               System.out.println(s + " " + n.doubleValue());
  336. sumVector.add(new Double(n.doubleValue()));
  337. sum += n.doubleValue();
  338. } catch (ParseException pe) {
  339. System.out.println(pe.getMessage() + " at "
  340. + pe.getErrorOffset());
  341. }
  342. }
  343. s.setLength(0);
  344. m++;
  345. }
  346. log.debug("" + sum);
  347. return sumVector;
  348. }
  349.    /**
  350.     * This will move the screen cursor based on the mouse event.
  351.     *
  352.     * I do not think the checks here for the gui characters should be here but
  353.     * will leave them here for now until we work out the interaction.  This
  354.     * should be up to the gui frontend in my opinion.
  355.     *
  356.     * @param e
  357.     * @param pos
  358.     */
  359. public boolean moveCursor(MouseEvent e, int pos) {
  360. if (!oia.isKeyBoardLocked()) {
  361. if (pos < 0)
  362. return false;
  363. // because getRowColFromPoint returns offset of 1,1 we need to
  364. //    translate to offset 0,0
  365. //         pos -= (numCols + 1);
  366.          int g = planes.getWhichGUI(pos);
  367. // lets check for hot spots
  368. if (g >= BUTTON_LEFT && g <= BUTTON_LAST) {
  369. StringBuffer aid = new StringBuffer();
  370. boolean aidFlag = true;
  371. switch (g) {
  372. case BUTTON_RIGHT:
  373. case BUTTON_MIDDLE:
  374. while (planes.getWhichGUI(--pos) != BUTTON_LEFT) {
  375. }
  376. case BUTTON_LEFT:
  377. if (planes.getChar(pos) == 'F') {
  378. pos++;
  379. } else
  380. aidFlag = false;
  381. if (planes.getChar(pos + 1) != '='
  382. && planes.getChar(pos + 1) != '.'
  383. && planes.getChar(pos + 1) != '/') {
  384. //                     System.out.println(" Hotspot clicked!!! we will send
  385. // characters " +
  386. //                                    screen[pos].getChar() +
  387. //                                    screen[pos+1].getChar());
  388. aid.append(planes.getChar(pos));
  389. aid.append(planes.getChar(pos + 1));
  390. } else {
  391. log.debug(" Hotspot clicked!!! we will send character "
  392. + planes.getChar(pos));
  393. aid.append(planes.getChar(pos));
  394. }
  395. break;
  396. }
  397. if (aidFlag) {
  398. switch (g) {
  399. case BUTTON_LEFT_UP:
  400. case BUTTON_MIDDLE_UP:
  401. case BUTTON_RIGHT_UP:
  402. case BUTTON_ONE_UP:
  403. case BUTTON_SB_UP:
  404. case BUTTON_SB_GUIDE:
  405. sessionVT.sendAidKey(tnvt.AID_ROLL_UP);
  406. break;
  407. case BUTTON_LEFT_DN:
  408. case BUTTON_MIDDLE_DN:
  409. case BUTTON_RIGHT_DN:
  410. case BUTTON_ONE_DN:
  411. case BUTTON_SB_DN:
  412. case BUTTON_SB_THUMB:
  413. sessionVT.sendAidKey(tnvt.AID_ROLL_DOWN);
  414. break;
  415. case BUTTON_LEFT_EB:
  416. case BUTTON_MIDDLE_EB:
  417. case BUTTON_RIGHT_EB:
  418. StringBuffer eb = new StringBuffer();
  419. while (planes.getWhichGUI(pos--) != BUTTON_LEFT_EB)
  420. ;
  421. while (planes.getWhichGUI(pos++) != BUTTON_RIGHT_EB) {
  422. eb.append(planes.getChar(pos));
  423. }
  424. org.tn5250j.tools.system.OperatingSystem.displayURL(eb
  425. .toString());
  426. // take out the log statement when we are sure it is
  427. // working
  428. log.info("Send to external Browser: " + eb.toString());
  429. break;
  430. default:
  431. int aidKey = Integer.parseInt(aid.toString());
  432. if (aidKey >= 1 && aidKey <= 12)
  433. sessionVT.sendAidKey(0x30 + aidKey);
  434. if (aidKey >= 13 && aidKey <= 24)
  435. sessionVT.sendAidKey(0xB0 + (aidKey - 12));
  436. }
  437. } else {
  438. if (screenFields.getCurrentField() != null) {
  439. int xPos = screenFields.getCurrentField().startPos();
  440. for (int x = 0; x < aid.length(); x++) {
  441. //                  System.out.println(sr + "," + (sc + x) + " " +
  442. // aid.charAt(x));
  443. planes.setChar(xPos + x , aid.charAt(x));
  444. }
  445. //                  System.out.println(aid);
  446. screenFields.setCurrentFieldMDT();
  447. sessionVT.sendAidKey(tnvt.AID_ENTER);
  448. }
  449. }
  450.             // return back to the calling routine that the cursor was not moved
  451.             // but something else here was done like aid keys or the such
  452.             return false;
  453. }
  454.          else {
  455. // this is a note to not execute this code here when we
  456. // implement
  457. //   the remain after edit function option.
  458. // if (gui.rubberband.isAreaSelected()) {
  459. // gui.rubberband.reset();
  460. // gui.repaint();
  461. // } else {
  462. goto_XY(pos);
  463. isInField(lastPos);
  464.                // return back to the calling object that the cursor was indeed
  465.                //  moved with in the screen object
  466.                return true;
  467. // }
  468. }
  469. }
  470.       return false;
  471. }
  472. public void setVT(tnvt v) {
  473. sessionVT = v;
  474. }
  475. /**
  476.  * Searches the mnemonicData array looking for the specified string. If it
  477.  * is found it will return the value associated from the mnemonicValue
  478.  *
  479.  * @see #sendKeys
  480.  * @param mnem
  481.  *            string mnemonic value
  482.  * @return key value of Mnemonic
  483.  */
  484. private int getMnemonicValue(String mnem) {
  485. for (int x = 0; x < mnemonicData.length; x++) {
  486. if (mnemonicData[x].equals(mnem))
  487. return mnemonicValue[x];
  488. }
  489. return 0;
  490. }
  491. protected void setPrehelpState(boolean setErrorCode, boolean lockKeyboard,
  492. boolean unlockIfLocked) {
  493. statusErrorCode = setErrorCode;
  494. if (oia.isKeyBoardLocked() && unlockIfLocked)
  495. oia.setKeyBoardLocked(false);
  496. else
  497. oia.setKeyBoardLocked(lockKeyboard);
  498. bufferedKeys = null;
  499.       oia.setKeysBuffered(false);
  500. }
  501. /**
  502.  * Activate the cursor on screen
  503.  *
  504.  * @param activate
  505.  */
  506. public void setCursorActive(boolean activate) {
  507. //      System.out.println("cursor active " + updateCursorLoc + " " +
  508. // cursorActive + " " + activate);
  509. if (cursorActive && !activate) {
  510. setCursorOff();
  511. cursorActive = activate;
  512. } else {
  513. if (!cursorActive && activate) {
  514. cursorActive = activate;
  515. setCursorOn();
  516. }
  517. }
  518. }
  519. /**
  520.  * Set the cursor on
  521.  */
  522. public void setCursorOn() {
  523. cursorShown = true;
  524. updateCursorLoc();
  525. }
  526. /**
  527.  * Set the cursor off
  528.  */
  529. public void setCursorOff() {
  530. cursorShown = false;
  531. updateCursorLoc();
  532. //      System.out.println("cursor off " + updateCursorLoc + " " +
  533. // cursorActive);
  534. }
  535. /**
  536.  *
  537.  */
  538. private void updateCursorLoc() {
  539. if (cursorActive) {
  540.          fireCursorChanged(3);
  541. }
  542. }
  543. //Added by Barry
  544. public String getKeys() {
  545. String result = this.keybuf.toString();
  546. this.keybuf = new StringBuffer();
  547. return result;
  548. }
  549. /**
  550.  * The sendKeys method sends a string of keys to the virtual screen. This
  551.  * method acts as if keystrokes were being typed from the keyboard. The
  552.  * keystrokes will be sent to the location given. The string being passed
  553.  * can also contain mnemonic values such as [enter] enter key,[tab] tab key,
  554.  * [pf1] pf1 etc...
  555.  *
  556.  * These will be processed as if you had pressed these keys from the
  557.  * keyboard. All the valid special key values are contained in the MNEMONIC
  558.  * enumeration:
  559.  *
  560.  * <table BORDER COLS=2 WIDTH="50%" >
  561.  *
  562.  * <tr>
  563.  * <td>MNEMONIC_CLEAR</td>
  564.  * <td>[clear]</td>
  565.  * </tr>
  566.  * <tr>
  567.  * <td>MNEMONIC_ENTER</td>
  568.  * <td>[enter]</td>
  569.  * </tr>
  570.  * <tr>
  571.  * <td>MNEMONIC_HELP</td>
  572.  * <td>[help]</td>
  573.  * </tr>
  574.  * <tr>
  575.  * <td>MNEMONIC_PAGE_DOWN</td>
  576.  * <td>[pgdown]</td>
  577.  * </tr>
  578.  * <tr>
  579.  * <td>MNEMONIC_PAGE_UP</td>
  580.  * <td>[pgup]</td>
  581.  * </tr>
  582.  * <tr>
  583.  * <td>MNEMONIC_PRINT</td>
  584.  * <td>[print]</td>
  585.  * </tr>
  586.  * <tr>
  587.  * <td>MNEMONIC_PF1</td>
  588.  * <td>[pf1]</td>
  589.  * </tr>
  590.  * <tr>
  591.  * <td>MNEMONIC_PF2</td>
  592.  * <td>[pf2]</td>
  593.  * </tr>
  594.  * <tr>
  595.  * <td>MNEMONIC_PF3</td>
  596.  * <td>[pf3]</td>
  597.  * </tr>
  598.  * <tr>
  599.  * <td>MNEMONIC_PF4</td>
  600.  * <td>[pf4]</td>
  601.  * </tr>
  602.  * <tr>
  603.  * <td>MNEMONIC_PF5</td>
  604.  * <td>[pf5]</td>
  605.  * </tr>
  606.  * <tr>
  607.  * <td>MNEMONIC_PF6</td>
  608.  * <td>[pf6]</td>
  609.  * </tr>
  610.  * <tr>
  611.  * <td>MNEMONIC_PF7</td>
  612.  * <td>[pf7]</td>
  613.  * </tr>
  614.  * <tr>
  615.  * <td>MNEMONIC_PF8</td>
  616.  * <td>[pf8]</td>
  617.  * </tr>
  618.  * <tr>
  619.  * <td>MNEMONIC_PF9</td>
  620.  * <td>[pf9]</td>
  621.  * </tr>
  622.  * <tr>
  623.  * <td>MNEMONIC_PF10</td>
  624.  * <td>[pf10]</td>
  625.  * </tr>
  626.  * <tr>
  627.  * <td>MNEMONIC_PF11</td>
  628.  * <td>[pf11]</td>
  629.  * </tr>
  630.  * <tr>
  631.  * <td>MNEMONIC_PF12</td>
  632.  * <td>[pf12]</td>
  633.  * </tr>
  634.  * <tr>
  635.  * <td>MNEMONIC_PF13</td>
  636.  * <td>[pf13]</td>
  637.  * </tr>
  638.  * <tr>
  639.  * <td>MNEMONIC_PF14</td>
  640.  * <td>[pf14]</td>
  641.  * </tr>
  642.  * <tr>
  643.  * <td>MNEMONIC_PF15</td>
  644.  * <td>[pf15]</td>
  645.  * </tr>
  646.  * <tr>
  647.  * <td>MNEMONIC_PF16</td>
  648.  * <td>[pf16]</td>
  649.  * </tr>
  650.  * <tr>
  651.  * <td>MNEMONIC_PF17</td>
  652.  * <td>[pf17]</td>
  653.  * </tr>
  654.  * <tr>
  655.  * <td>MNEMONIC_PF18</td>
  656.  * <td>[pf18]</td>
  657.  * </tr>
  658.  * <tr>
  659.  * <td>MNEMONIC_PF19</td>
  660.  * <td>[pf19]</td>
  661.  * </tr>
  662.  * <tr>
  663.  * <td>MNEMONIC_PF20</td>
  664.  * <td>[pf20]</td>
  665.  * </tr>
  666.  * <tr>
  667.  * <td>MNEMONIC_PF21</td>
  668.  * <td>[pf21]</td>
  669.  * </tr>
  670.  * <tr>
  671.  * <td>MNEMONIC_PF22</td>
  672.  * <td>[pf22]</td>
  673.  * </tr>
  674.  * <tr>
  675.  * <td>MNEMONIC_PF23</td>
  676.  * <td>[pf23]</td>
  677.  * </tr>
  678.  * <tr>
  679.  * <td>MNEMONIC_PF24</td>
  680.  * <td>[pf24]</td>
  681.  * </tr>
  682.  * <tr>
  683.  * <td>MNEMONIC_BACK_SPACE</td>
  684.  * <td>[backspace]</td>
  685.  * </tr>
  686.  * <tr>
  687.  * <td>MNEMONIC_BACK_TAB</td>
  688.  * <td>[backtab]</td>
  689.  * </tr>
  690.  * <tr>
  691.  * <td>MNEMONIC_UP</td>
  692.  * <td>[up]</td>
  693.  * </tr>
  694.  * <tr>
  695.  * <td>MNEMONIC_DOWN</td>
  696.  * <td>[down]</td>
  697.  * </tr>
  698.  * <tr>
  699.  * <td>MNEMONIC_LEFT</td>
  700.  * <td>[left]</td>
  701.  * </tr>
  702.  * <tr>
  703.  * <td>MNEMONIC_RIGHT</td>
  704.  * <td>[right]</td>
  705.  * </tr>
  706.  * <tr>
  707.  * <td>MNEMONIC_DELETE</td>
  708.  * <td>[delete]</td>
  709.  * </tr>
  710.  * <tr>
  711.  * <td>MNEMONIC_TAB</td>
  712.  * <td>"[tab]</td>
  713.  * </tr>
  714.  * <tr>
  715.  * <td>MNEMONIC_END_OF_FIELD</td>
  716.  * <td>[eof]</td>
  717.  * </tr>
  718.  * <tr>
  719.  * <td>MNEMONIC_ERASE_EOF</td>
  720.  * <td>[eraseeof]</td>
  721.  * </tr>
  722.  * <tr>
  723.  * <td>MNEMONIC_ERASE_FIELD</td>
  724.  * <td>[erasefld]</td>
  725.  * </tr>
  726.  * <tr>
  727.  * <td>MNEMONIC_INSERT</td>
  728.  * <td>[insert]</td>
  729.  * </tr>
  730.  * <tr>
  731.  * <td>MNEMONIC_HOME</td>
  732.  * <td>[home]</td>
  733.  * </tr>
  734.  * <tr>
  735.  * <td>MNEMONIC_KEYPAD0</td>
  736.  * <td>[keypad0]</td>
  737.  * </tr>
  738.  * <tr>
  739.  * <td>MNEMONIC_KEYPAD1</td>
  740.  * <td>[keypad1]</td>
  741.  * </tr>
  742.  * <tr>
  743.  * <td>MNEMONIC_KEYPAD2</td>
  744.  * <td>[keypad2]</td>
  745.  * </tr>
  746.  * <tr>
  747.  * <td>MNEMONIC_KEYPAD3</td>
  748.  * <td>[keypad3]</td>
  749.  * </tr>
  750.  * <tr>
  751.  * <td>MNEMONIC_KEYPAD4</td>
  752.  * <td>[keypad4]</td>
  753.  * </tr>
  754.  * <tr>
  755.  * <td>MNEMONIC_KEYPAD5</td>
  756.  * <td>[keypad5]</td>
  757.  * </tr>
  758.  * <tr>
  759.  * <td>MNEMONIC_KEYPAD6</td>
  760.  * <td>[keypad6]</td>
  761.  * </tr>
  762.  * <tr>
  763.  * <td>MNEMONIC_KEYPAD7</td>
  764.  * <td>[keypad7]</td>
  765.  * </tr>
  766.  * <tr>
  767.  * <td>MNEMONIC_KEYPAD8</td>
  768.  * <td>[keypad8]</td>
  769.  * </tr>
  770.  * <tr>
  771.  * <td>MNEMONIC_KEYPAD9</td>
  772.  * <td>[keypad9]</td>
  773.  * </tr>
  774.  * <tr>
  775.  * <td>MNEMONIC_KEYPAD_PERIOD</td>
  776.  * <td>[keypad.]</td>
  777.  * </tr>
  778.  * <tr>
  779.  * <td>MNEMONIC_KEYPAD_COMMA</td>
  780.  * <td>[keypad,]</td>
  781.  * </tr>
  782.  * <tr>
  783.  * <td>MNEMONIC_KEYPAD_MINUS</td>
  784.  * <td>[keypad-]</td>
  785.  * </tr>
  786.  * <tr>
  787.  * <td>MNEMONIC_FIELD_EXIT</td>
  788.  * <td>[fldext]</td>
  789.  * </tr>
  790.  * <tr>
  791.  * <td>MNEMONIC_FIELD_PLUS</td>
  792.  * <td>[field+]</td>
  793.  * </tr>
  794.  * <tr>
  795.  * <td>MNEMONIC_FIELD_MINUS</td>
  796.  * <td>[field-]</td>
  797.  * </tr>
  798.  * <tr>
  799.  * <td>MNEMONIC_BEGIN_OF_FIELD</td>
  800.  * <td>[bof]</td>
  801.  * </tr>
  802.  * <tr>
  803.  * <td>MNEMONIC_PA1</td>
  804.  * <td>[pa1]</td>
  805.  * </tr>
  806.  * <tr>
  807.  * <td>MNEMONIC_PA2</td>
  808.  * <td>[pa2]</td>
  809.  * </tr>
  810.  * <tr>
  811.  * <td>MNEMONIC_PA3</td>
  812.  * <td>[pa3]</td>
  813.  * </tr>
  814.  * <tr>
  815.  * <td>MNEMONIC_SYSREQ</td>
  816.  * <td>[sysreq]</td>
  817.  * </tr>
  818.  * <tr>
  819.  * <td>MNEMONIC_RESET</td>
  820.  * <td>[reset]</td>
  821.  * </tr>
  822.  * <tr>
  823.  * <td>MNEMONIC_ATTN</td>
  824.  * <td>[attn]</td>
  825.  * </tr>
  826.  * <tr>
  827.  * <td>MNEMONIC_MARK_LEFT</td>
  828.  * <td>[markleft]</td>
  829.  * </tr>
  830.  * <tr>
  831.  * <td>MNEMONIC_MARK_RIGHT</td>
  832.  * <td>[markright]</td>
  833.  * </tr>
  834.  * <tr>
  835.  * <td>MNEMONIC_MARK_UP</td>
  836.  * <td>[markup]</td>
  837.  * </tr>
  838.  * <tr>
  839.  * <td>MNEMONIC_MARK_DOWN</td>
  840.  * <td>[markdown]</td>
  841.  * </tr>
  842.  *
  843.  * </table>
  844.  *
  845.  * @param text
  846.  *            The string of characters to be sent
  847.  *
  848.  * @see #sendAid
  849.  *
  850.  * Added synchronized to fix a StringOutOfBounds error - Luc Gorren LDC
  851.  */
  852. public synchronized void sendKeys(String text) {
  853. //      if (text == null) {
  854. //         return;
  855. //      }
  856. this.keybuf.append(text);
  857. if (isStatusErrorCode() && !resetRequired) {
  858. setCursorActive(false);
  859. simulateMnemonic(getMnemonicValue("[reset]"));
  860. setCursorActive(true);
  861. }
  862. if (oia.isKeyBoardLocked()) {
  863. if (text.equals("[reset]") || text.equals("[sysreq]")
  864. || text.equals("[attn]")) {
  865. setCursorActive(false);
  866. simulateMnemonic(getMnemonicValue(text));
  867. setCursorActive(true);
  868. } else {
  869. if (isStatusErrorCode()) {
  870. Toolkit.getDefaultToolkit().beep();
  871. return;
  872. }
  873.             oia.setKeysBuffered(true);
  874. if (bufferedKeys == null) {
  875. bufferedKeys = text;
  876. return;
  877. } else {
  878. bufferedKeys += text;
  879. return;
  880. }
  881. }
  882. } else {
  883. if (oia.isKeysBuffered()) {
  884. if (bufferedKeys != null) {
  885. text = bufferedKeys + text;
  886. }
  887. //            if (text.length() == 0) {
  888. oia.setKeysBuffered(false);
  889. //            }
  890. bufferedKeys = null;
  891. }
  892. // check to see if position is in a field and if it is then change
  893. //   current field to that field
  894. isInField(lastPos, true);
  895. if (text.length() == 1 && !text.equals("[") && !text.equals("]")) {
  896. //               setCursorOff2();
  897. setCursorActive(false);
  898. simulateKeyStroke(text.charAt(0));
  899. setCursorActive(true);
  900. //               setCursorOn2();
  901. //                     System.out.println(" text one");
  902. } else {
  903. strokenizer.setKeyStrokes(text);
  904. String s;
  905. boolean done = false;
  906. //            setCursorOff2();
  907. setCursorActive(false);
  908. while (!done) {
  909. //            while (strokenizer.hasMoreKeyStrokes() && !keyboardLocked
  910. // &&
  911. //                        !isStatusErrorCode() && !done) {
  912. if (strokenizer.hasMoreKeyStrokes()) {
  913. // check to see if position is in a field and if it is
  914. // then change
  915. //   current field to that field
  916. isInField(lastPos, true);
  917. s = strokenizer.nextKeyStroke();
  918. if (s.length() == 1) {
  919. //                  setCursorOn();
  920. //                  if (!keysBuffered) {
  921. //                     System.out.println(" s two" + s);
  922. //                     setCursorOn();
  923. //                  }
  924. //                  try { new Thread().sleep(400);} catch
  925. // (InterruptedException ie) {}
  926. simulateKeyStroke(s.charAt(0));
  927. //                     System.out.println(" s two " + s + " " +
  928. // cursorActive);
  929. //                  if (cursorActive && !keysBuffered) {
  930. //                     System.out.println(" s two" + s);
  931. //                     setCursorOn();
  932. //                  }
  933. } else {
  934. if (s != null) {
  935. simulateMnemonic(getMnemonicValue(s));
  936. //                  if (!cursorActive && !keysBuffered) {
  937. //                     System.out.println(" m one");
  938. //                     setCursorOn();
  939. //                  }
  940. } else
  941. log.info(" send keys mnemonic " + s);
  942. }
  943. if (oia.isKeyBoardLocked()) {
  944. bufferedKeys = strokenizer
  945. .getUnprocessedKeyStroked();
  946. if (bufferedKeys != null) {
  947.                         oia.setKeysBuffered(true);
  948. }
  949. done = true;
  950. }
  951. }
  952. else {
  953. //                  setCursorActive(true);
  954. //                  setCursorOn();
  955. done = true;
  956. }
  957. }
  958. setCursorActive(true);
  959. }
  960. }
  961. }
  962. /**
  963.  * The sendAid method sends an "aid" keystroke to the virtual screen. These
  964.  * aid keys can be thought of as special keystrokes, like the Enter key,
  965.  * PF1-24 keys or the Page Up key. All the valid special key values are
  966.  * contained in the AID_ enumeration:
  967.  *
  968.  * @param aidKey
  969.  *            The aid key to be sent to the host
  970.  *
  971.  * @see #sendKeys
  972.  * @see TN5250jConstants#AID_CLEAR
  973.  * @see #AID_ENTER
  974.  * @see #AID_HELP
  975.  * @see #AID_ROLL_UP
  976.  * @see #AID_ROLL_DOWN
  977.  * @see #AID_ROLL_LEFT
  978.  * @see #AID_ROLL_RIGHT
  979.  * @see #AID_PRINT
  980.  * @see #AID_PF1
  981.  * @see #AID_PF2
  982.  * @see #AID_PF3
  983.  * @see #AID_PF4
  984.  * @see #AID_PF5
  985.  * @see #AID_PF6
  986.  * @see #AID_PF7
  987.  * @see #AID_PF8
  988.  * @see #AID_PF9
  989.  * @see #AID_PF10
  990.  * @see #AID_PF11
  991.  * @see #AID_PF12
  992.  * @see #AID_PF13
  993.  * @see #AID_PF14
  994.  * @see #AID_PF15
  995.  * @see #AID_PF16
  996.  * @see #AID_PF17
  997.  * @see #AID_PF18
  998.  * @see #AID_PF19
  999.  * @see #AID_PF20
  1000.  * @see #AID_PF21
  1001.  * @see #AID_PF22
  1002.  * @see #AID_PF23
  1003.  * @see #AID_PF24
  1004.  */
  1005. public void sendAid(int aidKey) {
  1006. sessionVT.sendAidKey(aidKey);
  1007. }
  1008. /**
  1009.  * Restores the error line and sets the error mode off.
  1010.  *
  1011.  */
  1012. protected void resetError() {
  1013. restoreErrorLine();
  1014. setStatus(STATUS_ERROR_CODE, STATUS_VALUE_OFF, "");
  1015. }
  1016. protected boolean simulateMnemonic(int mnem) {
  1017. boolean simulated = false;
  1018. switch (mnem) {
  1019. case AID_CLEAR:
  1020. case AID_ENTER:
  1021. case AID_PF1:
  1022. case AID_PF2:
  1023. case AID_PF3:
  1024. case AID_PF4:
  1025. case AID_PF5:
  1026. case AID_PF6:
  1027. case AID_PF7:
  1028. case AID_PF8:
  1029. case AID_PF9:
  1030. case AID_PF10:
  1031. case AID_PF11:
  1032. case AID_PF12:
  1033. case AID_PF13:
  1034. case AID_PF14:
  1035. case AID_PF15:
  1036. case AID_PF16:
  1037. case AID_PF17:
  1038. case AID_PF18:
  1039. case AID_PF19:
  1040. case AID_PF20:
  1041. case AID_PF21:
  1042. case AID_PF22:
  1043. case AID_PF23:
  1044. case AID_PF24:
  1045. case AID_ROLL_DOWN:
  1046. case AID_ROLL_UP:
  1047. case AID_ROLL_LEFT:
  1048. case AID_ROLL_RIGHT:
  1049. if (!screenFields.isCanSendAid()) {
  1050. displayError(ERR_ENTER_NO_ALLOWED);
  1051. } else
  1052. sendAid(mnem);
  1053. simulated = true;
  1054. break;
  1055. case AID_HELP:
  1056. sessionVT.sendHelpRequest();
  1057. simulated = true;
  1058. break;
  1059. case AID_PRINT:
  1060. sessionVT.hostPrint(1);
  1061. simulated = true;
  1062. break;
  1063. case BACK_SPACE:
  1064. if (screenFields.getCurrentField() != null
  1065. && screenFields.withinCurrentField(lastPos)
  1066. && !screenFields.isCurrentFieldBypassField()) {
  1067. if (screenFields.getCurrentField().startPos() == lastPos) {
  1068.                if (backspaceError)
  1069.    displayError(ERR_CURSOR_PROTECTED);
  1070.                else {
  1071.                   gotoFieldPrev();
  1072.                   goto_XY(screenFields.getCurrentField().endPos());
  1073.                   updateDirty();
  1074.                }
  1075. }
  1076. else {
  1077. screenFields.getCurrentField().getKeyPos(lastPos);
  1078. screenFields.getCurrentField().changePos(-1);
  1079. resetDirty(screenFields.getCurrentField().getCurrentPos());
  1080. shiftLeft(screenFields.getCurrentField().getCurrentPos());
  1081. updateDirty();
  1082. screenFields.setCurrentFieldMDT();
  1083. simulated = true;
  1084. }
  1085. } else {
  1086. displayError(ERR_CURSOR_PROTECTED);
  1087. }
  1088. break;
  1089. case BACK_TAB:
  1090. if (screenFields.getCurrentField() != null
  1091. && screenFields.isCurrentFieldHighlightedEntry()) {
  1092. resetDirty(screenFields.getCurrentField().startPos);
  1093. gotoFieldPrev();
  1094. updateDirty();
  1095. } else
  1096. gotoFieldPrev();
  1097. if (screenFields.isCurrentFieldContinued()) {
  1098. do {
  1099. gotoFieldPrev();
  1100. } while (screenFields.isCurrentFieldContinuedMiddle()
  1101. || screenFields.isCurrentFieldContinuedLast());
  1102. }
  1103. isInField(lastPos);
  1104. simulated = true;
  1105. break;
  1106. case UP:
  1107. case MARK_UP:
  1108. process_XY(lastPos - numCols);
  1109. simulated = true;
  1110. break;
  1111. case DOWN:
  1112. case MARK_DOWN:
  1113. process_XY(lastPos + numCols);
  1114. simulated = true;
  1115. break;
  1116. case LEFT:
  1117. case MARK_LEFT:
  1118. process_XY(lastPos - 1);
  1119. simulated = true;
  1120. break;
  1121. case RIGHT:
  1122. case MARK_RIGHT:
  1123. process_XY(lastPos + 1);
  1124. simulated = true;
  1125. break;
  1126. case NEXTWORD:
  1127. gotoNextWord();
  1128. simulated = true;
  1129. break;
  1130. case PREVWORD:
  1131. gotoPrevWord();
  1132. simulated = true;
  1133. break;
  1134. case DELETE:
  1135. if (screenFields.getCurrentField() != null
  1136. && screenFields.withinCurrentField(lastPos)
  1137. && !screenFields.isCurrentFieldBypassField()) {
  1138. resetDirty(lastPos);
  1139. screenFields.getCurrentField().getKeyPos(lastPos);
  1140. shiftLeft(screenFields.getCurrentFieldPos());
  1141. screenFields.setCurrentFieldMDT();
  1142. updateDirty();
  1143. simulated = true;
  1144. } else {
  1145. displayError(ERR_CURSOR_PROTECTED);
  1146. }
  1147. break;
  1148. case TAB:
  1149. if (screenFields.getCurrentField() != null
  1150. && !screenFields.isCurrentFieldContinued()) {
  1151. if (screenFields.isCurrentFieldHighlightedEntry()) {
  1152. resetDirty(screenFields.getCurrentField().startPos);
  1153. gotoFieldNext();
  1154. updateDirty();
  1155. } else
  1156. gotoFieldNext();
  1157. } else {
  1158. do {
  1159. gotoFieldNext();
  1160. } while (screenFields.getCurrentField() != null
  1161. && (screenFields.isCurrentFieldContinuedMiddle() || screenFields
  1162. .isCurrentFieldContinuedLast()));
  1163. }
  1164. isInField(lastPos);
  1165. simulated = true;
  1166. break;
  1167. case EOF:
  1168. if (screenFields.getCurrentField() != null
  1169. && screenFields.withinCurrentField(lastPos)
  1170. && !screenFields.isCurrentFieldBypassField()) {
  1171. int where = endOfField(screenFields.getCurrentField()
  1172. .startPos(), true);
  1173. if (where > 0) {
  1174. setCursor((where / numCols) + 1, (where % numCols) + 1);
  1175. }
  1176. simulated = true;
  1177. } else {
  1178. displayError(ERR_CURSOR_PROTECTED);
  1179. }
  1180. resetDirty(lastPos);
  1181. break;
  1182. case ERASE_EOF:
  1183. if (screenFields.getCurrentField() != null
  1184. && screenFields.withinCurrentField(lastPos)
  1185. && !screenFields.isCurrentFieldBypassField()) {
  1186. int where = lastPos;
  1187. resetDirty(lastPos);
  1188. if (fieldExit()) {
  1189. screenFields.setCurrentFieldMDT();
  1190. if (!screenFields.isCurrentFieldContinued()) {
  1191. gotoFieldNext();
  1192. } else {
  1193. do {
  1194. gotoFieldNext();
  1195. if (screenFields.isCurrentFieldContinued())
  1196. fieldExit();
  1197. } while (screenFields.isCurrentFieldContinuedMiddle()
  1198. || screenFields.isCurrentFieldContinuedLast());
  1199. }
  1200. }
  1201. updateDirty();
  1202. goto_XY(where);
  1203. simulated = true;
  1204. } else {
  1205. displayError(ERR_CURSOR_PROTECTED);
  1206. }
  1207. break;
  1208. case ERASE_FIELD:
  1209. if (screenFields.getCurrentField() != null
  1210. && screenFields.withinCurrentField(lastPos)
  1211. && !screenFields.isCurrentFieldBypassField()) {
  1212. int where = lastPos;
  1213. lastPos = screenFields.getCurrentField().startPos();
  1214. resetDirty(lastPos);
  1215. if (fieldExit()) {
  1216. screenFields.setCurrentFieldMDT();
  1217. if (!screenFields.isCurrentFieldContinued()) {
  1218. gotoFieldNext();
  1219. } else {
  1220. do {
  1221. gotoFieldNext();
  1222. if (screenFields.isCurrentFieldContinued())
  1223. fieldExit();
  1224. } while (screenFields.isCurrentFieldContinuedMiddle()
  1225. || screenFields.isCurrentFieldContinuedLast());
  1226. }
  1227. }
  1228. updateDirty();
  1229. goto_XY(where);
  1230. simulated = true;
  1231. } else {
  1232. displayError(ERR_CURSOR_PROTECTED);
  1233. }
  1234. break;
  1235. case INSERT:
  1236. // we toggle it
  1237. oia.setInsertMode(oia.isInsertMode() ? false : true);
  1238. break;
  1239. case HOME:
  1240. // position to the home position set
  1241. if (lastPos + numCols + 1 != homePos) {
  1242. goto_XY(homePos - numCols - 1);
  1243. // now check if we are in a field
  1244. isInField(lastPos);
  1245. } else
  1246. gotoField(1);
  1247. break;
  1248. case KEYPAD_0:
  1249. simulated = simulateKeyStroke('0');
  1250. break;
  1251. case KEYPAD_1:
  1252. simulated = simulateKeyStroke('1');
  1253. break;
  1254. case KEYPAD_2:
  1255. simulated = simulateKeyStroke('2');
  1256. break;
  1257. case KEYPAD_3:
  1258. simulated = simulateKeyStroke('3');
  1259. break;
  1260. case KEYPAD_4:
  1261. simulated = simulateKeyStroke('4');
  1262. break;
  1263. case KEYPAD_5:
  1264. simulated = simulateKeyStroke('5');
  1265. break;
  1266. case KEYPAD_6:
  1267. simulated = simulateKeyStroke('6');
  1268. break;
  1269. case KEYPAD_7:
  1270. simulated = simulateKeyStroke('7');
  1271. break;
  1272. case KEYPAD_8:
  1273. simulated = simulateKeyStroke('8');
  1274. break;
  1275. case KEYPAD_9:
  1276. simulated = simulateKeyStroke('9');
  1277. break;
  1278. case KEYPAD_PERIOD:
  1279. simulated = simulateKeyStroke('.');
  1280. break;
  1281. case KEYPAD_COMMA:
  1282. simulated = simulateKeyStroke(',');
  1283. break;
  1284. case KEYPAD_MINUS:
  1285. if (screenFields.getCurrentField() != null
  1286. && screenFields.withinCurrentField(lastPos)
  1287. && !screenFields.isCurrentFieldBypassField()) {
  1288. int s = screenFields.getCurrentField().getFieldShift();
  1289. if (s == 3 || s == 5 || s == 7) {
  1290.                planes.setChar(lastPos,'-');
  1291. resetDirty(lastPos);
  1292. advancePos();
  1293. if (fieldExit()) {
  1294. screenFields.setCurrentFieldMDT();
  1295. if (!screenFields.isCurrentFieldContinued()) {
  1296. gotoFieldNext();
  1297. } else {
  1298. do {
  1299. gotoFieldNext();
  1300. } while (screenFields
  1301. .isCurrentFieldContinuedMiddle()
  1302. || screenFields
  1303. .isCurrentFieldContinuedLast());
  1304. }
  1305. simulated = true;
  1306. updateDirty();
  1307. if (screenFields.isCurrentFieldAutoEnter())
  1308. sendAid(AID_ENTER);
  1309. }
  1310. } else {
  1311. displayError(ERR_FIELD_MINUS);
  1312. }
  1313. } else {
  1314. displayError(ERR_CURSOR_PROTECTED);
  1315. }
  1316. break;
  1317. case FIELD_EXIT:
  1318. if (screenFields.getCurrentField() != null
  1319. && screenFields.withinCurrentField(lastPos)
  1320. && !screenFields.isCurrentFieldBypassField()) {
  1321. resetDirty(lastPos);
  1322. boolean autoFE = screenFields.isCurrentFieldAutoEnter();
  1323. if (fieldExit()) {
  1324. screenFields.setCurrentFieldMDT();
  1325. if (!screenFields.isCurrentFieldContinued() &&
  1326.       !screenFields.isCurrentFieldAutoEnter()) {
  1327. gotoFieldNext();
  1328. } else {
  1329. do {
  1330. gotoFieldNext();
  1331. if (screenFields.isCurrentFieldContinued())
  1332. fieldExit();
  1333. } while (screenFields.isCurrentFieldContinuedMiddle()
  1334. || screenFields.isCurrentFieldContinuedLast());
  1335. }
  1336. }
  1337. updateDirty();
  1338. simulated = true;
  1339. if (autoFE)
  1340. sendAid(AID_ENTER);
  1341. } else {
  1342. displayError(ERR_CURSOR_PROTECTED);
  1343. }
  1344. break;
  1345. case FIELD_PLUS:
  1346. if (screenFields.getCurrentField() != null
  1347. && screenFields.withinCurrentField(lastPos)
  1348. && !screenFields.isCurrentFieldBypassField()) {
  1349. resetDirty(lastPos);
  1350. boolean autoFE = screenFields.isCurrentFieldAutoEnter();
  1351. if (fieldExit()) {
  1352. screenFields.setCurrentFieldMDT();
  1353. if (!screenFields.isCurrentFieldContinued() &&
  1354.       !screenFields.isCurrentFieldAutoEnter()) {
  1355. gotoFieldNext();
  1356. } else {
  1357. do {
  1358. gotoFieldNext();
  1359. } while (screenFields.isCurrentFieldContinuedMiddle()
  1360. || screenFields.isCurrentFieldContinuedLast());
  1361. }
  1362. }
  1363. updateDirty();
  1364. simulated = true;
  1365. if (autoFE)
  1366. sendAid(AID_ENTER);
  1367. } else {
  1368. displayError(ERR_CURSOR_PROTECTED);
  1369. }
  1370. break;
  1371. case FIELD_MINUS:
  1372. if (screenFields.getCurrentField() != null
  1373.                && screenFields.withinCurrentField(lastPos)
  1374.                && !screenFields.isCurrentFieldBypassField()) {
  1375.             int s = screenFields.getCurrentField().getFieldShift();
  1376.             if (s == 3 || s == 5 || s == 7) {
  1377.                planes.setChar(lastPos, '-');
  1378.                resetDirty(lastPos);
  1379.                advancePos();
  1380.                boolean autoFE = screenFields.isCurrentFieldAutoEnter();
  1381.                if (fieldExit()) {
  1382.                   screenFields.setCurrentFieldMDT();
  1383.                   if (!screenFields.isCurrentFieldContinued()
  1384.                         && !screenFields.isCurrentFieldAutoEnter()) {
  1385.                      gotoFieldNext();
  1386.                   }
  1387.                   else {
  1388.                      do {
  1389.                         gotoFieldNext();
  1390.                      }
  1391.                      while (screenFields.isCurrentFieldContinuedMiddle()
  1392.                            || screenFields.isCurrentFieldContinuedLast());
  1393.                   }
  1394.                }
  1395.                updateDirty();
  1396.                simulated = true;
  1397.                if (autoFE)
  1398.                   sendAid(AID_ENTER);
  1399.             }
  1400.             else {
  1401.                displayError(ERR_FIELD_MINUS);
  1402.             }
  1403.          }
  1404.          else {
  1405.             displayError(ERR_CURSOR_PROTECTED);
  1406.          }
  1407.          break;
  1408. case BOF:
  1409. if (screenFields.getCurrentField() != null
  1410. && screenFields.withinCurrentField(lastPos)
  1411. && !screenFields.isCurrentFieldBypassField()) {
  1412. int where = screenFields.getCurrentField().startPos();
  1413. if (where > 0) {
  1414. goto_XY(where);
  1415. }
  1416. simulated = true;
  1417. } else {
  1418. displayError(ERR_CURSOR_PROTECTED);
  1419. }
  1420. resetDirty(lastPos);
  1421. break;
  1422. case SYSREQ:
  1423. sessionVT.systemRequest();
  1424. simulated = true;
  1425. break;
  1426. case RESET:
  1427. if (isStatusErrorCode()) {
  1428. resetError();
  1429. isInField(lastPos);
  1430. updateDirty();
  1431. } else {
  1432. setPrehelpState(false, oia.isKeyBoardLocked(), false);
  1433. }
  1434. simulated = true;
  1435. break;
  1436. case ATTN:
  1437. sessionVT.sendAttentionKey();
  1438. simulated = true;
  1439. break;
  1440. case DUP_FIELD:
  1441. if (screenFields.getCurrentField() != null
  1442. && screenFields.withinCurrentField(lastPos)
  1443. && !screenFields.isCurrentFieldBypassField()) {
  1444. if (screenFields.isCurrentFieldDupEnabled()) {
  1445. resetDirty(lastPos);
  1446. screenFields.getCurrentField().setFieldChar(lastPos,
  1447. (char) 0x1C);
  1448. screenFields.setCurrentFieldMDT();
  1449. gotoFieldNext();
  1450. updateDirty();
  1451. simulated = true;
  1452. } else {
  1453. displayError(ERR_DUP_KEY_NOT_ALLOWED);
  1454. }
  1455. } else {
  1456. displayError(ERR_CURSOR_PROTECTED);
  1457. }
  1458. break;
  1459. case NEW_LINE:
  1460. if (screenFields.getSize() > 0) {
  1461. int startRow = getRow(lastPos) + 1;
  1462. int startPos = lastPos;
  1463. boolean isthere = false;
  1464. if (startRow == getRows())
  1465. startRow = 0;
  1466. setCursor(++startRow, 1);
  1467. if (!isInField() && screenFields.getCurrentField() != null
  1468. && !screenFields.isCurrentFieldBypassField()) {
  1469. while (!isInField()
  1470. && screenFields.getCurrentField() != null
  1471. && !screenFields.isCurrentFieldBypassField()) {
  1472. // lets keep going
  1473. advancePos();
  1474. // Have we looped the screen?
  1475. if (lastPos == startPos) {
  1476. // if so then go back to starting point
  1477. goto_XY(startPos);
  1478. break;
  1479. }
  1480. }
  1481. }
  1482. }
  1483. simulated = true;
  1484. break;
  1485. case FAST_CURSOR_DOWN:
  1486.          int rowNow = (getCurrentRow()-1) + 3;
  1487.          if (rowNow > getRows()-1)
  1488.             rowNow = rowNow - getRows();
  1489.          this.goto_XY(getPos(rowNow,getCurrentCol()-1));
  1490. simulated = true;
  1491. break;
  1492. case FAST_CURSOR_UP:
  1493.          rowNow = (getCurrentRow()-1) - 3;
  1494.          if (rowNow < 0)
  1495.             rowNow = (getRows()) + rowNow;
  1496.          this.goto_XY(getPos(rowNow,getCurrentCol()-1));
  1497. simulated = true;
  1498. break;
  1499. case FAST_CURSOR_LEFT:
  1500.          int colNow = (getCurrentCol()-1) - 3;
  1501.          rowNow = getCurrentRow()-1;
  1502.          if (colNow <= 0) {
  1503.             colNow = getColumns() + colNow;
  1504.             rowNow--;
  1505.          }
  1506.          if (rowNow < 0)
  1507.             rowNow = getRows() - 1;
  1508.    process_XY(getPos(rowNow,colNow));
  1509. simulated = true;
  1510. break;
  1511. case FAST_CURSOR_RIGHT:
  1512.          colNow = (getCurrentCol()-1) + 3;
  1513.          rowNow = getCurrentRow()-1;
  1514.          if (colNow >= getColumns()) {
  1515.             colNow = colNow - getColumns();
  1516.             rowNow++;
  1517.          }
  1518.          if (rowNow > getRows() - 1)
  1519.             rowNow = getRows() - rowNow;
  1520.    process_XY(getPos(rowNow,colNow));
  1521. simulated = true;
  1522. break;
  1523. default:
  1524. log.info(" Mnemonic not supported " + mnem);
  1525. break;
  1526. }
  1527. return simulated;
  1528. }
  1529. protected boolean simulateKeyStroke(char c) {
  1530.       if (isStatusErrorCode() && !Character.isISOControl(c) && !keyProcessed) {
  1531.          if (resetRequired)
  1532.             return false;
  1533.          else
  1534.             resetError();
  1535.       }
  1536. boolean updateField = false;
  1537. boolean numericError = false;
  1538. boolean updatePos = false;
  1539. boolean autoEnter = false;
  1540. if (!Character.isISOControl(c)) {
  1541. if (screenFields.getCurrentField() != null
  1542. && screenFields.withinCurrentField(lastPos)
  1543. && !screenFields.isCurrentFieldBypassField()) {
  1544. if (screenFields.isCurrentFieldFER()
  1545. && !screenFields.withinCurrentField(screenFields
  1546. .getCurrentFieldPos())
  1547. && lastPos == screenFields.getCurrentField().endPos()
  1548. && screenFields.getCurrentFieldPos() > screenFields
  1549. .getCurrentField().endPos()) {
  1550. displayError(ERR_FIELD_EXIT_INVALID);
  1551. feError = true;
  1552. return false;
  1553. }
  1554. switch (screenFields.getCurrentFieldShift()) {
  1555. case 0: // Alpha shift
  1556. case 2: // Numeric Shift
  1557. case 4: // Kakana Shift
  1558. updateField = true;
  1559. break;
  1560. case 1: // Alpha Only
  1561. if (Character.isLetter(c) || c == ',' || c == '-'
  1562. || c == '.' || c == ' ')
  1563. updateField = true;
  1564. break;
  1565. case 3: // Numeric only
  1566. if (Character.isDigit(c) || c == '+' || c == ','
  1567. || c == '-' || c == '.' || c == ' ')
  1568. updateField = true;
  1569. else
  1570. numericError = true;
  1571. break;
  1572. case 5: // Digits only
  1573. if (Character.isDigit(c))
  1574. updateField = true;
  1575. else
  1576. displayError(ERR_NUMERIC_09);
  1577. break;
  1578. case 7: // Signed numeric
  1579. if (Character.isDigit(c) || c == '+' || c == '-')
  1580. if (lastPos == screenFields.getCurrentField().endPos()
  1581. && (c != '+' && c != '-'))
  1582. displayError(ERR_INVALID_SIGN);
  1583. else
  1584. updateField = true;
  1585. else
  1586. displayError(ERR_NUMERIC_09);
  1587. break;
  1588. }
  1589. if (updateField) {
  1590. if (screenFields.isCurrentFieldToUpper())
  1591. c = Character.toUpperCase(c);
  1592. updatePos = true;
  1593. resetDirty(lastPos);
  1594. if (oia.isInsertMode()) {
  1595. if (endOfField(false) != screenFields.getCurrentField()
  1596. .endPos())
  1597. shiftRight(lastPos);
  1598. else {
  1599. displayError(ERR_NO_ROOM_INSERT);
  1600. updatePos = false;
  1601. }
  1602. }
  1603. if (updatePos) {
  1604. screenFields.getCurrentField().getKeyPos(
  1605. getRow(lastPos), getCol(lastPos));
  1606. screenFields.getCurrentField().changePos(1);
  1607.                   planes.setChar(lastPos,c);
  1608. screenFields.setCurrentFieldMDT();
  1609. // if we have gone passed the end of the field then goto
  1610. // the next field
  1611. if (!screenFields.withinCurrentField(screenFields
  1612. .getCurrentFieldPos())) {
  1613. if (screenFields.isCurrentFieldAutoEnter()) {
  1614. autoEnter = true;
  1615. } else if (!screenFields.isCurrentFieldFER())
  1616. gotoFieldNext();
  1617. else {
  1618. //                        screenFields.getCurrentField().changePos(1);
  1619. //
  1620. //                        if (screenFields.
  1621. //                        cursorPos == endPos)
  1622. //                           System.out.println("end of field");
  1623. //
  1624. //                        feError != feError;
  1625. //                        if (feError)
  1626. //                           displayError(ERR_FIELD_EXIT_INVALID);
  1627. }
  1628. } else
  1629. setCursor(screenFields.getCurrentField()
  1630. .getCursorRow() + 1, screenFields
  1631. .getCurrentField().getCursorCol() + 1);
  1632. }
  1633.                fireScreenChanged(1);
  1634. if (autoEnter)
  1635. sendAid(AID_ENTER);
  1636. } else {
  1637. if (numericError) {
  1638. displayError(ERR_NUMERIC_ONLY);
  1639. }
  1640. }
  1641. } else {
  1642. displayError(ERR_CURSOR_PROTECTED);
  1643. }
  1644. }
  1645. return updatePos;
  1646. }
  1647. /**
  1648.  * Method: endOfField
  1649.  * <p>
  1650.  *
  1651.  * convenience method that call endOfField with lastRow lastCol and passes
  1652.  * the posSpace to that method
  1653.  *
  1654.  * @param posSpace
  1655.  *            value of type boolean - specifying to return the position of
  1656.  *            the the last space or not
  1657.  * @return a value of type int - the screen postion (row * columns) + col
  1658.  *
  1659.  */
  1660. private int endOfField(boolean posSpace) {
  1661. return endOfField(lastPos, posSpace);
  1662. }
  1663. /**
  1664.  * Method: endOfField
  1665.  * <p>
  1666.  *
  1667.  * gets the position of the last character of the current field posSpace
  1668.  * parameter tells the routine whether to return the position of the last
  1669.  * space ( <= ' ') or the last non space posSpace == true last occurrence of
  1670.  * char <= ' ' posSpace == false last occurrence of char > ' '
  1671.  *
  1672.  * @param pos
  1673.  *            value of type int - position to start from
  1674.  * @param posSpace
  1675.  *            value of type boolean - specifying to return the position of
  1676.  *            the the last space or not
  1677.  * @return a value of type int - the screen postion (row * columns) + col
  1678.  *
  1679.  */
  1680. private int endOfField(int pos, boolean posSpace) {
  1681. int endPos = screenFields.getCurrentField().endPos();
  1682. int fePos = endPos;
  1683. // get the number of characters to the right
  1684. int count = endPos - pos;
  1685. // first lets get the real ending point without spaces and the such
  1686. while (planes.getChar(endPos) <= ' ' && count-- > 0) {
  1687. endPos--;
  1688. }
  1689. if (endPos == fePos) {
  1690. return endPos;
  1691. } else {
  1692. screenFields.getCurrentField().getKeyPos(endPos);
  1693. if (posSpace)
  1694. screenFields.getCurrentField().changePos(+1);
  1695. return screenFields.getCurrentFieldPos();
  1696. }
  1697. }
  1698.    private boolean fieldExit() {
  1699.       int pos = lastPos;
  1700.       boolean mdt = false;
  1701.       int end = endOfField(false); // get the ending position of the first
  1702.       // non blank character in field
  1703.       ScreenField sf = screenFields.getCurrentField();
  1704.       if (sf.isMandatoryEnter() && end == sf.startPos()) {
  1705.          displayError(ERR_MANDITORY_ENTER);
  1706.          return false;
  1707.       }
  1708.       // get the number of characters to the right
  1709.       int count = (end - sf.startPos()) - sf.getKeyPos(pos);
  1710.       if (count == 0 && sf.isFER()) {
  1711.          mdt = true;
  1712.          return mdt;
  1713.       }
  1714.       for (; count >= 0; count--) {
  1715.          planes.setChar(pos, initChar);
  1716.          setDirty(pos);
  1717.          pos++;
  1718.          mdt = true;
  1719.       }
  1720.       // This checks for a field minus because a field minus places
  1721.       // a negative sign and then advances a position. If it is the
  1722.       // end of the field where the minus is placed then this offset will
  1723.       //  place the count as -1.
  1724.       if (count == -1) {
  1725.          int s = sf.getFieldShift();
  1726.          if (s == 3 || s == 5 || s == 7) {
  1727.             mdt = true;
  1728.          }
  1729.       }
  1730.       int adj = sf.getAdjustment();
  1731.       if (adj != 0) {
  1732.          switch (adj) {
  1733.          case 5:
  1734.             rightAdjustField('0');
  1735.             sf.setRightAdjusted();
  1736.             break;
  1737.          case 6:
  1738.             rightAdjustField(' ');
  1739.             sf.setRightAdjusted();
  1740.             break;
  1741.          case 7:
  1742.             sf.setManditoryEntered();
  1743.             break;
  1744.          }
  1745.       }
  1746.       else {
  1747.          // we need to right adjust signed numeric fields as well.
  1748.          if (sf.isSignedNumeric()) {
  1749.             rightAdjustField(' ');
  1750.          }
  1751.       }
  1752.       return mdt;
  1753.    }
  1754. private void rightAdjustField(char fill) {
  1755. int end = endOfField(false); // get the ending position of the first
  1756. // non blank character in field
  1757. // get the number of characters to the right
  1758. int count = screenFields.getCurrentField().endPos() - end;
  1759. // subtract 1 from count for signed numeric - note for later
  1760. if (screenFields.getCurrentField().isSignedNumeric()) {
  1761. if (planes.getChar(end -1) != '-')
  1762. count--;
  1763. }
  1764. int pos = screenFields.getCurrentField().startPos();
  1765. while (count-- >= 0) {
  1766. shiftRight(pos);
  1767.          planes.setChar(pos,fill);
  1768. setDirty(pos);
  1769. }
  1770. }
  1771. private void shiftLeft(int sPos) {
  1772. int endPos = 0;
  1773. int pos = sPos;
  1774. int pPos = sPos;
  1775. ScreenField sf = screenFields.getCurrentField();
  1776. int end;
  1777. int count;
  1778. do {
  1779. end = endOfField(pPos, false); // get the ending position of the
  1780.    // first
  1781. // non blank character in field
  1782. count = (end - screenFields.getCurrentField().startPos())
  1783. - screenFields.getCurrentField().getKeyPos(pPos);
  1784. // now we loop through and shift the remaining characters to the
  1785. // left
  1786. while (count-- > 0) {
  1787. pos++;
  1788.             planes.setChar(pPos,planes.getChar(pos));
  1789. setDirty(pPos);
  1790. pPos = pos;
  1791. }
  1792. if (screenFields.isCurrentFieldContinued()) {
  1793. gotoFieldNext();
  1794. if (screenFields.getCurrentField().isContinuedFirst())
  1795. break;
  1796. pos = screenFields.getCurrentField().startPos();
  1797.             planes.setChar(pPos,planes.getChar(pos));
  1798. setDirty(pPos);
  1799. pPos = pos;
  1800. }
  1801. } while (screenFields.isCurrentFieldContinued()
  1802. && !screenFields.getCurrentField().isContinuedFirst());
  1803. if (end >= 0 && count >= -1) {
  1804. endPos = end;
  1805. } else {
  1806. endPos = sPos;
  1807. }
  1808. screenFields.setCurrentField(sf);
  1809.       planes.setChar(endPos,initChar);
  1810. setDirty(endPos);
  1811. goto_XY(screenFields.getCurrentFieldPos());
  1812. sf = null;
  1813. }
  1814. private void shiftRight(int sPos) {
  1815. int end = endOfField(true); // get the ending position of the first
  1816. // non blank character in field
  1817. int pos = end;
  1818. int pPos = end;
  1819. int count = end - sPos;
  1820. // now we loop through and shift the remaining characters to the right
  1821. while (count-- > 0) {
  1822. pos--;
  1823. planes.setChar(pPos, planes.getChar(pos));
  1824. setDirty(pPos);
  1825. pPos = pos;
  1826. }
  1827. }
  1828. public int getRow(int pos) {
  1829. //      if (pos == 0)
  1830. //         return 1;
  1831. int row = pos / numCols;
  1832. if (row < 0) {
  1833. row = lastPos / numCols;
  1834. }
  1835. if (row > lenScreen - 1)
  1836. row = lenScreen - 1;
  1837. return row;
  1838. }
  1839. public int getCol(int pos) {
  1840. //      if (pos == 0)
  1841. //         return 1;
  1842. int col = pos % (getColumns());
  1843. if (col > 0)
  1844. return col;
  1845. else
  1846. return 0;
  1847. }
  1848. /**
  1849.  * This routine is 0 based offset. So to get row 20,1 then pass row 19,0
  1850.  *
  1851.  * @param row
  1852.  * @param col
  1853.  * @return
  1854.  */
  1855. public int getPos(int row, int col) {
  1856. return (row * numCols) + col;
  1857. }
  1858. /**
  1859.  * Current position is based on offsets of 1,1 not 0,0 of the current
  1860.  * position of the screen
  1861.  *
  1862.  * @return int
  1863.  */
  1864. public int getCurrentPos() {
  1865. return lastPos + numCols + 1;
  1866. }
  1867. /**
  1868.     * I got this information from a tcp trace of each error. I could not find
  1869.     * any documenation for this. Maybe there is but I could not find it. If
  1870.     * anybody finds this documention could you please send me a copy. Please
  1871.     * note that I did not look that hard either.
  1872.     * <p>
  1873.     * 0000: 00 50 73 1D 89 81 00 50 DA 44 C8 45 08 00 45 00 .Ps....P.D.E..E.
  1874.     * </p>
  1875.     * <p>
  1876.     * 0010: 00 36 E9 1C 40 00 80 06 9B F9 C1 A8 33 58 C0 A8 .6..@.......3X..
  1877.     * </p>
  1878.     * <p>
  1879.     * 0020: C0 02 06 0E 00 17 00 52 6E 88 73 40 DE CB 50 18 .......Rn.s@..P.
  1880.     * </p>
  1881.     * <p>
  1882.     * 0030: 20 12 3C 53 00 00 00 0C 12 A0 00 00 04 01 00 00 . <S............
  1883.     * </p>
  1884.     * <p>
  1885.     * 0040: 00 05 FF EF .... ----------|| The 00 XX is the code to be sent. I
  1886.     * found the following <table BORDER COLS=2 WIDTH="50%" >
  1887.     * <tr>
  1888.     * <td>ERR_CURSOR_PROTECTED</td>
  1889.     * <td>0x05</td>
  1890.     * </tr>
  1891.     * <tr>
  1892.     * <td>ERR_INVALID_SIGN</td>
  1893.     * <td>0x11</td>
  1894.     * </tr>
  1895.     * <tr>
  1896.     * <td>ERR_NO_ROOM_INSERT</td>
  1897.     * <td>0x12</td>
  1898.     * </tr>
  1899.     * <tr>
  1900.     * <td>ERR_NUMERIC_ONLY</td>
  1901.     * <td>0x09</td>
  1902.     * </tr>
  1903.     * <tr>
  1904.     * <td>ERR_NUMERIC_09</td>
  1905.     * <td>0x10</td>
  1906.     * </tr>
  1907.     * <tr>
  1908.     * <td>ERR_FIELD_MINUS</td>
  1909.     * <td>0x16</td>
  1910.     * </tr>
  1911.     * <tr>
  1912.     * <td>ERR_ENTER_NOT_ALLOWED</td>
  1913.     * <td>0x20</td>
  1914.     * </tr>
  1915.     * <tr>
  1916.     * <td>ERR_MANDITORY_ENTER</td>
  1917.     * <td>0x21</td>
  1918.     * </tr>
  1919.     * <tr>
  1920.     * <td>ERR_ENTER_NOT_ALLOWED</td>
  1921.     * <td>0x20</td>
  1922.     * </tr>
  1923.     * </table> I am tired of typing and they should be self explanitory. Finding
  1924.     * them in the first place was the pain.
  1925.     * </p>
  1926.     *
  1927.     * @param ec error code
  1928.     */
  1929.    private void displayError(int ec) {
  1930.       saveHomePos = homePos;
  1931.       homePos = lastPos + numCols + 1;
  1932.       pendingInsert = true;
  1933.       sessionVT.sendNegResponse2(ec);
  1934.    }
  1935. private void process_XY(int pos) {
  1936. if (pos < 0)
  1937. pos = lenScreen + pos;
  1938. if (pos > lenScreen - 1)
  1939. pos = pos - lenScreen;
  1940. // if there was a field exit error then we need to treat the movement
  1941. //  of the cursor in a special way that equals that of Client Access.
  1942. //    If the cursor is moved from the field then we need to reset the
  1943. //       position within the field so that the last character can be typed
  1944. //       over again instead of sending the field exit error again.
  1945. //       We also need to reset the field exit error flag.
  1946. //
  1947. //    How we know we have a field exit error is when the field position is
  1948. //    set beyond the end of the field and a character is then typed we can
  1949. //    not position that character. To reset this we need to set the next
  1950. //    position of the field to not be beyond the end of field but to the
  1951. //    last character.
  1952. //
  1953. //    Now to make it work like Client Access if the cursor is a back space
  1954. //    then do not move the cursor but place it on the last field. All
  1955. //    other keys will reset the field position so that entering over the
  1956. //    last character will not cause an error but replace that character or
  1957. //    just plain move the cursor if the key was to do that.
  1958. if (feError) {
  1959. feError = false;
  1960. screenFields.getCurrentField().changePos(-1);
  1961. if (screenFields.getCurrentField() != null
  1962. && screenFields.getCurrentField().isFER()
  1963. && screenFields.getCurrentFieldPos() - 1 == pos) {
  1964. }
  1965. } else {
  1966. goto_XY(pos);
  1967. }
  1968. }
  1969. public boolean isUsingGuiInterface() {
  1970. return guiInterface;
  1971. }
  1972. /**
  1973.  * Convinience class to return if the cursor is in a field or not.
  1974.  *
  1975.  * @return true or false
  1976.  */
  1977. protected boolean isInField() {
  1978. return isInField(lastPos, true);
  1979. }
  1980. /**
  1981.  *
  1982.  * Convinience class to return if the position that is passed is in a field
  1983.  * or not. If it is then the chgToField parameter will change the current
  1984.  * field to this field where the position indicates
  1985.  *
  1986.  * @param pos
  1987.  * @param chgToField
  1988.  * @return true or false
  1989.  */
  1990. public boolean isInField(int pos, boolean chgToField) {
  1991. return screenFields.isInField(pos, chgToField);
  1992. }
  1993. /**
  1994.  *
  1995.  * Convinience class to return if the position that is passed is in a field
  1996.  * or not. If it is then the field at this position becomes the current
  1997.  * working field
  1998.  *
  1999.  * @param pos
  2000.  * @return true or false
  2001.  */
  2002. public boolean isInField(int pos) {
  2003. return screenFields.isInField(pos, true);
  2004. }
  2005. /**
  2006.  * Convinience class to return if the position at row and column that is
  2007.  * passed is in a field or not. If it is then the field at this position
  2008.  * becomes the current working field.
  2009.  *
  2010.  * @param row
  2011.  * @param col
  2012.  * @return true or false
  2013.  */
  2014. public boolean isInField(int row, int col) {
  2015. return isInField(row, col, true);
  2016. }
  2017. /**
  2018.  *
  2019.  * Convinience class to return if the position at row and column that is
  2020.  * passed is in a field or not. If it is then the chgToField parameter will
  2021.  * change the current field to this field where the row and column
  2022.  * indicates.
  2023.  *
  2024.  * @param row
  2025.  * @param col
  2026.  * @param chgToField
  2027.  * @return true or false
  2028.  */
  2029. public boolean isInField(int row, int col, boolean chgToField) {
  2030. return screenFields.isInField((row * numCols) + col, chgToField);
  2031. }
  2032. /**
  2033.  * Gets the length of the screen - number of rows times number of columns
  2034.  *
  2035.  * @return int value of screen length
  2036.  */
  2037. public int getScreenLength() {
  2038. return lenScreen;
  2039. }
  2040. /**
  2041.  * Get the number or rows available.
  2042.  *
  2043.  * @return number of rows
  2044.  */
  2045. public int getRows() {
  2046. return numRows;
  2047. }
  2048. /**
  2049.  * Get the number of columns available.
  2050.  *
  2051.  * @return number of columns
  2052.  */
  2053. public int getColumns() {
  2054. return numCols;
  2055. }
  2056. /**
  2057.  * Get the current row where the cursor is
  2058.  *
  2059.  * @return the cursor current row position 1,1 based
  2060.  */
  2061. public int getCurrentRow() {
  2062. return (lastPos / numCols) + 1;
  2063. }
  2064. /**
  2065.  * Get the current column where the cursor is
  2066.  *
  2067.  * @return the cursor current column position 1,1 based
  2068.  */
  2069. public int getCurrentCol() {
  2070. return (lastPos % numCols) + 1;
  2071. }
  2072. /**
  2073.  * The last position of the cursor on the screen - Note - position is based
  2074.  * 0,0
  2075.  *
  2076.  * @return last position
  2077.  */
  2078. protected int getLastPos() {
  2079. return lastPos;
  2080. }
  2081. /**
  2082.  * Hotspot More... string
  2083.  *
  2084.  * @return string literal of More...
  2085.  */
  2086. public StringBuffer getHSMore() {
  2087. return hsMore;
  2088. }
  2089. /**
  2090.  * Hotspot Bottom string
  2091.  *
  2092.  * @return string literal of Bottom
  2093.  */
  2094. public StringBuffer getHSBottom() {
  2095. return hsBottom;
  2096. }
  2097. /**
  2098.  * Return the whole screen represented as a character array
  2099.  *
  2100.  * @return character array containing the text
  2101.  *
  2102.  * Added by Luc - LDC
  2103.  *
  2104.  * Note to KJP - Have to ask what the difference is between this method and
  2105.  * the other
  2106.  */
  2107. public char[] getScreenAsAllChars() {
  2108. char[] sac = new char[lenScreen];
  2109. char c;
  2110. for (int x = 0; x < lenScreen; x++) {
  2111.          c = planes.getChar(x);
  2112. // only draw printable characters (in this case >= ' ')
  2113. if ((c >= ' ') && (!planes.isAttributePlace(x))) {
  2114. sac[x] = c;
  2115.             // TODO: implement the underline check here
  2116. // if (screen[x].underLine && c <= ' ')
  2117. // sac[x] = '_';
  2118. } else
  2119. sac[x] = ' ';
  2120. }
  2121. return sac;
  2122. }
  2123. /**
  2124.  *
  2125.  * Return the screen represented as a character array
  2126.  *
  2127.  * @return character array containing the text
  2128.  */
  2129. public char[] getScreenAsChars() {
  2130. char[] sac = new char[lenScreen];
  2131. char c;
  2132. for (int x = 0; x < lenScreen; x++) {
  2133.          c = planes.getChar(x);
  2134. // only draw printable characters (in this case >= ' ')
  2135. if ((c >= ' ') && (!planes.isAttributePlace(x))) {
  2136. sac[x] = c;
  2137.             // TODO: implement the underline check here
  2138. // if (screen[x].underLine && c <= ' ')
  2139. // sac[x] = '_';
  2140. } else
  2141. sac[x] = ' ';
  2142. }
  2143. return sac;
  2144. }
  2145.    public char[] getData(int startRow, int startCol, int endRow, int endCol, int plane) {
  2146.       try {
  2147.          int from = getPos(startRow,startCol);
  2148.          int to = getPos(endRow,endCol);
  2149.          if (from > to) {
  2150.             int f = from;
  2151.             to = f;
  2152.             from = f;
  2153.          }
  2154.          return planes.getPlaneData(from,to,plane);
  2155.       }
  2156.       catch (Exception oe) {
  2157.          return null;
  2158.       }
  2159.    }
  2160.    /**
  2161.     * <p>
  2162.     *  GetScreen retrieves the various planes associated with the presentation
  2163.     *  space. The data is returned as a linear array of character values in the
  2164.     *  array provided. The array is not terminated by a null character except
  2165.     *  when data is retrieved from the text plane, in which case a single null
  2166.     *  character is appended.
  2167.     *  </p>
  2168.     *  <p>
  2169.     *  The application must supply a buffer for the returned data and the length
  2170.     *  of the buffer. Data is returned starting from the beginning of the
  2171.     *  presentation space and continuing until the buffer is full or the entire
  2172.     *  plane has been copied. For text plane data, the buffer must include one
  2173.     *  extra position for the terminating null character.
  2174.     *  <p>
  2175.     *
  2176.     * @param buffer
  2177.     * @param bufferLength
  2178.     * @param plane
  2179.     * @return The number of characters copied to the buffer
  2180.     * @throws OhioException
  2181.     */
  2182.    public synchronized int GetScreen(char buffer[], int bufferLength, int plane)
  2183. //                                       throws OhioException {
  2184.                                        {
  2185.       return GetScreen(buffer,bufferLength,0,lenScreen,plane);
  2186.    }
  2187.    /**
  2188.     * <p>
  2189.     *  GetScreen retrieves the various planes associated with the presentation
  2190.     *  space. The data is returned as a linear array of character values in the
  2191.     *  array provided. The array is not terminated by a null character except
  2192.     *  when data is retrieved from the text plane, in which case a single null
  2193.     *  character is appended.
  2194.     * </p>
  2195.     * <p>
  2196.     * The application must supply a buffer for the returned data and the length
  2197.     * of the buffer. Data is returned starting from the given position and
  2198.     * continuing until the specified number of characters have been copied, the
  2199.     * buffer is full or the entire plane has been copied. For text plane data,
  2200.     * the buffer must include one extra position for the terminating null character.
  2201.     * </p>
  2202.     *
  2203.     * @param buffer
  2204.     * @param bufferLength
  2205.     * @param from
  2206.     * @param length
  2207.     * @param plane
  2208.     * @return The number of characters copied to the buffer
  2209.     * @throws OhioException
  2210.     */
  2211.    public synchronized int GetScreen(char buffer[], int bufferLength, int from,
  2212.                                     int length, int plane)
  2213. //                                    throws OhioException {
  2214.                                     {
  2215.       return planes.GetScreen(buffer,bufferLength, from, length, plane);
  2216.    }
  2217.    /**
  2218.     * <p>
  2219.     *  GetScreen retrieves the various planes associated with the presentation
  2220.     *  space. The data is returned as a linear array of character values in the
  2221.     *  array provided. The array is not terminated by a null character except
  2222.     *  when data is retrieved from the text plane, in which case a single null
  2223.     *  character is appended.
  2224.     *  </p>
  2225.     *  <p>
  2226.     *  The application must supply a buffer for the returned data and the length
  2227.     *  of the buffer. Data is returned starting from the given coordinates and
  2228.     *  continuing until the specified number of characters have been copied,
  2229.     *  the buffer is full, or the entire plane has been copied. For text plane
  2230.     *  data, the buffer must include one extra position for the terminating null
  2231.     *  character.
  2232.     *  </p>
  2233.     *
  2234.     * @param buffer
  2235.     * @param bufferLength
  2236.     * @param row
  2237.     * @param col
  2238.     * @param length
  2239.     * @param plane
  2240.     * @return The number of characters copied to the buffer.
  2241.     * @throws OhioException
  2242.     */
  2243.    public synchronized int GetScreen(char buffer[], int bufferLength, int row,
  2244.                                        int col, int length, int plane)
  2245. //                                       throws OhioException {
  2246.                                        {
  2247.       // Call GetScreen function after converting row and column to
  2248.       // a position.
  2249.       return planes.GetScreen(buffer,bufferLength, row, col, length, plane);
  2250.    }
  2251.    /**
  2252.     * <p>
  2253.     *  GetScreenRect retrieves data from the various planes associated with the
  2254.     *  presentation space. The data is returned as a linear array of character
  2255.     *  values in the buffer provided.
  2256.     *  </p>
  2257.     *
  2258.     * <p>
  2259.     * The application supplies two positions that represent opposing corners of
  2260.     * a rectangle within the presentation space. The starting and ending
  2261.     * positions can have any spatial relationship to each other. The data
  2262.     * returned starts from the row containing the upper-most point to the row
  2263.     * containing the lower-most point, and from the left-most column to the
  2264.     * right-most column.
  2265.     * </p>
  2266.     * <p>
  2267.     * The specified buffer must be at least large enough to contain the number
  2268.     * of characters in the rectangle. If the buffer is too small, no data is
  2269.     * copied and zero is returned by the method. Otherwise, the method returns
  2270.     * the number of characters copied.
  2271.     * </p>
  2272.     *
  2273.     * @param buffer
  2274.     * @param bufferLength
  2275.     * @param startPos
  2276.     * @param endPos
  2277.     * @param plane
  2278.     * @return The number of characters copied to the buffer
  2279.     * @throws OhioException
  2280.     */
  2281.    public synchronized int GetScreenRect(char buffer[], int bufferLength,
  2282.                                              int startPos, int endPos, int plane)
  2283. //                                             throws OhioException {
  2284.                                              {
  2285.       return planes.GetScreenRect(buffer, bufferLength, startPos, endPos, plane);
  2286.    }
  2287.    /**
  2288.     * <p>
  2289.     *  GetScreenRect retrieves data from the various planes associated with the
  2290.     *  presentation space. The data is returned as a linear array of character
  2291.     *  values in the buffer provided. The buffer is not terminated by a null
  2292.     *  character.
  2293.     * </p>
  2294.     * <p>
  2295.     * The application supplies two coordinates that represent opposing corners
  2296.     * of a rectangle within the presentation space. The starting and ending
  2297.     * coordinates can have any spatial relationship to each other. The data
  2298.     * returned starts from the row containing the upper-most point to the row
  2299.     * containing the lower-most point, and from the left-most column to the
  2300.     * right-most column.
  2301.     * </p>
  2302.     * <p>
  2303.     * The specified buffer must be at least large enough to contain the number
  2304.     * of characters in the rectangle. If the buffer is too small, no data is
  2305.     * copied and zero is returned by the method. Otherwise, the method returns
  2306.     * the number of characters copied.
  2307.     * </p>
  2308.     *
  2309.     * @param buffer
  2310.     * @param bufferLength
  2311.     * @param startRow
  2312.     * @param startCol
  2313.     * @param endRow
  2314.     * @param endCol
  2315.     * @param plane
  2316.     * @return The number characters copied to the buffer
  2317.     * @throws OhioException
  2318.     */
  2319.    public synchronized int GetScreenRect(char buffer[], int bufferLength,
  2320.                                              int startRow, int startCol,
  2321.                                              int endRow, int endCol, int plane)
  2322. //                                             throws OhioException {
  2323.                                              {
  2324.       return planes.GetScreenRect(buffer, bufferLength, startRow, startCol, endRow,
  2325.                                     endCol, plane);
  2326.    }
  2327.    public synchronized boolean[] getActiveAidKeys() {
  2328.       return sessionVT.getActiveAidKeys();
  2329.    }
  2330.    protected synchronized void setScreenData(String text, int location) {
  2331. //                                             throws OhioException {
  2332.       if (location < 0 || location > lenScreen) {
  2333.          return;
  2334. //         throw new OhioException(sessionVT.getSessionConfiguration(),
  2335. //          OhioScreen5250.class.getName(), "osohio.screen.ohio00300", 1);
  2336.       }
  2337.       int pos = location;
  2338.       int l = text.length();
  2339.       boolean updated = false;
  2340.       boolean flag = false;
  2341.       int x =0;
  2342.       for (; x < l; x++) {
  2343.          if (isInField(pos + x,true)) {
  2344.             if (!screenFields.getCurrentField().isBypassField()) {
  2345.                if (!flag) {
  2346.                   screenFields.getCurrentField().setMDT();
  2347.                   updated = true;
  2348.                   resetDirty(pos + x);
  2349.                   screenFields.setMasterMDT();
  2350.                   flag = true;
  2351.                }
  2352.                planes.screen[pos + x] = text.charAt(x);
  2353.                setDirty(pos + x);
  2354.             }
  2355.          }
  2356.       }
  2357.       lastPos = pos + x;
  2358.       if (updated) {
  2359.          fireScreenChanged(1);
  2360.       }
  2361.    }
  2362. /**
  2363.  * This routine is based on offset 1,1 not 0,0 it will translate to offset
  2364.  * 0,0 and call the goto_XY(int pos) it is mostly used from external classes
  2365.  * that use the 1,1 offset
  2366.  *
  2367.  * @param row
  2368.  * @param col
  2369.  */
  2370. public void setCursor(int row, int col) {
  2371. goto_XY(((row - 1) * numCols) + (col - 1));
  2372. }
  2373. // this routine is based on offset 0,0 not 1,1
  2374. protected void goto_XY(int pos) {
  2375. //      setCursorOff();
  2376. updateCursorLoc();
  2377. lastPos = pos;
  2378. //      setCursorOn();
  2379. updateCursorLoc();
  2380. }
  2381. /**
  2382.  * Set the current working field to the field number specified.
  2383.  *
  2384.  * @param f -
  2385.  *            numeric field number on the screen
  2386.  * @return true or false whether it was sucessful
  2387.  */
  2388. public boolean gotoField(int f) {
  2389. int sizeFields = screenFields.getSize();
  2390. if (f > sizeFields || f <= 0)
  2391. return false;
  2392. screenFields.setCurrentField(screenFields.getField(f - 1));
  2393. while (screenFields.isCurrentFieldBypassField() && f < sizeFields) {
  2394. screenFields.setCurrentField(screenFields.getField(f++));
  2395. }
  2396. return gotoField(screenFields.getCurrentField());
  2397. }
  2398. /**
  2399.  * Convenience method to set the field object passed as the currect working
  2400.  * screen field
  2401.  *
  2402.  * @param f
  2403.  * @return true or false whether it was sucessful
  2404.  * @see org.tn5250j.ScreenField
  2405.  */
  2406. protected boolean gotoField(ScreenField f) {
  2407. if (f != null) {
  2408. goto_XY(f.startPos());
  2409. return true;
  2410. } else {
  2411. return false;
  2412. }
  2413. }
  2414. /**
  2415.  * Convenience class to position the cursor to the next word on the screen
  2416.  *
  2417.  */
  2418. private void gotoNextWord() {
  2419. int pos = lastPos;
  2420. if (planes.getChar(lastPos) > ' ') {
  2421. advancePos();
  2422. // get the next space character
  2423. while (planes.getChar(lastPos) > ' ' && pos != lastPos) {
  2424. advancePos();
  2425. }
  2426. } else
  2427. advancePos();
  2428. // now that we are positioned on the next space character get the
  2429. // next none space character
  2430. while (planes.getChar(lastPos) <= ' ' && pos != lastPos) {
  2431. advancePos();
  2432. }
  2433. }
  2434. /**
  2435.  * Convenience class to position the cursor to the previous word on the
  2436.  * screen
  2437.  *
  2438.  */
  2439. private void gotoPrevWord() {
  2440. int pos = lastPos;
  2441. changePos(-1);
  2442. // position previous white space character
  2443. while (planes.getChar(lastPos) <= ' ') {
  2444. changePos(-1);
  2445. if (pos == lastPos)
  2446. break;
  2447. }
  2448. changePos(-1);
  2449. // get the previous space character
  2450. while (planes.getChar(lastPos) > ' ' && pos != lastPos) {
  2451. changePos(-1);
  2452. }
  2453. // and position one position more should give us the beginning of word
  2454. advancePos();
  2455. }
  2456. /**
  2457.  * Convinience class to position to the next field on the screen.
  2458.  *
  2459.  * @see org.tn5250j.ScreenFields
  2460.  */
  2461. private void gotoFieldNext() {
  2462. if (screenFields.isCurrentFieldHighlightedEntry())
  2463. unsetFieldHighlighted(screenFields.getCurrentField());
  2464. screenFields.gotoFieldNext();
  2465. if (screenFields.isCurrentFieldHighlightedEntry())
  2466. setFieldHighlighted(screenFields.getCurrentField());
  2467. }
  2468. /**
  2469.  * Convinience class to position to the previous field on the screen.
  2470.  *
  2471.  * @see org.tn5250j.ScreenFields
  2472.  */
  2473. private void gotoFieldPrev() {
  2474. if (screenFields.isCurrentFieldHighlightedEntry())
  2475. unsetFieldHighlighted(screenFields.getCurrentField());
  2476. screenFields.gotoFieldPrev();
  2477. if (screenFields.isCurrentFieldHighlightedEntry())
  2478. setFieldHighlighted(screenFields.getCurrentField());
  2479. }
  2480. /**
  2481.  * Used to restrict the cursor to a particular position on the screen. Used
  2482.  * in combination with windows to restrict the cursor to the active window
  2483.  * show on the screen.
  2484.  *
  2485.  * Not supported yet. Please implement me :-(
  2486.  *
  2487.  * @param depth
  2488.  * @param width
  2489.  */
  2490. protected void setRestrictCursor(int depth, int width) {
  2491. restrictCursor = true;
  2492. //      restriction
  2493. }
  2494. /**
  2495.  * Creates a window on the screen
  2496.  *
  2497.  * @param depth
  2498.  * @param width
  2499.  * @param type
  2500.  * @param gui
  2501.  * @param monoAttr
  2502.  * @param colorAttr
  2503.  * @param ul
  2504.  * @param upper
  2505.  * @param ur
  2506.  * @param left
  2507.  * @param right
  2508.  * @param ll
  2509.  * @param bottom
  2510.  * @param lr
  2511.  */
  2512. protected void createWindow(int depth, int width, int type, boolean gui,
  2513. int monoAttr, int colorAttr, int ul, int upper, int ur, int left,
  2514. int right, int ll, int bottom, int lr) {
  2515. int c = getCol(lastPos);
  2516. int w = 0;
  2517. width++;
  2518. w = width;
  2519. // set leading attribute byte
  2520. // screen[lastPos].setCharAndAttr(initChar, initAttr, true);
  2521. planes.setScreenCharAndAttr(lastPos, initChar, initAttr, true);
  2522. setDirty(lastPos);
  2523. advancePos();
  2524. // set upper left
  2525. // screen[lastPos].setCharAndAttr((char) ul, colorAttr, false);
  2526. planes.setScreenCharAndAttr(lastPos, (char) ul, colorAttr, false);
  2527. if (gui) {
  2528. // screen[lastPos].setUseGUI(UPPER_LEFT);
  2529. planes.setUseGUI(lastPos, UPPER_LEFT);
  2530. }
  2531. setDirty(lastPos);
  2532. advancePos();
  2533. // draw top row
  2534. while (w-- >= 0) {
  2535. // screen[lastPos].setCharAndAttr((char) upper, colorAttr, false);
  2536. planes.setScreenCharAndAttr(lastPos, (char) upper, colorAttr, false);
  2537. if (gui) {
  2538. // screen[lastPos].setUseGUI(UPPER);
  2539. planes.setUseGUI(lastPos,UPPER);
  2540. }
  2541. setDirty(lastPos);
  2542. advancePos();
  2543. }
  2544. // set upper right
  2545. // screen[lastPos].setCharAndAttr((char) ur, colorAttr, false);
  2546. planes.setScreenCharAndAttr(lastPos,(char) ur, colorAttr, false);
  2547. if (gui) {
  2548. // screen[lastPos].setUseGUI(UPPER_RIGHT);
  2549. planes.setUseGUI(lastPos, UPPER_RIGHT);
  2550. }
  2551. setDirty(lastPos);
  2552. advancePos();
  2553. // set ending attribute byte
  2554. planes.setScreenCharAndAttr(lastPos,initChar, initAttr, true);
  2555. setDirty(lastPos);
  2556. lastPos = ((getRow(lastPos) + 1) * numCols) + c;
  2557. // now handle body of window
  2558. while (depth-- > 0) {
  2559. // set leading attribute byte
  2560. planes.setScreenCharAndAttr(lastPos,initChar, initAttr, true);
  2561. setDirty(lastPos);
  2562. advancePos();
  2563. // set left
  2564. planes.setScreenCharAndAttr(lastPos, (char) left, colorAttr, false);
  2565. if (gui) {
  2566. planes.setUseGUI(lastPos,GUI_LEFT);
  2567. }
  2568. setDirty(lastPos);
  2569. advancePos();
  2570. w = width;
  2571. // fill it in
  2572. while (w-- >= 0) {
  2573. // screen[lastPos].setCharAndAttr(initChar, initAttr, true);
  2574. planes.setScreenCharAndAttr(lastPos,initChar, initAttr, true);
  2575. // screen[lastPos].setUseGUI(NO_GUI);
  2576. planes.setUseGUI(lastPos,NO_GUI);
  2577. setDirty(lastPos);
  2578. advancePos();
  2579. }
  2580. // set right
  2581. // screen[lastPos].setCharAndAttr((char) right, colorAttr, false);
  2582. planes.setScreenCharAndAttr(lastPos,(char) right, colorAttr, false);
  2583. if (gui) {
  2584. // screen[lastPos].setUseGUI(RIGHT);
  2585. planes.setUseGUI(lastPos,GUI_RIGHT);
  2586. }
  2587. setDirty(lastPos);
  2588. advancePos();
  2589. // set ending attribute byte
  2590. // screen[lastPos].setCharAndAttr(initChar, initAttr, true);
  2591. planes.setScreenCharAndAttr(lastPos,initChar, initAttr, true);
  2592. setDirty(lastPos);
  2593. lastPos = ((getRow(lastPos) + 1) * numCols) + c;
  2594. }
  2595. // set leading attribute byte
  2596. // screen[lastPos].setCharAndAttr(initChar, initAttr, true);
  2597. planes.setScreenCharAndAttr(lastPos,initChar, initAttr, true);
  2598. setDirty(lastPos);
  2599. advancePos();
  2600. // set lower left
  2601. // screen[lastPos].setCharAndAttr((char) ll, colorAttr, false);
  2602. planes.setScreenCharAndAttr(lastPos,(char) ll, colorAttr, false);
  2603. if (gui) {
  2604. // screen[lastPos].setUseGUI(LOWER_LEFT);
  2605. planes.setUseGUI(lastPos,LOWER_LEFT);
  2606. }
  2607. setDirty(lastPos);
  2608. advancePos();
  2609. w = width;
  2610. // draw bottom row
  2611. while (w-- >= 0) {
  2612. planes.setScreenCharAndAttr(lastPos,(char) bottom, colorAttr, false);
  2613. if (gui) {
  2614. planes.setUseGUI(lastPos,BOTTOM);
  2615. }
  2616. setDirty(lastPos);
  2617. advancePos();
  2618. }
  2619. // set lower right
  2620. planes.setScreenCharAndAttr(lastPos, (char) lr, colorAttr, false);
  2621. if (gui) {
  2622. planes.setUseGUI(lastPos,LOWER_RIGHT);
  2623. }
  2624. setDirty(lastPos);
  2625. advancePos();
  2626. // set ending attribute byte
  2627. planes.setScreenCharAndAttr(lastPos,initChar, initAttr, true);
  2628. setDirty(lastPos);
  2629. }
  2630. /**
  2631.  * Creates a scroll bar on the screen using the parameters provided.
  2632.  *  ** we only support vertical scroll bars at the time.
  2633.  *
  2634.  * @param flag -
  2635.  *            type to draw - vertical or horizontal
  2636.  * @param totalRowScrollable
  2637.  * @param totalColScrollable
  2638.  * @param sliderRowPos
  2639.  * @param sliderColPos
  2640.  * @param sbSize
  2641.  */
  2642. protected void createScrollBar(int flag, int totalRowScrollable,
  2643. int totalColScrollable, int sliderRowPos, int sliderColPos,
  2644. int sbSize) {
  2645. //      System.out.println("Scrollbar flag: " + flag +
  2646. //                           " scrollable Rows: " + totalRowScrollable +
  2647. //                           " scrollable Cols: " + totalColScrollable +
  2648. //                           " thumb Row: " + sliderRowPos +
  2649. //                           " thumb Col: " + sliderColPos +
  2650. //                           " size: " + sbSize +
  2651. //                           " row: " + getRow(lastPos) +
  2652. //                           " col: " + getCol(lastPos));
  2653. int sp = lastPos;
  2654. int size = sbSize - 2;
  2655. int thumbPos = (int) (size * (float) ((float) sliderColPos / (float) totalColScrollable));
  2656. //      System.out.println(thumbPos);
  2657. planes.setScreenCharAndAttr(sp,' ', 32, false);
  2658. planes.setUseGUI(sp,BUTTON_SB_UP);
  2659. int ctr = 0;
  2660. while (ctr < size) {
  2661. sp += numCols;
  2662. planes.setScreenCharAndAttr(sp,' ', 32, false);
  2663. if (ctr == thumbPos)
  2664. planes.setUseGUI(sp,BUTTON_SB_THUMB);
  2665. else
  2666. planes.setUseGUI(sp, BUTTON_SB_GUIDE);
  2667. ctr++;
  2668. }
  2669. sp += numCols;
  2670. planes.setScreenCharAndAttr(sp, ' ', 32, false);
  2671. planes.setUseGUI(sp, BUTTON_SB_DN);
  2672. }
  2673. /**
  2674.  * Write the title of the window that is on the screen
  2675.  *
  2676.  * @param pos
  2677.  * @param depth
  2678.  * @param width
  2679.  * @param orientation
  2680.  * @param monoAttr
  2681.  * @param colorAttr
  2682.  * @param title
  2683.  */
  2684. protected void writeWindowTitle(int pos, int depth, int width,
  2685. byte orientation, int monoAttr, int colorAttr, StringBuffer title) {
  2686. int sp = lastPos;
  2687. int len = title.length();
  2688. // get bit 0 and 1 for interrogation
  2689. switch (orientation & 0xc0) {
  2690. case 0x40: // right
  2691. pos += (4 + width - len);
  2692. break;
  2693. case 0x80: // left
  2694. pos += 2;
  2695. break;
  2696. default: // center
  2697. // this is to place the position to the first text position of the
  2698. // window
  2699. //    the position passed in is the first attribute position, the next
  2700. //    is the border character and then there is another attribute after
  2701. //    that.
  2702. pos += (3 + ((width / 2) - (len / 2)));
  2703. break;
  2704. }
  2705. //  if bit 2 is on then this is a footer
  2706. if ((orientation & 0x20) == 0x20)
  2707. pos += ((depth + 1) * numCols);
  2708. //      System.out.println(pos + "," + width + "," + len+ "," + getRow(pos)
  2709. //                              + "," + getCol(pos) + "," + ((orientation >> 6) & 0xf0));
  2710. for (int x = 0; x < len; x++) {
  2711. planes.setChar(pos, title.charAt(x));
  2712. planes.setUseGUI(pos++, NO_GUI);
  2713. }
  2714. }
  2715. /**
  2716.  * Roll the screen up or down.
  2717.  *
  2718.  * Byte 1: Bit 0 0 = Roll up 1 = Roll down Bits 1-2 Reserved Bits 3-7 Number
  2719.  * of lines that the designated area is to be rolled Byte 2: Bits 0-7 Line
  2720.  * number defining the top line of the area that will participate in the
  2721.  * roll. Byte 3: Bits 0-7 Line number defining the bottom line of the area
  2722.  * that will participate in the roll.
  2723.  *
  2724.  * @param direction
  2725.  * @param topLine
  2726.  * @param bottomLine
  2727.  */
  2728. protected void rollScreen(int direction, int topLine, int bottomLine) {
  2729. // get the number of lines which are the last 5 bits
  2730. int lines = direction & 0x7F;
  2731. // get the direction of the roll which is the first bit
  2732. //    0 - up
  2733. //    1 - down
  2734. int updown = direction & 0x80;
  2735. // calculate the reference points for the move.
  2736. int start = this.getPos(topLine - 1, 0);
  2737. int end = this.getPos(bottomLine - 1, numCols - 1);
  2738. int len = end - start;
  2739. //      System.out.println(" starting roll");
  2740. //      dumpScreen();
  2741. switch (updown) {
  2742. case 0:
  2743. //  Now round em up and head em UP.
  2744. for (int x = start; x < len + numCols; x++) {
  2745. planes.setChar(x, planes.getChar(x + numCols));
  2746. }
  2747. break;
  2748. case 1:
  2749. //  Now round em up and head em DOWN.
  2750. for (int x = end + numCols; x > 0; x--) {
  2751. planes.setChar(x + numCols, planes.getChar(x));
  2752. }
  2753. break;
  2754. default:
  2755. log.warn(" Invalid roll parameter - please report this");
  2756. }
  2757. //      System.out.println(" end roll");
  2758. //      dumpScreen();
  2759. }
  2760. public void dumpScreen() {
  2761. StringBuffer sb = new StringBuffer();
  2762. char[] s = getScreenAsChars();
  2763. int c = getColumns();
  2764. int l = getRows() * c;
  2765. int col = 0;
  2766. for (int x = 0; x < l; x++, col++) {
  2767. sb.append(s[x]);
  2768. if (col == c) {
  2769. sb.append('n');
  2770. col = 0;
  2771. }
  2772. }
  2773. System.out.println(sb.toString());
  2774. }
  2775. /**
  2776.  * Add a field to the field format table.
  2777.  *
  2778.  * @param attr - Field attribute
  2779.  * @param len - length of field
  2780.  * @param ffw1 - Field format word 1
  2781.  * @param ffw2 - Field format word 2
  2782.  * @param fcw1 - Field control word 1
  2783.  * @param fcw2 - Field control word 2
  2784.  */
  2785. protected void addField(int attr, int len, int ffw1, int ffw2, int fcw1,
  2786. int fcw2) {
  2787. lastAttr = attr;
  2788. planes.setScreenCharAndAttr(lastPos, initChar, lastAttr, true);
  2789. setDirty(lastPos);
  2790. advancePos();
  2791. ScreenField sf = null;
  2792. // from 14.6.12 for Start of Field Order 5940 function manual
  2793. //  examine the format table for an entry that begins at the current
  2794. //  starting address plus 1.
  2795. if (screenFields.existsAtPos(lastPos)) {
  2796. screenFields.setCurrentFieldFFWs(ffw1, ffw2);
  2797. } else {
  2798. sf = screenFields.setField(attr, getRow(lastPos), getCol(lastPos),
  2799. len, ffw1, ffw2, fcw1, fcw2);
  2800. lastPos = sf.startPos();
  2801. int x = len;
  2802. boolean gui = guiInterface;
  2803. if (sf.isBypassField())
  2804. gui = false;
  2805. while (x-- > 0) {
  2806. if (planes.getChar(lastPos) == 0)
  2807. planes.setScreenCharAndAttr(lastPos, ' ', lastAttr, false);
  2808. else
  2809. planes.setScreenAttr(lastPos,lastAttr);
  2810. if (gui) {
  2811. planes.setUseGUI(lastPos,FIELD_MIDDLE);
  2812. }
  2813. // now we set the field plane attributes
  2814. planes.setScreenFieldAttr(lastPos,ffw1);
  2815. advancePos();
  2816. }
  2817. if (gui)
  2818. if (len > 1) {
  2819. planes.setUseGUI(sf.startPos(), FIELD_LEFT);
  2820. if (lastPos > 0)
  2821. planes.setUseGUI(lastPos - 1, FIELD_RIGHT);
  2822. else
  2823. planes.setUseGUI(lastPos,FIELD_RIGHT);
  2824. }
  2825.             else {
  2826. planes.setUseGUI(lastPos - 1,FIELD_ONE);
  2827.             }
  2828. //         screen[lastPos].setCharAndAttr(initChar,initAttr,true);
  2829. setEndingAttr(initAttr);
  2830. lastPos = sf.startPos();
  2831. }
  2832. //      if (fcw1 != 0 || fcw2 != 0) {
  2833. //         System.out.println("lr = " + lastRow + " lc = " + lastCol + " " +
  2834. // sf.toString());
  2835. //      }
  2836. sf = null;
  2837. }
  2838. //      public void addChoiceField(int attr, int len, int ffw1, int ffw2, int
  2839. // fcw1, int fcw2) {
  2840. //
  2841. //         lastAttr = attr;
  2842. //
  2843. //         screen[lastPos].setCharAndAttr(initChar,lastAttr,true);
  2844. //         setDirty(lastPos);
  2845. //
  2846. //         advancePos();
  2847. //
  2848. //         boolean found = false;
  2849. //         ScreenField sf = null;
  2850. //
  2851. //         // from 14.6.12 for Start of Field Order 5940 function manual
  2852. //         // examine the format table for an entry that begins at the current
  2853. //         // starting address plus 1.
  2854. //         for (int x = 0;x < sizeFields; x++) {
  2855. //            sf = screenFields[x];
  2856. //
  2857. //            if (lastPos == sf.startPos()) {
  2858. //               screenFields.getCurrentField() = sf;
  2859. //               screenFields.getCurrentField().setFFWs(ffw1,ffw2);
  2860. //               found = true;
  2861. //            }
  2862. //
  2863. //         }
  2864. //
  2865. //         if (!found) {
  2866. //            sf =
  2867. // setField(attr,getRow(lastPos),getCol(lastPos),len,ffw1,ffw2,fcw1,fcw2);
  2868. //
  2869. //            lastPos = sf.startPos();
  2870. //            int x = len;
  2871. //
  2872. //            boolean gui = guiInterface;
  2873. //            if (sf.isBypassField())
  2874. //               gui = false;
  2875. //
  2876. //            while (x-- > 0) {
  2877. //
  2878. //               if (screen[lastPos].getChar() == 0)
  2879. //                  screen[lastPos].setCharAndAttr(' ',lastAttr,false);
  2880. //               else
  2881. //                  screen[lastPos].setAttribute(lastAttr);
  2882. //
  2883. //               if (gui)
  2884. //                  screen[lastPos].setUseGUI(FIELD_MIDDLE);
  2885. //
  2886. //               advancePos();
  2887. //
  2888. //            }
  2889. //
  2890. //            if (gui)
  2891. //               if (len > 1) {
  2892. //                  screen[sf.startPos()].setUseGUI(FIELD_LEFT);
  2893. //                  if (lastPos > 0)
  2894. //                     screen[lastPos-1].setUseGUI(FIELD_RIGHT);
  2895. //                  else
  2896. //                     screen[lastPos].setUseGUI(FIELD_RIGHT);
  2897. //
  2898. //               }
  2899. //               else
  2900. //                  screen[lastPos-1].setUseGUI(FIELD_ONE);
  2901. //
  2902. //            setEndingAttr(initAttr);
  2903. //
  2904. //            lastPos = sf.startPos();
  2905. //         }
  2906. //
  2907. //   // if (fcw1 != 0 || fcw2 != 0) {
  2908. //   //
  2909. //   // System.out.println("lr = " + lastRow + " lc = " + lastCol + " " +
  2910. // sf.toString());
  2911. //   // }
  2912. //         sf = null;
  2913. //
  2914. //      }
  2915. /**
  2916.  * Return the fields that are contained in the Field Format Table
  2917.  *
  2918.  * @return ScreenFields object
  2919.  * @see org.tn5250j.ScreenFields
  2920.  */
  2921. public ScreenFields getScreenFields() {
  2922. return screenFields;
  2923. }
  2924. /**
  2925.  * Redraw the fields on the screen. Used for gui enhancement to redraw the
  2926.  * fields when toggling
  2927.  *
  2928.  */
  2929. protected void drawFields() {
  2930. ScreenField sf;
  2931. int sizeFields = screenFields.getSize();
  2932. for (int x = 0; x < sizeFields; x++) {
  2933. sf = screenFields.getField(x);
  2934. if (!sf.isBypassField()) {
  2935. int pos = sf.startPos();
  2936. int l = sf.length;
  2937. boolean f = true;
  2938. if (l >= lenScreen)
  2939. l = lenScreen - 1;
  2940. if (l > 1) {
  2941. while (l-- > 0) {
  2942. if (guiInterface && f) {
  2943. planes.setUseGUI(pos,FIELD_LEFT);
  2944. f = false;
  2945. } else {
  2946. planes.setUseGUI(pos,FIELD_MIDDLE);
  2947. }
  2948. if (guiInterface && l == 0) {
  2949. planes.setUseGUI(pos,FIELD_RIGHT);
  2950. }
  2951. setDirty(pos++);
  2952. }
  2953. } else {
  2954. planes.setUseGUI(pos,FIELD_ONE);
  2955. }
  2956. }
  2957. }
  2958.    updateDirty();
  2959. }
  2960. /**
  2961.  * Draws the field on the screen. Used to redraw or change the attributes of
  2962.  * the field.
  2963.  *
  2964.  * @param sf -
  2965.  *            Field to be redrawn
  2966.  * @see org.tn5250j.ScreenField.java
  2967.  */
  2968. protected void drawField(ScreenField sf) {
  2969. int pos = sf.startPos();
  2970. int x = sf.length;
  2971. while (x-- > 0) {
  2972. setDirty(pos++);
  2973. }
  2974. updateDirty();
  2975. }
  2976. /**
  2977.  * Set the field to be displayed as highlighted.
  2978.  *
  2979.  * @param sf -
  2980.  *            Field to be highlighted
  2981.  */
  2982. protected void setFieldHighlighted(ScreenField sf) {
  2983. int pos = sf.startPos();
  2984. int x = sf.length;
  2985. int na = sf.getHighlightedAttr();
  2986. while (x-- > 0) {
  2987. planes.setScreenAttr(pos,na);
  2988. setDirty(pos++);
  2989. }
  2990.       fireScreenChanged(1);
  2991. }
  2992. /**
  2993.  * Draw the field as un higlighted. This is used to reset the field
  2994.  * presentation on the screen after the field is exited.
  2995.  *
  2996.  * @param sf -
  2997.  *            Field to be unhighlighted
  2998.  */
  2999. protected void unsetFieldHighlighted(ScreenField sf) {
  3000. int pos = sf.startPos();
  3001. int x = sf.length;
  3002. int na = sf.getAttr();
  3003. while (x-- > 0) {
  3004. planes.setScreenAttr(pos,na);
  3005. setDirty(pos++);
  3006. }
  3007.       fireScreenChanged(1);
  3008. }
  3009. public boolean checkHotSpots() {
  3010.    return planes.checkHotSpots();
  3011. }
  3012. protected void setChar(int cByte) {
  3013. if (cByte > 0 && cByte < ' ') {
  3014. planes.setScreenCharAndAttr(lastPos, (char) 0x00, 33, false);
  3015. setDirty(lastPos);
  3016. advancePos();
  3017. } else {
  3018. if (lastPos > 0) {
  3019. if (planes.isAttributePlace(lastPos - 1)) // &&
  3020. lastAttr = planes.getCharAttr(lastPos - 1);
  3021. }
  3022. planes.setScreenCharAndAttr(lastPos, (char) cByte, lastAttr, false);
  3023. setDirty(lastPos);
  3024. if (guiInterface && !isInField(lastPos, false)) {
  3025. planes.setUseGUI(lastPos, NO_GUI);
  3026. }
  3027. advancePos();
  3028. }
  3029. }
  3030. protected void setEndingAttr(int cByte) {
  3031. int attr = lastAttr;
  3032. //      System.out.println("setting ending to " + cByte + " lastAttr is " +
  3033. // lastAttr +
  3034. //                     " at " + (lastRow + 1) + "," + (lastCol + 1));
  3035. //      System.out.print("setting ending to ");
  3036. setAttr(cByte);
  3037. lastAttr = attr;
  3038. }
  3039. protected void setAttr(int cByte) {
  3040. lastAttr = cByte;
  3041. //      int sattr = screen[lastPos].getCharAttr();
  3042. //         System.out.println("changing from " + sattr + " to attr " + lastAttr
  3043. // +
  3044. //                     " at " + (this.getRow(lastPos) + 1) + "," + (this.getCol(lastPos) +
  3045. // 1));
  3046. planes.setScreenCharAndAttr(lastPos, initChar, lastAttr, true);
  3047. setDirty(lastPos);
  3048. advancePos();
  3049. int pos = lastPos;
  3050. int times = 0;
  3051. //      sattr = screen[lastPos].getCharAttr();
  3052. //         System.out.println(" next position after change " + sattr + " last
  3053. // attr " + lastAttr +
  3054. //                     " at " + (this.getRow(lastPos) + 1) + "," + (this.getCol(lastPos) +
  3055. // 1) +
  3056. //                     " attr place " + screen[lastPos].isAttributePlace());
  3057. while (planes.getCharAttr(lastPos) != lastAttr
  3058. && !planes.isAttributePlace(lastPos)) {
  3059. planes.setScreenAttr(lastPos, lastAttr);
  3060. if (guiInterface && !isInField(lastPos, false)) {
  3061. int g = planes.getWhichGUI(lastPos);
  3062. if (g >= FIELD_LEFT && g <= FIELD_ONE)
  3063. planes.setUseGUI(lastPos,NO_GUI);
  3064. }
  3065. setDirty(lastPos);
  3066. times++;
  3067. advancePos();
  3068. }
  3069. // sanity check for right now
  3070. //      if (times > 200)
  3071. //         System.out.println(" setAttr = " + times + " start = " + (sr + 1) +
  3072. // "," + (sc + 1));
  3073. lastPos = pos;
  3074. }
  3075. protected void setScreenCharAndAttr(char right, int colorAttr, boolean isAttr) {
  3076.    planes.setScreenCharAndAttr(lastPos,right, colorAttr, isAttr);
  3077.    setDirty(lastPos);
  3078.    advancePos();
  3079. }
  3080. protected void setScreenCharAndAttr(char right, int colorAttr,
  3081.        int whichGui, boolean isAttr) {
  3082.    planes.setScreenCharAndAttr(lastPos,right, colorAttr, isAttr);
  3083.    planes.setUseGUI(lastPos,whichGui);
  3084.    setDirty(lastPos);
  3085.    advancePos();
  3086. }
  3087. /**
  3088.  * Draw or redraw the dirty parts of the screen and display them.
  3089.  *
  3090.  * Rectangle dirty holds the dirty area of the screen to be updated.
  3091.  *
  3092.  * If you want to change the screen in anyway you need to set the screen
  3093.  * attributes before calling this routine.
  3094.  */
  3095. protected void updateDirty() {
  3096.       fireScreenChanged(1);
  3097. }
  3098. protected void setDirty(int pos) {
  3099.    int minr = Math.min(getRow(pos),getRow(dirtyScreen.x));
  3100.    int minc = Math.min(getCol(pos),getCol(dirtyScreen.x));
  3101.    int maxr = Math.max(getRow(pos),getRow(dirtyScreen.y));
  3102.    int maxc = Math.max(getCol(pos),getCol(dirtyScreen.y));
  3103.    int x1 = getPos(minr,minc);
  3104.       int x2 = getPos(maxr,maxc);
  3105.       dirtyScreen.setBounds(x1,x2,0,0);
  3106. }
  3107. private void setDirty(int row, int col) {
  3108. setDirty(getPos(row, col));
  3109. }
  3110. private void resetDirty(int pos) {
  3111.       dirtyScreen.setBounds(pos,pos,0,0);
  3112. }
  3113. /**
  3114.  * Change the screen position by one column
  3115.  */
  3116. protected void advancePos() {
  3117. changePos(1);
  3118. }
  3119. /**
  3120.  * Change position of the screen by the increment of parameter passed.
  3121.  *
  3122.  * If the position change is under the minimum of the first screen position
  3123.  * then the position is moved to the last row and column of the screen.
  3124.  *
  3125.  * If the position change is over the last row and column of the screen then
  3126.  * cursor is moved to first position of the screen.
  3127.  *
  3128.  * @param i
  3129.  */
  3130. protected void changePos(int i) {
  3131. lastPos += i;
  3132. if (lastPos < 0)
  3133. lastPos = lenScreen + lastPos;
  3134. if (lastPos > lenScreen - 1)
  3135. lastPos = lastPos - lenScreen;
  3136. //      System.out.println(lastRow + "," + ((lastPos) / numCols) + "," +
  3137. //                         lastCol + "," + ((lastPos) % numCols) + "," +
  3138. //                         ((lastRow * numCols) + lastCol) + "," +
  3139. //                         (lastPos));
  3140. }
  3141. protected void goHome() {
  3142. //  now we try to move to first input field according to
  3143. //  14.6 WRITE TO DISPLAY Command
  3144. //    ? If the WTD command is valid, after the command is processed,
  3145. //          the cursor moves to one of three locations:
  3146. //    - The location set by an insert cursor order (unless control
  3147. //          character byte 1, bit 1 is equal to B'1'.)
  3148. //    - The start of the first non-bypass input field defined in the
  3149. //          format table
  3150. //    - A default starting address of row 1 column 1.
  3151. if (pendingInsert && homePos > 0) {
  3152. setCursor(getRow(homePos), getCol(homePos));
  3153. isInField(); // we now check if we are in a field
  3154. } else {
  3155. if (!gotoField(1)) {
  3156. homePos = getPos(1, 1);
  3157. setCursor(1, 1);
  3158. isInField(0, 0); // we now check if we are in a field
  3159. } else {
  3160. homePos = getPos(getCurrentRow(), getCurrentCol());
  3161. }
  3162. }
  3163. }
  3164. protected void setPendingInsert(boolean flag, int icX, int icY) {
  3165. pendingInsert = flag;
  3166. if (pendingInsert) {
  3167. homePos = getPos(icX, icY);
  3168. }
  3169. if (!isStatusErrorCode()) {
  3170. setCursor(icX, icY);
  3171. }
  3172. }
  3173. protected void setPendingInsert(boolean flag) {
  3174. if (homePos != -1)
  3175. pendingInsert = flag;
  3176. }
  3177. /**
  3178.  * Set the error line number to that of number passed.
  3179.  *
  3180.  * @param line
  3181.  */
  3182. protected void setErrorLine(int line) {
  3183. planes.setErrorLine(line);
  3184. }
  3185. /**
  3186.  * Returns the current error line number
  3187.  *
  3188.  * @return current error line number
  3189.  */
  3190. protected int getErrorLine() {
  3191. return planes.getErrorLine();
  3192. }
  3193. /**
  3194.  * Saves off the current error line characters to be used later.
  3195.  *
  3196.  */
  3197. protected void saveErrorLine() {
  3198.       planes.saveErrorLine();
  3199. }
  3200. /**
  3201.  * Restores the error line characters from the save buffer.
  3202.  *
  3203.  * @see #saveErrorLine()
  3204.  */
  3205. protected void restoreErrorLine() {
  3206. if (planes.isErrorLineSaved()) {
  3207.          planes.restoreErrorLine();
  3208.          fireScreenChanged(1,planes.getErrorLine()-1,0,planes.getErrorLine()-1,numCols - 1);
  3209. }
  3210. }
  3211. protected void setStatus(byte attr, byte value, String s) {
  3212. // set the status area
  3213. switch (attr) {
  3214. case STATUS_SYSTEM:
  3215. if (value == STATUS_VALUE_ON) {
  3216.             oia.setInputInhibited(ScreenOIA.INPUTINHIBITED_SYSTEM_WAIT,ScreenOIA.OIA_LEVEL_INPUT_INHIBITED, s);
  3217. statusXSystem = true;
  3218. }
  3219.          else {
  3220. statusXSystem = false;
  3221.             oia.setInputInhibited(ScreenOIA.INPUTINHIBITED_NOTINHIBITED,ScreenOIA.OIA_LEVEL_NOT_INHIBITED,s);
  3222.          }
  3223. break;
  3224. case STATUS_ERROR_CODE:
  3225. if (value == STATUS_VALUE_ON) {
  3226. setPrehelpState(true, true, false);
  3227. oia.setInputInhibited(ScreenOIA.INPUTINHIBITED_SYSTEM_WAIT,
  3228.        ScreenOIA.OIA_LEVEL_INPUT_ERROR,s);
  3229. Toolkit.getDefaultToolkit().beep();
  3230. } else {
  3231.    oia.setInputInhibited(ScreenOIA.INPUTINHIBITED_NOTINHIBITED,
  3232.           ScreenOIA.OIA_LEVEL_NOT_INHIBITED);
  3233. setPrehelpState(false, true, true);
  3234. homePos = saveHomePos;
  3235. saveHomePos = 0;
  3236. pendingInsert = false;
  3237. }
  3238. break;
  3239. }
  3240. }
  3241. protected boolean isStatusErrorCode() {
  3242. return oia.getLevel() == ScreenOIA.OIA_LEVEL_INPUT_ERROR;
  3243. }
  3244. /**
  3245.     * This routine clears the screen, resets row and column to 0, resets the
  3246.     * last attribute to 32, clears the fields, turns insert mode off,
  3247.     * clears/initializes the screen character array.
  3248.     */
  3249.    protected void clearAll() {
  3250.       lastAttr = 32;
  3251.       lastPos = 0;
  3252.       clearTable();
  3253.       clearScreen();
  3254.       planes.setScreenAttr(0, initAttr);
  3255.       oia.setInsertMode(false);
  3256.    }
  3257. /**
  3258.  * Clear the fields table
  3259.  */
  3260. protected void clearTable() {
  3261. oia.setKeyBoardLocked(true);
  3262. screenFields.clearFFT();
  3263. planes.initalizeFieldPlanes();
  3264. pendingInsert = false;
  3265. homePos = -1;
  3266. }
  3267. /**
  3268.  * Clear the gui constructs
  3269.  *
  3270.  */
  3271. protected void clearGuiStuff() {
  3272. for (int x = 0; x < lenScreen; x++) {
  3273.          planes.setUseGUI(x,NO_GUI);
  3274. }
  3275.       dirtyScreen.setBounds(0,lenScreen - 1,0,0);
  3276. }
  3277. /**
  3278.  * Clear the screen by setting the initial character and initial attribute
  3279.  * to all the positions on the screen
  3280.  */
  3281. protected void clearScreen() {
  3282.       planes.initalizePlanes();
  3283.       dirtyScreen.setBounds(0,lenScreen - 1,0,0);
  3284.       oia.clearScreen();
  3285. }
  3286. protected void restoreScreen() {
  3287. lastAttr = 32;
  3288.       dirtyScreen.setBounds(0,lenScreen - 1,0,0);
  3289.       updateDirty();
  3290. }
  3291.    /**
  3292.     * Notify all registered listeners of the onScreenChanged event.
  3293.     *
  3294.     */
  3295.    private void fireScreenChanged(int which, int startRow, int startCol,
  3296.                                  int endRow, int endCol) {
  3297.       if (listeners != null) {
  3298.          int size = listeners.size();
  3299.          for (int i = 0; i < size; i++) {
  3300.             ScreenListener target =
  3301.                     (ScreenListener)listeners.elementAt(i);
  3302.             target.onScreenChanged(1,startRow,startCol,endRow,endCol);
  3303.          }
  3304.       }
  3305.       dirtyScreen.setBounds(lenScreen,0,0,0);
  3306.    }
  3307.    /**
  3308.     * Notify all registered listeners of the onScreenChanged event.
  3309.     *
  3310.     */
  3311.    private synchronized void fireScreenChanged(int update) {
  3312.       if (dirtyScreen.x > dirtyScreen.y) {
  3313. //         log.info(" x < y " + dirtyScreen);
  3314.          return;
  3315.       }
  3316.       fireScreenChanged(update, getRow(dirtyScreen.x), getCol(dirtyScreen.x),
  3317.                                  getRow(dirtyScreen.y), getCol(dirtyScreen.y));
  3318.    }
  3319.    /**
  3320.     * Notify all registered listeners of the onScreenChanged event.
  3321.     *
  3322.     */
  3323.    private synchronized void fireCursorChanged(int update) {
  3324.       int startRow = getRow(lastPos);
  3325.       int startCol = getCol(lastPos);
  3326.       if (listeners != null) {
  3327.          int size = listeners.size();
  3328.          for (int i = 0; i < size; i++) {
  3329.             ScreenListener target =
  3330.                     (ScreenListener)listeners.elementAt(i);
  3331.             target.onScreenChanged(update,startRow,startCol,startRow,startCol);
  3332.          }
  3333.       }
  3334.    }
  3335.    /**
  3336.     * Notify all registered listeners of the onScreenSizeChanged event.
  3337.     *
  3338.     */
  3339.    private void fireScreenSizeChanged() {
  3340.       if (listeners != null) {
  3341.          int size = listeners.size();
  3342.          for (int i = 0; i < size; i++) {
  3343.             ScreenListener target =
  3344.                   (ScreenListener)listeners.elementAt(i);
  3345.             target.onScreenSizeChanged(numRows,numCols);
  3346.          }
  3347.       }
  3348.    }
  3349. /**
  3350.  * This method does a complete refresh of the screen.
  3351.  */
  3352. public final void updateScreen() {
  3353. repaintScreen();
  3354. setCursorActive(false);
  3355. setCursorActive(true);
  3356. }
  3357.    /**
  3358.     * Add a ScreenListener to the listener list.
  3359.     *
  3360.     * @param listener  The ScreenListener to be added
  3361.     */
  3362.    public void addScreenListener(ScreenListener listener) {
  3363.       if (listeners == null) {
  3364.           listeners = new java.util.Vector(3);
  3365.       }
  3366.       listeners.addElement(listener);
  3367.    }
  3368.    /**
  3369.     * Remove a ScreenListener from the listener list.
  3370.     *
  3371.     * @param listener  The ScreenListener to be removed
  3372.     */
  3373.    public void removeScreenListener(ScreenListener listener) {
  3374.       if (listeners == null) {
  3375.           return;
  3376.       }
  3377.       listeners.removeElement(listener);
  3378.    }
  3379. /**
  3380.  * Utility method to share the repaint behaviour between setBounds() and
  3381.  * updateScreen.
  3382.  */
  3383. public void repaintScreen() {
  3384.    setCursorOff();
  3385.       dirtyScreen.setBounds(0,lenScreen - 1,0,0);
  3386.       updateDirty();
  3387. // restore statuses that were on the screen before resize
  3388. if (oia.getLevel() == ScreenOIA.OIA_LEVEL_INPUT_ERROR) {
  3389.    oia.setInputInhibited(ScreenOIA.INPUTINHIBITED_SYSTEM_WAIT,
  3390.           ScreenOIA.OIA_LEVEL_INPUT_ERROR);
  3391. }
  3392. if (oia.getLevel() == ScreenOIA.OIA_LEVEL_INPUT_INHIBITED) {
  3393.    oia.setInputInhibited(ScreenOIA.INPUTINHIBITED_SYSTEM_WAIT,
  3394.           ScreenOIA.OIA_LEVEL_INPUT_INHIBITED);
  3395. }
  3396. if (oia.isMessageWait())
  3397. oia.setMessageLightOn();
  3398.       setCursorOn();
  3399. }
  3400. // ADDED BY BARRY - changed by Kenneth to use the character plane
  3401.    //  This should be replaced with the getPlane methods when they are implemented
  3402. public char[] getCharacters() {
  3403. return planes.screen;
  3404. }
  3405. }