/*************************************************************************** * Copyright (C) 2004-2005 by David Saxton * * david@bluehaze.org * * * * This program 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 of the License, or * * (at your option) any later version. * ***************************************************************************/ #ifndef TEXTDOCUMENT_H #define TEXTDOCUMENT_H #ifdef HAVE_CONFIG_H #include "config.h" #endif #include "document.h" #include #include class GpsimDebugger; class SourceLine; class TextView; typedef TQValueList IntList; /** @author David Saxton */ class TextDocument : public Document { Q_OBJECT public: ~TextDocument(); enum CodeType { ct_unknown, ct_asm, ct_c, ct_hex, ct_microbe }; enum MarkType { Bookmark = KTextEditor::MarkInterface::markType01, Breakpoint = KTextEditor::MarkInterface::markType02, ActiveBreakpoint = KTextEditor::MarkInterface::markType03, ReachedBreakpoint = KTextEditor::MarkInterface::markType04, DisabledBreakpoint = KTextEditor::MarkInterface::markType05, ExecutionPoint = KTextEditor::MarkInterface::markType06 }; virtual View *createView( ViewContainer *viewContainer, uint viewAreaId, const char *name = 0l ); /** * Attempts to construct a new TextDocument object and returns a pointer to * it if successful, or 0 if it failed. * @returns pointer to constructed object, or 0 if there was a problem */ static TextDocument *constructTextDocument( const TQString& caption, KTechlab *parent, const char *name = 0L ); /** * @returns the guessed code type that this file is */ CodeType guessedCodeType() const { return m_guessedCodeType; } /** * Set the given lines as all bookmarks */ void setBookmarks( const IntList &lines ); /** * Set the given line to a bookmark (or not) */ void setBookmark( uint line, bool isBookmark ); /** * @return List of bookmarks */ IntList bookmarkList() const; /** * Set the given lines as all breakpoints */ void setBreakpoints( const IntList &lines ); /** * Set the given line to a breakpoint (or not ) */ void setBreakpoint( uint line, bool isBreakpoint ); /** * @return List of breakpoints */ IntList breakpointList() const; #ifndef NO_GPSIM /** * Attach ourselves to the given debugger. * @param ownDebugger whether we have permission to delete it. */ void setDebugger( GpsimDebugger * debugger, bool ownDebugger ); GpsimDebugger * debugger() const { return m_pDebugger; } bool ownDebugger() const { return m_bOwnDebugger; } /** * Returns true if the debugger is running (this includes when we are in * stepping mode) */ bool debuggerIsRunning() const; /** * Returns true if we are in stepping more */ bool debuggerIsStepping() const; TQString debugFile() const { return m_debugFile; } virtual void clearBreakpoints(); #endif virtual bool openURL(const KURL& url); void fileSave(const KURL& url); /** * Set the document to the given text, making the document unmodified, and * reseting the undo/redo history/ * @param asInitial whether the next should be treated as if we had just * opened the file (no undo/redo history, and unmodified). */ void setText( const TQString & text, bool asInitial ); /** * Attempts to guess the filetype from the file extension, and load an * appropriate highlighting/etc * @param allowDisable If false, will simply keep the old scheme if nothing * appropriate is found */ void guessScheme( bool allowDisable = true ); virtual void fileSave() { fileSave(url()); } virtual void fileSaveAs(); virtual void print(); virtual void setModified( bool modified ); Kate::View* createKateView( TQWidget *parent, const char *name = 0l ); virtual void undo(); virtual void redo(); virtual void cut(); virtual void copy(); virtual void paste(); virtual bool isModified() const { return m_doc->isModified(); } virtual bool isUndoAvailable() const { return (m_doc->undoCount() != 0); } virtual bool isRedoAvailable() const { return (m_doc->redoCount() != 0); } void clearBookmarks(); virtual bool fileClose(); static const TQPixmap* inactiveBreakpointPixmap(); static const TQPixmap* activeBreakpointPixmap(); static const TQPixmap* reachedBreakpointPixmap(); static const TQPixmap* disabledBreakpointPixmap(); static const TQPixmap* executionPointPixmap(); /** * Returns a TextView pointer to the active TextView (if there is one) */ TextView *textView() const; enum ConvertToTarget { MicrobeOutput, // (not used) AssemblyOutput, HexOutput, PICOutput }; Kate::Document * kateDocument() const { return m_doc; } public slots: /** * @param target as ConvertToTarget */ void slotConvertTo( int target ); void convertToAssembly(); void convertToHex(); void convertToPIC(); void formatAssembly(); void debugRun(); void debugInterrupt(); void debugStep(); void debugStepOver(); void debugStepOut(); void debugStop(); void slotInitLanguage( CodeType type ); /** * Called when change line / toggle marks */ void slotUpdateMarksInfo(); void slotDebugSetCurrentLine( const SourceLine & line ); /** * Initialize the actions appropriate for when the debugger is running * or stepping */ void slotInitDebugActions(); protected: /** * Returns a filepath with the editor's contents in. If the url of this file * is non-empty (i.e. the user has already saved the file), then that url is * returned. Otherwise, a temporary file with the given extension (ext) is * created, and the location of this file is returned. */ TQString outputFilePath( const TQString &ext ); void saveDone(); #ifndef NO_GPSIM /** * Looks at the list of marks returned by Kate, and syncs them with the * marks that we know about */ void syncBreakpoints(); int m_lastDebugLineAt; // Last line with a debug point reached mark bool m_bLoadDebuggerAsHLL; #endif Kate::Document *m_doc; TQGuardedPtr m_pLastTextOutputTarget; private slots: void setLastTextOutputTarget( TextDocument * target ); void slotSyncModifiedStates(); void slotCODCreationSucceeded(); void slotCODCreationFailed(); void slotDebuggerDestroyed(); void slotBookmarkRequested(); void slotSelectionmChanged(); private: TextDocument( const TQString& caption, KTechlab *parent, const char *name = 0L ); bool m_constructorSuccessful; CodeType m_guessedCodeType; TQPtrList m_bookmarkActions; #ifndef NO_GPSIM bool b_lockSyncBreakpoints; // Used to avoid calling syncMarks() when we are currently doing so bool m_bOwnDebugger; TQGuardedPtr m_pDebugger; TQString m_symbolFile; TQString m_debugFile; #endif }; #endif