File indexing completed on 2024-04-28 11:21:05

0001 /*
0002     SPDX-License-Identifier: GPL-2.0-or-later
0003     SPDX-FileCopyrightText: 2012 Martin Kuettler <martin.kuettler@gmail.com>
0004 */
0005 
0006 
0007 #ifndef WORKSHEET_TEXT_ITEM_H
0008 #define WORKSHEET_TEXT_ITEM_H
0009 
0010 #include <QGraphicsTextItem>
0011 #include <QTextDocument>
0012 #include <QTextCursor>
0013 
0014 #include <QMenu>
0015 #include <KStandardAction>
0016 
0017 class Worksheet;
0018 class WorksheetEntry;
0019 class WorksheetView;
0020 class WorksheetCursor;
0021 
0022 namespace Cantor {
0023     class Session;
0024 }
0025 
0026 class QTextCharFormat;
0027 
0028 class WorksheetTextItem : public QGraphicsTextItem
0029 {
0030   Q_OBJECT
0031   public:
0032     enum DoubleClickEventBehaviour {Simple, ImageReplacement};
0033 
0034     explicit WorksheetTextItem(WorksheetEntry* parent,
0035                       Qt::TextInteractionFlags ti = Qt::NoTextInteraction);
0036     ~WorksheetTextItem() override;
0037 
0038     void setCursorPosition(QPointF);
0039     QPointF cursorPosition() const;
0040     QTextCursor cursorForPosition(QPointF) const;
0041     QRectF sceneCursorRect(QTextCursor cursor = QTextCursor()) const;
0042     QRectF cursorRect(QTextCursor cursor = QTextCursor()) const;
0043 
0044     enum {TopLeft, BottomRight, TopCoord, BottomCoord};
0045     enum {Type = UserType + 100};
0046 
0047     int type() const override;
0048 
0049     void setFocusAt(int pos = TopLeft, qreal xCoord = 0);
0050 
0051     void enableCompletion(bool b);
0052     void activateCompletion(bool b);
0053     void setItemDragable(bool b);
0054     void enableRichText(bool b);
0055 
0056     virtual void populateMenu(QMenu*, QPointF);
0057     QString resolveImages(const QTextCursor&);
0058 
0059     bool isEditable();
0060     void allowEditing();
0061     void denyEditing();
0062     void setBackgroundColor(const QColor&);
0063     const QColor& backgroundColor() const;
0064     bool richTextEnabled();
0065     double width() const;
0066     double height() const;
0067     virtual qreal setGeometry(qreal x, qreal y, qreal w, bool centered=false);
0068 
0069     Worksheet* worksheet();
0070     WorksheetView* worksheetView();
0071 
0072     void clearSelection();
0073 
0074     bool isUndoAvailable();
0075     bool isRedoAvailable();
0076     bool isCutAvailable();
0077     bool isCopyAvailable();
0078     bool isPasteAvailable();
0079 
0080     // richtext
0081     void setTextForegroundColor();
0082     void setTextBackgroundColor();
0083     void setTextBold(bool);
0084     void setTextItalic(bool);
0085     void setTextUnderline(bool);
0086     void setTextStrikeOut(bool);
0087     void setAlignment(Qt::Alignment);
0088     void setFontFamily(const QString&);
0089     void setFontSize(int);
0090 
0091     QTextCursor search(QString pattern,
0092                        QTextDocument::FindFlags qt_flags,
0093                        const WorksheetCursor& pos);
0094 
0095     DoubleClickEventBehaviour doubleClickBehaviour();
0096     void setDoubleClickBehaviour(DoubleClickEventBehaviour);
0097 
0098   Q_SIGNALS:
0099     void moveToPrevious(int pos, qreal xCoord);
0100     void moveToNext(int pos, qreal xCoord);
0101     void cursorPositionChanged(QTextCursor);
0102     void receivedFocus(WorksheetTextItem*);
0103     void tabPressed();
0104     void backtabPressed();
0105     void applyCompletion();
0106     void doubleClick();
0107     void execute();
0108     void deleteEntry();
0109     void sizeChanged();
0110     void menuCreated(QMenu*, QPointF);
0111     void drag(const QPointF&, QPointF);
0112     void undoAvailable(bool);
0113     void redoAvailable(bool);
0114     void cutAvailable(bool);
0115     void copyAvailable(bool);
0116     void pasteAvailable(bool);
0117 
0118   public Q_SLOTS:
0119     void insertTab();
0120     void cut();
0121     void copy();
0122     void paste();
0123     void undo();
0124     void redo();
0125     void clipboardChanged();
0126     void selectionChanged();
0127     void testSize();
0128 
0129   protected:
0130     void keyPressEvent(QKeyEvent*) override;
0131     void focusInEvent(QFocusEvent*) override;
0132     void focusOutEvent(QFocusEvent*) override;
0133     void mousePressEvent(QGraphicsSceneMouseEvent*) override;
0134     void mouseReleaseEvent(QGraphicsSceneMouseEvent*) override;
0135     void mouseDoubleClickEvent(QGraphicsSceneMouseEvent*) override;
0136     void mouseMoveEvent(QGraphicsSceneMouseEvent*) override;
0137     void contextMenuEvent(QGraphicsSceneContextMenuEvent*) override;
0138     void dragEnterEvent(QGraphicsSceneDragDropEvent*) override;
0139     //void dragLeaveEvent(QGraphicsSceneDragDropEvent*);
0140     void dragMoveEvent(QGraphicsSceneDragDropEvent*) override;
0141     void dropEvent(QGraphicsSceneDragDropEvent*) override;
0142     bool sceneEvent(QEvent*) override;
0143     void wheelEvent(QGraphicsSceneWheelEvent*) override;
0144     void paint(QPainter*, const QStyleOptionGraphicsItem*, QWidget*) override;
0145 
0146   private Q_SLOTS:
0147     //void setHeight();
0148     void updateRichTextActions(QTextCursor cursor);
0149 
0150   private:
0151     void setLocalCursorPosition(QPointF);
0152     QPointF localCursorPosition() const;
0153 
0154     QKeyEvent* eventForStandardAction(KStandardAction::StandardAction);
0155     Cantor::Session* session();
0156 
0157     // richtext
0158     void mergeFormatOnWordOrSelection(const QTextCharFormat&);
0159 
0160   private:
0161     QSizeF m_size;
0162     bool m_completionEnabled{false};
0163     bool m_completionActive{false};
0164     bool m_itemDragable{false};
0165     bool m_richTextEnabled{false};
0166     QColor m_backgroundColor;
0167     DoubleClickEventBehaviour m_eventBehaviour{DoubleClickEventBehaviour::ImageReplacement};
0168 };
0169 
0170 #endif // WORKSHEET_TEXT_ITEM_H