diff options
author | tpearson <tpearson@283d02a7-25f6-0310-bc7c-ecb5cbfe19da> | 2010-02-24 18:42:24 +0000 |
---|---|---|
committer | tpearson <tpearson@283d02a7-25f6-0310-bc7c-ecb5cbfe19da> | 2010-02-24 18:42:24 +0000 |
commit | f508189682b6fba62e08feeb1596f682bad5fff9 (patch) | |
tree | 28aeb0e6c19386c385c1ce5edf8a92c1bca15281 /src/libgui/text_editor.cpp | |
download | piklab-f508189682b6fba62e08feeb1596f682bad5fff9.tar.gz piklab-f508189682b6fba62e08feeb1596f682bad5fff9.zip |
Added KDE3 version of PikLab
git-svn-id: svn://anonsvn.kde.org/home/kde/branches/trinity/applications/piklab@1095639 283d02a7-25f6-0310-bc7c-ecb5cbfe19da
Diffstat (limited to 'src/libgui/text_editor.cpp')
-rw-r--r-- | src/libgui/text_editor.cpp | 346 |
1 files changed, 346 insertions, 0 deletions
diff --git a/src/libgui/text_editor.cpp b/src/libgui/text_editor.cpp new file mode 100644 index 0000000..aecbc99 --- /dev/null +++ b/src/libgui/text_editor.cpp @@ -0,0 +1,346 @@ +/*************************************************************************** + * Copyright (C) 2005-2006 Nicolas Hadacek <hadacek@kde.org> * + * Copyright (C) 2003-2004 Alain Gibaud <alain.gibaud@free.fr> * + * * + * 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. * + ***************************************************************************/ +#include "text_editor.h" + +#include <qfile.h> +#include <qtextedit.h> +#include <qlayout.h> + +#include <klibloader.h> +#include <kpopupmenu.h> +#include <kiconloader.h> +#include <kfiledialog.h> +#include <klocale.h> +#include <kapplication.h> +#include <ktexteditor/markinterface.h> + +#include "main_global.h" +#include "gui_debug_manager.h" +#include "editor_manager.h" +#include "global_config.h" +#include "toplevel.h" + +//----------------------------------------------------------------------------- +const TextEditor::MarkTypeData TextEditor::MARK_TYPE_DATA[Breakpoint::Nb_MarkTypes] = { + { KTextEditor::MarkInterface::Execution, "piklab_program_counter" }, + { KTextEditor::MarkInterface::markType08, "piklab_program_counter_disabled" }, + { KTextEditor::MarkInterface::BreakpointActive, "piklab_breakpoint_active" }, + { KTextEditor::MarkInterface::BreakpointDisabled, "piklab_breakpoint_disabled" }, + { KTextEditor::MarkInterface::BreakpointReached, "piklab_breakpoint_reached" }, + { KTextEditor::MarkInterface::Error, "piklab_breakpoint_invalid" } +}; + +QPixmap TextEditor::pixmap(Breakpoint::MarkType type) +{ + return SmallIcon(MARK_TYPE_DATA[type].pixmap); +} + +TextEditor::TextEditor(bool withDebugger, QWidget *parent, const char *name) + : Editor(parent, name), _view(0) +{ + KLibFactory *factory = KLibLoader::self()->factory("libkatepart"); + if ( factory==0 ) qFatal("Could not find katepart"); + _document = static_cast<Kate::Document *>(factory->create(this, "kate", "KTextEditor::Document")); + _oldModified = _document->isModified(); + _oldReadOnly = !_document->isReadWrite(); + + QVBoxLayout *top = new QVBoxLayout(this, 0, 10); + _split = new QSplitter(this); + _split->setFrameStyle(QFrame::TabWidgetPanel | QFrame::Sunken); + top->addWidget(_split); + + connect(_document, SIGNAL(hlChanged()), SLOT(highlightChanged())); + setAcceptDrops(true); + addView(); + + for (uint i=0; i<Breakpoint::Nb_MarkTypes; i++) + _document->setPixmap(KTextEditor::MarkInterface::MarkTypes(MARK_TYPE_DATA[i].type), pixmap(Breakpoint::MarkType(i))); + + if (withDebugger) QTimer::singleShot(0, this, SLOT(addToDebugManager())); +} + +bool TextEditor::open(const PURL::Url &url) +{ + setReadOnly(url.fileType().data().properties & PURL::ReadOnly); + if ( !_document->openURL(url.kurl()) ) return false; + _view->setEol(url.isDosFile() ? Dos : Unix); + highlightChanged(); + return true; +} + +void TextEditor::addToDebugManager() +{ + static_cast<Debugger::GuiManager *>(Debugger::manager)->addTextEditor(*this); +} + +bool TextEditor::eventFilter(QObject *, QEvent *e) +{ + if ( e->type()==QEvent::KeyPress ) { + if ( static_cast<QKeyEvent *>(e)->key()==Key_Escape ) return true; + } + return false; +} + +void TextEditor::addView() +{ + KTextEditor::View *v = _document->createView(_split); + if ( _view==0 ) _view = static_cast<Kate::View *>(v); + Q_ASSERT(v); + connect(v, SIGNAL(gotFocus(Kate::View *)), SLOT(gotFocus(Kate::View *))); + connect(v, SIGNAL(cursorPositionChanged()), SLOT(statusChanged())); + connect(v, SIGNAL(dropEventPass(QDropEvent *)), SIGNAL(dropEventPass(QDropEvent *))); + connect(v, SIGNAL(newStatus()), SLOT(statusChanged())); + v->show(); + v->setFocus(); + v->child(0, "KateViewInternal")->installEventFilter(this); + KTextEditor::PopupMenuInterface *pmi = KTextEditor::popupMenuInterface(v); + pmi->installPopup(&Main::popup("ktexteditor_popup")); + + // dispatch available space between views + QValueList<int> list = _split->sizes(); + QValueList<int>::Iterator it; + int sum = 0; + for (it = list.begin(); it!= list.end(); ++it) sum += *it; + sum /= list.size(); + for (it = list.begin(); it!=list.end(); ++it) *it = sum; + _split->setSizes(list); + + emit guiChanged(); +} + +void TextEditor::gotFocus(Kate::View *v) +{ + _view = v; + setFocusProxy(v); + statusChanged(); + emit guiChanged(); +} + +void TextEditor::addGui() +{ + Main::toplevel().guiFactory()->addClient(_view); +} + +void TextEditor::removeGui() +{ + Main::toplevel().guiFactory()->removeClient(_view); +} + +void TextEditor::removeCurrentView() +{ + delete _view; + _view = static_cast<Kate::View *>(_document->views().last()); + _document->views().last()->setFocus(); + emit guiChanged(); +} + +bool TextEditor::isReadOnly() const +{ + return !_document->isReadWrite(); +} + +void TextEditor::setReadOnlyInternal(bool ro) +{ + _oldReadOnly = ro; + _document->setReadWrite(!ro); +} + +bool TextEditor::isModified() const +{ + return _document->isModified(); +} + +void TextEditor::setModifiedInternal(bool m) +{ + _oldModified = m; + _document->setModified(m); +} + +void TextEditor::statusChanged() +{ + uint line, col; + _view->cursorPosition(&line, &col) ; + QString text = i18n("Line: %1 Col: %2").arg(line+1).arg(col+1); + if( isReadOnly() ) text += " " + i18n("R/O"); + emit statusTextChanged(" " + text + " "); + if ( isReadOnly()!=_oldReadOnly || isModified()!=_oldModified ) emit guiChanged(); + if ( isModified()!=_oldModified ) emit modified(); + _oldModified = isModified(); + _oldReadOnly = isReadOnly(); + Breakpoint::Data data(url(), line); + Breakpoint::updateActions(&data); +} + +uint TextEditor::highlightMode(const QString &name) const +{ + uint mode = 0; + for (; mode<_document->hlModeCount(); mode++) + if ( _document->hlModeName(mode)==name ) break; + return mode; +} + +void TextEditor::highlightChanged() +{ + if ( fileType()==PURL::Nb_FileTypes ) return; + // managed by hand because of collisions with file extensions + // used by other languages/softwares like other ASM and also PHP... + const char *name = fileType().data().highlightModeName; + if ( name==0 ) return; + uint mode = highlightMode(name); + if ( mode>=_document->hlModeCount() || _document->hlMode()==mode ) return; + _document->setHlMode(mode); +} + +uint TextEditor::cursorLine() const +{ + uint line; + _view->cursorPosition(&line, 0); + return line; +} + +void TextEditor::setMark(uint line, Breakpoint::MarkType type) +{ + _view->setIconBorder(true); + _document->setMark(line, MARK_TYPE_DATA[type].type); +} + +void TextEditor::clearMarks(uint type) +{ + QPtrList<KTextEditor::Mark> marks = _document->marks(); + QPtrListIterator<KTextEditor::Mark> it(marks); + for (; it.current(); ++it) + if ( it.current()->type==type ) _document->removeMark(it.current()->line, it.current()->type); +} + +void TextEditor::clearBreakpointMarks() +{ + for (uint i=0; i<Breakpoint::Nb_MarkTypes; i++) clearMarks(MARK_TYPE_DATA[i].type); +} + +QValueList<uint> TextEditor::bookmarkLines() const +{ + QValueList<uint> lines; + QPtrList<KTextEditor::Mark> marks = _document->marks(); + QPtrListIterator<KTextEditor::Mark> it(marks); + for (; it.current(); ++it) + if ( it.current()->type==KTextEditor::MarkInterface::Bookmark ) lines.append(it.current()->line); + return lines; +} + +void TextEditor::setBookmarkLines(const QValueList<uint> &lines) +{ + clearMarks(KTextEditor::MarkInterface::Bookmark); + QValueList<uint>::const_iterator it; + for (it=lines.begin(); it!=lines.end(); ++it) + _document->setMark(*it, KTextEditor::MarkInterface::Bookmark); +} + + +#if 0 +void TextEditor::slotChangedText() +{ + //This slot runs the instrucion set help bar, + // finds the current command word and compares it to the set of instrucions + //Found in the descript Qstringlist. + + + QString currentword; + QString testval; + + Kate::View *v = currentView(); + currentword = v->currentTextLine(); + //prepare the string for compareing + currentword = currentword.simplifyWhiteSpace(); + currentword = currentword.upper(); + + for ( QStringList::Iterator it = descript.begin(); it != descript.end(); ++it ) + { + testval = *it; + if(testval.startsWith(currentword.left(5))) + { + //if (testval.left(5) == currentword.left(5) ) { + lab_curword->setText(*it); + } + // else { + // lab_curword->setText("Pic Instruction Help"); + // } + } + + +} +#endif +#if 0 +void TextEditor::populateList() +{ + //Populate the qstringlist with the pic instruction set, and the text to go along with them + + descript += "CLRF : Clear F OPERANDS: f"; + descript += "ADDWF : Add W to F OPERANDS: f,d"; + descript += "ANDWF : AND W with F OPERANDS: f,d"; + descript += "CLRW : Clear W OPERANDS: NONE"; + descript += "COMF : Complement F OPERANDS: f,d"; + descript += "DECF : Decrement F OPERANDS: f,d"; + descript += "DECSSZ: Decrement F, Skip 0 OPERANDS: f,d"; + descript += "INCF : Increment F OPERANDS: f,d"; + descript += "INCFSZ: Increment F, Skip 0 OPERANDS: f,d"; + descript += "IORWF : Inclusive OR W with F OPERANDS: f,d"; + descript += "MOVF : Move F, OPERANDS: f,d"; + descript += "MOVWF : Move W to F OPERANDS: f,d"; + descript += "NOP : No Operation OPERANDS: NONE"; + descript += "RLF : Rotate Left F through Carry OPERANDS: f,d"; + descript += "RRF : Rotate Right F through Carry OPERANDS: f,d"; + descript += "SUBWF : Subtract W from F OPERANDS: f,d"; + descript += "SWAPF : Swap Nibbles in F OPERANDS: f,d"; + descript += "XORWF : Exclusive OR W with F OPERANDS: f,s"; + descript += "BCF : Bit Clear F OPERANDS: f,b"; + descript += "BSF : Bit Set F OPERANDS: f,b"; + descript += "BTFSC : Bit Test F, Skip if Clear OPERANDS: f,b"; + descript += "BTFSS : Bit Test F, Skip if Set OPERANDS: f,b"; + descript += "ADDLW : Add Literal and W OPERANDS: k"; + descript += "ANDLW : And Literal and W OPERANDS: k"; + descript += "CLRWDT: Clear Watchdog Timer OPERANDS: NONE"; + descript += "CALL : Call Subroutine OPERANDS: k"; + descript += "GOTO : Goto address OPERANDS: k"; + descript += "IORLW : Inclusive OR literal with W OPERANDS: k"; + descript += "MOVLW : Move Literal with W OPERANDS: k"; + descript += "RETFIE: Return From Interrupt OPERANDS: NONE"; + descript += "RETLW : Return with Literal in W OPERANDS: k"; + descript += "RETURN: Return from subroutine OPERANDS: NONE"; + descript += "SLEEP : Go into Standby Mode OPERANDS: NONE"; + descript += "SUBLW : Subtract W from Literal OPERANDS: k"; + descript += "XORLW : Exclusive OR Literal with W OPERANDS: k"; + +} +#endif + +//----------------------------------------------------------------------------- +SimpleTextEditor::SimpleTextEditor(bool withDebugger, PURL::FileType type, QWidget *parent, const char *name) + : TextEditor(withDebugger, parent, name), _type(type), _file(_sview) +{} + +SimpleTextEditor::SimpleTextEditor(bool withDebugger, QWidget *parent, const char *name) + : TextEditor(withDebugger, parent, name), _type(PURL::Nb_FileTypes), _file(_sview) +{} + +bool SimpleTextEditor::open(const PURL::Url &url) +{ + _type = url.fileType(); + return TextEditor::open(url); +} + +bool SimpleTextEditor::setText(const QString &text) +{ + _file.openForWrite(); + _file.appendText(text); + _file.close(); + if ( !_document->openURL(_file.url().kurl()) ) return false; + highlightChanged(); + return true; +} |