かずきのBlog@hatena

すきな言語は C# + XAML の組み合わせ。Azure Functions も好き。最近は Go 言語勉強中。日本マイクロソフトで働いていますが、ここに書いていることは個人的なメモなので会社の公式見解ではありません。

FileSystem APIその3 .shadow

FileSystemAPIその2 - かずきのBlog@Hatenaの続きです。
.shadowの拡張子のあるファイルのお話し。
本によるとシンボリックファイルと同じだよ!ってことみたい。
attrでoriginalFile属性を使ってオリジナルファイルが何かを示してあげるだけ。

サンプル!!
前回作ったPersonクラスの太郎さんを返すものに対して.shadowファイルを作ってみる。
layer.xmlはこんな感じ。

    <folder name="okazuki">
        <!-- 前回からあったやつ -->
        <file name="okazuki-modules-menus-Person.instance"/>
        <file name="myPerson.instance">
            <attr name="instanceClass" stringvalue="okazuki.modules.menus.Person"/>
            <attr name="instanceCreate" methodvalue="okazuki.modules.menus.Person.createFromFileObject"/>
            <attr name="name" stringvalue="太郎"/>
        </file>
        <!-- 今回付けたしたやつ -->
        <file name="shadowPerson.shadow">
            <attr name="originalFile" stringvalue="okazuki/myPerson.instance" />
        </file>
    </folder>

んで、ShaodwSampleActionっていうアクションを付け足してメニューに出るようにした。
中のプログラムは、前回とほとんど同じ。
違うところといえば、myPerson.instanceではなくてshadowPerson.shadowを使ってるくらい。
あぁ。後DialogAPIを使ってみた!
とりあえず、使い方は〜〜Descriptorを作ってDialogDisplayer.getDefault().〜〜〜(descriptor)みたいな感じで使える。

package okazuki.modules.menus;

import org.openide.DialogDisplayer;
import org.openide.ErrorManager;
import org.openide.NotifyDescriptor;
import org.openide.cookies.InstanceCookie;
import org.openide.filesystems.FileObject;
import org.openide.filesystems.Repository;
import org.openide.loaders.DataObject;
import org.openide.util.HelpCtx;
import org.openide.util.NbBundle;
import org.openide.util.actions.CallableSystemAction;

public final class ShadowSampleAction extends CallableSystemAction {
    
    public void performAction() {
        try {
            FileObject root = Repository.getDefault().getDefaultFileSystem().getRoot();
            FileObject fo = root.getFileObject("okazuki/shadowPerson.shadow");
            DataObject dataObject = DataObject.find(fo);
            InstanceCookie ic = dataObject.getCookie(InstanceCookie.class);
            Person person = (Person) ic.instanceCreate();
            NotifyDescriptor desc = new NotifyDescriptor.Message(
                    "名前は" + person.getName() + "ですよ", NotifyDescriptor.INFORMATION_MESSAGE);
            DialogDisplayer.getDefault().notify(desc);
        } catch (Exception ex) {
            ErrorManager.getDefault().notify(ex);
        }
    }
    
    public String getName() {
        return NbBundle.getMessage(ShadowSampleAction.class, "CTL_ShadowSampleAction");
    }
    
    protected void initialize() {
        super.initialize();
        // see org.openide.util.actions.SystemAction.iconResource() javadoc for more details
        putValue("noIconInMenu", Boolean.TRUE);
    }
    
    public HelpCtx getHelpCtx() {
        return HelpCtx.DEFAULT_HELP;
    }
    
    protected boolean asynchronous() {
        return false;
    }
    
}

実行すると、「私は太郎ですよ」と表示されたダイアログが出ます。