@Override
 public void setBackground(Color c) {
   if (txt_box == null)
     return; // WORKAROUND.OSX: OSX LookAndFeel calls setBackground during ctor of Mem_html;
   // DATE:2015-05-11
   if (c.getRGB() == Color.BLACK.getRGB()) txt_box.setCaretColor(Color.WHITE);
   else if (c.getRGB() == Color.WHITE.getRGB()) txt_box.setCaretColor(Color.BLACK);
   super.setBackground(c);
 }
  void OverrideKeyBindings() {
    Set<AWTKeyStroke> forTraSet = new HashSet<AWTKeyStroke>();
    txt_box.setFocusTraversalKeys(KeyboardFocusManager.FORWARD_TRAVERSAL_KEYS, forTraSet);
    txt_box.setFocusTraversalKeys(KeyboardFocusManager.BACKWARD_TRAVERSAL_KEYS, forTraSet);

    GxwTextBox_overrideKeyCmd.noop_(
        (GfuiElem) host, txt_box, "control H"); // else ctrl+h deletes current char
    //		GxwTextBox_overrideKeyCmd.new_(txt_box, "ENTER", Env_.NewLine); // else enter will always
    // use \n on window; jtextBox allows separation of \r from \n
  }
  public void ctor_MsTextBoxMultiline_() {
    txt_box = new GxwTextBox_lang();
    txt_box.ctor_MsTextBox_();
    core = new GxwCore_host(GxwCore_lang.new_(this), txt_box.ctrlMgr);
    this.setViewportView(txt_box);
    txt_box.setLineWrap(true);
    txt_box.setWrapStyleWord(true); // else text will wrap in middle of words
    this.setVerticalScrollBarPolicy(ScrollPaneConstants.VERTICAL_SCROLLBAR_NEVER);
    this.setBorder(null);
    txt_box.setBorder(BorderFactory.createLineBorder(Color.BLACK));
    txt_box.setCaretColor(Color.BLACK);
    txt_box.getCaret().setBlinkRate(0);
    txt_box.setMargin(new Insets(0, 200, 200, 0));
    OverrideKeyBindings();
    InitUndoMgr();
    txt_box.setCaret(
        new javax.swing.text.DefaultCaret() {
          public void setSelectionVisible(boolean vis) {
            super.setSelectionVisible(true);
          }
        }); // else highlighted selection will not be visible when text box loses focus
    //		this.setLayout(null);

    //		Object fontDefinition = new UIDefaults.ProxyLazyValue("javax.swing.plaf.FontUIResource",
    // null, new Object[] { "dialog", new Integer(Font.PLAIN), new Integer(12) });
    //		java.util.Enumeration keys = UIManager.getDefaults().keys();
    //		while (keys.hasMoreElements()) {
    //		    Object key = keys.nextElement();
    //		    Object value = UIManager.get(key);
    //		    if (value instanceof javax.swing.plaf.FontUIResource) {
    //		        UIManager.put(key, fontDefinition);
    //		    }
    //		}
  }
  void InitUndoMgr() {
    final UndoManager undo = new UndoManager();
    Document doc = txt_box.getDocument();

    // Listen for undo and redo events
    doc.addUndoableEditListener(
        new UndoableEditListener() {
          public void undoableEditHappened(UndoableEditEvent evt) {
            undo.addEdit(evt.getEdit());
          }
        });

    // Create an undo action and add it to the text component
    txt_box
        .getActionMap()
        .put(
            "Undo",
            new AbstractAction("Undo") {
              public void actionPerformed(ActionEvent evt) {
                try {
                  if (undo.canUndo()) {
                    undo.undo();
                  }
                } catch (CannotUndoException e) {
                }
              }
            });

    // Bind the undo action to ctl-Z
    txt_box.getInputMap().put(KeyStroke.getKeyStroke("control Z"), "Undo");

    // Create a redo action and add it to the text component
    txt_box
        .getActionMap()
        .put(
            "Redo",
            new AbstractAction("Redo") {
              public void actionPerformed(ActionEvent evt) {
                try {
                  if (undo.canRedo()) {
                    undo.redo();
                  }
                } catch (CannotRedoException e) {
                }
              }
            });

    // Bind the redo action to ctl-Y
    txt_box.getInputMap().put(KeyStroke.getKeyStroke("control Y"), "Redo");
  }
 public void Margins_set(int left, int top, int right, int bot) {
   if (left == 0 && right == 0) {
     txt_box.setBorder(BorderFactory.createLineBorder(Color.BLACK));
     txt_box.setMargin(new Insets(0, 0, 0, 0));
   } else {
     //			txt_box.setBorder(BasicBorders.getTextFieldBorder());
     //			txt_box.setMargin(new Insets(0, l, 0, r));
     txt_box.setFont(new Font("Courier New", FontStyleAdp_.Plain.Val(), 12));
     txt_box.setBorder(
         BorderFactory.createCompoundBorder(
             BorderFactory.createLineBorder(Color.BLACK),
             BorderFactory.createEmptyBorder(top, left, bot, right)));
   }
 }
 public void OverrideTabKey_(boolean v) {
   txt_box.OverrideTabKey_(v);
   if (v) {
     Set<AWTKeyStroke> forTraSet = new HashSet<AWTKeyStroke>();
     txt_box.setFocusTraversalKeys(KeyboardFocusManager.FORWARD_TRAVERSAL_KEYS, forTraSet);
     txt_box.setFocusTraversalKeys(KeyboardFocusManager.BACKWARD_TRAVERSAL_KEYS, forTraSet);
   } else {
     Set<AWTKeyStroke> forTraSet = new HashSet<AWTKeyStroke>();
     txt_box.setFocusTraversalKeys(KeyboardFocusManager.FORWARD_TRAVERSAL_KEYS, forTraSet);
     txt_box.setFocusTraversalKeys(KeyboardFocusManager.BACKWARD_TRAVERSAL_KEYS, forTraSet);
     GxwTextBox_overrideKeyCmd.focus_(
         (GfuiElem) host, txt_box, "TAB"); // else ctrl+h deletes current char
     GxwTextBox_overrideKeyCmd.focusPrv_(
         (GfuiElem) host, txt_box, "shift TAB"); // else ctrl+h deletes current char
     //			Set<AWTKeyStroke> forTraSet = new HashSet<AWTKeyStroke> ();
     //			forTraSet.add(AWTKeyStroke.getAWTKeyStroke("TAB"));
     //			Set<AWTKeyStroke> bwdTraSet = new HashSet<AWTKeyStroke> ();
     //			bwdTraSet.add(AWTKeyStroke.getAWTKeyStroke("control TAB"));
     //			txt_box.setFocusTraversalKeys(KeyboardFocusManager.FORWARD_TRAVERSAL_KEYS, forTraSet);
     //			txt_box.setFocusTraversalKeys(KeyboardFocusManager.BACKWARD_TRAVERSAL_KEYS, bwdTraSet);
     //			txt_box.OverrideTabKey_(false);
   }
 }
 public void SelLen_set(int v) {
   txt_box.SelLen_set(v);
 }
 public boolean Border_on() {
   return txt_box.Border_on();
 }
 public void Host_set(GxwCbkHost host) {
   this.host = host;
   txt_box.Host_set(host);
 }
 public Object Invk(GfsCtx ctx, int ikey, String k, GfoMsg m) {
   if (ctx.Match(k, GxwElem_lang.AlignH_cmd)) AlignH_(GfuiAlign_.cast(m.CastObj("v")));
   return txt_box.Invk(ctx, ikey, k, m);
 }
 public void TextVal_set(String v) {
   txt_box.TextVal_set(v);
   txt_box.setSelectionStart(0);
   txt_box.setSelectionEnd(0); // else selects whole text and scrolls to end of selection
 }
 public String TextVal() {
   return txt_box.TextVal();
 }
 public void SendKeyDown(IptKey key) {
   txt_box.SendKeyDown(key);
 }
 public void EnableDoubleBuffering() {
   txt_box.EnableDoubleBuffering();
 }
 public void Border_on_(boolean v) {
   txt_box.Border_on_(v);
 }
 public int SelLen() {
   return txt_box.SelLen();
 }
 public int SelBgn() {
   return txt_box.SelBgn();
 }
 public boolean OverrideTabKey() {
   return txt_box.OverrideTabKey();
 }
 public void CreateControlIfNeeded() {
   txt_box.CreateControlIfNeeded();
 }