Get FilePath from ITextBuffer or ITextView

6 בנובמבר 2012

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

כשכותבים PlugIn ל – Visual Studio לפעמים נרצה להתייחס לחלון שבו המשתמש כותב טקסט, ניתן להירשם לאירועים שונים (שינוי טקסט, שינוי מיקום מצביע העכבר וכד’)

האובייקט שנקבל יכול להיות ITextBuffer או ITextView, במקרה שנרצה להוציא את שם הקובץ הפיזי שאנחנו עובדים איתו, נצטרך לכתוב מתודה כזו:

private static bool InternalGetFilePath(ITextBuffer textBuffer, out string filePath)

{

    ITextDocument doc;

    filePath = null;

 

    if (textBuffer.Properties.TryGetProperty<ITextDocument>(typeof(ITextDocument), out doc))

    {

        filePath = doc.FilePath;

        return true;

    }

 

    return false;

}

זה יעבוד מעולה עם חלונות טקסט כמו cs, js וכדומה, במידה והחלון הוא מהסוג שמכילים יותר מ – view אחד (html, aspx, xaml) נצטרך להריץ את הקוד הבא:

internal static string GetFilePath(ITextBuffer textBuffer)

{

    string filePath;

 

    if (InternalGetFilePath(textBuffer, out filePath))

    {

        return filePath;

    }

 

    IProjectionBufferBase projectionBufferBase = textBuffer as IProjectionBufferBase;

 

    if (projectionBufferBase != null)

    {

        foreach (ITextBuffer childTextBuffer in projectionBufferBase.SourceBuffers)

        {

            if (InternalGetFilePath(childTextBuffer, out filePath))

            {

                return filePath;

            }

        }

    }

 

    return string.Empty;

}

למעשה אני תמיד קורא רק למתודה השנייה, שבתוכה קוראת למתודה הקודמת, ורק עם לא קבלנו את נתיב הקובץ אנחנו מנסים להמיר זאת לאובייקט שמתייחס לחלון עם כמה views.

 

במידה ומה שיש לנו ביד הוא ITextView, נוכל לכתוב את הקוד הבא:

internal static string GetFilePath(ITextView textView)

{

    string filePath;

 

    if (InternalGetFilePath(textView.TextBuffer, out filePath))

    {

        return filePath;

    }

 

    if (InternalGetFilePath(textView.TextDataModel.DocumentBuffer, out filePath))

    {

        return filePath;

    }

 

    if (InternalGetFilePath(textView.TextViewModel.DataBuffer, out filePath))

    {

        return filePath;

    }

 

    return string.Empty;

}

ננסה להוציא את נתיב הקובץ מאחד המאפיינים שהם מסוג ITextBuffer.

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

כתיבת תגובה

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