package com.baselet.gwt.client.view.widgets.propertiespanel; import com.baselet.gwt.client.keyboard.Shortcut; import com.google.gwt.event.dom.client.KeyCodes; import com.google.gwt.event.dom.client.KeyDownEvent; import com.google.gwt.event.dom.client.KeyDownHandler; import com.google.gwt.event.dom.client.MouseUpEvent; import com.google.gwt.event.dom.client.MouseUpHandler; import com.google.gwt.user.client.ui.SuggestBox; import com.google.gwt.user.client.ui.ValueBoxBase; public class MySuggestBox extends SuggestBox { private String lastRequestLine; private final MySuggestionDisplay display; public MySuggestBox(final MySuggestOracle oracle, ValueBoxBase<String> textArea) { this(oracle, textArea, new MySuggestionDisplay()); } public MySuggestBox(final MySuggestOracle oracle, ValueBoxBase<String> textArea, final MySuggestionDisplay display) { super(oracle, textArea, display); this.display = display; getValueBox().addMouseUpHandler(new MouseUpHandler() { @Override public void onMouseUp(MouseUpEvent event) { showSuggestionList(); // switching line of textarea by click should also update the shown suggestions } }); textArea.addKeyDownHandler(new KeyDownHandler() { // CTRL+Space shows all suggestions @Override public void onKeyDown(KeyDownEvent event) { int key = event.getNativeEvent().getKeyCode(); if (display.isSuggestionListShowing()) { if (key == KeyCodes.KEY_ESCAPE) { display.hideSuggestions(); } else if ((key == KeyCodes.KEY_ENTER || key == KeyCodes.KEY_UP || key == KeyCodes.KEY_DOWN) && oracle.getSuggestionsForText(lastRequestLine).size() > 1) { event.getNativeEvent().preventDefault(); // if the focus is on the suggestbox and it has >1 entries, avoid propagating keyevents to the textarea } } if (Shortcut.SHOW_AUTOCOMPLETION.matches(event)) { event.getNativeEvent().preventDefault(); oracle.setShowAllAsDefault(true); showSuggestionList(); oracle.setShowAllAsDefault(false); } } }); } @Override public void setText(String text) { super.setText(replaceTextOfCurrentLine(text)); setFocus(true); // after choosing one of the suggestions, refocus the textarea } @Override public String getText() { lastRequestLine = getCursorLine(); return lastRequestLine; } private String getCursorLine() { String returnText = ""; String wholeText = super.getText(); if (!wholeText.contains("\n")) { returnText = wholeText; } else { int cursorPos = getValueBox().getCursorPos(); int currentPos = 0; for (String line : wholeText.split("(\r)?\n")) { currentPos += line.length() + 1; if (cursorPos < currentPos) { returnText = line; break; } } } return returnText; } private String replaceTextOfCurrentLine(String newText) { StringBuilder sb = new StringBuilder(""); String wholeText = super.getText(); if (!wholeText.contains("\n")) { sb.append(newText); } else { boolean replaced = false; int cursorPos = getValueBox().getCursorPos(); int currentPos = 0; for (String line : wholeText.split("(\r)?\n", -1)) { currentPos += line.length() + 1; if (cursorPos < currentPos && !replaced) { sb.append(newText).append("\n"); replaced = true; } else { sb.append(line).append("\n"); } } sb.setLength(sb.length() - 1); } return sb.toString(); } public boolean getPaletteShouldIgnoreMouseClicks() { return display.getPaletteShouldIgnoreMouseClicks(); } }