マイペースなプログラミング日記

DTMやプログラミングにお熱なd-kamiがマイペースに書くブログ

簡易テキストエディタ作成 その4

今回はスクロール機能を実装する予定だったが、予定を変えて少しソースコードの整理をすることにした。まずは定数クラスを作成した。これはViewInfoのキーで使われる文字列を定数にした

package text.edit.info;

public class ConstName {
    public static final String EDITOR_FONT_SIZE = "Editor.FontSize";
    public static final String EDITOR_WIDTH = "Editor.Width";
    public static final String EDITOR_HEIGHT = "Editor.Height";
    
    public static final String SCROLL_X = "Scroll.X";
    public static final String SCROLL_Y = "Scroll.Y";
    
    public static final String CARET_ROW = "Caret.Row";
    public static final String CARET_COLUMN = "Caret.Column";
}

この変更に伴っていくつか変更箇所があるEditorViewのinitViewInfoとonDrawである。ただ文字列を定数に変えただけ

private void initViewInfo(){
    viewInfo = new ViewInfo();
    viewInfo.put(ConstName.EDITOR_FONT_SIZE, fontSize);
        
    viewInfo.put(ConstName.SCROLL_X, 0);
    viewInfo.put(ConstName.SCROLL_Y, 0);
        
    viewInfo.put(ConstName.CARET_ROW, 0);
    viewInfo.put(ConstName.CARET_COLUMN, 0);
}
@Override
protected void onDraw(Canvas canvas){
    viewInfo.put(ConstName.EDITOR_WIDTH, getWidth());
    viewInfo.put(ConstName.EDITOR_HEIGHT, getHeight());
    TextPaint paint = new TextPaint();
        
    rowRuler.drawRuler(canvas, viewInfo, paint);
    drawText(canvas, document.getText(), paint);
}

あとはRowRulerを変更した。背景描画と行数描画を別のメソッドに分けた。ついでに行数を右揃えで描画するようにしてみた。あとは先程の定数の変更を行った

package text.edit.view;

import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Canvas;
import android.text.TextPaint;

import text.edit.info.ConstName;
import text.edit.info.ViewInfo;

public class RowRuler implements Ruler{
    private static final int DEFAULT_PLACE = 5;
    private int place;
    
    public RowRuler(){
        place = RowRuler.DEFAULT_PLACE;
    }
    
    public RowRuler(int place){
        this.place = place;
    }
    
    public void drawRuler(Canvas canvas, ViewInfo viewInfo, TextPaint paint){
        int fontSize = viewInfo.getInt(ConstName.EDITOR_FONT_SIZE);
        int width = (fontSize / 2) * 5;
        int height = (viewInfo.getInt(ConstName.EDITOR_HEIGHT));
        
        int srcColor = paint.getColor();
        Paint.Style srcStyle = paint.getStyle();
        
        drawBackground(canvas, width, height, paint);
        drawLineNumber(canvas, width, height, viewInfo, paint);
        
        paint.setColor(srcColor);
        paint.setStyle(srcStyle);
        
        canvas.translate(width + 4, 0);
    }
    
    //背景描画
    private void drawBackground(Canvas canvas, int width, int height, TextPaint paint){
        int srcColor = paint.getColor();
        Paint.Style srcStyle = paint.getStyle();
        
        paint.setStyle(Paint.Style.FILL);
        paint.setColor(0xFFFFCC00);
        canvas.drawRect(0, 0, width, height, paint);
        
        //このメソッドが呼ばれる前のスタイルと色に戻す
        paint.setStyle(srcStyle);
        paint.setColor(srcColor);
    }
    
    //行数描画
    private void drawLineNumber(Canvas canvas, int width, int height, ViewInfo viewInfo, TextPaint paint){
        int srcColor = paint.getColor();
        int fontSize = viewInfo.getInt(ConstName.EDITOR_FONT_SIZE);
        paint.setColor(Color.BLACK);
        
        int row = 0;
        
        for(int y = fontSize; y <= height; y += fontSize){
            String rowNumber = String.format("%0" + place + "d", ++row);
            int x = alignRight(rowNumber, width, paint);
            
            canvas.drawText(rowNumber, x, y, paint);
        }
        
        //このメソッドが呼ばれる前の色に戻す
        paint.setColor(srcColor);
    }
    
    //渡された文字列が幅widthの領域の中で右揃えになるようなx座標を返す
    private int alignRight(String text, int width, TextPaint paint){
        return width - (int)paint.measureText(text, 0, text.length());
    }
}