view src/nabble/view/web/template/PagingNamespace.java @ 0:7ecd1a4ef557

add content
author Franklin Schmidt <fschmidt@gmail.com>
date Thu, 21 Mar 2019 19:15:52 -0600
parents
children
line wrap: on
line source

package nabble.view.web.template;

import nabble.naml.compiler.Command;
import nabble.naml.compiler.IPrintWriter;
import nabble.naml.namespaces.IntegerNamespace;
import nabble.naml.compiler.Interpreter;
import nabble.naml.compiler.ScopedInterpreter;
import nabble.naml.compiler.CommandSpec;
import nabble.naml.compiler.Namespace;


@Namespace (
	name = "paging",
	global = true
)
public final class PagingNamespace {
	private final int totalRows;
	private final int rowsPerPage;
	private final int currentPage;
	private final int lastPage;
	private final int before;
	private final int after;

	PagingNamespace(int totalRows,int currentRow,int rowsPerPage,int neighborPages) {
		this.totalRows = totalRows;
		this.rowsPerPage = rowsPerPage;

		this.currentPage = (currentRow / rowsPerPage) + 1;
		this.lastPage = (totalRows + rowsPerPage - 1) / rowsPerPage;
		neighborPages++;
		int before = currentPage - neighborPages;
		if( before > 1 )
			before++;
		this.before = before;
		int after = currentPage + neighborPages;
		if( after < lastPage )
			after--;
		this.after = after;
	}


	@Command public void rows_per_page(IPrintWriter out,Interpreter interp) {
		out.print( rowsPerPage );
	}

	/* Prints the number of rows the current page is meant to display */
	@Command public void current_page_rows(IPrintWriter out,Interpreter interp) {
		boolean hasNextPage = currentPage < lastPage;
		out.print( hasNextPage? rowsPerPage : totalRows % rowsPerPage);
	}

	@Command public void current_page_number(IPrintWriter out,Interpreter interp) {
		out.print( currentPage );
	}

	@Command public void has_paging(IPrintWriter out,Interpreter interp) {
		out.print( totalRows > rowsPerPage );
	}

	@Command public void is_at_beginning(IPrintWriter out,Interpreter interp) {
		out.print( before <= 1 );
	}

	@Command public void is_at_end(IPrintWriter out,Interpreter interp) {
		out.print( after >= lastPage );
	}

	public static final CommandSpec neighboring_pages = CommandSpec.DO;

	@Command public void neighboring_pages(IPrintWriter out,ScopedInterpreter<Page> interp) {
		final int start = Math.max(1,before);
		final int limit = Math.min(after,lastPage);
		for( int i = start; i <= limit; i++ ) {
			out.print( interp.getArg(page(i),"do") );
		}
	}

	public static final CommandSpec current_page = CommandSpec.DO;

	@Command public void current_page(IPrintWriter out,ScopedInterpreter<Page> interp) {
		out.print( interp.getArg(page(currentPage),"do") );
	}

	public static final CommandSpec first_page = CommandSpec.DO;

	@Command public void first_page(IPrintWriter out,ScopedInterpreter<Page> interp) {
		out.print( interp.getArg(page(1),"do") );
	}

	public static final CommandSpec last_page = CommandSpec.DO;

	@Command public void last_page(IPrintWriter out,ScopedInterpreter<Page> interp) {
		out.print( interp.getArg(page(lastPage),"do") );
	}

	@Command public void has_previous_page(IPrintWriter out,Interpreter interp) {
		out.print( currentPage > 1 );
	}

	public static final CommandSpec previous_page = CommandSpec.DO;

	@Command public void previous_page(IPrintWriter out,ScopedInterpreter<Page> interp) {
		out.print( interp.getArg(page(currentPage-1),"do") );
	}

	@Command public void has_next_page(IPrintWriter out,Interpreter interp) {
		out.print( currentPage < lastPage );
	}

	public static final CommandSpec next_page = CommandSpec.DO;

	@Command public void next_page(IPrintWriter out,ScopedInterpreter<Page> interp) {
		out.print( interp.getArg(page(currentPage+1),"do") );
	}

	private Page page(int number) {
		return new Page( number, number==currentPage, (number-1) * rowsPerPage );
	}

	@Namespace (
		name = "paging_page",
		global = true,
		transparent = true
	)
	public static final class Page {
		private final int number;
		private final boolean isCurrent;
		private final int row;

		private Page(int number,boolean isCurrent,int row) {
			this.number = number;
			this.isCurrent = isCurrent;
			this.row = row;
		}

		@Command public void page_number(IPrintWriter out,Interpreter interp) {
			out.print( number );
		}

		@Command public void is_current_page(IPrintWriter out,Interpreter interp) {
			out.print( isCurrent );
		}

		public static final CommandSpec page_row = CommandSpec.DO;

		@Command public void page_row(IPrintWriter out,ScopedInterpreter<IntegerNamespace> interp) {
			out.print( interp.getArg(new IntegerNamespace(row),"do") );
		}

	}
}