00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019 #include "TEHistory.h"
00020 #include <stdlib.h>
00021 #include <assert.h>
00022 #include <stdio.h>
00023 #include <sys/types.h>
00024 #include <unistd.h>
00025 #include <errno.h>
00026
00027 #include <qpe/config.h>
00028
00029 #define HERE printf("%s(%d): here\n",__FILE__,__LINE__)
00030
00031
00032
00033
00034
00035
00036
00037
00038
00039
00040
00041
00042
00043
00044
00045
00046
00047
00048 HistoryScroll::HistoryScroll()
00049 {
00050 m_lines = NULL;
00051 m_max_lines = 0;
00052 m_cells = NULL;
00053 m_max_cells = 0;
00054 m_num_lines = 0;
00055 m_first_line = 0;
00056 m_last_cell = 0;
00057 m_start_line = 0;
00058 }
00059
00060 HistoryScroll::~HistoryScroll()
00061 {
00062 setSize(0,0);
00063 }
00064
00065 void HistoryScroll::setSize(int lines, int cells)
00066 {
00067
00068
00069 if (m_lines) {
00070 delete m_lines;
00071 m_lines = NULL;
00072 }
00073 if (m_cells) {
00074 delete m_cells;
00075 m_cells = NULL;
00076 }
00077 m_max_lines = m_max_cells = 0;
00078 if (lines > 0 && cells > 0) {
00079 m_max_lines = lines;
00080 m_lines = new int[m_max_lines];
00081 m_lines[0] = 0;
00082 m_max_cells = cells;
00083 m_cells = new ca[m_max_cells];
00084 }
00085 m_first_line = 0;
00086 m_num_lines = 0;
00087 m_last_cell = 0;
00088 m_start_line = 0;
00089 }
00090
00091 void HistoryScroll::setScroll(bool on)
00092 {
00093 Config cfg( "Konsole" );
00094 cfg.setGroup("History");
00095
00096 if (on) {
00097 int lines = cfg.readNumEntry("history_lines",300);
00098 int avg_line = cfg.readNumEntry("avg_line_length",60);
00099 int cells = lines * avg_line;
00100 setSize(lines,cells);
00101 } else {
00102 setSize(0,0);
00103 }
00104 }
00105
00106 bool HistoryScroll::hasScroll()
00107 {
00108 return (m_max_lines > 0);
00109 }
00110
00111 int HistoryScroll::getLines()
00112 {
00113 return(m_num_lines);
00114 }
00115
00116 int HistoryScroll::getLineLen(int lineno)
00117 {
00118 if (!hasScroll()) return 0;
00119 if (lineno >= m_num_lines) {
00120
00121 return(0);
00122 }
00123 int len = startOfLine(lineno+1) - startOfLine(lineno);
00124 if (len < 0) {
00125 len += m_max_cells;
00126 }
00127
00128 return(len);
00129 }
00130
00131 int HistoryScroll::startOfLine(int lineno)
00132 {
00133
00134 if (!hasScroll()) return 0;
00135 assert(lineno >= 0 && lineno <= m_num_lines);
00136 if (lineno < m_num_lines) {
00137 int index = lineno + m_first_line;
00138 if (index >= m_max_lines)
00139 index -= m_max_lines;
00140
00141 return(m_lines[index]);
00142 } else {
00143
00144 return(m_last_cell);
00145 }
00146 }
00147
00148 void HistoryScroll::getCells(int lineno, int colno, int count, ca *res)
00149 {
00150
00151 assert(hasScroll());
00152 assert(lineno >= 0 && lineno < m_num_lines);
00153 int index = lineno + m_first_line;
00154 if (index >= m_max_lines)
00155 index -= m_max_lines;
00156 assert(index >= 0 && index < m_max_lines);
00157 index = m_lines[index] + colno;
00158 assert(index >= 0 && index < m_max_cells);
00159 while(count-- > 0) {
00160 *res++ = m_cells[index];
00161 if (++index >= m_max_cells) {
00162 index = 0;
00163 }
00164 }
00165 }
00166
00167 void HistoryScroll::addCells(ca *text, int count)
00168 {
00169 if (!hasScroll()) return;
00170 int start_cell = m_last_cell;
00171
00172
00173 if (count <= 0) {
00174 return;
00175 }
00176 while(count-- > 0) {
00177 assert (m_last_cell >= 0 && m_last_cell < m_max_cells );
00178 m_cells[m_last_cell] = *text++;
00179 if (++m_last_cell >= m_max_cells) {
00180 m_last_cell = 0;
00181 }
00182 }
00183 if (m_num_lines > 1) {
00184 if (m_last_cell > start_cell) {
00185 while(m_num_lines > 0
00186 && m_lines[m_first_line] >= start_cell
00187 && m_lines[m_first_line] < m_last_cell) {
00188
00189
00190
00191 if (++m_first_line >= m_max_lines) {
00192 m_first_line = 0;
00193 }
00194 m_num_lines--;
00195 }
00196 } else {
00197 while(m_num_lines > 0
00198 && (m_lines[m_first_line] >= start_cell
00199 || m_lines[m_first_line] < m_last_cell)) {
00200
00201
00202
00203 if (++m_first_line >= m_max_lines) {
00204 m_first_line = 0;
00205 }
00206 m_num_lines--;
00207 }
00208 }
00209 }
00210 }
00211
00212 void HistoryScroll::addLine()
00213 {
00214 if (!hasScroll()) return;
00215 int index = m_first_line + m_num_lines;
00216 if (index >= m_max_lines) {
00217 index -= m_max_lines;
00218 }
00219
00220 assert(index >= 0 && index < m_max_lines);
00221 m_lines[index] = m_start_line;
00222 m_start_line = m_last_cell;
00223 if (m_num_lines >= m_max_lines) {
00224 if (++m_first_line >= m_num_lines) {
00225 m_first_line = 0;
00226 }
00227 } else {
00228 m_num_lines++;
00229 }
00230 }