package jpaoletti.jpm.core; import java.util.ArrayList; import jpaoletti.jpm.core.NavigationList.NavigationListItem; /** * A list for quick navigation. * * @author jpaoletti */ public class NavigationList extends ArrayList<NavigationListItem> { public void reset() { this.clear(); } public void update(EntityContainer entityContainer, OperationCommand opCmd, Operation operation) { try { if (operation != null) { cut(entityContainer.getId(), operation.getId()); EntityContainer e = entityContainer; boolean reset = true; while (e != null) { if (includesEntity(e.getId())) { reset = false; break; } e = e.getOwner(); } if (reset) { reset(); } if (isGeneralScoped(operation)) { addItem(entityContainer, operation, PresentationManager.getMessage("pm.core.navigationlist.general", entityContainer.getEntity().getTitle(), operation.getTitle())); } else if (isItemScoped(operation)) { final Object i = entityContainer.getSelected().getInstance(); final NavigationListItem item = addItem(entityContainer, operation, PresentationManager.getMessage("pm.core.navigationlist.item", entityContainer.getEntity().getTitle(), operation.getTitle(), i != null ? i.toString() : "?")); if (i != null) { item.setSelectedId(entityContainer.getSelected().getInstanceId()); } } } } catch (Exception ex) { PresentationManager.getPm().warn(ex); } } protected boolean isGeneralScoped(Operation operation) { return operation.getScope().equals(Operation.SCOPE_GENERAL); } protected boolean isItemScoped(Operation operation) { return operation.getScope().equals(Operation.SCOPE_ITEM); } protected void cut(String entityId, String operationId) { int idx = -1; for (NavigationListItem item : this) { if (item.getEntityContainer().getId().equals(entityId) && item.getOperation().getId().equals(operationId)) { idx = indexOf(item); break; } } if (idx != -1) { removeRange(idx, size()); } } protected boolean includesEntity(String entityId) { for (NavigationListItem item : this) { if (item.getEntityContainer().getId().equals(entityId)) { return true; } } return false; } public NavigationListItem addItem(EntityContainer entityContainer, Operation operation, String title) { //The new item replaces any item scoped operation that is not owner ot the new one. final NavigationListItem item = new NavigationListItem(entityContainer, operation, title); final NavigationListItem lastItem = getLastItem(); if (lastItem != null) { if (!lastItem.getOperation().isNavigable() || (!isGeneralScoped(lastItem.getOperation()) && (entityContainer.getOwner() == null || !lastItem.getEntityContainer().equals(entityContainer.getOwner())))) { this.remove(lastItem); } } this.add(item); return item; } public NavigationListItem getLastItem() { try { return get(size() - 1); } catch (Exception e) { return null; } } public static class NavigationListItem { private EntityContainer entityContainer; private Operation operation; private InstanceId selectedId; private String title; public NavigationListItem(EntityContainer entityContainer, Operation operation, String title) { this.entityContainer = entityContainer; this.operation = operation; this.title = title; } public InstanceId getSelectedId() { return selectedId; } public void setSelectedId(InstanceId selectedId) { this.selectedId = selectedId; } public EntityContainer getEntityContainer() { return entityContainer; } public void setEntityContainer(EntityContainer entityContainer) { this.entityContainer = entityContainer; } public Operation getOperation() { return operation; } public void setOperation(Operation operation) { this.operation = operation; } public String getTitle() { return title; } public void setTitle(String title) { this.title = title; } } }