« テキストエディタからのIEditorInput,IDocumentオブジェクトの取得 | トップページ | 洋書到着! »

2004.01.18

テキストエディタのワードラップをONにするには?

Eclipseを使っていて,気に食わない点が一つある。それは「テキストエディタにワードラップ機能がない」という点だ。今までEmacsやPeggyPro for Oracle,Danaや秀丸,JBuilderやVisual Age for Java,Visual Cafe(懐かしい!)など,数多くのエディタでJavaのソースコードを書いてきたが,どれもワードラップ(1行の文字数がエディタの幅を超えた場合に自動改行する)機能が搭載されていて,必ずワードラップを効かせていた。僕は横スクロールが嫌いなのだ。

でも,いくらメニューや設定ダイアログを探しても,Eclipse内でワードラップに関する設定が見つからない(知ってる人がいたら,ぜひ教えてください)。しかし,テキストエディタで使われているであろうSWTのコンポーネントに,まさかワードラップ機能が搭載されていないなんてわけはないよね!?と勝手に思い込み,せめて自作のエディタではワードラップができるようにしたいと思って,試してみました。

Eclipseのテキストエディタは内部にSourceViewerオブジェクトを抱えていて,そのSourceViewerオブジェクトは実際のテキストエディタコンポーネントとしてSWTのStyledTextオブジェクトが使用されています。このStyledTextクラスに,しっかりとワードラップの機能が搭載されていました。つまり,TextEditorオブジェクトからどんどん辿ってStyledTextオブジェクトが取得できれば,それに対してワードラップを有効にすることで,ちゃんと自動改行されるようになります。これは以下のコードで実現できます。

  class MyTextEditor extends TextEditor {
    protected ISourceViewer createSourceViewer(
          Composite parent, IVerticalRuler ruler, int styles) {
      ISourceViewer sourceViewer =
        super.createSourceViewer(parent, ruler, styles);
      StyledText styledText = sourceViewer.getTextWidget();
      styledText.setWordWrap(true);
      return sourceViewer;
    }
  }

テキストエディタでは,SourceViewerオブジェクトを自由に入れ替えられるように,createSourceViewerメソッドが用意されている。このメソッドをオーバーライドし,TextEditorクラスのデフォルト実装で生成されたSourceViewerオブジェクトからgetTextWidgetメソッドでStyledTextオブジェクトを取り出し,それに対してsetWordWrapメソッドにtureを渡して呼び出すことでワードラップ機能をONにできます。

SourceViewerオブジェクトは,AbstractTextEditor#getSourceViewer()でも取得することができる。しかし,コンストラクタ,initメソッド,initializeEditorメソッド,setSourceViewerConfigurationメソッドで試してみたが,どれもgetSourceViewerメソッドはnullを返してきた。AWTのpeerの確定がオブジェクトの生成時ではないように,SourceViewerオブジェクトの生成もエディタがワークベンチにaddPageされるときに行われるらしく,createSourceViewerメソッドで行うのが正しいかな,と思われる。

|

« テキストエディタからのIEditorInput,IDocumentオブジェクトの取得 | トップページ | 洋書到着! »

コメント

StyledTextのワードラップをOnにしてしまうと、カーソル行強調表示(CursorLinePainter)や行番号(LineNumberRulerColumn)の動作がおかしくなった気がするのですが、どうでしょう?

投稿: D | 2004.01.18 11:40 午後

コメントありがとうございます。いま動作を確認してみましたが,ご指摘の通りですね。デフォルトの実装では,StyledTextのワードラップONでカーソル行強調表示と行番号の表示がおかしくなってしまいますね。改行されてしまう分だけ,座標計算にズレが生じてしまうみたいです。
どちらも自作のクラスを作ってデフォルトの操作を置き換えることができれば良いのですが,まだ試していないのでなんとも言えません。。。軽くソースコードを見渡したところ,何とかなりそうな気がしていますが,Dさんは解決策をお持ちでしょうか?

投稿: よういちろう | 2004.01.19 12:21 午前

残念ながら解決策は持ってないです。よういちろうさんの仰るように自作して置き換えるしかないかなと思いつつ、バージョンアップと共に直るんじゃないかと寝て待っているだけだったりします(><

投稿: D | 2004.01.20 12:34 午前

はぃ,バージョンアップでワードラップをEclipseの機能として搭載してくれると嬉しいですね。ただ,Eclipseは洋物なので,ワードラップ機能は今後搭載を期待するのは厳しいかもしれないですね。署名活動でもすれば搭載されるかもしれませんが。。。
行番号のルーラーについては,がんばって自作すればできるかもしれません。ただし,現在行ハイライトについては,ちょっと無理そうですね。。。どちらにしても,大掛かりなものになってしまいそうです。

投稿: よういちろう | 2004.01.20 12:13 午後

コメントを書く



(ウェブ上には掲載しません)




トラックバック

この記事のトラックバックURL:
http://app.cocolog-nifty.com/t/trackback/12631/113209

この記事へのトラックバック一覧です: テキストエディタのワードラップをONにするには?:

« テキストエディタからのIEditorInput,IDocumentオブジェクトの取得 | トップページ | 洋書到着! »