// Handle a mouse button double click. void QsciScintillaBase::mouseDoubleClickEvent(QMouseEvent *e) { if (e->button() != Qt::LeftButton) { e->ignore(); return; } setFocus(); // Make sure Scintilla will interpret this as a double-click. unsigned clickTime = sci->lastClickTime + QSCI_SCI_NAMESPACE(Platform)::DoubleClickTime() - 1; bool shift = e->modifiers() & Qt::ShiftModifier; bool ctrl = e->modifiers() & Qt::ControlModifier; bool alt = e->modifiers() & Qt::AltModifier; sci->ButtonDown(QSCI_SCI_NAMESPACE(Point)(e->x(), e->y()), clickTime, shift, ctrl, alt); // Remember the current position and time in case it turns into a triple // click. triple_click_at = e->globalPos(); triple_click.start(QApplication::doubleClickInterval()); }
// Handle a mouse button press. void QsciScintillaBase::mousePressEvent(QMouseEvent *e) { setFocus(); QSCI_SCI_NAMESPACE(Point) pt(e->x(), e->y()); if (e->button() == Qt::LeftButton) { unsigned clickTime; // It is a triple click if the timer is running and the mouse hasn't // moved too much. if (triple_click.isActive() && (e->globalPos() - triple_click_at).manhattanLength() < QApplication::startDragDistance()) clickTime = sci->lastClickTime + QSCI_SCI_NAMESPACE(Platform)::DoubleClickTime() - 1; else clickTime = sci->lastClickTime + QSCI_SCI_NAMESPACE(Platform)::DoubleClickTime() + 1; triple_click.stop(); // Scintilla uses the Alt modifier to initiate rectangular selection. // However the GTK port (under X11, not Windows) uses the Control // modifier (by default, although it is configurable). It does this // because most X11 window managers hijack Alt-drag to move the window. // We do the same, except that (for the moment at least) we don't allow // the modifier to be configured. bool shift = e->modifiers() & Qt::ShiftModifier; bool ctrl = e->modifiers() & Qt::ControlModifier; #if defined(Q_OS_MAC) || defined(Q_OS_WIN) bool alt = e->modifiers() & Qt::AltModifier; #else bool alt = ctrl; #endif sci->ButtonDown(pt, clickTime, shift, ctrl, alt); } else if (e->button() == Qt::MidButton) { QClipboard *cb = QApplication::clipboard(); if (cb->supportsSelection()) { int pos = sci->PositionFromLocation(pt); sci->sel.Clear(); sci->SetSelection(pos, pos); sci->pasteFromClipboard(QClipboard::Selection); } } }
// Paint a call tip. void QsciSciCallTip::paintEvent(QPaintEvent *) { QSCI_SCI_NAMESPACE(Surface) *surfaceWindow = QSCI_SCI_NAMESPACE(Surface)::Allocate(SC_TECHNOLOGY_DEFAULT); if (!surfaceWindow) return; QPainter p(this); surfaceWindow->Init(&p); surfaceWindow->SetUnicodeMode(sci->CodePage() == SC_CP_UTF8); sci->ct.PaintCT(surfaceWindow); delete surfaceWindow; }
// Handle a mouse button releases. void QsciScintillaBase::mouseReleaseEvent(QMouseEvent *e) { if (e->button() != Qt::LeftButton) return; QSCI_SCI_NAMESPACE(Point) pt(e->x(), e->y()); if (sci->HaveMouseCapture()) { bool ctrl = e->modifiers() & Qt::ControlModifier; sci->ButtonUp(pt, 0, ctrl); } #if QT_VERSION >= 0x050000 if (!sci->pdoc->IsReadOnly() && !sci->PointInSelMargin(pt) && qApp->autoSipEnabled()) { QStyle::RequestSoftwareInputPanel rsip = QStyle::RequestSoftwareInputPanel(style()->styleHint(QStyle::SH_RequestSoftwareInputPanel)); if (!clickCausedFocus || rsip == QStyle::RSIP_OnMouseClick) qApp->inputMethod()->show(); } clickCausedFocus = false; #endif }
// Handle drops. void QsciScintillaBase::dropEvent(QDropEvent *e) { bool moving; int len; const char *s; bool rectangular; acceptAction(e); if (!e->isAccepted()) return; moving = (e->dropAction() == Qt::MoveAction); QByteArray text = fromMimeData(e->mimeData(), rectangular); len = text.length(); s = text.data(); std::string dest = QSCI_SCI_NAMESPACE(Document)::TransformLineEnds(s, len, sci->pdoc->eolMode); sci->DropAt(sci->posDrop, dest.c_str(), dest.length(), moving, rectangular); sci->Redraw(); }
// Handle a mouse button releases. void QsciScintillaBase::mouseReleaseEvent(QMouseEvent *e) { if (sci->HaveMouseCapture() && e->button() == Qt::LeftButton) { bool ctrl = e->state() & Qt::ControlButton; sci->ButtonUp(QSCI_SCI_NAMESPACE(Point)(e->x(), e->y()), 0, ctrl); } }
// Handle drag moves. void QsciScintillaBase::dragMoveEvent(QDragMoveEvent *e) { sci->SetDragPosition( sci->SPositionFromLocation( QSCI_SCI_NAMESPACE(Point)(e->pos().x(), e->pos().y()), false, false, sci->UserVirtualSpace())); acceptAction(e); }
// Handle a mouse press in a call tip. void QsciSciCallTip::mousePressEvent(QMouseEvent *e) { QSCI_SCI_NAMESPACE(Point) pt; pt.x = e->x(); pt.y = e->y(); sci->ct.MouseClick(pt); sci->CallTipClick(); update(); }
// Overloaded message send. long QsciScintillaBase::SendScintilla(unsigned int msg, long cpMin, long cpMax, char *lpstrText) const { QSCI_SCI_NAMESPACE(TextRange) tr; tr.chrg.cpMin = cpMin; tr.chrg.cpMax = cpMax; tr.lpstrText = lpstrText; return sci->WndProc(msg, static_cast<uptr_t>(0), reinterpret_cast<sptr_t>(&tr)); }
// Start a drag. void QsciScintillaQt::StartDrag() { inDragDrop = ddDragging; QDragObject *dobj = new QTextDrag(textRange(&drag), qsb->viewport()); // Remove the dragged text if it was a move to another widget or // application. if (dobj->drag() && dobj->target() != qsb->viewport()) ClearSelection(); SetDragPosition(QSCI_SCI_NAMESPACE(SelectionPosition)()); inDragDrop = ddNone; }
// Handle drag moves. void QsciScintillaBase::dragMoveEvent(QDragMoveEvent *e) { sci->SetDragPosition( sci->SPositionFromLocation( QSCI_SCI_NAMESPACE(Point)(e->pos().x(), e->pos().y()), false, false, sci->UserVirtualSpace())); if (sci->pdoc->IsReadOnly() || !QTextDrag::canDecode(e)) { e->ignore(); return; } e->acceptAction(); }
// Overloaded message send. long QsciScintillaBase::SendScintilla(unsigned int msg, unsigned long wParam, QPainter *hdc, const QRect &rc, long cpMin, long cpMax) const { QSCI_SCI_NAMESPACE(RangeToFormat) rf; rf.hdc = rf.hdcTarget = reinterpret_cast<QSCI_SCI_NAMESPACE(SurfaceID)>(hdc); rf.rc.left = rc.left(); rf.rc.top = rc.top(); rf.rc.right = rc.right() + 1; rf.rc.bottom = rc.bottom() + 1; rf.chrg.cpMin = cpMin; rf.chrg.cpMax = cpMax; return sci->WndProc(msg, wParam, reinterpret_cast<sptr_t>(&rf)); }
// Handle drops. void QsciScintillaBase::dropEvent(QDropEvent *e) { bool moving; int len; const char *s; bool rectangular; QString text; if (sci->pdoc->IsReadOnly() || !QTextDrag::decode(e, text)) { e->ignore(); return; } moving = (e->source() == txtarea && e->action() == QDropEvent::Move); e->acceptAction(); QCString bytes; if (sci->IsUnicodeMode()) { bytes = text.utf8(); len = bytes.length(); s = bytes.data(); } else { s = text.latin1(); len = (s ? qstrlen(s) : 0); } rectangular = false; s = QSCI_SCI_NAMESPACE(Document)::TransformLineEnds(&len, s, len, sci->pdoc->eolMode); sci->DropAt(sci->posDrop, s, moving, rectangular); delete[] s; sci->Redraw(); }
// Start a drag. void QsciScintillaQt::StartDrag() { inDragDrop = ddDragging; QDrag *qdrag = new QDrag(qsb); qdrag->setMimeData(mimeSelection(drag)); # if QT_VERSION >= 0x040300 Qt::DropAction action = qdrag->exec(Qt::MoveAction | Qt::CopyAction, Qt::MoveAction); # else Qt::DropAction action = qdrag->start(Qt::MoveAction); # endif // Remove the dragged text if it was a move to another widget or // application. if (action == Qt::MoveAction && qdrag->target() != qsb->viewport()) ClearSelection(); SetDragPosition(QSCI_SCI_NAMESPACE(SelectionPosition)()); inDragDrop = ddNone; }
#include "ListBoxQt.h" #include <stdlib.h> #include "SciClasses.h" #include "Qsci/qsciscintilla.h" QsciListBoxQt::QsciListBoxQt() : cb_action(0), cb_data(0), slb(0), visible_rows(5), utf8(false) { } void QsciListBoxQt::SetFont(QSCI_SCI_NAMESPACE(Font) &font) { QFont *f = reinterpret_cast<QFont *>(font.GetID()); if (f) slb->setFont(*f); } void QsciListBoxQt::Create(QSCI_SCI_NAMESPACE(Window) &parent, int, QSCI_SCI_NAMESPACE(Point), int, bool unicodeMode) { utf8 = unicodeMode; // The parent we want is the QsciScintillaBase, not the text area. wid = slb = new QsciSciListBox(reinterpret_cast<QWidget *>(parent.GetID())->parentWidget(), this);
// Handle drag leaves. void QsciScintillaBase::dragLeaveEvent(QDragLeaveEvent *) { sci->SetDragPosition(QSCI_SCI_NAMESPACE(SelectionPosition)()); }
qsb->setHorizontalScrollBarPolicy(hsb ? Qt::ScrollBarAlwaysOn : Qt::ScrollBarAlwaysOff); qsb->setVerticalScrollBarPolicy(verticalScrollBarVisible ? Qt::ScrollBarAlwaysOn : Qt::ScrollBarAlwaysOff); } // Notify interested parties of any change in the document. void QsciScintillaQt::NotifyChange() { emit qsb->SCEN_CHANGE(); } // Notify interested parties of various events. This is the main mapping // between Scintilla notifications and Qt signals. void QsciScintillaQt::NotifyParent(QSCI_SCI_NAMESPACE(SCNotification) scn) { switch (scn.nmhdr.code) { case SCN_CALLTIPCLICK: emit qsb->SCN_CALLTIPCLICK(scn.position); break; case SCN_AUTOCCANCELLED: emit qsb->SCN_AUTOCCANCELLED(); break; case SCN_AUTOCCHARDELETED: emit qsb->SCN_AUTOCCHARDELETED(); break;
// Handle a mouse move. void QsciScintillaBase::mouseMoveEvent(QMouseEvent *e) { sci->ButtonMove(QSCI_SCI_NAMESPACE(Point)(e->x(), e->y())); }
// Re-implemented to handle the context menu. void QsciScintillaBase::contextMenuEvent(QContextMenuEvent *e) { sci->ContextMenu(QSCI_SCI_NAMESPACE(Point)(e->globalX(), e->globalY())); }