blob: 997087472b37546ac0c9ae8c29574b5e0081ab1c [file] [log] [blame]
package org.eclipse.ui.internal.registry;
/*
* (c) Copyright IBM Corp. 2000, 2001.
* All Rights Reserved.
*/
import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Iterator;
import org.eclipse.core.runtime.Platform;
import org.eclipse.jface.preference.IPreferenceStore;
import org.eclipse.ui.*;
import org.eclipse.ui.internal.IWorkbenchConstants;
import org.eclipse.ui.internal.WorkbenchPlugin;
/**
* Perspective registry.
*/
public class PerspectiveRegistry implements IPerspectiveRegistry {
private File rootFolder;
private ArrayList children = new ArrayList(10);
private String defPerspID;
private static final String EXT = "_persp.xml";//$NON-NLS-1$
private static final String ID_DEF_PERSP = "PerspectiveRegistry.DEFAULT_PERSP";//$NON-NLS-1$
/**
* Construct a new registry.
*
* @param rootFolder is the root folder for perspective files.
*/
public PerspectiveRegistry(File rootFolder) {
super();
this.rootFolder = rootFolder;
}
/**
* Adds a perspective. This is typically used by the reader.
*/
public void addPerspective(PerspectiveDescriptor desc) {
children.add(desc);
desc.setCustomFile(new File(rootFolder, desc.getId() + EXT));
}
/**
* Create a new perspective.
* Return null if the creation failed.
*/
public PerspectiveDescriptor createPerspective(String label,PerspectiveDescriptor originalDescriptor) {
// Sanity check to avoid duplicate labels.
if (!validateLabel(label))
return null;
// Calculate ID.
String id = label.replace(' ', '_');
id = id.trim();
// Calculate storage file
String name = id + EXT;
File file = new File(rootFolder, name);
// Create descriptor.
PerspectiveDescriptor desc = new PerspectiveDescriptor(id, label,originalDescriptor);
desc.setCustomFile(file);
children.add(desc);
return desc;
}
/**
* Delete a perspective.
* Has no effect if the perspective is defined in an extension.
*/
public void deletePerspective(IPerspectiveDescriptor in) {
PerspectiveDescriptor desc = (PerspectiveDescriptor)in;
if (!desc.isPredefined()) {
children.remove(desc);
desc.deleteCustomFile();
verifyDefaultPerspective();
}
}
/**
* @see IPerspectiveRegistry
*/
public IPerspectiveDescriptor findPerspectiveWithId(String id) {
Iterator enum = children.iterator();
while (enum.hasNext()) {
IPerspectiveDescriptor desc = (IPerspectiveDescriptor)enum.next();
if (desc.getId().equals(id))
return desc;
}
return null;
}
/**
* @see IPerspectiveRegistry
*/
public IPerspectiveDescriptor findPerspectiveWithLabel(String label) {
Iterator enum = children.iterator();
while (enum.hasNext()) {
IPerspectiveDescriptor desc = (IPerspectiveDescriptor)enum.next();
if (desc.getLabel().equals(label))
return desc;
}
return null;
}
/**
* Returns the id of the default perspective for the workbench. This identifies one
* perspective extension within the workbench's perspective registry.
*
* @return the default perspective id; will never be <code>null</code>
*/
public String getDefaultPerspective() {
return defPerspID;
}
/**
* @see IPerspectiveRegistry
*/
public IPerspectiveDescriptor[] getPerspectives() {
int nSize = children.size();
IPerspectiveDescriptor [] retArray = new IPerspectiveDescriptor[nSize];
for (int nX = 0; nX < nSize; nX ++) {
retArray[nX] = (IPerspectiveDescriptor)children.get(nX);
}
return retArray;
}
/**
* Loads the registry.
*/
public void load() {
// Load the registries.
loadPredefined();
loadCustom();
// Get default perspective.
defPerspID =
WorkbenchPlugin.getDefault().getPreferenceStore().getString(IWorkbenchPreferenceConstants.DEFAULT_PERSPECTIVE_ID);
verifyDefaultPerspective();
}
/**
* Read children from the file system.
*/
private void loadCustom() {
if (rootFolder.isDirectory()) {
File [] fileList = rootFolder.listFiles();
int nSize = fileList.length;
for (int nX = 0; nX < nSize; nX ++) {
File file = fileList[nX];
if (file.getName().endsWith(EXT)) {
try {
PerspectiveDescriptor newPersp = new PerspectiveDescriptor(file);
String id = newPersp.getId();
IPerspectiveDescriptor oldPersp = findPerspectiveWithId(id);
if (oldPersp == null)
children.add(newPersp);
} catch (IOException e) {
} catch (WorkbenchException e) {
}
}
}
}
}
/**
* Read children from the plugin registry.
*/
private void loadPredefined() {
PerspectiveRegistryReader reader = new PerspectiveRegistryReader();
reader.readPerspectives(Platform.getPluginRegistry(), this);
}
/**
* Sets the default perspective for the workbench to the given perspective id.
* The id must correspond to one perspective extension within the workbench's
* perspective registry.
*
* @param id a perspective id; must not be <code>null</code>
*/
public void setDefaultPerspective(String id) {
IPerspectiveDescriptor desc = findPerspectiveWithId(id);
if (desc != null) {
defPerspID = id;
IPreferenceStore store = WorkbenchPlugin.getDefault().getPreferenceStore();
store.setValue(IWorkbenchPreferenceConstants.DEFAULT_PERSPECTIVE_ID, id);
}
}
/**
* Return true if a label is valid and unused.
*/
public boolean validateLabel(String label) {
label = label.trim();
if (label.length() <= 0)
return false;
return true;
}
/**
* Verifies the id of the default perspective. If the
* default perspective is invalid use the workbench default.
*/
private void verifyDefaultPerspective() {
// Step 1: Try current defPerspId value.
IPerspectiveDescriptor desc = null;
if (defPerspID != null)
desc = findPerspectiveWithId(defPerspID);
if (desc != null)
return;
// Step 2. Read default value.
defPerspID =
WorkbenchPlugin.getDefault().getPreferenceStore().getDefaultString(IWorkbenchPreferenceConstants.DEFAULT_PERSPECTIVE_ID);
if (defPerspID != null)
desc = findPerspectiveWithId(defPerspID);
if (desc != null)
return;
// Step 3. Use internal workbench default.
defPerspID = IWorkbenchConstants.DEFAULT_LAYOUT_ID;
}
}