blob: 8977ef5d824b9f786ef6255c6cf6efefabd4c092 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2000, 2006 IBM Corporation and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* IBM Corporation - initial API and implementation
* Dan Rubel <dan_rubel@instantiations.com>
* - Fix for bug 11490 - define hidden view (placeholder for view) in plugin.xml
* Ted Stockwell <emorning@yahoo.com>
* - Fix for bug 63595 - IPageLayout.addFastView regression (3.0M8 to 3.0M9)
* Chris Gross <schtoo@schtoo.com>
* - Fix for 99155 - allow standalone view placeholders
*******************************************************************************/
package org.eclipse.ui.internal;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Map;
import org.eclipse.core.runtime.Assert;
import org.eclipse.osgi.util.NLS;
import org.eclipse.swt.SWT;
import org.eclipse.ui.IFolderLayout;
import org.eclipse.ui.IPageLayout;
import org.eclipse.ui.IPerspectiveDescriptor;
import org.eclipse.ui.IPlaceholderFolderLayout;
import org.eclipse.ui.IViewLayout;
import org.eclipse.ui.IViewReference;
import org.eclipse.ui.PartInitException;
import org.eclipse.ui.activities.WorkbenchActivityHelper;
import org.eclipse.ui.internal.presentations.PresentationFactoryUtil;
import org.eclipse.ui.internal.registry.ActionSetRegistry;
import org.eclipse.ui.internal.registry.IActionSetDescriptor;
import org.eclipse.ui.views.IViewDescriptor;
import org.eclipse.ui.views.IViewRegistry;
/**
* This factory is used to define the initial layout of a part sash container.
* <p>
* Design notes: The design of <code>IPageLayout</code> is a reflection of
* three requirements:
* <ol>
* <li>A mechanism is required to define the initial layout for a page. </li>
* <li>The views and editors within a page will be persisted between
* sessions.</li>
* <li>The view and editor lifecycle for (1) and (2) should be identical.</li>
* </ol>
* </p>
* <p>
* In reflection of these requirements, the following strategy has been
* implemented for layout definition.
* <ol>
* <li>A view extension is added to the workbench registry for the view.
* This extension defines the extension id and extension class. </li>
* <li>A view is added to a page by invoking one of the add methods
* in <code>IPageLayout</code>. The type of view is passed as an
* extension id, rather than a handle. The page layout will map
* the extension id to a view class, create an instance of the class,
* and then add the view to the page.</li>
* </ol>
* </p>
*/
public class PageLayout implements IPageLayout {
private ArrayList actionSets = new ArrayList(3);
private IPerspectiveDescriptor descriptor;
private LayoutPart editorFolder;
private boolean editorVisible = true;
private boolean fixed;
private ArrayList fastViews = new ArrayList(3);
private Map mapIDtoFolder = new HashMap(10);
private Map mapIDtoPart = new HashMap(10);
private Map mapIDtoViewLayoutRec = new HashMap(10);
private ArrayList newWizardShortcuts = new ArrayList(3);
private ArrayList perspectiveShortcuts = new ArrayList(3);
private ViewSashContainer rootLayoutContainer;
private ArrayList showInPartIds = new ArrayList(3);
private ArrayList showViewShortcuts = new ArrayList(3);
private ViewFactory viewFactory;
/**
* Constructs a new PageLayout for other purposes.
*/
public PageLayout() {
//no-op
}
/**
* Constructs a new PageLayout for the normal case of creating a new
* perspective.
*/
public PageLayout(ViewSashContainer container, ViewFactory viewFactory,
LayoutPart editorFolder, IPerspectiveDescriptor descriptor) {
super();
this.viewFactory = viewFactory;
this.rootLayoutContainer = container;
this.editorFolder = editorFolder;
this.descriptor = descriptor;
prefill();
}
/**
* Adds the editor to a layout.
*/
private void addEditorArea() {
try {
// Create the part.
LayoutPart newPart = createView(ID_EDITOR_AREA);
if (newPart == null) {
// this should never happen as long as newID is the editor ID.
return;
}
setRefPart(ID_EDITOR_AREA, newPart);
// Add it to the layout.
rootLayoutContainer.add(newPart);
} catch (PartInitException e) {
WorkbenchPlugin.log(getClass(), "addEditorArea()", e); //$NON-NLS-1$
}
}
/**
* Adds an action set to the page.
*
* @param actionSetID Identifies the action set extension to use. It must
* exist within the workbench registry.
*/
public void addActionSet(String actionSetID) {
if (!actionSets.contains(actionSetID)) {
actionSets.add(actionSetID);
}
}
/* (non-Javadoc)
* @see org.eclipse.ui.IPageLayout#addFastView(java.lang.String)
*/
public void addFastView(String id) {
addFastView(id, INVALID_RATIO);
}
/* (non-Javadoc)
* @see org.eclipse.ui.IPageLayout#addFastView(java.lang.String, float)
*/
public void addFastView(String id, float ratio) {
if (checkPartInLayout(id)) {
return;
}
if (id != null) {
try {
IViewDescriptor viewDescriptor = viewFactory.getViewRegistry()
.find(ViewFactory.extractPrimaryId(id));
if (!WorkbenchActivityHelper.filterItem(viewDescriptor)) {
IViewReference ref = viewFactory.createView(ViewFactory
.extractPrimaryId(id), ViewFactory
.extractSecondaryId(id));
fastViews.add(ref);
// force creation of the view layout rec
ViewLayoutRec rec = getViewLayoutRec(id, true);
// remember the ratio, if valid
if (ratio >= IPageLayout.RATIO_MIN
&& ratio <= IPageLayout.RATIO_MAX) {
rec.fastViewWidthRatio = ratio;
}
}
} catch (PartInitException e) {
WorkbenchPlugin.log(getClass(), "addFastView", e); //$NON-NLS-1$
}
}
}
/**
* Check to see if the partId represents a fast view's id.
*
* @param partId
* The part's id.
* @return true if the partId is a fast view id.
*/
private boolean isFastViewId(String partId) {
for (int i = 0; i < fastViews.size(); i++) {
IViewReference ref = (IViewReference) fastViews.get(i);
String secondaryId = ref.getSecondaryId();
String refId = (secondaryId == null ? ref.getId() : ref.getId()
+ ":" + secondaryId); //$NON-NLS-1$
if (refId.equals(partId)) {
return true;
}
}
return false;
}
/**
* Returns the view layout record for the given view id, or null if not
* found. If create is true, the record is created if it doesn't already
* exist.
*
* @since 3.0
*/
ViewLayoutRec getViewLayoutRec(String id, boolean create) {
Assert.isTrue(getRefPart(id) != null || isFastViewId(id));
ViewLayoutRec rec = (ViewLayoutRec) mapIDtoViewLayoutRec.get(id);
if (rec == null && create) {
rec = new ViewLayoutRec();
// set up the view layout appropriately if the page layout is fixed
if (isFixed()) {
rec.isCloseable = false;
rec.isMoveable = false;
}
mapIDtoViewLayoutRec.put(id, rec);
}
return rec;
}
/**
* Adds a creation wizard to the File New menu.
* The id must name a new wizard extension contributed to the
* workbench's extension point (named <code>"org.eclipse.ui.newWizards"</code>).
*
* @param id the wizard id
*/
public void addNewWizardShortcut(String id) {
if (!newWizardShortcuts.contains(id)) {
newWizardShortcuts.add(id);
}
}
/**
* Add the layout part to the page's layout
*/
private void addPart(LayoutPart newPart, String partId, int relationship,
float ratio, String refId) {
setRefPart(partId, newPart);
// If the referenced part is inside a folder,
// then use the folder as the reference part.
LayoutPart refPart = getFolderPart(refId);
if (refPart == null) {
refPart = getRefPart(refId);
}
// Add it to the layout.
if (refPart != null) {
ratio = normalizeRatio(ratio);
rootLayoutContainer.add(newPart, getPartSashConst(relationship),
ratio, refPart);
} else {
WorkbenchPlugin.log(NLS.bind(WorkbenchMessages.PageLayout_missingRefPart, refId ));
rootLayoutContainer.add(newPart);
}
}
/**
* Adds a perspective shortcut to the Perspective menu.
* The id must name a perspective extension contributed to the
* workbench's extension point (named <code>"org.eclipse.ui.perspectives"</code>).
*
* @param id the perspective id
*/
public void addPerspectiveShortcut(String id) {
if (!perspectiveShortcuts.contains(id)) {
perspectiveShortcuts.add(id);
}
}
/* (non-Javadoc)
* @see org.eclipse.ui.IPageLayout#addPlaceholder(java.lang.String, int, float, java.lang.String)
*/
public void addPlaceholder(String viewId, int relationship, float ratio,
String refId) {
if (!checkValidPlaceholderId(viewId)) {
return;
}
// Create the placeholder.
PartPlaceholder newPart = new PartPlaceholder(viewId);
addPart(newPart, viewId, relationship, ratio, refId);
// force creation of the view layout rec
getViewLayoutRec(viewId, true);
}
/**
* Checks whether the given id is a valid placeholder id.
* A placeholder id may be simple or compound, and can optionally contain a wildcard.
*
* @param id the placeholder id
* @return <code>true</code> if the given id is a valid placeholder id, <code>false</code> otherwise
*/
boolean checkValidPlaceholderId(String id) {
// Check that view is not already in layout.
// This check is done even if the id has a wildcard, since it's incorrect to create
// multiple placeholders with the same id, wildcard or not.
if (checkPartInLayout(id)) {
return false;
}
// check that primary view id is valid, but only if it has no wildcard
String primaryId = ViewFactory.extractPrimaryId(id);
if (!ViewFactory.hasWildcard(primaryId)) {
IViewRegistry reg = WorkbenchPlugin.getDefault().getViewRegistry();
IViewDescriptor desc = reg.find(primaryId);
if (desc == null) {
// cannot safely open the dialog so log the problem
WorkbenchPlugin.log("Unable to find view with id: " + primaryId + ", when creating perspective " + getDescriptor().getId()); //$NON-NLS-1$ //$NON-NLS-2$
return false;
}
}
return true;
}
/* (non-Javadoc)
* @see org.eclipse.ui.IPageLayout#addShowInPart(java.lang.String)
*/
public void addShowInPart(String id) {
if (!showInPartIds.contains(id)) {
showInPartIds.add(id);
}
}
/**
* Adds a view to the Show View menu. The id must name a view extension
* contributed to the workbench's extension point (named <code>"org.eclipse.ui.views"</code>).
*
* @param id the view id
*/
public void addShowViewShortcut(String id) {
if (!showViewShortcuts.contains(id)) {
showViewShortcuts.add(id);
}
}
/* (non-Javadoc)
* @see org.eclipse.ui.IPageLayout#addView(java.lang.String, int, float, java.lang.String)
*/
public void addView(String viewId, int relationship, float ratio,
String refId) {
addView(viewId, relationship, ratio, refId, false, true);
}
/* (non-Javadoc)
* @see org.eclipse.ui.IPageLayout#addView(java.lang.String, int, float, java.lang.String)
*/
private void addView(String viewId, int relationship, float ratio,
String refId, boolean standalone, boolean showTitle) {
if (checkPartInLayout(viewId)) {
return;
}
try {
// Create the part.
LayoutPart newPart = createView(viewId);
if (newPart == null) {
addPlaceholder(viewId, relationship, ratio, refId);
LayoutHelper.addViewActivator(this, viewId);
} else {
int appearance = PresentationFactoryUtil.ROLE_VIEW;
if (standalone) {
if (showTitle) {
appearance = PresentationFactoryUtil.ROLE_STANDALONE;
} else {
appearance = PresentationFactoryUtil.ROLE_STANDALONE_NOTITLE;
}
}
ViewStack newFolder = new ViewStack(rootLayoutContainer.page,
true, appearance, null);
newFolder.add(newPart);
setFolderPart(viewId, newFolder);
addPart(newFolder, viewId, relationship, ratio, refId);
// force creation of the view layout rec
getViewLayoutRec(viewId, true);
}
} catch (PartInitException e) {
WorkbenchPlugin.log(getClass(), "addView", e); //$NON-NLS-1$
}
}
/**
* Verify that the part is already present in the layout
* and cannot be added again. Log a warning message.
*/
/*package*/
boolean checkPartInLayout(String partId) {
if (getRefPart(partId) != null || isFastViewId(partId)) {
WorkbenchPlugin.log(NLS.bind(WorkbenchMessages.PageLayout_duplicateRefPart,partId ));
return true;
}
return false;
}
/* (non-Javadoc)
* @see org.eclipse.ui.IPageLayout#createFolder(java.lang.String, int, float, java.lang.String)
*/
public IFolderLayout createFolder(String folderId, int relationship,
float ratio, String refId) {
if (checkPartInLayout(folderId)) {
return new FolderLayout(this, (ViewStack) getRefPart(folderId),
viewFactory);
}
// Create the folder.
ViewStack folder = new ViewStack(rootLayoutContainer.page);
folder.setID(folderId);
addPart(folder, folderId, relationship, ratio, refId);
// Create a wrapper.
return new FolderLayout(this, folder, viewFactory);
}
/* (non-Javadoc)
* @see org.eclipse.ui.IPageLayout#createPlaceholderFolder(java.lang.String, int, float, java.lang.String)
*/
public IPlaceholderFolderLayout createPlaceholderFolder(String folderId,
int relationship, float ratio, String refId) {
if (checkPartInLayout(folderId)) {
return new PlaceholderFolderLayout(this,
(ContainerPlaceholder) getRefPart(folderId));
}
// Create the folder.
ContainerPlaceholder folder = new ContainerPlaceholder(null);
folder.setContainer(rootLayoutContainer);
folder.setRealContainer(new ViewStack(rootLayoutContainer.page));
folder.setID(folderId);
addPart(folder, folderId, relationship, ratio, refId);
// Create a wrapper.
return new PlaceholderFolderLayout(this, folder);
}
/**
* Create a new <code>LayoutPart</code>.
*
* @param partID the id of the part to create.
* @return the <code>LayoutPart</code>, or <code>null</code> if it should not be
* created because of activity filtering.
* @throws PartInitException thrown if there is a problem creating the part.
*/
private LayoutPart createView(String partID) throws PartInitException {
if (partID.equals(ID_EDITOR_AREA)) {
return editorFolder;
}
IViewDescriptor viewDescriptor = viewFactory.getViewRegistry()
.find(ViewFactory.extractPrimaryId(partID));
if (WorkbenchActivityHelper.filterItem(viewDescriptor)) {
return null;
}
return LayoutHelper.createView(getViewFactory(), partID);
}
/**
* @return the action set list for the page. This is <code>List</code> of
* <code>String</code>s.
*/
public ArrayList getActionSets() {
return actionSets;
}
/* (non-Javadoc)
* @see org.eclipse.ui.IPageLayout#getDescriptor()
*/
public IPerspectiveDescriptor getDescriptor() {
return descriptor;
}
/**
* @return an identifier for the editor area. The editor area is
* automatically added to each layout before any other part. It should be
* used as a reference part for other views.
*/
public String getEditorArea() {
return ID_EDITOR_AREA;
}
/* (non-Javadoc)
* @see org.eclipse.ui.IPageLayout#getEditorReuseThreshold()
*/
public int getEditorReuseThreshold() {
return -1;
}
/**
* @return <code>ArrayList</code>
*/
public ArrayList getFastViews() {
return fastViews;
}
/**
* @return the folder part containing the given view ID or <code>null</code>
* if none (i.e. part of the page layout instead of a folder layout).
*/
private ViewStack getFolderPart(String viewId) {
return (ViewStack) mapIDtoFolder.get(viewId);
}
/**
* @return the new wizard shortcuts associated with the page. This is a <code>List</code> of
* <code>String</code>s.
*/
public ArrayList getNewWizardShortcuts() {
return newWizardShortcuts;
}
/**
* @return the part sash container const for a layout value.
*/
private int getPartSashConst(int nRelationship) {
return nRelationship;
}
/**
* @return the perspective shortcuts associated with the page. This is a <code>List</code> of
* <code>String</code>s.
*/
public ArrayList getPerspectiveShortcuts() {
return perspectiveShortcuts;
}
/**
* @return the part for a given ID.
*/
/*package*/
LayoutPart getRefPart(String partID) {
return (LayoutPart) mapIDtoPart.get(partID);
}
/**
* @return the top level layout container.
*/
public ViewSashContainer getRootLayoutContainer() {
return rootLayoutContainer;
}
/**
* @return the ids of the parts to list in the Show In... prompter. This is
* a <code>List</code> of <code>String</code>s.
*/
public ArrayList getShowInPartIds() {
return showInPartIds;
}
/**
* @return the show view shortcuts associated with the page. This is a <code>List</code> of
* <code>String</code>s.
*/
public ArrayList getShowViewShortcuts() {
return showViewShortcuts;
}
/**
* @return the <code>ViewFactory</code> for this <code>PageLayout</code>.
* @since 3.0
*/
/* package */
ViewFactory getViewFactory() {
return viewFactory;
}
/* (non-Javadoc)
* @see org.eclipse.ui.IPageLayout#isEditorAreaVisible()
*/
public boolean isEditorAreaVisible() {
return editorVisible;
}
/**
* Trim the ratio so that direct manipulation of parts is easy.
*
* @param in the initial ratio.
* @return the normalized ratio.
*/
private float normalizeRatio(float in) {
if (in < RATIO_MIN) {
in = RATIO_MIN;
}
if (in > RATIO_MAX) {
in = RATIO_MAX;
}
return in;
}
/**
* Prefill the layout with required parts.
*/
private void prefill() {
addEditorArea();
// Add default action sets.
ActionSetRegistry reg = WorkbenchPlugin.getDefault()
.getActionSetRegistry();
IActionSetDescriptor[] array = reg.getActionSets();
int count = array.length;
for (int nX = 0; nX < count; nX++) {
IActionSetDescriptor desc = array[nX];
if (desc.isInitiallyVisible()) {
addActionSet(desc.getId());
}
}
}
/* (non-Javadoc)
* @see org.eclipse.ui.IPageLayout#setEditorAreaVisible(boolean)
*/
public void setEditorAreaVisible(boolean showEditorArea) {
editorVisible = showEditorArea;
}
/* (non-Javadoc)
* @see org.eclipse.ui.IPageLayout#setEditorReuseThreshold(int)
*/
public void setEditorReuseThreshold(int openEditors) {
//no-op
}
/* (non-Javadoc)
* @see org.eclipse.ui.IPageLayout#setFixed(boolean)
*/
public void setFixed(boolean fixed) {
this.fixed = fixed;
}
/* (non-Javadoc)
* @see org.eclipse.ui.IPageLayout#getFixed()
*/
public boolean isFixed() {
return fixed;
}
/**
* Map the folder part containing the given view ID.
*
* @param viewId the part ID.
* @param container the <code>ContainerPlaceholder</code>.
*/
/*package*/
void setFolderPart(String viewId, ContainerPlaceholder container) {
LayoutPart tabFolder = container.getRealContainer();
mapIDtoFolder.put(viewId, tabFolder);
}
/**
* Map the folder part containing the given view ID.
*
* @param viewId the part ID.
* @param folder the <code>ViewStack</code>.
*/
/*package*/
void setFolderPart(String viewId, ViewStack folder) {
mapIDtoFolder.put(viewId, folder);
}
/**
* Map an ID to a part.
*
* @param partId the part ID.
* @param part the <code>LayoutPart</code>.
*/
/*package*/
void setRefPart(String partID, LayoutPart part) {
mapIDtoPart.put(partID, part);
}
// stackPart(Layoutpart, String, String) added by dan_rubel@instantiations.com
/**
* Stack a part on top of another.
*
* @param newPart the new part.
* @param viewId the view ID.
* @param refId the reference ID.
*/
private void stackPart(LayoutPart newPart, String viewId, String refId) {
setRefPart(viewId, newPart);
// force creation of the view layout rec
getViewLayoutRec(viewId, true);
// If ref part is in a folder than just add the
// new view to that folder.
ViewStack folder = getFolderPart(refId);
if (folder != null) {
folder.add(newPart);
setFolderPart(viewId, folder);
return;
}
// If the ref part is in the page layout then create
// a new folder and add the new view.
LayoutPart refPart = getRefPart(refId);
if (refPart != null && (refPart instanceof PartPane || refPart instanceof PartPlaceholder)) {
ViewStack newFolder = new ViewStack(rootLayoutContainer.page);
rootLayoutContainer.replace(refPart, newFolder);
newFolder.add(refPart);
newFolder.add(newPart);
setFolderPart(refId, newFolder);
setFolderPart(viewId, newFolder);
return;
}
// If ref part is not found then just do add.
WorkbenchPlugin.log(NLS.bind(WorkbenchMessages.PageLayout_missingRefPart, refId ));
rootLayoutContainer.add(newPart);
}
// stackPlaceholder(String, String) added by dan_rubel@instantiations.com
/**
* Stack a placeholder on top of another.
*
* @param viewId the view ID.
* @param refId the reference ID.
*/
public void stackPlaceholder(String viewId, String refId) {
if (checkPartInLayout(viewId)) {
return;
}
// Create the placeholder.
PartPlaceholder newPart = new PartPlaceholder(viewId);
LayoutPart refPart = getRefPart(refId);
if (refPart != null) {
newPart.setContainer(refPart.getContainer());
}
stackPart(newPart, viewId, refId);
}
// stackView(String, String) modified by dan_rubel@instantiations.com
/**
* Stack one view on top of another.
*
* @param viewId the view ID.
* @param refId the reference ID.
*/
public void stackView(String viewId, String refId) {
if (checkPartInLayout(viewId)) {
return;
}
// Create the new part.
try {
LayoutPart newPart = createView(viewId);
if (newPart == null) {
stackPlaceholder(viewId, refId);
LayoutHelper.addViewActivator(this, viewId);
} else {
stackPart(newPart, viewId, refId);
}
} catch (PartInitException e) {
WorkbenchPlugin.log(getClass(), "stackView", e); //$NON-NLS-1$
}
}
/**
* Converts SWT position constants into layout position constants.
*
* @param swtConstant one of SWT.TOP, SWT.BOTTOM, SWT.LEFT, or SWT.RIGHT
* @return one of IPageLayout.TOP, IPageLayout.BOTTOM, IPageLayout.LEFT, IPageLayout.RIGHT, or -1 indicating an
* invalid input
*
* @since 3.0
*/
public static int swtConstantToLayoutPosition(int swtConstant) {
switch (swtConstant) {
case SWT.TOP:
return IPageLayout.TOP;
case SWT.BOTTOM:
return IPageLayout.BOTTOM;
case SWT.RIGHT:
return IPageLayout.RIGHT;
case SWT.LEFT:
return IPageLayout.LEFT;
}
return -1;
}
/* (non-Javadoc)
* @see org.eclipse.ui.IPageLayout#addStandaloneView(java.lang.String, boolean, int, float, java.lang.String)
* @since 3.0
*/
public void addStandaloneView(String viewId, boolean showTitle,
int relationship, float ratio, String refId) {
addView(viewId, relationship, ratio, refId, true, showTitle);
ViewLayoutRec rec = getViewLayoutRec(viewId, true);
rec.isStandalone = true;
rec.showTitle = showTitle;
}
/* (non-Javadoc)
* @see org.eclipse.ui.IPageLayout#addStandaloneViewPlaceholder(java.lang.String, int, float, java.lang.String, boolean)
*/
public void addStandaloneViewPlaceholder(String viewId, int relationship,
float ratio, String refId, boolean showTitle) {
String stackId = viewId + ".standalonefolder"; //$NON-NLS-1$
// Check to see if the view is already in the layout
if (!checkValidPlaceholderId(viewId)) {
return;
}
// Create the folder.
ContainerPlaceholder folder = new ContainerPlaceholder(null);
folder.setContainer(rootLayoutContainer);
int appearance = PresentationFactoryUtil.ROLE_STANDALONE;
if (!showTitle) {
appearance = PresentationFactoryUtil.ROLE_STANDALONE_NOTITLE;
}
folder.setRealContainer(new ViewStack(rootLayoutContainer.page, true,
appearance, null));
folder.setID(stackId);
addPart(folder, stackId, relationship, ratio, refId);
// Create a wrapper.
PlaceholderFolderLayout placeHolder = new PlaceholderFolderLayout(this,
folder);
// Add the standalone view immediately
placeHolder.addPlaceholder(viewId);
ViewLayoutRec rec = getViewLayoutRec(viewId, true);
rec.isStandalone = true;
rec.showTitle = showTitle;
}
/*
* (non-Javadoc)
*
* @see org.eclipse.ui.IPageLayout#getViewLayout(java.lang.String)
* @since 3.0
*/
public IViewLayout getViewLayout(String viewId) {
ViewLayoutRec rec = getViewLayoutRec(viewId, true);
if (rec == null) {
return null;
}
return new ViewLayout(this, rec);
}
/**
* @since 3.0
*/
public Map getIDtoViewLayoutRecMap() {
return mapIDtoViewLayoutRec;
}
/**
* Removes any existing placeholder with the given id.
*
* @param id the id for the placeholder
* @since 3.1
*/
public void removePlaceholder(String id) {
LayoutPart part = getRefPart(id);
if (part instanceof PartPlaceholder) {
ViewStack stack = getFolderPart(id);
if (stack != null) {
stack.remove(part);
}
else {
rootLayoutContainer.remove(part);
}
mapIDtoPart.remove(id);
mapIDtoFolder.remove(id);
mapIDtoViewLayoutRec.remove(id);
}
}
}