機能の拡張〜アクションボタン〜

基本的な辞書プラグインは完成したので、今後は機能を追加していきましょう。

エンターキーでの検索

今の状態だと、searchボタンを押さないと検索できないので、これをエンターキーでも検索できるようにしてみましょう。

DicView.java

public class DicView extends ViewPart {
    ・
    ・
    ・
	public void createPartControl(Composite parent) {
        ・
        ・
		text = new Text(group, SWT.SINGLE | SWT.BORDER);
		GridData gridData = new GridData(190, 15);
		gridData.horizontalSpan = 2;
		text.setLayoutData(gridData);
		text.addKeyListener(new KeyListener(){
			public void keyPressed(KeyEvent e) {
				if(e.keyCode == 13){
					translate();
				}
			}
			public void keyReleased(KeyEvent e) {}
		});
        ・
        ・
        ・
	}
    ・
    ・
}

上のようにして、textにKeyListenerを追加します。ここではkeyPressedメソッドにエンターキーを押したときの処理を追加しています。

これで、エンターキーで検索を開始できるようになりました。

履歴の表示機能

次に履歴の表示ができ、再検索ができるようにしましょう。

Eclipseのサーチビューには履歴の表示機能がついていて、上のようになっています。この形を目標に作ってみましょう。

アクションをビューのメニューに組み込む方法として、下のような方法がよく知られています。

private IAction action;//アクション
  (省略)
IActionBars bar = getViewSite().getActionBars();
bar.getToolBarManager().add(action); //ツールバーにアクションを加える。
bar.getMenuManager().add(action); //プルダウンメニューにアクションを加える。

上のようにすると、ツールバーにアクションボタンとプルダウンメニューを加えることはできますが、別々のボタンになってしまい、上の図のような、アクションボタンとメニューが一体化したボタンを作ることはできません。

そこで、下のような内部クラスを作ります。

DicView.java


import org.eclipse.jface.action.Action;
import org.eclipse.jface.action.ActionContributionItem;
import org.eclipse.jface.action.IAction;
import org.eclipse.jface.action.IMenuCreator;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.Menu;
 ・
 ・
(省略)
 ・
public class DicView extends ViewPart {
           ・
      ・
    class SearchAction extends Action implements IMenuCreator {
    	
	    Menu fMenu;
		
            SearchAction() {
                setMenuCreator(this);
    	    }
    	
    	    public void run() {
	      //ボタン自身を押したときのアクション
    	    }

	    public void dispose() {}

	    public Menu getMenu(Control parent) {
		fMenu= new Menu(parent);
                //アクションをメニューに加える
        //addActionToMenu(fMenu, action);など
		return fMenu;
	    }

	    public Menu getMenu(Menu parent) {
		return null;
	    }
		
	    protected void addActionToMenu(Menu parent, IAction action) {
		ActionContributionItem item= new ActionContributionItem(action);
		item.fill(parent, -1);
	    }

      }
}

そして、このクラスをメニューバーに追加してみましょう。以下のように追加します。

DicView.java

import org.eclipse.ui.IActionBars;
   ・
   ・
public class DicView extends ViewPart {
    ・
	private IActionBars bars;
	private SearchAction search;
    ・
	public void createPartControl(Composite parent) {
        ・
        ・
                makeAction();
        }

        private void makeAction(){

		bars = getViewSite().getActionBars();
		search = new SearchAction();
		bars.getToolBarManager().add(search);
		
	}
    ・
    ・
}

起動してみると、上の図のようなボタンがついているはずです。アクションボタンとメニューがひとつのボタンになっているのが分かります。
まだ、アイコンを指定していないので、赤い小さな四角がついています。

それでは、アクションを追加してみましょう。
ボタンを押すと直前の検索をして、メニューを出すと今までの履歴と「ヒストリー削除」「直前の検索」という項目が出るようにします。

下のように追加します。

DicView.java


import java.util.LinkedList;
import org.eclipse.swt.widgets.MenuItem;
・
public class DicView extends ViewPart {
    ・
	private IAction historyClear;
	private LinkedList<IAction> history = new LinkedList<IAction>();
    ・
    ・
	private void makeAction(){
        ・
        ・
		search.setText("直前の検索");
		search.setToolTipText("直前の検索を表示");
		
		historyClear = new Action(){
			public void run(){
				historyClear();
			}
		};
		historyClear.setText("ヒストリーのクリア");
	}

	private void historyClear(){
		search.clear();
	}

	public void translate(){
		String getText = text.getText();
		search.add(getText); //履歴に追加
		browser.setText(english.getHtml(getText));
	}

	public void translate(String word){ //履歴からの検索用メソッド
		browser.setText(english.getHtml(word));
	}
    ・
    ・
	class SearchAction extends Action implements IMenuCreator {
        ・
        ・
		public void run() {
			if (history.size() > 1)
				history.get(1).run(); //ボタンを押したときの処理
		}
        ・
		public Menu getMenu(Control parent) {
			fMenu = new Menu(parent);
			for(int i = 0; i < history.size(); i++){ //メニューに履歴の単語を追加
				addActionToMenu(fMenu, history.get(i));
			}
			new MenuItem(fMenu, SWT.SEPARATOR); //仕切りを追加
			addActionToMenu(fMenu, search); //ボタンを押したときと同じ処理の項目
			addActionToMenu(fMenu, historyClear); //ヒストリー消去の項目
			return fMenu;
		}
        ・
        ・
		public void add(final String word){ //検索した単語のアクションを作成
			history.addFirst(new Action(){
				public void run(){
					translate(word);
				}
			});
			history.get(0).setText(word);
		}
		
		public void clear(){ //ヒストリークリアの処理
			history.clear();	
		}
	}
}

これらの処理を追加して実行すると上の図のようなボタンがついているはずです。履歴機能・直前の履歴検索・履歴消去ができることが確認できます。

これで、履歴の機能の部分は完成しました。
次はボタンに上の画像をつけてみましょう。上のような画像は、Eclipseのソースのiconsフォルダに入っています。上の画像はサーチプラグインのソースから取ってきたものです。

まず、dictionaryパッケージにiconsフォルダを作ります。そこに上の画像を入れておきましょう。
以下のように追加していきます。

DicView.java


import java.net.MalformedURLException;
import java.net.URL;import org.eclipse.jface.resource.ImageDescriptor;
・
public class DicView extends ViewPart {
    ・
    ・
	private void makeAction(){
        ・
        ・
		try {
			search.setImageDescriptor(getImageDescriptor("icons/tsearch_obj.gif"));
		} catch (MalformedURLException e) {
			e.printStackTrace();
		}
	}
    ・
    ・
	public static ImageDescriptor getImageDescriptor(String path) throws MalformedURLException{
		URL url = Activator.getDefault().getBundle().getEntry("");
	      return ImageDescriptor.createFromURL(new URL(url,path));
	}
    ・
    ・
}

これで起動してみると、上のようにアイコンがついて目標のメニューの形になっています。

以上で履歴機能が完成しました。
<前へ 次へ>