📄 keditcl1.cpp
字号:
killstring.detach(); killstring = killstring.mid(col,killstring.length()); if(!killbufferstring.isEmpty() && !killtrue && !lastwasanewline){ killbufferstring += "\n"; } if( (killstring.length() == 0) && !killtrue){ killbufferstring += "\n"; lastwasanewline = true; } if(killstring.length() > 0){ killbufferstring += killstring; lastwasanewline = false; killtrue = true; }else{ lastwasanewline = false; killtrue = !killtrue; } killing = true; QMultiLineEdit::keyPressEvent(e); setModified(); emit CursorPositionChanged(); return; } if ((e->state() & ControlButton ) && (e->key() == Key_Y) ){ int line = 0; int col = 0; getCursorPosition(&line,&col); if(!killtrue) killbufferstring += '\n'; insertAt(killbufferstring,line,col); killing = false; setModified(); emit CursorPositionChanged(); return; } killing = false; if (e->key() == Key_Insert){ this->setOverwriteMode(!this->isOverwriteMode()); emit toggle_overwrite_signal(); return; } if( fill_column_value > 20 ){ if ((e->state() & ControlButton ) && (e->key() == Key_J) ){ deselect(); //Matthias int templine,tempcol; getCursorPosition(&templine,&tempcol); setAutoUpdate(false); int upperbound; bool did_format = format2(par,upperbound); if(!did_format) return; int num_of_rows = 0; QString newpar; int cursorline = upperbound; //Matthias int cursorcol = 0; //Matthias bool cursor_found = false; //Matthias for( int k = 0; k < (int)par.count(); k++){ QString tmp = par.at(k); //Matthias { //Matthias int f = tmp.find((char)1); if (f>-1){ cursor_found = true; cursorcol = f; tmp.remove(f,1); } } newpar += tmp; //Matthias if (!cursor_found) cursorline++; //Matthias if(k != (int)par.count() -1 ) newpar += '\n'; } insertLine(newpar,upperbound); //printf("%s\n",newpar.data()); newpar = ""; num_of_rows = par.count(); par.clear(); setAutoUpdate(true); // setCursorPosition(templine,tempcol); Matthias: do the next line instead setCursorPosition(cursorline, cursorcol); //Matthias#if QT_VERSION < 142 repaint();#else if (!repaintTimer->isActive()) repaintTimer->start(0,TRUE);#endif computePosition(); setModified(); emit CursorPositionChanged(); return; } } if(fill_column_is_set && word_wrap_is_set ){ // word break algorithm if(isprint(e->ascii()) || e->key() == Key_Tab || e->key() == Key_Return || e->key() == Key_Enter){ if (e->key() == Key_Return || e->key() == Key_Enter){ mynewLine(); } else{ if (e->key() == Key_Tab){ if (isReadOnly()) return; QMultiLineEdit::insertChar((char)'\t'); } else{ QMultiLineEdit::keyPressEvent(e); } } int templine,tempcol; getCursorPosition(&templine,&tempcol); // printf("GETCURSOR %d %d\n",templine,tempcol); computePosition(); // printf("LINEPOS %d\n",col_pos); setAutoUpdate(false); bool did_break = format(par); int num_of_rows = 0; if(did_break){ QString newpar; int cursorline = templine; //Matthias int cursorcol = 0; //Matthias bool cursor_found = false; //Matthias for( int k = 0; k < (int)par.count(); k++){ QString tmp = par.at(k); //Matthias { //Matthias int f = tmp.find((char)1); if (f>-1){ cursor_found = true; cursorcol = f; tmp.remove(f,1); } } newpar += tmp; //Matthias if (!cursor_found) cursorline++; //Matthias if(k != (int)par.count() -1 ) newpar += '\n'; } insertLine(newpar,templine); //printf("%s\n",newpar.data()); newpar = ""; num_of_rows = par.count(); par.clear(); /* Matthias: no longer necessary if(col_pos +1 > fill_column_value){ setCursorPosition(templine+1,cursor_offset); // printf("SETCURSOR1 %d %d\n",templine +1,cursor_offset); } else{ setCursorPosition(templine,tempcol); // printf("SETCURSOR2 %d %d\n",templine ,tempcol); } */ // do this instead: setCursorPosition(cursorline, cursorcol); //Matthias } setAutoUpdate(true); // Let's try to reduce flicker by updating only what we need to update // printf("NUMOFROWS %d\n",num_of_rows); if(did_break){#if QT_VERSION < 142 int y1 = -1; int y2 = -1; rowYPos(templine,&y1); rowYPos(templine + num_of_rows ,&y2); if(y1 == -1) y1 = 0; //if(y2 == -1) y2 = this->height(); repaint(0,y1,this->width(),y2);#else if (!repaintTimer->isActive()) repaintTimer->start(0,TRUE);#endif } computePosition(); setModified(); emit CursorPositionChanged(); return; } QMultiLineEdit::keyPressEvent(e); computePosition(); emit CursorPositionChanged(); return; } // end do_wordbreak && fillcolumn_set // fillcolumn but no wordbreak if (fill_column_is_set){ if (e->key() == Key_Tab){ if (isReadOnly()) return; QMultiLineEdit::insertChar((char)'\t'); emit CursorPositionChanged(); return; } if(e->key() == Key_Return || e->key() == Key_Enter){ mynewLine(); emit CursorPositionChanged(); return; } if(isprint(e->ascii())){ if( col_pos >= fill_column_value ){ mynewLine(); } } QMultiLineEdit::keyPressEvent(e); emit CursorPositionChanged(); return; } // default action if(e->key() == Key_Return || e->key() == Key_Enter){ mynewLine(); emit CursorPositionChanged(); return; } if (e->key() == Key_Tab){ if (isReadOnly()) return; QMultiLineEdit::insertChar((char)'\t'); emit CursorPositionChanged(); return; } QMultiLineEdit::keyPressEvent(e); emit CursorPositionChanged();}bool KEdit::format(QStrList& par){ QString mstring; QString pstring; int space_pos; int right; /* char to right of space */ int templine,tempcol; getCursorPosition(&templine,&tempcol); mstring = textLine(templine); /* if((int)mstring.length() <= fill_column_value) return false;*/ int l = 0; int k = 0; for( k = 0, l = 0; k < (int) mstring.length() && l <= fill_column_value; k++){ if(mstring.data()[k] == '\t') l +=8 - l%8; else l ++; } if( l <= fill_column_value) return false; // ########################## TODO consider a autoupdate(false) aroudn getpar ##### getpar(templine,par); // ########################## TODO consider a autoupdate(false) aroudn getpar ##### /* printf("\n"); for ( int i = 0 ; i < (int)par.count() ; i ++){ printf("%s\n",par.at(i)); } printf("\n"); */ for ( int i = 0 ; i < (int)par.count() ; i ++){ // printf("par.count %d line %d\n",par.count(),i); k = 0; l = 0; int last_ok = 0; pstring = par.at(i); /* if((int)pstring.length() <= fill_column_value) break;*/ space_pos = -1; //Matthias for( k = 0, l = 0; k < (int) pstring.length() /* && l <= fill_column_value */; k++){//Matthias: commented out if(pstring.data()[k] == '\t') l +=8 - l%8; else l ++; if ((!space_pos||l<=fill_column_value) && (pstring.data()[k]==' '||pstring.data()[k]=='\t')) //Matthias space_pos = k; if( l <= fill_column_value ) last_ok = k; } if( l <= fill_column_value) break; //mstring = pstring.left( k ); //Matthias no longer needed //space_pos = mstring.findRev( " ", -1, TRUE );//Matthias no longer needed// if(space_pos == -1) // well let try to find a TAB then ..//Matthias no longer needed// space_pos = mstring.findRev( "\t", -1, TRUE );//Matthias no longer needed right = col_pos - space_pos - 1; if( space_pos == -1 ){ /* Matthias: commented it out. Was broken, unfortunately // no space to be found on line, just break, what else could we do? par.remove(i); par.insert(i,pstring.left(last_ok+1)); if(i < (int)par.count() - 1){ QString temp1 = par.at(i+1); QString temp2; if(autoIndentMode){ temp1 = temp1.mid(prefixString(temp1).length(),temp1.length()); } temp2 = pstring.mid(last_ok +1,pstring.length()) + (QString) " " + temp1; temp1 = temp2.copy(); if(autoIndentMode) temp1 = prefixString(pstring) + temp1; par.remove(i+1); par.insert(i+1,temp1); } else{ if(autoIndentMode) par.append(prefixString(pstring) + pstring.mid(last_ok + 1,pstring.length())); else par.append(pstring.mid(last_ok +1,pstring.length())); } if(i==0){ cursor_offset = pstring.length() - last_ok -1; if(autoIndentMode) cursor_offset += prefixString(pstring).length(); //printf("CURSOROFFSET1 %d\n",cursor_offset); } */ } else{ par.remove(i); par.insert(i,pstring.left(space_pos)); if(i < (int)par.count() - 1){ QString temp1 = par.at(i+1); QString temp2; if(autoIndentMode){ temp1 = temp1.mid(prefixString(temp1).length(),temp1.length()); } temp2 = pstring.mid(space_pos +1,pstring.length()) + (QString) " " + temp1; temp1 = temp2.copy(); if(autoIndentMode) temp1 = prefixString(pstring) + temp1; par.remove(i+1); par.insert(i+1,temp1); } else{ if(autoIndentMode) par.append(prefixString(pstring) + pstring.mid(space_pos + 1,pstring.length())); else par.append(pstring.mid(space_pos+1,pstring.length())); } if(i==0){ cursor_offset = pstring.length() - space_pos -1; if(autoIndentMode) cursor_offset += prefixString(pstring).length(); // printf("CURSOROFFSET2 %d\n",cursor_offset); } } } return true;}void KEdit::getpar(int line,QStrList& par){ int templine,tempcol; //Matthias getCursorPosition(&templine,&tempcol);//Matthias QString linestr; par.clear(); int num = numLines(); for(int i = line ; i < num ; i++){ linestr = textLine(line); if (i == templine){ // Matthias // cursor is in this line. At least it was. Insert mark. linestr.insert(tempcol, (char)1); } if(linestr.isEmpty()) break; par.append(linestr); removeLine(line); }}bool KEdit::format2(QStrList& par, int& upperbound){ QString mstring; QString pstring; QString prefix; int right, space_pos; int i; int fill_column = fill_column_value; int templine,tempcol; getCursorPosition(&templine,&tempcol); // ########################## TODO consider a autoupdate(false) around getpar ##### getpar2(templine,par,upperbound,prefix); // ########################## TODO consider a autoupdate(false) around getpar ##### int k = 0; int l = 0; int last_ok = 0; for( k = 0, l = 0; k < (int) prefix.length(); k++){ if(prefix.data()[k] == '\t') l +=8 - l%8; else l ++; } fill_column_value = fill_column_value - l; // safety net -- if(fill_column_value < 10 ) fill_column_value = 10; if(par.count() == 0 ){ fill_column_value = fill_column; return false; } /* printf("PASS 1\n"); for ( int i = 0 ; i < (int)par.count() ; i ++){ printf("%s\n",par.at(i)); } printf("\n"); */ // first pass: break overfull lines for (i = 0 ; i < (int)par.count() ; i ++){ // printf("par.count %d line %d\n",par.count(),i); k = 0; l = 0; last_ok = 0; pstring = par.at(i); space_pos = -1; //Matthias for( k = 0, l = 0; k < (int) pstring.length() /* && l <= fill_column_value */; k++){ //Matthias: commented out if(pstring.data()[k] == '\t') l +=8 - l%8; else l ++; if ((!space_pos||l<=fill_column_value) && (pstring.data()[k]==' '||pstring.data()[k]=='\t')) //Matthias space_pos = k; if( l <= fill_column_value ) last_ok = k; } if( l <= fill_column_value) continue;// mstring = pstring.left( k );// space_pos = mstring.findRev( " ", -1, TRUE ); // Matthias: no longer needed// if(space_pos == -1) // well let try to find a TAB then ..// Matthias: no longer needed// space_pos = mstring.findRev( "\t", -1, TRUE );// Matthias: no longer needed right = col_pos - space_pos - 1; if( space_pos == -1 ){ /* Matthias: commented it out. Was broken, unfortunately // no space to be found on line, just break, what else could we do? par.remove(i); par.insert(i,pstring.left(last_ok+1)); if(i < (int)par.count() - 1){ QString temp1 = par.at(i+1); QString temp2; if(autoIndentMode){ temp1 = temp1.mid(prefixString(temp1).length(),temp1.length()); } temp2 = pstring.mid(last_ok +1,pstring.length()) + (QString) " " + temp1; temp1 = temp2.copy(); if(autoIndentMode) temp1 = prefixString(pstring) + temp1; par.remove(i+1); par.insert(i+1,temp1); } else{ if(autoIndentMode) par.append(prefixString(pstring) + pstring.mid(last_ok + 1,pstring.length())); else par.append(pstring.mid(last_ok +1,pstring.length())); } if(i==0){ cursor_offset = pstring.length() - last_ok -1; if(autoIndentMode) cursor_offset += prefixString(pstring).length(); //printf("CURSOROFFSET1 %d\n",cursor_offset); } */ } else{ par.remove(i); par.insert(i,pstring.left(space_pos)); if(i < (int)par.count() - 1){ QString temp1 = par.at(i+1); QString temp2; if(autoIndentMode){ temp1 = temp1.mid(prefixString(temp1).length(),temp1.length()); } temp2 = pstring.mid(space_pos +1,pstring.length()) + (QString) " " + temp1; temp1 = temp2.copy(); if(autoIndentMode) temp1 = prefixString(pstring) + temp1; par.remove(i+1); par.insert(i+1,temp1); } else{ if(autoIndentMode) par.append(prefixString(pstring) + pstring.mid(space_pos + 1,pstring.length())); else par.append(pstring.mid(space_pos+1,pstring.length())); } if(i==0){ cursor_offset = pstring.length() - space_pos -1; if(autoIndentMode) cursor_offset += prefixString(pstring).length(); // printf("CURSOROFFSET2 %d\n",cursor_offset); } } }
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -