SDD(Sleep-Driven Development)

睡眠の重要性!!睡眠の重要性!!

Xamarin Studio Addinのつくりかた[Xamarin Studio]

Xamarin StudioではVisual Studioのように(?)、機能を拡張できます。しかしXamarin Studio Addinでググってもほとんど(というかほぼ)情報がありません。

せめてチュートリアルくらいはということで雑ですが書きました。 参考にしたのはXamarinのDevelopersページにあった"Extending Xamarin Studio with Add-Ins"です。

developer.xamarin.com

Edit->Insert Dateを押すと現在の日時が挿入される誰得機能です。

(最初はまじめに書こうと思ったのですが、ネタになりました)

環境

導入

導入はとても簡単です。 Xamarin Studioを立ち上げて上のツールバーのXamarin Studioをクリックしてメニューから"Add-ins..."を選択、Add-in ManagerからGalleryのAddin DevelopmentにあるAddin Makerをインストールすれば終了です。

f:id:crocus7724:20160613010312p:plain

とても簡単!!これならアドインの開発もとても簡単でしょう(((

ソリューション作成

最初にソリューション作成です。

いつもどおりファイル->新規->ソリューションを選択し、プロジェクト選択画面でその他のMiscellaneousを選ぶと真ん中いらへんにXamarin Studio Addinがあります。

f:id:crocus7724:20160613011030p:plain

これを選択し、ソリューション名を入れます。今回はサンプル通り'DateInserter'にしました。

Manifest.addin.xml編集

ソリューションが作成できたら、次にPropertiesフォルダの中にあるManifest.addin.xmlを編集します。 これで上のツールバーに表示される文字と押されたときに実行されるクラスを編集します。

<?xml version="1.0" encoding="UTF-8"?>
<ExtensionModel>
    <Extension
        path="/MonoDevelop/Ide/Commands/Edit">
        <Command
            id="DateInserter.DateInserterCommands.InsertDate"
            _label="Insert Date"
            defaultHandler="DateInserter.InsertDateHandler" />
    </Extension>
    <Extension
        path="/MonoDevelop/Ide/MainMenu/Edit">
        <CommandItem
            id="DateInserter.DateInserterCommands.InsertDate" />
    </Extension>
    <Runtime>
    </Runtime>
</ExtensionModel>

_labelが表示される文字列、defaultHandlerが押された時に実行されるクラス名ですかね?(自信ない

DateInserterCommands.cs

お次に新しい列挙型を追加します。
プロジェクトを右クリックし、追加->新しいファイルから空の列挙型を選択し、サンプル通り'DateInserterCommands'という名前にし、以下のように追加します。

namespace DateInserter
{
    public enum DateInserterCommands
    {
        InsertDate,
    }
}

これが上のManifest.addin.xmlのidと紐付いているのでしょう。

InsertDateHandler.cs

いよいよボタンが押されたときの処理です。クラスを追加し、以下のようにします。

using MonoDevelop.Components.Commands;
 using MonoDevelop.Ide;
 using MonoDevelop.Ide.Gui;   
 using Mono.TextEditor;
 using System;  

 namespace DateInserter
 {
     class InsertDateHandler : CommandHandler
     {
         protected override void Run ()
         {
              Document doc = IdeApp.Workbench.ActiveDocument;
              var textEditorData = doc.GetContent<ITextEditorDataProvider> ().GetTextEditorData ();  
              string date = DateTime.Now.ToString ();  
              textEditorData.InsertAtCaret (date); 
         }

         protected override void Update (CommandInfo info)
         {
               Document doc = IdeApp.Workbench.ActiveDocument;  
               info.Enabled = doc != null && doc.GetContent<ITextEditorDataProvider> () != null; 
         }   
     }
 }

Updateメソッドでボタンを押せるかどうかの処理を行い、Runメソッドで実際に押されたときの処理をしています。 これで完成です。それでは実行してみましょう!!

実行

f:id:crocus7724:20160613013642p:plain

_人人人人人人人人_
> ビルドエラー <
 ̄Y^Y^Y^Y^Y^Y^Y ̄

なんとMono.TextEditor名前空間が消失した模様。

サンプルが実行できない。終わった。先生の次回作にご期待ください。

がんばる

さすがにこれで終われないのでなんとかサンプルだけでも実行できるようにします。

幸いなことにXamarin StudioはIDEですから最終手段で片っ端から変数に値を入れてブレークポイントで実行時の中身をみて調べる事ができます。printfデバッグ!!printfデバッグ!!

とりあえずMono.TextEditorの代わりになるものを見つけなければいけません。 ということで適当にMonoDevelop名前空間を探していたら、MonoDevelop.Ide.Editor名前空間なるものを発見。その中にTextEditorというそれっぽいものがありました。

とりあえずこれのインスタンスの取得の仕方がわからなかったのでITextEditorDataProviderの代わりにTextEditorを突っ込んで実行してみました。

using MonoDevelop.Components.Commands;
using MonoDevelop.Ide;
using System;
using MonoDevelop.Ide.Editor;
using MonoDevelop.Ide.Gui;

namespace DateInserter
{
    class InsertDateHandler : CommandHandler
    {
        protected override void Run()
        {
            Document doc = IdeApp.Workbench.ActiveDocument;
            var textEditorData = doc.GetContent<TextEditor>();
            string date = DateTime.Now.ToString();
            textEditorData.InsertAtCaret(date);
        }

        protected override void Update(CommandInfo info)
        {
            Document doc = IdeApp.Workbench.ActiveDocument;
            info.Enabled = doc != null && doc.GetContent<TextEditor>() != null;
        }

    }
}

f:id:crocus7724:20160613015450p:plain

なんか実行できてる・・・

ひとまず適当にソリューションを開き、編集->InsertDateを押してみると・・・

f:id:crocus7724:20160613015648p:plain

無事に日付が挿入されました(((
(ほんとはgifにしたかったけど何故かはてなに弾かれてgifがアップロードできない・・・)

追記

普通にIdeApp.Workbench.ActiveDocument.Editorで'TextEditor'が取得できました。何故気づかなかったのか・・・

まとめ

Xamarin StudioのAdd-insは情報が少なく茨の道どころか道がない状態ですが、きっと誰かがそのうち便利なのを作ってくれるでしょう。

私には無理そうです。

参考

http://www.monodevelop.com/developers/articles/