Use N/P to jump to next/previous comments

Previously "n" and "p" took you to the start of the next and previous
code change hunk, or comment, whichever it encountered first in the
file.  Now "N" and "P" jump to the next comment, skipping over any
code hunks which did not have comments on them.

Bug: issue 380
Change-Id: I108c9764cd58001cee8eeb9f2d4cde4fc94d51c9
Signed-off-by: Shawn O. Pearce <sop@google.com>
This commit is contained in:
Shawn O. Pearce
2010-01-14 11:35:32 -08:00
parent 0cb56577c3
commit c5e1ad7ae5
3 changed files with 79 additions and 0 deletions

View File

@@ -68,6 +68,8 @@ public abstract class AbstractPatchContentTable extends NavigationTable<Object>
keysNavigation.add(new NextKeyCommand(0, 'j', PatchUtil.C.lineNext()));
keysNavigation.add(new PrevChunkKeyCmd(0, 'p', PatchUtil.C.chunkPrev()));
keysNavigation.add(new NextChunkKeyCmd(0, 'n', PatchUtil.C.chunkNext()));
keysNavigation.add(new PrevCommentCmd(0, 'P', PatchUtil.C.commentPrev()));
keysNavigation.add(new NextCommentCmd(0, 'N', PatchUtil.C.commentNext()));
keysAction.add(new OpenKeyCommand(0, 'o', PatchUtil.C.expandComment()));
keysAction.add(new OpenKeyCommand(0, KeyCodes.KEY_ENTER, PatchUtil.C
@@ -258,6 +260,55 @@ public abstract class AbstractPatchContentTable extends NavigationTable<Object>
}
}
private void moveToPrevComment(int row) {
while (0 <= row && isComment(row)) {
row--;
}
for (; 0 <= row; row--) {
if (isComment(row)) {
movePointerTo(row, false);
scrollIntoView(oneBefore(row), oneAfter(row));
return;
}
}
// No prior comment found? Try to hit the first line in the file.
//
for (row = 0; row < table.getRowCount(); row++) {
if (getRowItem(row) != null) {
movePointerTo(row);
break;
}
}
}
private void moveToNextComment(int row) {
final int max = table.getRowCount();
while (row < max && isComment(row)) {
row++;
}
for (; row < max; row++) {
if (isComment(row)) {
movePointerTo(row, false);
scrollIntoView(oneBefore(row), oneAfter(row));
return;
}
}
// No next comment found? Try to hit the last line in the file.
//
for (row = max - 1; row >= 0; row--) {
if (getRowItem(row) != null) {
movePointerTo(row);
break;
}
}
}
private boolean isComment(int row) {
return getRowItem(row) instanceof CommentList;
}
/** Invoked when the user clicks on a table cell. */
protected abstract void onCellDoubleClick(int row, int column);
@@ -613,6 +664,30 @@ public abstract class AbstractPatchContentTable extends NavigationTable<Object>
}
}
public class PrevCommentCmd extends KeyCommand {
public PrevCommentCmd(int mask, int key, String help) {
super(mask, key, help);
}
@Override
public void onKeyPress(final KeyPressEvent event) {
ensurePointerVisible();
moveToPrevComment(getCurrentRow());
}
}
public class NextCommentCmd extends KeyCommand {
public NextCommentCmd(int mask, int key, String help) {
super(mask, key, help);
}
@Override
public void onKeyPress(final KeyPressEvent event) {
ensurePointerVisible();
moveToNextComment(getCurrentRow());
}
}
private class PublishedCommentPanel extends CommentPanel implements
ClickHandler {
final PatchLineComment comment;

View File

@@ -39,6 +39,8 @@ public interface PatchConstants extends Constants {
String lineNext();
String chunkPrev();
String chunkNext();
String commentPrev();
String commentNext();
String fileList();
String expandComment();

View File

@@ -20,6 +20,8 @@ linePrev = Previous line
lineNext = Next line
chunkPrev = Previous diff chunk or comment
chunkNext = Next diff chunk or comment
commentPrev = Previous comment
commentNext = Next comment
fileList = Browse files in patch set
expandComment = Expand or collapse comment