void RKConsole::newOutput (RCommand *, ROutput *output) { RK_TRACE (APP); // TODO: handle different types of output, once we can differentiate between them // insertAt (output->output, doc->numLines()-1, paragraphLength (doc->numLines() - 1)); if (output_continuation) { editInterface (doc)->insertText (doc->numLines () -1, editInterface (doc)->lineLength (doc->numLines () -1), output->output); } else { editInterface (doc)->insertText (doc->numLines () -1, 0, output->output); } if (RKSettingsModuleConsole::maxConsoleLines ()) { uint c = (uint) doc->numLines(); // TODO: WORKAROUND: Somehow, when removing paragraph 0, the QTextEdit scrolls to the top in between (yes, this also happens when using removeParagaph (0)). Since this may happen very often in newOutput, we're a bit sloppy, and only remove lines after a certain threshold (20) is exceeded. When the command is finished, this will be cleaned up automatically. if (c > (RKSettingsModuleConsole::maxConsoleLines () + 20)) { view->setUpdatesEnabled (false); // major performance boost while removing lines! //TODO : deal with the case when there is already a selection selectionInterface (doc)->setSelection (0, 0, c - RKSettingsModuleConsole::maxConsoleLines (), 0); selectionInterface (doc)->removeSelectedText (); view->setUpdatesEnabled (true); } } cursorAtTheEnd (); output_continuation = true; }
void RKConsole::clear () { RK_TRACE (APP); doc->clear (); doc->insertLine (doc->numLines (), ""); tryNextInBatch (); // need this HACK to remove empty line at start selectionInterface (doc)->setSelection (0, 0, 1, 0); selectionInterface (doc)->removeSelectedText (); }
void KDataToolPluginView::slotToolActivated( const KDataToolInfo &info, const QString &command ) { KDataTool* tool = info.createTool( ); if ( !tool ) { kdWarning() << "Could not create Tool !" << endl; return; } QString text; if ( selectionInterface(m_view->document())->hasSelection() ) text = selectionInterface(m_view->document())->selection(); else text = m_wordUnderCursor; QString mimetype = "text/plain"; QString datatype = "QString"; // If unsupported (and if we have a single word indeed), try application/x-singleword if ( !info.mimeTypes().contains( mimetype ) && m_singleWord ) mimetype = "application/x-singleword"; kdDebug() << "Running tool with datatype=" << datatype << " mimetype=" << mimetype << endl; QString origText = text; if ( tool->run( command, &text, datatype, mimetype) ) { kdDebug() << "Tool ran. Text is now " << text << endl; if ( origText != text ) { uint line, col; viewCursorInterface(m_view)->cursorPositionReal(&line, &col); if ( ! selectionInterface(m_view->document())->hasSelection() ) { KTextEditor::SelectionInterface *si; si = KTextEditor::selectionInterface(m_view->document()); si->setSelection(m_singleWord_line, m_singleWord_start, m_singleWord_line, m_singleWord_end); } // replace selection with 'text' selectionInterface(m_view->document())->removeSelectedText(); viewCursorInterface(m_view)->cursorPositionReal(&line, &col); editInterface(m_view->document())->insertText(line, col, text); // fixme: place cursor at the end: /* No idea yet (Joseph Wenninger) for ( uint i = 0; i < text.length(); i++ ) { viewCursorInterface(m_view)->cursorRight(); } */ } } delete tool; }
QString RKCommandEditorWindow::getSelection () { RK_TRACE (COMMANDEDITOR); return selectionInterface (m_doc)->selection (); }
bool RKConsole::hasSelectedText () { RK_TRACE (APP); return (selectionInterface (doc)->hasSelection ()); }
bool RKConsole::handleKeyPress (QKeyEvent *e) { uint para=0; uint pos=0; view->cursorPosition (¶, &pos); if (para < doc->numLines() - 1 || pos < prefix.length ()) { // not inside the last line? int t = (int) pos; // adjust position before interpreting keystroke if (prefix.length()>pos) t=prefix.length (); view->setCursorPosition (doc->numLines () -1, t); } if (hasSelectedText () && (selectionInterfaceExt(doc)->selStartCol () < (int) prefix.length () || selectionInterfaceExt (doc)->selStartLine () < (int) doc->numLines () -1)) { // There is a selection outside the command line // Eat the key and beep (unless it's just a modifier key). Otherwise it might overwrite or delete the selection if (e->state () == e->stateAfter ()) { KApplication::kApplication ()->beep (); e->ignore (); } return true; } if (current_command) { e->ignore (); return true; } if (e->key() == Qt::Key_Enter || e->key() == Qt::Key_Return) { hinter->hideArgHint (); submitCommand (); return true; } else if (e->state () == Qt::ShiftButton && e->key () == Qt::Key_Home){ if(hasSelectedText()) pos=selectionInterfaceExt(doc)->selEndCol (); //There is already a selection, we take it into account. selectionInterface(doc)->setSelection(doc->numLines()-1,prefix.length (),doc->numLines()-1, pos); cursorAtTheBeginning (); return true; } else if (e->state () == Qt::ShiftButton && e->key () == Qt::Key_Left){ if(pos<=prefix.length ()){ return true; } else { view->shiftCursorLeft (); return false; } } else if (e->key () == Qt::Key_Up) { commandsListUp (); return true; } else if (e->key () == Qt::Key_Down) { commandsListDown (); return true; } else if (e->key () == Qt::Key_Left){ if(pos<=prefix.length ()){ return true; } else { view->cursorLeft(); return true; } } else if (e->key () == Qt::Key_Backspace){ if(pos<=prefix.length ()){ return true; } else { view->backspace(); return true; } } else if (e->key () == Qt::Key_Tab){ doTabCompletion (); return true; } else if (e->key () == Qt::Key_Home){ cursorAtTheBeginning (); return true; } else if (e->key() == Qt::Key_Delete) { view->keyDelete(); return true; } return false; }
void KDataToolPluginView::aboutToShow() { kdDebug()<<"KTextEditor::KDataToolPluginView::aboutToShow"<<endl; QString word; m_singleWord = false; m_wordUnderCursor = QString::null; // unplug old actions, if any: KAction *ac; for ( ac = m_actionList.first(); ac; ac = m_actionList.next() ) { m_menu->remove(ac); } if (m_notAvailable) { m_menu->remove(m_notAvailable); delete m_notAvailable; m_notAvailable=0; } if ( selectionInterface(m_view->document())->hasSelection() ) { word = selectionInterface(m_view->document())->selection(); if ( word.find(' ') == -1 && word.find('\t') == -1 && word.find('\n') == -1 ) m_singleWord = true; else m_singleWord = false; } else { // No selection -> use word under cursor KTextEditor::EditInterface *ei; KTextEditor::ViewCursorInterface *ci; KTextEditor::View *v = (KTextEditor::View*)m_view; ei = KTextEditor::editInterface(v->document()); ci = KTextEditor::viewCursorInterface(v); uint line, col; ci->cursorPositionReal(&line, &col); QString tmp_line = ei->textLine(line); m_wordUnderCursor = ""; // find begin of word: m_singleWord_start = 0; for(int i = col; i >= 0; i--) { QChar ch = tmp_line.at(i); if( ! (ch.isLetter() || ch == '-' || ch == '\'') ) { m_singleWord_start = i+1; break; } m_wordUnderCursor = ch + m_wordUnderCursor; } // find end of word: m_singleWord_end = tmp_line.length(); for(uint i = col+1; i < tmp_line.length(); i++) { QChar ch = tmp_line.at(i); if( ! (ch.isLetter() || ch == '-' || ch == '\'') ) { m_singleWord_end = i; break; } m_wordUnderCursor += ch; } if( ! m_wordUnderCursor.isEmpty() ) { m_singleWord = true; m_singleWord_line = line; } else { m_notAvailable = new KAction(i18n("(not available)"), QString::null, 0, this, SLOT(slotNotAvailable()), actionCollection(),"dt_n_av"); m_menu->insert(m_notAvailable); return; } } KInstance *inst=instance(); QValueList<KDataToolInfo> tools; tools += KDataToolInfo::query( "QString", "text/plain", inst ); if( m_singleWord ) tools += KDataToolInfo::query( "QString", "application/x-singleword", inst ); m_actionList = KDataToolAction::dataToolActionList( tools, this, SLOT( slotToolActivated( const KDataToolInfo &, const QString & ) ) ); for ( ac = m_actionList.first(); ac; ac = m_actionList.next() ) { m_menu->insert(ac); } if( m_actionList.isEmpty() ) { m_notAvailable = new KAction(i18n("(not available)"), QString::null, 0, this, SLOT(slotNotAvailable()), actionCollection(),"dt_n_av"); m_menu->insert(m_notAvailable); } }