SWT Tips and Samples 基礎編 > Documentクラスを利用した文字列検索

 

Documentクラスを利用した文字列検索

JFaceのDocumentクラスには、文字列を検索するためのメソッドが用意されています。このメソッドを使うことでシンプルな文字列検索機能をダイアログを比較的簡単に作成することができます。

Document.search()メソッドの使い方を以下に示します。

Document doc = ...;

//検索を開始するオフセット
int findOffset;

//検索文字列
String findWord

//前方検索ならtrue
boolean fowardSearch;

//大文字小文字を区別するならtrue
boolean matchCase;

//単語単位の検索ならtrue
boolean wholeWord;

//見つかった文字列のオフセットが返される。検索語が存在しなければ-1を返す。
int pos = doc.search(findOffset, findWord, fowardSearch, matchCase, wholeWord);

Documentクラスのsearchメソッドでは、正規表現を使った検索機能は持っていないので、より高機能な文字列検索を作成するには、検索処理を自分で実装する必要があります。

サンプルプログラム

サンプルプログラムは、Documentクラスのsearchメソッドを利用して作成した検索ダイアログです。メインウィンドウの検索ボタンを押すとダイアログが開きます。下で示すソースコードのFindDialogクラスの部分をコピーアンドペーストするだけで、検索ダイアログを簡単に作れます。

ソースコード (DocumentFindTextTest.java)

import java.util.Iterator;
import java.util.Vector;

import org.eclipse.jface.text.BadLocationException;
import org.eclipse.jface.text.Document;
import org.eclipse.jface.text.IDocument;
import org.eclipse.jface.text.ITextViewer;
import org.eclipse.jface.text.TextViewer;
import org.eclipse.jface.window.ApplicationWindow;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.layout.*;
import org.eclipse.swt.widgets.*;

public class DocumentFindTextTest extends ApplicationWindow {

   private TextViewer text;
   public DocumentFindTextTest() {
      super(null);
   }
   public static void main(String[] args) {
      ApplicationWindow w = new DocumentFindTextTest();
      w.setBlockOnOpen(true);
      w.open();
      Display.getCurrent().dispose();
   }

   protected Control createContents(Composite parent) {
      getShell().setText("FindTextTest");
      Composite container = new Composite(parent, SWT.NONE);

      container.setLayout(new GridLayout(1, false));
      Button openFindDialog = new Button(container, SWT.PUSH);
      openFindDialog.setText("検索");
      openFindDialog.addSelectionListener(new SelectionAdapter() {
         public void widgetSelected(SelectionEvent e) {
            FindDialog dialog = new FindDialog(getShell(), text);
            dialog.open();
         }
      });

      text = new TextViewer(container, SWT.BORDER | SWT.MULTI | SWT.V_SCROLL);
      text.getTextWidget().setWordWrap(true);
      text.getTextWidget().setLayoutData(new GridData(GridData.FILL_BOTH));
      Document doc =
         new Document("SWT Standard Widget Toolkit\nEclipseのGUIコンポーネント開発される");
      text.setDocument(doc);

      getShell().setSize(300, 300);
      return container;
   }
}

class FindDialog extends Dialog {
   ITextViewer viewer;
   int findOffset = 0;
   private Combo keywordCombo;
   private Button matchCase;
   private Button wholeWord;

   //検索語の履歴
   static private Vector history = new Vector();

   public FindDialog(Shell parent, ITextViewer viewer) {
      super(parent, SWT.DIALOG_TRIM | SWT.MODELESS);
      this.viewer = viewer;
      findOffset = viewer.getTextWidget().getCaretOffset();
   }

   private Combo createKeywordCombo(Composite parent) {
      Combo combo = new Combo(parent, SWT.BORDER);
      combo.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
      Iterator it = history.iterator();
      while (it.hasNext()) {
         combo.add((String) it.next());
      }
      return combo;
   }

   public void open() {
      final Shell shell = new Shell(getParent(), getStyle());
      shell.setText("検索");

      shell.setLayout(new GridLayout(1, false));
      Composite c = new Composite(shell, SWT.NONE);
      c.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
      c.setLayout(new GridLayout(2, false));
      new Label(c, SWT.NONE).setText("検索(&F):");

      keywordCombo = createKeywordCombo(c);

      Group group = new Group(shell, SWT.SHADOW_NONE);
      group.setText("オプション");
      group.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
      group.setLayout(new GridLayout(1, false));

      matchCase = new Button(group, SWT.CHECK | SWT.NONE);
      matchCase.setText("大文字小文字の区別(&C)");

      wholeWord = new Button(group, SWT.CHECK | SWT.NONE);
      wholeWord.setText("単語単位で探す(&W)");

      Composite c2 = new Composite(shell, SWT.NONE);
      c2.setLayout(new GridLayout(2, true));

      Button findNext = new Button(c2, SWT.PUSH);
      findNext.setText("下方向へ検索(&N)");
      findNext.addSelectionListener(new SelectionAdapter() {
         public void widgetSelected(SelectionEvent e) {
            doFind(keywordCombo.getText(), true);
         }
      });

      Button findPrev = new Button(c2, SWT.PUSH);
      findPrev.addSelectionListener(new SelectionAdapter() {
         public void widgetSelected(SelectionEvent e) {
            doFind(keywordCombo.getText(), false);
         }
      });
      findPrev.setText("上方向へ検索(&P)");

      Button cancel = new Button(shell, SWT.PUSH);
      GridData gd = new GridData();
      gd.horizontalAlignment = GridData.END;
      cancel.setLayoutData(gd);
      cancel.setText("キャンセル");
      cancel.addSelectionListener(new SelectionAdapter() {
         public void widgetSelected(SelectionEvent e) {
             shell.close();
         }
      });

      shell.pack();
      shell.open();
      Display display = getParent().getDisplay();
      while (!shell.isDisposed()) {
         if (!display.readAndDispatch()) {
            display.sleep();
         }
      }
   }
   private void doFind(String findWord, boolean forwardSearch) {
      //検索が実行されたときにコンボボックスに検索語の履歴を追加
      if (history.contains(findWord) == false) {
         history.add(findWord);
      }

      IDocument doc = viewer.getDocument();

      try {
         //検索結果が存在しなければ-1を返す
         int pos =
            doc.search(
               findOffset,
               findWord,
               forwardSearch,
               matchCase.getSelection(),
               wholeWord.getSelection());

         System.out.println("pos: " + pos);
         System.out.println("findOffset: " + findOffset);
         if (pos != -1) {
            viewer.setSelectedRange(pos, findWord.length());
            if (forwardSearch) {
               if (pos + 1 > doc.getLength()) {
                  findOffset = pos;
               } else {
                  findOffset = pos + 1;
               }
            } else {
               System.out.println("-- pos: " + (pos - 1));
               if (pos - 1 > 0) {
                  findOffset = pos - 1;
               } else {
                  findOffset = pos;
               }
            }
         }
      } catch (BadLocationException e) {
         e.printStackTrace();
      }

   }
}


最新更新日: 2004年10月23日
 
関連リンク
Eclipse API ドキュメント
Document
TextViewer

- PR -

プレゼンテーション作成ソフト無料お試し版配信中

【Sony】大手他社よりも安い!ビジネス向け光・100Mしかも固定IP付!今なら更に初期費用最大15,000円OFF!

オフィス用品・オフィス家具 価 格 交 渉 可! 
◎ 目指せ★業界最安値 ★ ◎ オフィネット・ドットコム株式会社

注文から納品まで驚きの早さ!!【ASKULカタログ】はこちらから・・・

マイクロソフト お得な見積! まとめての購入ならオトクな方法で。ライセンスだから管理も簡単。


Copyright(C) 2003,2004 Jasmin Project. All Right Reserved.
SEO [PR] おまとめローン Windows7 冷え性対策 動画 掲示板 レンタルサーバー ライブチャット SEO