⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ctextarea.cpp

📁 Gambas is a graphical development environment based on a Basic interpreter, like Visual Basic. It us
💻 CPP
字号:
/***************************************************************************  CTextArea.cpp  The TextArea class  (c) 2000-2003 Beno顃 Minisini <gambas@users.sourceforge.net>  This program is free software; you can redistribute it and/or modify  it under the terms of the GNU General Public License as published by  the Free Software Foundation; either version 1, or (at your option)  any later version.  This program is distributed in the hope that it will be useful,  but WITHOUT ANY WARRANTY; without even the implied warranty of  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the  GNU General Public License for more details.  You should have received a copy of the GNU General Public License  along with this program; if not, write to the Free Software  Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.***************************************************************************/#define __CTEXTAREA_CPP#include <qapplication.h>#include <qpalette.h>#include <qtextedit.h>#include <qscrollview.h>#include "gambas.h"#include "CTextArea.h"DECLARE_EVENT(EVENT_Change);DECLARE_EVENT(EVENT_Cursor);static void to_pos(QTextEdit *wid, int par, int car, long *pos){  int i, l;  long p = 0;  for (i = 0; i < par; i++)  {    l = wid->paragraphLength(i);    if (l < 0)      break;    p += l + 1;  }  *pos = p + car;}static void from_pos(QTextEdit *wid, long pos, int *par, int *car){  int i;  int l;  for (i = 0; i <= wid->paragraphs(); i++)  {    l = wid->paragraphLength(i);    if (l < 0)    {      pos = wid->length();      i--;      break;    }    if (pos <= l)      break;    pos -= l + 1;  }  *par = i;  *car = pos;}static void look_pos(QTextEdit *wid, int *line, int *col){  if (*line == -1)    *line = wid->paragraphs();  if (*col == -1)    *col = wid->paragraphLength(*line);}static void get_selection(QTextEdit *wid, long *start, long *length){  int pStart, iStart, pEnd, iEnd;  long posEnd;  wid->getSelection(&pStart, &iStart, &pEnd, &iEnd);  if (pStart < 0)  {    wid->getCursorPosition(&pStart, &iStart);    to_pos(wid, pStart, iStart, start);    *length = 0;    return;  }  to_pos(wid, pStart, iStart, start);  to_pos(wid, pEnd, iEnd, &posEnd);  *length = posEnd - *start;}BEGIN_METHOD(CTEXTAREA_new, GB_OBJECT parent)  QTextEdit *wid = new QTextEdit(CONTAINER(VARG(parent)));  QObject::connect(wid, SIGNAL(textChanged()), &CTextArea::manager, SLOT(changed()));  QObject::connect(wid, SIGNAL(cursorPositionChanged(int, int)), &CTextArea::manager, SLOT(cursor()));  CWIDGET_new(wid, (void *)_object, "TextArea");  wid->setTextFormat(Qt::PlainText);  wid->setWordWrap(QTextEdit::NoWrap);  wid->show();END_METHODBEGIN_PROPERTY(CTEXTAREA_text)  if (READ_PROPERTY)    GB.ReturnNewZeroString(TO_UTF8(WIDGET->text()));  else    WIDGET->setText(QSTRING_PROP());END_PROPERTY/*BEGIN_PROPERTY(CTEXTAREA_alignment)  if (READ_PROPERTY)    GB.ReturnInteger(WIDGET->alignment());  else    WIDGET->setAlignment(PROPERTY(long));END_PROPERTY*/BEGIN_PROPERTY(CTEXTAREA_length)#if QT_VERSION <= 0x030005  GB.ReturnInteger(WIDGET->length());#else  int np = WIDGET->paragraphs();  if (np > 0)    np--;  GB.ReturnInteger(WIDGET->length() + np);#endifEND_PROPERTYBEGIN_PROPERTY(CTEXTAREA_read_only)  if (READ_PROPERTY)    GB.ReturnBoolean(WIDGET->isReadOnly());  else    WIDGET->setReadOnly(VPROP(GB_BOOLEAN));END_PROPERTYBEGIN_PROPERTY(CTEXTAREA_wrap)  if (READ_PROPERTY)    GB.ReturnBoolean(WIDGET->wordWrap() != QTextEdit::NoWrap);  else    WIDGET->setWordWrap(      VPROP(GB_BOOLEAN) ? QTextEdit::WidgetWidth : QTextEdit::NoWrap      );END_PROPERTY/*BEGIN_PROPERTY(CTEXTAREA_max_length)  long max;  if (READ_PROPERTY)  {    max = WIDGET->maxLength();    GB.ReturnInteger((max < 0) ? 0 : max);  }  else  {    max = PROPERTY(long);    if (max <= 0)      max = -1;    WIDGET->setMaxLength(max);  }END_PROPERTY*/BEGIN_PROPERTY(CTEXTAREA_line_or_selection)  RETURN_SELF();END_PROPERTYBEGIN_PROPERTY(CTEXTAREA_line)  int line, col;  WIDGET->getCursorPosition(&line, &col);  if (READ_PROPERTY)    GB.ReturnInteger(line);  else  {    line = VPROP(GB_INTEGER);    look_pos(WIDGET, &line, &col);    WIDGET->setCursorPosition(line, col);  }END_PROPERTYBEGIN_PROPERTY(CTEXTAREA_column)  int line, col;  WIDGET->getCursorPosition(&line, &col);  if (READ_PROPERTY)    GB.ReturnInteger(col);  else  {    col = VPROP(GB_INTEGER);    look_pos(WIDGET, &line, &col);    WIDGET->setCursorPosition(line, col);  }END_PROPERTYBEGIN_PROPERTY(CTEXTAREA_pos)  int par, car;  long pos;  if (READ_PROPERTY)  {    WIDGET->getCursorPosition(&par, &car);    to_pos(WIDGET, par, car, &pos);    GB.ReturnInteger(pos);  }  else  {    from_pos(WIDGET, VPROP(GB_INTEGER), &par, &car);    WIDGET->setCursorPosition(par, car);  }END_PROPERTY/*BEGIN_METHOD(CTEXTAREA_select, long line; long col; long selline; long selcol)  MyMultiLineEdit *wid = QMULTILINEEDIT(_object);  int line = PARAM(line);  int col = PARAM(col);  look_pos(wid, &line, &col);  wid->setCursorPosition(line, col);  line = PARAM(selline);  col = PARAM(selcol);  look_pos(wid, &line, &col);  wid->setCursorPosition(line, col, TRUE);END_METHOD*/BEGIN_METHOD_VOID(CTEXTAREA_clear)  WIDGET->clear();END_METHODBEGIN_METHOD(CTEXTAREA_insert, GB_STRING text)  WIDGET->insert(QSTRING_ARG(text));END_METHOD/*BEGIN_METHOD(CTEXTAREA_line_get, long line)  long line = PARAM(line);  if (line < 0 || line >= WIDGET->numLines())    GB.ReturnNull();  else    GB.ReturnNewZeroString(WIDGET->textLine(PARAM(line)));END_METHODBEGIN_PROPERTY(CTEXTAREA_line_count)  GB.ReturnInteger(WIDGET->numLines());END_PROPERTY*//***************************************************************************  .TextArea.Selection***************************************************************************/BEGIN_PROPERTY(CTEXTAREA_sel_text)  if (READ_PROPERTY)    GB.ReturnNewZeroString(TO_UTF8(WIDGET->selectedText()));  else    WIDGET->insert(QSTRING_PROP());END_PROPERTYBEGIN_PROPERTY(CTEXTAREA_sel_length)  long start, length;  get_selection(WIDGET, &start, &length);  GB.ReturnInteger(length);END_PROPERTYBEGIN_PROPERTY(CTEXTAREA_sel_start)  long start, length;  get_selection(WIDGET, &start, &length);  GB.ReturnInteger(start);END_PROPERTYBEGIN_METHOD_VOID(CTEXTAREA_sel_clear)  WIDGET->selectAll(false);END_METHODBEGIN_METHOD(CTEXTAREA_sel_select, GB_INTEGER start; GB_INTEGER length)  int ps, is, pe, ie;  if (MISSING(start) && MISSING(length))    WIDGET->selectAll(true);  else if (!MISSING(start) && !MISSING(length))  {    from_pos(WIDGET, VARG(start), &ps, &is);    from_pos(WIDGET, VARG(start) + VARG(length), &pe, &ie);    WIDGET->setSelection(ps, is, pe, ie);  }END_METHODBEGIN_METHOD(CTEXTAREA_to_pos, GB_INTEGER line; GB_INTEGER col)  long pos;  to_pos(WIDGET, VARG(line), VARG(col), &pos);  GB.ReturnInteger(pos);END_METHODBEGIN_METHOD(CTEXTAREA_to_line, GB_INTEGER pos)  int line, col;  from_pos(WIDGET, VARG(pos), &line, &col);  GB.ReturnInteger(line);END_METHODBEGIN_METHOD(CTEXTAREA_to_col, GB_INTEGER pos)  int line, col;  from_pos(WIDGET, VARG(pos), &line, &col);  GB.ReturnInteger(col);END_METHODBEGIN_METHOD_VOID(CTEXTAREA_copy)  WIDGET->copy();END_METHODBEGIN_METHOD_VOID(CTEXTAREA_cut)  WIDGET->cut();END_METHODBEGIN_METHOD_VOID(CTEXTAREA_paste)  WIDGET->paste();END_METHODBEGIN_METHOD_VOID(CTEXTAREA_undo)  WIDGET->undo();END_METHODBEGIN_METHOD_VOID(CTEXTAREA_redo)  WIDGET->redo();END_METHODBEGIN_PROPERTY(CTEXTAREA_scrollbar)  long scroll;  if (READ_PROPERTY)  {    scroll = 0;    if (WIDGET->hScrollBarMode() == QScrollView::Auto)      scroll += 1;    if (WIDGET->vScrollBarMode() == QScrollView::Auto)      scroll += 2;    GB.ReturnInteger(scroll);  }  else  {    scroll = VPROP(GB_INTEGER) & 3;    WIDGET->setHScrollBarMode( (scroll & 1) ? QScrollView::Auto : QScrollView::AlwaysOff);    WIDGET->setVScrollBarMode( (scroll & 2) ? QScrollView::Auto : QScrollView::AlwaysOff);  }END_PROPERTYBEGIN_METHOD_VOID(CTEXTAREA_ensure_visible)  WIDGET->ensureCursorVisible();END_METHODGB_DESC CTextAreaSelectionDesc[] ={  GB_DECLARE(".TextAreaSelection", 0), GB_VIRTUAL_CLASS(),  GB_PROPERTY("Text", "s", CTEXTAREA_sel_text),  GB_PROPERTY_READ("Length", "i", CTEXTAREA_sel_length),  GB_PROPERTY_READ("Start", "i", CTEXTAREA_sel_start),  GB_PROPERTY_READ("Pos", "i", CTEXTAREA_sel_start),  GB_METHOD("Clear", NULL, CTEXTAREA_sel_clear, NULL),  GB_METHOD("Hide", NULL, CTEXTAREA_sel_clear, NULL),  GB_METHOD("All", NULL, CTEXTAREA_sel_select, NULL),  GB_METHOD("_call", NULL, CTEXTAREA_sel_select, "[(Start)i(Length)i]"),  GB_END_DECLARE};/*GB_DESC CTextAreaLinesDesc[] ={  GB_DECLARE(".TextArea.Lines", 0), GB_VIRTUAL_CLASS(),  GB_METHOD("_get", "i", CTEXTAREA_line_get, "s"),  GB_PROPERTY_READ("Count", "i", CTEXTAREA_line_count),  GB_END_DECLARE};*/GB_DESC CTextAreaDesc[] ={  GB_DECLARE("TextArea", sizeof(CTEXTAREA)), GB_INHERITS("Control"),  GB_METHOD("_new", NULL, CTEXTAREA_new, "(Parent)Container;"),  GB_PROPERTY("Text", "s", CTEXTAREA_text),  GB_PROPERTY_READ("Length", "i", CTEXTAREA_length),  GB_PROPERTY("ReadOnly", "b", CTEXTAREA_read_only),  //GB_PROPERTY_READ("Lines", ".TextArea.Line", CTEXTAREA_line_or_selection),  //GB_PROPERTY("ScrollBar", "i<Scroll>", CTEXTAREA_scrollbar),  GB_PROPERTY("Wrap", "b", CTEXTAREA_wrap),  GB_PROPERTY("Border", "b", CWIDGET_border_simple),  GB_PROPERTY("Line", "i", CTEXTAREA_line),  GB_PROPERTY("Column", "i", CTEXTAREA_column),  GB_PROPERTY("Pos", "i", CTEXTAREA_pos),  GB_PROPERTY_SELF("Selection", ".TextAreaSelection"),  GB_PROPERTY_SELF("Select", ".TextAreaSelection"),  GB_CONSTANT("_Properties", "s", CTEXTAREA_PROPERTIES),  GB_CONSTANT("_DefaultEvent", "s", "KeyPress"),  GB_METHOD("Clear", NULL, CTEXTAREA_clear, NULL),  GB_METHOD("Insert", NULL, CTEXTAREA_insert, "(Text)s"),  GB_METHOD("Copy", NULL, CTEXTAREA_copy, NULL),  GB_METHOD("Cut", NULL, CTEXTAREA_cut, NULL),  GB_METHOD("Paste", NULL, CTEXTAREA_paste, NULL),  GB_METHOD("Undo", NULL, CTEXTAREA_undo, NULL),  GB_METHOD("Redo", NULL, CTEXTAREA_redo, NULL),  GB_METHOD("ToPos", "i", CTEXTAREA_to_pos, "(Line)i(Column)i"),  GB_METHOD("ToLine", "i", CTEXTAREA_to_line, "(Pos)i"),  GB_METHOD("ToColumn", "i", CTEXTAREA_to_col, "(Pos)i"),  GB_METHOD("EnsureVisible", NULL, CTEXTAREA_ensure_visible, NULL),    GB_EVENT("Change", NULL, NULL, &EVENT_Change),  GB_EVENT("Cursor", NULL, NULL, &EVENT_Cursor),  GB_END_DECLARE};/* Class MyMultiLineEdit *///class QMultiLineEditRow;#if 0long MyMultiLineEdit::getLineLength(long line){  return lineLength(line);}long MyMultiLineEdit::toPos(int row, int col){  int i;  long pos;  row = QMAX( QMIN( row, numLines() - 1), 0 );  col = QMAX( QMIN( col,  lineLength( row )), 0 );  if (row == 0)	  return QMIN(col, lineLength(0));  pos = 0;	for(i = 0; i < row ; i++)  {    pos += lineLength(i);    if (isEndOfParagraph(i))      pos++;	}	pos += col;  return pos;}void MyMultiLineEdit::fromPos(long pos, int *row, int *col){  int l = 0;  if (pos <= 0)  {    *row = 0;    *col = 0;    return;  }  for (l = 0; l < numLines(); l++)  {    if (pos <= lineLength(l))    {      *row = l;      *col = pos;      return;    }    pos -= lineLength(l);    if (isEndOfParagraph(l))      pos--;  }  *row = l - 1;  *col = lineLength(l - 1);}void MyMultiLineEdit::getSelection(long *start, long *length){  bool sel;  int line1, col1, line2, col2;  sel = getMarkedRegion(&line1, &col1, &line2, &col2 );  if (!sel)  {    getCursorPosition(&line1, &col1);    *start = toPos(line1, col1);    *length = 0;    return;  }  *start = toPos(line1, col1);  *length = toPos(line2, col2) - *start;}void MyMultiLineEdit::setSelection(long start, long length){  int line1, col1, line2, col2;  if (length <= 0)  {    deselect();    fromPos(start, &line1, &col1);    setCursorPosition(line1, col1);    return;  }  fromPos(start + length, &line2, &col2);  QtMultiLineEdit::setSelection(line1, col1, line2, col2 );}const char *MyMultiLineEdit::selText(void){  return markedText().latin1();}#endif/* Classe CTextArea */CTextArea CTextArea::manager;void CTextArea::changed(void){  RAISE_EVENT(EVENT_Change);}void CTextArea::cursor(void){  RAISE_EVENT(EVENT_Cursor);}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -