下面列出了javax.swing.text.StyledDocument#getParagraphElement ( ) 实例代码,或者点击链接到github查看源代码,也可以在右侧发表评论。
static int getRowFirstNonWhite(StyledDocument doc, int offset)
throws BadLocationException {
Element lineElement = doc.getParagraphElement(offset);
int start = lineElement.getStartOffset();
while (start + 1 < lineElement.getEndOffset()) {
try {
if (doc.getText(start, 1).charAt(0) != ' ') {
break;
}
} catch (BadLocationException ex) {
throw (BadLocationException) new BadLocationException(
"calling getText(" + start + ", " + (start + 1)
+ ") on doc of length: " + doc.getLength(), start).initCause(ex);
}
start++;
}
return start;
}
static int getRowFirstNonWhite(StyledDocument doc, int offset) throws BadLocationException {
Element lineElement = doc.getParagraphElement(offset);
int start = lineElement.getStartOffset();
while (start + 1 < lineElement.getEndOffset()) {
try {
if (doc.getText(start, 1).charAt(0) != ' ') {
break;
}
} catch (BadLocationException ex) {
throw (BadLocationException) new BadLocationException(
"calling getText(" + start + ", " + (start + 1)
+ ") on doc of length: " + doc.getLength(), start
).initCause(ex);
}
start++;
}
return start;
}
static int getRowFirstNonWhite(StyledDocument doc, int offset)
throws BadLocationException {
Element lineElement = doc.getParagraphElement(offset);
int start = lineElement.getStartOffset();
while (start + 1 < lineElement.getEndOffset()) {
try {
if (doc.getText(start, 1).charAt(0) != ' ') {
break;
}
} catch (BadLocationException ex) {
throw (BadLocationException) new BadLocationException(
"calling getText(" + start + ", " + (start + 1)
+ ") on doc of length: " + doc.getLength(), start).initCause(ex);
}
start++;
}
return start;
}
/**
* Locates AnnotateLine associated with given line. The
* line is translated to Element that is used as map lookup key.
* The map is initially filled up with Elements sampled on
* annotate() method.
*
* <p>Key trick is that Element's identity is maintained
* until line removal (and is restored on undo).
*
* @param line
* @return found AnnotateLine or <code>null</code>
*/
private AnnotateLine getAnnotateLine(int line) {
StyledDocument sd = (StyledDocument) doc;
int lineOffset = NbDocument.findLineOffset(sd, line);
Element element = sd.getParagraphElement(lineOffset);
AnnotateLine al = elementAnnotations.get(element);
if (al != null) {
int startOffset = element.getStartOffset();
int endOffset = element.getEndOffset();
try {
int len = endOffset - startOffset;
String text = doc.getText(startOffset, len -1);
String content = al.getContent();
if (text.equals(content)) {
return al;
}
} catch (BadLocationException e) {
Mercurial.LOG.log(Level.INFO, "HG.AB: can not locate line annotation."); // NOI18N
}
}
return null;
}
/** Implements superclass abstract method. */
protected void setHardCodedString(HardCodedString hcString, StyledDocument document) {
getStringText().setText(hcString == null ? "" : hcString.getText()); // NOI18N
int pos;
String hardLine;
if (hcString.getStartPosition() == null) {
hardLine = ""; // NOI18N
} else {
pos = hcString.getStartPosition().getOffset();
try {
Element paragraph = document.getParagraphElement(pos);
hardLine = document.getText(paragraph.getStartOffset(), paragraph.getEndOffset()-paragraph.getStartOffset()).trim();
} catch (BadLocationException ble) {
hardLine = ""; // NOI18N
}
}
getFoundInText().setText(hardLine);
if(hcString instanceof FormHardCodedString) {
getComponentText().setText( ((FormHardCodedString)hcString).getValidProperty().getRADComponentName());
getPropertyText().setText( ((FormHardCodedString)hcString).getNodeProperty().getName());
} else {
remove(getComponentLabel());
remove(getComponentText());
remove(getPropertyLabel());
remove(getPropertyText());
}
}
/** Implements superclass abstract method. */
protected void setHardCodedString(HardCodedString hcString, StyledDocument document) {
getStringText().setText(hcString == null ? "" //NOI18N
: hcString.getText());
int pos;
String hardLine;
if (hcString.getStartPosition() == null) {
hardLine = ""; //NOI18N
} else {
pos = hcString.getStartPosition().getOffset();
try {
Element paragraph = document.getParagraphElement(pos);
hardLine = document.getText(paragraph.getStartOffset(),
paragraph.getEndOffset() - paragraph.getStartOffset())
.trim();
} catch (BadLocationException ble) {
hardLine = ""; // NOI18N
}
}
getFoundInText().setText(hardLine);
remove(getComponentLabel());
remove(getComponentText());
remove(getPropertyLabel());
remove(getPropertyText());
}
@Override
protected void query(CompletionResultSet completionResultSet, Document document, int caretOffset) {
logger.finer("Starting completion");
final StyledDocument styDoc = (StyledDocument) document;
Element lineElement = styDoc.getParagraphElement(caretOffset);
int lineStartOffset = lineElement.getStartOffset();
try {
String lineToCaret = styDoc.getText(lineStartOffset, caretOffset - lineStartOffset);
if (!lineToCaret.contains("#")) {
String[] parts = lineToCaret.split("=");
//property name extraction from part before =
Matcher matcher = PATTERN_PROP_NAME.matcher(parts[0]);
String propPrefix = null;
int propPrefixOffset = 0;
while (matcher.find()) {
propPrefix = matcher.group();
propPrefixOffset = matcher.start();
}
// check which kind of completion
final int equalSignOffset = lineToCaret.indexOf('=');
if (parts.length > 1) {
//value completion
String valPrefix = parts[1].trim();
completePropValue(completionResultSet, propPrefix, valPrefix, lineStartOffset
+ lineToCaret.indexOf(valPrefix, equalSignOffset), caretOffset);
} else if (equalSignOffset >= 0) {
//value completion with empty filter
completePropValue(completionResultSet, propPrefix, "", lineStartOffset + equalSignOffset + 1, caretOffset);
} else {
// property completion
completePropName(completionResultSet, propPrefix, lineStartOffset + propPrefixOffset, caretOffset);
}
}
} catch (BadLocationException ex) {
Exceptions.printStackTrace(ex);
}
completionResultSet.finish();
}
@Override
protected void query(CompletionResultSet completionResultSet, Document document, int caretOffset) {
final StyledDocument styDoc = (StyledDocument) document;
Element lineElement = styDoc.getParagraphElement(caretOffset);
int lineStartOffset = lineElement.getStartOffset();
int lineEndOffset = lineElement.getEndOffset();
try {
String line = styDoc.getText(lineStartOffset, lineEndOffset - lineStartOffset);
if (line.endsWith("\n")) {
line = line.substring(0, line.length() - 1);
}
if (showTooltip) {
logger.log(FINER, "Tooltip on: {0}", line);
} else {
logger.log(FINER, "Documentation on: {0}", line);
}
if (!line.contains("#")) {
//property name extraction from line
Matcher matcher = PATTERN_PROP_NAME.matcher(line);
if (matcher.matches()) {
String propPrefix = matcher.group(1);
ConfigurationMetadataProperty propMeta = sbs.getPropertyMetadata(propPrefix);
if (propMeta != null) {
if (showTooltip) {
final JToolTip toolTip = new JToolTip();
toolTip.setTipText(Utils.shortenJavaType(propMeta.getType()));
completionResultSet.setToolTip(toolTip);
} else {
completionResultSet.setDocumentation(new CfgPropCompletionDocumentation(propMeta));
}
}
}
}
} catch (BadLocationException ex) {
Exceptions.printStackTrace(ex);
}
completionResultSet.finish();
}
@Override
public void defaultAction(JTextComponent jtc) {
logger.log(Level.FINER, "Accepted key value hint: {0}", hint.toString());
try {
StyledDocument doc = (StyledDocument) jtc.getDocument();
// calculate the amount of chars to remove (by default from dot up to caret position)
int lenToRemove = caretOffset - dotOffset;
int equalSignIndex = -1;
int colonIndex = -1;
if (overwrite) {
// NOTE: the editor removes by itself the word at caret when ctrl + enter is pressed
// the document state here is different from when the completion was invoked thus we have to
// find again the offset of the equal sign in the line
Element lineElement = doc.getParagraphElement(caretOffset);
String line = doc.getText(lineElement.getStartOffset(), lineElement.getEndOffset() - lineElement.getStartOffset());
equalSignIndex = line.indexOf('=');
colonIndex = line.indexOf(':');
if (equalSignIndex >= 0) {
// from dot to equal sign
lenToRemove = lineElement.getStartOffset() + equalSignIndex - dotOffset;
} else if (colonIndex >= 0) {
// from dot to colon
lenToRemove = lineElement.getStartOffset() + colonIndex - dotOffset;
}
}
// remove characters from dot then insert new text
doc.remove(dotOffset, lenToRemove);
if (equalSignIndex < 0 && colonIndex < 0) {
logger.log(Level.FINER, "Adding equal sign and continuing completion");
doc.insertString(dotOffset, hint.getValue().toString().concat("="), null);
} else {
logger.log(Level.FINER, "Finish completion with no added chars");
doc.insertString(dotOffset, hint.getValue().toString(), null);
Completion.get().hideAll();
}
} catch (BadLocationException ex) {
Exceptions.printStackTrace(ex);
}
}
public void setBreakpointToEOLAt(int byteOffset, int lineNumber) {
final StyledDocument doc = (StyledDocument)editPane.getDocument();
final Element paragraphElement = doc.getParagraphElement(byteOffset);
if (paragraphElement.getClass() == BranchElement.class) {
final SimpleAttributeSet sas = new SimpleAttributeSet();
StyleConstants.setBackground(sas, Color.cyan);
// Look for ending delimiter
int length = 1;
try {
for (int i = byteOffset; ; i++) {
if (i >= doc.getLength()) {
length = i - byteOffset + 1;
break;
} else if (doc.getText(i, 1).equals("\n")) {
length = i - byteOffset;
break;
}
}
} catch (BadLocationException ble) {
length = 0;
}
if (0 < length) {
doc.setCharacterAttributes(byteOffset, length, sas, false);
}
}
}
@Override
public void defaultAction(JTextComponent jtc) {
logger.log(Level.FINER, "Accepted name completion: {0}", configurationMeta.getId());
try {
StyledDocument doc = (StyledDocument) jtc.getDocument();
// calculate the amount of chars to remove (by default from property start up to caret position)
int lenToRemove = caretOffset - propStartOffset;
int equalSignIndex = -1;
if (overwrite) {
// NOTE: the editor removes by itself the word at caret when ctrl + enter is pressed
// the document state here is different from when the completion was invoked thus we have to
// find again the offset of the equal sign in the line
Element lineElement = doc.getParagraphElement(caretOffset);
String line = doc.getText(lineElement.getStartOffset(), lineElement.getEndOffset() - lineElement.getStartOffset());
equalSignIndex = line.indexOf('=');
int colonIndex = line.indexOf(':');
if (equalSignIndex >= 0) {
// from property start to equal sign
lenToRemove = lineElement.getStartOffset() + equalSignIndex - propStartOffset;
} else if (colonIndex >= 0) {
// from property start to colon
lenToRemove = lineElement.getStartOffset() + colonIndex - propStartOffset;
} else {
// from property start to end of line (except line terminator)
lenToRemove = lineElement.getEndOffset() - 1 - propStartOffset;
}
}
// remove characters from the property name start offset
doc.remove(propStartOffset, lenToRemove);
// add some useful chars depending on data type and presence of successive equal signs
final String dataType = configurationMeta.getType();
final boolean isSequence = dataType.contains("List") || dataType.contains("Set") || dataType.contains("[]");
final boolean preferArray = NbPreferences.forModule(PrefConstants.class)
.getBoolean(PrefConstants.PREF_ARRAY_NOTATION, false);
final boolean needEqualSign = !(overwrite && equalSignIndex >= 0);
StringBuilder sb = new StringBuilder(getText());
boolean continueCompletion = false;
int goBack = 0;
if (dataType.contains("Map")) {
sb.append(".");
continueCompletion = canCompleteKey();
} else if (isSequence) {
if (preferArray) {
sb.append("[]");
goBack = 1;
if (needEqualSign) {
sb.append("=");
goBack++;
}
} else {
if (needEqualSign) {
sb.append("=");
continueCompletion = canCompleteValue();
}
}
} else if (needEqualSign) {
sb.append("=");
continueCompletion = canCompleteValue();
}
doc.insertString(propStartOffset, sb.toString(), null);
if (goBack != 0) {
jtc.setCaretPosition(jtc.getCaretPosition() - goBack);
}
// optinally close the code completion box
if (!continueCompletion) {
Completion.get().hideAll();
}
} catch (BadLocationException ex) {
Exceptions.printStackTrace(ex);
}
}
@Override
public void defaultAction(JTextComponent jtc) {
logger.log(Level.FINER, "Accepted value completion: {0}", hint.toString());
try {
StyledDocument doc = (StyledDocument) jtc.getDocument();
// calculate the amount of chars to remove (by default from dot up to caret position)
int lenToRemove = caretOffset - dotOffset;
if (overwrite) {
// NOTE: the editor removes by itself the word at caret when ctrl + enter is pressed
// the document state here is different from when the completion was invoked thus we have to
// find again the offset of the equal sign in the line
Element lineElement = doc.getParagraphElement(caretOffset);
String line = doc.getText(lineElement.getStartOffset(), lineElement.getEndOffset() - lineElement.getStartOffset());
int equalSignIndex = line.indexOf('=');
int colonIndex = line.indexOf(':');
int commaIndex = line.indexOf(',', dotOffset - lineElement.getStartOffset());
if (equalSignIndex >= 0 && dotOffset < equalSignIndex) {
// from dot to equal sign
lenToRemove = lineElement.getStartOffset() + equalSignIndex - dotOffset;
} else if (colonIndex >= 0 && dotOffset < colonIndex) {
// from dot to colon
lenToRemove = lineElement.getStartOffset() + colonIndex - dotOffset;
} else if (commaIndex >= 0) {
// from dot to comma
lenToRemove = lineElement.getStartOffset() + commaIndex - dotOffset;
} else {
// from dot to end of line (except line terminator)
lenToRemove = lineElement.getEndOffset() - 1 - dotOffset;
}
}
// remove characters from dot then insert new text
doc.remove(dotOffset, lenToRemove);
doc.insertString(dotOffset, hint.getValue().toString(), null);
// close the code completion box
if (!continueCompletion) {
Completion.get().hideAll();
}
} catch (BadLocationException ex) {
Exceptions.printStackTrace(ex);
}
}
@Override
public void defaultAction(JTextComponent jtc) {
logger.log(Level.FINER, "Accepted java type completion: {0} {1}", new Object[]{elementKind.toString(), name});
try {
StyledDocument doc = (StyledDocument) jtc.getDocument();
// calculate the amount of chars to remove (by default from dot up to caret position)
int lenToRemove = caretOffset - dotOffset;
if (overwrite) {
// NOTE: the editor removes by itself the word at caret when ctrl + enter is pressed
// the document state here is different from when the completion was invoked thus we have to
// find again the offset of the equal sign in the line
Element lineElement = doc.getParagraphElement(caretOffset);
String line = doc.getText(lineElement.getStartOffset(), lineElement.getEndOffset() - lineElement.getStartOffset());
int equalSignIndex = line.indexOf('=');
int colonIndex = line.indexOf(':');
int commaIndex = line.indexOf(',', dotOffset - lineElement.getStartOffset());
if (equalSignIndex >= 0 && dotOffset < equalSignIndex) {
// from dot to equal sign
lenToRemove = lineElement.getStartOffset() + equalSignIndex - dotOffset;
} else if (colonIndex >= 0 && dotOffset < colonIndex) {
// from dot to colon
lenToRemove = lineElement.getStartOffset() + colonIndex - dotOffset;
} else if (commaIndex >= 0) {
// from dot to comma
lenToRemove = lineElement.getStartOffset() + commaIndex - dotOffset;
} else {
// from dot to end of line (except line terminator)
lenToRemove = lineElement.getEndOffset() - 1 - dotOffset;
}
}
// remove characters from dot then insert new text
doc.remove(dotOffset, lenToRemove);
if (isKeyCompletion) {
// insert and continue completion
doc.insertString(dotOffset, name.concat("="), null);
} else {
// insert and close the code completion box
doc.insertString(dotOffset, name, null);
Completion.get().hideAll();
}
} catch (BadLocationException ex) {
Exceptions.printStackTrace(ex);
}
}
@Override
public void defaultAction(JTextComponent jtc) {
logger.log(Level.FINER, "Accepted file object completion: {0}", FileUtil.getFileDisplayName(fileObj));
try {
StyledDocument doc = (StyledDocument) jtc.getDocument();
// calculate the amount of chars to remove (by default from dot up to caret position)
int lenToRemove = caretOffset - dotOffset;
if (overwrite) {
// NOTE: the editor removes by itself the word at caret when ctrl + enter is pressed
// the document state here is different from when the completion was invoked thus we have to
// find again the offset of the equal sign in the line
Element lineElement = doc.getParagraphElement(caretOffset);
String line = doc.getText(lineElement.getStartOffset(), lineElement.getEndOffset() - lineElement.getStartOffset());
int equalSignIndex = line.indexOf('=');
int colonIndex = line.indexOf(':');
int commaIndex = line.indexOf(',', dotOffset - lineElement.getStartOffset());
if (equalSignIndex >= 0 && dotOffset < equalSignIndex) {
// from dot to equal sign
lenToRemove = lineElement.getStartOffset() + equalSignIndex - dotOffset;
} else if (colonIndex >= 0 && dotOffset < colonIndex) {
// from dot to colon
lenToRemove = lineElement.getStartOffset() + colonIndex - dotOffset;
} else if (commaIndex >= 0) {
// from dot to comma
lenToRemove = lineElement.getStartOffset() + commaIndex - dotOffset;
} else {
// from dot to end of line (except line terminator)
lenToRemove = lineElement.getEndOffset() - 1 - dotOffset;
}
}
// remove characters from dot then insert new text
doc.remove(dotOffset, lenToRemove);
if (fileObj.isRoot()) {
logger.log(Level.FINER, "Adding filesystem root and continuing completion");
doc.insertString(dotOffset, getText(), null);
} else if (fileObj.isFolder()) {
logger.log(Level.FINER, "Adding folder and continuing completion");
doc.insertString(dotOffset, getText().concat("/"), null);
} else {
logger.log(Level.FINER, "Adding file and finishing completion");
doc.insertString(dotOffset, getText(), null);
Completion.get().hideAll();
}
} catch (BadLocationException ex) {
Exceptions.printStackTrace(ex);
}
}