かずきのBlog@hatena

日本マイクロソフトに勤めています。XAML + C#の組み合わせをメインに、たまにASP.NETやJavaなどの.NET系以外のことも書いています。掲載内容は個人の見解であり、所属する企業を代表するものではありません。

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;
    }
    
}

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