File indexing completed on 2024-04-14 05:44:23

0001 /*
0002  *  SPDX-FileCopyrightText: 2002-2003 Jesper K. Pedersen <Qt::blackie@kde.org>
0003  *
0004  *  SPDX-License-Identifier: LGPL-2.0-only
0005  **/
0006 
0007 #include "dragaccepter.h"
0008 
0009 #include <QMimeData>
0010 #include <QMouseEvent>
0011 #include <QPainter>
0012 
0013 #include "concwidget.h"
0014 
0015 DragAccepter::DragAccepter(RegExpEditorWindow *editorWindow, RegExpWidget *parent)
0016     : RegExpWidget(editorWindow, parent)
0017     , _drawLine(false)
0018 {
0019     setAcceptDrops(true);
0020 }
0021 
0022 QSize DragAccepter::sizeHint() const
0023 {
0024     return QSize(10, 10);
0025 }
0026 
0027 void DragAccepter::paintEvent(QPaintEvent *e)
0028 {
0029     QPainter painter(this);
0030     drawPossibleSelection(painter, size());
0031 
0032     if (_drawLine) {
0033         painter.drawLine(0, height() / 2, width(), height() / 2);
0034     }
0035 
0036     RegExpWidget::paintEvent(e);
0037 }
0038 
0039 void DragAccepter::mousePressEvent(QMouseEvent *event)
0040 {
0041     if (event->button() == Qt::RightButton) {
0042         _editorWindow->showRMBMenu(_editorWindow->hasSelection());
0043     } else {
0044         RegExpWidget::mousePressEvent(event);
0045     }
0046 }
0047 
0048 void DragAccepter::mouseReleaseEvent(QMouseEvent *event)
0049 {
0050     if (_editorWindow->isPasteing() && event->button() == Qt::LeftButton) {
0051         RegExp *regexp = _editorWindow->pasteData();
0052 
0053         RegExpWidget *newElm = WidgetFactory::createWidget(regexp, _editorWindow, nullptr);
0054         if (newElm) {
0055             ConcWidget *elm;
0056             if (!(elm = dynamic_cast<ConcWidget *>(newElm))) {
0057                 elm = new ConcWidget(_editorWindow, newElm, nullptr);
0058             }
0059 
0060             Q_ASSERT(elm);
0061 
0062             RegExpWidget *w = dynamic_cast<RegExpWidget *>(parent());
0063             if (w) {
0064                 w->addNewConcChild(this, elm);
0065             }
0066             _editorWindow->updateContent(this);
0067             _editorWindow->clearSelection(true);
0068         }
0069     } else if (_editorWindow->isInserting() && event->button() == Qt::LeftButton) {
0070         if (WidgetFactory::isContainer(_editorWindow->insertType()) && _editorWindow->pointSelected(mapToGlobal(event->pos()))) {
0071             RegExpWidget::mouseReleaseEvent(event);
0072         } else {
0073             RegExpWidget *child = WidgetFactory::createWidget(_editorWindow, dynamic_cast<QWidget *>(parent()), _editorWindow->insertType());
0074             if (child) {
0075                 RegExpWidget *w = dynamic_cast<RegExpWidget *>(parent());
0076                 if (w) {
0077                     w->addNewChild(this, child);
0078                 }
0079                 _editorWindow->updateContent(child);
0080                 child->setFocus();
0081                 _editorWindow->clearSelection(true);
0082             }
0083         }
0084     }
0085     _editorWindow->slotEndActions();
0086 }
0087 
0088 void DragAccepter::dragEnterEvent(QDragEnterEvent *event)
0089 {
0090     bool selfDrag = (event->source() && _isSelected);
0091     if (!selfDrag && event->mimeData()->hasFormat(QStringLiteral("KRegExpEditor/widgetdrag"))) {
0092         event->setDropAction(Qt::MoveAction);
0093         event->accept();
0094     }
0095 }
0096 
0097 void DragAccepter::dropEvent(QDropEvent *event)
0098 {
0099     // The widget will be reparent afterward or part of it will, so no need to give
0100     // it a parent here.
0101     QString name = QString::fromLatin1(event->mimeData()->data(QStringLiteral("KRegExpEditor/widgetdrag")));
0102     RegExp *regexp = WidgetFactory::createRegExp(name);
0103     RegExpWidget *newElm = WidgetFactory::createWidget(regexp, _editorWindow, nullptr);
0104     ConcWidget *elm;
0105     if (!(elm = dynamic_cast<ConcWidget *>(newElm))) {
0106         elm = new ConcWidget(_editorWindow, newElm, nullptr);
0107     }
0108 
0109     Q_ASSERT(elm);
0110 
0111     RegExpWidget *rew = dynamic_cast<RegExpWidget *>(parent());
0112     if (rew) {
0113         rew->addNewConcChild(this, elm);
0114     }
0115 
0116     QWidget *w = dynamic_cast<QWidget *>(parent());
0117     if (w) {
0118         w->update();
0119     }
0120     _editorWindow->updateContent(this);
0121 
0122     bool selfDrag = (event->source());
0123     if (!selfDrag) {
0124         _editorWindow->clearSelection(true);
0125     } else {
0126         // selection should not be cleared here, since we might want to delete it.
0127     }
0128     event->setDropAction(Qt::MoveAction);
0129     event->accept();
0130 }
0131 
0132 RegExp *DragAccepter::regExp() const
0133 {
0134     return nullptr;
0135 }