本文整理汇总了C#中IVsTextView.GetSelectionSpan方法的典型用法代码示例。如果您正苦于以下问题:C# IVsTextView.GetSelectionSpan方法的具体用法?C# IVsTextView.GetSelectionSpan怎么用?C# IVsTextView.GetSelectionSpan使用的例子?那么恭喜您, 这里精选的方法代码示例或许可以为您提供帮助。您也可以进一步了解该方法所在类IVsTextView
的用法示例。
在下文中一共展示了IVsTextView.GetSelectionSpan方法的5个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的C#代码示例。
示例1: OnTypeChar
public void OnTypeChar(IVsTextView pView, string ch)
{
if (ch == "{")
{
// add a closing "}" if it makes a complete expression or condition where one doesn't exist otherwise
_TextSpan selection;
pView.GetSelectionSpan(out selection);
IVsTextLines buffer;
pView.GetBuffer(out buffer);
string before;
buffer.GetLineText(0, 0, selection.iStartLine, selection.iStartIndex, out before);
int iLastLine, iLastColumn;
buffer.GetLastLineIndex(out iLastLine, out iLastColumn);
string after;
buffer.GetLineText(selection.iEndLine, selection.iEndIndex, iLastLine, iLastColumn, out after);
var existingResult = _grammar.Nodes(new Position(new SourceContext(before + ch + after)));
var expressionHits = existingResult.Rest.GetPaint()
.OfType<Paint<Node>>()
.Where(p => p.Begin.Offset <= before.Length && before.Length <= p.End.Offset && (p.Value is ExpressionNode || p.Value is ConditionNode));
// if a node exists normally, do nothing
if (expressionHits.Count() != 0)
return;
var withCloseResult = _grammar.Nodes(new Position(new SourceContext(before + ch + "}" + after)));
var withCloseHits = withCloseResult.Rest.GetPaint()
.OfType<Paint<Node>>()
.Where(p => p.Begin.Offset <= before.Length && before.Length <= p.End.Offset && (p.Value is ExpressionNode || p.Value is ConditionNode));
// if a close brace doesn't cause a node to exist, do nothing
if (withCloseHits.Count() == 0)
return;
// add a closing } after the selection, then set the selection back to what it was
int iAnchorLine, iAnchorCol, iEndLine, iEndCol;
pView.GetSelection(out iAnchorLine, out iAnchorCol, out iEndLine, out iEndCol);
_TextSpan inserted;
buffer.ReplaceLines(selection.iEndLine, selection.iEndIndex, selection.iEndLine, selection.iEndIndex, "}", 1, out inserted);
pView.SetSelection(iAnchorLine, iAnchorCol, iEndLine, iEndCol);
}
}
示例2: EditArray
/// <include file='doc\EditArray.uex' path='docs/doc[@for="EditArray.EditArray1"]/*' />
/// <summary>
/// This constructor takes a view and will use CompoundViewAction to make the updates
/// and it will update the current selection accordingly.
/// <param name="source">The buffer to operate on</param>
/// <param name="view">The text view to use for CompoundViewAction and whose selection you want updated</param>
/// <param name="merge">Whether to attempt to merge edits</param>
/// <param name="description">Name used in compound action</param>
/// </summary>
public EditArray(Source source, IVsTextView view, bool merge, string description)
{
this.source = source;
this.editList = new ArrayList();
this.merge = merge;
this.description = description;
if (view != null) {
TextSpan[] pSpan = new TextSpan[1];
view.GetSelectionSpan(pSpan);
this.selection = pSpan[0];
this.view = view;
}
this.ca = CompoundActionFactory.GetCompoundAction(this.view, this.source, description);
this.ca.FlushEditActions();
// Sanity check - make sure others are not modifying the buffer while the
// caller is preparing the big edit operation.
this.changeCount = source.ChangeCount;
}
示例3: EditArray
/// <include file='doc\EditArray.uex' path='docs/doc[@for="EditArray.EditArray1"]/*' />
/// <summary>
/// This constructor takes a view and will use CompoundViewAction to make the updates
/// and it will update the current selection accordingly.
/// <param name="source">The buffer to operate on</param>
/// <param name="view">The text view to use for CompoundViewAction and whose selection you want updated</param>
/// <param name="merge">Whether to attempt to merge edits</param>
/// <param name="description">Name used in compound action</param>
/// </summary>
internal EditArray(ISource source, IVsTextView view, bool merge, string description)
{
this.source = source;
this.editList = new ArrayList();
this.merge = merge;
this.description = description;
if (view != null) {
TextSpan[] pSpan = new TextSpan[1];
view.GetSelectionSpan(pSpan);
this.selection = pSpan[0];
this.view = view;
this.cva = new CompoundViewAction(this.view, description);
this.cva.FlushEditActions(); // make sure we see a consistent coordinate system.
} else {
this.ca = new CompoundAction(this.source, description);
this.ca.FlushEditActions();
}
// Sanity check - make sure others are not modifying the buffer while the
// caller is preparing the big edit operation.
this.changeCount = source.ChangeCount;
}
示例4: UnCommentSelection
public virtual void UnCommentSelection(IVsTextView textView) {
CCITracing.TraceCall();
//get text range
TextSpan[] aspan = new TextSpan[1];
textView.GetSelectionSpan(aspan);
TextSpan span = aspan[0];
//check bounds
if (span.iEndIndex == 0) span.iEndLine--;
//get line lengths
int startLen,endLen;
this.textLines.GetLengthOfLine( span.iStartLine, out startLen );
this.textLines.GetLengthOfLine( span.iEndLine, out endLen );
// adjust end index if necessary
if (span.iEndIndex == 0) span.iEndIndex = endLen;
int adjustment = 0;
// is block comment selected?
if (this.commentInfo.blockStart != null && this.commentInfo.blockEnd != null) {
// TODO: this doesn't work if the selection contains a mix of code and block comments
// or multiple block comments!! We should use our parse tree to find the embedded
// comments and uncomment the resulting comment spans only.
string startText = null;
this.textLines.GetLineText( span.iStartLine, span.iStartIndex, span.iStartLine, span.iStartIndex+this.commentInfo.blockStart.Length, out startText );
if (startText == this.commentInfo.blockStart) {
string endText = null;
this.textLines.GetLineText( span.iEndLine, span.iEndIndex- this.commentInfo.blockEnd.Length, span.iEndLine, span.iEndIndex, out endText );
if (endText == this.commentInfo.blockEnd) {
//yes, block comment selected; remove it
this.textLines.ReplaceLines( span.iEndLine, span.iEndIndex-this.commentInfo.blockEnd.Length, span.iEndLine, span.iEndIndex, null, 0, null);
this.textLines.ReplaceLines( span.iStartLine, span.iStartIndex, span.iStartLine, span.iStartIndex+this.commentInfo.blockStart.Length, null, 0, null);
adjustment = - commentInfo.blockEnd.Length;
if (span.iStartLine == span.iEndLine) adjustment -= commentInfo.blockStart.Length;
goto end;
}
}
}
//if no line comment possible, we are done
if (!this.commentInfo.useLineComments)
NativeHelpers.RaiseComError(HResult.S_FALSE);
// try if we can remove line comments, using the scanner to find them
for (int line = span.iStartLine; line <= span.iEndLine; line++) {
TokenInfo[] lineInfo = this.colorizer.GetLineInfo(line, this.colorState);
for (int i = 0, n = lineInfo.Length; i<n; i++) {
if (lineInfo[i].type == TokenType.LineComment) {
this.textLines.ReplaceLines(line, lineInfo[i].startIndex, line, lineInfo[i].startIndex+this.commentInfo.lineStart.Length, null, 0, null);
if (line == span.iEndLine) {
adjustment = - this.commentInfo.lineStart.Length;
}
}
}
}
end:
if (TextSpanHelper.TextSpanPositive(span))
textView.SetSelection( span.iStartLine, span.iStartIndex, span.iEndLine, span.iEndIndex + adjustment );
else
textView.SetSelection( span.iEndLine, span.iEndIndex + adjustment, span.iStartLine, span.iStartIndex );
}
示例5: CommentSelection
// Special View filter command handling.
public virtual void CommentSelection(IVsTextView textView) {
CCITracing.TraceCall();
//get text range
TextSpan[] aspan = new TextSpan[1];
textView.GetSelectionSpan(aspan);
TextSpan span = aspan[0];
//check bounds
if (span.iEndIndex == 0) span.iEndLine--;
//get line lengths
int startLen,endLen;
this.textLines.GetLengthOfLine( span.iStartLine, out startLen );
this.textLines.GetLengthOfLine( span.iEndLine, out endLen );
// adjust end index if necessary
if (span.iEndIndex == 0) span.iEndIndex = endLen;
int adjustment = 0;
//try to use line comments first, if we can.
if (this.commentInfo.useLineComments && span.iStartIndex == 0 && span.iEndIndex == endLen) {
//comment each line
for (int line = span.iStartLine; line <= span.iEndLine; line++) {
this.textLines.ReplaceLines( line, 0, line, 0, this.commentInfo.lineStart, this.commentInfo.lineStart.Length, null);
}
adjustment = this.commentInfo.lineStart.Length;
span.iStartIndex = 0;
}
// otherwise try to use block comments
else if (this.commentInfo.blockStart != null && this.commentInfo.blockEnd != null) {
//add end comment
this.textLines.ReplaceLines( span.iEndLine, span.iEndIndex, span.iEndLine, span.iEndIndex
, this.commentInfo.blockEnd, this.commentInfo.blockEnd.Length, null);
//add start comment
this.textLines.ReplaceLines( span.iStartLine, span.iStartIndex, span.iStartLine, span.iStartIndex
, this.commentInfo.blockStart, this.commentInfo.blockStart.Length, null);
adjustment = this.commentInfo.blockEnd.Length;
if (span.iStartLine == span.iEndLine) adjustment += this.commentInfo.blockStart.Length;
}
else
NativeHelpers.RaiseComError(HResult.E_FAIL);
if (TextSpanHelper.TextSpanPositive(span))
textView.SetSelection( span.iStartLine, span.iStartIndex, span.iEndLine, span.iEndIndex + adjustment );
else
textView.SetSelection( span.iEndLine, span.iEndIndex + adjustment, span.iStartLine, span.iStartIndex );
}