text: make do_justify() use the cutbuffer
This is the last preparation for making justifications undoable in the regular way.master
parent
fb38995d36
commit
14c085898b
100
src/text.c
100
src/text.c
|
@ -2244,6 +2244,15 @@ void do_justify(bool full_justify)
|
||||||
bool filebot_inpar;
|
bool filebot_inpar;
|
||||||
/* Whether the text at filebot is part of the current paragraph. */
|
/* Whether the text at filebot is part of the current paragraph. */
|
||||||
|
|
||||||
|
filestruct *was_cutbuffer = cutbuffer;
|
||||||
|
/* The old cutbuffer, so we can justify in the current cutbuffer. */
|
||||||
|
filestruct *was_cutbottom = cutbottom;
|
||||||
|
/* The old cutbottom, so we can justify in the current cutbuffer. */
|
||||||
|
size_t jus_len;
|
||||||
|
/* The number of lines we're storing in the current cutbuffer. */
|
||||||
|
filestruct *jusline;
|
||||||
|
/* The line that we're justifying in the current cutbuffer. */
|
||||||
|
|
||||||
/* If we're justifying the entire file, start at the beginning. */
|
/* If we're justifying the entire file, start at the beginning. */
|
||||||
if (full_justify) {
|
if (full_justify) {
|
||||||
openfile->current = openfile->fileage;
|
openfile->current = openfile->fileage;
|
||||||
|
@ -2262,51 +2271,60 @@ void do_justify(bool full_justify)
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Prepare to put the text we want to justify in the cutbuffer. */
|
||||||
|
cutbuffer = NULL;
|
||||||
|
cutbottom = NULL;
|
||||||
|
|
||||||
/* Set
|
/* Set
|
||||||
* first_par_line to the first line of the paragraph. */
|
* first_par_line and last_par_line to the first line of the paragraph. */
|
||||||
first_par_line = openfile->current;
|
first_par_line = openfile->current;
|
||||||
|
|
||||||
/* Search for a paragraph(s) and justify them. If we're justifying the
|
|
||||||
* whole file, loop until we've found every paragraph. */
|
|
||||||
do {
|
|
||||||
filestruct *current_save = openfile->current;
|
|
||||||
|
|
||||||
/* Justify the current paragraph. */
|
|
||||||
justify_paragraph(&openfile->current, quote_len, par_len);
|
|
||||||
|
|
||||||
/* Renumber the now-justified paragraph, since both refreshing the
|
|
||||||
* edit window and finding a paragraph need correct line numbers. */
|
|
||||||
renumber(current_save);
|
|
||||||
|
|
||||||
/* The search put us on the last line of the paragraph, so
|
|
||||||
* put the cursor at the end of it. */
|
|
||||||
openfile->current_x = strlen(openfile->filebot->data);
|
|
||||||
|
|
||||||
/* If we're at the end of the last line of the file, it means that
|
|
||||||
* there aren't any paragraphs left, so break out of the loop. */
|
|
||||||
if (openfile->current == openfile->filebot && filebot_inpar)
|
|
||||||
break;
|
|
||||||
|
|
||||||
/* If we're justifying the entire file,
|
|
||||||
* find the next line of the paragraph(s) to be justified.
|
|
||||||
* If the search failed, it means that there are no paragraph(s) to
|
|
||||||
* justify, so break out of the loop. */
|
|
||||||
} while (full_justify && find_paragraph(&openfile->current, &filebot_inpar,
|
|
||||||
"e_len, &par_len));
|
|
||||||
|
|
||||||
/* If we justified the entire file,
|
|
||||||
* the search put us on the last line of the file, so
|
|
||||||
* put the cursor at the end of it. */
|
|
||||||
if (full_justify)
|
|
||||||
openfile->current_x = strlen(openfile->filebot->data);
|
|
||||||
|
|
||||||
/* We are now done justifying the paragraph(s), so clean
|
|
||||||
* up. totsize has been maintained above.
|
|
||||||
* Set last_par_line to the end of the paragraph(s) justified.
|
|
||||||
* If we've justified the entire file and broken out of the loop,
|
|
||||||
* this should be the last line of the file. */
|
|
||||||
last_par_line = openfile->current;
|
last_par_line = openfile->current;
|
||||||
|
|
||||||
|
/* If we're justifying the entire file, move last_par_line down to the
|
||||||
|
* last line of the file (counting the text at filebot). Otherwise, move
|
||||||
|
* last_par_line down to the last line of the paragraph. */
|
||||||
|
if (full_justify) {
|
||||||
|
jus_len = openfile->filebot->lineno - first_par_line->lineno;
|
||||||
|
|
||||||
|
if (openfile->filebot->data[0] != '\0') {
|
||||||
|
jus_len++;
|
||||||
|
filebot_inpar = TRUE;
|
||||||
|
}
|
||||||
|
} else
|
||||||
|
jus_len = par_len;
|
||||||
|
|
||||||
|
while (jus_len > 0 && last_par_line->next != NULL) {
|
||||||
|
last_par_line = last_par_line->next;
|
||||||
|
jus_len--;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Do (the equivalent of) a marked cut of first_par_line to last_par_line.
|
||||||
|
* We can't do an actual marked cut, since we might be in tiny mode, in
|
||||||
|
* which case it's unavailable. */
|
||||||
|
extract_buffer(&cutbuffer, &cutbottom, first_par_line, 0, last_par_line,
|
||||||
|
filebot_inpar ? strlen(last_par_line->data) : 0);
|
||||||
|
|
||||||
|
/* Prepare to justify the text we just put in the cutbuffer. */
|
||||||
|
jusline = cutbuffer;
|
||||||
|
|
||||||
|
/* Justify the current paragraph. */
|
||||||
|
justify_paragraph(&jusline, quote_len, par_len);
|
||||||
|
|
||||||
|
/* If we're justifying the entire file, search for and justify paragraphs
|
||||||
|
* until we can't anymore. */
|
||||||
|
if (full_justify) {
|
||||||
|
while (find_paragraph(&jusline, &filebot_inpar, "e_len, &par_len))
|
||||||
|
justify_paragraph(&jusline, quote_len, par_len);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Do (the equivalent of) a paste of the justified text. */
|
||||||
|
ingraft_buffer(cutbuffer);
|
||||||
|
|
||||||
|
/* We're done justifying. Restore the old cutbuffer. */
|
||||||
|
cutbuffer = was_cutbuffer;
|
||||||
|
cutbottom = was_cutbottom;
|
||||||
|
|
||||||
|
set_modified();
|
||||||
edit_refresh();
|
edit_refresh();
|
||||||
|
|
||||||
/* Show what we justified on the status bar. */
|
/* Show what we justified on the status bar. */
|
||||||
|
|
Loading…
Reference in New Issue