diff options
author | Slávek Banko <slavek.banko@axis.cz> | 2021-12-09 01:40:38 +0100 |
---|---|---|
committer | Slávek Banko <slavek.banko@axis.cz> | 2021-12-09 02:07:16 +0100 |
commit | 347f0b28701932eba7eb063d9093e446b81debae (patch) | |
tree | b6941843b550f83221b13a3b2643b5a95cd428db /tqt/tqextscintillabase.cpp | |
parent | 5da5cb1c824c608159126a82011d8a8943b360e0 (diff) | |
download | tqscintilla-347f0b28701932eba7eb063d9093e446b81debae.tar.gz tqscintilla-347f0b28701932eba7eb063d9093e446b81debae.zip |
Rename Qt => TQt.
Signed-off-by: Slávek Banko <slavek.banko@axis.cz>
Diffstat (limited to 'tqt/tqextscintillabase.cpp')
-rw-r--r-- | tqt/tqextscintillabase.cpp | 586 |
1 files changed, 586 insertions, 0 deletions
diff --git a/tqt/tqextscintillabase.cpp b/tqt/tqextscintillabase.cpp new file mode 100644 index 0000000..d277dd6 --- /dev/null +++ b/tqt/tqextscintillabase.cpp @@ -0,0 +1,586 @@ +// This module implements the "official" low-level API. +// +// Copyright (c) 2006 +// Riverbank Computing Limited <info@riverbankcomputing.co.uk> +// +// This file is part of TQScintilla. +// +// This copy of TQScintilla 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 2, or (at your option) any +// later version. +// +// TQScintilla is supplied 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 +// TQScintilla; see the file LICENSE. If not, write to the Free Software +// Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + +#ifdef HAVE_CONFIG_H +# include "config.h" +#endif + +#include "tqextscintillabase.moc" +#include <tqapplication.h> +#include <tqclipboard.h> +#include <tqscrollbar.h> +#include <tqlayout.h> +#include <tqcolor.h> +#include <tqevent.h> +#include <tqdragobject.h> +#include <tqpainter.h> +#include <tqptrlist.h> + +#include "tqextscintillabase.h" +#include "ScintillaTQt.h" + + +// The #defines in Scintilla.h and the enums in tqextscintillabase.h conflict +// (because we want to use the same names) so we have to undefine those we use +// in this file. +#undef SCI_SETCARETPERIOD +#undef SCK_DOWN +#undef SCK_UP +#undef SCK_LEFT +#undef SCK_RIGHT +#undef SCK_HOME +#undef SCK_END +#undef SCK_PRIOR +#undef SCK_NEXT +#undef SCK_DELETE +#undef SCK_INSERT +#undef SCK_ESCAPE +#undef SCK_BACK +#undef SCK_TAB +#undef SCK_RETURN +#undef SCK_ADD +#undef SCK_SUBTRACT +#undef SCK_DIVIDE + + +// Remember if we have linked the lexers. +static bool lexersLinked = FALSE; + +// The list of instances. +static TQPtrList<TQextScintillaBase> poolList; + + +// The ctor. +TQextScintillaBase::TQextScintillaBase(TQWidget *parent,const char *name,WFlags f) + : TQWidget(parent,name,f) +{ + sci = 0; + + TQGridLayout *layout = new TQGridLayout(this,2,2); + + txtarea = new TQWidget(this,0,WRepaintNoErase|WResizeNoErase); + txtarea -> setSizePolicy(TQSizePolicy(TQSizePolicy::Expanding,TQSizePolicy::Expanding)); + txtarea -> setMouseTracking(TRUE); + txtarea -> setAcceptDrops(TRUE); + txtarea -> setFocusPolicy(WheelFocus); + txtarea -> setFocusProxy(this); + layout -> addWidget(txtarea,0,0); + + vsb = new TQScrollBar(Qt::Vertical,this); + layout -> addWidget(vsb,0,1); + connect(vsb,TQT_SIGNAL(valueChanged(int)),TQT_SLOT(handleVSb(int))); + + hsb = new TQScrollBar(Qt::Horizontal,this); + layout -> addWidget(hsb,1,0); + connect(hsb,TQT_SIGNAL(valueChanged(int)),TQT_SLOT(handleHSb(int))); + + txtarea -> installEventFilter(this); + + setFocusPolicy(WheelFocus); + + sci = new ScintillaTQt(this); + + SendScintilla(SCI_SETCARETPERIOD,TQApplication::cursorFlashTime() / 2); + + // Make sure the lexers are linked in. + if (!lexersLinked) + { + Scintilla_LinkLexers(); + + lexersLinked = TRUE; + } + + TQClipboard *cb = TQApplication::clipboard(); + + if (cb -> supportsSelection()) + connect(cb,TQT_SIGNAL(selectionChanged()),TQT_SLOT(handleSelection())); + + // Add it to the pool. + poolList.append(this); +} + + +// The dtor. +TQextScintillaBase::~TQextScintillaBase() +{ + // Remove it from the pool. + poolList.remove(this); + + delete sci; +} + + +// Return the viewport widget. +TQWidget *TQextScintillaBase::viewport() const +{ + return txtarea; +} + + +// Return an instance from the pool. +TQextScintillaBase *TQextScintillaBase::pool() +{ + return poolList.first(); +} + + +// Send a message to the real Scintilla widget using the low level Scintilla +// API. +long TQextScintillaBase::SendScintilla(unsigned int msg,unsigned long wParam, + long lParam) +{ + return sci -> WndProc(msg,wParam,lParam); +} + + +// Send a message to the real Scintilla widget that needs a TextRange +// structure. +long TQextScintillaBase::SendScintilla(unsigned int msg,long cpMin,long cpMax, + char *lpstrText) +{ + TextRange tr; + + tr.chrg.cpMin = cpMin; + tr.chrg.cpMax = cpMax; + tr.lpstrText = lpstrText; + + return sci -> WndProc(msg,0,reinterpret_cast<long>(&tr)); +} + + +// Send a message to the real Scintilla widget that needs a RangeToFormat +// structure. +long TQextScintillaBase::SendScintilla(unsigned int msg,unsigned long wParam, + TQPainter *hdc,const TQRect &rc, + long cpMin,long cpMax) +{ + RangeToFormat rf; + + rf.hdc = rf.hdcTarget = reinterpret_cast<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<long>(&rf)); +} + + +// Send a message to the real Scintilla widget that needs a colour. +long TQextScintillaBase::SendScintilla(unsigned int msg,unsigned long wParam, + const TQColor &col) +{ + long lParam = (col.blue() << 16) | (col.green() << 8) | col.red(); + + return sci -> WndProc(msg,wParam,lParam); +} + + +// Send a message to the real Scintilla widget that needs a colour. +long TQextScintillaBase::SendScintilla(unsigned int msg,const TQColor &col) +{ + unsigned long wParam = (col.blue() << 16) | (col.green() << 8) | col.red(); + + return sci -> WndProc(msg,wParam,0); +} + + +// Handle events on behalf of the text area. +bool TQextScintillaBase::eventFilter(TQObject *o,TQEvent *e) +{ + if (o != txtarea) + return TQWidget::eventFilter(o,e); + + bool used = TRUE; + + switch (e -> type()) + { + case TQEvent::Paint: + sci -> paintEvent(static_cast<TQPaintEvent *>(e)); + break; + + case TQEvent::Resize: + sci -> ChangeSize(); + break; + + case TQEvent::MouseButtonPress: + mousePress(static_cast<TQMouseEvent *>(e)); + break; + + case TQEvent::MouseButtonRelease: + mouseRelease(static_cast<TQMouseEvent *>(e)); + break; + + case TQEvent::MouseButtonDblClick: + mouseDoubleClick(static_cast<TQMouseEvent *>(e)); + break; + + case TQEvent::MouseMove: + mouseMove(static_cast<TQMouseEvent *>(e)); + break; + + case TQEvent::Wheel: + mouseWheel(static_cast<TQWheelEvent *>(e)); + break; + + case TQEvent::ContextMenu: + contextMenu(static_cast<TQContextMenuEvent *>(e)); + break; + + case TQEvent::DragEnter: + sci -> dragEnterEvent(static_cast<TQDragEnterEvent *>(e)); + break; + + case TQEvent::DragMove: + sci -> dragMoveEvent(static_cast<TQDragMoveEvent *>(e)); + break; + + case TQEvent::DragLeave: + sci -> dragLeaveEvent(static_cast<TQDragLeaveEvent *>(e)); + break; + + case TQEvent::Drop: + sci -> dropEvent(static_cast<TQDropEvent *>(e)); + break; + + default: + used = FALSE; + } + + return used; +} + + +// Handle the timer on behalf of the ScintillaTQt instance. +void TQextScintillaBase::handleTimer() +{ + sci -> Tick(); +} + + +// Handle the context menu on behalf of the ScintillaTQt instance. +void TQextScintillaBase::handlePopUp(int cmd) +{ + sci -> Command(cmd); +} + + +// Re-implemented to tell the widget it has the focus. +void TQextScintillaBase::focusInEvent(TQFocusEvent *) +{ + sci -> SetFocusState(true); +} + + +// Re-implemented to tell the widget it has lost the focus. +void TQextScintillaBase::focusOutEvent(TQFocusEvent *) +{ + sci -> SetFocusState(false); +} + + +// Handle a mouse button press. +void TQextScintillaBase::mousePress(TQMouseEvent *me) +{ + setFocus(); + + Point pt(me -> x(),me -> y()); + + switch (me -> button()) + { + case 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() && (me -> globalPos() - triple_click_at).manhattanLength() < TQApplication::startDragDistance()) + clickTime = sci -> lastClickTime + Platform::DoubleClickTime() - 1; + else + clickTime = sci -> lastClickTime + Platform::DoubleClickTime() + 1; + + triple_click.stop(); + + bool shift = me -> state() & ShiftButton; + bool ctrl = me -> state() & ControlButton; + bool alt = me -> state() & AltButton; + + sci -> ButtonDown(pt,clickTime,shift,ctrl,alt); + break; + } + + case MidButton: + { + TQClipboard *cb = TQApplication::clipboard(); + + if (cb -> supportsSelection()) + { + cb -> setSelectionMode(TRUE); + + int pos = sci -> PositionFromLocation(pt); + + sci -> SetSelection(pos,pos); + sci -> Paste(); + + cb -> setSelectionMode(FALSE); + } + + break; + } + + default: + break; + } +} + + +// Handle a context menu event. +void TQextScintillaBase::contextMenu(TQContextMenuEvent *cme) +{ + TQApplication::sendEvent(this,cme); + + if (!cme -> isConsumed()) + sci -> ContextMenu(Point(cme -> globalX(),cme -> globalY())); +} + + +// Handle a mouse button releases. +void TQextScintillaBase::mouseRelease(TQMouseEvent *me) +{ + if (sci -> HaveMouseCapture() && me -> button() == LeftButton) + { + bool ctrl = me -> state() & ControlButton; + + sci -> ButtonUp(Point(me -> x(),me -> y()),0,ctrl); + } +} + + +// Handle a mouse move. +void TQextScintillaBase::mouseMove(TQMouseEvent *me) +{ + sci -> ButtonMove(Point(me -> x(),me -> y())); +} + + +// Handle a mouse wheel event. +void TQextScintillaBase::mouseWheel(TQWheelEvent *we) +{ + setFocus(); + + if (we -> orientation() == Qt::Horizontal || we -> state() & ShiftButton) + TQApplication::sendEvent(hsb,we); + else if (we -> orientation() == Qt::Vertical) + TQApplication::sendEvent(vsb,we); +} + + +// Handle a mouse button double click. +void TQextScintillaBase::mouseDoubleClick(TQMouseEvent *me) +{ + setFocus(); + + if (me -> button() == LeftButton) + { + // Make sure Scintilla will interpret this as a double-click. + unsigned clickTime = sci -> lastClickTime + Platform::DoubleClickTime() - 1; + + bool shift = me -> state() & ShiftButton; + bool ctrl = me -> state() & ControlButton; + bool alt = me -> state() & AltButton; + + sci -> ButtonDown(Point(me -> x(),me -> y()),clickTime,shift,ctrl,alt); + + // Remember the current position and time in case it turns into a + // triple click. + triple_click_at = me -> globalPos(); + triple_click.start(TQApplication::doubleClickInterval()); + } +} + + +// Re-implemented to handle key press events. +void TQextScintillaBase::keyPressEvent(TQKeyEvent *ke) +{ + unsigned key; + + switch (ke -> key()) + { + case Key_Down: + key = SCK_DOWN; + break; + + case Key_Up: + key = SCK_UP; + break; + + case Key_Left: + key = SCK_LEFT; + break; + + case Key_Right: + key = SCK_RIGHT; + break; + + case Key_Home: + key = SCK_HOME; + break; + + case Key_End: + key = SCK_END; + break; + + case Key_Prior: + key = SCK_PRIOR; + break; + + case Key_Next: + key = SCK_NEXT; + break; + + case Key_Delete: + key = SCK_DELETE; + break; + + case Key_Insert: + key = SCK_INSERT; + break; + + case Key_Escape: + key = SCK_ESCAPE; + break; + + case Key_Backspace: + key = SCK_BACK; + break; + + case Key_Tab: + key = SCK_TAB; + break; + + case Key_Return: + case Key_Enter: + key = SCK_RETURN; + break; + + default: + if (sci -> IsUnicodeMode()) + { + // Work out if the original input was a single ASCII + // key. + if (ke -> text().length() == 1) + { + if ((key = ke -> text()[0].unicode()) >= 0x80) + key = 0; + } + else + key = 0; + } + else + { + key = ke -> ascii(); + + if (key >= 0x01 && key <= 0x1f) + key += 0x40; + } + } + + bool consumed = FALSE; + + if (key) + { + bool shift = ke -> state() & ShiftButton; + bool ctrl = ke -> state() & ControlButton; + bool alt = ke -> state() & AltButton; + + // If the character is eventually added by KeyDefault() then + // the return value of KeyDown() will be true, but consumed + // will incorrectly be false. + if (sci -> KeyDown(key,shift,ctrl,alt,&consumed) && !consumed) + consumed = TRUE; + } + else if (sci -> IsUnicodeMode()) + { + if (ke -> text().length() > 0 && !ke -> text()[0].isNull()) + { + TQCString s = ke -> text().utf8(); + + sci -> AddCharUTF(s.data(),s.length()); + + consumed = TRUE; + } + } + + if (!consumed) + ke -> ignore(); +} + + +// Re-implemented to make sure tabs are passed to the editor. +bool TQextScintillaBase::focusNextPrevChild(bool) +{ + return false; +} + + +// Start a drag and allow this to be re-implemented by an application. +void TQextScintillaBase::startDrag() +{ + sci -> StartDragImpl(); +} + + +// Handle the vertical scrollbar. +void TQextScintillaBase::handleVSb(int val) +{ + sci -> ScrollTo(val); +} + + +// Handle the horizontal scrollbar. +void TQextScintillaBase::handleHSb(int val) +{ + sci ->HorizontalScrollTo(val); +} + + +// Return the current prefered size. +TQSize TQextScintillaBase::sizeHint() const +{ + int height = sci -> vs.lineHeight * sci -> pdoc -> LinesTotal(); + + if (sci -> horizontalScrollBarVisible) + height += hsb -> sizeHint().height(); + + return TQSize(sci -> scrollWidth,height); +} + + +// Handle the selection changing. +void TQextScintillaBase::handleSelection() +{ + if (!TQApplication::clipboard() -> ownsSelection()) + sci -> UnclaimSelection(); +} |