/*
* 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.client.workbench.panels;
import java.util.Map;
import com.google.gwt.user.client.ui.IsWidget;
import org.uberfire.client.workbench.WorkbenchLayout;
import org.uberfire.client.workbench.part.WorkbenchPartPresenter;
import org.uberfire.workbench.model.PanelDefinition;
import org.uberfire.workbench.model.PartDefinition;
import org.uberfire.workbench.model.Position;
/**
* Top-level interface for all panel presenters within the UberFire MVP framework.
*/
public interface WorkbenchPanelPresenter {
/**
* Returns the current parent of this panel presenter.
* @return the parent panel presenter. If this panel is the root, or it is not attached to a parent, the return
* value is null.
*/
public WorkbenchPanelPresenter getParent();
/**
* Sets the current parent of this panel presenter. This method should only be called by another
* WorkbenchPanelPresenter when adding or removing this panel as a child.
* @param parent the new parent of this panel. If this panel is being removed, the parent should be set to null.
*/
public void setParent(final WorkbenchPanelPresenter parent);
/**
* Returns a {@code @Portable} description of the current state of this panel.
*/
public PanelDefinition getDefinition();
/**
* Called by the framework when the panel instance is first created. Application code should not call this method
* directly.
* @param definition description of the state this panel should put itself in. This panel is also responsible for keeping
* the definition up to date with the panel's current state.
*/
public void setDefinition(final PanelDefinition definition);
/**
* Adds the given part to this panel's content area, updating this panel's definition and the part's definition to
* reflect the new part ownership.
* <p>
* Panels each implement their own policy and user interface for part management. Some panels do not support parts
* at all; others allow only a single part; still others can hold multiple parts at a time. Either way, panels that
* do display parts typically display them one at a time. Those that support multiple parts include UI widgets
* (eg. tabs or a dropdown list) that let the user select which one to display.
* <p>
* After the panel's border decorations, part switcher UI, title bar, and subpanel space has been accounted for, the
* part's view typically occupies all remaining space within its parent panel.
* @param part the part to add. Must not be null, and must not currently belong to any panel.
* @throws UnsupportedOperationException if this panel does not support parts
*/
public void addPart(final WorkbenchPartPresenter part);
/**
* Adds the given part to this panel with the given context ID, updating this panel's definition and the part's
* definition to reflect the new part ownership.
* @param part the part to add. Must not be null, and must not currently belong to any panel.
* @throws UnsupportedOperationException if this panel does not support parts
* @see #addPart(WorkbenchPartPresenter)
*/
public void addPart(final WorkbenchPartPresenter part,
final String contextId);
/**
* Removes the given part from this panel, updating this panel's definition and the part's definition to reflect
* that the part no longer belongs to this panel.
* @return true if the given part was found and removed; false if this call had no effect
* @see #addPart(WorkbenchPartPresenter)
*/
public boolean removePart(final PartDefinition part);
/**
* Adds the given panel as a subpanel of this one in the given position. Panels typically only allow one child panel
* in each position, and may throw an exception or make alternative arrangements (for example, forward the request
* to a child panel) when you try to add a child panel to an already-occupied slot.
* <p>
* Subpanels are typically always visible, and take up space within the bounds of their parent panel.
* @param child the panel to add. The presenter, its view, and its definition must not belong to any parent. As a side
* effect of this call (if the call is successful), the given presenter, its view, and its definition
* will get attached to their new parents.
* @param position the position to add the child at. Different panel implementations support different position types.
*/
public void addPanel(final WorkbenchPanelPresenter child,
final Position position);
/**
* Removes the given panel presenter and its view from this panel, freeing all resources associated with them.
* @param child The child panel to remove. Must be a direct child of this panel, and must be empty (contain no parts
* or child panels). Null is not permitted.
* @return true if the child was found and removed from this panel; false if the child panel could not be found.
*/
public boolean removePanel(WorkbenchPanelPresenter child);
/**
* Returns the immediate child panels of this panel. Note that panels and parts are not the same thing; this method
* only returns the panels.
* @return an unmodifiable snapshot of the immediate child panels nested within this one. Never null, and will not
* update to reflect subsequent changes to this panel's children. Safe to iterate over when adding or
* removing child panels.
*/
public Map<Position, WorkbenchPanelPresenter> getPanels();
public void changeTitle(final PartDefinition part,
final String title,
final IsWidget titleDecoration);
public void setFocus(final boolean hasFocus);
public boolean selectPart(final PartDefinition part);
/**
* Makes this panel's view take up most of the space on the workbench. The exact meaning of "maximize" is left to
* the implementation of {@link WorkbenchLayout}.
*/
public void maximize();
/**
* Restores this panel's view to its original unmaximized size and position.
*/
public void unmaximize();
/**
* Returns the view that was given to this panel when it was first created.
*/
public WorkbenchPanelView getPanelView();
public void onResize(final int width,
final int height);
/**
* Returns the panel type that should be used when adding child panels of type
* {@link PanelDefinition#PARENT_CHOOSES_TYPE}.
* @return the fully-qualified class name of a WorkbenchPanelPresenter implementation. Returns null if
* this panel presenter does not allow child panels.
*/
public String getDefaultChildType();
/**
* Returns the type of new parts.
*/
Class<? extends WorkbenchPartPresenter> getPartType();
}