/*
* Copyright 2008 Ayman Al-Sairafi ayman.alsairafi@gmail.com
*
* 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 jsyntaxpane.actions;
import java.awt.Frame;
import java.awt.Point;
import java.awt.Rectangle;
import java.awt.event.ActionEvent;
import java.util.Map;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.swing.SwingUtilities;
import javax.swing.text.BadLocationException;
import javax.swing.text.JTextComponent;
import javax.swing.text.TextAction;
import jsyntaxpane.SyntaxDocument;
import jsyntaxpane.Token;
import jsyntaxpane.util.Configuration;
/**
* ComboBox like Completion Action:
* This will display a list of items to choose from, its can be used similar to
* IntelliSense
*
* @author Ayman Al-Sairafi
*/
public class ComboCompletionAction extends TextAction implements SyntaxAction {
Map<String, String> completions;
ComboCompletionDialog dlg;
private String[] items;
public ComboCompletionAction() {
super("COMBO_COMPLETION");
}
public void actionPerformed(ActionEvent e) {
JTextComponent target = getTextComponent(e);
if (target != null && target.getDocument() instanceof SyntaxDocument) {
SyntaxDocument sDoc = (SyntaxDocument) target.getDocument();
int dot = target.getCaretPosition();
Token token = sDoc.getTokenAt(dot);
String abbrev = "";
try {
if (token != null) {
abbrev = token.getText(sDoc);
sDoc.remove(token.start, token.length);
dot = token.start;
}
Frame frame = ActionUtils.getFrameFor(target);
if (dlg == null) {
dlg = new ComboCompletionDialog(frame, true, items);
}
dlg.setLocationRelativeTo(frame);
Point p = frame.getLocation();
// Get location of Dot in rt
Rectangle rt = target.modelToView(dot);
Point loc = new Point(rt.x, rt.y);
// convert the location from Text Componet coordinates to
// Frame coordinates...
loc = SwingUtilities.convertPoint(target, loc, frame);
// and then to Screen coordinates
SwingUtilities.convertPointToScreen(loc, frame);
dlg.setLocation(loc);
dlg.setFonts(target.getFont());
dlg.setText(abbrev);
dlg.setVisible(true);
String res = dlg.getResult();
ActionUtils.insertMagicString(target, dot, res);
} catch (BadLocationException ex) {
Logger.getLogger(ComboCompletionAction.class.getName()).log(Level.SEVERE, null, ex);
}
}
}
/**
* The completions will for now reside on another properties style file
* referenced by prefix.Completions.File
*
* @param config
* @param prefix
* @param name
*/
public void config(Configuration config, String prefix, String name) {
// for now we will use just one list for anything. This can be modified
// by having a map from TokenType to String[] or something....
items = config.getPrefixPropertyList(prefix, name + ".Items");
}
public TextAction getAction(String key) {
return this;
}
}