Get Selected Text and Position – VS plug in

9 בינואר 2013

תגיות: , , ,
אין תגובות

לפעמים צריך בתוך vs plug in לקבל את ה – selected text והמיקום שלו.

הדרך הפשוטה לכאורה לקבל את המידע היא השורה הבאה:

Code Snippet
DTE2 dte = (DTE2)ServiceProvider.GlobalProvider.GetService(typeof(DTE));
            
if (dte.ActiveDocument != null)
{

    var selection = (EnvDTE.TextSelection)dte.ActiveDocument.Selection;

די בקלות אפשר להוציא את הטקסט הנבחר, אבל זה ממש לא פשוט לדעת את ה – index המדוייק שהטקסט מתחיל ומסתיים, לקריאה נוספת איך בכל זאת לעשות זאת.

 

הדרך הקלה יותר היא זאת:

Code Snippet

IVsTextView textView = GetTextView(dte);

string selectedText;
textView.GetSelectedText(out selectedText);

int piAnchorLine, piAnchorCol, piEndLine, piEndCol;
textView.GetSelection(out piAnchorLine, out piAnchorCol, out piEndLine, out piEndCol);

int startPosition, virtualPosition;
textView.GetNearestPosition(piAnchorLine, piAnchorCol, out startPosition, out virtualPosition);

int endPosition;
textView.GetNearestPosition(piEndLine,piEndCol, out endPosition, out virtualPosition);

TextSelection textSelection = new TextSelection()
{
    Text = selectedText,
    StartIndex = startPosition < endPosition ? startPosition : endPosition,
    EndIndex = startPosition < endPosition ? endPosition : startPosition
    
};

ראשית נקבל אובייקט מסוג IVsTextView (בהמשך נראה את המימוש), לאחר מכן נפעיל את פונקציית GetSelectedText ונקבל את הטקסט הנבחר.

כדי לקבל את השורה והעמודה שהטקסט מתחיל ומסתיים, נפעיל את פונקציית GetSelection, ולבסוף כדי לקבל את המיקום המדוייק, נשתמש ב – GetNearestPosition.

במידה והמשתמש בחר את הטקסט מימין לשמאל – ה – startPosition יהיה גדול מה – endPosition, ולכן נהפוך ביניהם.

 

הדבר האחרון שנשאר לראות הוא – כיצד מקבלים TextView מתוך ActiveDocument, למעשה יש כמה דרכים, כאן מצאתי אחת קצרה

Code Snippet
private static IVsTextView GetTextView(DTE2 dte)
{
    ServiceProvider sp = new ServiceProvider((Interop.IServiceProvider)dte);

    IVsUIHierarchy uiHierarchy;
    uint itemID;
    IVsWindowFrame windowFrame;

    VsShellUtilities.IsDocumentOpen(sp, dte.ActiveDocument.FullName,
                                    Guid.Empty, out uiHierarchy,
                                    out itemID, out windowFrame);

    IVsTextView textView = VsShellUtilities.GetTextView(windowFrame);
    return textView;
}

הוסף תגובה
facebook linkedin twitter email

כתיבת תגובה

האימייל לא יוצג באתר. שדות החובה מסומנים *