package com.thinkbiganalytics.nifi.rest.client.layout; /*- * #%L * thinkbig-nifi-rest-client-api * %% * Copyright (C) 2017 ThinkBig Analytics * %% * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * #L% */ import org.apache.nifi.web.api.dto.PositionDTO; /** * Render items both above and below a centered component(i.e. a process group) like: * * - - - - - * - * - - - - - */ public class TopBottomRowsRenderer extends AbstractRenderer { Double centerX; public TopBottomRowsRenderer(LayoutGroup layoutGroup, AlignComponentsConfig alignmentConfig) { super(layoutGroup, alignmentConfig); updateHeight((alignmentConfig.getProcessGroupHeight() + alignmentConfig.getProcessGroupPaddingTopBottom()) * 2); } @Override public void updateHeight(Integer height) { super.updateHeight(height); this.centerX = alignmentConfig.getCenterX() - (alignmentConfig.getProcessGroupWidth() / 2); } private void storePosition(Location location, PositionDTO positionDTO) { storePosition(location.name(), positionDTO); } private Double topYValue() { return layoutGroup.getTopY(); } private Double bottomYValue() { return layoutGroup.getBottomY(); } private PositionDTO getInitialPosition(Location location) { Double groupPlusPadding = new Double(alignmentConfig.getProcessGroupWidth() + alignmentConfig.getProcessGroupPaddingLeftRight()); PositionDTO dto = new PositionDTO(); dto.setX(centerX + groupPlusPadding); dto.setY(layoutGroup.getBottomY()); switch (location) { case BOTTOM_RIGHT: dto.setX(centerX + groupPlusPadding); dto.setY(layoutGroup.getBottomY()); break; case BOTTOM_LEFT: dto.setX(centerX - groupPlusPadding); dto.setY(layoutGroup.getBottomY()); break; case TOP_RIGHT: dto.setX(centerX + groupPlusPadding); dto.setY(layoutGroup.getTopY()); break; case TOP_LEFT: dto.setX(centerX - groupPlusPadding); dto.setY(layoutGroup.getTopY()); break; default: break; } return dto; } private PositionDTO getNextPosition(Location location, PositionDTO lastPosition) { Double groupPlusPadding = new Double(alignmentConfig.getProcessGroupWidth() + alignmentConfig.getProcessGroupPaddingLeftRight()); Double padding = new Double(alignmentConfig.getProcessGroupPaddingLeftRight()); PositionDTO dto = new PositionDTO(); dto.setX(centerX + groupPlusPadding); dto.setY(layoutGroup.getBottomY()); switch (location) { case BOTTOM_RIGHT: dto.setX(lastPosition.getX() + groupPlusPadding); dto.setY(layoutGroup.getBottomY()); break; case BOTTOM_LEFT: dto.setX(lastPosition.getX() - groupPlusPadding); dto.setY(layoutGroup.getBottomY()); break; case TOP_RIGHT: dto.setX(lastPosition.getX() + groupPlusPadding); dto.setY(layoutGroup.getTopY()); break; case TOP_LEFT: dto.setX(lastPosition.getX() - groupPlusPadding); dto.setY(layoutGroup.getTopY()); break; default: break; } return dto; } private PositionDTO getLastPosition(Location location) { return getLastLocationPositions().get(location.name()); } @Override public PositionDTO getNextPosition(PositionDTO lastPosition) { PositionDTO newPosition = null; Location currentLocation = null; Location lastLocation = getLastLocationKey() != null ? Location.valueOf(getLastLocationKey()) : null; if (lastLocation == null) { currentLocation = Location.TOP_LEFT; } else { currentLocation = lastLocation.getNext(); } PositionDTO lastPositionAtLocation = getLastPosition(currentLocation); if (lastPositionAtLocation != null) { newPosition = getNextPosition(currentLocation, lastPositionAtLocation); } else { newPosition = getInitialPosition(currentLocation); } storePosition(currentLocation, newPosition); return newPosition; } enum Location { TOP_LEFT, TOP_RIGHT, BOTTOM_LEFT, BOTTOM_RIGHT; static { TOP_LEFT.next = TOP_RIGHT; TOP_RIGHT.next = BOTTOM_LEFT; BOTTOM_LEFT.next = BOTTOM_RIGHT; BOTTOM_RIGHT.next = TOP_LEFT; } private Location next; public Location getNext() { return next; } } }