В этом цикле статей я постараюсь описать то, что я мог понять в Visual Studio SDK)
С самого начала меня подстерегали неудачи( Сначало Установка СДК повисла в самом конце установки, но выключение её через TaskManager все поправило) Но для чего я начал изучение этого СДК? Конечно для того, что бы написать свой собственный редактор Гуи-файлов для моего браузера. Да-да. Я знаю, что есть WPF, у которой формы хранятся в Xml. Но, "нормальные герои всегда идут в обход"))) но дело не в этом. Мне начинает казаться, что MS пишет все, что бы превратить проггеров в Быдло-Кодеров( слишком упрощяют жизнь прогерам) Но это не единственная прричина. У меня всегда были проблемы с парсингом и прочей лабудой. Это будет мне хорошим опытом)
И так. Начнем!
Первое что я начал делать это открыл пример Editor with Toolbox.
Что же я в нем увидел.
Сначало я начал рассматривать файл "EditorPane.cs"
В нем, как не сложно понять, находится класс EditorPane.
Сначала я перешел к методам. По-моему, это самое логичное решение)
Методы Disposing'а я не буду здесь описывать. Они нам пока не интересны.
public int QueryStatus(ref Guid pguidCmdGroup, uint cCmds, OLECMD[] prgCmds, IntPtr pCmdText)
Этот метод возвращает определеные значения перечисления OLECMDF о доступности какой-либо функции вида: "копировать", "вставить", "вырезать", "отметнить".... и т.д.
public int Exec(ref Guid pguidCmdGroup, uint nCmdID, uint nCmdexecopt, IntPtr pvaIn, IntPtr pvaOut)
Который соответственно выполняет одну из указанных команд.
int Microsoft.VisualStudio.OLE.Interop.IPersist.GetClassID(out Guid pClassID)
int IPersistFileFormat.GetClassID(out Guid pClassID)
Я пока не разобрался, что он делает.
int IPersistFileFormat.GetCurFile(out string ppszFilename, out uint pnFormatIndex)
Возвращает имя файла, с которым сейчас работает редактор. И индекс формата файла(если один вариант формата, то пишем 0)
int IPersistFileFormat.GetFormatList(out string ppszFormatList)
Возвращает строку формата файла. Пример:
"HTML File (*.htm; *.html; *.asp)\n*.htm;*.html;*.asp\nText File (*.txt)\n*.txt\n."
int IPersistFileFormat.SaveCompleted(string pszFilename)
Определяет сохранен ли файл. Если нет, то VSConstants.S_FALSE, иначе VSConstants.S_OK.
int IPersistFileFormat.InitNew(uint nFormatIndex)
Инициализация объекта с указанием текущего индеа формата.
int IPersistFileFormat.IsDirty(out int pfIsDirty)
Изменен ли файл с момента последнего сохранения.
int IPersistFileFormat.Load(string pszFilename, uint grfMode, int fReadOnly)
Загрузка файла.
int IPersistFileFormat.Save(string pszFilename, int fRemember, uint nFormatIndex)
Сохранение файла.
int IVsPersistDocData.Close()
Видимо это метод, вызывающийся при закрытии файла или редактора.
int IVsPersistDocData.GetGuidEditorType(out Guid pClassID)
Возвращает гуид класса, который создал этот объект.
int IVsPersistDocData.IsDocDataDirty(out int pfDirty)
Проверяет изменен ли документ с момента последнего сохранения. (Опять???)
int IVsPersistDocData.IsDocDataReloadable(out int pfReloadable)
Возвращает возможность перезагрузить документ.
int IVsPersistDocData.LoadDocData(string pszMkDocument)
Загружает файл(Опять???)
int IVsPersistDocData.OnRegisterDocData(uint docCookie, IVsHierarchy pHierNew, uint itemidNew)
ХЗ ч0
int IVsPersistDocData.ReloadDocData(uint grfFlags)
Перезагрузает документ.
int IVsPersistDocData.RenameDocData(uint grfAttribs, IVsHierarchy pHierNew, uint itemidNew, string pszMkDocumentNew)
Переименовывает данные документа... в общем опять ХЗ ч0.
int IVsPersistDocData.SaveDocData(Microsoft.VisualStudio.Shell.Interop.VSSAVEFLAGS dwSave, out string pbstrMkDocumentNew, out int pfSaveCanceled)
Сохраняет данные документа... ппц просто.
int IVsPersistDocData.SetUntitledDocPath(string pszDocDataPath)
Используется для инициализации донных документа, который только что создан и не сохранен.
int IVsToolboxUser.IsSupported(IOleDataObject pDO)
Поддерживает ли панель редактора объект.
int IVsToolboxUser.ItemPicked(IOleDataObject pDO)
Вызывается при активации объекта в тулбоксе.
Дальше идет список событий от RitchTextBox'a, который является контроллом нашего редактора. Мы их пропустим.
Дельше следуют еще две функции CanEditFile() и NotifyDocChanged().
NotifyDocChanged()
Оч. полезная функция, в которой показано, как указать пользователю, что файл изменен.
CanEditFile()
Определяет можно ли редактировать файл.
Вот и все с этим файлом.... как ыидите тут есть над чем задуматься. а именно, почему здесь есть повторяющиеся функции, хоть они и из разных интерфейсов? почему нельзя было сделать один класс для возвращения всех необходимых гуидов? Не знаю. Видимо я что-то не понимаю.
Дальше я посмотрел файл EditorControl.cs. В нем находится контрол редактора, а именно RitchTextBox... и больше ничего(
Идем дальше.EditFactory.cs. Как видно из названия здесь реализована фабрика редактора. Попробуем разобраться.
public int SetSite(IOleServiceProvider psp)
Служит для установки провайдера сервисов, с помощью которого вы сможете создавать объекты по гуиду.
public int MapLogicalView(ref Guid rguidLogicalView, out string pbstrPhysicalView)
Вроде служит для проверки возможности вида редактора(во время дебага, нормальный режим)...
public int Close()
Закрытие фабрики.
public int CreateEditorInstance(
uint grfCreateDoc,
string pszMkDocument,
string pszPhysicalView,
IVsHierarchy pvHier,
uint itemid,
System.IntPtr punkDocDataExisting,
out System.IntPtr ppunkDocView,
out System.IntPtr ppunkDocData,
out string pbstrEditorCaption,
out Guid pguidCmdUI,
out int pgrfCDW)
Создает сам редактор.
public object GetService(Type serviceType)
Вспомагательный метод для создания объекта из его типа.
Вот и все на сегодня) мне пора спать)
Удачи!
Подписаться на:
Комментарии к сообщению (Atom)
Комментариев нет:
Отправить комментарий