org.eclipse.debug.ui.sourcelookup.CommonSourceNotFoundEditor.java Source code

Java tutorial

Introduction

Here is the source code for org.eclipse.debug.ui.sourcelookup.CommonSourceNotFoundEditor.java

Source

/*******************************************************************************
 * Copyright (c) 2003, 2007 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.debug.ui.sourcelookup;

import org.eclipse.core.runtime.IAdaptable;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.debug.core.DebugPlugin;
import org.eclipse.debug.core.ILaunch;
import org.eclipse.debug.core.ILaunchesListener2;
import org.eclipse.debug.core.model.IDebugElement;
import org.eclipse.debug.core.model.ISourceLocator;
import org.eclipse.debug.core.sourcelookup.AbstractSourceLookupDirector;
import org.eclipse.debug.internal.ui.DebugUIPlugin;
import org.eclipse.debug.internal.ui.IDebugHelpContextIds;
import org.eclipse.debug.internal.ui.sourcelookup.SourceLookupManager;
import org.eclipse.debug.internal.ui.sourcelookup.SourceLookupUIMessages;
import org.eclipse.debug.ui.DebugUITools;
import org.eclipse.jface.dialogs.Dialog;
import org.eclipse.jface.dialogs.IDialogConstants;
import org.eclipse.jface.dialogs.MessageDialog;
import org.eclipse.jface.resource.JFaceColors;
import org.eclipse.jface.window.Window;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Text;
import org.eclipse.ui.IEditorInput;
import org.eclipse.ui.IEditorPart;
import org.eclipse.ui.IEditorSite;
import org.eclipse.ui.IReusableEditor;
import org.eclipse.ui.IWorkbenchPage;
import org.eclipse.ui.IWorkbenchWindow;
import org.eclipse.ui.PartInitException;
import org.eclipse.ui.PlatformUI;
import org.eclipse.ui.part.EditorPart;

/**
 * Default editor displayed when source is not found. Displays a button to modify
 * the source lookup path.
 * <p>
 * This editor's id is <code>IDebugUIConstants.ID_COMMON_SOURCE_NOT_FOUND_EDITOR</code>
 * (value <code>org.eclipse.debug.ui.sourcelookup.CommonSourceNotFoundEditor</code>).
 * </p>
 * <p>
 * This class may be instantiated and subclassed.
 * </p>
 * @see AbstractSourceLookupDirector
 * @see CommonSourceNotFoundEditorInput
 * @since 3.2
 */
public class CommonSourceNotFoundEditor extends EditorPart implements IReusableEditor {

    /**
     * Text widgets used for this editor
     */
    private Text fText;

    /**
     * Launch listener to handle launch events, or <code>null</code> if none
     */
    private ILaunchesListener2 fLaunchesListener;

    /* (non-Javadoc)
     * @see org.eclipse.ui.part.EditorPart#doSave(org.eclipse.core.runtime.IProgressMonitor)
     */
    public void doSave(IProgressMonitor monitor) {
    }

    /* (non-Javadoc)
     * @see org.eclipse.ui.part.EditorPart#doSaveAs()
     */
    public void doSaveAs() {
    }

    /* (non-Javadoc)
     * @see org.eclipse.ui.part.EditorPart#init(org.eclipse.ui.IEditorSite, org.eclipse.ui.IEditorInput)
     */
    public void init(IEditorSite site, IEditorInput input) throws PartInitException {
        setSite(site);
        setInput(input);
        initialize();
    }

    /* (non-Javadoc)
     * @see org.eclipse.ui.part.EditorPart#isDirty()
     */
    public boolean isDirty() {
        return false;
    }

    /* (non-Javadoc)
     * @see org.eclipse.ui.part.EditorPart#isSaveAsAllowed()
     */
    public boolean isSaveAsAllowed() {
        return false;
    }

    /* (non-Javadoc)
     * @see org.eclipse.ui.part.WorkbenchPart#createPartControl(org.eclipse.swt.widgets.Composite)
     */
    public void createPartControl(Composite parent) {
        GridLayout topLayout = new GridLayout();
        GridData data = new GridData();
        topLayout.numColumns = 1;
        topLayout.verticalSpacing = 10;
        parent.setLayout(topLayout);
        parent.setLayoutData(data);
        parent.setBackground(parent.getDisplay().getSystemColor(SWT.COLOR_WHITE));

        fText = new Text(parent, SWT.READ_ONLY | SWT.WRAP);
        data = new GridData(GridData.FILL_HORIZONTAL);
        data.grabExcessHorizontalSpace = true;
        fText.setLayoutData(data);
        fText.setForeground(JFaceColors.getErrorText(fText.getDisplay()));
        fText.setBackground(parent.getDisplay().getSystemColor(SWT.COLOR_WHITE));
        if (getEditorInput() != null) {
            setInput(getEditorInput());
        }

        createButtons(parent);

        Dialog.applyDialogFont(parent);

        PlatformUI.getWorkbench().getHelpSystem().setHelp(parent, IDebugHelpContextIds.NO_SOURCE_EDITOR);
    }

    /**
     * Create buttons to be displayed in this editor
     * 
     * @param parent composite to create the buttons in.
     */
    protected void createButtons(Composite parent) {
        GridData data;
        Button button = new Button(parent, SWT.PUSH);
        data = new GridData();
        data.grabExcessHorizontalSpace = false;
        data.grabExcessVerticalSpace = false;
        button.setLayoutData(data);
        button.setText(SourceLookupUIMessages.addSourceLocation_addButton2);
        button.addSelectionListener(new SelectionAdapter() {
            public void widgetSelected(SelectionEvent evt) {
                editSourceLookupPath();
            }
        });
    }

    /**
     * Edits the source lookup path associated with the active debug context.
     * After the path is edited, source lookup is performed again and this
     * editor is closed.
     */
    protected void editSourceLookupPath() {
        ISourceLocator locator = null;
        ILaunch launch = null;
        IAdaptable selection = DebugUITools.getDebugContext();
        if (selection == null) {
            new MessageDialog(getSite().getShell(), SourceLookupUIMessages.CommonSourceNotFoundEditor_0, null,
                    SourceLookupUIMessages.CommonSourceNotFoundEditor_1, MessageDialog.INFORMATION,
                    new String[] { IDialogConstants.OK_LABEL }, 0).open();
            return;
        }
        if (selection.getAdapter(ILaunch.class) != null) {
            launch = (ILaunch) selection.getAdapter(ILaunch.class);
            locator = launch.getSourceLocator();
        } else if (selection.getAdapter(IDebugElement.class) != null) {
            launch = ((IDebugElement) selection.getAdapter(IDebugElement.class)).getLaunch();
            locator = launch.getSourceLocator();
        } else {
            return; //should not occur
        }
        if (locator == null || !(locator instanceof AbstractSourceLookupDirector)) {
            return;
        }
        final SourceLookupDialog dialog = new SourceLookupDialog(DebugUIPlugin.getShell(),
                (AbstractSourceLookupDirector) locator);
        if (dialog.open() == Window.OK) {
            IWorkbenchPage page = getEditorSite().getPage();
            SourceLookupManager.getDefault().displaySource(getArtifact(), page, true);
            closeEditor();
        }
    }

    /* (non-Javadoc)
     * @see org.eclipse.ui.part.WorkbenchPart#setFocus()
     */
    public void setFocus() {
        if (fText != null) {
            fText.setFocus();
        }
    }

    /* (non-Javadoc)
     * @see org.eclipse.ui.part.EditorPart#setInput(org.eclipse.ui.IEditorInput)
     */
    public void setInput(IEditorInput input) {
        super.setInput(input);
        setPartName(input.getName());
        if (fText != null) {
            fText.setText(getText());
        }
        firePropertyChange(PROP_INPUT);
    }

    /**
     * Return the text to be displayed in this editor. The text is reset each time
     * the editor input is set.
     * 
     * @return the text to be displayed in this editor
     */
    protected String getText() {
        return getEditorInput().getToolTipText() + "\n"; //$NON-NLS-1$
    }

    /**
     * Closes this editor.
     */
    protected void closeEditor() {
        final IEditorPart editor = this;
        DebugUIPlugin.getStandardDisplay().syncExec(new Runnable() {
            public void run() {
                IWorkbenchWindow activeWorkbenchWindow = DebugUIPlugin.getActiveWorkbenchWindow();
                if (activeWorkbenchWindow != null) {
                    IWorkbenchPage activePage = activeWorkbenchWindow.getActivePage();
                    if (activePage != null) {
                        activePage.closeEditor(editor, false);
                    }
                }
            }
        });
    }

    /*
     * (non-Javadoc)
     * 
     * @see org.eclipse.ui.IWorkbenchPart#dispose()
     */
    public void dispose() {
        if (fLaunchesListener != null)
            DebugPlugin.getDefault().getLaunchManager().removeLaunchListener(fLaunchesListener);
        super.dispose();
    }

    /**
     * Returns the artifact this editor was opened for (i.e. the artifact that source
     * was not found for), or <code>null</code>
     * 
     * @return artifact with associated source or <code>null</code>
     */
    protected Object getArtifact() {
        IEditorInput editorInput = getEditorInput();
        if (editorInput instanceof CommonSourceNotFoundEditorInput) {
            CommonSourceNotFoundEditorInput input = (CommonSourceNotFoundEditorInput) editorInput;
            return input.getArtifact();
        }
        return null;
    }

    /**
     * Initialize this editor.
     * Called after <code>init(IEditorSite, IEditorInput)</code>. By default, a launch
     * listener is added to close this editor when the associated launch terminates.
     * Subclasses may override.
     */
    protected void initialize() {
        fLaunchesListener = new ILaunchesListener2() {
            public void launchesTerminated(ILaunch[] launches) {
                Object artifact = getArtifact();
                if (artifact instanceof IDebugElement) {
                    IDebugElement element = (IDebugElement) artifact;
                    for (int i = 0; i < launches.length; i++) {
                        ILaunch launch = launches[i];
                        if (launch.equals(element.getLaunch())) {
                            closeEditor();
                            return;
                        }
                    }
                }
            }

            public void launchesRemoved(ILaunch[] launches) {
                launchesTerminated(launches);
            }

            public void launchesAdded(ILaunch[] launches) {
            }

            public void launchesChanged(ILaunch[] launches) {
            }
        };

        DebugPlugin.getDefault().getLaunchManager().addLaunchListener(fLaunchesListener);
    }
}