public void decrementSelection(int rows) {

		int rowSelected = getSelectedRow();

		if (rowSelected < 0 && model.selectedByteStart >= 0) {
			try {
				model.clear();
				clear();
				List<String> lines = reader.readNextChunkFrom(model.selectedByteStart);
				((FVTableModel) getModel()).addRowsToTop(lines);
			}
			catch (IOException e) {
				Msg.error(this, "Error reading next chunk of data starting from byte " +
					model.selectedByteStart, e);
			}
		}

		// If we're moving to a row that is already in the table, just decrement.
		else if (rowSelected - rows >= 0) {
			Pair byteRange = model.getFilePositionForRow(rowSelected - rows);
			if (byteRange == null) {
				return;
			}
			model.selectedByteStart = byteRange.getStart();
			model.selectedByteEnd = byteRange.getEnd();

			// Now update the viewport...
			if (!viewportUtility.isInViewport(rowSelected - rows)) {
				viewportUtility.scrollViewportTo(rowSelected - rows);
			}
		}
		else {
			// If here, then we either need to load a previous chunk, or we're at the beginning
			// of the file and should just stop.
			try {
				List<String> lines = reader.readPreviousChunk();
				if (lines.size() == 0) {
					return;
				}

				((FVTableModel) getModel()).addRowsToTop(lines);

				Pair byteRange = model.getFilePositionForRow((rowSelected + lines.size()) - rows);
				model.selectedByteStart = byteRange.getStart();
				model.selectedByteEnd = byteRange.getEnd();

				// Need to wait until the table has finished updating before we try and move the
				// viewport down.
				SwingUtilities.invokeLater(() -> {

					// Now slide the viewport back up to account for what we just read in.
					viewportUtility.moveViewportDown(lines.size(), false);
					
					// And remove chunks if necessary.
					if (model.getSize() > model.MAX_VISIBLE_CHUNKS) {
						Chunk chunk = model.remove(model.getSize() - 1);
						if (chunk == null) {
							return;
						}
						((FVTableModel) getModel()).removeRowsFromBottom(chunk.linesInChunk);
					}
				});

				
			}
			catch (IOException e) {
				Msg.error(this, "Error reading previous chunk of data", e);
			}
		}
	}
Moves the table selection up by the number of rows specified, ensuring that selection
does not go beyond the beginning of the file.

@param rows
Ghidra/Framework/Project/src/main/java/ghidra/framework/main/logviewer/ui/FVTable.java