com.nokia.carbide.cdt.internal.builder.ui.PathsAndSymbolsTabComposite.java Source code

Java tutorial

Introduction

Here is the source code for com.nokia.carbide.cdt.internal.builder.ui.PathsAndSymbolsTabComposite.java

Source

/*
* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
* All rights reserved.
* This component and the accompanying materials are made available
* under the terms of the License "Eclipse Public License v1.0"
* which accompanies this distribution, and is available
* at the URL "http://www.eclipse.org/legal/epl-v10.html".
*
* Initial Contributors:
* Nokia Corporation - initial contribution.
*
* Contributors:
*
* Description: 
*
*/
package com.nokia.carbide.cdt.internal.builder.ui;

import java.io.File;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;

import org.eclipse.cdt.core.model.CoreModel;
import org.eclipse.cdt.core.settings.model.CMacroEntry;
import org.eclipse.cdt.core.settings.model.ICConfigurationDescription;
import org.eclipse.cdt.core.settings.model.ICIncludePathEntry;
import org.eclipse.cdt.core.settings.model.ICLanguageSettingEntry;
import org.eclipse.cdt.core.settings.model.ICMacroEntry;
import org.eclipse.cdt.core.settings.model.ICProjectDescription;
import org.eclipse.cdt.core.settings.model.extension.CConfigurationData;
import org.eclipse.cdt.core.settings.model.extension.CFolderData;
import org.eclipse.cdt.core.settings.model.extension.CLanguageData;
import org.eclipse.jface.viewers.AbstractTreeViewer;
import org.eclipse.jface.viewers.ITreeContentProvider;
import org.eclipse.jface.viewers.LabelProvider;
import org.eclipse.jface.viewers.TreeViewer;
import org.eclipse.jface.viewers.Viewer;
import org.eclipse.swt.SWT;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.TabItem;
import org.eclipse.swt.widgets.Tree;

import com.nokia.carbide.cdt.builder.CarbideBuilderPlugin;
import com.nokia.carbide.cdt.builder.DefaultIncludeFileLocator;
import com.nokia.carbide.cdt.builder.project.ICarbideBuildConfiguration;
import com.nokia.carbide.cdt.internal.builder.CarbideProjectInfo;
import com.nokia.carbide.cpp.epoc.engine.preprocessor.DefaultModelDocumentProvider;
import com.nokia.carbide.cpp.epoc.engine.preprocessor.DefaultTranslationUnitProvider;
import com.nokia.carbide.cpp.epoc.engine.preprocessor.IDefine;
import com.nokia.carbide.cpp.sdk.core.ISymbianSDK;
import com.nokia.carbide.internal.api.cpp.epoc.engine.preprocessor.MacroScanner;

/**
 * Paths and Symbols tab for the Carbide Build Configurations page
 *
 */
public class PathsAndSymbolsTabComposite extends Composite {

    private static TreeViewer treeViewer;
    private ICarbideBuildConfiguration buildConfig;

    private class IncludePathsContainer {

        private CLanguageData languageData;

        IncludePathsContainer(CLanguageData languageData) {
            this.languageData = languageData;
        }

        @Override
        public String toString() {
            return Messages.getString("PathsAndSymbolsTab.IncludesContainerName"); //$NON-NLS-1$;
        }

        Object[] getChildren() {
            return languageData.getEntries(ICLanguageSettingEntry.INCLUDE_PATH);
        }

        Object getParent() {
            return languageData;
        }
    }

    private class SymbolsContainer {
        private CLanguageData languageData;

        SymbolsContainer(CLanguageData languageData) {
            this.languageData = languageData;
        }

        @Override
        public String toString() {
            return Messages.getString("PathsAndSymbolsTab.SymbolsContainerName"); //$NON-NLS-1$;
        }

        Object[] getChildren() {
            List<ICLanguageSettingEntry> macroEntries = new ArrayList<ICLanguageSettingEntry>();
            macroEntries.addAll(Arrays.asList(languageData.getEntries(ICLanguageSettingEntry.MACRO)));
            Collections.sort(macroEntries, new Comparator<ICLanguageSettingEntry>() {

                public int compare(ICLanguageSettingEntry arg0, ICLanguageSettingEntry arg1) {
                    return arg0.getName().compareTo(arg1.getName());
                }

            });

            // add the macros from the macro file if any
            CarbideProjectInfo cpi = (CarbideProjectInfo) buildConfig.getCarbideProject();
            String macrosFile = cpi.getMacrosFile();
            if (macrosFile != null && macrosFile.length() > 0) {
                MacroScanner scanner = new MacroScanner(
                        new DefaultIncludeFileLocator(buildConfig.getCarbideProject().getProject(),
                                buildConfig.getBuildContext()),
                        DefaultModelDocumentProvider.getInstance(), DefaultTranslationUnitProvider.getInstance());
                scanner.scanFile(new File(macrosFile));
                for (IDefine define : scanner.getMacroDefinitions()) {
                    macroEntries.add(new CMacroEntry(define.getNameAndArguments(), define.getExpansion(), 0));
                }
            }

            return macroEntries.toArray();
        }

        Object getParent() {
            return languageData;
        }
    }

    private class PathsAndSymbolsContentProvider implements ITreeContentProvider {

        private IncludePathsContainer includesContainer;
        private SymbolsContainer symbolsContainer;

        public Object[] getChildren(Object parentElement) {

            if (parentElement instanceof CLanguageData) {
                return new Object[] { includesContainer, symbolsContainer };
            } else if (parentElement instanceof IncludePathsContainer) {
                return ((IncludePathsContainer) parentElement).getChildren();
            } else if (parentElement instanceof SymbolsContainer) {
                return ((SymbolsContainer) parentElement).getChildren();
            }
            return null;
        }

        public Object getParent(Object element) {
            if (element instanceof IncludePathsContainer) {
                return ((IncludePathsContainer) element).getParent();
            } else if (element instanceof SymbolsContainer) {
                return ((SymbolsContainer) element).getParent();
            } else if (element instanceof ICIncludePathEntry) {
                return includesContainer;
            } else if (element instanceof ICMacroEntry) {
                return symbolsContainer;
            }
            return null;
        }

        public boolean hasChildren(Object element) {
            Object[] children = getChildren(element);
            if (children != null && children.length > 0) {
                return true;
            }
            return false;
        }

        public Object[] getElements(Object inputElement) {
            return getChildren(inputElement);
        }

        public void dispose() {
        }

        public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
            if (newInput instanceof CLanguageData) {
                CLanguageData languageData = (CLanguageData) newInput;
                includesContainer = new IncludePathsContainer(languageData);
                symbolsContainer = new SymbolsContainer(languageData);
            }
        }
    }

    private class PathsAndSymbolsLabelProvider extends LabelProvider {

        Image includePathsContainerImage = CarbideBuilderPlugin.getImageDescriptor("/icons/wsp_includefolder.gif")
                .createImage();
        Image symbolsContainerImage = CarbideBuilderPlugin.getImageDescriptor("/icons/define_obj.gif")
                .createImage();
        Image includePathEntryImage = CarbideBuilderPlugin.getImageDescriptor("/icons/includes_container.gif")
                .createImage();

        @Override
        public Image getImage(Object element) {
            if (element instanceof IncludePathsContainer) {
                return includePathsContainerImage;
            } else if (element instanceof ICIncludePathEntry) {
                return includePathEntryImage;
            } else if (element instanceof SymbolsContainer || element instanceof ICMacroEntry) {
                return symbolsContainerImage;
            }
            return super.getImage(element);
        }

        @Override
        public String getText(Object element) {
            if (element instanceof ICIncludePathEntry) {
                ICIncludePathEntry incEntry = (ICIncludePathEntry) element;
                String text = incEntry.getLocation().toOSString();
                if (!incEntry.isLocal()) {
                    text = text + " [System]"; //$NON-NLS-1$;
                }
                return text;
            } else if (element instanceof ICMacroEntry) {
                ICMacroEntry macroEntry = (ICMacroEntry) element;
                String text = macroEntry.getName();
                String value = macroEntry.getValue();
                if (value.length() > 0) {
                    text = text + " = " + value; //$NON-NLS-1$;
                }

                return text;
            }
            return super.getText(element);
        }

    }

    public PathsAndSymbolsTabComposite(TabItem tabItem) {
        super(tabItem.getParent(), SWT.NONE);
    }

    public void createControls() {
        setLayout(new GridLayout());

        Label bldMakeBldfilesLabel = new Label(this, SWT.NONE);
        bldMakeBldfilesLabel.setText(Messages.getString("PathsAndSymbolsTab.DescriptionLabel")); //$NON-NLS-1$
        bldMakeBldfilesLabel.setToolTipText(Messages.getString("PathsAndSymbolsTab.DescriptionToolTip")); //$NON-NLS-1$

        treeViewer = new TreeViewer(this);
        treeViewer.setAutoExpandLevel(AbstractTreeViewer.ALL_LEVELS);
        treeViewer.setLabelProvider(new PathsAndSymbolsLabelProvider());
        treeViewer.setContentProvider(new PathsAndSymbolsContentProvider());

        Tree tree = treeViewer.getTree();
        tree.setToolTipText(Messages.getString("PathsAndSymbolsTab.DescriptionToolTip")); //$NON-NLS-1$
        tree.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
    }

    public void initData(ICarbideBuildConfiguration buildConfig) {
        this.buildConfig = buildConfig;

        ICProjectDescription projDes = CoreModel.getDefault()
                .getProjectDescription(buildConfig.getCarbideProject().getProject());
        if (projDes != null) {
            ICConfigurationDescription configDes = projDes
                    .getConfigurationById(buildConfig.getBuildContext().getConfigurationID());
            if (configDes != null) {
                CConfigurationData configData = configDes.getConfigurationData();
                if (configData != null) {
                    CFolderData rootFolderData = configData.getRootFolderData();
                    if (rootFolderData != null) {
                        CLanguageData[] languageDatas = rootFolderData.getLanguageDatas();
                        if (languageDatas != null && languageDatas.length > 0) {
                            // there's only one for Carbide anyway
                            CLanguageData languageData = languageDatas[0];
                            treeViewer.setInput(languageData);
                        }
                    }
                }
            }
        }
    }

    public boolean compareConfigurationSettings(ICarbideBuildConfiguration selectedConfig, boolean writeToConfig) {
        // read only tab so no settings will ever change
        return true;
    }

    public void performDefaults(ISymbianSDK sdk) {
    }

    public static void refresh() {
        if (treeViewer != null && !treeViewer.getTree().isDisposed()) {
            treeViewer.refresh();
        }
    }
}