All Downloads are FREE. Search and download functionalities are using the official Maven repository.

org.netbeans.modeler.label.multiline.EditControlImpl Maven / Gradle / Ivy

Go to download

Jeddict is an open source Jakarta EE application development platform that accelerates developers productivity and simplifies development tasks of creating complex entity relationship models.

There is a newer version: 6.6.0
Show newest version
/**
 * Copyright 2013-2022 Gaurav Gupta
 *
 * Licensed under the Apache License, Version 2.0 (the "License"); you may not
 * use this file except in compliance with the License. You may obtain a copy of
 * the License at
 *
 * http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
 * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
 * License for the specific language governing permissions and limitations under
 * the License.
 */
package org.netbeans.modeler.label.multiline;

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Component;
import java.awt.Container;
import java.awt.Dimension;
import java.awt.Font;
import java.awt.FontMetrics;
import java.awt.Point;
import java.awt.event.ActionEvent;
import java.awt.event.FocusEvent;
import java.awt.event.FocusListener;
import java.awt.event.InputEvent;
import java.awt.event.InputMethodEvent;
import java.awt.event.InputMethodListener;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.lang.ref.WeakReference;
import java.text.CharacterIterator;
import javax.swing.AbstractAction;
import javax.swing.Action;
import javax.swing.InputMap;
import javax.swing.JButton;
import javax.swing.JMenuItem;
import javax.swing.JPanel;
import javax.swing.JPopupMenu;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import javax.swing.JTextField;
import javax.swing.KeyStroke;
import javax.swing.SwingUtilities;
import javax.swing.ToolTipManager;
import javax.swing.border.LineBorder;
import javax.swing.event.CaretEvent;
import javax.swing.event.DocumentEvent;
import javax.swing.event.DocumentListener;
import javax.swing.text.DefaultEditorKit;
import javax.swing.text.DefaultStyledDocument;
import javax.swing.text.JTextComponent;
import javax.swing.text.Keymap;
import org.netbeans.api.visual.action.InplaceEditorProvider;

public class EditControlImpl extends JPanel implements /*IEditControl,*/ InputMethodListener {

    static final JTextComponent.KeyBinding[] defaultBindings
            = {
                new JTextComponent.KeyBinding(KeyStroke.getKeyStroke(KeyEvent.VK_C, InputEvent.CTRL_MASK), DefaultEditorKit.copyAction),
                new JTextComponent.KeyBinding(KeyStroke.getKeyStroke(KeyEvent.VK_INSERT, InputEvent.CTRL_MASK), DefaultEditorKit.copyAction), //new JTextComponent.KeyBinding(KeyStroke.getKeyStroke(KeyEvent.VK_V, InputEvent.CTRL_MASK), DefaultEditorKit.pasteAction),
            //new JTextComponent.KeyBinding(KeyStroke.getKeyStroke(KeyEvent.VK_X, InputEvent.CTRL_MASK), DefaultEditorKit.cutAction)
            };

    private JTextComponent m_Field = null;
    private JButton m_Button = null;
    private JPanel m_Panel = null;
    private JPopupMenu m_TooltipMenu = null;

//   private ITranslator m_Translator = null;//gg2
//   private IEditControlEventDispatcher m_EventDispatcher = null;
//    private IStrings m_List = null;
    private String m_InitialData = "";
    private boolean m_Modified = false;
    private String m_SeparatorList = "";

    private boolean m_VeryFirstTime = false;
    private boolean m_IgnoreTextUpdate = false;
    private boolean m_UpdatingField = false;
    private Point m_LocationOnScreen = null;
    private String m_TooltipText = "";
    //private Color m_TooltipBGColor = UIManager.getColor("ToolTip.foreground");
    private Color m_TooltipBGColor = new Color(232, 228, 232); //UIManager.getColor("controlLtHighlight");

    private WeakReference m_Parent = null;

    private int m_SelectionStartPos = 0;
    private int m_SelectionEndPos = 0;

    private int m_InitialLoc = 0;

    private boolean m_ShiftDown = false;
    private boolean m_ControlDown = false;
    private int m_LastKey = 0;
    private Color m_BackgroundColor = null;

    private boolean m_IsMultiline = false;
    private boolean m_ShowTooltips = true;

    // state maintenance variables for in-between InputMethodTextChanged calls
    private int ime_SelectionStartPos = 0;
    private int ime_SelectionEndPos = 0;
    private int ime_InitialLoc = 0;
    private boolean ime_Cached = false;
    private StringBuffer ime_CachedChars = null;

    /**
     *
     */
    public EditControlImpl(Object parent) {
        this(parent, false);
    }

    public EditControlImpl(Object parent, boolean multiline) {
        super();

        m_IsMultiline = multiline;
        setAssociatedParent(parent);
        establishPreferences();
        initComponents();
        initControl();
    }

    public EditControlImpl() {
        this(false);
    }

    public EditControlImpl(boolean multiline) {
        super();

        m_IsMultiline = multiline;
        establishPreferences();
        initComponents();
        initControl();
    }

    public void addDocumentListener(DocumentListener listener) {
        if (m_Field != null) {
            m_Field.getDocument().addDocumentListener(listener);
        }
    }

    public void removeDocumentListener(DocumentListener listener) {
        if (m_Field != null) {
            m_Field.getDocument().removeDocumentListener(listener);
        }
    }

    private void establishPreferences() {
        //kris richards - "ShowEditToolTip" pref expunged. Set to "PSK_YES".
        //this method no longer does anything.
    }

    private class CutAction extends AbstractAction {
        /* (non-Javadoc)
         * @see java.awt.event.ActionListener#actionPerformed(java.awt.event.ActionEvent)
         */

        @Override
        public void actionPerformed(ActionEvent e) {
            setSel(m_Field.getSelectionStart(), m_Field.getSelectionEnd());
            //m_Translator.cutToClipboard();
            //         m_Field.paste();
        }
    }

    private class PasteAction extends AbstractAction {
        /* (non-Javadoc)
         * @see java.awt.event.ActionListener#actionPerformed(java.awt.event.ActionEvent)
         */

        @Override
        public void actionPerformed(ActionEvent e) {
            setSel(m_Field.getSelectionStart(), m_Field.getSelectionEnd());
            // m_Translator.pasteFromClipboard();
            //         m_Field.paste();
        }
    }

    protected void initControl() {
//      //now instantiate the event dispatcher   //gg2
//      ICoreProduct prod = ProductRetriever.retrieveProduct();
//      if (prod != null)
//      {
//         // Get the edit control event dispatcher
//         DispatchHelper disp = new DispatchHelper();
//         IEventDispatcher dispatcher = disp.getEditControlDispatcher();
//         putEventDispatcher(dispatcher);
//      }

        // Added support for copy, cut & paste
        Keymap map = m_Field.getKeymap();
        JTextComponent.loadKeymap(map, defaultBindings, m_Field.getActions());
        {
            KeyStroke keyStroke = KeyStroke.getKeyStroke(KeyEvent.VK_V, InputEvent.CTRL_MASK);
            map.addActionForKeyStroke(keyStroke, new PasteAction());
            map.addActionForKeyStroke(KeyStroke.getKeyStroke(KeyEvent.VK_INSERT, InputEvent.SHIFT_MASK), new PasteAction());
            keyStroke = KeyStroke.getKeyStroke(KeyEvent.VK_X, InputEvent.CTRL_MASK);
            map.addActionForKeyStroke(keyStroke, new CutAction());

            m_Field.setKeymap(map);
        }

        addFocusListener(new FocusListener() {

            @Override
            public void focusGained(FocusEvent e) {
                m_Field.requestFocusInWindow();
            }

            @Override
            public void focusLost(FocusEvent e) {

            }
        });

        m_Field.addKeyListener(new KeyListener() {
            //we want this key listener to handle "ENTER" and "ESCAPE" key presses -
            // "ENTER" - commits the changes
            // "ESCAPE" - cancels the changes.

            @Override
            public void keyTyped(KeyEvent e) {
                handleTypedKey(e);
                e.consume();
            }

            @Override
            public void keyPressed(KeyEvent e) {
                handleKeyDown(e);
                //e.consume();
            }

            @Override
            public void keyReleased(KeyEvent e) {
                e.consume();
                //handleKey(e);
            }
        });

        if (m_IsMultiline == false) {
            m_Field.addCaretListener((CaretEvent e) -> {
//                if (m_Translator != null)
//                {
//                   if (m_ShowTooltips)
//                   {
//                      m_Translator.updateHints();
//                   }
//                }
            });

            //		m_Field.getDocument().addDocumentListener(m_docListener);
            //I want the tooltips to show continuously.
            ToolTipManager.sharedInstance().setInitialDelay(0);
            ToolTipManager.sharedInstance().setDismissDelay(1000000);

            m_Field.addFocusListener(new FocusListener() {

                @Override
                public void focusGained(FocusEvent e) {
                    try {
                        showToolTip(e);
                    } catch (Exception exp) {
                        exp.printStackTrace();
                    }
                }

                @Override
                public void focusLost(FocusEvent e) {
                    hideToolTip(e);
                }
            });

            m_Field.addMouseListener(new MouseListener() {

                @Override
                public void mouseClicked(MouseEvent arg0) {
                    //				if (arg0.getClickCount() == 2)
                    //				{
                    //					//some field will be selected, so set the selection start and end accordingly.
                    //					Object source = arg0.getSource();
                    //					if (source != null && source instanceof JTextField)
                    //					{
                    //						JTextField field = (JTextField)source;
                    //						int start = field.getSelectionStart();
                    //						int end = field.getSelectionEnd();
                    //						setSel(start, end);
                    //					}
                    //				}
                    arg0.consume();
                }

                @Override
                public void mousePressed(MouseEvent arg0) {
                    //I want to set the selection start and end positions if its single click.
                    if (arg0.getClickCount() == 1) {
                        int pos = getCurrentPosition();
                        setSel(pos, pos);
                    }
                }

                @Override
                public void mouseReleased(MouseEvent arg0) {
                    arg0.consume();
                }

                @Override
                public void mouseEntered(MouseEvent arg0) {
                    arg0.consume();
                }

                @Override
                public void mouseExited(MouseEvent arg0) {
                    arg0.consume();
                }
            });

        }
        m_Field.addInputMethodListener(this);
    }

    private void handleTypedKey(KeyEvent e) {
        if (!(e.isAltDown() || e.isControlDown() || e.isMetaDown())) {
            char ch = e.getKeyChar();
            if ((int) ch != 8 // don't need backspace key_typed 
                    && (int) ch != 127 // don't need delete key_typed, see 4904441
                    && (int) ch != 10) // don't need enter key_typed either
            {
                handleTypedChar(ch);
            }
        }
    }

    public void handleTypedChar(char ch) {
        //something is typed
        int currPos = getCurrentPosition();
        m_InitialLoc = currPos;

        //IEditControlField field = getCurrentField();
        String toIns = Character.toString(ch);
        boolean selectedText = false;
        setSel(m_Field.getSelectionStart(), m_Field.getSelectionEnd());
        if (m_SelectionEndPos != m_SelectionStartPos) {
            selectedText = true;
            currPos = m_SelectionStartPos;
        }
//      if (m_Translator != null)
//      {
//         int index = m_SeparatorList.indexOf(toIns);
//         boolean isHandled = false;
//         if (index >= 0)
//         {
//            isHandled = m_Translator.handleTopLevelSeparators(ch);
//         }
//         if (!isHandled)
//         {
//            isHandled = m_Translator.handleChar(toIns);
//
//            if (isHandled)
//            {
        //if I have handled here, then we are going to move caret position by one.
        String text = m_Field.getText();
        if (text != null) {
            if (selectedText) {
                m_Field.setCaretPosition(currPos + 1);
            } else {
                if (text.length() > m_InitialLoc) {
                    m_Field.setCaretPosition(m_InitialLoc + 1);
                } else {
                    m_Field.setCaretPosition(text.length());
                }
            }
        }
//            }
//         }
//      }
    }

    public void handleKeyDown(int keyCode, int nShift) {
        m_InitialLoc = getCurrentPosition();
        boolean consumeEvent = true;
        boolean selectedText = false;
        Object associateParents = getAssociatedParent();

        if (m_SelectionEndPos != m_SelectionStartPos) {
            selectedText = true;
        }
        int pos = getCurrentPosition();
        if (keyCode == KeyEvent.VK_ENTER) {
            //commit the changes to the edit control
            if (associateParents != null) {
//            if (associateParents instanceof ProjectTreeCellEditor)
//            {
//               ((ProjectTreeCellEditor)associateParents).stopCellEditing();
//            }
//            else 
                if (associateParents instanceof InplaceEditorProvider.EditorController) {
                    Container parent = getParent();
                    ((InplaceEditorProvider.EditorController) associateParents).closeEditor(true);
                    parent.requestFocusInWindow();
                }
            }
            consumeEvent = false;
        } else if (keyCode == KeyEvent.VK_ESCAPE) {
            //cancel out the changes made to edit control
            if (associateParents != null) {
//             if (associateParents instanceof ProjectTreeCellEditor)
//            {
//               ((ProjectTreeCellEditor)associateParents).cancelCellEditing();
//            }
//            else 
                if (associateParents instanceof InplaceEditorProvider.EditorController) {
                    Container parent = getParent();
                    ((InplaceEditorProvider.EditorController) associateParents).closeEditor(false);
                    parent.requestFocusInWindow();
                }
            }
            consumeEvent = false;
        } else if (keyCode == KeyEvent.VK_DELETE) {
//         if (m_Translator != null)
//         {
//            m_Translator.handleDelete(true);

            //we need to reposition caret at the original position if nothing is selected
            if (selectedText) {
                m_Field.setCaretPosition(m_SelectionEndPos);
            } else {
                m_Field.setCaretPosition(m_InitialLoc);
            }
//         }
        } else if (keyCode == KeyEvent.VK_BACK_SPACE) {
//         if (m_Translator != null)
//         {
//            m_Translator.handleDelete(false);

            //we need to reposition caret at one less than original position if nothing is selected
            if (m_InitialLoc > 0) {
                if (selectedText) {
                    m_Field.setCaretPosition(m_SelectionEndPos);
                } else {
                    m_Field.setCaretPosition(m_InitialLoc - 1);
                }
            } else {
                m_Field.setCaretPosition(m_InitialLoc);
            }
            //  }
        } else if (keyCode == KeyEvent.VK_RIGHT || keyCode == KeyEvent.VK_LEFT || keyCode == KeyEvent.VK_TAB) {
//         if (m_Translator != null)
//         {
//            m_Translator.handleKeyDown(keyCode);
//         }
        } else if (keyCode == KeyEvent.VK_HOME || keyCode == KeyEvent.VK_END
                || keyCode == KeyEvent.VK_SHIFT || keyCode == KeyEvent.VK_INSERT
                || keyCode == KeyEvent.VK_F1 || keyCode == KeyEvent.VK_F2
                || keyCode == KeyEvent.VK_F3 || keyCode == KeyEvent.VK_F4
                || keyCode == KeyEvent.VK_F5 || keyCode == KeyEvent.VK_F6
                || keyCode == KeyEvent.VK_F7 || keyCode == KeyEvent.VK_F8
                || keyCode == KeyEvent.VK_F9 || keyCode == KeyEvent.VK_F10
                || keyCode == KeyEvent.VK_F11 || keyCode == KeyEvent.VK_F12
                || keyCode == KeyEvent.VK_F13 || keyCode == KeyEvent.VK_F14
                || keyCode == KeyEvent.VK_F15 || keyCode == KeyEvent.VK_F16
                || keyCode == KeyEvent.VK_F17 || keyCode == KeyEvent.VK_F18
                || keyCode == KeyEvent.VK_F19 || keyCode == KeyEvent.VK_F20
                || keyCode == KeyEvent.VK_F21 || keyCode == KeyEvent.VK_F22
                || keyCode == KeyEvent.VK_F23 || keyCode == KeyEvent.VK_F24
                || keyCode == KeyEvent.VK_ALT || keyCode == KeyEvent.VK_CONTROL) {
            consumeEvent = false;
        } else {
//         //we will get here when the edit control is not yet shown but the user keeps typing/ a fast typer.
//         if (m_Translator != null)
//         {
//            if (nShift == 1)
//            {
//               String str = String.valueOf(Character.toLowerCase((char)keyCode));
//               m_Translator.handleChar(str);
//            }
//            else
//            {
//               String str = String.valueOf(Character.toString((char)keyCode));
//               m_Translator.handleChar(str);
//            }
//         }
        }

        //		if (consumeEvent && !e.isConsumed())
        //		{
        //			e.consume();
        //		}
        //I want to set the selection start and end positions.
        pos = getCurrentPosition();
        setSel(pos, pos);
    }

    public void handleKeyDown(KeyEvent e) {
        int keyCode = e.getKeyCode();
        m_InitialLoc = getCurrentPosition();
//        IEditControlField initField = getCurrentField();
        Object associatedParent = getAssociatedParent();

        //in case of mouse selection, we will come here with selected text.
        boolean consumeEvent = true;
        boolean resetSel = true;
        boolean selectedText = false;
        m_ControlDown = e.isControlDown();
        m_ShiftDown = e.isShiftDown();
        m_LastKey = keyCode;
        int pos = m_InitialLoc;
        if (keyCode == KeyEvent.VK_ENTER) {
            //Ctrl-Enter create a newline in multi-line editor
            if (isControlDown()) {
                if (m_IsMultiline) {
//                    IEditControlField ecf = getCurrentField();  
                    m_Field.replaceSelection("\n");

//                    if (ecf != null)
//                    {
//                        ecf.setText(m_Field.getText());
//                    } 
                }
                consumeEvent = true;
                resetSel = false;
//                m_Field.setCaretPosition(m_Field.getCaretPosition() + 1);
            } else {
                //commit the changes to the edit control
                if (associatedParent != null) {
//                    if (associatedParent instanceof ProjectTreeCellEditor)
//                    {
//                        if (!((ProjectTreeCellEditor) associatedParent).stopCellEditing())
//                        {
//                            //cancel cell editing and go back to prev state.
//                            cancelCellEditing();
//                        }
//                        IProduct prod = ProductHelper.getProduct();
//                        if (prod instanceof IADProduct)
//                        {
//                            IADProduct adProd = (IADProduct) prod;
//                            IProjectTreeControl tree = adProd.getProjectTree();
//                            if (tree != null)
//                            {
//                                tree.refresh(true);
//                            }
//                        }
//                    }
//                    else
                    {
                        if (associatedParent instanceof InplaceEditorProvider.EditorController) {
                            Container parent = getParent();
                            ((InplaceEditorProvider.EditorController) associatedParent).closeEditor(true);
                            parent.requestFocusInWindow();
                        }
                    }
                }
                consumeEvent = true;
            }
        } else if (keyCode == KeyEvent.VK_ESCAPE) {
            //cancel cell editing and go back to prev state.
            cancelCellEditing();
            if (associatedParent instanceof InplaceEditorProvider.EditorController) {
                Container parent = getParent();
                ((InplaceEditorProvider.EditorController) associatedParent).closeEditor(false);
                parent.requestFocusInWindow();
            }
            consumeEvent = true;
        } else if (keyCode == KeyEvent.VK_HOME || keyCode == KeyEvent.VK_END
                || keyCode == KeyEvent.VK_SHIFT || keyCode == KeyEvent.VK_INSERT
                || keyCode == KeyEvent.VK_F1 || keyCode == KeyEvent.VK_F2
                || keyCode == KeyEvent.VK_F3 || keyCode == KeyEvent.VK_F4
                || keyCode == KeyEvent.VK_F5 || keyCode == KeyEvent.VK_F6
                || keyCode == KeyEvent.VK_F7 || keyCode == KeyEvent.VK_F8
                || keyCode == KeyEvent.VK_F9 || keyCode == KeyEvent.VK_F10
                || keyCode == KeyEvent.VK_F11 || keyCode == KeyEvent.VK_F12
                || keyCode == KeyEvent.VK_F13 || keyCode == KeyEvent.VK_F14
                || keyCode == KeyEvent.VK_F15 || keyCode == KeyEvent.VK_F16
                || keyCode == KeyEvent.VK_F17 || keyCode == KeyEvent.VK_F18
                || keyCode == KeyEvent.VK_F19 || keyCode == KeyEvent.VK_F20
                || keyCode == KeyEvent.VK_F21 || keyCode == KeyEvent.VK_F22
                || keyCode == KeyEvent.VK_F23 || keyCode == KeyEvent.VK_F24
                || keyCode == KeyEvent.VK_ALT || keyCode == KeyEvent.VK_CONTROL) {
            consumeEvent = false;
            resetSel = false;
        } else {
            if (keyCode == KeyEvent.VK_DOWN) {
                if (m_IsMultiline) {
                    consumeEvent = false;
                    resetSel = false;
                } else {
                    if (isControlDown()) {
                        // handleHint();
                    }
                }
            } else if (keyCode == KeyEvent.VK_UP) {
                if (m_IsMultiline) {
                    consumeEvent = false;
                    resetSel = false;
                }
            } else if (keyCode == KeyEvent.VK_RIGHT || keyCode == KeyEvent.VK_LEFT || keyCode == KeyEvent.VK_TAB) {

                if (isShiftDown() && (keyCode != KeyEvent.VK_TAB)) {
                    //let the text field handle it.
                    resetSel = false;
                    consumeEvent = false;
                } else {
                    if (m_IsMultiline) {
                        consumeEvent = false;
                        resetSel = false;
                    } else {
//                        if (m_Translator != null)
//                        {
//                            if (m_Translator.getEditControl() == null)
//                                m_Translator.setEditControl(this);
//                            m_Translator.handleKeyDown(keyCode);
//                        }
                    }
                }
            } else if (m_ControlDown) {
                // The above condition is a HACK to allow copy, cut & paste to work properly.
                resetSel = false;
                consumeEvent = false;
            } else {
                //we might have something selected on the field, so reset our selection start and end.
                setSel(m_Field.getSelectionStart(), m_Field.getSelectionEnd());
                if (m_SelectionEndPos != m_SelectionStartPos) {
                    selectedText = true;
                }
                if (keyCode == KeyEvent.VK_DELETE) {
//                    if (m_Translator != null)
//                    {
//                        int oldStart = -1;
//                        if (initField != null)
//                        {
//                            oldStart = initField.getTextStartPos();
//                        } 
//                            
//                        m_Translator.handleKeyDown(keyCode);
//
//                        //we need to reposition caret at the original position if nothing was selected to start with.
//                        if (selectedText)
//                        {
//                            m_Field.setCaretPosition(m_SelectionEndPos);
//                        }
//                        else
//                        {
//
//                            //if we have removed the field we started with, I want to position myself
//                            //at the end of previous visible field
//                            if (initField != null)
//                            {
//                                if (initField.getVisible())
//                                {
//                                    m_Field.setCaretPosition(m_InitialLoc 
//                                                             + (initField.getTextStartPos() - oldStart));
//                                }
//                                else
//                                {
//                                    m_Field.setCaretPosition(initField.getFieldStartPos());
//                                }
//                            }
//                        }
//                    }
                } else if (keyCode == KeyEvent.VK_BACK_SPACE) {
//                    if (m_Translator != null)
//                    {
//                        m_Translator.handleKeyDown(keyCode);
//
//                        //we need to reposition caret at one less than original position if nothing was selected.
//                        if (m_InitialLoc > 0)
//                        {
//                            if (selectedText)
//                            {
//                                m_Field.setCaretPosition(m_SelectionEndPos);
//                            }
//                            else
//                            {
//                                //if we have removed the field we started with, I want to position myself
//                                //at the end of previous visible field
//                                if (initField != null)
//                                {
//                                    if (initField.getVisible())
//                                    {
//                                        m_Field.setCaretPosition(m_InitialLoc - 1);
//                                    }
//                                    else
//                                    {
//                                        m_Field.setCaretPosition(initField.getFieldStartPos());
//                                    }
//                                }
//                            }
//                        }
//                        else
//                        {
//                            m_Field.setCaretPosition(m_InitialLoc);
//                        }
//                    }
                } else {
                    //handleTypedKey(e);
                    consumeEvent = false;
                    resetSel = false;
                }
            }
        }

        if (consumeEvent && !e.isConsumed()) {
            e.consume();
        }

        if (resetSel) {
            //I want to set the selection start and end positions.
            pos = getCurrentPosition();
            setSel(pos, pos);
        }
    }

    private void hideToolTip(FocusEvent e) {
        Component other = e.getOppositeComponent();
        if (other == null || (!other.equals(m_Button) && !other.equals(m_Panel) && !other.equals(this))) {
            m_TooltipMenu.setBounds(0, 0, 0, 0);
            m_TooltipMenu.setVisible(false);
        }
    }

    private void cancelCellEditing() {
        //deactivate the edit control
        deactivate();

        //cancel out the changes made to edit control
        if (getAssociatedParent() != null) {
//         if (getAssociatedParent() instanceof ETCompartment)
//         {
//            ((ETCompartment)getAssociatedParent()).cancelEditing();
//         }
//         else 
//             if (getAssociatedParent() instanceof ProjectTreeCellEditor)
//         {
//            ((ProjectTreeCellEditor)getAssociatedParent()).cancelCellEditing();
//         }
        }

        return;
    }

    private void showToolTip(FocusEvent e) {
        try {
            if (m_ShowTooltips) {
                Point p = e.getComponent().getLocationOnScreen();

                FontMetrics metrix = m_Field.getFontMetrics(m_Field.getFont());
                int fieldHeight = metrix.getHeight();

                metrix = m_TooltipMenu.getFontMetrics(m_TooltipMenu.getFont());
                int width = metrix.stringWidth(m_TooltipText);
                int height = metrix.getHeight();

                m_TooltipMenu.setBounds(p.x, p.y - height - fieldHeight / 2, width, height);
                m_TooltipMenu.setLocation(p.x, p.y - height - fieldHeight / 2);
                m_TooltipMenu.setVisible(true);
                m_TooltipMenu.updateUI();
            }
        } catch (Exception exc) {
            //do nothing
        }
    }

    private void handleFieldModified(DocumentEvent e) {
        try {
            m_UpdatingField = true;
            if (m_VeryFirstTime || m_IgnoreTextUpdate) {
                m_VeryFirstTime = false;
                return;
            }
            int length = e.getLength();
            int pos = e.getOffset();
            /*       IEditControlField pField = getCurrentField();
             if (pField != null)
             {
             String text = m_Field.getText();
             String initText = pField.getText();
             String newText = "";
             boolean lastCharDeleted = false;
             if (e.getType().equals(DocumentEvent.EventType.INSERT))
             {
             m_SelectionStartPos = pos;
             m_SelectionEndPos = pos;
             //process the insert of text
             String changedText = text.substring(pos, pos + length);

             //there is a possibility that user is entering an optional field
             int nEnd = pField.getTextEndPos();
             boolean isHandled = false;
             if (m_Translator != null)
             {
             char toIns = changedText.charAt(0);
             int index = m_SeparatorList.indexOf(toIns);
             if (index >= 0)
             {
             isHandled = m_Translator.handleTopLevelSeparators(changedText.charAt(0));
             }
             if (!isHandled)
             {
             isHandled = m_Translator.handleChar(changedText);
             }
             }

             if (!isHandled)
             {
             if (pos >= nEnd)
             {
             }
             else
             {
             if (changedText.trim().length() > 0)
             {
             String leftText = "";
             String rightText = "";
             int nStart = pField.getTextStartPos();
             //we might be adding value for a new field in which case
             //initText will be "".
             if (pos > nStart && initText.length() > (pos - nStart))
             {
             leftText = initText.substring(0, pos - nStart);
             rightText = initText.substring(pos - nStart);
             }
             else if (pos == nStart)
             {
             //we are adding somthing to the start of this field
             rightText = initText;
             }
             newText = leftText + changedText + rightText;
             pField.setText(newText);
             }
             }
             }
             }
             else if (e.getType().equals(DocumentEvent.EventType.REMOVE))
             {
             if (m_Translator != null)
             {
             m_SelectionStartPos = pos;
             m_SelectionEndPos = pos + length;
             m_Translator.handleChar("");
             }
             else
             {
             //process the remove of text
             String leftText = "";
             String rightText = "";
             int nStart = pField.getTextStartPos();
             //if this is the last character in this field that is removed,
             //I cannot do proper substrings
             if (pos >= nStart)
             {
             leftText = initText.substring(0, pos - nStart);
             }
             if (initText.length() >= (pos - nStart + length))
             {
             rightText = initText.substring(pos - nStart + length);
             }
             newText = leftText + rightText;
             if (newText.length() == 0)
             {
             lastCharDeleted = true;
             }
             pField.setText(newText);
             }
             }

             if (!m_Modified)
             {
             setModified(true);
             }

             //I need to move all the fields after this field, so that
             //they have right Text and Field positions
             if (m_Translator != null)
             {
             m_Translator.updateFieldPositions(pField);
             }
             }*/
        } catch (Exception exc) {
            exc.printStackTrace();
        } finally {
            m_UpdatingField = false;
        }
    }

    DefaultStyledDocument doc = new DefaultStyledDocument();

    private void initComponents() {
        setBorder(null);
        m_Panel = new JPanel();
        m_Panel.setBorder(null);
        m_Panel.setLayout(null);
        m_Panel.setOpaque(false);
        //m_Panel.setPreferredSize(new Dimension(200, 3));

        m_TooltipMenu = new JPopupMenu();
        m_TooltipMenu.setBackground(m_TooltipBGColor);
        m_TooltipMenu.setOpaque(true);
        m_TooltipMenu.setBorder(LineBorder.createGrayLineBorder());
        m_TooltipMenu.setAlignmentX(0);
        m_TooltipMenu.setAlignmentY(0);
        m_TooltipMenu.setBounds(0, 0, 0, 0);

        setLayout(new BorderLayout());

        //TBD: see above, not al cases may be covered below
        if (m_IsMultiline == false) {
            JTextField field = new JTextField();
            field.setDocument(doc);
            m_Field = field;
            add(m_Field, BorderLayout.CENTER);
        } else {
            JTextArea field = new JTextArea();
            field.setLineWrap(true);
            field.setWrapStyleWord(true);
            //field.setDocument(doc);
            m_Field = field;

            //Fix 132234
            // creating the vertical scrolling effect without the vertical scrollbar
            JScrollPane scrollPane = new JScrollPane(m_Field);
            scrollPane.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED);
            scrollPane.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_NEVER);
            scrollPane.setBorder(null);

            scrollPane.setVerticalScrollBar(new javax.swing.JScrollBar() {
                @Override
                public java.awt.Dimension getPreferredSize() {
                    return new java.awt.Dimension(0, 0);
                }

                @Override
                public java.awt.Dimension getMinimumSize() {
                    return new java.awt.Dimension(0, 0);
                }

                @Override
                public java.awt.Dimension getMaximumSize() {
                    return new java.awt.Dimension(0, 0);
                }
            });

            add(scrollPane, BorderLayout.CENTER);
        }

        m_Field.setBorder(null);

        m_Button = new JButton();
        m_Button.setEnabled(true);
        m_Button.setPreferredSize(new Dimension(2, 2));
        m_Button.setOpaque(false);
        m_Button.setBackground(m_TooltipBGColor);
        m_Button.setFocusable(false); //I do not want this button to steal focus from the field
        final Point p = this.getLocation();
        final Component comp = this;
        m_Button.addActionListener((ActionEvent e) -> {
            //handleHint();
        });

        m_Button.setBounds(0, 0, 15, 3);
        setOpaque(false);
        add(m_Panel, BorderLayout.SOUTH);
        m_Panel.setBounds(0, 0, 200, 3);
        m_Panel.setOpaque(false);

    }

    public void setCaretPosition(int pos) {
        m_Field.setCaretPosition(pos);
    }

    public void setAutoSize(boolean value) {
        // TODO Auto-generated method stub

    }

    public boolean getAutoSize() {
        // TODO Auto-generated method stub
        return false;
    }

    public Color getForeColor() {
        Color retVal = null;

        if (m_Field != null) {
            retVal = m_Field.getForeground();
        }

        return retVal;
    }

    public void setForeColor(Color value) {
        if (m_Field != null) {
            m_Field.setForeground(value);
        }
    }

    public void activate(int KeyCode, int nPos) {
        // TODO Auto-generated method stub

    }

    /**
     * Deactivate the edit control
     */
    public void deactivate() {
        // prevent recursion
        boolean bInDeactivate = false;
        if (!bInDeactivate) {
            bInDeactivate = true;

            // notify listeners we're shutting down
//         if (m_EventDispatcher != null)
//         {
//            IEditEventPayload payload = m_EventDispatcher.createEventPayload();
//            if (payload != null)
//            {
//               String sText = getText();
//               payload.setKey(m_LastKey);
//               payload.setModified(getModified());
//               payload.setText(sText);
//            }
//            m_EventDispatcher.fireDeactivate(this, payload);
//            m_EventDispatcher = null;
//         }
            // Fix for Sun issue #6185901:
            // When the edit control is completed it needs to remove the key bindings so that,
            // in this issue as an example, the paste operation is not handled by this edit control.
            // Remove our key bindings
            m_Field.getKeymap().removeBindings();
        }
    }

    /**
     * Returns the translator attached to this control.
     *
     * @param pTranslator
     */
//   public ITranslator getTranslator()
//   {
//      return m_Translator;
//   }
    /**
     * Attaches a translator to this control.
     *
     * @param pTranslator
     */
//   public void setTranslator(ITranslator pTranslator)
//   {
//      // set our translator then set reverse pointer
//      m_Translator = pTranslator;
//
//      m_Translator.setEditControl(this);
//      String str = m_Field.getText();
//      m_InitialData = str;
//      m_Modified = false;
//   }
    public boolean isMultiline() {
        return m_IsMultiline;
    }
//   
//   public void setMultiline(boolean value)
//   {
//       m_IsMultiline = value;
//   }

    public int getSelStartPos() {
        if (m_SelectionStartPos >= 0) {
            return m_SelectionStartPos;
        } else {
            return getCurrentPosition();
        }
    }

    public int getSelEndPos() {
        if (m_SelectionEndPos >= 0) {
            return m_SelectionEndPos;
        } else {
            return getCurrentPosition();
        }
    }

    public long getSel(int nStartChar, int nEndChar) {
        // TODO Auto-generated method stub
        return 0;
    }

    public long setSel(int startPos, int endPos) {
        //if (m_Modified)
        {
            m_Field.setSelectionStart(startPos);
            m_Field.setSelectionEnd(endPos);
            m_SelectionStartPos = startPos;
            m_SelectionEndPos = endPos;
        }
        return 0;
    }

    /**
     * Establishes the control's event dispatcher (used internally only).
     *
     * @param pDispatcher
     */
//   public void putEventDispatcher(IEventDispatcher pDispatcher)
//   {
//      m_EventDispatcher = null;
//      if (pDispatcher != null && pDispatcher instanceof IEditControlEventDispatcher)
//      {
//         m_EventDispatcher = (IEditControlEventDispatcher)pDispatcher;
//      }
//   }
//
//   /**
//    * Gets the control's event dispatcher (used internally only).
//    *
//    * @param pDispatcher
//    */
//   public IEventDispatcher getEventDispatcher()
//   {
//      return m_EventDispatcher;
//   }
    public boolean getModified() {
        return m_Modified;
    }

    public void setModified(boolean value) {
        m_Modified = value;
    }

    public int lineLength(int nLine) {
        // TODO Auto-generated method stub
        return 0;
    }

    public int lineIndex(int nLine) {
        // TODO Auto-generated method stub
        return 0;
    }

    public int getStyle() {

        return 0;
    }

    public void setStyle(long value) {
        if (m_Field instanceof JTextField) {
            JTextField field = (JTextField) m_Field;
            int alignment = JTextField.LEFT;
//         if ((value & IADEditableCompartment.RIGHT) == IADEditableCompartment.RIGHT)
//         {
//            alignment = JTextField.RIGHT;
//         }
//         else if ((value & IADCompartment.CENTER) == IADCompartment.CENTER)
//         {
//            alignment = JTextField.CENTER;
//         }

            field.setHorizontalAlignment(alignment);
        }
    }

    /**
     * Updates the control's window with the current contents of the translator.
     *
     * @return HRESULT
     */
//   public void refresh()
//   {
//      if (m_Translator != null)
//      {
//         m_Translator.updateFieldPositions(null);
//         String str = m_Translator.getCurrent();
//         setText(str);
//      }
//   }
    public boolean getOverstrike() {
        // TODO Auto-generated method stub
        return false;
    }

    public void setOverstrike(boolean value) {
        // TODO Auto-generated method stub

    }

    public long getTooltipText(StringBuffer sLeft, StringBuffer sSubject, StringBuffer sRight) {
        // TODO Auto-generated method stub
        return 0;
    }

    /**
     *
     * Update the tooltip's text. If all 3 text parts are empty the tooltip
     * window is dismissed.
     *
     * @param sLeft Left part of the tooltip text
     * @param sSubject Subject part, this will be displayed in a bold font
     * @param sRight Right part of the tooltip text.
     *
     * @return HRESULT
     *
     */
    public void setTooltipText(String sLeft, String sSubject, String sRight) {
//      sLeft = StringUtilities.replaceAllSubstrings(sLeft, "<", "<");
//      sSubject = StringUtilities.replaceAllSubstrings(sSubject, "<", "<");
//      sRight = StringUtilities.replaceAllSubstrings(sRight, "<", "<");
//      sLeft = StringUtilities.replaceAllSubstrings(sLeft, ">", ">");
//      sSubject = StringUtilities.replaceAllSubstrings(sSubject, ">", ">");
//      sRight = StringUtilities.replaceAllSubstrings(sRight, ">", ">");
        String tooltip = "" + sLeft + "" + sSubject + "" + sRight + "";

        //m_Field.setToolTipText(tooltip);
        m_TooltipText = tooltip;

        //tooltip = sLeft + "" + sSubject + "" + sRight;
        Point p = this.getLocation();
        if (m_LocationOnScreen != null) {
            p = m_LocationOnScreen;
        }
        m_TooltipMenu.removeAll();
        Font f = m_TooltipMenu.getFont();

        m_TooltipMenu.setFont(f.deriveFont(Font.PLAIN));
        JMenuItem item = m_TooltipMenu.add(tooltip);
        item.setFont(f.deriveFont(Font.PLAIN));
        item.setAlignmentX(0);
        item.setAlignmentY(0);
        item.setBorder(null);
        item.setBackground(m_TooltipBGColor);
        FontMetrics metrix = item.getFontMetrics(item.getFont());
        int width = metrix.stringWidth(tooltip);

        item.setOpaque(false);
        p = m_TooltipMenu.getLocation();
        if (p != null) {
            m_TooltipMenu.setBounds(p.x, p.y - metrix.getHeight(), width, metrix.getHeight());
//         IEditControlField pField = m_Translator.getCurrentField();
//         if (pField != null)
//         {
//            int nStart = pField.getTextStartPos();
//            int nEnd = pField.getTextEndPos();
//            int curPos = getCurrentPosition();
//
//            if ((curPos == nStart) || (curPos == nEnd))
//            {
//               //There is potentially tooltip length change, so update its size
//               //till I hide and reshow the tooltip, size does not change.
//               //m_TooltipMenu.setVisible(false);
//               //m_TooltipMenu.setVisible(true);
//            }
//         }

            //m_TooltipMenu.setPreferredSize(new Dimension(width,20));
            //m_TooltipMenu.updateUI();
        }

        //if (!m_TooltipMenu.isVisible())
        //{
        //	m_TooltipMenu.setVisible(true);
        //}
    }

    public void setEnableTooltip(boolean value) {
        m_ShowTooltips = value;
        m_TooltipMenu.setVisible(value);
    }

    /**
     * Force the tooltip to be re-loaded and re-displayed.
     *
     * @return HRESULT
     */
//   public void updateToolTip()
//   {
//      if (m_Translator != null)
//      {
//         if (m_ShowTooltips)
//         {
//            m_Translator.updateToolTip();
//         }
//      }
//   }
    public void setCurrentPosition(int value) {
        String text = m_Field.getText();
        if (text != null && text.length() >= value) {
            m_Field.setCaretPosition(value);
        }
    }

    public int getCurrentPosition() {
        return m_Field.getCaretPosition();
    }

    public void showHintBar(int nPos) {
        FontMetrics metrix = m_Field.getFontMetrics(m_Field.getFont());
        String text = m_Field.getText();
        int length = 0;
        if (text != null && text.length() >= nPos) {
            String str = text.substring(0, nPos);
            length = metrix.stringWidth(str);
        }
        m_Panel.removeAll();
        m_Panel.setBounds(0, 0, 200, 3);
        m_Panel.repaint();
        m_Button.setBounds(length, 0, 15, 3);
        m_Panel.add(m_Button);
        if (m_BackgroundColor != null) {
            m_Panel.setForeground(m_BackgroundColor);
            m_Panel.setBackground(m_BackgroundColor);
            m_Panel.setUI(this.getUI());
        }
        m_Panel.invalidate();
        m_Panel.repaint();
    }

    /*
     * hides the hint bar
     */
    public void hideHintBar() {
        m_Panel.removeAll();
        m_Panel.invalidate();
        m_Panel.repaint();
        if (m_BackgroundColor != null) {
            m_Panel.setForeground(m_BackgroundColor);
            m_Panel.setBackground(m_BackgroundColor);
            m_Panel.setUI(this.getUI());
        }
        m_Panel.setBounds(0, 0, 200, 3);
        m_Panel.repaint();
        //m_Button.reshape(0,0,0,0);
        //m_Panel.add(m_Button);
    }

    /**
     * Deactivate the edit control and save any information edited by user.
     */
    public void handleSave() {
        m_TooltipMenu.setVisible(false);
        boolean bModified = getModified();
//      if (m_Translator != null && bModified)
//      {
//         m_Translator.saveModelElement();
//      }

        //get related element and see if the change was really made
        //if the element name did not change we have a problem, in which case,
        //revert back to the old name
        String sText = getText();
//      if (m_Translator != null)
//      {
//         Object object = m_Translator.getElement();
//         if (object instanceof INamedElement)
//         {
//            INamedElement element = (INamedElement)object;
//            String name = element.getName();
//            if (!name.equals(sText))
//            {
//               setText(name);
//            }
//         }
//      }
        setText(sText);
      // Fix for Sun issue #6185901:
        // When the edit control is completed it needs to deactivate so
        // that, in this issue as an example, the paste operation is
        // not handled by this edit control.
        // Before fixing this issue there was code to call
        // m_EventDispatcher.fireDeactivate(), but that is no longer necessary
        // since that code is in deactivate().

        // notify listeners we're shutting down
        deactivate();
    }

    public void handleRollback() {
        m_TooltipMenu.setVisible(false);
    }

    /* (non-Javadoc)
     */
//   public void displayList(boolean bList, String pList, int nStart, String sInitialText)
//   {
//      if (pList != null)
//      {
//         long count = pList.getCount();
//         JPopupMenu menu = new JPopupMenu();
//         if (count > 0)
//         {
//            boolean addMoreItems = false;
//            if (count > 25)
//            {
//               count = 25;
//               addMoreItems = true;
//               m_List = pList;
//            }
//            for (int i = 0; i < count; i++)
//            {
//               String str = pList.item(i);
//               //menu.add(str);
//               JMenuItem item = new JMenuItem(str);
//               item.addActionListener(new ActionListener()
//               {
//
//                  public void actionPerformed(ActionEvent e)
//                  {
//                     performActionOnMenuItemSelected(e);
//                  }
//               });
//               menu.add(item);
//            }
//
//            if (addMoreItems)
//            {
//               JMenuItem item = new JMenuItem(DrawingPropertyResource.getString("IDS_MOREITEMS"));
//               item.addActionListener(new ActionListener()
//               {
//
//                  public void actionPerformed(ActionEvent e)
//                  {
//                     performActionOnMenuItemSelected(e);
//                  }
//               });
//               menu.add(item);
//            }
//         }
//         Point p = m_Button.getLocation();
//         //menu.show(this, p.x, p.y+20);
//         menu.show(m_Button, 0, 0);
//      }
//   }
//   private String showSelectDialog()
//   {
//      String retVal = "";
//      EditControlClassChooser chooser = new EditControlClassChooser(m_List);
//      retVal = chooser.selectClass();
//      return retVal;
//   }
    public void performActionOnMenuItemSelected(ActionEvent e) {
        Object obj = e.getSource();
        if (obj != null) {
            String newText = ((JMenuItem) obj).getText();

//         if (newText != null && newText.equals(DrawingPropertyResource.getString("IDS_MOREITEMS")))
//         {
//            //show a dialog to the user listing all the types found.
//            newText = showSelectDialog();
//         }
//
//         if (m_Translator != null && newText != null && newText.length() > 0)
//         {
//            IEditControlField pField = m_Translator.handleHintText(newText);
//
//            if (pField != null)
//            {
//               int nStart = pField.getTextStartPos();
//               int nEnd = pField.getTextEndPos();
//               //update the value on IEditControlField
//               //pField.setText(newText);
//               if (!m_Modified)
//               {
//                  setModified(true);
//               }
//
//               //also update the text on the Edit control display
//               String currText = m_Field.getText();
//               String textToDisplay = currText.substring(0, nStart) + newText + currText.substring(nEnd);
//
//               //since I am going to set whole text for this edit field, I
//               //somehow need to ignore update of the EditcontrolFields
//               setText(textToDisplay);
//
//               //I need to move all the fields after this field, so that
//               //they have right Text and Field positions
//               if (m_Translator != null)
//               {
//                  m_Translator.updateFieldPositions(pField);
//               }
//
//               //now I want to reset my cursor to the end of this field's end pos
//               int newPos = pField.getTextEndPos();
//               m_Field.setCaretPosition(newPos);
//               setSel(newPos, newPos);
//            }
//         }
        }
    }

//   public IEditControlField getCurrentField()
//   {
//      IEditControlField retField = null;
//      if (m_Translator != null)
//      {
//         retField = m_Translator.getCurrentField();
//      }
//      return retField;
//   }
    public void registerAccelerator(int nChar, long nModifier) {
        // TODO Auto-generated method stub

    }

    /**
     * Sets the element this edit control will edit.
     *
     * @param pElement [in] The edit control
     */
//   public void setElement(IElement pElement)
//   {
//      // I need to block all the events at this point, so that while building property elements, we do not
//      //fire events.
//      boolean origVal = EventBlocker.startBlocking();
//      try
//      {
//         //we do not want to show tooltips if we are editing a classifier or activity node or package.
//         if (pElement instanceof IClassifier || pElement instanceof IActivityNode || pElement instanceof IPackage)
//         {
//            setEnableTooltip(false);
//         }
//         m_Translator = new TranslatorImpl();
//         m_Translator.setElement(pElement);
//         setTranslator(m_Translator);
//         m_Translator.setEditControl(this);
//
//         if (pElement instanceof IComment)
//         {
//            //this will select the comment text
//            getCommentField();
//         }
//         else if (pElement instanceof ILifeline)
//         {
//            //this will select the comment text
//            getRepClassifierField();
//         }
//         else
//         {
//            //this will select the name text.
//            IEditControlField nameField = getNameField();
//            if (nameField == null)
//            {
//               //we could not find a name field to select so select the first field.
//               if (m_Translator != null)
//               {
//                  IEditControlField field = m_Translator.getNextField(null);
//                  if (field != null)
//                  {
//                     int startPos = field.getTextStartPos();
//                     int endPos = field.getTextEndPos();
//                     setSel(startPos, endPos);
//                  }
//               }
//            }
//         }
//         //m_Field.setCaretPosition(nameField.getTextEndPos());
//      }
//      finally
//      {
//         EventBlocker.stopBlocking(origVal);
//      }
//   }
    /**
     * A list of separator characters used by the fields
     *
     * @param sList
     *
     * @return HRESULT
     */
    public String getSeparatorList() {
        return m_SeparatorList;
    }

    /**
     * A list of separator characters used by the fields
     *
     * @param sList
     *
     * @return HRESULT
     */
    public void setSeparatorList(String sList) {
        m_SeparatorList = sList;
    }

    public int calcNewPos(int changeLineBy) {
        // TODO Auto-generated method stub
        return 0;
    }

    public String getText() {
        // TODO Auto-generated method stub
        return m_Field.getText();
    }

    /*
     * sets the text that is displayed on the edit control.
     * While setting the text, change events are fired,
     * I need to prevent them so am setting ignoreTextUpdate.
     */
    public void setText(String value) {
        try {
            if (m_UpdatingField) {
                final String str = value;
                //we are right now updating the text, so do invokeLater
                SwingUtilities.invokeLater(() -> {
                    //                  if (m_Translator != null)
//                  {
                    //IEditControlField pField = m_Translator.getCurrentField();
                    int pos = getCurrentPosition();
//                     if (pField != null)
//                     {
//                        String name = pField.getName();
//                        int nStart = pField.getLastTextStartPos();
//                        if (nStart != pos)
//                        {
//                           pos = nStart;
//                        }
//                     }
                    m_IgnoreTextUpdate = true;
                    m_Field.setText(str);
                    m_IgnoreTextUpdate = false;
                    setCaretPosition(pos);
//                  }
                });

            } else {
                m_Field.setText(value);
                //select the name field
                //getNameField();
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    public void setCharacter(int nKeyCode, int nShift) {
        //if we are editing a lifeline we need to select the representing classifier.
//      IEditControlField field = null;
//      if (m_Translator != null)
//      {
//         IElement pEle = m_Translator.getElement();
//         if (pEle != null && pEle instanceof ILifeline)
//         {
//            field = getRepClassifierField();
//         }
//      }
//      if (field == null)
//      {
//         field = getNameField();
//         if (field == null)
//         {
//            //try to see if this is a comment field
//            field = getCommentField();
//
//            if (field == null)
//            {
//               //we want to select the first field
//               if (m_Translator != null)
//               {
//                  field = m_Translator.getNextField(null);
//                  if (field != null)
//                  {
//                     int startPos = field.getTextStartPos();
//                     int endPos = field.getTextEndPos();
//                     setSel(startPos, endPos);
//                  }
//               }
//            }
//         }
//      }

//      if (field != null)
//      {
//         String str = "";
//         if (nShift == 1)
//         {
//            str = String.valueOf(Character.toLowerCase((char)nKeyCode));
//         }
//         else
//         {
//            str = String.valueOf(Character.toString((char)nKeyCode));
//         }
//
//         ITranslator pTrans = getTranslator();
//         int pos = field.getTextStartPos();
//         if (pTrans != null)
//         {
//            pTrans.handleChar(str);
//         }
//         else
//         {
//            field.setText(str);
//         }
//         //m_Field.replaceSelection(str);
//
//         //I want to set the selection start and end positions.
//         pos += str.length();
//         setSel(pos, pos);
//         m_Field.setCaretPosition(pos);
//      }
    }

    protected void assignAction(KeyStroke key, String actionName) {
        m_Field.getInputMap().put(key, actionName);
    }

    protected void assignAction(KeyStroke key, Action action, String actionName) {
        m_Field.getActionMap().put(actionName, action);
        m_Field.getInputMap().put(key, actionName);
    }

    protected void removeAction(KeyStroke key) {
        // The remove method only removes the key from this map.  If a parent
        // map owns the keystroke you have to go up the tree.

        InputMap map = m_Field.getInputMap();
        while (map != null) {
            map.remove(key);
            map = map.getParent();
        }
    }

//   private IEditControlField getNameField()
//   {
//      IEditControlField field = null;
//      if (m_Translator != null)
//      {
//         Vector fields = m_Translator.getTextFields();
//         if (fields != null)
//         {
//            int count = fields.size();
//            for (int i = 0; i < count; i++)
//            {
//               IEditControlField tempField = (IEditControlField)fields.get(i);
//               IPropertyDefinition pDef = tempField.getPropertyDefinition();
//               if (pDef != null)
//               {
//                  String name = pDef.getName();
//                  if (name != null && name.equals("NameWithAlias"))
//                  {
//                     field = tempField;
//                     break;
//                  }
//               }
//            }
//
//            if (field != null)
//            {
//               int startPos = field.getTextStartPos();
//               int endPos = field.getTextEndPos();
//               setSel(startPos, endPos);
//            }
//         }
//      }
//      return field;
//   }
//
//   private IEditControlField getRepClassifierField()
//   {
//      IEditControlField field = null;
//      if (m_Translator != null)
//      {
//         Vector fields = m_Translator.getTextFields();
//         if (fields != null)
//         {
//            int count = fields.size();
//            for (int i = 0; i < count; i++)
//            {
//               IEditControlField tempField = (IEditControlField)fields.get(i);
//               IPropertyDefinition pDef = tempField.getPropertyDefinition();
//               if (pDef != null)
//               {
//                  String name = pDef.getName();
//                  if (name != null && name.equals("RepresentingClassifier"))
//                  {
//                     field = tempField;
//                     break;
//                  }
//               }
//            }
//
//            if (field != null)
//            {
//               int startPos = field.getTextStartPos();
//               int endPos = field.getTextEndPos();
//               setSel(startPos, endPos);
//            }
//         }
//      }
//      return field;
//   }
//
//   private IEditControlField getCommentField()
//   {
//      IEditControlField field = null;
//      if (m_Translator != null)
//      {
//         Vector fields = m_Translator.getTextFields();
//         if (fields != null)
//         {
//            int count = fields.size();
//            for (int i = 0; i < count; i++)
//            {
//               IEditControlField tempField = (IEditControlField)fields.get(i);
//               IPropertyDefinition pDef = tempField.getPropertyDefinition();
//               if (pDef != null)
//               {
//                  String name = pDef.getName();
//                  if (name != null && name.equals("Comment"))
//                  {
//                     field = tempField;
//                     break;
//                  }
//               }
//            }
//
//            if (field != null)
//            {
//               int startPos = field.getTextStartPos();
//               int endPos = field.getTextEndPos();
//               setSel(startPos, endPos);
//            }
//         }
//      }
//
//      //if we are getting the comment field, we do not want to show the tooltips.
//      if (field != null)
//      {
//         setEnableTooltip(false);
//      }
//
//      return field;
//   }
    public boolean isShiftDown() {
        return m_ShiftDown;
    }

    public boolean isControlDown() {
        return m_ControlDown;
    }

    private class EditControlDocumentListener implements DocumentListener {

        InplaceEditorProvider.EditorController editorController = null;

        public EditControlDocumentListener(Object controller) {
            if (controller instanceof InplaceEditorProvider.EditorController) {
                editorController = (InplaceEditorProvider.EditorController) controller;
            }
        }

        @Override
        public void insertUpdate(DocumentEvent e) {
            changedUpdate(e);
        }

        @Override
        public void removeUpdate(DocumentEvent e) {
            changedUpdate(e);
        }

        @Override
        public void changedUpdate(DocumentEvent e) {
//         handleFieldModified(e);
            setModified(true);
//          m_Translator.setModified(true);
//          getCurrentField().setText(m_Field.getText());
            if (editorController != null && editorController.isEditorVisible()) {
                editorController.notifyEditorComponentBoundsChanged();
            }
        }
    }

    public void setEditControlBackground(Color c) {
        m_Field.setBackground(c);
        m_Panel.setBackground(c);
        m_Button.setBackground(c);
        this.setBackground(c);
        m_BackgroundColor = c;
    }

    /**
     *
     */
    @Override
    public void setFont(Font value) {
        if (m_Field != null) {
            m_Field.setFont(value);
        }
    }

    /**
     *
     */
    @Override
    public Font getFont() {
        Font retVal = null;
        if (m_Field != null) {
            retVal = m_Field.getFont();
        }

        return retVal;
    }

    public Object getAssociatedParent() {
        return (m_Parent != null) ? m_Parent.get() : null;
    }

    public void setAssociatedParent(Object parent) {
        if (parent != null) {
            m_Parent = new WeakReference(parent);
        }
    }

    /* (non-Javadoc)
     * @see java.awt.event.InputMethodListener#caretPositionChanged(java.awt.event.InputMethodEvent)
     */
    @Override
    public void caretPositionChanged(InputMethodEvent event) {
        // TODO Auto-generated method stub

    }

    /* (non-Javadoc)
     * @see java.awt.event.InputMethodListener# (java.awt.event.InputMethodEvent)
     */
    @Override
    public void inputMethodTextChanged(InputMethodEvent event) {
        if (!ime_Cached) {
            ime_SelectionStartPos = m_Field.getSelectionStart();
            ime_SelectionEndPos = m_Field.getSelectionEnd();
            if (ime_SelectionStartPos != ime_SelectionEndPos) {
                ime_InitialLoc = Math.min(ime_SelectionStartPos, ime_SelectionEndPos);
            } else {
                ime_InitialLoc = m_Field.getCaretPosition();
            }
            ime_Cached = true;
            ime_CachedChars = new StringBuffer();
        }

        int committedCharacterCount = event.getCommittedCharacterCount();
        CharacterIterator iter = event.getText();
        if (iter != null && ((iter.getEndIndex() - iter.getBeginIndex()) > committedCharacterCount)) {
            if (ime_CachedChars != null) {
                char ch = iter.first();
                for (int i = 0; i < committedCharacterCount; i++) {
                    ime_CachedChars.append(ch);
                    ch = iter.next();
                }
            }
        } else {

            // Push the caret back as part of faking the text input.
            int pos = ime_InitialLoc;
            setCurrentPosition(pos);
            // Fake the key input since handleTypedChar() does the right things.

            if (ime_CachedChars != null) {
                for (int i = 0; i < ime_CachedChars.length(); i++) {
                    handleTypedChar(ime_CachedChars.charAt(i));
                    setCurrentPosition(++pos);
                }
            }

            if (iter != null) {
                for (char ch = iter.first(); ch != CharacterIterator.DONE; ch = iter.next()) {
                    handleTypedChar(ch);
                    setCurrentPosition(++pos);
                }
            }
//	 for(int i = ime_SelectionStartPos; i < ime_SelectionEndPos; i++) {
//	     m_Translator.handleKeyDown(127);
//	 }	   
            ime_Cached = false;
            ime_CachedChars = null;

            event.consume();

            //commit the changes to the edit control
            setModified(true);
//         m_Translator.setModified(true);
//         if (getCurrentField() != null)
//         {
//            getCurrentField().setModified(true);
//         }
//         if (getAssociatedParent() != null)
//         {
//                if (getAssociatedParent() instanceof ProjectTreeCellEditor)
//            {
//               ((ProjectTreeCellEditor)getAssociatedParent()).stopCellEditing();
//            }
//         }
        }
    }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy