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