File indexing completed on 2024-12-08 08:10:47
0001 /*************************************************************************** 0002 * Copyright (C) 2004-2005 by David Saxton * 0003 * david@bluehaze.org * 0004 * * 0005 * This program is free software; you can redistribute it and/or modify * 0006 * it under the terms of the GNU General Public License as published by * 0007 * the Free Software Foundation; either version 2 of the License, or * 0008 * (at your option) any later version. * 0009 ***************************************************************************/ 0010 0011 #ifndef TEXTDOCUMENT_H 0012 #define TEXTDOCUMENT_H 0013 0014 #include "config.h" 0015 #include "document.h" 0016 #include "gpsimprocessor.h" 0017 0018 #include <QPointer> 0019 // #include <q3ptrlist.h> 0020 0021 //#include <kate/document.h> 0022 #include <KTextEditor/Document> 0023 #include <KTextEditor/MarkInterface> 0024 0025 class GpsimDebugger; 0026 class SourceLine; 0027 class TextView; 0028 0029 namespace KTextEditor 0030 { 0031 class View; 0032 class Document; 0033 } 0034 0035 typedef QList<int> IntList; 0036 0037 /** 0038 @author David Saxton 0039 */ 0040 class TextDocument : public Document 0041 { 0042 Q_OBJECT 0043 public: 0044 ~TextDocument() override; 0045 0046 enum CodeType { ct_unknown, ct_asm, ct_c, ct_hex, ct_microbe }; 0047 0048 enum MarkType { 0049 Breakpoint = KTextEditor::MarkInterface::markType10, 0050 }; 0051 0052 View *createView(ViewContainer *viewContainer, uint viewAreaId) override; 0053 0054 /** 0055 * Attempts to construct a new TextDocument object and returns a pointer to 0056 * it if successful, or 0 if it failed. 0057 * @returns pointer to constructed object, or 0 if there was a problem 0058 */ 0059 static TextDocument *constructTextDocument(const QString &caption); 0060 /** 0061 * @returns the guessed code type that this file is 0062 */ 0063 CodeType guessedCodeType() const 0064 { 0065 return m_guessedCodeType; 0066 } 0067 /** 0068 * Set the given lines as all bookmarks 0069 */ 0070 void setBookmarks(const IntList &lines); 0071 /** 0072 * Set the given line to a bookmark (or not) 0073 */ 0074 void setBookmark(uint line, bool isBookmark); 0075 /** 0076 * @return List of bookmarks 0077 */ 0078 IntList bookmarkList() const; 0079 0080 /** 0081 * Set the given lines as all breakpoints 0082 */ 0083 void setBreakpoints(const IntList &lines); 0084 /** 0085 * Set the given line to a breakpoint (or not ) 0086 */ 0087 void setBreakpoint(uint line, bool isBreakpoint); 0088 /** 0089 * @return List of breakpoints 0090 */ 0091 IntList breakpointList() const; 0092 0093 #ifndef NO_GPSIM 0094 /** 0095 * Attach ourselves to the given debugger. 0096 * @param ownDebugger whether we have permission to delete it. 0097 */ 0098 void setDebugger(GpsimDebugger *debugger, bool ownDebugger); 0099 GpsimDebugger *debugger() const 0100 { 0101 return m_pDebugger; 0102 } 0103 bool ownDebugger() const 0104 { 0105 return m_bOwnDebugger; 0106 } 0107 /** 0108 * Returns true if the debugger is running (this includes when we are in 0109 * stepping mode) 0110 */ 0111 bool debuggerIsRunning() const; 0112 /** 0113 * Returns true if we are in stepping more 0114 */ 0115 bool debuggerIsStepping() const; 0116 QString debugFile() const 0117 { 0118 return m_debugFile; 0119 } 0120 virtual void clearBreakpoints(); 0121 #endif 0122 0123 bool openURL(const QUrl &url) override; 0124 0125 void fileSave(const QUrl &url); 0126 /** 0127 * Set the document to the given text, making the document unmodified, and 0128 * reseting the undo/redo history/ 0129 * @param asInitial whether the next should be treated as if we had just 0130 * opened the file (no undo/redo history, and unmodified). 0131 */ 0132 void setText(const QString &text, bool asInitial); 0133 /** 0134 * Attempts to guess the filetype from the file extension, and load an 0135 * appropriate highlighting/etc 0136 * @param allowDisable If false, will simply keep the old scheme if nothing 0137 * appropriate is found 0138 */ 0139 void guessScheme(bool allowDisable = true); 0140 0141 void fileSave() override 0142 { 0143 fileSave(url()); 0144 } 0145 void fileSaveAs() override; 0146 void print() override; 0147 void setModified(bool modified) override; 0148 0149 KTextEditor::View *createKateView(QWidget *parent); 0150 0151 void undo() override; 0152 void redo() override; 0153 void cut() override; 0154 void copy() override; 0155 void paste() override; 0156 0157 bool isModified() const override 0158 { 0159 return m_doc->isModified(); 0160 } 0161 bool isUndoAvailable() const override; // { return (m_doc->undoCount() != 0); } 0162 bool isRedoAvailable() const override; // { return (m_doc->redoCount() != 0); } 0163 0164 void clearBookmarks(); 0165 bool fileClose() override; 0166 0167 static const QPixmap *inactiveBreakpointPixmap(); 0168 static const QPixmap *activeBreakpointPixmap(); 0169 static const QPixmap *reachedBreakpointPixmap(); 0170 static const QPixmap *disabledBreakpointPixmap(); 0171 static const QPixmap *executionPointPixmap(); 0172 /** 0173 * Returns a TextView pointer to the active TextView (if there is one) 0174 */ 0175 TextView *textView() const; 0176 0177 enum ConvertToTarget { 0178 MicrobeOutput, // (not used) 0179 AssemblyOutput, 0180 HexOutput, 0181 PICOutput 0182 }; 0183 0184 KTextEditor::Document *kateDocument() const 0185 { 0186 return m_doc; 0187 } 0188 0189 public slots: 0190 /** 0191 * @param target as ConvertToTarget 0192 */ 0193 void slotConvertTo(QAction *action); 0194 void convertToAssembly() override; 0195 void convertToHex() override; 0196 void convertToPIC() override; 0197 void formatAssembly(); 0198 void debugRun() override; 0199 void debugInterrupt() override; 0200 void debugStep() override; 0201 void debugStepOver(); 0202 void debugStepOut(); 0203 void debugStop() override; 0204 void slotInitLanguage(CodeType type); 0205 /** 0206 * Called when change line / toggle marks 0207 */ 0208 void slotUpdateMarksInfo(); 0209 0210 void slotDebugSetCurrentLine(const SourceLine &line); 0211 /** 0212 * Initialize the actions appropriate for when the debugger is running 0213 * or stepping 0214 */ 0215 void slotInitDebugActions(); 0216 0217 protected: 0218 /** 0219 * Returns a filepath with the editor's contents in. If the url of this file 0220 * is non-empty (i.e. the user has already saved the file), then that url is 0221 * returned. Otherwise, a temporary file with the given extension (ext) is 0222 * created, and the location of this file is returned. 0223 */ 0224 QString outputFilePath(const QString &ext); 0225 void saveDone(); 0226 #ifndef NO_GPSIM 0227 /** 0228 * Looks at the list of marks returned by Kate, and syncs them with the 0229 * marks that we know about 0230 */ 0231 void syncBreakpoints(); 0232 0233 int m_lastDebugLineAt; // Last line with a debug point reached mark 0234 bool m_bLoadDebuggerAsHLL; 0235 #endif 0236 0237 KTextEditor::Document *m_doc; 0238 QPointer<TextDocument> m_pLastTextOutputTarget; 0239 0240 private slots: 0241 void setLastTextOutputTarget(TextDocument *target); 0242 void slotSyncModifiedStates(); 0243 void slotCODCreationSucceeded(); 0244 void slotCODCreationFailed(); 0245 void slotDebuggerDestroyed(); 0246 void slotBookmarkRequested(); 0247 // void slotSelectionmChanged(); // 2016.09.08 - moved to TextView 0248 0249 private: 0250 TextDocument(const QString &caption); 0251 bool m_constructorSuccessful; 0252 CodeType m_guessedCodeType; 0253 QList<QAction *> m_bookmarkActions; 0254 0255 #ifndef NO_GPSIM 0256 bool b_lockSyncBreakpoints; // Used to avoid calling syncMarks() when we are currently doing so 0257 bool m_bOwnDebugger; 0258 QPointer<GpsimDebugger> m_pDebugger; 0259 QString m_symbolFile; 0260 QString m_debugFile; 0261 #endif 0262 }; 0263 0264 #endif