SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

DeveloperZine(デベロッパージン)- エンジニアの意思決定を支える技術情報メディア ProductZine

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

japan.internet.com翻訳記事

Eclipse RCPとSpringによる実用的なシッククライアントの構築

シッククライアントのGUI構築の省力化

新しいWatchListViewを作成する

 これで、独自のViewクラスの作成を始めることができます。まず、WatchListViewを作成します。これは、アプリケーションサーバーのStockDataServiceに要求を行うクラスです。

  1. 「plugin.xml」で、[Extentions]タブに移動します。
  2. [All Extensions]ツリーでorg.eclipse.ui.viewsを選択し、[Add]をクリックします。
  3. 新しいダイアログウィンドウが作成されます。[Extension Points]ツリーを下にスクロールしてorg.eclipse.ui.viewsを選択します。[Available templates for org.eclipse.ui.views]の下でSampleViewを選択し、[Next]をクリックします(図13を参照)。
  4. 図13 新しい拡張ダイアログ
    図13 新しい拡張ダイアログ
  5. [Main View Settings]ウィンドウに次の情報を入力します。
  6. Java Package Name = eclipseTradeClient.views.watchlist
    View Class Name = WatchListView
    View Name = Watch List View
    View Category ID = EclipseTradeClient
    View Category Name = WatchList Category
    
    [Table Viewer]ボタンを選択したまま、[Add the view to the resource perspective]チェックボックスをオンにします(図14を参照)。[Next]をクリックします。
    図14 Watch List Viewの[Main View Settings]画面
    図14 Watch List Viewの[Main View Settings]画面
  7. [View Features]をデフォルトのままにして、[Finish]をクリックします。
  8. 「plugin.xml」の[All Extensions]タブに新しいViewとCategoryが表示されます。
  9. これで、Watch List Viewのコードを作成することができます。ウォッチリストはテーブルなので、まずそのテーブルに対するITableLabelProviderを実装します。パッケージeclipseTradeClient.views.watchlistの下にWatchListTableLabelProviderという新しいクラスを作成します。ITableLabelProviderはSwingのTableCellRendererに相当すると考えてください。WatchListTableLabelProviderのコードは次のようになります。
  10. package eclipseTradeClient.views.watchlist;
    
    import java.text.NumberFormat;
    
    import org.eclipse.jface.viewers.ITableLabelProvider;
    import org.eclipse.jface.viewers.LabelProvider;
    import org.eclipse.swt.graphics.Image;
    
    import stephenlum.services.stock.dto.StockDTO;
    
    public class WatchListTableLabelProvider extends LabelProvider
        implements ITableLabelProvider {
    
        private static NumberFormat numberFormat =
                NumberFormat.getInstance();
    
        public Image getColumnImage(Object element, int columnIndex) {
            return null;
        }
    
        public String getColumnText(Object element, int columnIndex) {
            if (element != null) {
                switch (columnIndex) {
                    case 0:
                        return ((StockDTO) element).getTickerSymbol();
                    case 1:
                        return ((StockDTO) element).getLastTrade().toString();
                    case 2:
                        return numberFormat.
                            format(((StockDTO) element).getVolume());
                    case 3:
                        return ((StockDTO) element).getDaysRange();
                    case 4:
                        return numberFormat.
                            format(((StockDTO) element).getAvgVol());
                    case 5:
                        return ((StockDTO) element).getDaysRange();
                    case 6:
                        return ((StockDTO) element).getFiftyTwoWeekRange();
                    case 7:
                        return ((StockDTO) element).getMarketCap();
                }
            }
    
            return "";
        }
    
    }
    
  11. 最後に、PerspectiveクラスにWatchListViewを追加します。パッケージエクスプローラでクラスPerspectiveを開き、WatchListViewがページの一番下に表示されるように次の変更を加えます。
  12. package eclipseTradeClient;
    
    import org.eclipse.ui.IPageLayout;
    import org.eclipse.ui.IPerspectiveFactory;
    import org.eclipse.ui.IFolderLayout;
    import eclipseTradeClient.views.WatchListView;
    
    public class Perspective implements IPerspectiveFactory {
    
        public void createInitialLayout(IPageLayout layout) {
            String editorArea = layout.getEditorArea();
            layout.setEditorAreaVisible(false);
            layout.setFixed(false);
    
            layout.addStandaloneView(ExplorerView.ID,
                    false,
                    IPageLayout.LEFT,
                    0.25f,
                    editorArea);
            IFolderLayout topLeft = layout.createFolder("TOP",
                    IPageLayout.TOP,
                    0.50f,
                    editorArea);
            layout.addView(WatchListView.ID,
                    IPageLayout.BOTTOM,
                    0.25f,
                    editorArea);
        }
    }
    
  13. 次に、クラスWatchListViewにコードを追加します。独自のコードを自由に追加できるように、テンプレートウィザードで生成されたコードの大半は手を付けずそのままにしておきました。基本的には、クラスStockDTOのインスタンスに含まれているすべての情報を表示するテーブルを追加します。当然、列はStockDTOのメンバに基づきます。action1はstocktradeserverから株式の一覧をフェッチしてテーブルに表示し、action2はテーブルからすべての要素を削除するので、生成された2つのアクションの名前を変更しました(リスト1を参照)。
リスト1 eclipseTradeClient.views.watchlist
package eclipseTradeClient.views.watchlist;

import java.util.ArrayList;
import java.util.List;

import org.eclipse.jface.action.Action;
import org.eclipse.jface.action.IMenuListener;
import org.eclipse.jface.action.IMenuManager;
import org.eclipse.jface.action.IToolBarManager;
import org.eclipse.jface.action.MenuManager;
import org.eclipse.jface.action.Separator;
import org.eclipse.jface.dialogs.MessageDialog;
import org.eclipse.jface.viewers.DoubleClickEvent;
import org.eclipse.jface.viewers.IDoubleClickListener;
import org.eclipse.jface.viewers.ISelection;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.jface.viewers.TableViewer;
import org.eclipse.jface.viewers.ViewerSorter;
import org.eclipse.swt.SWT;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Menu;
import org.eclipse.swt.widgets.Table;
import org.eclipse.swt.widgets.TableColumn;
import org.eclipse.ui.IActionBars;
import org.eclipse.ui.ISharedImages;
import org.eclipse.ui.IWorkbenchActionConstants;
import org.eclipse.ui.PlatformUI;
import org.eclipse.ui.internal.dialogs.ViewContentProvider;
import org.eclipse.ui.part.ViewPart;

import springClient.SpringClientPlugin;
import stephenlum.services.stock.StockService;
import stephenlum.services.stock.dto.StockDTO;

public class WatchListView extends ViewPart {

    public static final String ID =
        "eclipseTradeClient.views.watchlist.WatchListView";

    private TableViewer viewer;
    private Action getStocksAction;
    private Action clearTableAction;
    private Action doubleClickAction;

    class NameSorter extends ViewerSorter {
    }

    /**
     * The constructor.
     */
    public WatchListView() {
    }

    /**
     * This is a callback that will allow us
     * to create the viewer and initialize it.
     */
    public void createPartControl(Composite parent) {
        GridLayout gridLayout = new GridLayout();
        gridLayout.numColumns = 8;
        gridLayout.marginHeight = 5;
        gridLayout.marginWidth = 5;
        parent.setLayout(gridLayout);

        GridData gridData = new GridData();
        gridData.verticalAlignment = GridData.FILL;
        gridData.horizontalSpan = 3;
        gridData.grabExcessHorizontalSpace = true;
        gridData.grabExcessVerticalSpace = true;
        gridData.horizontalAlignment = GridData.FILL;

        viewer = new TableViewer(
            parent, SWT.MULTI | SWT.H_SCROLL | SWT.V_SCROLL);
        viewer.setContentProvider(new ViewContentProvider());
        viewer.setLabelProvider(new WatchListTableLabelProvider());
        viewer.setSorter(new NameSorter());
        viewer.setInput(StockDTO.class);
        viewer.getControl().setLayoutData(gridData);

        Table table = viewer.getTable();
        table.setHeaderVisible(true);
        table.setLinesVisible(true);

        TableColumn tickerSymbolColumn =
            new TableColumn(table, SWT.NONE);
        tickerSymbolColumn.setText("Ticker Symbol");
        tickerSymbolColumn.setWidth(100);

        TableColumn lastTradeColumn = new TableColumn(table, SWT.NONE);
        lastTradeColumn.setText("Last Trade");
        lastTradeColumn.setWidth(100);

        TableColumn volumeColumn = new TableColumn(table, SWT.NONE);
        volumeColumn.setText("Volume");
        volumeColumn.setWidth(100);

        TableColumn daysrangeColumn = new TableColumn(table, SWT.NONE);
        daysrangeColumn.setText("Days Range");
        daysrangeColumn.setWidth(100);

        TableColumn avgvolColumn = new TableColumn(table, SWT.NONE);
        avgvolColumn.setText("Avg Vol");
        avgvolColumn.setWidth(100);

        TableColumn daysRangeColumn = new TableColumn(table, SWT.NONE);
        daysRangeColumn.setText("Days Range");
        daysRangeColumn.setWidth(100);

        TableColumn fiftyTwoWeekColumn = new TableColumn(table, SWT.NONE);
        fiftyTwoWeekColumn.setText("52 Week Range");
        fiftyTwoWeekColumn.setWidth(100);

        TableColumn marketCapColumn = new TableColumn(table, SWT.NONE);
        marketCapColumn.setText("Market Cap");
        marketCapColumn.setWidth(100);

        makeActions();
        hookContextMenu();
        hookDoubleClickAction();
        contributeToActionBars();
    }

    private void hookContextMenu() {
        MenuManager menuMgr = new MenuManager("#PopupMenu");
        menuMgr.setRemoveAllWhenShown(true);
        menuMgr.addMenuListener(new IMenuListener() {
            public void menuAboutToShow(IMenuManager manager) {
                WatchListView.this.fillContextMenu(manager);
            }
        });
        Menu menu = menuMgr.createContextMenu(viewer.getControl());
        viewer.getControl().setMenu(menu);
        getSite().registerContextMenu(menuMgr, viewer);
    }

    private void contributeToActionBars() {
        IActionBars bars = getViewSite().getActionBars();
        fillLocalPullDown(bars.getMenuManager());
        fillLocalToolBar(bars.getToolBarManager());
    }

    private void fillLocalPullDown(IMenuManager manager) {
        manager.add(getStocksAction);
        manager.add(new Separator());
        manager.add(clearTableAction);
    }

    private void fillContextMenu(IMenuManager manager) {
        manager.add(getStocksAction);
        manager.add(clearTableAction);
        // Other plug-ins can contribute there actions here
        manager.add(new Separator(
            IWorkbenchActionConstants.MB_ADDITIONS));
    }

    private void fillLocalToolBar(IToolBarManager manager) {
        manager.add(getStocksAction);
        manager.add(clearTableAction);
    }

    private void makeActions() {
        getStocksAction = new Action() {
            public void run() {
                showMessage("Getting Watch List...");

                StockService stockServiceHttp =
                    (StockService)SpringClientPlugin.getDefault().
                    getBeanFactory().getBean("stockServiceHttpInvoker");

                List<String> tickerList = new ArrayList<String>();
                tickerList.add("msft");
                tickerList.add("sunw");
                tickerList.add("orcl");
                tickerList.add("ibm");
                List stockList = stockServiceHttp.getStocks(tickerList);

                viewer.add(stockList.toArray());
            }
        };
        getStocksAction.setText("Get Watch List");
        getStocksAction.setToolTipText("Get Watch List");
        getStocksAction.setImageDescriptor(PlatformUI.getWorkbench().
            getSharedImages().getImageDescriptor(
            ISharedImages.IMG_OBJS_INFO_TSK));

        clearTableAction = new Action() {
            public void run() {
                showMessage("Clear Watch List");
                viewer.getTable().removeAll();
            }
        };
        clearTableAction.setText("Clear Watch List");
        clearTableAction.setToolTipText("Clear Watch List");
        clearTableAction.setImageDescriptor(PlatformUI.getWorkbench().
            getSharedImages().getImageDescriptor(
            ISharedImages.IMG_OBJS_INFO_TSK));
        doubleClickAction = new Action() {
            public void run() {
                ISelection selection = viewer.getSelection();
                Object obj = ((IStructuredSelection)selection).
                    getFirstElement();
                showMessage("Double-click detected on "+obj.toString());
            }
        };
    }

    private void hookDoubleClickAction() {
        viewer.addDoubleClickListener(new IDoubleClickListener() {
            public void doubleClick(DoubleClickEvent event) {
                doubleClickAction.run();
            }
        });
    }
    private void showMessage(String message) {
        MessageDialog.openInformation(
            viewer.getControl().getShell(),
            "Watch List View",
            message);
    }

    /**
     * Passing the focus request to the viewer's control.
     */
    public void setFocus() {
        viewer.getControl().setFocus();
    }
}

アプリケーションを実行する

 これで、アプリケーションを実行する準備ができました。まだEclipseにstocktradeserverプロジェクトをインポートしていない場合は、次のようにしてインポートします。

  1. Eclipseで、ツールバーボタン[Deploy MyEclipse J2EE project to Server]をクリックします(図15を参照)。
  2. 図15 [Deploy MyEclipse J2EE Server]ボタン
    図15 [Deploy MyEclipse J2EE Server]ボタン
    ドロップダウンリストにあるプロジェクトがstocktradeserverであることを確認します。[Add]をクリックし、サーバーとしてTomcat 5を選択して、[Finish]をクリックします。Successfully deployedというメッセージが表示されたら、[OK]をクリックします(図16を参照)。
    図16 正しく配備されたStockTradeServer
    図16 正しく配備されたStockTradeServer
    次に、Tomcatサーバーを始動します(図17を参照)。Tomcatは正常に始動されるはずです。
    図17 MyEclipseプラグインからTomcatを始動する
    図17 MyEclipseプラグインからTomcatを始動する
  3. ERCを始動します。EclipseTradeClientの「plugin.xml」ファイルを開き、[Overview]タブをクリックして、[Launch an Eclipse application]をクリックします。アプリケーションが起動したら、図18に示す赤い円で囲まれたボタンをクリックして、株式の一覧を取得します。このアクションは、Spring HttpInvokerを使ってアプリケーションサーバーから株式の一覧をフェッチします。円で囲まれたボタンの右側のボタンをクリックすると、株式の一覧はクリアされます(図18を参照)。
  4. 図18 正常に実行されているEclipseTradeClient
    図18 正常に実行されているEclipseTradeClient

 お疲れさまでした。小さいEclipseリッチクライアントを構築し、Spring Remotingを使ってアプリケーションサーバーに接続することができました。

Eclipse RCPの豊富な機能を調べる

 今後はRCPベースの開発をぜひ検討してみてください。RCPにはそれだけの価値があります。次にEclipse RCPベースのシッククライアントを構築するときには、シッククライアントのGUIフレームワークを構築するために必要な基本部分のコードがかなり少なくなるでしょう。さらに、Spring Remotingをクライアント/サーバー通信のメカニズムとして利用すれば、プロトコルの切り替えが非常に簡単になるだけでなく、サーバーサイドでSpringのその他のメリットを利用することもできます。

この記事は参考になりましたか?

連載通知を行うには会員登録(無料)が必要です。
既に会員の方はを行ってください。
japan.internet.com翻訳記事連載記事一覧

もっと読む

この記事の著者

japan.internet.com(ジャパンインターネットコム)

japan.internet.com は、1999年9月にオープンした、日本初のネットビジネス専門ニュースサイト。月間2億以上のページビューを誇る米国 Jupitermedia Corporation (Nasdaq: JUPM) のニュースサイト internet.comEarthWeb.com からの最新記事を日本語に翻訳して掲載するとともに、日本独自のネットビジネス関連記事やレポートを配信。

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

Stephen Lum(Stephen Lum)

ロンドンの投資銀行の上級開発者。Javaのプログラミング経験は7年に及ぶ。SunのJavaプログラマ認定資格とOracleの開発者認定資格のほか、CPAの資格を持つ。

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

この記事は参考になりましたか?

この記事をシェア

CodeZine(コードジン)
https://codezine.jp/article/detail/528 2006/08/24 00:00

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー