100b00812cd0c883c2380065d7fda29512d5477f0Jeff Sharkey/*
200b00812cd0c883c2380065d7fda29512d5477f0Jeff Sharkey * Copyright (C) 2013 The Android Open Source Project
300b00812cd0c883c2380065d7fda29512d5477f0Jeff Sharkey *
400b00812cd0c883c2380065d7fda29512d5477f0Jeff Sharkey * Licensed under the Apache License, Version 2.0 (the "License");
500b00812cd0c883c2380065d7fda29512d5477f0Jeff Sharkey * you may not use this file except in compliance with the License.
600b00812cd0c883c2380065d7fda29512d5477f0Jeff Sharkey * You may obtain a copy of the License at
700b00812cd0c883c2380065d7fda29512d5477f0Jeff Sharkey *
800b00812cd0c883c2380065d7fda29512d5477f0Jeff Sharkey *      http://www.apache.org/licenses/LICENSE-2.0
900b00812cd0c883c2380065d7fda29512d5477f0Jeff Sharkey *
1000b00812cd0c883c2380065d7fda29512d5477f0Jeff Sharkey * Unless required by applicable law or agreed to in writing, software
1100b00812cd0c883c2380065d7fda29512d5477f0Jeff Sharkey * distributed under the License is distributed on an "AS IS" BASIS,
1200b00812cd0c883c2380065d7fda29512d5477f0Jeff Sharkey * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1300b00812cd0c883c2380065d7fda29512d5477f0Jeff Sharkey * See the License for the specific language governing permissions and
1400b00812cd0c883c2380065d7fda29512d5477f0Jeff Sharkey * limitations under the License.
1500b00812cd0c883c2380065d7fda29512d5477f0Jeff Sharkey */
1600b00812cd0c883c2380065d7fda29512d5477f0Jeff Sharkey
1700b00812cd0c883c2380065d7fda29512d5477f0Jeff Sharkeypackage com.android.terminal;
1800b00812cd0c883c2380065d7fda29512d5477f0Jeff Sharkey
1900b00812cd0c883c2380065d7fda29512d5477f0Jeff Sharkeyimport static com.android.terminal.Terminal.TAG;
2000b00812cd0c883c2380065d7fda29512d5477f0Jeff Sharkey
2100b00812cd0c883c2380065d7fda29512d5477f0Jeff Sharkeyimport android.content.Context;
2200b00812cd0c883c2380065d7fda29512d5477f0Jeff Sharkeyimport android.graphics.Canvas;
2300b00812cd0c883c2380065d7fda29512d5477f0Jeff Sharkeyimport android.graphics.Color;
2400b00812cd0c883c2380065d7fda29512d5477f0Jeff Sharkeyimport android.util.Log;
2500b00812cd0c883c2380065d7fda29512d5477f0Jeff Sharkeyimport android.view.View;
2600b00812cd0c883c2380065d7fda29512d5477f0Jeff Sharkey
2700b00812cd0c883c2380065d7fda29512d5477f0Jeff Sharkeyimport com.android.terminal.TerminalView.TerminalMetrics;
2800b00812cd0c883c2380065d7fda29512d5477f0Jeff Sharkey
2900b00812cd0c883c2380065d7fda29512d5477f0Jeff Sharkey/**
3000b00812cd0c883c2380065d7fda29512d5477f0Jeff Sharkey * Rendered contents of a single line of a {@link Terminal} session.
3100b00812cd0c883c2380065d7fda29512d5477f0Jeff Sharkey */
3200b00812cd0c883c2380065d7fda29512d5477f0Jeff Sharkeypublic class TerminalLineView extends View {
3300b00812cd0c883c2380065d7fda29512d5477f0Jeff Sharkey    public int pos;
3400b00812cd0c883c2380065d7fda29512d5477f0Jeff Sharkey    public int row;
3500b00812cd0c883c2380065d7fda29512d5477f0Jeff Sharkey    public int cols;
3600b00812cd0c883c2380065d7fda29512d5477f0Jeff Sharkey
3700b00812cd0c883c2380065d7fda29512d5477f0Jeff Sharkey    private final Terminal mTerm;
3800b00812cd0c883c2380065d7fda29512d5477f0Jeff Sharkey    private final TerminalMetrics mMetrics;
3900b00812cd0c883c2380065d7fda29512d5477f0Jeff Sharkey
4000b00812cd0c883c2380065d7fda29512d5477f0Jeff Sharkey    public TerminalLineView(Context context, Terminal term, TerminalMetrics metrics) {
4100b00812cd0c883c2380065d7fda29512d5477f0Jeff Sharkey        super(context);
4200b00812cd0c883c2380065d7fda29512d5477f0Jeff Sharkey        mTerm = term;
4300b00812cd0c883c2380065d7fda29512d5477f0Jeff Sharkey        mMetrics = metrics;
4400b00812cd0c883c2380065d7fda29512d5477f0Jeff Sharkey    }
4500b00812cd0c883c2380065d7fda29512d5477f0Jeff Sharkey
4600b00812cd0c883c2380065d7fda29512d5477f0Jeff Sharkey    @Override
4700b00812cd0c883c2380065d7fda29512d5477f0Jeff Sharkey    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
4800b00812cd0c883c2380065d7fda29512d5477f0Jeff Sharkey        setMeasuredDimension(getDefaultSize(0, widthMeasureSpec),
4900b00812cd0c883c2380065d7fda29512d5477f0Jeff Sharkey                getDefaultSize(mMetrics.charHeight, heightMeasureSpec));
5000b00812cd0c883c2380065d7fda29512d5477f0Jeff Sharkey    }
5100b00812cd0c883c2380065d7fda29512d5477f0Jeff Sharkey
5200b00812cd0c883c2380065d7fda29512d5477f0Jeff Sharkey    @Override
5300b00812cd0c883c2380065d7fda29512d5477f0Jeff Sharkey    protected void onDraw(Canvas canvas) {
5400b00812cd0c883c2380065d7fda29512d5477f0Jeff Sharkey        super.onDraw(canvas);
5500b00812cd0c883c2380065d7fda29512d5477f0Jeff Sharkey
5600b00812cd0c883c2380065d7fda29512d5477f0Jeff Sharkey        if (mTerm == null) {
5700b00812cd0c883c2380065d7fda29512d5477f0Jeff Sharkey            Log.w(TAG, "onDraw() without a terminal");
5800b00812cd0c883c2380065d7fda29512d5477f0Jeff Sharkey            canvas.drawColor(Color.MAGENTA);
5900b00812cd0c883c2380065d7fda29512d5477f0Jeff Sharkey            return;
6000b00812cd0c883c2380065d7fda29512d5477f0Jeff Sharkey        }
6100b00812cd0c883c2380065d7fda29512d5477f0Jeff Sharkey
6200b00812cd0c883c2380065d7fda29512d5477f0Jeff Sharkey        final TerminalMetrics m = mMetrics;
6300b00812cd0c883c2380065d7fda29512d5477f0Jeff Sharkey
6400b00812cd0c883c2380065d7fda29512d5477f0Jeff Sharkey        for (int col = 0; col < cols;) {
6500b00812cd0c883c2380065d7fda29512d5477f0Jeff Sharkey            mTerm.getCellRun(row, col, m.run);
6600b00812cd0c883c2380065d7fda29512d5477f0Jeff Sharkey
6700b00812cd0c883c2380065d7fda29512d5477f0Jeff Sharkey            m.bgPaint.setColor(m.run.bg);
6800b00812cd0c883c2380065d7fda29512d5477f0Jeff Sharkey            m.textPaint.setColor(m.run.fg);
6900b00812cd0c883c2380065d7fda29512d5477f0Jeff Sharkey
7000b00812cd0c883c2380065d7fda29512d5477f0Jeff Sharkey            final int x = col * m.charWidth;
7100b00812cd0c883c2380065d7fda29512d5477f0Jeff Sharkey            final int xEnd = x + (m.run.colSize * m.charWidth);
7200b00812cd0c883c2380065d7fda29512d5477f0Jeff Sharkey
7300b00812cd0c883c2380065d7fda29512d5477f0Jeff Sharkey            canvas.save();
7400b00812cd0c883c2380065d7fda29512d5477f0Jeff Sharkey            canvas.translate(x, 0);
7500b00812cd0c883c2380065d7fda29512d5477f0Jeff Sharkey            canvas.clipRect(0, 0, m.run.colSize * m.charWidth, m.charHeight);
7600b00812cd0c883c2380065d7fda29512d5477f0Jeff Sharkey
7700b00812cd0c883c2380065d7fda29512d5477f0Jeff Sharkey            canvas.drawPaint(m.bgPaint);
7800b00812cd0c883c2380065d7fda29512d5477f0Jeff Sharkey            canvas.drawPosText(m.run.data, 0, m.run.dataSize, m.pos, m.textPaint);
7900b00812cd0c883c2380065d7fda29512d5477f0Jeff Sharkey
8000b00812cd0c883c2380065d7fda29512d5477f0Jeff Sharkey            canvas.restore();
8100b00812cd0c883c2380065d7fda29512d5477f0Jeff Sharkey
8200b00812cd0c883c2380065d7fda29512d5477f0Jeff Sharkey            col += m.run.colSize;
8300b00812cd0c883c2380065d7fda29512d5477f0Jeff Sharkey        }
845b68e8ad082625206492ca9baf889f8c5427eb01Tom Marshall
855b68e8ad082625206492ca9baf889f8c5427eb01Tom Marshall        if (mTerm.getCursorVisible() && mTerm.getCursorRow() == row) {
865b68e8ad082625206492ca9baf889f8c5427eb01Tom Marshall            canvas.save();
875b68e8ad082625206492ca9baf889f8c5427eb01Tom Marshall            canvas.translate(mTerm.getCursorCol() * m.charWidth, 0);
885b68e8ad082625206492ca9baf889f8c5427eb01Tom Marshall            canvas.drawRect(0, 0, m.charWidth, m.charHeight, m.cursorPaint);
895b68e8ad082625206492ca9baf889f8c5427eb01Tom Marshall            canvas.restore();
905b68e8ad082625206492ca9baf889f8c5427eb01Tom Marshall        }
915b68e8ad082625206492ca9baf889f8c5427eb01Tom Marshall
9200b00812cd0c883c2380065d7fda29512d5477f0Jeff Sharkey    }
9300b00812cd0c883c2380065d7fda29512d5477f0Jeff Sharkey}
94