Beispiel #1
0
int EBuffer::FoldCreate(int Line) { /*FOLD00*/
  int n;

  if (Modify() == 0) return 0;

  if (FindFold(Line) != -1) return 1;  // already exists

  if (BFI(this, BFI_Undo)) {
    if (PushULong(Line) == 0) return 0;

    if (PushUChar(ucFoldCreate) == 0) return 0;
  }

  n = FindNearFold(Line);
  n++;
  FF = (EFold *)realloc((void *)FF, sizeof(EFold) * ((1 + FCount) | 7));
  assert(FF != 0);
  memmove(FF + n + 1, FF + n, sizeof(EFold) * (FCount - n));
  FCount++;
  FF[n].line  = Line;
  FF[n].level = 0;
  FF[n].open  = 1;
  FF[n].flags = 0;
  Draw(Line, Line);
  return 1;
}
Beispiel #2
0
int EBuffer::FoldOpen(int Line) { /*FOLD00*/
  int f = FindFold(Line);
  int l;
  int level, toplevel;
  int top;

  if (f == -1) return 0;

  if (FF[f].open == 1) return 1;  // already open

  if (Modify() == 0) return 0;

  if (BFI(this, BFI_Undo)) {
    if (PushULong(Line) == 0) return 0;

    if (PushUChar(ucFoldOpen) == 0) return 0;
  }

  FF[f].open = 1;
  top        = FF[f].line;
  toplevel   = FF[f].level;

  //    printf("Fold starts with %d\n", FF[f].line);
  if (ShowRow(FF[f].line) == 0) return 0;

  while (f < FCount) {
    level = FF[f].level;

    if (FF[f].open == 1) {
      // fold is open
      if (f == FCount - 1) {
        for (l = FF[f].line; l < RCount; l++)
          if (l != top) if (ShowRow(l) == 0) return 0;
      } else {
        for (l = FF[f].line; l < FF[f + 1].line; l++)
          if (l != top) if (ShowRow(l) == 0) return 0;
      }
      f++;
    } else { // fold is closed
      // show head line
      if (ShowRow(FF[f].line) == 0) return 0;

      // skip closed folds
      while ((f < FCount) && (level < FF[f + 1].level)) f++;
      f++;
    }

    if ((f < FCount) && (FF[f].level <= toplevel)) break;
  }
  return 1;
}
Beispiel #3
0
int EBuffer::FoldDestroy(int Line) { /*FOLD00*/
  int f = FindFold(Line);

  if (Modify() == 0) return 0;

  if (f == -1) return 0;

  if (FF[f].open == 0) if (FoldOpen(Line) == 0) return 0;

  if (BFI(this, BFI_Undo)) {
    if (PushULong(FF[f].level) == 0) return 0;

    if (PushULong(Line) == 0) return 0;

    if (PushUChar(ucFoldDestroy) == 0) return 0;
  }

  memmove(FF + f, FF + f + 1, sizeof(EFold) * (FCount - f - 1));
  FCount--;
  FF = (EFold *)realloc((void *)FF, sizeof(EFold) * (FCount | 7));
  Draw(Line, Line);
  return 1;
}
Beispiel #4
0
int EBuffer::FoldClose(int Line) { /*FOLD00*/
  int f = FindNearFold(Line);
  int l, top;
  int level;

  if (f == -1) return 0;

  if (FF[f].open == 0) return 1;  // already closed

  if (Modify() == 0) return 0;

  if (SetPosR(CP.Col, FF[f].line, tmLeft) == 0) return 0;

  if (BFI(this, BFI_Undo)) {
    if (PushULong(Line) == 0) return 0;

    if (PushUChar(ucFoldClose) == 0) return 0;
  }

  FF[f].open = 0;
  top        = FF[f].line;
  level      = FF[f].level;

  while ((f < FCount - 1) && (FF[f + 1].level > level)) f++;

  /* performance tweak: do it in reverse (we'll see if it helps) */

  if (f == FCount - 1) {
    for (l = RCount - 1; l > top; l--) if (HideRow(l) == 0) return 0;
  } else {
    for (l = FF[f + 1].line - 1; l > top; l--) if (HideRow(l) == 0) return 0;
  }

  /* yup, it does. try below for a (MUCH!) slower version */

  /*if (f == FCount - 1) {
     for (l = top + 1; l < RCount; l++)
     if (HideRow(l) == 0) return 0;
     } else {
     for (l = top + 1; l < FF[f + 1].line; l++)
     if (HideRow(l) == 0) return 0;
     }*/
  return 1;
}
Beispiel #5
0
int EBuffer::FoldDemote(int Line) { /*FOLD00*/
  int f = FindFold(Line);

  if (Modify() == 0) return 0;

  if (f == -1) return 0;

  if (FF[f].open == 0) return 0;

  if (FF[f].level == 99) return 0;

  if (BFI(this, BFI_Undo)) {
    if (PushULong(Line) == 0) return 0;

    if (PushUChar(ucFoldDemote) == 0) return 0;
  }

  if ((FF[f].line > 0) && (ExposeRow(FF[f].line - 1) == 0)) return 0;

  FF[f].level++;
  Draw(Line, Line);
  return 1;
}
Beispiel #6
0
int EBuffer::BlockKill() {
    EPoint B, E;
    int L;
    int Y = -1;

    AutoExtend = 0;
    if (CheckBlock() == 0) return 0;
    if (RCount <= 0) return 0;
    B = BB;
    E = BE;
    Draw(B.Row, -1);
    //    if (MoveToPos(B.Col, B.Row) == 0) return 0;

#ifdef CONFIG_UNDOREDO
    if (BFI(this, BFI_Undo) == 1) {
        if (PushULong(CP.Col) == 0) return 0;
        if (PushULong(CP.Row) == 0) return 0;
        if (PushUChar(ucPosition) == 0) return 0;
    }
#endif

    switch (BlockMode) {
    case bmLine:
        Y = VToR(CP.Row);
        if (Y >= B.Row) {
            if (Y >= E.Row) {
                if (SetPosR(CP.Col, Y - (E.Row - B.Row)) == 0) return 0;
            } else {
                if (SetPosR(CP.Col, B.Row) == 0) return 0;
            }
        }
        for (L = B.Row; L < E.Row; L++)
            if (DelLine(B.Row) == 0) return 0;
        break;

    case bmColumn:
        Y = VToR(CP.Row);
        if (Y >= B.Row && Y < E.Row) {
            if (CP.Col >= B.Col) {
                if (CP.Col >= E.Col) {
                    if (SetPos(CP.Col - (E.Col - B.Col), CP.Row) == 0) return 0;
                } else {
                    if (SetPos(B.Col, CP.Row) == 0) return 0;
                }
            }
        }
        for (L = B.Row; L < E.Row; L++)
            if (DelText(L, B.Col, E.Col - B.Col) == 0) return 0;
        break;

    case bmStream:
        Y = VToR(CP.Row);

        if (B.Row == E.Row) {
            if (Y == B.Row) {
                if (CP.Col >= B.Col) {
                    if (CP.Col >= E.Col) {
                        if (SetPos(CP.Col - (E.Col - B.Col), CP.Row) == 0) return 0;
                    } else {
                        if (SetPos(B.Col, CP.Row) == 0) return 0;
                    }
                }
            }
            if (DelText(B.Row, B.Col, E.Col - B.Col) == 0) return 0;
        } else {
            if (Y >= B.Row) {
                if (Y > E.Row || (Y == E.Row && E.Col == 0)) {
                    if (SetPosR(CP.Col, Y - (E.Row - B.Row)) == 0) return 0;
                } else if (Y == E.Row) {
                    if (CP.Col >= E.Col) {
                        if (SetPosR(CP.Col - E.Col + B.Col, B.Row) == 0) return 0;
                    } else {
                        if (SetPosR(B.Col, B.Row) == 0) return 0;
                    }
                } else {
                    if (SetPosR(B.Col, B.Row) == 0) return 0;
                }
            }
            if (DelText(E.Row, 0, E.Col) == 0) return 0;
            for (L = B.Row + 1; L < E.Row; L++)
                if (DelLine(B.Row + 1) == 0) return 0;
            if (DelText(B.Row, B.Col, -1) == 0) return 0;
            if (JoinLine(B.Row, B.Col) == 0) return 0;
        }
        break;
    }
    return BlockUnmark();
}