package com.baselet.gui.pane;
import java.awt.Component;
import java.awt.FlowLayout;
import java.util.ArrayList;
import java.util.List;
import javax.swing.BoxLayout;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.ScrollPaneConstants;
import javax.swing.text.JTextComponent;
import javax.swing.text.PlainDocument;
import org.fife.ui.autocomplete.AutoCompletion;
import org.fife.ui.autocomplete.BasicCompletion;
import org.fife.ui.autocomplete.DefaultCompletionProvider;
import org.fife.ui.rsyntaxtextarea.AbstractTokenMakerFactory;
import org.fife.ui.rsyntaxtextarea.RSyntaxTextArea;
import org.fife.ui.rsyntaxtextarea.TokenMakerFactory;
import org.fife.ui.rsyntaxtextarea.TokenMap;
import org.fife.ui.rsyntaxtextarea.TokenTypes;
import org.fife.ui.rtextarea.RTextScrollPane;
import com.baselet.control.basics.Converter;
import com.baselet.control.config.DerivedConfig;
import com.baselet.diagram.CurrentDiagram;
import com.baselet.diagram.draw.helper.ColorOwn;
import com.baselet.element.interfaces.GridElement;
import com.baselet.gui.AutocompletionText;
public class OwnSyntaxPane {
private static final String SEPARATOR = " ";
private final DefaultCompletionProvider provider = new DefaultCompletionProvider() {
@Override
protected boolean isValidChar(char ch) {
return ch != ' '; // every character except space can be part of an autocompletion
}
};
List<AutocompletionText> words = new ArrayList<AutocompletionText>();
JPanel panel;
RSyntaxTextArea textArea;
RTextScrollPane scrollPane;
public OwnSyntaxPane() {
panel = new JPanel(new FlowLayout());
panel.setLayout(new BoxLayout(panel, BoxLayout.Y_AXIS));
textArea = new RSyntaxTextArea() {
private static final long serialVersionUID = 7431070002967577129L;
@Override
public void undoLastAction() {
CurrentDiagram.getInstance().getDiagramHandler().getController().undo();
}
@Override
public void redoLastAction() {
CurrentDiagram.getInstance().getDiagramHandler().getController().redo();
}
};
// Setup highlighting
createHightLightMap();
AbstractTokenMakerFactory atmf = (AbstractTokenMakerFactory) TokenMakerFactory.getDefaultInstance();
atmf.putMapping(OwnTokenMaker.ID, OwnTokenMaker.class.getName());
textArea.setSyntaxEditingStyle(OwnTokenMaker.ID);
textArea.getSyntaxScheme().getStyle(TokenTypes.RESERVED_WORD).foreground = Converter.convert(ColorOwn.SYNTAX_HIGHLIGHTING);
// Setup autocompletion
createAutocompletionCompletionProvider();
AutoCompletion ac = new AutoCompletion(provider);
// ac.setShowDescWindow(true);
ac.install(textArea);
JLabel propertyLabel = new JLabel(" Properties");
propertyLabel.setAlignmentX(Component.LEFT_ALIGNMENT);
propertyLabel.setFont(DerivedConfig.getPanelHeaderFont());
panel.add(propertyLabel);
textArea.setAntiAliasingEnabled(true);
textArea.setFont(DerivedConfig.getPanelContentFont());
scrollPane = new RTextScrollPane(textArea, false);
scrollPane.setAlignmentX(Component.LEFT_ALIGNMENT);
scrollPane.setVerticalScrollBarPolicy(ScrollPaneConstants.VERTICAL_SCROLLBAR_AS_NEEDED);
scrollPane.setHorizontalScrollBarPolicy(ScrollPaneConstants.HORIZONTAL_SCROLLBAR_AS_NEEDED);
panel.add(scrollPane);
textArea.getDocument().putProperty(PlainDocument.tabSizeAttribute, 3); // Reduce tab size
}
/**
* create one per class
* @param strings
*/
private void createAutocompletionCompletionProvider() {
provider.clear();
for (AutocompletionText word : words) {
provider.addCompletion(new BasicCompletion(provider, word.getText(), word.getInfo()) {
@Override
public String toString() {
if (getShortDescription() == null) {
return getInputText();
}
return getInputText() + SEPARATOR + getShortDescription();
}
});
}
}
private void createHightLightMap() {
TokenMap myWordsToHighlight = new TokenMap();
for (AutocompletionText word : words) {
myWordsToHighlight.put(word.getText(), TokenTypes.RESERVED_WORD);
}
// use ugly static setter because OwnTokenMaker is unfortunately not instantiated by us
OwnTokenMaker.setMyWordsToHighlight(myWordsToHighlight);
// switch syntaxstyle to null and back to OwnTokenMaker to make sure the wordsToHighlight are reset!
textArea.setSyntaxEditingStyle(null);
textArea.setSyntaxEditingStyle(OwnTokenMaker.ID);
}
public String getText() {
return textArea.getText();
}
public JPanel getPanel() {
return panel;
}
public void invalidate() {
panel.invalidate();
}
public JTextComponent getTextComponent() {
return textArea;
}
public void switchToElement(GridElement e) {
words = e.getAutocompletionList();
setText(e.getPanelAttributes());
}
public void switchToNonElement(String text) {
words = new ArrayList<AutocompletionText>();
setText(text);
}
private void setText(String text) {
if (!textArea.getText().equals(text)) {
textArea.setText(text); // Always set text even if they are equal to trigger correct syntax highlighting (if words to highlight have changed but text not)
}
textArea.setCaretPosition(0);
createHightLightMap();
createAutocompletionCompletionProvider();
}
}