/***************************************************************************
* 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();
// }
}