Как настроить Delphi IDE для обновления цветов подсветки измененного синтаксиса с помощью OTA (Open Tools API)? - PullRequest
12 голосов
/ 28 марта 2012

Я пишу плагин для интеграции Delphi IDE Theme Editor с IDE Rad Studio (текущая версия этого инструмента запускается как внешнее приложение), пока все работает нормально (см. Изображение ниже)), за исключением того факта, что я не могу понять, как обновить выбранные цвета подсветки синтаксиса в Delphi IDE

enter image description here

Позвольте мне объяснить, в стандартном варианте изменить синтаксисвыделите цвета (Параметры редактора-> Цвет), вы можете настроить любой элемент и назначить новый цвет переднего плана и фона, а затем, если вы нажмете .OK. Кнопка IDE применяет изменения, и окна редактора IDE обновляются с новыми настройками.

В настоящее время я могу изменять и сохранять новые значения, но я не могу дать указание Delphi IDE применить новую конфигурацию, изменения видны только при перезапуске IDE.

Я искал модуль ToolsAPI и обнаружил интерфейсы IOTAEditOptions, IOTAHighlighter и IOTAHighlightServices, но ни в одном из них нет возможности обновить (перезагрузить) измененную настройку.

Также я попытался отменить (используя tdump) и вызывая функции файла coreide1XX.bpl напрямую, но это тоже не сработало.

00420B94 17411 1F39 Editcolorpage::TEditorColor::
00422188 17400 1F3A __fastcall Editcolorpage::TEditorColor::ColorClick(System::TObject *)
0042174C 17407 1F3B __fastcall Editcolorpage::TEditorColor::ColorSpeedSettingClick(System::TObject *)
004224BC 17396 1F3C __fastcall Editcolorpage::TEditorColor::DefaultClick(System::TObject *)
00422414 17397 1F3D __fastcall Editcolorpage::TEditorColor::EditorColorBroadcast(System::TObject *, Winapi::Messages::TMessage&)
00421584 17409 1F3E __fastcall Editcolorpage::TEditorColor::EditorColorCreate(System::TObject *)
00421730 17408 1F3F __fastcall Editcolorpage::TEditorColor::EditorColorDestroy(System::TObject *)
004217B0 17406 1F40 __fastcall Editcolorpage::TEditorColor::ElementListClick(System::TObject *)
004222E8 17399 1F41 __fastcall Editcolorpage::TEditorColor::FontClick(System::TObject *)
004225DC 17395 1F42 __fastcall Editcolorpage::TEditorColor::HelpClick(System::TObject *)
00421AE8 17404 1F43 __fastcall Editcolorpage::TEditorColor::InitLineFlags(const System::DelphiInterface<Toolsapi::IOTAHighlighterPreview>)
004219B8 17405 1F44 __fastcall Editcolorpage::TEditorColor::InitSamplePane()
00421BC8 17403 1F45 __fastcall Editcolorpage::TEditorColor::InitSyntaxEditView(const System::DelphiInterface<Toolsapi::IOTAHighlighterPreview>)
0042262C 17393 1F46 __fastcall Editcolorpage::TEditorColor::LoadHighlightPreviews()
004225F4 17394 1F47 __fastcall Editcolorpage::TEditorColor::MarkDirty()
004220E4 17401 1F48 __fastcall Editcolorpage::TEditorColor::SampleClick(System::TObject *)
00422080 17402 1F49 __fastcall Editcolorpage::TEditorColor::SetColorSpeedSetting(Vedopts::TColorSpeedSetting)
0042238C 17398 1F4A __fastcall Editcolorpage::TEditorColor::UpdateSamplePane()
00422814 17392 1F4B __fastcall Editcolorpage::TEditorColor::tbsetPreviewsChange(System::TObject *, int, bool&)
004AA8D4 17390 1F4C __fastcall Editcolorpage::initialization()
00423C38 17413 1F4D __fastcall Editdisplaypage::Finalization()

How I can instruct to the Delphi IDE refresh the modified syntax highlight colors using OTA (Open Tools API)?

Дайте мне знать, если вам нужна дополнительная информация или если вопросне понятно.

Ответы [ 2 ]

2 голосов
/ 27 марта 2014

Я бы сказал, что вам лучше всего подглядывать coreide*.@Envoptions@TEnvironmentOptions@EditorSourceOptionsBeforeSave или coreide*.@Envoptions@TEnvironmentOptions@EditorSourceOptionsAfterSave

Они вызываются при нажатии кнопки Ok. Я не очень хорош в чтении ассемблера, но, судя по всему, параметры среды загружаются из реестра во время инициализации IDE, и любые сделанные изменения записываются обратно по мере необходимости, но IDE зависит от того, что в памяти TEnvironmentOptions авторитетное представление всех параметров среды.

coreide*.@Envoptions@TEnvironmentOptions@GetEdColors, по-видимому, там, где цвета извлекаются из параметров среды для редактирования с помощью TEditorColor

К сожалению, ни один из этих классов не выставлен OTA или NTA.

2 голосов
/ 29 марта 2012

Небольшой взлом, который должен иметь желаемый эффект, состоял бы в том, чтобы ваш плагин вызывал диалоговое окно Environment Options, и оператор закрывал его вручную. Это заставляет IDE повторно инициализировать свою конфигурацию на основе переданных параметров.

Для этого получите дескриптор проекта (IOTAProject объект) и вызовите ...

AProject.ProjectOptions.EditOptions;

Где AProject определяется как AProject: IOTAProject.

Я знаю, что это не самое элегантное решение, но если оно дает желаемый эффект, по крайней мере, оно несколько практично.

...