====== Arhitektura razširitve ====== Podroben opis notranje arhitekture WvdS VSCode razširitve. ===== Življenjski cikel ===== ┌─────────────────────────────────────────────────────────────┐ │ ŽIVLJENJSKI CIKEL RAZŠIRITVE │ ├─────────────────────────────────────────────────────────────┤ │ │ │ 1. Zagon VS Code │ │ ↓ │ │ 2. Sproži se aktivacijski dogodek │ │ (onCommand, onLanguage, onStartupFinished, ...) │ │ ↓ │ │ 3. Naloži se extension_main.js │ │ ↓ │ │ 4. Pokliče se Activate() │ │ → Inicializacija storitev │ │ → Registracija ukazov │ │ → Nastavitev obravnavalcev dogodkov │ │ ↓ │ │ 5. Razširitev je aktivna │ │ → Interakcija uporabnika │ │ → Izvajanje ukazov │ │ ↓ │ │ 6. Zaustavitev VS Code / Deaktivacija razširitve │ │ ↓ │ │ 7. Pokliče se Deactivate() │ │ → Čiščenje │ │ → Sprostitev virov │ │ │ └─────────────────────────────────────────────────────────────┘ ===== Vstopna točka ===== Vsaka razširitev ima natanko eno vstopno točko: ''extension_main.pas'' unit extension_main; {$mode objfpc}{$H+} interface uses JS, VSCode.API, VSCode.ExtensionExports; procedure Activate(AContext: TExtensionContext); procedure Deactivate; implementation procedure Activate(AContext: TExtensionContext); begin // Inicializacija tukaj end; procedure Deactivate; begin // Čiščenje tukaj end; initialization ExportActivateDeactivate(@Activate, @Deactivate); end. ===== Aktivacijski dogodki ===== ^ Dogodek ^ Opis ^ Primer ^ | onStartupFinished | Po zagonu VS Code | Jedro razširitve | | onCommand:* | Ob klicu ukaza | wvds.build.run | | onLanguage:* | Ob odprtju datoteke | pascal, pxaml | | onView:* | Ob odprtju pogleda | wvds.toolbox | | workspaceContains:** | Ko datoteka obstaja | *.lpr, *.pas | | onCustomEditor:* | Ob odprtju urejevalnika po meri | wvds.designer | ===== Registracija ukazov ===== procedure RegisterCommands(AContext: TExtensionContext); begin // Preprost ukaz RegisterCommand('wvds.feature.action', @HandleAction); // Ukaz z argumenti RegisterCommand('wvds.feature.open', @HandleOpen); // Asinhroni ukaz RegisterAsyncCommand('wvds.feature.process', @HandleProcessAsync); end; procedure HandleAction(Args: TJSValueDynArray); begin ShowInfoMessage('Akcija izvedena'); end; function HandleProcessAsync(Args: TJSValueDynArray): TJSPromise; begin Result := TJSPromise.New( procedure(Resolve, Reject: TJSPromiseResolver) begin // Asinhrono delo... Resolve(nil); end ); end; ===== Vzorec storitev ===== // Feature.Service.pas unit Feature.Service; interface type TWvdSFeatureService = class private FInitialized: Boolean; public procedure Initialize; procedure Shutdown; function DoWork(const AInput: string): string; end; var FeatureService: TWvdSFeatureService; implementation procedure TWvdSFeatureService.Initialize; begin if FInitialized then Exit; // Inicializacija storitve FInitialized := True; end; procedure TWvdSFeatureService.Shutdown; begin if not FInitialized then Exit; // Čiščenje FInitialized := False; end; initialization FeatureService := TWvdSFeatureService.Create; finalization FeatureService.Free; end. ===== Odložljivi objekti ===== VS Code uporablja odložljive objekte za upravljanje virov: procedure Activate(AContext: TExtensionContext); var Disposable: TDisposable; begin // Registracija ukaza in pridobitev odložljivega objekta Disposable := RegisterCommand('wvds.test', @Handler); // Dodaj v kontekst za samodejno čiščenje AContext.Subscriptions.Push(Disposable); end; ===== Integracija WebView ===== procedure ShowWebViewPanel; var Panel: TWebviewPanel; begin Panel := CreateWebviewPanel( 'wvds.feature.panel', // viewType 'Panel funkcije', // title ViewColumn.One, // showOptions WebviewOptions // options ); // Nastavi HTML Panel.Webview.Html := GetPanelHtml; // Nastavi sporočanje Panel.Webview.OnDidReceiveMessage(@HandleWebviewMessage); // Pošlji sporočila Panel.Webview.PostMessage(TJSObject.New); end; ===== Obravnava dogodkov ===== procedure SetupEventHandlers; begin // Sprememba konfiguracije OnDidChangeConfiguration(@HandleConfigChange); // Dogodki dokumenta OnDidOpenTextDocument(@HandleDocumentOpen); OnDidSaveTextDocument(@HandleDocumentSave); OnDidCloseTextDocument(@HandleDocumentClose); // Dogodki delovnega prostora OnDidChangeWorkspaceFolders(@HandleWorkspaceChange); end; ===== Glejte tudi ===== * [[.:architektur|Pregled arhitekture]] * [[.:extension-entwicklung|Razvoj razširitev]] * [[.:vscode-wrapper|VSCode ovojni API]]