📄 ctextbox.cpp
字号:
/*************************************************************************** CTextBox.cpp The TextBox 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 __CTEXTBOX_CPP#include <qapplication.h>#include <qlineedit.h>#include <qcombobox.h>#include <qlistbox.h>#include <qcursor.h>#include <qsizepolicy.h>#include "gambas.h"#include "CTextBox.h"DECLARE_EVENT(EVENT_Change);DECLARE_EVENT(EVENT_Activate);DECLARE_EVENT(EVENT_Click);#define MAX_LEN 32767/*************************************************************************** TextBox***************************************************************************/static bool get(void *_object, QLineEdit **wid, bool error = true){ QComboBox *combo; if (TEXTBOX->isA("QLineEdit")) { *wid = TEXTBOX; return false; } combo = COMBOBOX; if (!combo->editable()) { if (error) GB.Error("ComboBox is read-only"); return true; } *wid = combo->lineEdit(); return false;}#define GET_TEXT_BOX() \ QLineEdit *textbox; \ if (get(_object, &textbox)) \ return;BEGIN_METHOD(CTEXTBOX_new, GB_OBJECT parent) QLineEdit *wid = new QLineEdit(CONTAINER(VARG(parent))); CWIDGET_new(wid, (void *)_object, "TextBox"); QObject::connect(wid, SIGNAL(textChanged(const QString &)), &CTextBox::manager, SLOT(event_change())); QObject::connect(wid, SIGNAL(returnPressed()), &CTextBox::manager, SLOT(event_activate())); wid->setAlignment(Qt::AlignLeft); wid->show();END_METHODBEGIN_METHOD_VOID(CTEXTBOX_clear) TEXTBOX->clear();END_METHODBEGIN_METHOD(CTEXTBOX_insert, GB_STRING text) GET_TEXT_BOX(); //textbox->insert(QString(GB.ToZeroString(ARG(text)))); textbox->insert(QSTRING_ARG(text));END_METHODBEGIN_PROPERTY(CTEXTBOX_text) if (READ_PROPERTY) GB.ReturnNewZeroString(TO_UTF8(TEXTBOX->text())); else TEXTBOX->setText(QSTRING_PROP());END_PROPERTYBEGIN_PROPERTY(CTEXTBOX_length) GB.ReturnInteger(TEXTBOX->text().length());END_PROPERTYBEGIN_PROPERTY(CTEXTBOX_alignment) if (READ_PROPERTY) //GB.ReturnInteger((TEXTBOX->alignment() & ALIGN_HMASK) + Qt::AlignHCenter); GB.ReturnInteger((TEXTBOX->alignment() & ALIGN_HMASK) + Qt::AlignVCenter); else //TEXTBOX->setAlignment((PROPERTY(long) & ALIGN_HMASK) + Qt::AlignVCenter); TEXTBOX->setAlignment(VPROP(GB_INTEGER) & ALIGN_HMASK);END_PROPERTYBEGIN_PROPERTY(CTEXTBOX_pos) GET_TEXT_BOX(); if (READ_PROPERTY) GB.ReturnInteger(textbox->cursorPosition()); else { int pos = VPROP(GB_INTEGER); int len = (int)TEXTBOX->text().length(); if (pos < 0) pos = 0; else if (pos > len) pos = len; textbox->setCursorPosition(pos); }END_PROPERTYBEGIN_PROPERTY(CTEXTBOX_read_only) if (READ_PROPERTY) GB.ReturnBoolean(TEXTBOX->isReadOnly()); else TEXTBOX->setReadOnly(VPROP(GB_BOOLEAN));END_PROPERTYBEGIN_PROPERTY(CTEXTBOX_border) GET_TEXT_BOX(); if (READ_PROPERTY) GB.ReturnBoolean(textbox->frame()); else textbox->setFrame(VPROP(GB_BOOLEAN));END_PROPERTYBEGIN_PROPERTY(CTEXTBOX_password) GET_TEXT_BOX(); if (READ_PROPERTY) GB.ReturnBoolean(textbox->echoMode() != QLineEdit::Normal); else textbox->setEchoMode(VPROP(GB_BOOLEAN) ? QLineEdit::Password : QLineEdit::Normal);END_PROPERTYBEGIN_PROPERTY(CTEXTBOX_max_length) long max; GET_TEXT_BOX(); if (READ_PROPERTY) { max = textbox->maxLength(); GB.ReturnInteger(max >= MAX_LEN ? 0 : max); } else { max = VPROP(GB_INTEGER); if (max < 1 || max > MAX_LEN) max = MAX_LEN; textbox->setMaxLength(max); }END_PROPERTYBEGIN_PROPERTY(CTEXTBOX_selection) RETURN_SELF();END_PROPERTY/*************************************************************************** .TextBox.Selection***************************************************************************/BEGIN_PROPERTY(CTEXTBOX_sel_text) GET_TEXT_BOX(); if (READ_PROPERTY) GB.ReturnNewZeroString(TO_UTF8(textbox->markedText())); else textbox->insert(QSTRING_PROP());END_PROPERTYstatic void set_selection(QLineEdit *textbox, int start, int length){ int len = (int)textbox->text().length(); if (start < 0 || start >= len) { start = textbox->cursorPosition(); length = 0; } textbox->setCursorPosition(start); if (length <= 0) textbox->deselect(); else { if ((start + length) >= len) length = len - start; textbox->setSelection(start, length); }}static void get_selection(QLineEdit *textbox, int *start, int *length){ *start = textbox->cursorPosition(); if (!textbox->hasMarkedText()) *length = 0; else *length = textbox->markedText().length();}BEGIN_PROPERTY(CTEXTBOX_sel_length) int start, length; GET_TEXT_BOX(); get_selection(textbox, &start, &length); GB.ReturnInteger(length);END_PROPERTYBEGIN_PROPERTY(CTEXTBOX_sel_start) int start, length; GET_TEXT_BOX(); get_selection(textbox, &start, &length); GB.ReturnInteger(start);END_PROPERTYBEGIN_METHOD_VOID(CTEXTBOX_sel_clear) GET_TEXT_BOX(); textbox->deselect();END_METHODBEGIN_METHOD(CTEXTBOX_sel_select, GB_INTEGER start; GB_INTEGER length) GET_TEXT_BOX(); if (MISSING(start) && MISSING(length)) textbox->selectAll(); else if (!MISSING(start) && !MISSING(length)) set_selection(textbox, VARG(start), VARG(length));END_METHODBEGIN_METHOD_VOID(CTEXTBOX_sel_select_all) GET_TEXT_BOX(); textbox->selectAll();END_METHOD/*************************************************************************** ComboBox***************************************************************************/#undef THIS#define THIS OBJECT(CCOMBOBOX)static void setCurrentItem(void *_object, int item){ COMBOBOX->setCurrentItem(item); if (item >= 0) GB.Raise(_object, EVENT_Click, 0);}static void combo_set_editable(void *_object, bool ed){ QLineEdit *textbox; if (ed) { if (!COMBOBOX->editable()) { CWidget::removeFilter(COMBOBOX); COMBOBOX->setEditable(true); CWidget::installFilter(COMBOBOX); QObject::connect(COMBOBOX->lineEdit(), SIGNAL(returnPressed()), &CTextBox::manager, SLOT(event_activate())); if (CWIDGET_test_flag(THIS, WF_DESIGN)) { get(_object, &textbox); textbox->removeEventFilter(COMBOBOX); COMBOBOX->setFocusProxy(0); } } } else { COMBOBOX->setEditable(false); } if (CWIDGET_test_flag(THIS, WF_DESIGN)) COMBOBOX->setFocusPolicy(QWidget::NoFocus); COMBOBOX->calcMinimumHeight();}BEGIN_METHOD(CCOMBOBOX_new, GB_OBJECT parent) MyComboBox *wid = new MyComboBox(CONTAINER(VARG(parent))); QObject::connect(wid, SIGNAL(textChanged(const QString &)), &CTextBox::manager, SLOT(event_change())); QObject::connect(wid, SIGNAL(activated(int)), &CTextBox::manager, SLOT(event_click())); //QObject::connect(wid, SIGNAL(highlighted(int)), &CTextBox::manager, SLOT(event_click())); CWIDGET_new(wid, (void *)_object, "ComboBox"); wid->setInsertionPolicy(QComboBox::NoInsertion); combo_set_editable(_object, true); wid->show();END_METHODBEGIN_METHOD_VOID(CCOMBOBOX_clear) COMBOBOX->clear(); COMBOBOX->clearEdit();END_METHOD
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -