
#include "more.h"

int More::find_end ()
{
  int end  = idx;

  for(int i=1;i<=23;i++) {
    end = s.index("\n",end);
    if(end==-1) {
      end = s.length();
      break;
    }
  }
  return end;
}

void More::display()
{
  int end = find_end();
  u->write_ClearScreen();
  u->write(s.at(idx,end-idx));
  if(end==s.length()) {
    if(s.at(end)!='\n') u->write("\n");
    u->write("--MuchLess--(end) Press [pq] (p)rev, (q)uit");
  }
  else {
    u->write("--MuchLess--");
    if(idx==0) u->write("(beg)"); else u->write("   ");
    u->write(" Press [npq] (n)ext, (p)rev, (q)uit");
  }
}

void More::prev ()
{
  String p = s.before(idx);
  p.reverse();
  int beg = idx;
  for(int i=1;i<=23;i++) {
    beg = p.index("\n",beg);
    if(beg==-1) {
      beg = p.length();;
      break;
    }
  }
  idx = idx - beg;
}

void More::next ()
{
  int end = find_end();
  if(end==s.length()) return;
  idx = end+1;
}

bool More::cmd (char c)
{
  switch (c)
    {
    case 'Q':
    case 'q': idx =0; return 0;
    case 'N':
    case 'n': next(); display(); return 1;
    case 'P':
    case 'p': prev(); display(); return 1;
    default: return 1;
    }
}

void More::run ()
{
  int  cnt;
  char c;
  while (1) {
    cnt = u->read(&c,1);
    if(cnt<0) return;
    if(cnt==0) continue;
    if(cnt==1) if(!cmd(c)) return;
  }
}
