スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

Groovyでソース生成(INotifyPropertyChangedの実装)

WPFでTreeViewでも表示しようかと思い、[C#][WPF]WPFのTreeViewコントロールの基本的な使い方というサイトを参考にしました。
ツリーのデータを定義するクラスが必要とのことで、INotifyPropertyChangedを実装するわけですが、どうにもコピペするのがめんどくさいし、実際は変数に応じて似たようなソースを書かなければならないようなので、いっそのことソースを生成することにしました。
ソースの自動生成ということで、Groovy+Velocityのおでましです。

■Groovyのソース

// 名前空間、クラス名、[型 変数名]+の順に記述
def x="""\
WpfApplication1
Node
string title
int count
bool isUpdated
"""

// GrapeでVelocityを取ってくる
@Grab(group='org.apache.velocity', module='velocity', version='1.6.4')
import org.apache.velocity.app.Velocity
import org.apache.velocity.VelocityContext
import org.apache.velocity.Template

// 変数部分切り出し
def ary = x.split("\n")
def params = []
for (i = 2; i < ary.length; i++) {
def lineAry = ary[i].split(" ").toList()
lineAry << lineAry[1].capitalize()
params << lineAry
}

// テンプレート適応
Velocity.init()
VelocityContext context = new VelocityContext()
context.put("namespace", ary[0])
context.put("classname", ary[1])
context.put("params", params)
Template template = Velocity.getTemplate("INotifyPropertyChanged.vm", "UTF-8")
Writer writer = new OutputStreamWriter(System.out)
template.merge(context, writer)
writer.close()

■テンプレート

#macro(makeProp $type $name $cname)
public ${type} ${cname}
{
get
{
return $name;
}
set
{
if (value != ${name})
{
${name} = value;
NotifyPropertyChanged("${cname}");
}
}
}

#end
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.ComponentModel;
using System.Collections.ObjectModel;

namespace ${namespace}
{
public class ${classname} : INotifyPropertyChanged
{
#foreach($param in $params)
private ${param.get(0)} ${param.get(1)};
#end
private ObservableCollection<${classname}> nodes = null;

public ${classname}(#foreach($param in $params)${param.get(0)} _${param.get(1)}, #end ObservableCollection<${classname}> _nodes)
{
#foreach($param in $params)
${param.get(1)} = _${param.get(1)};
#end
nodes = _nodes;
}

public event PropertyChangedEventHandler PropertyChanged;
private void NotifyPropertyChanged(string info)
{
if (PropertyChanged != null)
{
PropertyChanged(this, new PropertyChangedEventArgs(info));
}
}

#makeProp("ObservableCollection<${classname}>", "nodes", "Nodes")
#foreach($param in $params)
#makeProp($param.get(0), $param.get(1), $param.get(2))
#end
}
}

■生成されたソース

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.ComponentModel;
using System.Collections.ObjectModel;

namespace WpfApplication1
{
public class Node : INotifyPropertyChanged
{
private string title;
private int count;
private bool isUpdated;
private ObservableCollection nodes = null;

public Node(string _title, int _count, bool _isUpdated, ObservableCollection _nodes)
{
title = _title;
count = _count;
isUpdated = _isUpdated;
nodes = _nodes;
}

public event PropertyChangedEventHandler PropertyChanged;
private void NotifyPropertyChanged(string info)
{
if (PropertyChanged != null)
{
PropertyChanged(this, new PropertyChangedEventArgs(info));
}
}

public ObservableCollection Nodes
{
get
{
return nodes;
}
set
{
if (value != nodes)
{
nodes = value;
NotifyPropertyChanged("Nodes");
}
}
}

public string Title
{
get
{
return title;
}
set
{
if (value != title)
{
title = value;
NotifyPropertyChanged("Title");
}
}
}

public int Count
{
get
{
return count;
}
set
{
if (value != count)
{
count = value;
NotifyPropertyChanged("Count");
}
}
}

public bool IsUpdated
{
get
{
return isUpdated;
}
set
{
if (value != isUpdated)
{
isUpdated = value;
NotifyPropertyChanged("IsUpdated");
}
}
}

}
}

まずGroovyのソースですが、Grapeを仕組みを使って依存しているVelocityのライブラリを自動でダウンロードしています。最近、Grapeを使い始めたのですが、こいつは激しく便利ですね! いままでやっていた、ダウンロードしてファイルを展開して、適当な位置に配置して、クラスパス指定して・・・あたりの作業を一切やらなくなったので、かなりの時間短縮です。
あとは、普通にテンプレート適応しています。

テンプレートでは、マクロを使用しています。getter, setterみたいな決まりきった関数を作るのに便利です。

WPFでGroovy+Velocityとは奇妙な組み合わせですが、私の中ではソース生成では鉄板の組み合わせです。
スポンサーサイト

COMMENTS

No title

groovyであれば
GStringTemplateEngine
あたり使った方が楽な気がするのですが・・・。

No title

お、それ知りませんでした。こんど試してみます。情報サンクスです

COMMENT FORM

TRACKBACK


この記事にトラックバックする(FC2ブログユーザー)

上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。