Package org.vietspider.ui.htmlexplorer

Source Code of org.vietspider.ui.htmlexplorer.NodeSuggestion

/***************************************************************************
* Copyright 2001-2009 The VietSpider         All rights reserved.       *
**************************************************************************/
package org.vietspider.ui.htmlexplorer;

import org.eclipse.swt.SWT;
import org.eclipse.swt.events.FocusAdapter;
import org.eclipse.swt.events.FocusEvent;
import org.eclipse.swt.events.KeyEvent;
import org.eclipse.swt.events.KeyListener;
import org.eclipse.swt.events.MouseAdapter;
import org.eclipse.swt.events.MouseEvent;
import org.eclipse.swt.events.ShellAdapter;
import org.eclipse.swt.events.ShellEvent;
import org.eclipse.swt.graphics.Rectangle;
import org.eclipse.swt.layout.FillLayout;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Event;
import org.eclipse.swt.widgets.List;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.swt.widgets.Text;
import org.vietspider.generic.ColorCache;

/**
* Author : Nhu Dinh Thuan
*          nhudinhthuan@yahoo.com
* Jul 8, 2009 
*/
class NodeSuggestion {

  final static short EXPRESSION = 0;
  final static short NODE = 1;
  final static short ATTRIBUTE = 2;

  protected List list;
  protected Shell popup;

  private NodeEditor2 _editor;
  private Text text;

  private short type = EXPRESSION;

  public NodeSuggestion(NodeEditor2 editor, String [] elements, short type) {
    this.type = type;
   
    text = editor.getTextComponent();

    popup = new Shell (editor.getShell(), SWT.NO_TRIM | SWT.ON_TOP);
    popup.setLayout(new FillLayout());
   
    this._editor = editor;

    _editor.getShell().addShellListener(new ShellAdapter() {
      @SuppressWarnings("unused")
      public void shellDeiconified(ShellEvent e) {
        popup.dispose();
      }
    });

    popup.addShellListener(new ShellAdapter() {
      @SuppressWarnings("unused")
      public void shellDeactivated(ShellEvent e) {
        popup.dispose();
      }
    });

    text.addFocusListener(new FocusAdapter() {
      @SuppressWarnings("unused")
      public void focusLost(FocusEvent e) {
        if(text.isFocusControl()) return;
        popup.dispose();
      }
    });

    list = new List (popup, SWT.V_SCROLL | SWT.BORDER)
    list.setBackground (ColorCache.getInstance().getWhite());
    list.setFont(text.getFont());
    list.setItems(elements);

    list.addKeyListener(new KeyListener() {
      public void keyReleased(KeyEvent event) {
        if(popup.isDisposed()) return;
        if(event.keyCode == SWT.ESC) {
          popup.dispose();
        }
      }

      @Override
      public void keyPressed(KeyEvent event) {
        if(event.keyCode == SWT.CR) {
          if(list.getSelectionCount() > 0) {
            String pattern = list.getSelection()[0];
            if(pattern !=  null) _editor.insertText(pattern);
          }
          popup.dispose();
          return;
        }

        if (event.keyCode != SWT.ARROW_UP && event.keyCode != SWT.ARROW_DOWN) {
          if(Character.isLetterOrDigit(event.character) ||
              event.character == '!' || event.character == '%' ||
              event.character == '-' || event.character == '+' ||
              event.character == '*' || event.character == '/' ||
              event.character == '>' || event.character == '<' ||
              event.character == '=' || event.character == '|' ||
              event.character == '&' || event.character == ',' ||
              event.character == '.' ||  event.character == '^'
          ) {
            int pos = text.getCaretPosition();
            String value = text.getText();
            value = value.substring(0, pos) + String.valueOf(event.character) + value.substring(pos);
            text.setText(value);
            text.setFocus();
            text.setSelection(pos+1, pos+1);
          }
          return;
        }
      }
    });
  
    list.addMouseListener(new MouseAdapter() {
      @SuppressWarnings("unused")
      public void mouseDoubleClick(MouseEvent e) {
        if(list.getSelectionCount() > 0) {
          String pattern = list.getSelection()[0];
          if(pattern !=  null) _editor.insertText(pattern);
        }
        popup.dispose();
        return;
      }
    });
   
/*    list.addFocusListener(new FocusAdapter() {
      public void focusLost(FocusEvent e) {
        System.out.println(_editor.getShell().isFocusControl()
            + " / "+ text.isFocusControl()
            + " / "+  list.isFocusControl());
      }
    });
*/   
    Display display = text.getDisplay();
    Rectangle parentRect = display.map (text.getParent(), null, text.getBounds ());

    int x = parentRect.x + text.getCaretLocation().x+ 10;
    int y = parentRect.y + text.getCaretLocation().y + 15;
    popup.setLocation(x, y);
    popup.pack();
    popup.open();
  }

  public boolean isType(short t) { return type == t; }

  public void dispose() {
    if(popup.isDisposed()) return;
    popup.dispose();
  }

  public boolean isDisposed() { return popup.isDisposed(); }

  void handleArrowKey(KeyEvent event) {
    int oldIndex = list.getSelectionIndex ();
    if (event.keyCode == SWT.ARROW_UP && popup.isVisible()) {
      select (Math.max (oldIndex - 1, 0));
    } else if( popup.isVisible()) {
      select (Math.min (oldIndex + 1, list.getItemCount () - 1));
    }
    if (oldIndex != list.getSelectionIndex ()) {
      Event e = new Event();
      e.time = event.time;
      e.stateMask = event.stateMask;
    }
  }

  public void select (int index) {
    if (index == -1) {
      list.deselectAll ();
      return;
    }

    if (0 <= index && index < list.getItemCount()) {
      if (index != list.getSelectionIndex()) {
        list.select (index);
        list.showSelection ();
      }
    }
  }

  void deselectAll () { list.deselectAll (); }

  public List getList() { return list; }

//  public void setFocus() { list.setFocus(); }
//
//  public boolean isFocus() {
//    return list.isFocusControl() || popup.isFocusControl();
//  }

}
TOP

Related Classes of org.vietspider.ui.htmlexplorer.NodeSuggestion

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.