org.eclipse.pde.internal.ui.editor.feature.InfoSection.java Source code

Java tutorial

Introduction

Here is the source code for org.eclipse.pde.internal.ui.editor.feature.InfoSection.java

Source

/*******************************************************************************
 *  Copyright (c) 2000, 2014 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.pde.internal.ui.editor.feature;

import org.eclipse.core.runtime.CoreException;
import org.eclipse.jface.action.IMenuManager;
import org.eclipse.jface.resource.JFaceResources;
import org.eclipse.jface.text.*;
import org.eclipse.jface.text.source.SourceViewer;
import org.eclipse.jface.viewers.*;
import org.eclipse.pde.core.IEditable;
import org.eclipse.pde.core.IModelChangedEvent;
import org.eclipse.pde.internal.core.ifeature.*;
import org.eclipse.pde.internal.ui.*;
import org.eclipse.pde.internal.ui.editor.*;
import org.eclipse.pde.internal.ui.editor.context.XMLDocumentSetupParticpant;
import org.eclipse.pde.internal.ui.editor.text.IColorManager;
import org.eclipse.pde.internal.ui.editor.text.XMLConfiguration;
import org.eclipse.pde.internal.ui.elements.NamedElement;
import org.eclipse.pde.internal.ui.util.TextUtil;
import org.eclipse.swt.SWT;
import org.eclipse.swt.custom.*;
import org.eclipse.swt.dnd.Clipboard;
import org.eclipse.swt.events.*;
import org.eclipse.swt.graphics.Color;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.*;
import org.eclipse.ui.actions.ActionFactory;
import org.eclipse.ui.forms.IFormColors;
import org.eclipse.ui.forms.widgets.*;

public class InfoSection extends PDESection {
    private IDocument fDocument;

    private XMLConfiguration fSourceConfiguration;

    private SourceViewer fSourceViewer;

    private CTabFolder fTabFolder;

    private Text fUrlText;

    private Object fElement;

    private int fElementIndex;

    private boolean fIgnoreChange;

    private Composite fNotebook;

    private StackLayout fNotebookLayout;

    private Control fInfoPage;

    private Control fUrlsPage;

    private Control fLicensePage;

    public InfoSection(PDEFormPage page, Composite parent, IColorManager colorManager) {
        super(page, parent, Section.DESCRIPTION | ExpandableComposite.NO_TITLE, false);
        String description = PDEUIMessages.FeatureEditor_InfoSection_desc;
        getSection().setDescription(description);
        fSourceConfiguration = new XMLConfiguration(colorManager);
        fDocument = new Document();
        new XMLDocumentSetupParticpant().setup(fDocument);
        createClient(getSection(), page.getManagedForm().getToolkit());
    }

    public void commit(boolean onSave) {
        handleApply();
        super.commit(onSave);
    }

    public void createClient(Section section, FormToolkit toolkit) {

        section.setLayout(FormLayoutFactory.createClearGridLayout(false, 1));
        GridData data = new GridData(GridData.FILL_BOTH);
        section.setLayoutData(data);

        Composite container = toolkit.createComposite(section);
        container.setLayout(FormLayoutFactory.createSectionClientGridLayout(false, 2));
        container.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));

        GridData gd;

        toolkit.createLabel(container, null);
        fTabFolder = new CTabFolder(container, SWT.FLAT | SWT.TOP);
        toolkit.adapt(fTabFolder, true, true);
        gd = new GridData(GridData.HORIZONTAL_ALIGN_FILL);
        fTabFolder.setLayoutData(gd);
        gd.heightHint = 2;
        toolkit.getColors().initializeSectionToolBarColors();
        Color selectedColor = toolkit.getColors().getColor(IFormColors.TB_BG);
        fTabFolder.setSelectionBackground(new Color[] { selectedColor, toolkit.getColors().getBackground() },
                new int[] { 100 }, true);

        fTabFolder.addSelectionListener(new SelectionAdapter() {
            public void widgetSelected(SelectionEvent e) {
                updateTabSelection();
            }
        });

        fNotebook = toolkit.createComposite(container);
        gd = new GridData(GridData.FILL_BOTH);
        gd.horizontalSpan = 2;
        fNotebook.setLayoutData(gd);
        fNotebookLayout = new StackLayout();
        fNotebook.setLayout(fNotebookLayout);

        fInfoPage = createInfoPage(toolkit, fNotebook);
        fLicensePage = createLicensePage(toolkit, fNotebook);
        fUrlsPage = createUrlsPage(toolkit, fNotebook);
        fNotebookLayout.topControl = fInfoPage;

        createTabs();
        section.setClient(container);
        initialize();
        if (fTabFolder.getItemCount() > 0) {
            fTabFolder.setSelection(0);
            updateTabSelection();
        }
    }

    private Control createLicensePage(FormToolkit toolkit, Composite parent) {
        Composite page = toolkit.createComposite(parent);
        GridLayout layout = new GridLayout();
        layout.numColumns = 2;
        layout.marginWidth = 2;
        layout.marginHeight = 0;
        layout.verticalSpacing = 8;
        layout.marginTop = 0;
        page.setLayout(layout);

        LicenseFeatureSection licenseSection = new LicenseFeatureSection(getPage(), page, fSourceConfiguration);
        licenseSection.getSection()
                .setLayoutData(new GridData(GridData.FILL_BOTH | GridData.VERTICAL_ALIGN_BEGINNING));

        getManagedForm().addPart(licenseSection);
        return page;
    }

    /**
     * @param toolkit
     * @param parent
     */
    private Control createInfoPage(FormToolkit toolkit, Composite parent) {
        Composite page = toolkit.createComposite(parent);
        GridLayout layout = new GridLayout();
        layout.numColumns = 2;
        layout.marginWidth = 2;
        layout.marginHeight = 5;
        layout.verticalSpacing = 8;
        page.setLayout(layout);

        GridData gd;
        Label label = toolkit.createLabel(page, PDEUIMessages.FeatureEditor_InfoSection_url);
        label.setForeground(toolkit.getColors().getColor(IFormColors.TITLE));
        fUrlText = toolkit.createText(page, null, SWT.SINGLE);
        fUrlText.addModifyListener(new ModifyListener() {
            public void modifyText(ModifyEvent e) {
                infoModified();
            }
        });
        gd = new GridData(GridData.FILL_HORIZONTAL);
        fUrlText.setLayoutData(gd);
        label = toolkit.createLabel(page, PDEUIMessages.FeatureEditor_InfoSection_text);
        label.setForeground(toolkit.getColors().getColor(IFormColors.TITLE));
        gd = new GridData(GridData.VERTICAL_ALIGN_BEGINNING);
        label.setLayoutData(gd);
        int styles = SWT.MULTI | SWT.WRAP | SWT.V_SCROLL | SWT.H_SCROLL;
        fSourceViewer = new SourceViewer(page, null, styles);
        fSourceViewer.configure(fSourceConfiguration);
        fSourceViewer.setDocument(fDocument);
        fSourceViewer.addSelectionChangedListener(new ISelectionChangedListener() {
            public void selectionChanged(SelectionChangedEvent event) {
                updateSelection(event.getSelection());
            }
        });
        StyledText styledText = fSourceViewer.getTextWidget();
        styledText.setFont(JFaceResources.getTextFont());
        styledText.setMenu(getPage().getPDEEditor().getContextMenu());
        styledText.setData(FormToolkit.KEY_DRAW_BORDER, FormToolkit.TEXT_BORDER);
        //
        if (SWT.getPlatform().equals("motif") == false) //$NON-NLS-1$
            toolkit.paintBordersFor(page);
        Control[] children = page.getChildren();
        Control control = children[children.length - 1];
        gd = new GridData(GridData.FILL_BOTH | GridData.GRAB_HORIZONTAL | GridData.GRAB_VERTICAL);
        gd.widthHint = 50;
        gd.heightHint = 50;
        control.setLayoutData(gd);

        return page;
    }

    /**
     * @param toolkit
     * @param parent
     */
    private Control createUrlsPage(FormToolkit toolkit, Composite parent) {
        Composite page = toolkit.createComposite(parent);
        GridLayout layout = new GridLayout();
        layout.numColumns = 2;
        layout.makeColumnsEqualWidth = true;
        layout.marginWidth = 2;
        layout.marginHeight = 5;
        layout.verticalSpacing = 8;
        page.setLayout(layout);

        URLSection urlSection = new URLSection(getPage(), page);
        urlSection.getSection().setLayoutData(new GridData(GridData.FILL_BOTH | GridData.VERTICAL_ALIGN_BEGINNING));

        URLDetailsSection urlDetailsSection = new URLDetailsSection(getPage(), page);
        urlDetailsSection.getSection()
                .setLayoutData(new GridData(GridData.FILL_HORIZONTAL | GridData.VERTICAL_ALIGN_BEGINNING));

        getManagedForm().addPart(urlSection);
        getManagedForm().addPart(urlDetailsSection);
        return page;
    }

    private void updateSelection(ISelection selection) {
        getPage().getPDEEditor().setSelection(selection);
    }

    public boolean doGlobalAction(String actionId) {
        if (actionId.equals(ActionFactory.CUT.getId())) {
            fSourceViewer.doOperation(ITextOperationTarget.CUT);
            return true;
        } else if (actionId.equals(ActionFactory.COPY.getId())) {
            fSourceViewer.doOperation(ITextOperationTarget.COPY);
            return true;
        } else if (actionId.equals(ActionFactory.PASTE.getId())) {
            fSourceViewer.doOperation(ITextOperationTarget.PASTE);
            return true;
        } else if (actionId.equals(ActionFactory.DELETE.getId())) {
            fSourceViewer.doOperation(ITextOperationTarget.DELETE);
            return true;
        } else if (actionId.equals(ActionFactory.UNDO.getId())) {
            fSourceViewer.doOperation(ITextOperationTarget.UNDO);
            return true;
        } else if (actionId.equals(ActionFactory.REDO.getId())) {
            fSourceViewer.doOperation(ITextOperationTarget.REDO);
            return true;
        } else if (actionId.equals(ActionFactory.SELECT_ALL.getId())) {
            fSourceViewer.doOperation(ITextOperationTarget.SELECT_ALL);
        }
        return false;
    }

    public boolean setFormInput(Object input) {
        if (input instanceof IFeatureInfo) {
            IFeatureInfo info = (IFeatureInfo) input;
            int index = info.getIndex();
            if (index != -1)
                fTabFolder.setSelection(index);
            updateEditorInput(input, false);
            return true;
        }
        if (input instanceof IFeatureURLElement || input instanceof NamedElement) {
            fTabFolder.setSelection(3);
            updateEditorInput(input, false);
            return true;
        }
        return false;
    }

    private void handleApply() {
        if (0 <= fElementIndex && fElementIndex < 2 && fElement != null) {
            handleApply((IFeatureInfo) fElement, fTabFolder.getSelectionIndex());
        } else {
            handleApply(null, fTabFolder.getSelectionIndex());
        }
    }

    private void handleApply(IFeatureInfo info, int index) {
        if (index >= 2)
            return;
        String urlName = fUrlText.getText();
        String text = fDocument.get();
        applyInfoText(info, urlName, text, index);
        updateTabImage(fTabFolder.getSelection());
    }

    private void applyInfoText(IFeatureInfo targetInfo, String urlText, String text, int index) {
        String url = null;

        if (urlText.length() > 0) {
            url = urlText;
        }
        try {
            IFeatureModel model = (IFeatureModel) getPage().getModel();
            IFeature feature = model.getFeature();

            if (targetInfo == null)
                targetInfo = feature.getFeatureInfo(index);

            if (targetInfo == null) {
                targetInfo = model.getFactory().createInfo(index);
                feature.setFeatureInfo(targetInfo, index);
            }
            targetInfo.setURL(url);
            targetInfo.setDescription(text);
        } catch (CoreException e) {
            // TODO: This should probably at least be logged
        }
    }

    protected void fillContextMenu(IMenuManager manager) {
        getPage().getPDEEditor().getContributor().contextMenuAboutToShow(manager);
    }

    public void initialize() {
        IFeatureModel featureModel = (IFeatureModel) getPage().getModel();
        fDocument.addDocumentListener(new IDocumentListener() {
            public void documentChanged(DocumentEvent e) {
                infoModified();
            }

            public void documentAboutToBeChanged(DocumentEvent e) {
            }
        });
        fUrlText.setEditable(featureModel.isEditable());
        fSourceViewer.getTextWidget().setEditable(featureModel.isEditable());
        featureModel.addModelChangedListener(this);
        updateEditorInput(featureModel.getFeature().getFeatureInfo(0), false);
    }

    /* (non-Javadoc)
     * @see org.eclipse.ui.forms.AbstractFormPart#dispose()
     */
    public void dispose() {
        // Dispose of the source configuration
        if (fSourceConfiguration != null) {
            fSourceConfiguration.dispose();
        }
        IFeatureModel featureModel = (IFeatureModel) getPage().getModel();
        if (featureModel != null)
            featureModel.removeModelChangedListener(this);
        super.dispose();
    }

    private void infoModified() {
        IFeatureModel featureModel = (IFeatureModel) getPage().getModel();
        if (!fIgnoreChange && featureModel instanceof IEditable) {
            markDirty();
        }
    }

    public void modelChanged(IModelChangedEvent e) {
        if (e.getChangeType() == IModelChangedEvent.WORLD_CHANGED) {
            markStale();
        }
    }

    public void refresh() {
        IFeatureModel model = (IFeatureModel) getPage().getModel();
        int index = fTabFolder.getSelectionIndex();
        if (index < 3) {
            IFeatureInfo info = model.getFeature().getFeatureInfo(index);
            fElement = null;
            fElementIndex = -1;
            updateEditorInput(info, false);
        }
        super.refresh();
    }

    private void createTabs() {
        IFeatureModel model = (IFeatureModel) getPage().getModel();
        IFeature feature = model.getFeature();
        addTab(PDEUIMessages.FeatureEditor_info_description, feature.getFeatureInfo(0));
        addTab(PDEUIMessages.FeatureEditor_info_copyright, feature.getFeatureInfo(1));
        addTab(PDEUIMessages.FeatureEditor_info_license, feature.getFeatureInfo(2));
        addTab(PDEUIMessages.FeatureEditor_info_discoveryUrls, null);
    }

    private void addTab(String label, IFeatureInfo info) {
        CTabItem item = new CTabItem(fTabFolder, SWT.NULL);
        item.setText(label);
        item.setData(info);
        updateTabImage(item);
    }

    private void updateTabImage(CTabItem item) {
        if (item == null)
            return;
        Object info = item.getData();
        if (info != null) {
            item.setImage(PDEPlugin.getDefault().getLabelProvider().getImage(info));
        } else {
            item.setImage(PDEPlugin.getDefault().getLabelProvider().get(PDEPluginImages.DESC_DOC_SECTION_OBJ));
        }
    }

    private void updateTabSelection() {
        IFeatureModel model = (IFeatureModel) getPage().getModel();
        IFeature feature = model.getFeature();
        int index = fTabFolder.getSelectionIndex();
        if (index < 3) {
            IFeatureInfo info = feature.getFeatureInfo(index);
            updateEditorInput(info, true);
        }

        // TODO: Why is this code in both updateEditorInput and updateTabSelection?
        Control oldPage = fNotebookLayout.topControl;
        switch (index) {
        case 0:
        case 1:
            fNotebookLayout.topControl = fInfoPage;
            break;
        case 2:
            fNotebookLayout.topControl = fLicensePage;
            break;
        case 3:
            fNotebookLayout.topControl = fUrlsPage;
            break;
        }
        if (oldPage != fNotebookLayout.topControl)
            fNotebook.layout();
    }

    public void setFocus() {
        fSourceViewer.getTextWidget().setFocus();
        updateSelection(fSourceViewer.getSelection());
    }

    private void commitPrevious() {
        IFeatureInfo previous = (IFeatureInfo) fElement;
        handleApply(previous, fElementIndex);
    }

    public void updateEditorInput(Object input, boolean commitPrevious) {
        if (isDirty() && commitPrevious /*
                                        * && element != null && element !=
                                        * input
                                        */) {
            commitPrevious();
        }
        fIgnoreChange = true;
        String text = ""; //$NON-NLS-1$
        String url = null;
        if (input instanceof IFeatureInfo) {
            IFeatureInfo info = (IFeatureInfo) input;
            text = info.getDescription();
            url = info.getURL();
        }
        if (text == null)
            text = ""; //$NON-NLS-1$
        else
            text = TextUtil.createMultiLine(text, 60, false);
        fDocument.set(text);
        if (url == null)
            fUrlText.setText(""); //$NON-NLS-1$
        else
            fUrlText.setText(url.toString());
        fElement = input;
        fElementIndex = fTabFolder.getSelectionIndex();

        Control oldPage = fNotebookLayout.topControl;
        switch (fElementIndex) {
        case 0:
        case 1:
            fNotebookLayout.topControl = fInfoPage;
            break;
        case 2:
            fNotebookLayout.topControl = fLicensePage;
            break;
        case 3:
            fNotebookLayout.topControl = fUrlsPage;
            break;
        }
        if (oldPage != fNotebookLayout.topControl)
            fNotebook.layout();

        fIgnoreChange = false;
    }

    public boolean canPaste(Clipboard clipboard) {
        return fSourceViewer.canDoOperation(ITextOperationTarget.PASTE);
    }
}