/* * Copyright 2015 Red Hat, Inc. and/or its affiliates. * * 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. */ package org.uberfire.workbench.model.impl; import java.util.ArrayList; import java.util.Collections; import java.util.Iterator; import java.util.LinkedHashSet; import java.util.List; import java.util.Set; import jsinterop.annotations.JsIgnore; import jsinterop.annotations.JsType; import org.jboss.errai.common.client.api.annotations.Portable; import org.uberfire.mvp.impl.DefaultPlaceRequest; import org.uberfire.workbench.model.CompassPosition; import org.uberfire.workbench.model.ContextDefinition; import org.uberfire.workbench.model.ContextDisplayMode; import org.uberfire.workbench.model.PanelDefinition; import org.uberfire.workbench.model.PartDefinition; import org.uberfire.workbench.model.Position; import static org.uberfire.commons.validation.PortablePreconditions.checkNotNull; import static org.uberfire.workbench.model.ContextDisplayMode.SHOW; /** * Default implementation of PanelDefinition */ @Portable @JsType public class PanelDefinitionImpl implements PanelDefinition { private final Set<PartDefinition> parts = new LinkedHashSet<PartDefinition>(); //Ideally this should be a Set but the order of insertion is important private final List<PanelDefinition> children = new ArrayList<PanelDefinition>(); private Integer height = null; private Integer width = null; private Integer minHeight = null; private Integer minWidth = null; private String elementId; private Position position; private String panelType; private boolean isRoot; private ContextDefinition contextDefinition; private ContextDisplayMode contextDisplayMode = SHOW; private PanelDefinition parent = null; @JsIgnore public PanelDefinitionImpl() { this("org.uberfire.client.workbench.panels.impl.MultiTabWorkbenchPanelPresenter"); } @JsIgnore public PanelDefinitionImpl(final String type) { this.panelType = type; } @Override public PanelDefinition getParent() { return parent; } public void setParent(PanelDefinition parent) { if (this.parent != null && parent != null) { throw new IllegalStateException("Can't change parent: this panel still belongs to " + this.parent); } this.parent = parent; } @Override public String getElementId() { return elementId; } @Override public void setElementId(String id) { elementId = id; } @Override public void addPart(final PartDefinition part) { if (part.getParentPanel() != null) { part.getParentPanel().removePart(part); } this.parts.add(part); part.setParentPanel(this); } @Override public PartDefinition addPart(String partSpec) { PartDefinition pd = new PartDefinitionImpl(DefaultPlaceRequest.parse(partSpec)); addPart(pd); return pd; } @Override public boolean removePart(PartDefinition part) { if (this.parts.remove(part)) { part.setParentPanel(null); return true; } return false; } @Override @JsIgnore public Set<PartDefinition> getParts() { return parts; } @Override @JsIgnore public List<PanelDefinition> getChildren() { return Collections.unmodifiableList(new ArrayList<PanelDefinition>(children)); } @Override public void insertChild(final Position position, final PanelDefinition panel) { if (panel == null) { return; } if (children.contains(panel)) { return; } // parent wiring ((PanelDefinitionImpl) panel).setParent(this); checkPosition(position); panel.setPosition(position); final PanelDefinition existingChild = getChild(position); if (existingChild == null) { children.add(panel); } else { removeChild(position); children.add(panel); panel.insertChild(position, existingChild); } } @Override public void appendChild(final Position position, final PanelDefinition panel) { if (panel == null) { return; } if (children.contains(panel)) { return; } checkPosition(position); panel.setPosition(position); final PanelDefinition existingChild = getChild(position); if (existingChild == null) { // parent wiring ((PanelDefinitionImpl) panel).setParent(this); children.add(panel); } else { existingChild.appendChild(position, panel); } } @Override public void appendChild(final PanelDefinition panel) { if (panel == null) { return; } if (children.contains(panel)) { return; } // parent wiring ((PanelDefinitionImpl) panel).setParent(this); children.add(panel); } @Override public PanelDefinition getChild(final Position position) { for (PanelDefinition child : children) { if (child.getPosition() == position) { return child; } } return null; } @Override public void removeChild(final Position position) { Iterator<PanelDefinition> itr = children.iterator(); while (itr.hasNext()) { final PanelDefinition child = itr.next(); if (child.getPosition() == position) { // parent wiring ((PanelDefinitionImpl) child).setParent(null); itr.remove(); } } } @Override public boolean isRoot() { return isRoot; } public void setRoot(boolean isRoot) { this.isRoot = isRoot; } @Override public String getPanelType() { return panelType; } @Override public void setPanelType(String fqcn) { this.panelType = checkNotNull("fqcn", fqcn); } @Override @JsIgnore public Integer getHeight() { return height; } @Override @JsIgnore public void setHeight(Integer height) { if (height != null) { this.height = height; } } @Override @JsIgnore public Integer getWidth() { return width; } @Override @JsIgnore public void setWidth(Integer width) { if (width != null) { this.width = width; } } @Override @JsIgnore public final Integer getMinHeight() { return minHeight; } @Override @JsIgnore public final void setMinHeight(Integer minHeight) { this.minHeight = minHeight; } @Override @JsIgnore public final Integer getMinWidth() { return minWidth; } @Override @JsIgnore public final void setMinWidth(Integer minWidth) { this.minWidth = minWidth; } @Override public final Position getPosition() { return position; } @Override public void setPosition(final Position position) { this.position = position; } @Override public boolean isMaximized() { return false; } @Override public ContextDefinition getContextDefinition() { return contextDefinition; } @Override public void setContextDefinition(final ContextDefinition contextDefinition) { this.contextDefinition = contextDefinition; } @Override public ContextDisplayMode getContextDisplayMode() { return contextDisplayMode; } @Override public void setContextDisplayMode(final ContextDisplayMode contextDisplayMode) { this.contextDisplayMode = contextDisplayMode; } private void checkPosition(final Position position) { if (position == CompassPosition.ROOT || position == CompassPosition.SELF || position == CompassPosition.NONE) { throw new IllegalArgumentException("Position must be NORTH, SOUTH, EAST or WEST"); } } @Override public String toString() { String fullName = getClass().getName(); String simpleName = fullName.substring(fullName.lastIndexOf('.') + 1); return simpleName + " [id=" + elementId + ", parts=" + parts + ", children=" + children + ", panelType=" + panelType + ", contextDefinition=" + contextDefinition + ", contextDisplayMode=" + contextDisplayMode + "]"; } }