Files
archived-Reclass/third_party/qscintilla/src/SciClasses.cpp

190 lines
4.6 KiB
C++

// The implementation of various Qt version independent classes used by the
// rest of the port.
//
// Copyright (c) 2023 Riverbank Computing Limited <info@riverbankcomputing.com>
//
// This file is part of QScintilla.
//
// This file may be used under the terms of the GNU General Public License
// version 3.0 as published by the Free Software Foundation and appearing in
// the file LICENSE included in the packaging of this file. Please review the
// following information to ensure the GNU General Public License version 3.0
// requirements will be met: http://www.gnu.org/copyleft/gpl.html.
//
// If you do not wish to use this file under the terms of the GPL version 3.0
// then you may purchase a commercial license. For more information contact
// info@riverbankcomputing.com.
//
// This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
// WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
#include "SciClasses.h"
#include <QCoreApplication>
#include <QKeyEvent>
#include <QListWidgetItem>
#include <QMouseEvent>
#include <QPainter>
#include <QPaintEvent>
#include "ScintillaQt.h"
#include "ListBoxQt.h"
// Create a call tip.
QsciSciCallTip::QsciSciCallTip(QWidget *parent, QsciScintillaQt *sci_)
: QWidget(parent, Qt::WindowFlags(Qt::Popup|Qt::FramelessWindowHint|Qt::WA_StaticContents)),
sci(sci_)
{
// Ensure that the main window keeps the focus (and the caret flashing)
// when this is displayed.
setFocusProxy(parent);
}
// Destroy a call tip.
QsciSciCallTip::~QsciSciCallTip()
{
// Ensure that the main window doesn't receive a focus out event when
// this is destroyed.
setFocusProxy(0);
}
// Paint a call tip.
void QsciSciCallTip::paintEvent(QPaintEvent *)
{
Scintilla::Surface *surfaceWindow = Scintilla::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 press in a call tip.
void QsciSciCallTip::mousePressEvent(QMouseEvent *e)
{
Scintilla::Point pt;
pt.x = e->x();
pt.y = e->y();
sci->ct.MouseClick(pt);
sci->CallTipClick();
update();
}
// Create the popup instance.
QsciSciPopup::QsciSciPopup()
{
// Set up the mapper.
connect(&mapper, SIGNAL(mapped(int)), this, SLOT(on_triggered(int)));
}
// Add an item and associated command to the popup and enable it if required.
void QsciSciPopup::addItem(const QString &label, int cmd, bool enabled,
QsciScintillaQt *sci_)
{
QAction *act = addAction(label, &mapper, SLOT(map()));
mapper.setMapping(act, cmd);
act->setEnabled(enabled);
sci = sci_;
}
// A slot to handle a menu action being triggered.
void QsciSciPopup::on_triggered(int cmd)
{
sci->Command(cmd);
}
QsciSciListBox::QsciSciListBox(QWidget *parent, QsciListBoxQt *lbx_)
: QListWidget(parent), lbx(lbx_)
{
setAttribute(Qt::WA_StaticContents);
#if defined(Q_OS_WIN)
setWindowFlags(Qt::Tool|Qt::FramelessWindowHint);
// This stops the main widget losing focus when the user clicks on this one
// (which prevents this one being destroyed).
setFocusPolicy(Qt::NoFocus);
#else
// This is the root of the focus problems under Gnome's window manager. We
// have tried many flag combinations in the past. The consensus now seems
// to be that the following works. However it might now work because of a
// change in Qt so we only enable it for recent versions in order to
// reduce the risk of breaking something that works with earlier versions.
setWindowFlags(Qt::ToolTip|Qt::WindowStaysOnTopHint);
// This may not be needed.
setFocusProxy(parent);
#endif
setFrameShape(StyledPanel);
setFrameShadow(Plain);
}
QsciSciListBox::~QsciSciListBox()
{
// Ensure that the main widget doesn't get a focus out event when this is
// destroyed.
setFocusProxy(0);
}
void QsciSciListBox::addItemPixmap(const QPixmap &pm, const QString &txt)
{
new QListWidgetItem(pm, txt, this);
}
int QsciSciListBox::find(const QString &prefix)
{
QList<QListWidgetItem *> itms = findItems(prefix,
Qt::MatchStartsWith|Qt::MatchCaseSensitive);
if (itms.size() == 0)
return -1;
return row(itms[0]);
}
QString QsciSciListBox::text(int n)
{
QListWidgetItem *itm = item(n);
if (!itm)
return QString();
return itm->text();
}
void QsciSciListBox::mouseDoubleClickEvent(QMouseEvent *)
{
lbx->handleDoubleClick();
}
void QsciSciListBox::mouseReleaseEvent(QMouseEvent *)
{
lbx->handleRelease();
}