diff options
| author | Eric Moffatt | 2013-11-14 19:51:34 +0000 |
|---|---|---|
| committer | Eric Moffatt | 2013-11-14 19:54:41 +0000 |
| commit | 5ccbeaf04e4b48154395960c07edda5948523d41 (patch) | |
| tree | 1fd4caad86b6de1d21af4708dc8530aedeb1d980 | |
| parent | c906222ff6d786606fe45c37fa5c5ba94d1a3f36 (diff) | |
| download | eclipse.platform.ui-5ccbeaf04e4b48154395960c07edda5948523d41.tar.gz eclipse.platform.ui-5ccbeaf04e4b48154395960c07edda5948523d41.tar.xz eclipse.platform.ui-5ccbeaf04e4b48154395960c07edda5948523d41.zip | |
Ongoing work for Bug 387579 - [EditorMgmt] [regression] No
indication/decoration for pinned editor
12 files changed, 285 insertions, 201 deletions
diff --git a/bundles/org.eclipse.e4.ui.workbench.renderers.swt/src/org/eclipse/e4/ui/workbench/renderers/swt/SWTPartRenderer.java b/bundles/org.eclipse.e4.ui.workbench.renderers.swt/src/org/eclipse/e4/ui/workbench/renderers/swt/SWTPartRenderer.java index c4b2823230c..aaf677343ec 100644 --- a/bundles/org.eclipse.e4.ui.workbench.renderers.swt/src/org/eclipse/e4/ui/workbench/renderers/swt/SWTPartRenderer.java +++ b/bundles/org.eclipse.e4.ui.workbench.renderers.swt/src/org/eclipse/e4/ui/workbench/renderers/swt/SWTPartRenderer.java @@ -42,6 +42,11 @@ public abstract class SWTPartRenderer extends AbstractPartRenderer { Map<String, Image> imageMap = new HashMap<String, Image>(); + String pinURI = "platform:/plugin/org.eclipse.ui/icons/full/ovr16/pinned_ovr.gif"; //$NON-NLS-1$ + Image pinImage; + + private ISWTResourceUtilities resUtils; + public void processContents(MElementContainer<MUIElement> container) { // EMF gives us null lists if empty if (container == null) @@ -192,21 +197,63 @@ public abstract class SWTPartRenderer extends AbstractPartRenderer { } } - protected Image getImage(MUILabel element) { - IEclipseContext localContext = context; - String iconURI = element.getIconURI(); - if (iconURI != null && iconURI.length() > 0) { - Image image = imageMap.get(iconURI); - if (image == null) { - ISWTResourceUtilities resUtils = (ISWTResourceUtilities) localContext - .get(IResourceUtilities.class.getName()); - image = resUtils.imageDescriptorFromURI(URI.createURI(iconURI)) - .createImage(); - imageMap.put(iconURI, image); - } - return image; + protected String getToolTip(MUILabel element) { + String overrideTip = (String) ((MUIElement) element).getTransientData() + .get(IPresentationEngine.OVERRIDE_TITLE_TOOL_TIP_KEY); + return overrideTip == null ? element.getTooltip() : overrideTip; + } + + protected Image getImageFromURI(String iconURI) { + if (iconURI == null || iconURI.length() == 0) + return null; + + Image image = imageMap.get(iconURI); + if (image == null) { + image = resUtils.imageDescriptorFromURI(URI.createURI(iconURI)) + .createImage(); + imageMap.put(iconURI, image); + } + return image; + } + + public Image getImage(MUILabel element) { + Image image = (Image) ((MUIElement) element).getTransientData().get( + IPresentationEngine.OVERRIDE_ICON_IMAGE_KEY); + if (image == null) { + String iconURI = element.getIconURI(); + image = getImageFromURI(iconURI); + } + + if (image != null) { + image = adornImage((MUIElement) element, image); } - return null; + + return image; + } + + /** + * @param element + * @param image + * @return + */ + private Image adornImage(MUIElement element, Image image) { + // Remove and dispose any previous adorned image + Image previouslyAdornedImage = (Image) element.getTransientData().get( + "previouslyAdorned"); //$NON-NLS-1$ + if (previouslyAdornedImage != null + && !previouslyAdornedImage.isDisposed()) + previouslyAdornedImage.dispose(); + element.getTransientData().remove(IPresentationEngine.ADORNMENT_PIN); + + Image adornedImage = image; + if (element.getTags().contains(IPresentationEngine.ADORNMENT_PIN)) { + adornedImage = resUtils.adornImage(image, pinImage); + if (adornedImage != image) + element.getTransientData().put( + "previouslyAdorned", adornedImage); //$NON-NLS-1$ + } + + return adornedImage; } /** @@ -262,6 +309,11 @@ public abstract class SWTPartRenderer extends AbstractPartRenderer { @Override public void init(IEclipseContext context) { super.init(context); + + resUtils = (ISWTResourceUtilities) context.get(IResourceUtilities.class + .getName()); + pinImage = getImageFromURI(pinURI); + Display.getCurrent().disposeExec(new Runnable() { public void run() { for (Image image : imageMap.values()) { diff --git a/bundles/org.eclipse.e4.ui.workbench.renderers.swt/src/org/eclipse/e4/ui/workbench/renderers/swt/StackRenderer.java b/bundles/org.eclipse.e4.ui.workbench.renderers.swt/src/org/eclipse/e4/ui/workbench/renderers/swt/StackRenderer.java index 909981eeb17..0274d482346 100644 --- a/bundles/org.eclipse.e4.ui.workbench.renderers.swt/src/org/eclipse/e4/ui/workbench/renderers/swt/StackRenderer.java +++ b/bundles/org.eclipse.e4.ui.workbench.renderers.swt/src/org/eclipse/e4/ui/workbench/renderers/swt/StackRenderer.java @@ -13,13 +13,16 @@ package org.eclipse.e4.ui.workbench.renderers.swt; import java.util.ArrayList; import java.util.List; import java.util.Map; +import java.util.Map.Entry; import java.util.Set; import javax.annotation.PostConstruct; import javax.annotation.PreDestroy; import javax.inject.Inject; import javax.inject.Named; import org.eclipse.e4.core.contexts.IEclipseContext; +import org.eclipse.e4.core.di.annotations.Optional; import org.eclipse.e4.core.services.events.IEventBroker; +import org.eclipse.e4.ui.di.UIEventTopic; import org.eclipse.e4.ui.internal.workbench.renderers.swt.BasicPartList; import org.eclipse.e4.ui.internal.workbench.renderers.swt.SWTRenderersMessages; import org.eclipse.e4.ui.internal.workbench.swt.AbstractPartRenderer; @@ -44,6 +47,7 @@ import org.eclipse.e4.ui.services.IStylingEngine; import org.eclipse.e4.ui.workbench.IPresentationEngine; import org.eclipse.e4.ui.workbench.IResourceUtilities; import org.eclipse.e4.ui.workbench.UIEvents; +import org.eclipse.e4.ui.workbench.UIEvents.EventTags; import org.eclipse.e4.ui.workbench.modeling.EModelService; import org.eclipse.e4.ui.workbench.modeling.EPartService; import org.eclipse.e4.ui.workbench.swt.util.ISWTResourceUtilities; @@ -151,11 +155,111 @@ public class StackRenderer extends LazyStackRenderer { private boolean ignoreTabSelChanges = false; + List<CTabItem> getItemsToSet(MPart part) { + List<CTabItem> itemsToSet = new ArrayList<CTabItem>(); + + MUIElement partParent = part.getParent(); + if (partParent instanceof MPartStack) { + CTabItem item = findItemForPart(part); + if (item != null) { + itemsToSet.add(findItemForPart(part)); + } + } else if (part.getCurSharedRef() != null) { + MWindow topWin = modelService.getTopLevelWindowFor(part); + List<MPlaceholder> partRefs = modelService.findElements(topWin, + part.getElementId(), MPlaceholder.class, null); + for (MPlaceholder ref : partRefs) { + CTabItem item = findItemForPart(ref, null); + if (item != null) { + itemsToSet.add(item); + } + } + } + + return itemsToSet; + } + + /** + * This is the new way to handle UIEvents (as opposed to subscring and + * unsubscribing them with the event broker. + * + * The method is described in detail at + * http://wiki.eclipse.org/Eclipse4/RCP/Event_Model + */ + @SuppressWarnings("unchecked") + @Inject + @Optional + private void handleTransientDataEvents( + @UIEventTopic(UIEvents.ApplicationElement.TOPIC_TRANSIENTDATA) org.osgi.service.event.Event event) { + MUIElement changedElement = (MUIElement) event + .getProperty(UIEvents.EventTags.ELEMENT); + + if (!(changedElement instanceof MPart)) + return; + + String key; + if (UIEvents.isREMOVE(event)) { + key = ((Entry<String, Object>) event + .getProperty(UIEvents.EventTags.OLD_VALUE)).getKey(); + } else { + key = ((Entry<String, Object>) event + .getProperty(UIEvents.EventTags.NEW_VALUE)).getKey(); + } + + if (!IPresentationEngine.OVERRIDE_ICON_IMAGE_KEY.equals(key) + && !IPresentationEngine.OVERRIDE_TITLE_TOOL_TIP_KEY.equals(key)) + return; + + MPart part = (MPart) changedElement; + List<CTabItem> itemsToSet = getItemsToSet(part); + for (CTabItem item : itemsToSet) { + if (key.equals(IPresentationEngine.OVERRIDE_ICON_IMAGE_KEY)) { + item.setImage(getImage(part)); + } else if (key + .equals(IPresentationEngine.OVERRIDE_TITLE_TOOL_TIP_KEY)) { + String newTip = getToolTip(part); + item.setToolTipText(getToolTip(newTip)); + } + } + } + // private ToolBar menuTB; // private boolean menuButtonShowing = false; // private Control partTB; + /** + * Handles changes in tags + * + * @param event + */ + @Inject + @Optional + private void subscribeTopicTagsChanged( + @UIEventTopic(UIEvents.ApplicationElement.TOPIC_TAGS) Event event) { + Object changedObj = event.getProperty(EventTags.ELEMENT); + + if (!(changedObj instanceof MPart)) + return; + + final MPart part = (MPart) changedObj; + CTabItem item = findItemForPart(part); + if (item == null || item.isDisposed()) + return; + + if (UIEvents.isADD(event)) { + if (UIEvents.contains(event, UIEvents.EventTags.NEW_VALUE, + IPresentationEngine.ADORNMENT_PIN)) { + item.setImage(getImage(part)); + } + } else if (UIEvents.isREMOVE(event)) { + if (UIEvents.contains(event, UIEvents.EventTags.OLD_VALUE, + IPresentationEngine.ADORNMENT_PIN)) { + item.setImage(getImage(part)); + } + } + } + /* * (non-Javadoc) * @@ -737,7 +841,7 @@ public class StackRenderer extends LazyStackRenderer { stack = element.getParent(); CTabFolder ctf = (CTabFolder) stack.getWidget(); - if (ctf == null) + if (ctf == null || ctf.isDisposed()) return null; CTabItem[] items = ctf.getItems(); diff --git a/bundles/org.eclipse.e4.ui.workbench.swt/src/org/eclipse/e4/ui/internal/workbench/swt/ResourceUtility.java b/bundles/org.eclipse.e4.ui.workbench.swt/src/org/eclipse/e4/ui/internal/workbench/swt/ResourceUtility.java index 7eb2020e9bc..c47b3d60af8 100644 --- a/bundles/org.eclipse.e4.ui.workbench.swt/src/org/eclipse/e4/ui/internal/workbench/swt/ResourceUtility.java +++ b/bundles/org.eclipse.e4.ui.workbench.swt/src/org/eclipse/e4/ui/internal/workbench/swt/ResourceUtility.java @@ -16,6 +16,9 @@ import java.net.URL; import org.eclipse.e4.ui.workbench.swt.util.ISWTResourceUtilities; import org.eclipse.emf.common.util.URI; import org.eclipse.jface.resource.ImageDescriptor; +import org.eclipse.swt.graphics.GC; +import org.eclipse.swt.graphics.Image; +import org.eclipse.swt.graphics.Rectangle; public class ResourceUtility implements ISWTResourceUtilities { @@ -32,4 +35,21 @@ public class ResourceUtility implements ISWTResourceUtilities { return null; } } + + public Image adornImage(Image toAdorn, Image adornment) { + if (toAdorn == null) + return null; + if (adornment == null) + return toAdorn; + Rectangle adornmentSize = adornment.getBounds(); + + Image adornedImage = new Image(toAdorn.getDevice(), 16, 16); + GC gc = new GC(adornedImage); + gc.drawImage(toAdorn, 0, 0); + // For now assume top-right + gc.drawImage(adornment, 16 - adornmentSize.width, 0); + gc.dispose(); + + return adornedImage; + } } diff --git a/bundles/org.eclipse.e4.ui.workbench.swt/src/org/eclipse/e4/ui/workbench/swt/util/ISWTResourceUtilities.java b/bundles/org.eclipse.e4.ui.workbench.swt/src/org/eclipse/e4/ui/workbench/swt/util/ISWTResourceUtilities.java index 883e374793e..7d28d8c1e54 100644 --- a/bundles/org.eclipse.e4.ui.workbench.swt/src/org/eclipse/e4/ui/workbench/swt/util/ISWTResourceUtilities.java +++ b/bundles/org.eclipse.e4.ui.workbench.swt/src/org/eclipse/e4/ui/workbench/swt/util/ISWTResourceUtilities.java @@ -13,8 +13,20 @@ package org.eclipse.e4.ui.workbench.swt.util; import org.eclipse.e4.ui.workbench.IResourceUtilities; import org.eclipse.jface.resource.ImageDescriptor; +import org.eclipse.swt.graphics.Image; public interface ISWTResourceUtilities extends IResourceUtilities<ImageDescriptor> { + /** + * Low-level utility to stamp an adornment onto a given Image. + * + * @param toAdorn + * The image to be adorned (must not be null) + * @param adornment + * The image to adorn with. + * + * @return The adorned image or 'toAdorn' if 'adornment' is null + */ + public Image adornImage(Image toAdorn, Image adornment); } diff --git a/bundles/org.eclipse.e4.ui.workbench/src/org/eclipse/e4/ui/workbench/IPresentationEngine.java b/bundles/org.eclipse.e4.ui.workbench/src/org/eclipse/e4/ui/workbench/IPresentationEngine.java index 7a03b4953df..8b4c61187ad 100644 --- a/bundles/org.eclipse.e4.ui.workbench/src/org/eclipse/e4/ui/workbench/IPresentationEngine.java +++ b/bundles/org.eclipse.e4.ui.workbench/src/org/eclipse/e4/ui/workbench/IPresentationEngine.java @@ -125,6 +125,12 @@ public interface IPresentationEngine { public static final String OVERRIDE_TITLE_TOOL_TIP_KEY = "e4_override_title_tool_tip_key"; //$NON-NLS-1$ /** + * This is a Tag that when applied to an MUILabel element will cause whatever Image is to be + * shown to be adorned with the 'pinned' affordance. + */ + public static final String ADORNMENT_PIN = "Pin Adornment"; //$NON-NLS-1$ + + /** * This is a <b>Boolean</b> preference used to control animations in the application */ public static final String ANIMATIONS_ENABLED = "Animations Enabled"; //$NON-NLS-1$ diff --git a/bundles/org.eclipse.ui.workbench/Eclipse UI/org/eclipse/ui/internal/EditorReference.java b/bundles/org.eclipse.ui.workbench/Eclipse UI/org/eclipse/ui/internal/EditorReference.java index 49756c44518..755ad4deee5 100644 --- a/bundles/org.eclipse.ui.workbench/Eclipse UI/org/eclipse/ui/internal/EditorReference.java +++ b/bundles/org.eclipse.ui.workbench/Eclipse UI/org/eclipse/ui/internal/EditorReference.java @@ -16,6 +16,8 @@ import java.io.StringReader; import java.io.StringWriter; import java.util.HashMap; import java.util.HashSet; +import java.util.Iterator; +import java.util.Map; import java.util.Set; import org.eclipse.core.runtime.CoreException; import org.eclipse.core.runtime.IAdaptable; @@ -26,7 +28,6 @@ import org.eclipse.e4.core.contexts.IEclipseContext; import org.eclipse.e4.ui.model.application.ui.basic.MPart; import org.eclipse.jface.internal.provisional.action.ICoolBarManager2; import org.eclipse.jface.preference.IPreferenceStore; -import org.eclipse.jface.resource.ImageDescriptor; import org.eclipse.osgi.util.NLS; import org.eclipse.ui.IEditorActionBarContributor; import org.eclipse.ui.IEditorInput; @@ -40,6 +41,7 @@ import org.eclipse.ui.IPersistableEditor; import org.eclipse.ui.IPersistableElement; import org.eclipse.ui.IWorkbenchPage; import org.eclipse.ui.IWorkbenchPart; +import org.eclipse.ui.IWorkbenchPart3; import org.eclipse.ui.PartInitException; import org.eclipse.ui.PlatformUI; import org.eclipse.ui.WorkbenchException; @@ -76,19 +78,15 @@ public class EditorReference extends WorkbenchPartReference implements IEditorRe .getEditorRegistry(); descriptorId = createReadRoot.getString(IWorkbenchConstants.TAG_ID); this.descriptor = (EditorDescriptor) registry.findEditor(descriptorId); - } - if (this.descriptor == null) { - setImageDescriptor(ImageDescriptor.getMissingImageDescriptor()); - } else { - setImageDescriptor(this.descriptor.getImageDescriptor()); + boolean pinnedVal = "true".equals(createReadRoot.getString(IWorkbenchConstants.TAG_PINNED)); //$NON-NLS-1$ + setPinned(pinnedVal); } } catch (WorkbenchException e) { WorkbenchPlugin.log(e); } } else { descriptorId = this.descriptor.getId(); - setImageDescriptor(this.descriptor.getImageDescriptor()); } } @@ -139,19 +137,42 @@ public class EditorReference extends WorkbenchPartReference implements IEditorRe return null; } - XMLMemento root = XMLMemento.createWriteRoot(IWorkbenchConstants.TAG_EDITOR); - root.putString(IWorkbenchConstants.TAG_ID, descriptor.getId()); + XMLMemento editorMem = XMLMemento.createWriteRoot(IWorkbenchConstants.TAG_EDITOR); + editorMem.putString(IWorkbenchConstants.TAG_ID, descriptor.getId()); + editorMem.putString(IWorkbenchConstants.TAG_TITLE, getTitle()); + editorMem.putString(IWorkbenchConstants.TAG_NAME, getName()); + editorMem.putString(IWorkbenchConstants.TAG_ID, getId()); + editorMem.putString(IWorkbenchConstants.TAG_TOOLTIP, getTitleToolTip()); + editorMem.putString(IWorkbenchConstants.TAG_PART_NAME, getPartName()); + + if (editor instanceof IWorkbenchPart3) { + Map properties = ((IWorkbenchPart3) editor).getPartProperties(); + if (!properties.isEmpty()) { + IMemento propBag = editorMem.createChild(IWorkbenchConstants.TAG_PROPERTIES); + Iterator i = properties.entrySet().iterator(); + while (i.hasNext()) { + Map.Entry entry = (Map.Entry) i.next(); + IMemento p = propBag.createChild(IWorkbenchConstants.TAG_PROPERTY, + (String) entry.getKey()); + p.putTextData((String) entry.getValue()); + } + } + } + + if (isPinned()) { + editorMem.putString(IWorkbenchConstants.TAG_PINNED, "true"); //$NON-NLS-1$ + } - IMemento inputMem = root.createChild(IWorkbenchConstants.TAG_INPUT); + IMemento inputMem = editorMem.createChild(IWorkbenchConstants.TAG_INPUT); inputMem.putString(IWorkbenchConstants.TAG_FACTORY_ID, persistable.getFactoryId()); persistable.saveState(inputMem); if (editor instanceof IPersistableEditor) { - IMemento editorStateMem = root.createChild(IWorkbenchConstants.TAG_EDITOR_STATE); + IMemento editorStateMem = editorMem.createChild(IWorkbenchConstants.TAG_EDITOR_STATE); ((IPersistableEditor) editor).saveState(editorStateMem); } - return root; + return editorMem; } public EditorDescriptor getDescriptor() { diff --git a/bundles/org.eclipse.ui.workbench/Eclipse UI/org/eclipse/ui/internal/ViewReference.java b/bundles/org.eclipse.ui.workbench/Eclipse UI/org/eclipse/ui/internal/ViewReference.java index fc4ed98fc4e..f6ebea12e97 100644 --- a/bundles/org.eclipse.ui.workbench/Eclipse UI/org/eclipse/ui/internal/ViewReference.java +++ b/bundles/org.eclipse.ui.workbench/Eclipse UI/org/eclipse/ui/internal/ViewReference.java @@ -18,7 +18,6 @@ import org.eclipse.core.runtime.IStatus; import org.eclipse.core.runtime.Status; import org.eclipse.e4.core.contexts.IEclipseContext; import org.eclipse.e4.ui.model.application.ui.basic.MPart; -import org.eclipse.jface.resource.ImageDescriptor; import org.eclipse.osgi.util.NLS; import org.eclipse.ui.IMemento; import org.eclipse.ui.IViewPart; @@ -40,12 +39,6 @@ public class ViewReference extends WorkbenchPartReference implements IViewRefere super(windowContext, page, part); this.descriptor = descriptor; - if (descriptor == null) { - setImageDescriptor(ImageDescriptor.getMissingImageDescriptor()); - } else { - setImageDescriptor(descriptor.getImageDescriptor()); - } - String mementoString = getModel().getPersistedState().get(MEMENTO_KEY); if (mementoString != null) { try { diff --git a/bundles/org.eclipse.ui.workbench/Eclipse UI/org/eclipse/ui/internal/WorkbenchPartReference.java b/bundles/org.eclipse.ui.workbench/Eclipse UI/org/eclipse/ui/internal/WorkbenchPartReference.java index 2e3b2deec1f..e4348b5a1a0 100644 --- a/bundles/org.eclipse.ui.workbench/Eclipse UI/org/eclipse/ui/internal/WorkbenchPartReference.java +++ b/bundles/org.eclipse.ui.workbench/Eclipse UI/org/eclipse/ui/internal/WorkbenchPartReference.java @@ -15,7 +15,6 @@ package org.eclipse.ui.internal; import java.util.HashMap; import java.util.Iterator; import java.util.Map; -import org.eclipse.core.runtime.Assert; import org.eclipse.core.runtime.IStatus; import org.eclipse.core.runtime.ListenerList; import org.eclipse.e4.core.contexts.ContextInjectionFactory; @@ -23,17 +22,16 @@ import org.eclipse.e4.core.contexts.IEclipseContext; import org.eclipse.e4.core.services.events.IEventBroker; import org.eclipse.e4.ui.di.Focus; import org.eclipse.e4.ui.model.application.ui.basic.MPart; +import org.eclipse.e4.ui.workbench.IPresentationEngine; import org.eclipse.e4.ui.workbench.UIEvents; import org.eclipse.e4.ui.workbench.modeling.EPartService; import org.eclipse.e4.ui.workbench.modeling.EPartService.PartState; -import org.eclipse.jface.resource.ImageDescriptor; -import org.eclipse.jface.resource.JFaceResources; +import org.eclipse.e4.ui.workbench.renderers.swt.SWTPartRenderer; import org.eclipse.jface.util.IPropertyChangeListener; import org.eclipse.jface.util.PropertyChangeEvent; import org.eclipse.swt.graphics.Image; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Control; -import org.eclipse.swt.widgets.Display; import org.eclipse.ui.IPropertyListener; import org.eclipse.ui.ISaveablePart; import org.eclipse.ui.ISaveablesLifecycleListener; @@ -133,29 +131,8 @@ public abstract class WorkbenchPartReference implements IWorkbenchPartReference, private int state = STATE_LAZY; protected IWorkbenchPart legacyPart; - - private boolean pinned = false; - - /** - * Stores the current Image for this part reference. Lazily created. Null if not allocated. - */ - private Image image = null; - - /** - * Stores reference to the image kept in the legacyPart. Used for quick check - * if the image changed. - */ - private Image legacyPartImage = null; - - private ImageDescriptor defaultImageDescriptor; - - /** - * Stores the current image descriptor for the part. - */ - private ImageDescriptor imageDescriptor; - /** * API listener list */ @@ -171,8 +148,6 @@ public abstract class WorkbenchPartReference implements IWorkbenchPartReference, protected Map propertyCache = new HashMap(); - - private IPropertyListener propertyChangeListener = new IPropertyListener() { /* (non-Javadoc) * @see org.eclipse.ui.IPropertyListener#propertyChanged(java.lang.Object, int) @@ -278,39 +253,9 @@ public abstract class WorkbenchPartReference implements IWorkbenchPartReference, return part; } - protected void setImageDescriptor(ImageDescriptor descriptor) { - if (Util.equals(imageDescriptor, descriptor)) { - return; - } - Image oldImage = image; - ImageDescriptor oldDescriptor = imageDescriptor; - image = null; - imageDescriptor = descriptor; - - // Don't queue events triggered by image changes. We'll dispose the image - // immediately after firing the event, so we need to fire it right away. - immediateFirePropertyChange(IWorkbenchPartConstants.PROP_TITLE); - // If we had allocated the old image, deallocate it now (AFTER we fire the property change - // -- listeners may need to clean up references to the old image) - if (oldImage != null) { - JFaceResources.getResources().destroy(oldDescriptor); - } - } - protected void partPropertyChanged(Object source, int propId) { - - // We handle these properties directly (some of them may be transformed - // before firing events to workbench listeners) - // if (propId == IWorkbenchPartConstants.PROP_CONTENT_DESCRIPTION - // || propId == IWorkbenchPartConstants.PROP_PART_NAME - // || propId == IWorkbenchPartConstants.PROP_TITLE) { - // - // refreshFromPart(); - // } else { - // Any other properties are just reported to listeners verbatim - firePropertyChange(propId); - // } + firePropertyChange(propId); // Let the model manager know as well if (propId == IWorkbenchPartConstants.PROP_DIRTY) { @@ -326,22 +271,6 @@ public abstract class WorkbenchPartReference implements IWorkbenchPartReference, firePartPropertyChange(event); } - - protected ImageDescriptor computeImageDescriptor() { - if (legacyPart != null) { - return ImageDescriptor - .createFromImage(legacyPart.getTitleImage(), Display.getCurrent()); - } - return defaultImageDescriptor; - } - - public void init(ImageDescriptor desc) { - Assert.isNotNull(desc); - - this.defaultImageDescriptor = desc; - this.imageDescriptor = computeImageDescriptor(); - } - /** * Releases any references maintained by this part reference * when its actual part becomes known (not called when it is disposed). @@ -442,35 +371,18 @@ public abstract class WorkbenchPartReference implements IWorkbenchPartReference, return Util.safeString(legacyPart.getTitle()); } - public final Image getTitleImage() { - if (isDisposed()) { - return PlatformUI.getWorkbench().getSharedImages().getImage(ISharedImages.IMG_DEF_VIEW); - } - - Image newLegacyPartImage = null; - if (legacyPart != null) { - newLegacyPartImage = legacyPart.getTitleImage(); - } - // refresh the local image if the image in the legacyPart changed - if (newLegacyPartImage != null && newLegacyPartImage != legacyPartImage) { - legacyPartImage = newLegacyPartImage; - // the setImageDescriptor(ImageDescriptor) method sets the image field to null, - // so a new value will be assigned to the image in the conditional statement below - setImageDescriptor(computeImageDescriptor()); - } - if (image == null) { - image = JFaceResources.getResources().createImageWithDefault(imageDescriptor); - } - return image; - } + public final Image getTitleImage() { + if (isDisposed()) { + return PlatformUI.getWorkbench().getSharedImages().getImage(ISharedImages.IMG_DEF_VIEW); + } + + if (part != null && part.getRenderer() instanceof SWTPartRenderer) { + SWTPartRenderer r = (SWTPartRenderer) part.getRenderer(); + return r.getImage(part); + } - public ImageDescriptor getTitleImageDescriptor() { - if (isDisposed()) { - return PlatformUI.getWorkbench().getSharedImages().getImageDescriptor(ISharedImages.IMG_DEF_VIEW); - } - - return imageDescriptor; - } + return null; + } /* package */ void fireVisibilityChange() { fireInternalPropertyChange(INTERNAL_PROPERTY_VISIBLE); @@ -544,8 +456,8 @@ public abstract class WorkbenchPartReference implements IWorkbenchPartReference, } } - return legacyPart; + return legacyPart; } public abstract IWorkbenchPart createPart() throws PartInitException; @@ -588,9 +500,13 @@ public abstract class WorkbenchPartReference implements IWorkbenchPartReference, } pinned = newPinned; - - setImageDescriptor(computeImageDescriptor()); - + + immediateFirePropertyChange(IWorkbenchPartConstants.PROP_TITLE); + if (pinned) + part.getTags().add(IPresentationEngine.ADORNMENT_PIN); + else + part.getTags().remove(IPresentationEngine.ADORNMENT_PIN); + fireInternalPropertyChange(INTERNAL_PROPERTY_PINNED); } diff --git a/bundles/org.eclipse.ui.workbench/Eclipse UI/org/eclipse/ui/internal/e4/compatibility/CompatibilityEditor.java b/bundles/org.eclipse.ui.workbench/Eclipse UI/org/eclipse/ui/internal/e4/compatibility/CompatibilityEditor.java index dd2194642d3..42337153548 100644 --- a/bundles/org.eclipse.ui.workbench/Eclipse UI/org/eclipse/ui/internal/e4/compatibility/CompatibilityEditor.java +++ b/bundles/org.eclipse.ui.workbench/Eclipse UI/org/eclipse/ui/internal/e4/compatibility/CompatibilityEditor.java @@ -137,11 +137,6 @@ public class CompatibilityEditor extends CompatibilityPart { } @Override - void updateImages(MPart part) { - updateTabImages(part); - } - - @Override void disposeSite(PartSite site) { EditorActionBars bars = (EditorActionBars) site.getActionBars(); EditorReference.disposeEditorActionBars(bars); diff --git a/bundles/org.eclipse.ui.workbench/Eclipse UI/org/eclipse/ui/internal/e4/compatibility/CompatibilityPart.java b/bundles/org.eclipse.ui.workbench/Eclipse UI/org/eclipse/ui/internal/e4/compatibility/CompatibilityPart.java index 170f04ea5bf..ad4694671fc 100644 --- a/bundles/org.eclipse.ui.workbench/Eclipse UI/org/eclipse/ui/internal/e4/compatibility/CompatibilityPart.java +++ b/bundles/org.eclipse.ui.workbench/Eclipse UI/org/eclipse/ui/internal/e4/compatibility/CompatibilityPart.java @@ -21,11 +21,8 @@ import org.eclipse.e4.core.services.events.IEventBroker; import org.eclipse.e4.core.services.log.Logger; import org.eclipse.e4.ui.di.Focus; import org.eclipse.e4.ui.di.Persist; -import org.eclipse.e4.ui.internal.workbench.swt.AbstractPartRenderer; import org.eclipse.e4.ui.model.application.ui.MDirtyable; -import org.eclipse.e4.ui.model.application.ui.MUIElement; import org.eclipse.e4.ui.model.application.ui.basic.MPart; -import org.eclipse.e4.ui.model.application.ui.basic.MPartStack; import org.eclipse.e4.ui.model.application.ui.menu.MMenu; import org.eclipse.e4.ui.workbench.IPresentationEngine; import org.eclipse.e4.ui.workbench.UIEvents; @@ -35,8 +32,7 @@ import org.eclipse.jface.viewers.ISelectionChangedListener; import org.eclipse.jface.viewers.ISelectionProvider; import org.eclipse.jface.viewers.SelectionChangedEvent; import org.eclipse.swt.SWT; -import org.eclipse.swt.custom.CTabFolder; -import org.eclipse.swt.custom.CTabItem; +import org.eclipse.swt.graphics.Image; import org.eclipse.swt.layout.FillLayout; import org.eclipse.swt.widgets.Composite; import org.eclipse.ui.IEditorPart; @@ -327,8 +323,10 @@ public abstract class CompatibilityPart implements ISelectionChangedListener { // Only update 'valid' parts if (!(wrapped instanceof ErrorEditorPart) && !(wrapped instanceof ErrorViewPart)) { part.setLabel(computeLabel()); - part.setTooltip(wrapped.getTitleToolTip()); - updateImages(part); + part.getTransientData().put(IPresentationEngine.OVERRIDE_TITLE_TOOL_TIP_KEY, + wrapped.getTitleToolTip()); + part.getTransientData().put(IPresentationEngine.OVERRIDE_ICON_IMAGE_KEY, + wrapped.getTitleImage()); } if (wrapped instanceof ISaveablePart) { @@ -340,11 +338,17 @@ public abstract class CompatibilityPart implements ISelectionChangedListener { switch (propId) { case IWorkbenchPartConstants.PROP_TITLE: part.setLabel(computeLabel()); - part.setTooltip(wrapped.getTitleToolTip()); - part.getTransientData().put(IPresentationEngine.OVERRIDE_TITLE_TOOL_TIP_KEY, - wrapped.getTitle()); - updateImages(part); + if (wrapped.getTitleImage() != null) { + Image newImage = wrapped.getTitleImage(); + part.getTransientData().put(IPresentationEngine.OVERRIDE_ICON_IMAGE_KEY, + newImage); + } + if (wrapped.getTitleToolTip() != null && wrapped.getTitleToolTip().length() > 0) { + part.getTransientData() + .put(IPresentationEngine.OVERRIDE_TITLE_TOOL_TIP_KEY, + wrapped.getTitleToolTip()); + } break; case IWorkbenchPartConstants.PROP_DIRTY: if (wrapped instanceof ISaveablePart) { @@ -360,32 +364,6 @@ public abstract class CompatibilityPart implements ISelectionChangedListener { }); } - void updateTabImages(MUIElement element) { - // Try to update the image if we're using a CTF - MUIElement refParent = element.getParent(); - if (!(refParent instanceof MPartStack)) { - return; - } - - if (!(refParent.getWidget() instanceof CTabFolder)) { - return; - } - - CTabFolder ctf = (CTabFolder) refParent.getWidget(); - if (ctf.isDisposed()) { - return; - } - - CTabItem[] items = ctf.getItems(); - for (CTabItem item : items) { - if (item.getData(AbstractPartRenderer.OWNING_ME) == element) { - item.setImage(wrapped.getTitleImage()); - } - } - } - - abstract void updateImages(MPart part); - @PreDestroy void destroy() { if (!alreadyDisposed) { diff --git a/bundles/org.eclipse.ui.workbench/Eclipse UI/org/eclipse/ui/internal/e4/compatibility/CompatibilityView.java b/bundles/org.eclipse.ui.workbench/Eclipse UI/org/eclipse/ui/internal/e4/compatibility/CompatibilityView.java index 28ec099de86..baba40ee6a7 100644 --- a/bundles/org.eclipse.ui.workbench/Eclipse UI/org/eclipse/ui/internal/e4/compatibility/CompatibilityView.java +++ b/bundles/org.eclipse.ui.workbench/Eclipse UI/org/eclipse/ui/internal/e4/compatibility/CompatibilityView.java @@ -12,17 +12,13 @@ package org.eclipse.ui.internal.e4.compatibility; import java.util.Iterator; -import java.util.List; import javax.inject.Inject; import org.eclipse.e4.core.contexts.ContextFunction; import org.eclipse.e4.core.contexts.IContextFunction; import org.eclipse.e4.core.contexts.IEclipseContext; import org.eclipse.e4.ui.internal.workbench.ContributionsAnalyzer; import org.eclipse.e4.ui.internal.workbench.swt.AbstractPartRenderer; -import org.eclipse.e4.ui.model.application.ui.MUIElement; -import org.eclipse.e4.ui.model.application.ui.advanced.MPlaceholder; import org.eclipse.e4.ui.model.application.ui.basic.MPart; -import org.eclipse.e4.ui.model.application.ui.basic.MWindow; import org.eclipse.e4.ui.model.application.ui.menu.MMenu; import org.eclipse.e4.ui.model.application.ui.menu.MMenuElement; import org.eclipse.e4.ui.model.application.ui.menu.MOpaqueMenu; @@ -32,8 +28,6 @@ import org.eclipse.e4.ui.model.application.ui.menu.MOpaqueToolItem; import org.eclipse.e4.ui.model.application.ui.menu.MToolBar; import org.eclipse.e4.ui.model.application.ui.menu.MToolBarElement; import org.eclipse.e4.ui.model.application.ui.menu.impl.MenuFactoryImpl; -import org.eclipse.e4.ui.workbench.IPresentationEngine; -import org.eclipse.e4.ui.workbench.modeling.EModelService; import org.eclipse.e4.ui.workbench.renderers.swt.MenuManagerRenderer; import org.eclipse.e4.ui.workbench.renderers.swt.StackRenderer; import org.eclipse.e4.ui.workbench.renderers.swt.ToolBarManagerRenderer; @@ -69,19 +63,6 @@ public class CompatibilityView extends CompatibilityPart { return (IViewPart) getPart(); } - @Override - void updateImages(MPart part) { - EModelService ms = part.getContext().get(EModelService.class); - MWindow topWin = ms.getTopLevelWindowFor(part); - List<MPlaceholder> partRefs = ms.findElements(topWin, part.getElementId(), - MPlaceholder.class, null); - for (MUIElement ref : partRefs) { - updateTabImages(ref); - } - part.getTransientData().put(IPresentationEngine.OVERRIDE_ICON_IMAGE_KEY, - wrapped.getTitleImage()); - } - /* * (non-Javadoc) * diff --git a/bundles/org.eclipse.ui.workbench/Eclipse UI/org/eclipse/ui/internal/menus/MenuHelper.java b/bundles/org.eclipse.ui.workbench/Eclipse UI/org/eclipse/ui/internal/menus/MenuHelper.java index 355dd1b1d52..643c0415d66 100644 --- a/bundles/org.eclipse.ui.workbench/Eclipse UI/org/eclipse/ui/internal/menus/MenuHelper.java +++ b/bundles/org.eclipse.ui.workbench/Eclipse UI/org/eclipse/ui/internal/menus/MenuHelper.java @@ -806,6 +806,12 @@ public class MenuHelper { String iconURI = null; String disabledIconURI = null; + toolItem.setType(ItemType.PUSH); + if (data.style == CommandContributionItem.STYLE_CHECK) + toolItem.setType(ItemType.CHECK); + else if (data.style == CommandContributionItem.STYLE_RADIO) + toolItem.setType(ItemType.RADIO); + if (data.icon != null) { iconURI = getIconURI(data.icon, application.getContext()); } |
