| /******************************************************************************* |
| * Copyright (c) 2000, 2005 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.tests.multieditor; |
| |
| import org.eclipse.core.runtime.IConfigurationElement; |
| import org.eclipse.swt.SWT; |
| import org.eclipse.swt.custom.CLabel; |
| import org.eclipse.swt.custom.SashForm; |
| import org.eclipse.swt.custom.ViewForm; |
| import org.eclipse.swt.events.DisposeEvent; |
| import org.eclipse.swt.events.DisposeListener; |
| import org.eclipse.swt.graphics.Image; |
| import org.eclipse.swt.layout.FillLayout; |
| import org.eclipse.swt.widgets.Composite; |
| import org.eclipse.ui.IEditorInput; |
| import org.eclipse.ui.IEditorPart; |
| import org.eclipse.ui.IEditorSite; |
| import org.eclipse.ui.IPropertyListener; |
| import org.eclipse.ui.IWorkbenchPart; |
| import org.eclipse.ui.PartInitException; |
| import org.eclipse.ui.part.MultiEditor; |
| import org.eclipse.ui.tests.util.CallHistory; |
| |
| /** |
| * Implementation of a TiledEditor. This is the testable version copied from bug |
| * 42641. |
| */ |
| public class TiledEditor extends MultiEditor { |
| |
| private CLabel innerEditorTitle[]; |
| |
| public CallHistory callHistory; |
| |
| public TiledEditor() { |
| super(); |
| callHistory = new CallHistory(this); |
| } |
| |
| /** |
| * technically not part of our framework API, but it will mark when the |
| * widgets were disposed. |
| */ |
| public void widgetsDisposed() { |
| callHistory.add("widgetsDisposed"); |
| } |
| |
| /* |
| * @see IWorkbenchPart#createPartControl(Composite) |
| */ |
| public void createPartControl(Composite parent) { |
| callHistory.add("createPartControl"); |
| |
| parent.addDisposeListener(new DisposeListener() { |
| public void widgetDisposed(DisposeEvent e) { |
| widgetsDisposed(); |
| } |
| }); |
| |
| parent = new Composite(parent, SWT.BORDER); |
| |
| parent.setLayout(new FillLayout()); |
| SashForm sashForm = new SashForm(parent, SWT.HORIZONTAL); |
| IEditorPart innerEditors[] = getInnerEditors(); |
| |
| for (int i = 0; i < innerEditors.length; i++) { |
| final IEditorPart e = innerEditors[i]; |
| ViewForm viewForm = new ViewForm(sashForm, SWT.NONE); |
| viewForm.marginWidth = 0; |
| viewForm.marginHeight = 0; |
| |
| createInnerEditorTitle(i, viewForm); |
| |
| Composite content = createInnerPartControl(viewForm, e); |
| |
| viewForm.setContent(content); |
| updateInnerEditorTitle(e, innerEditorTitle[i]); |
| |
| final int index = i; |
| e.addPropertyListener(new IPropertyListener() { |
| public void propertyChanged(Object source, int property) { |
| if (property == IEditorPart.PROP_DIRTY |
| || property == IWorkbenchPart.PROP_TITLE) |
| if (source instanceof IEditorPart) |
| updateInnerEditorTitle((IEditorPart) source, |
| innerEditorTitle[index]); |
| } |
| }); |
| } |
| } |
| |
| /** |
| * Draw the gradient for the specified editor. |
| */ |
| protected void drawGradient(IEditorPart innerEditor, Gradient g) { |
| CLabel label = innerEditorTitle[getIndex(innerEditor)]; |
| if ((label == null) || label.isDisposed()) |
| return; |
| |
| label.setForeground(g.fgColor); |
| label.setBackground(g.bgColors, g.bgPercents); |
| } |
| |
| /* |
| * Create the label for each inner editor. |
| */ |
| protected void createInnerEditorTitle(int index, ViewForm parent) { |
| |
| CLabel titleLabel = new CLabel(parent, SWT.SHADOW_NONE); |
| // hookFocus(titleLabel); |
| titleLabel.setAlignment(SWT.LEFT); |
| titleLabel.setBackground(null, null); |
| parent.setTopLeft(titleLabel); |
| if (innerEditorTitle == null) |
| innerEditorTitle = new CLabel[getInnerEditors().length]; |
| innerEditorTitle[index] = titleLabel; |
| } |
| |
| /* |
| * Update the tab for an editor. This is typically called by a site when the |
| * tab title changes. |
| */ |
| public void updateInnerEditorTitle(IEditorPart editor, CLabel label) { |
| |
| if ((label == null) || label.isDisposed()) |
| return; |
| String title = editor.getTitle(); |
| if (editor.isDirty()) |
| title = "*" + title; //$NON-NLS-1$ |
| label.setText(title); |
| Image image = editor.getTitleImage(); |
| if (image != null) |
| if (!image.equals(label.getImage())) |
| label.setImage(image); |
| label.setToolTipText(editor.getTitleToolTip()); |
| } |
| |
| /* |
| * |
| */ |
| protected int getIndex(IEditorPart editor) { |
| IEditorPart innerEditors[] = getInnerEditors(); |
| for (int i = 0; i < innerEditors.length; i++) { |
| if (innerEditors[i] == editor) |
| return i; |
| } |
| return -1; |
| } |
| |
| // |
| // These are public methods from the parent that are overriden to |
| // add them to the call history. |
| // |
| |
| public Composite createInnerPartControl(Composite parent, IEditorPart e) { |
| callHistory.add("createInnerPartControl"); |
| return super.createInnerPartControl(parent, e); |
| } |
| |
| public void init(IEditorSite site, IEditorInput input) |
| throws PartInitException { |
| callHistory.add("init"); |
| super.init(site, input); |
| } |
| |
| public void setFocus() { |
| callHistory.add("setFocus"); |
| super.setFocus(); |
| } |
| |
| public void updateGradient(IEditorPart editor) { |
| callHistory.add("updateGradient"); |
| super.updateGradient(editor); |
| } |
| |
| public void setInitializationData(IConfigurationElement cfig, |
| String propertyName, Object data) { |
| callHistory.add("setInitializationData"); |
| super.setInitializationData(cfig, propertyName, data); |
| } |
| |
| public void dispose() { |
| callHistory.add("dispose"); |
| super.dispose(); |
| } |
| } |