blob: 8a6bb1a4f0b1ed95c5bf64540dcb3d8e9d4be8e7 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2004, 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
*******************************************************************************/
package org.eclipse.ui.part;
import org.eclipse.core.commands.common.EventManager;
import org.eclipse.core.runtime.Assert;
import org.eclipse.core.runtime.IConfigurationElement;
import org.eclipse.core.runtime.IExecutableExtension;
import org.eclipse.core.runtime.Platform;
import org.eclipse.jface.resource.ImageDescriptor;
import org.eclipse.jface.resource.JFaceResources;
import org.eclipse.jface.util.SafeRunnable;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.ui.IMemento;
import org.eclipse.ui.IPropertyListener;
import org.eclipse.ui.ISharedImages;
import org.eclipse.ui.PartInitException;
import org.eclipse.ui.PlatformUI;
import org.eclipse.ui.internal.intro.IntroMessages;
import org.eclipse.ui.internal.registry.IWorkbenchRegistryConstants;
import org.eclipse.ui.internal.util.Util;
import org.eclipse.ui.intro.IIntroPart;
import org.eclipse.ui.intro.IIntroSite;
import org.eclipse.ui.plugin.AbstractUIPlugin;
/**
* Abstract base implementation of an intro part.
* <p>
* Subclasses must implement the following methods:
* <ul>
* <li><code>createPartControl</code>- to create the intro part's controls
* </li>
* <li><code>setFocus</code>- to accept focus</li>
* <li><code>standbyStateChanged</code>- to change the standby mode</li>
* </ul>
* </p>
* <p>
* Subclasses may extend or reimplement the following methods as required:
* <ul>
* <li><code>setInitializationData</code>- extend to provide additional
* initialization when the intro extension is instantiated</li>
* <li><code>init(IIntroSite, IMemento)</code>- extend to provide additional
* initialization when intro is assigned its site</li>
* <li><code>dispose</code>- extend to provide additional cleanup</li>
* <li><code>getAdapter</code>- reimplement to make their intro adaptable
* </li>
* </ul>
* </p>
* @since 3.0
*/
public abstract class IntroPart extends EventManager implements IIntroPart,
IExecutableExtension {
private IConfigurationElement configElement;
private ImageDescriptor imageDescriptor;
private IIntroSite partSite;
private Image titleImage;
private String titleLabel;
/**
* Creates a new intro part.
*/
protected IntroPart() {
super();
}
/* (non-Javadoc)
* @see org.eclipse.ui.intro.IIntroPart#addPropertyListener(org.eclipse.ui.IPropertyListener)
*/
public void addPropertyListener(IPropertyListener l) {
addListenerObject(l);
}
/*
* (non-Javadoc) Creates the SWT controls for this intro part. <p>
* Subclasses must implement this method. For a detailed description of the
* requirements see <code> IIntroPart </code></p>
*
* @param parent the parent control
*
* @see IIntroPart
*/
public abstract void createPartControl(Composite parent);
/**
* The <code>IntroPart</code> implementation of this
* <code>IIntroPart</code> method disposes the title image loaded by
* <code>setInitializationData</code>. Subclasses may extend.
*/
public void dispose() {
if (titleImage != null) {
JFaceResources.getResources().destroyImage(imageDescriptor);
titleImage = null;
}
// Clear out the property change listeners as we
// should not be notifying anyone after the part
// has been disposed.
clearListeners();
}
/**
* Fires a property changed event.
*
* @param propertyId
* the id of the property that changed
*/
protected void firePropertyChange(final int propertyId) {
Object[] array = getListeners();
for (int nX = 0; nX < array.length; nX++) {
final IPropertyListener l = (IPropertyListener) array[nX];
Platform.run(new SafeRunnable() {
public void run() {
l.propertyChanged(this, propertyId);
}
});
}
}
/**
* This implementation of the method declared by <code>IAdaptable</code>
* passes the request along to the platform's adapter manager; roughly
* <code>Platform.getAdapterManager().getAdapter(this, adapter)</code>.
* Subclasses may override this method (however, if they do so, they should
* invoke the method on their superclass to ensure that the Platform's
* adapter manager is consulted).
*/
public Object getAdapter(Class adapter) {
return Platform.getAdapterManager().getAdapter(this, adapter);
}
/**
* Returns the configuration element for this part. The configuration
* element comes from the plug-in registry entry for the extension defining
* this part.
*
* @return the configuration element for this part
*/
protected IConfigurationElement getConfigurationElement() {
return configElement;
}
/**
* Returns the default title image.
*
* @return the default image
*/
protected Image getDefaultImage() {
return PlatformUI.getWorkbench().getSharedImages().getImage(
ISharedImages.IMG_DEF_VIEW);
}
/*
* (non-Javadoc)
*
* @see org.eclipse.ui.intro.IIntroPart#getIntroSite()
*/
public final IIntroSite getIntroSite() {
return partSite;
}
/* (non-Javadoc)
* @see org.eclipse.ui.intro.IIntroPart#getTitleImage()
*/
public Image getTitleImage() {
if (titleImage != null) {
return titleImage;
}
return getDefaultImage();
}
/* (non-Javadoc)
* @see org.eclipse.ui.intro.IIntroPart#getTitle()
*/
public String getTitle() {
if (titleLabel != null) {
return titleLabel;
}
return getDefaultTitle();
}
/**
* Return the default title string.
*
* @return the default title string
*/
private String getDefaultTitle() {
return IntroMessages.Intro_default_title;
}
/**
* The base implementation of this {@link org.eclipse.ui.intro.IIntroPart}method ignores the
* memento and initializes the part in a fresh state. Subclasses may extend
* to perform any state restoration, but must call the super method.
*
* @param site
* the intro site
* @param memento
* the intro part state or <code>null</code> if there is no
* previous saved state
* @exception PartInitException
* if this part was not initialized successfully
*/
public void init(IIntroSite site, IMemento memento)
throws PartInitException {
setSite(site);
}
/**
* Sets the part site.
* <p>
* Subclasses must invoke this method from {@link org.eclipse.ui.intro.IIntroPart#init(IIntroSite, IMemento)}.
* </p>
*
* @param site the intro part site
*/
protected void setSite(IIntroSite site) {
this.partSite = site;
}
/* (non-Javadoc)
* @see org.eclipse.ui.intro.IIntroPart#removePropertyListener(org.eclipse.ui.IPropertyListener)
*/
public void removePropertyListener(IPropertyListener l) {
removeListenerObject(l);
}
/**
* The base implementation of this {@link org.eclipse.ui.intro.IIntroPart} method does nothing.
* Subclasses may override.
*
* @param memento
* a memento to receive the object state
*/
public void saveState(IMemento memento) {
//no-op
}
/*
* (non-Javadoc) Asks this part to take focus within the workbench.
* <p>
* Subclasses must implement this method. For a detailed description of the
* requirements see <code>IIntroPart</code>
* </p>
*
* @see IIntroPart
*/
public abstract void setFocus();
/**
* The <code>IntroPart</code> implementation of this
* <code>IExecutableExtension</code> records the configuration element in
* and internal state variable (accessible via <code>getConfigElement</code>).
* It also loads the title image, if one is specified in the configuration
* element. Subclasses may extend.
*
* Should not be called by clients. It is called by the core plugin when
* creating this executable extension.
*/
public void setInitializationData(IConfigurationElement cfig,
String propertyName, Object data) {
// Save config element.
configElement = cfig;
titleLabel = cfig.getAttribute(IWorkbenchRegistryConstants.ATT_LABEL);
// Icon.
String strIcon = cfig.getAttribute(IWorkbenchRegistryConstants.ATT_ICON);
if (strIcon == null) {
return;
}
imageDescriptor = AbstractUIPlugin.imageDescriptorFromPlugin(
configElement.getNamespace(), strIcon);
if (imageDescriptor == null) {
return;
}
Image image = JFaceResources.getResources().createImageWithDefault(imageDescriptor);
titleImage = image;
}
/**
* Sets or clears the title image of this part.
*
* @param titleImage
* the title image, or <code>null</code> to clear
*/
protected void setTitleImage(Image titleImage) {
Assert.isTrue(titleImage == null || !titleImage.isDisposed());
//Do not send changes if they are the same
if (this.titleImage == titleImage) {
return;
}
this.titleImage = titleImage;
firePropertyChange(IIntroPart.PROP_TITLE);
}
/**
* Set the title string for this part.
*
* @param titleLabel the title string. Must not be <code>null</code>.
* @since 3.2
*/
protected void setTitle(String titleLabel) {
Assert.isNotNull(titleLabel);
if (Util.equals(this.titleLabel, titleLabel))
return;
this.titleLabel = titleLabel;
firePropertyChange(IIntroPart.PROP_TITLE);
}
}