新しいWatchListViewを作成する
これで、独自のViewクラスの作成を始めることができます。まず、WatchListViewを作成します。これは、アプリケーションサーバーのStockDataServiceに要求を行うクラスです。
- 「plugin.xml」で、[Extentions]タブに移動します。
- [All Extensions]ツリーでorg.eclipse.ui.viewsを選択し、[Add]をクリックします。
- 新しいダイアログウィンドウが作成されます。[Extension Points]ツリーを下にスクロールしてorg.eclipse.ui.viewsを選択します。[Available templates for org.eclipse.ui.views]の下でSampleViewを選択し、[Next]をクリックします(図13を参照)。
- [Main View Settings]ウィンドウに次の情報を入力します。
- [View Features]をデフォルトのままにして、[Finish]をクリックします。
- 「plugin.xml」の[All Extensions]タブに新しいViewとCategoryが表示されます。
- これで、Watch List Viewのコードを作成することができます。ウォッチリストはテーブルなので、まずそのテーブルに対するITableLabelProviderを実装します。パッケージeclipseTradeClient.views.watchlistの下に
WatchListTableLabelProviderという新しいクラスを作成します。ITableLabelProviderはSwingのTableCellRendererに相当すると考えてください。WatchListTableLabelProviderのコードは次のようになります。 - 最後に、
PerspectiveクラスにWatchListViewを追加します。パッケージエクスプローラでクラスPerspectiveを開き、WatchListViewがページの一番下に表示されるように次の変更を加えます。 - 次に、クラス
WatchListViewにコードを追加します。独自のコードを自由に追加できるように、テンプレートウィザードで生成されたコードの大半は手を付けずそのままにしておきました。基本的には、クラスStockDTOのインスタンスに含まれているすべての情報を表示するテーブルを追加します。当然、列はStockDTOのメンバに基づきます。action1はstocktradeserverから株式の一覧をフェッチしてテーブルに表示し、action2はテーブルからすべての要素を削除するので、生成された2つのアクションの名前を変更しました(リスト1を参照)。
Java Package Name = eclipseTradeClient.views.watchlist View Class Name = WatchListView View Name = Watch List View View Category ID = EclipseTradeClient View Category Name = WatchList Category
![図14 Watch List Viewの[Main View Settings]画面 図14 Watch List Viewの[Main View Settings]画面](http://cz-cdn.shoeisha.jp/static/images/article/528/16292.gif)
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 ""; } }
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); } }
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プロジェクトをインポートしていない場合は、次のようにしてインポートします。
- Eclipseで、ツールバーボタン[Deploy MyEclipse J2EE project to Server]をクリックします(図15を参照)。
- ERCを始動します。EclipseTradeClientの「plugin.xml」ファイルを開き、[Overview]タブをクリックして、[Launch an Eclipse application]をクリックします。アプリケーションが起動したら、図18に示す赤い円で囲まれたボタンをクリックして、株式の一覧を取得します。このアクションは、Spring HttpInvokerを使ってアプリケーションサーバーから株式の一覧をフェッチします。円で囲まれたボタンの右側のボタンをクリックすると、株式の一覧はクリアされます(図18を参照)。
![図15 [Deploy MyEclipse J2EE Server]ボタン 図15 [Deploy MyEclipse J2EE Server]ボタン](http://cz-cdn.shoeisha.jp/static/images/article/528/16293.gif)


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


