« Wiz | トップページ | Zaurusでエディタを作ろう~ 5 »

2008年12月 6日 (土)

Zaurusでエディタを作ろう~ 4

第4回。画面表示その他1(細かいところ)

前回はトバし過ぎたので今回はちょっと軽く行きます。

まずは単語単位認識。ZEditorで単語選択用に使用しているQpeEditor::getCharType()メソッドを流用させてもらいます。
このメソッドは与えられた1文字がどんな種類の文字かを返すメソッドですが、これにもう一段、半角英大文字と半角英小文字、半角数字、半角アンスコを同一種類として返すメソッドを被せます。
大文字に対しても同様、あとは漢字やひらカナ記号など、単語の境界として認識させたい分類を返すように実装します。

単語として認識させたい予約語や検索文字列の先頭とその1文字前、最後とその1文字後の文字種をそれぞれチェックして両方とも違うと判定されたらそれは「単語」ということになります。
文字列が行の先頭や最後のときは、片方の結果だけで判断すればOKですね。

また、ZEditorではQTextCodecで文字コードを変換して比較してましたが、ここは単純にQChar同士の比較にするためUTF-16の生コードに書き換えて実装しました。
実際にパフォーマンステストはしてないですし、気のせいかもしれないですが、QTextCodecは遅いってイメージがあるんで…^^;

QTextCodec *codec = QTextCodec::codecForName( "eucJP" );
if (( c >= codec->toUnicode( "A" )) && ( c <= codec->toUnicode( "Z" )))
    return( CHAR_2B_ALPHA_UPP );

		↓

if (( c >= QChar( 0xff21 /*"A"*/ )) && ( c <= QChar( 0xff3a /*"Z"*/ )))
    return( CHAR_2B_ALPHA_UPP );

単語単位の移動も、カーソル位置の文字を走査していって「別種の文字があったらそこに移動」するようにすれば実装できます。

次に記号関係。CR、EOF、Tab、全角スペース記号QPixmapで表示します。ここもZEditorに倣ってxpmデータからQPixmapデータを生成するのですが、これらの記号の色変更に対応してみました。
#FFFFFFで描いた単色XPMデータをQImageを介してQPixmapに登録するのですが、QImageの状態でパレットの#FFFFFFを任意の色に変更します。

static const char * tab_xpm1[] =
{
    "8 8 2 1",
    ". c None",
    "# c #FFFFFF",
    "........",
    "..#.....",
    "...#....",
    "....#...",
    "...#....",
    "..#.....",
    ".#......",
    "........"
};

QImage QCodeEdit::loadColoredImage( const char* xpm[], QColor color )
{
    QImage img( xpm );
    for ( int i = 0; i < img.numColors(); i++ ) {
        QColor rgb(img.color(i));
        if ( rgb.red() + rgb.green() + rgb.blue() == 255 + 255 + 255 )
            // #FFFFFFのパレットを指定の色に変更
            img.setColor( i, color.rgb() );
    }
    return img;
}

  // こんな感じでQPixmap生成
    QPixmap _pixTab  = loadColoredImage( tab_xpm1,  _colSet[COLOR_TAB].fgColor );

生成したQPixmapデータは、強調文字列の時と同様にpaintCell()内でQPainterオブジェクトに対して描画します。
EOF、Tab、全角スペース記号なんかは"[EOF]""^""□"など、テキストで表示してもいい感じです。

  // xは"\t"の位置
  p.drawPixmap( x, cellHeight() /2 -4, _pixTab );

  // テキストで表示する場合
  p.setPen( _colSet[COLOR_TAB].fgColor );
  p.drawText( x, 0, cellWidth(), cellHeight(), ExpandTabs, "^" );

単語判定と記号表示はこんな感じです。
単語判定はコード拝借拡張&生コード化だけなんでコーディングは全然問題なし。その前にもっと効率のいいロジックが無いか探してた時間の方が長かった位です。
xpmの色替えはリファレンス眺めてて「こんな感じで実装できるかな?」ってのを試作してて2,3回目ぐらいでうまく動いてくれたので結構簡単に実装できました。
毎回これくらいスマートに出来ると気持ち良いのですが、なかなかそうも行かないのが現実だったりします。
ま、そうやって色々やって思い通りに動いた時の楽しさっていうか嬉しさがたまらないのですが。って毎回言ってますねw

|

« Wiz | トップページ | Zaurusでエディタを作ろう~ 5 »

コメント

この記事へのコメントは終了しました。

トラックバック


この記事へのトラックバック一覧です: Zaurusでエディタを作ろう~ 4:

« Wiz | トップページ | Zaurusでエディタを作ろう~ 5 »