2010年11月23日火曜日

SWTChartを簡単に調査

SWTChartは最近EclipseMarketに新しく登録されたため、調査をしました。
現在のバージョンは0.6.0 最終更新が2009-07-31なので、もう数年あたり更新されていない。
これって更新されるのかな?

下記URLからダウンロードし、展開しdropinsに配置しeclipse再起動
http://sourceforge.net/projects/swt-chart/files/SWTChart/0.6.0/org.swtchart_0.6.0.zip/download


とりあえずサンプルを動作させてみる。
dropins\org.swtchart_0.6.0\EXAMPLES\org.swtchart.examplesをインポートして色々ソースコードを簡単に
読んでみました。ってか非常にコード少ないので簡単に読めます。

簡単に機能と実装方法をまとめました。

・AreaChart
        // create a chart
        Chart chart = new Chart(shell, SWT.NONE);

        // set titles
        chart.getTitle().setText("Area Chart Example");

        // ILineSeriesを利用
        ILineSeries lineSeries1 = (ILineSeries) chart.getSeriesSet()
                .createSeries(SeriesType.LINE, "line series 1");
        lineSeries1.setYSeries(ySeries1);
        lineSeries1.setLineColor(Display.getDefault().getSystemColor(
                SWT.COLOR_RED));
        //enableAreaをtrueでAreaChart表示
        lineSeries1.enableArea(true);
・BarChart
  Chart chart = new Chart(shell, SWT.NONE);
  // set titles
  chart.getTitle().setText("Bar Chart Example");
  chart.getAxisSet().getXAxis(0).getTitle().setText("Data Points");
  chart.getAxisSet().getYAxis(0).getTitle().setText("Amplitude");

  // BarChart(IBarSeries)を表示
  IBarSeries barSeries = (IBarSeries) chart.getSeriesSet().createSeries(
    SeriesType.BAR, "bar series");
  barSeries.setYSeries(ySeries);
・BarCharのカテゴリ
        // create a chart
        Chart chart = new Chart(shell, SWT.NONE);

        // set titles
        chart.getTitle().setText("Category Axis Example");
        chart.getAxisSet().getXAxis(0).getTitle().setText("Month");
        chart.getAxisSet().getYAxis(0).getTitle().setText("Amplitude");

        // set category
        chart.getAxisSet().getXAxis(0).enableCategory(true);
        chart.getAxisSet().getXAxis(0).setCategorySeries(
                new String[] { "Jan", "Feb", "Mar", "Apr", "May" });

        // IBarSeriesを2つ作成すればカテゴリになる。
        IBarSeries barSeries1 = (IBarSeries) chart.getSeriesSet().createSeries(
                SeriesType.BAR, "bar series 1");
        barSeries1.setYSeries(ySeries1);
        barSeries1.setBarColor(Display.getDefault().getSystemColor(
                SWT.COLOR_GREEN));

        IBarSeries barSeries2 = (IBarSeries) chart.getSeriesSet().createSeries(
                SeriesType.BAR, "bar series 2");
        barSeries2.setYSeries(ySeries2);
・ErrorBar
  // create a chart
  Chart chart = new Chart(shell, SWT.NONE);
  
  // create series
  ISeries series = chart.getSeriesSet()
    .createSeries(SeriesType.LINE, "line series");
  series.setYSeries(ySeries);
  
  // ISeriesに対してErrorBarをVisibleにすればよい。
  IErrorBar errorBar = series.getYErrorBar();
  errorBar.setVisible(true);
  errorBar.setError(0.1);

・プロットの点を表示しないようにする。
 lineSeries.setSymbolType(PlotSymbolType.NONE);


・ログスケール設定
  // set log scale
  chart.getAxisSet().getYAxis(0).enableLogScale(true);

・複数軸
        // create a chart
        Chart chart = new Chart(shell, SWT.NONE);

        // set titles
        chart.getTitle().setText("Multiple Axes Example");
        chart.getAxisSet().getXAxis(0).getTitle().setText("Data Points");
        chart.getAxisSet().getYAxis(0).getTitle().setText("Amplitude 1");

        // create second Y axis
        int axisId = chart.getAxisSet().createYAxis();

        // set the properties of second Y axis
        IAxis yAxis2 = chart.getAxisSet().getYAxis(axisId);
        yAxis2.setPosition(Position.Secondary);
        final Color RED = Display.getDefault().getSystemColor(SWT.COLOR_RED);
        yAxis2.getTick().setForeground(RED);
        yAxis2.getTitle().setForeground(RED);
        yAxis2.getTitle().setText("Amplitude 2");

        // create line series
        ILineSeries lineSeries1 = (ILineSeries) chart.getSeriesSet()
                .createSeries(SeriesType.LINE, "line series 1");
        lineSeries1.setYSeries(ySeries1);
        ILineSeries lineSeries2 = (ILineSeries) chart.getSeriesSet()
                .createSeries(SeriesType.LINE, "line series 2");
        lineSeries2.setYSeries(ySeries2);
        lineSeries2.setLineColor(RED);

        // assign series to second Y axis
        lineSeries2.setYAxisId(axisId);

・軸の方向変換
  // set the chart orientation
  chart.setOrientation(SWT.VERTICAL);

・散布図
  // create a chart
  Chart chart = new Chart(shell, SWT.NONE);

  // set titles
  chart.getTitle().setText("Scatter Chart Example");
  chart.getAxisSet().getXAxis(0).getTitle().setText("Score A");
  chart.getAxisSet().getYAxis(0).getTitle().setText("Score B");

  // create scatter series
  ILineSeries scatterSeries = (ILineSeries) chart.getSeriesSet()
    .createSeries(SeriesType.LINE, "scatter series");
  scatterSeries.setLineStyle(LineStyle.NONE);
  scatterSeries.setXSeries(xSeries);
  scatterSeries.setYSeries(ySeries);
・プロット数値の表示
  // set label visible
  lineSeries.getLabel().setVisible(true);
・スタック表示
        // create a chart
        Chart chart = new Chart(shell, SWT.NONE);

        // set titles
        chart.getTitle().setText("Stack Series Example");
        chart.getAxisSet().getXAxis(0).getTitle().setText("Month");
        chart.getAxisSet().getYAxis(0).getTitle().setText("Amplitude");

        // set category
        chart.getAxisSet().getXAxis(0).enableCategory(true);
        chart.getAxisSet().getXAxis(0).setCategorySeries(
                new String[] { "Jan", "Feb", "Mar", "Apr", "May" });

        // create bar series
        IBarSeries barSeries1 = (IBarSeries) chart.getSeriesSet().createSeries(
                SeriesType.BAR, "bar series 1");
        barSeries1.setYSeries(ySeries1);
        barSeries1.setBarColor(Display.getDefault().getSystemColor(
                SWT.COLOR_GREEN));

        IBarSeries barSeries2 = (IBarSeries) chart.getSeriesSet().createSeries(
                SeriesType.BAR, "bar series 2");
        barSeries2.setYSeries(ySeries2);

        // enable stack series
        barSeries1.enableStack(true);
        barSeries2.enableStack(true);
・ステップチャート
        // create a chart
        Chart chart = new Chart(shell, SWT.NONE);
        
        // set titles
        chart.getTitle().setText("Step Chart Example");
        chart.getAxisSet().getXAxis(0).getTitle().setText("Data Points");
        chart.getAxisSet().getYAxis(0).getTitle().setText("Amplitude");

        // create line series
        ILineSeries lineSeries = (ILineSeries) chart.getSeriesSet()
                .createSeries(SeriesType.LINE, "line series");
        lineSeries.setYSeries(ySeries);
        lineSeries.setSymbolType(PlotSymbolType.NONE);
        lineSeries.enableStep(true);

2010年10月23日土曜日

Eclipse Projectについて調べてみる【EEF編】

Eclipse Projectを色々調べてみて、どんなことをEclipseがやっているのかを調べてみようかと思いました。
今回はEEF(Extended Editing Framework)を調べてみました。



Extended Editing Frameworkは以下の点を目的とする。
より魅力的な編集要素を用いたり、編集したりするための新しいサービスの提供により、EMFモデル生成フェーズを改善するもう一つの方法を与える。
これらサービスと要素を得るための方法は、EMF.Editと似たような生成的なアプローチをベースとする。
フレームワークは、EMF要素のプロパティに対する高度な編集コンポーネントを提供する。
これらコンポーネントを使って標準的なメタモデルをベースとするデフォルト生成も提供する。
その総称的なジェネレータがEMFモデルオブジェクトを編集する高度なグラフィカルコンポーネントを持つ標準的な
アーキテクチャを生成する。
これらコンポーネントはEclipse Dynamic Helpのインスタンスに関する限りEclipsePlatformの各側面に対して効果を齎す。

このプロジェクトのもうひとつのゴールはEMFユーザに対する横断的な編集の可能性を与える。
こららの可能性の例は与えられたオブジェクトの編集のロック、アンロックすることである。
プロバイダの拡張メカニズムを使って、ユーザは
プロバイダの拡張メカニズムでユーザは定義することができる。
与えられたコンテキストの中でEObjectを編集できるかできないかEObjectが修正可能、不可能かどうかの定義ができる。
このコンテキストはメタモデルの属性、リソース状態を保持することができる。


まぁ、簡単に言うと、EMFのモデル編集のUIを今までのEMF.Editより拡張されたものを作成できますということ
だそうです。確かに、EMFを利用していたときにモデル編集のUIがいまいちだったのは確か。
その不満がこれで解消できればよいのかなぁと思います。

参考URL
http://wiki.eclipse.org/EEF_tutorial_:_First_generation
http://milesparker.blogspot.com/2010/02/pimping-eef-master-detail.html

時間があれば、サンプル作って色々解説できればよいのだが。。。。

2010年9月29日水曜日

SWTBotでwidget検索のマッチングの利用

SWTBotをテストで利用しようと思い、簡単な利用方法を調べてみました。

widgetの検索方法

下記staticのimportを行う。
import static org.hamcrest.Matchers.*;
import static org.eclipse.swtbot.swt.finder.matcher.WidgetMatcherFactory.*;

メソッド意味
withText引数のテキストを持つwidgetを検索
withMnemonic
withLabel引数のラベルを持つwidgetを検索
withRegex正規表現を使ってwidgetを検索
inGroup引数で指定したSWTグループの中のwidgetを検索
widgetOfType指定した型のwidgetを検索
withStyle指定したStyle bitを持つwidgetを検索
withId指定したIDを持つwidgetを検索

//テストのCTabItemを検索
Matcher matcher = allOf(widgetOfType(CTabItem.class),withText("テスト"))))
//検索ボタンを検索する場合
matcher = allOf(withRegex("検索"), widgetOfType(Button.class),withStyle(SWT.PUSH, "SWT.PUSH"));
//fooで始まる文字、もしくはbarグループに属するボタン型のwidget
Matcher matcher = allOf(widgetOfType(Button.class), anyOf(withRegex("^foo.*"), inGroup("bar")));



自分でMatcherを作る場合

org.hamcrest.BaseMatcherを継承して、WithId matcherを作成する。
    public class WithId extends BaseMatcher {
        private final String    key;
        private final String    value;

        public WithId(String key, String value) {
            this.key = key;
            this.value = value;
        }

        public boolean matches(Object obj) {
            if (obj instanceof Widget)
                return value.equals(((Widget) obj).getData(key));
            return false;
        }

        public void describeTo(Description description) {
            description.appendText("with key: ").appendText(key).appendText(" having value: ").appendText(value);
        }
    }




参考サイト

2010年9月7日火曜日

Eclipse DemoCampに行ってきました

Eclipse DemoCampに行ってきました。
場所は大森の日立大森第二別館というところでした。

色々興味があるトピックがあったので、ちょいと楽しみでした。
会場についたらこんぴろ氏発見!!!
とりあえず、オブラブ時には会えなかったので、挨拶をする。


■ここが変わった!Eclipse 3.6 Heliosの新機能: NTTデータ先端技術 竹添直樹
・Heliosの新機能の説明
・JavaEE(Servlet,JPAなど)の新しいバージョンのサポート
・JAXB対応は興味あり
・XMLなどでCtrl+Oのアウトライン表示
・Ctrl+3がツールバーからも利用可能
・Linux対応が非常に興味あり。LinuxTools,autoToolsがいい感じにLinux環境に適用できるのではないかな?と思いました。

■e4ことはじめ: 日立製作所 鈴川哲大
・e4によるRCPアプリケーションの簡単な作成方法デモ
・e4ではUIをXMLで記述が行えるようになり、XWTを使うとGUIでXMLを宣言することが可能
 ・androidのUI設定ツールに近いもんですね。
・UIとデータモデルのBindingについてはさくっと行き過ぎたため、ちょっと把握できなかった。
 ・今後実際に動作確認してみたいと思います。
・データ更新時の更新通知などがどこまで対応しているのかも色々確認してみたいと思います。

■Eclipse日本語化活動と翻訳支援ツールBenten: NTTデータビジネスブレインズ 伊賀敏樹、NECソフト株式会社 森素樹
・eclipseの日本語化について
 ・pleiades,日本語化ぱっくについて
・翻訳支援ツールBentenについての説明
 ・翻訳支援ツールはEclipseの日本語化が行えるツールだと思っていました。
 ・発表を聞くとeclipse日本語化ツールではなさそう。
 ・HTMLファイル(HELPなど)などを翻訳メモリを使って翻訳できるツールっぽい。
  ・翻訳メモリを使って分散翻訳。
・Bentenを使ってEclipseの日本語化を行えると非常に面白いなぁと思いました。

■Eclipseを使った組込み向けリモートデバッグ環境: 日本電気株式会社 中村祐一
・説明が非常に早かった印象
・CDT+TPTP+GDBを使ってリモートデバッグ&テスト環境構築方法の説明
 ・デバッグ環境でgrof,gconv,valgrindなどの適用ができ、TPTPを使って可視化
 ・TCPを使ってリモード環境をあたかもローカルデバッグしているようにエミュレート?
・ターゲットプラットフォームはgdbが必要。T-Kernel(POSIX対応)という環境でないとだめ?
 ・今やっている範囲ではそのまま適用できなさそう。
・リモートデバッグしても、その結果をTPTPで表示できるのは利用できそう。

■テキスト型 Domain Specific Language (DSL) 開発フレームワーク Xtext の紹介(仮): 北陸先端科学技術大学院大学 細合晋太郎、ビューファイブ LLC 田中明
・何気に一番の目的の発表
・XTextの説明とデモ
 ・XTextの説明とデモはほとんど知っていたため特になくw
・XTextの日本グループがあることを知らなかったため、速攻はいる。
・適用されているのはARTextとOCLエディタくらい。


■Eclipseで始めるGroovy/Grails: LITERAL-ICE 林政利
・Groovyについての説明
・GroovyはJavaより短くコーディングができることを説明
 ・Grapeの説明もしてました。
・Groovy使いからすると発表内容はもうちょっとGroovyらしさを強調したほうがよい。
 ・XMLの読み込みはBuilderパターンを使って簡単にパースしているとか、メタプログラミングを使っているとか、antBuilderも使えるとか
 ・すげーと言わせることがたくさんあった気がします。

■10分でできる!?プラグイン開発ライブコーディング: こんぴろ氏
・こんぴろ氏の速攻プラグイン開発デモ
・プラグイン開発には真似るという話
 ・QuickJUnitの既存コードを真似て機能拡張するデモ
・Eclipse Spyの使い方はF2のほうは知らなかった。わかってよかった。



全体的に知っている内容を再認識という感じでしたが、とても興味深い内容でした。
Groovyの発表だったらやりたかったかもw
XTextについてはやはり日本にはあまり広まっていない感たっぷりというかDSL自体が
あまり広まっていないよなぁ。という話をちょっとしてました。

Eclipse DemoCamp第二回はあるんでしょうかね?あれば行きたいなぁと。
ここら辺のトピックからもっと詳細な内容をつめていくと面白いかつ濃厚な
会ができるんではないかなと思った。

2010年8月16日月曜日

OpenSolarisの開発中止になるかもしれない

OracleがSunを買収してから、どうなんでしょうかね?という行動が結構多くて気になります。

・AndroidのJavaを著作権侵害で訴える。
・JDK6 update21の内部実装で"Sun Microsystems"から"Oracle"に変更により、Eclipseの起動しなくなる。
http://www.infoq.com/news/2010/07/eclipse-java-6u21
※これはEclipseの実装もいかがなものかとは思いますが。


そこで本日衝撃的なのが、「OpenSolarisがキャンセルになり、Solaris 11 Expressに移行していく」という話です。
以下リンクがメール原文
http://mail.opensolaris.org/pipermail/opensolaris-discuss/2010-August/059310.html

じわじわとCD配布中止などコスト削減されていましたが、とうとう来てしまいました。
まぁ、Oracleの戦略としては、商用を力入れたいのはわかるとするが、なんかオープンソースの領分
が犯されてしまっている気がするのは気のせいかなぁ。。。。

そういえば、Eclipse e4の起動画面にもOracleという文字が入っていたの気になったなぁ。
Sun MicroSystemという文字がそのうち消え去っていくのかなぁ。。。

2010年8月12日木曜日

eclipse SDK 4.0の利用開始ということで

http://www.eclipse.org/org/press-release/20100728_eclipse4release.php
にそんなことが書いてあったので、ちょこっと和訳してみました。

やはりポイントはUIのブラッシュアップとAJAXっぽく動作させる方向性なのかなと。




-------------------------------------------------------------
コミュニティ公報
2010/07/28にEclipse Foundationは時期Eclipse PlatformのEclipse SDK 4.0の利用開始をアナウンスした。
EclipseはRCPアプリケーション開発者とプラグイン提供の膨大で、成功したエコシステムである。
Eclipse4.0の新しいフィーチャを紹介する。
エコシステムのメンバーがEclipseプラグイン、RCPアプリケーションを組み込んだり、作成したりするのを簡単にする新しいフィーチャを紹介する。

Eclipse4.0で導入される新しいフィーチャの幾つか

・アプリケーションユーザインタフェースでのウィジェットを指定に対して、モデルベースユーザインタフェースフレームワーク。
これは開発者にモダンなUIデザインをよりフレキシブルにする。RCPアプリケーションなどに導入される'IDE-ness'を取り除く。

・新しくCSSベースの宣言メカニズムをアプリケーションスタイルに適用し、CSSスタイルシートを使ったアプリケーションのスキンを変更できるようになる。

・サービス志向のプログラムモデルがEclipse platformによって提供されるサービスを使って簡単にできるようになる。

eclipse 4.0はEclipse Technologyのアダプタに対してである。
プラグインやRCPの開発者が4.0platformへの移行を強く勧める。
Eclipse3.xのフルバイナリ互換APIは可能な限り簡単に移行が行える。

Eclipseツール(JDTなど)のユーザは現時点ではEclipse4.0への移行はの利点は期待できない。
ユーザはEclipse4.0で新しいUIの改良から利点がある。
しかし、ツールやプラグインがeclipse4.0 platformに移行したプロジェクトによって提供されるプラグインやツール
を待つ必要がある。



eclipse e4インキュベーションプロジェクトは幾つかの新しい技術をリリースしている。

・XWT宣言のUIデザインツール

・モデルベースユーザインタフェースの作成のヘルプツール

・セマンティックファイルシステム、プラットフォームリソースモデルに接続するメカニズム。
これによりRESTスタイルAPIを使って無防備なリソースを削除することができる。

・JavaScriptとリッチクライアントのビューベースのOpenSocialの統合のサポート



Eclipse 4.0についての情報はeclipse.org/eclipse4にある。
Eclipse e4のインキュベーションプロジェクトはp2リポジトリからダウンロードできる。
http://download.eclipse.org/e4/updates/2010

2010年7月31日土曜日

やっぱり組み込みにもクラウドだよね。

日立ソフト、組み込み開発向けSaaS型サービスを提供

やはり組み込み業界にもクラウドなんだよねー。
クラウドにすれば、環境も同じにできて、環境依存などもなくなっていくだろうし。
ライセンスの問題も安く済むだろうし。

会社で作っている製品もクラウド化したいとは熱望しているだけど、
だれもふーんって感じでしか見ていないため、もったいない。
組み込みでクラウドをやれば、結構先進的な感じで話題になるんだけどなぁ。
でも、問題点は結構あると思う。

・組み込み業界はネットワークにつながらない環境だったり、制限が多かったりする。
・クラウドのよさなどをわかってくれないお堅い人が多い。
・変化を好まない。
・組み込み業界の会社にクラウド環境作成のノウハウが少ない

上記項目さえ解決すればどんどん開発しやすい環境になっていくのかなぁ。

2010年7月24日土曜日

scalaについてちょっと学んでみる

先日オブジェクト倶楽部というイベントに行ってきまして、イベントの懇親会の最後に
いろんな本のプレゼントというのがあり、ついついscala本を手に取ってしまいました。

事前の知識としてはscalaは
・オブジェクト指向&VMで動作
・Javaとの互換あり
・関数型言語

しかありませんでした。でも会社の後輩が興味もって本を買っていた
のでちょこっと興味がそそられてしまって持って帰りました。


面白そうと思ったところ

・XMLを直接プログラム内部に記述が可能
・クロージャ
・インタプリタかつコンパイラ
・並列処理が強そう(Actor)。まぁ、Scalaの語源となったスケーラビリティの思想だもんなぁ
http://ja.wikipedia.org/wiki/%E3%82%A2%E3%82%AF%E3%82%BF%E3%83%BC%E3%83%A2%E3%83%87%E3%83%AB

気になった点
・Javaと文法が結構異なる。
  groovyみたいにほとんど同じでも記述できますだと移行が簡単だが、これはJavaからの移行は考えられていなさそう。


でも非常に楽しそうな言語ではあるが、自分の業界に完全にアンマッチだろうなぁ。。。

2010年7月4日日曜日

RCPの自動エクスポート化

RCPを自動でエクスポートできるとよいねーってことなので、antでやってみようと思いました。

ProductConfigurationのExportセクションのEclipse Product Export Wizardの作業の自動化です。

ほとんどやり方は英語サイトに記述されているのですが、日本語化されていないのでまとめておきました。

参考サイト


基本的にサイトから取得してきた、情報を編集する方法での手順をまとめます。
1.buid.xmlとbuild.propertiesを作成(取得)する。配置はプロジェクト直下がよいです。
2.deltaPackを取得する。
3.buid.propertiesのproduct,archivePrefix,buildIdを編集する。
4.Target Platformの変更
Window->Preference->Plug-in Development->Target Platform
Add->Defaultで取得してきたdeltaPackを追加するしたTargetPlatformを作成する
5.上記設定したTargetPlatformでbuild.xmlを実行
もちろんeclipseのantの環境を使うため、実行構成でJREをワークスペースのJREを使うのラジオボタンを選択。

上記手順だけでプロジェクト直下にzipファイルが作成されているはずです。

productBuild.xmlを実行しているだけですが、中身では色々やっているので調査してみようと思います。

2010年5月2日日曜日

ChromeOSをインストールしてみる

SoftwareDesing5月号にChomreOSについての記事があったため、VirtualBoxにインストールを
してみて動作確認。

まぁ、いまさらかよ!っていうのはあるけど、使う使わないにせよちょっと触ってみるかな?
と思いました。

インストール方法の覚書
1.下記サイトから仮想アプライアンスファイルのTorrentをダウンロード
http://geeklad.com/download-the-google-chrome-os-virtual-machine

自分は面倒だったため、FirefoxのFireTorrentを使って直接ダウンロードしました。
そうするとダウンロードした下記ファイルがダウンロードされます。
chromiumos.ovf
chromiumos.vmdk

2.VirtualBoxの仮想アプライアンスファイルのインポートをする。
chromiumos.ovfをインポートすると、かってに仮想マシンを作成してくれます。

これでVirtualBoxにChromeOSのインストールが完了。

色々試してみた結果
・gmailで添付ファイルをダウンロード
 ダウンロードファイルは開けない。
 chrome://downloads/という場所に置かれるらしい。
 そこの部分にどのようにアクセスしているのか?
・動作が非常に不安定
 カーソルは動作するが、クリックが聞かなくなる。VirtualBoxが原因?
・コンソールモードが開かない?
 なぜか?もうちょっと調査の必要があるかなと。

その他の面白そうな機能があれば試してみようと思います。

2010年4月30日金曜日

SoftwareDesignの記事について

オブジェクト指向についての記事が書いてありました。

情報隠蔽とカプセル化の違いについてが述べられていました。
オブジェクト指向を説明している本などの資料で情報隠蔽=カプセル化という
説明が多いような気がする。
オブジェクト指向では情報隠蔽(information hiding)は抽象化をすることにより
実装を隠すという意味である説明が少ないような気がします。
このメソッドを呼び出せばオッケーです!っていうもの。

これを説明している本は少ないような気がする。。。。。

結論からすると
カプセル化:外部からのアクセス制限
情報隠蔽:抽象化により具体処理などの処理ロジック(実装)の情報隠蔽
となるようです。あっているかな?


情報隠蔽に関する論文が下記リンクだそうです。
http://campus.hesge.ch/Daehne/2008-2009/Module625/Algo/Documents/01-Article%20original%20de%20Parnas.pdf

2010年4月21日水曜日

Groovyでデコンパイル

groovyをデコンパイルしてgroovyの実装を確認してみる。
package ph.jpn.calm.sample.groovy;

class Book {
private String title

}



非常に簡単なクラスをデコンパイルすると以下のようなコードになる。
コンストラクタにメタクラスが存在する。このメタクラスを使っている
ことにより、スクリプトような動作を実現しているという。
時間があればもっと調べてみます。


package ph.jpn.calm.sample.groovy;

import groovy.lang.GroovyObject;
import groovy.lang.MetaClass;
import org.codehaus.groovy.runtime.ScriptBytecodeAdapter;
import org.codehaus.groovy.runtime.callsite.CallSite;

public class Book
implements GroovyObject
{
private String title;

public Book()
{
Book this;
CallSite[] arrayOfCallSite = $getCallSiteArray();
MetaClass tmp12_9 = $getStaticMetaClass();
this.metaClass = ((MetaClass)ScriptBytecodeAdapter.castToType(tmp12_9, $get$$class$groovy$lang$MetaClass()));
tmp12_9;
while (true)
return;
}

static
{
tmp10_7 = new Long(0L);
__timeStamp__239_neverHappen1271781713015 = (Long)tmp10_7;
tmp10_7;
tmp28_25 = new Long(1271781713015L);
__timeStamp = (Long)tmp28_25;
tmp28_25;
return;
while (true)
return;
}
}

2010年3月31日水曜日

EMF Transactionについてまとめてみました

EMFTransaction
EMF Transactionについて

EMFのデータモデルをトランザクションを用いて、複数スレッドからのアクセスコントロールやデータの整合性(atomic)を守る仕組み。 EditingDomainを用いてやり取りを行います。

簡単な説明はざっくり飛ばします。参考サイトを読んでください。


予備知識:EditingDomain

editingDomainは相関のあるEMFモデルを含んでいるのとコマンドを管理するものです。モデルはリソースセットの形式で保持されていています。
コマンドとモデルの編集はドメインを経由して、コマンドスタックを使って行います。
EditingDomainの補足機能として、基本的なコマンドのオーバーライドが使えます(OverrideableCommand. を参照)
ドメインはgetParent,getChildrenメソッドの結果でモデルへ階層的に役割を課す。
これはネストしたオブジェクトの削除などに使うRemoveCommandなどの実装に便利である。
また、ネストしたコピーなどに使うCopyCommandも便利である。

クラス図的にはこんな感じ

Transactional Commands API




Transactional Commands API


EditingDomain取得方法

EMFTransactionはEditingDomainを利用して、データのやり取りを行うため、EditingDomainを取得する必要があります。取得方法としてはTransactionUtilのユーティリティクラスのgetEditingDomainメソッドを利用します。
引数はEObject,Resource,ResourceSetのいずれかを入れてやれば取得が行えます。

データアクセス方法
データ取得

データの取得に関してはデータの変更が行われないため、取得方法はどのようにしても構いません。リソースからモデルを取得して任意のデータを取得することが可能です。

データ更新

コマンドを用いてデータ更新は行います。リソースから直接取得してデータ更新を行うとExceptionが投げられます。


public void setModuleDet(String moduleName, boolean detInfo) {
EObject owner = null;
EAttribute feature = null;


try{
Command cmd = editingDomain.createCommand(
SetCommand.class,
new CommandParameter(
owner,
feature,
detInfo
));

editingDomain.getCommandStack().execute(cmd);
} catch (Exception e) {
logger.warn(e.getMessage());
}
}



ロールバック

トランザクション環境で、データ整合性が失われた場合ロールバックするために、R/Wのトランザクションが発生する。しかし、基本的なコマンドスタックAPIはコマンドを失敗することはないので、
ロールバックしたときのフィードバックはない。
もし、トランザクションが始まっていなく、トランザクションがロールバックや、割り込み例外が発生したとき、トランザクションコマンドスタックはロールバック例外を投げることができる。


Library richmond = getLibrary("Richmond Branch"); // this would use a read-only transaction
TransactionalEditingDomain domain = getEditingDomain();

TransactionalCommandStack tstack = (TransactionalCommandStack) domain.getCommandStack();

Command cmd = domain.createCommand(
SetCommand.class,
new CommandParameter(richmond, EXTLibraryPackage.Literals.LIBRARY__ADDRESS, "5600 Perth St."));

try {
tstack.execute(cmd, Collections.EMPTY_MAP);
} catch (InterruptedException e) {
MessageDialog.openError(shell, "Command Failed",
"Interrupted while waiting for a read/write transaction.");
} catch (RollbackException e) {
ErrorDialog.openError(shell, "Command Failed", "Transaction rolled back",
e.getStatus());
}



コマンドオプション

コマンド実行に対して、色々オプションを付けて実行が行える。

Transaction Options




* OPTION_NO_NOTIFICATIONS:  リスナに変更通知を送らない。
* OPTION_NO_TRIGGERS: トリガーを使わない。
* OPTION_NO_VALIDATION: 変更に整合性チェックを行わない。
* OPTION_NO_UNDO: UNDO/REDOやロールバックのための変更記録を行わない。
* OPTION_UNPROTECTED: OPTION_NO_UNDO, OPTION_NO_VALIDATION, and OPTION_NO_TRIGGERSの複合ケース



TransactionalCommandStack stack;
Library library;

// don't tell the UI that we are changing the library name
stack.execute(
SetCommand.create(domain, library,
EXTLibraryPackage.Literals.LIBRARY__NAME, "Secret Name"),
Collections.singletonMap(
Transaction.OPTION_NO_NOTIFICATIONS, Boolean.TRUE));



トリガー
トリガーの実装も可能である。
Trigger API






// trigger ensuring that all libraries have names
class MyListener extends ResourceSetListenerImpl {
MyListener() { // only interested in changes to Library objects
super(NotificationFilter.createNotifierTypeFilter(
EXTLibraryPackage.Literals.LIBRARY));
}

public Command transactionAboutToCommit(ResourceSetChangeEvent event)
throws RollbackException {

List commands = new ArrayList();
Iterator iter = event.getNotifications().iterator();

while (iter.hasNext()) {
Notification next = (Notification) iter.next();
Library library = (Library) next.getNotifier();
if (library.getName() == null)
commands.add(SetCommand.create(
event.getEditingDomain(), library,
EXTLibraryPackage.Literals.LIBRARY__NAME, "A library"));
}

return commands.isEmpty()? null : new CompoundCommand(commands);
}
}



class MyTriggerListener extends TriggerListener {
MyListener() { // only interested in changes to Library objects
super(NotificationFilter.createNotifierTypeFilter(
EXTLibraryPackage.Literals.LIBRARY));
}

protected Command trigger(TransactionalEditingDomain domain,
Notification notification) throws RollbackException {

Library library = (Library) next.getNotifier();
if (library.getName() == null) {
return SetCommand.create(domain, library,
EXTLibraryPackage.Literals.LIBRARY__NAME, "A library");
}

return null;
}

}



参考サイト

2010年3月29日月曜日

WindowTester Pro 5.0リリース

WindowTester Pro 5.0のリリースだそうなので色々調べてみました。

InfoQにWindowTester Pro 5.0がリリースというニュースを見たので、
ちょっと気になったため調べてみました。
GUI作成ツールを調査しているときにRCP DeveloperやWindowBuilderが
引っかかりWindowTesterも知っていました。
WindowTesterのデモを見るとわかるとは思いますが、SWTBotの動作を
より実運用的にしたイメージです。
・http://www.instantiations.com/flash/wt_demo/record_playback_eclipse_test.html
・http://www.instantiations.com/flash/wt_demo/record_playback_rcp_test.html

SWTBotのレコード機能とgroovyをうまく使いこなせばある程度近いものは作れないかなぁ?
とは思ってみたりするんだけど、そんな時間がない。。。。。
SWTBotのレコード機能をちょっと調査してみたいです。


http://www.instantiations.com/mktg/windowtester-demo.html

2010年3月21日日曜日

eclipse 3.6(Helios)をインストールしてみた

eclipseのHelios(Modeling Tools)をインストールしてみました。
現在2010/03/20のバージョンはM6(03/12/2010)でAPI Freeze状態です。
GW前にはFeature Freezeになるそうです。

・GalileoとはCompatibilityがある。
・InternationalizationはLatin-1,DBCSロケールデフォルトサポート。ドイツ語、日本語は現在テスト中のこと。
・EMF QueryがM5で入っていないというMLで流れていたが、すでにM6では入っている。QVTは問題なく使えそう。OCLも入っている。
・subcripseも普通にインストールできた。
・GMFはデフォルトで入っていないため、インストールが必要(しかし更新サイトからのインストールが固まる)

とりあえず以下のパッケージがデフォルトで入っているようです。

org.eclipse.amalgam.discovery
org.eclipse.cvs 1.1.0
org.eclipse.emf.cdo.epp
org.eclipse.emf.compare.sdk
org.eclipse.emf.mint.sdk
org.eclipse.emf.query.sdk
org.eclipse.emf.sdk
org.eclipse.emf.transaction.sdk
org.eclipse.emf.validation.sdk
org.eclipse.epp.usagedata.feature
org.eclipse.equinox.p2.user.ui 1.1.0
org.eclipse.gef.sdk
org.eclipse.help 1.1.0
org.eclipse.jdt 3.6.0
org.eclipse.mylyn.bugzilla_feature
org.eclipse.mylyn.context_feature
org.eclipse.mylyn.ide_feature
org.eclipse.mylyn.java_feature
org.eclipse.mylyn.pde_feature
org.eclipse.mylyn.wikitext_feature
org.eclipse.mylyn_feature
org.eclipse.ocl.all.sdk
org.eclipse.pde 3.6.0
org.eclipse.rcp 3.6.0
org.eclipse.sdk 3.6.0
org.eclipse.uml2.sdk
org.eclipse.xsd.sdk

2010年3月16日火曜日

EMF Transaction

またまた新しい知識を得なければならなくなりました。
その名もEMF Transaction。

http://help.eclipse.org/ganymede/index.jsp?topic=/org.eclipse.emf.doc/references/overview/EMF.html

概要を説明すると、EditingDomainをマルチスレッドアクセスでも整合性を保つようにDBのような
トランザクションの仕組みをEMFに取り込んだものである。
基本的にはトランザクションはコマンドをトランザクションとして処理を行う。



ざっくりな和訳


The transaction framework provides the capability of managing access to an editing domain
by multiple reading and writing threads. It also provides a facility to register and
share an editing domain amongst different clients and listeners. Resource set listeners
are defined in the transaction layer and are provided with notifications in batches.
The resource set listener has the option to append changes before the transaction is
committed (pre-commit) or receive only the notifications of transactions that were
validated and not rolled-back (post-commit). The following are the main extension
points and classes to be used with the transaction framework:


トランザクションフレームワークはマルチスレッドによるEditingDomainのR/Wのアクセス管理を可能にする。
異なるクライアント間でeditingDomainとリスナの共有と登録で実現できている。
リソースセットリスナはトランザクション層で定義されていて、
バッチの通知で提供されている。
リソースセットリスナは変更を追加するオプションを持っている。
トランザクションがコミットされる前やvalidateされたトランザクションや
ロールバックされていないトランザクションの通知を受け取る前に
次の拡張ポイントとクラスでトランザクションフレームワークが利用されている。

2010年2月16日火曜日

Groovyのテストケース作成ウィザード

Groovyでテストケース作成した場合正しくコード生成が行えないことがわかった。
doSample(),doString()メソッドがあるクラスのテストクラスを自動生成したが
testDoSample(),testDoStrin()メソッドがクラスの外部に生成されている。
そのため、エラーが発生する。

package sample.test;

import static org.junit.Assert.*;

import org.junit.After;
import org.junit.AfterClass;
import org.junit.Before;
import org.junit.BeforeClass;
import org.junit.Test;

class hoge {

@BeforeClass
public static void setUpBeforeClass() throws Exception {
}

@AfterClass
public static void tearDownAfterClass() throws Exception {
}

@Before
public void setUp() throws Exception {
}

@After
public void tearDown() throws Exception {
}

@Test
public final void testDoStringObject() {
fail("Not yet implemented"); // TODO
}
}

@Test
public final void testDoSample(){
fail("Not yet implemented"); // TODO
}

@Test
public final void testDoString(){
fail("Not yet implemented"); // TODO
}

2010年2月12日金曜日

antを勉強する

プロジェクトで開発を行うためには自動化が重要ということでantをマスターせねばということでantの本を買いました。
ant

開発に必要なプロジェクトをsubversionで更新を行う&リフレッシュをするという仕組みを作る。
以下こんな感じでやるのがよいかもしれません。



 
 




 
















2010年2月8日月曜日

EMFValidationの翻訳

使えるかと思うので翻訳をしてみました。
あとでちゃんと直します。


The validation framework provides support for constraint providers for any EMF meta-model (batch and live constraints), customizable model traversal algorithms, constraint parsing for languages, configurable constraint bindings to application contexts and validation listeners. The following are the main extension points and classes to be used with the validation framework.

ValidationFrameworkは以下のような制約プロバイダのサポートを提供する。
EMFメタモデル、モデルトラバーサルアルゴリズム、言語の制約パース、アプリケーションコンテキスト、validation リスナのバインディング制約などである。
次のようなvalidationFrameworkを使ったクラスや拡張ポイントがある。


1.The extension point org.eclipse.emf.validation.constraintProviders is used to provide constraints. Static constraint providers declare constraints in the plugin.xml. Constraints are grouped into hierarchically structured categories. Constraint providers target one or more EPackages by namespace URI. A group of constraints declares categories in which they are members. Each constraint has a variety of meta-data associated with it (Language, ID, severity, mode, name, message, triggers, etc.). Dynamic constraint providers address situations where constraints cannot be declared statically. e.g., where constraints are defined in models or other resources. Dynamic providers declare a class implementing the IModelConstraintProvider interface. This class is responsible for making constraints available on the appropriate triggers, organizing them into categories, etc.

拡張ポイントorg.eclipse.emf.validation.constraintProvidersで制約を与えることができる。
静的な制約はplugin.xmlで宣言をすることができる。
制約は構造化されたカテゴリに階層的にグループ化することができる。
制約プロバイダは1つのターゲットや名前空間URIのEPackageをターゲットにすることができる。
制約グループはメンバーのカテゴリを宣言する。
各々の制約はそれに関連するメタデータに種類を持つ。
(言語、ID,severity,mode,name,message,triggers)
次に動的な制約は静的に制約が定義できない場合に使われる。
制約はモデルや他のリソースで定義される。
動的な制約プロバイダはIModelConstraintProviderインタフェースを実装したクラスで
定義できる。
このクラスは適当なトリガや、カテゴリに組み込む制約を有用化する責任をおう。

2.The extension point org.eclipse.emf.validation.traversal is used to provide customizable model traversal algorithms. Batch validation traverses a subset of the model starting from the user's selections. No traversal is performed in live validation. Some meta-models require custom strategies for traversal. The default strategy simply iterates the content tree via eAllContents() API. Some meta-models do not use EMF containment relationships extensively, or implement logical models on multiple distinct resources, making containment-based traversal impractical.

拡張ポイントorg.eclipse.emf.validation.traversalはモデルトラバーサルなアルゴリズムで使用する。
バッチvalidationはユーザの選択したモデルのサブセットを横断する。
live validationはモデルの横断はできない。
トラバーサルには独自ロジックが必要となる。
デフォルトのロジックはeAllContents() APIを通してコンテンツツリーを走査する。
メタモデルはEMF Containment関係を使わない。
または、または多重の区別するリソースについてモデルや実用的なコンテナベースの横断を
持ったモデルを実装する。


3.The extension point org.eclipse.emf.validation.constraintParsers is used to provide constraint parsing for languages. The validation framework provides support for two languages: Java and OCL. Clients can provide support for other constraint languages via constraint parsers. The Language ID: used in the lang attribute of constraint elements in the constraint XML. The Class: identifies an implementation of the IXmlConstraintParser interface, which constructs a constraint from the XML configuration data. Constraint parsers are responsible for parsing the content of a constraint element in the plugin.xml to produce IModelConstraint objects.

拡張ポイントorg.eclipse.emf.validation.constraintParsersは言語の制約パースに対して使われる。
validation frameworkは2つの言語(Java OCL)で利用される。
クライアントは制約パーサを通して他の制約言語に対するサポートを提供できる。
言語ID:制約XMLの中の制約の要素の属性で使われる。
クラス:IXmlConstraintParserインタフェースで実装された識別
XMLの設定ファイルからの制約で作成された。
制約パーサはIModelConstraintを作るためのplugin.xmlに記述された
制約要素のコンテンツをパースするのに使われる。


4.The extension point org.eclipse.emf.validation.constraintBindings allows clients of the EMF Validation framework to define "client contexts" that describe the objects that they are interested in validating, and to bind them to constraints that they are interested in enforcing on these objects. A client context can declare an enablement expression that matches model elements that are included in the context. Where that is not sufficient, an alternative is to define a selector class using a selector element. Client contexts can be bound to constraints, individually, or to constraint categories (to bind all of the constraints in the category). Binding to constraint categories has the advantage of allowing new constraint contributions in a category to automatically be bound to the appropriate client context, even if the constraint is defined in a plug-in that is unaware of that context or its binding to the category. Category bindings are inherited by sub-categories from their ancestors.

拡張ポイントorg.eclipse.emf.validation.constraintBindingは
EMFValidationフレームワークのクライアントが"クライアントコンテキスト"を定義できる。
クライアントコンテキストはvalidationで興味があるオブジェクトを記述する。
オブジェクトに対して実施することに興味がある制約に対してバインドする。
クライアントコンテキストはコンテキストの中にあるモデル要素にマッチした可能な表現
で定義する。
十分でない場合、オルタネイティブはセレクタ要素を使ってセレクタクラスを定義すべきである。
クライアントコンテキストは制約や制約カテゴリ(カテゴリのすべての制約)に対してここに
バインディングできる。
制約カテゴリのバインディングはクライアントコンテキストを自動的にバインディングするため
カテゴリへの新しい制約の寄与の利点を持つ。
たとえ制約がコンテキストを意識せずにプラグインやカテゴリへのバインディングを定義できたとしても、
カテゴリバインディングは親からのサブカテゴリによって受け継がれる

5.The extension point org.eclipse.emf.validation.validationListeners is used to define validation listeners for the validation service (org.eclipse.emf.validation.service.ModelValidationService). The validation service will inform this listener whenever validation has occurred, loading it if necessary in order to do so. This is most useful for cases where client plug-ins need to find out about validation events even before they are loaded. Otherwise, it is usually simpler just to programmatically add a listener to the validation service. The value of the listener element class attribute must be the fully qualified name of a class that implements the IValidationListener interface. Listeners can also be registered in code, at run-time, using the ModelValidationService.addValidationListener() method.

拡張ポイント.org.eclipse.emf.validation.validationListenersは
validationサービスに対してvalidationリスナを定義するために利用する。
validationサービスはリスナにvalidationが起きたという情報を伝える。
もしそのようなことをするためには必要ならば、リスナをロードする。
これはクライアントプラグインがロードする前にvalidationイベントについて
理解する必要があるケースに使われる。
普通validationサービスに対してリスナをプログラム的に追加するのは簡単。
リスナ要素のクラス属性の値がLValidationListenerインタフェースを実装したクラス名を
制限されなければならない。
実行時はMdelValidationService.addValidationListerner()を使ってリスナは登録される。

6.The ModelValidationService singleton coordinates the invocation of validation. It defines a single factory method for creation of IValidator for the batch and live evaluation modes. Validators validate one or more objects at a time; the kind of object accepted as input depends on the evaluation mode. They can be configured to report constraint passes as well as failures, for verbose results. Results are reported as IValidationStatus. Validators can be reused by a client for any number of validation operations. The ILiveValidator validates EMF Notifications. The IBatchValidator validates EObjects and, due to its support for model traversal, supports progress monitors. Registered traversal strategies can be overridden by the client.

ModelValidationServiceはシングルトンでvalidationの実行を行う。
これはbatchモードliveモードに対してIValidatorを生成するファクトリメソッドを
定義する。
Validatorsは1つやそれ以上のオブジェクトをvalidateする。
評価モードに依存する入力として受けられたオブジェクトの種類。
それらは詳細な結果に対して制約の通過同様失敗のレポートすることを設定される。
結果はIValidationStatusとしてレポートされる。
Validatorはvalidation operationの数に対してクライアントは再利用する。
ILiveValidatorはEMF通知をvalidateする。
IBatchValidatorはEObjectをvalidateし、モデルトラバーサル、プログレスモニタ
をサポートする。
登録されたトラバーサルストラテジはクライアントでオーバーライドする。

7.Clients can create an EValidator implementation that delegates to the validation framework.

クライアントはvalidation frameworkを委譲したEValidator実装で作成される。


8.The framework provides implementation of an XML constraint parser (org.eclipse.emf.validation.xml.IXmlConstraintParser) API that supports definition of XML constraints in OCL. The class OclConstraintParser is the constraint parser implementation that creates instances of the OclModelConstraint class, the OCL-language constraint implementation, from XML constraint descriptors. It uses the Query class to test model elements against an OCL constraint expression.

frameworkはXML制約パーサAPIの実装を提供する。
(org.eclipse.emf.validation.xml.IXmlConstraintParser)
APIはOCLのXML制約を定義できる。
クラスOclCOntraintParserは制約パーサである。
OclModelConstraintクラスでインスタンス化された制約パース実装である。
OCL言語は制約を、実装する。
OCL制約表現に対してモデル要素のテストするためにクエリクラスを使う。

2010年1月28日木曜日

EMFQuery

先日Teneoを調べていたのだがEMFプロジェクトの中にEMF Queryというのがあり、それを使うと十分に使えるんじゃないか?思い調べてみました。
EMF Queryのサンプルからちょこっと変更を加えた下記コードのように記述すると動作することが確認されました。


public class Sample {
public static void main(String[] args) {
// TODO Auto-generated method stub
BookCategory category = null;
Collection selectedEObjects = null;
selectedEObjects = new java.util.ArrayList();
Library library = EXTLibraryFactory.eINSTANCE.createLibrary();
Writer writer = EXTLibraryFactory.eINSTANCE.createWriter();
writer.setFirstName("FirstName");
writer.setLastName("LastName");
writer.setName("FullName");
for (int i = 0; i < 10; i++) {
Book book = EXTLibraryFactory.eINSTANCE.createBook();
book.setPublicationDate(new Date());
book.setPages(i*100);
book.setAuthor(writer);
book.setCategory(BookCategory.MYSTERY_LITERAL);
book.setTitle("タイトル"+i);
library.getBooks().add(book);
selectedEObjects.add((EObject) book);
category = book.getCategory();
}
// PREPAREDSTATEMENT
SELECT select = new SELECT(
new FROM(selectedEObjects),
new WHERE(new EObjectAttributeValueCondition(
EXTLibraryPackage.eINSTANCE.getBook_Pages(),
NumberCondition.between(500, Integer.MAX_VALUE)
)
)
);
//Execute Query & getResultSet
Collection resultset = select.execute();
System.out.println(resultset);
for (EObject object:resultset) {
System.out.println(object.toString());
}

}
}

2010年1月26日火曜日

EMFのTeneoについて

EMFは大体理解できたが色々なさサブプロジェクトの理解ができていないため、
色々理解していこうと思います。

Teneoの和訳

TeneoはEclipseLinkやHibernateを使ったEMFに対するDB永続性のソリューションである。
DBスキーマに関連したリレーショナルマッピングへのEMFのアトミック生成をサポート。
ソリューションはEMFの特性をサポートするランタイムレイヤを含んでいる。
EMFオブジェクトは格納できる。HQLやEJB-SQLのようなクエリで検索できる。
EMFリソースの実装はEMF Editorとの統合を提供されている。
永続ロジックとマッピングはEJB3/JPAのようなアノテーションを使ってコントロールできる。
EJB3/JPAマッピングのほとんどがサポートされている。
ドキュメントとチュートリアルがelver.org で乗っている。

上記の和訳は非常に難しいことを言っているがDBのようなクエリがEMFオブジェクト
で利用できますというのが大きいです。


参考リンク
elver

hibernate

2010年1月24日日曜日

Pluginを作成するために便利なプラグイン

Eclipse MarketPlaceを見ていていいなぁと思ったものを紹介。


RCP Toolbox
RichClientGUIというサイトで配布されているサンプル?ツール。
起動するとデモ+ソースコードが見れるので、それを流用してサクサク
プラグインが作成できるかもなぁということで。




SWTXML
SWTをXMLで記述できる技術。まぁFlexに対抗するためにはやる必要な機能だもんなぁ。
これがJavaのソースコードに変換できればかっこいいのだが。調査中。

2010年1月22日金曜日

RCPのwelcome画面のカスタマイズ

RCPのWelcome画面をカスタマイズについて調べました。

・Widget編
org.eclipse.ui.introの拡張ポイントを追加
introを追加
 ID:intro
 class:HelloWorldIntroPart
introproductBindingを追加
productID:sample.product
introID:intro

HelloWorldIntroPartの実装を行います。IIntroPartインタフェースを実装する。
getTitle,getTitleImageを必ず実装します。
createPartControlを実装。
基本的にSWTで表示する方法と同じ方法で画面を作成する。

メリット:完全にSWTに紐づいているのでWelcome画面のボタンでアクションを起こすことができる。


・XHTML編
product.configurationのbrandingのwelcome PageのIntroIDを
指定する。
introIDを指定すると指定したplugin.xmlに拡張にintro,intro.config
が追加される。

content:introContent.xhtml

introContent.xhtmlとroot.xhtmlを確認し、XHTMLを編集していくことで
独自のWelcomeページを見ることができる。





・welcome画面を閉じる仕組み


private IIntroSite introsite;
private IIntroPart intropart;

workbench = PlatformUI.getWorkbench();
workbench.getIntroManager().closeIntro(intropart);

2010年1月17日日曜日

VisualEditorでのScrolledFormの編集方法

VisualEditorでScrolledFormを使って画面作成したが、再度開きなおすと編集ができなくなってしまいます。
ScrolledFormとSectionを使うのが動作的にNGっぽいのでどうしようかと考えた結果。

Compositeで作成した後ScrolledFormに手で書き換えてやれば動作するのではという結論

1.Compositeで画面を作成する。
2.大本画面のCompositeをScrolledFormに型を変換する。
3.composite.setLayout()をcomposite.getBody().setLayout()に変換
4.ウィジェット生成メソッドのcreateXXXXの引数のScrolledFormのcompositeをcomposite.getBody()に変換する。・
5.以上作成完了
6.再度編集しなおすときは上記の逆の作業を行う。


非常にめんどくさいですが、上記方法でうまくいくことを確認できたので、今のところはOKかなとおもいます。