/* * 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; import java.util.List; import java.util.Set; import jsinterop.annotations.JsIgnore; import jsinterop.annotations.JsMethod; import jsinterop.annotations.JsType; import org.uberfire.mvp.PlaceRequest; import org.uberfire.mvp.impl.DefaultPlaceRequest; /** * Describes a physical region within a Workbench Perspective. Panels have a set physical size that they occupy, which * is divided up between any panel decorations (a tab bar or dropdown list is common), one or more Parts (generally * Editors or Screens), one of which can be visible at a time, and also child Panel Definitions, all of which are * visible simultaneously. */ @JsType public interface PanelDefinition { /** * Special value for {@link #getPanelType()}. When adding a new child panel to a parent panel, if the child panel * has this type, the parent can create any type of PanelPresenter it likes. Typically, each panel type will have * some constant default child type that it uses in this scenario. */ String PARENT_CHOOSES_TYPE = "PARENT_CHOOSES_TYPE"; /** * Returns the DOM ID that will be given to a panel created from this definition. If null, no ID attribute will be * set on a panel created from this definition. */ public String getElementId(); /** * Specifies the DOM ID that should be given to the live panel's element. Applications are responsible for ensuring * the ID values are unique among all live panels. * @param id the DOM ID to give the panel when it is created. If null, no ID will be set on the panel. */ public void setElementId(final String id); /** * Specifies content that should be put in this panel's main display area when it is materialized. The content to * add is specified by a PartDefinition, at the core of which is a {@link PlaceRequest} that identifies a * WorkbenchActivity (either a screen or an editor). * <p> * If the given part already belongs to an existing panel, it will be removed from that panel by a call to * removePart(part). * @param part The Part to add. Must not be null. The part's place must specify a WorkbenchActivity bean. */ public void addPart(final PartDefinition part); /** * Specifies content that should be put in this panel's main display area when it is materialized. * <p> * This is a convenience method equivalent to * <tt>addPart(new PartDefinitionImpl(DefaultPlaceRequest.parse(partSpec)))</tt>. * @param partSpec An PlaceRequest ID with optional parameters, encoded as specified in * {@link DefaultPlaceRequest#parse(CharSequence)}. Must not be null. The place ID must specify a * WorkbenchActivity bean (either a screen or an editor). * @return the PartDefinition object that was created and added to this panel definition. */ @JsMethod(name = "addPartById") public PartDefinition addPart(final String partSpec); /** * Removes the given part definition from this panel definition. * @param part The Part to be removed * @return true if the part was found and removed; false if it did not belong to this panel in the first place. */ public boolean removePart(final PartDefinition part); /** * Get the Parts contained in the Panel * @return The parts */ public Set<PartDefinition> getParts(); /** * Returns this panel's immediate child panels. * @return a snapshot of the current child list. The list is not modifiable, and will not change as panels are added * and removed from this panel. The returned list is never null. */ public List<PanelDefinition> getChildren(); /** * Insert a Panel as an immediate child at the given Position. If this * Panel already has a child at the specified position the existing Panel at * that position becomes a child of the Panel being added at the same * Position. * @param position The Position to add the child * @param panel The child Panel */ public void insertChild(final Position position, final PanelDefinition panel); /** * Append a Panel at the first empty child position. If this Panel already * has a child at the specified position the descendants are followed until * an empty position is found. * @param position The Position to add the child * @param panel The child Panel */ @JsMethod(name = "appendChildAtPosition") public void appendChild(final Position position, final PanelDefinition panel); /** * Append a Panel at the first empty child position. If this Panel already * has a child at the specified position the descendants are followed until * an empty position is found. * @param panel The child Panel */ public void appendChild( final PanelDefinition panel); /** * Return the parent panel, or null if {@link #isRoot()}} returns true. * @return a parent panel definition or null if at the top of the hierarchy */ public PanelDefinition getParent(); /** * Get the Panel's immediate child Panel at the given Position * @param position The child Panel's Position * @return The child Panel or null, if a child does not exist at the given * Position */ public PanelDefinition getChild(final Position position); /** * Remove a child from the Panel * @param position */ public void removeChild(final Position position); /** * Is this Panel the root of the Perspective definition * @return True if the Panel is the root */ public boolean isRoot(); /** * Specifies the WorkbenchPanelPresenter implementation that should be used when adding this panel to the UI. Must * refer to a Dependent-scoped Errai IOC bean type. * @return fully-qualified class name of the WorkbenchPanelPresenter implementation to use. Must not be null, but * may be the special value {@link #PARENT_CHOOSES_TYPE}. */ public String getPanelType(); /** * Specifies the WorkbenchPanelPresenter implementation that should be used when adding this panel to the UI. Must * refer to a Dependent-scoped Errai IOC bean type. * @param fqcn fully-qualified class name of the WorkbenchPanelPresenter implementation to use. Must not be null, but * may be the special value {@link #PARENT_CHOOSES_TYPE}. */ public void setPanelType(String fqcn); /** * Get the height of the Panel in pixels * @return The height, or null if not set */ @JsIgnore public Integer getHeight(); /** * Set the height of this panel in pixels using a primitive int to make this method exportable to JS. * @param width The width to set. */ default void setHeight(int height) { setHeight(Integer.valueOf(height)); } /** * Get the height of this panel in pixels as a primitive int to make this method exportable to JS. * @return The height, or -1 if not set. */ default int getHeightAsInt() { final Integer height = getHeight(); return (height != null) ? height : -1; } /** * Set the height of this panel in pixels. * @param height The height to set. If null, the existing height value is retained. */ @JsIgnore public void setHeight(Integer height); /** * Get the width of this panel in pixels. * @return The width, or null if not set. */ @JsIgnore public Integer getWidth(); /** * Set the width of this panel in pixels using a primitive int to make this method exportable to JS. * @param width The width to set. */ default void setWidth(int width) { setWidth(Integer.valueOf(width)); } /** * Get the width of this panel in pixels as a primitive int to make this method exportable to JS. * @return The width, or -1 if not set. */ default int getWidthAsInt() { final Integer width = getWidth(); return (width != null) ? width : -1; } /** * Set the width of this panel in pixels. * @param width The width to set. If null, the existing width value is retained. */ @JsIgnore public void setWidth(Integer width); /** * Get the minimum height of this panel in pixels. * @return The minimum height, or null if not set. */ @JsIgnore public Integer getMinHeight(); /** * Set the minimum height of the Panel in pixels * @param minHeight The minimum height, or null if not set */ @JsIgnore public void setMinHeight(Integer minHeight); /** * Get the minimum width of this panel in pixels as a primitive int to make this method exportable to JS. * @return The height, or -1 if not set. */ default int getMinHeightAsInt() { final Integer height = getMinHeight(); return (height != null) ? height : -1; } /** * Get the minimum width of the Panel in pixels * @return The minimum width, or null if not set */ @JsIgnore public Integer getMinWidth(); /** * Set the minimum width of the Panel in pixels * @param minWidth The width, or null if not set */ @JsIgnore public void setMinWidth(Integer minWidth); /** * Get the minimum width of this panel in pixels as a primitive int to make this method exportable to JS. * @return The width, or -1 if not set. */ default int getMinWidthAsInt() { final Integer width = getMinWidth(); return (width != null) ? width : -1; } /** * Get the Position of the Panel relate to it's Parent * <p> * TODO remove this. parent panels should track the positions of their children; making it a property of the child * is error-prone when moving panels around in the UI. * @return The Position of the Panel */ public Position getPosition(); /** * Set the Position of the Panel relative to it's parent. * <p> * TODO remove this. parent panels should track the positions of their children; making it a property of the child * is error-prone when moving panels around in the UI. * @param position The Position of the Panel relative to it's parent */ public void setPosition(Position position); /** * Has the Panel been expanded to a maximum size * @return true If maximized */ public boolean isMaximized(); ContextDefinition getContextDefinition(); void setContextDefinition(final ContextDefinition contextDefinition); ContextDisplayMode getContextDisplayMode(); void setContextDisplayMode(final ContextDisplayMode contextDisplayMode); /** * Invokes {@link #toString()} but exported to JavaScript so it can be invoked from different scripts. */ default String asString() { return this.toString(); } }