com.nokia.carbide.cpp.internal.project.ui.mmpEditor.CompilerSectionPart.java Source code

Java tutorial

Introduction

Here is the source code for com.nokia.carbide.cpp.internal.project.ui.mmpEditor.CompilerSectionPart.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.cpp.internal.project.ui.mmpEditor;

import java.text.MessageFormat;
import java.util.Map;
import java.util.Map.Entry;

import org.eclipse.jface.viewers.AbstractTreeViewer;
import org.eclipse.jface.viewers.DoubleClickEvent;
import org.eclipse.jface.viewers.IDoubleClickListener;
import org.eclipse.jface.viewers.ISelection;
import org.eclipse.jface.viewers.ISelectionChangedListener;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.jface.viewers.LabelProvider;
import org.eclipse.jface.viewers.SelectionChangedEvent;
import org.eclipse.jface.viewers.TreeViewer;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.KeyAdapter;
import org.eclipse.swt.events.KeyEvent;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.layout.FormAttachment;
import org.eclipse.swt.layout.FormData;
import org.eclipse.swt.layout.FormLayout;
import org.eclipse.swt.layout.RowLayout;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Tree;
import org.eclipse.ui.forms.SectionPart;
import org.eclipse.ui.forms.widgets.FormToolkit;
import org.eclipse.ui.forms.widgets.Section;

import com.nokia.carbide.cpp.epoc.engine.model.mmp.EMMPStatement;
import com.nokia.carbide.cpp.internal.project.ui.editors.common.ControlManager;
import com.nokia.carbide.cpp.internal.project.ui.mmpEditor.CompilerPresentationModel.IncludesContainer;
import com.nokia.carbide.cpp.internal.project.ui.mmpEditor.TreePresentationModel.ITreeNode;
import com.nokia.carbide.cpp.ui.CarbideUIPlugin;
import com.nokia.carbide.cpp.ui.ICarbideSharedImages;
import com.nokia.cpp.internal.api.utils.ui.editor.FormEditorEditingContext;

public class CompilerSectionPart extends SectionPart {

    private final MMPEditorContext editorContext;
    private final ControlManager controlManager;
    private final CompilerPresentationModel model;
    private TreeViewer compilerTreeViewer;
    private Button editButton;
    private Button addButton;
    private Button removeButton;
    private Button upButton;
    private Button downButton;
    private Button srcdebugButton;
    private Button strictDependenciesButton;

    class TreeLabelProvider extends LabelProvider {

        ICarbideSharedImages sharedImages = CarbideUIPlugin.getSharedImages();

        public String getText(Object element) {
            String result = ""; //$NON-NLS-1$
            if (element instanceof TreePresentationModel.ITreeNode) {
                TreePresentationModel.ITreeNode container = (ITreeNode) element;
                result = container.getDisplayName();
            } else if (element instanceof Map.Entry) {
                Map.Entry entry = (Entry) element;
                String fmt = Messages.CompilerSectionPart_compilerOptionsFormat;
                Object params[] = { entry.getKey(), entry.getValue() };
                result = MessageFormat.format(fmt, params);
            } else if (element != null) {
                result = element.toString();
            }
            return result;
        }

        public Image getImage(Object element) {
            Image result = null;
            if (element instanceof TreePresentationModel.ITreeNode) {
                TreePresentationModel.ITreeNode node = (ITreeNode) element;
                String key = node.getImageKey();
                if (key != null) {
                    result = sharedImages.getImage(key);
                }
            }
            return result;

        }
    }

    /**
     * Create the SectionPart
     * @param parent
     * @param toolkit
     * @param style
     */
    public CompilerSectionPart(Composite parent, FormToolkit toolkit, int style, MMPEditorContext editorContext,
            ControlManager controlManager) {
        super(parent, toolkit, style);
        this.editorContext = editorContext;
        this.controlManager = controlManager;
        model = new CompilerPresentationModel(editorContext);
        createClient(getSection(), toolkit);
    }

    /**
     * Fill the section
     */
    private void createClient(Section section, FormToolkit toolkit) {
        section.setText(Messages.CompilerSectionPart_sectionLabel);
        Composite container = toolkit.createComposite(section);
        toolkit.paintBordersFor(container);
        final FormLayout formLayout = new FormLayout();
        formLayout.marginHeight = 2;
        formLayout.marginWidth = 2;
        container.setLayout(formLayout);
        //
        section.setClient(container);

        compilerTreeViewer = new TreeViewer(container, SWT.NONE);
        compilerTreeViewer.setAutoExpandLevel(AbstractTreeViewer.ALL_LEVELS);
        compilerTreeViewer.setLabelProvider(new TreeLabelProvider());
        compilerTreeViewer.setContentProvider(model);
        compilerTreeViewer.setInput(model.getRoot());
        Tree tree = compilerTreeViewer.getTree();
        final FormData formData = new FormData();
        formData.top = new FormAttachment(0, 10);
        formData.right = new FormAttachment(0, 203);
        formData.left = new FormAttachment(0, 10);
        tree.setLayoutData(formData);
        toolkit.adapt(tree, true, true);

        compilerTreeViewer.addSelectionChangedListener(new ISelectionChangedListener() {
            public void selectionChanged(SelectionChangedEvent event) {
                updateButtons();
            }
        });
        compilerTreeViewer.addDoubleClickListener(new IDoubleClickListener() {
            public void doubleClick(DoubleClickEvent event) {
                viewerDoubleClicked();
            }
        });
        tree.addKeyListener(new KeyAdapter() {
            public void keyPressed(KeyEvent e) {
                if (e.character == SWT.DEL) {
                    doRemove();
                }
            }
        });

        final Composite compilerButtonComposite = toolkit.createComposite(container, SWT.NONE);
        final RowLayout rowLayout = new RowLayout(SWT.VERTICAL);
        rowLayout.fill = true;
        rowLayout.wrap = false;
        rowLayout.marginTop = 0;
        compilerButtonComposite.setLayout(rowLayout);
        final FormData formData_1 = new FormData();
        formData_1.bottom = new FormAttachment(0, 150);
        formData_1.left = new FormAttachment(tree, 7, SWT.DEFAULT);
        formData_1.top = new FormAttachment(0, 10);
        compilerButtonComposite.setLayoutData(formData_1);
        toolkit.paintBordersFor(compilerButtonComposite);

        addButton = toolkit.createButton(compilerButtonComposite, Messages.CompilerSectionPart_addBtn, SWT.NONE);
        addButton.addSelectionListener(new SelectionAdapter() {
            public void widgetSelected(SelectionEvent e) {
                doAdd();
            }
        });

        editButton = toolkit.createButton(compilerButtonComposite, Messages.CompilerSectionPart_editBtn, SWT.NONE);
        editButton.addSelectionListener(new SelectionAdapter() {
            public void widgetSelected(SelectionEvent e) {
                doEdit();
            }
        });

        removeButton = toolkit.createButton(compilerButtonComposite, Messages.CompilerSectionPart_removeBtn,
                SWT.NONE);
        removeButton.addSelectionListener(new SelectionAdapter() {
            public void widgetSelected(SelectionEvent e) {
                doRemove();
            }
        });

        upButton = toolkit.createButton(compilerButtonComposite, Messages.CompilerSectionPart_upButton, SWT.NONE);
        upButton.addSelectionListener(new SelectionAdapter() {
            public void widgetSelected(SelectionEvent e) {
                doUp();
            }
        });

        downButton = toolkit.createButton(compilerButtonComposite, Messages.CompilerSectionPart_downButton,
                SWT.NONE);
        downButton.addSelectionListener(new SelectionAdapter() {
            public void widgetSelected(SelectionEvent e) {
                doDown();
            }
        });

        strictDependenciesButton = toolkit.createButton(container,
                Messages.CompilerSectionPart_perVariantIncludeDependenciesBtn, SWT.CHECK);
        strictDependenciesButton.setToolTipText(Messages.CompilerSectionPart_strictDependenciesTooltip);
        formData.bottom = new FormAttachment(strictDependenciesButton, -5, SWT.TOP);
        final FormData formData_2 = new FormData();
        formData_2.top = new FormAttachment(0, 239);
        formData_2.bottom = new FormAttachment(0, 255);
        formData_2.left = new FormAttachment(tree, 0, SWT.LEFT);
        strictDependenciesButton.setLayoutData(formData_2);

        srcdebugButton = toolkit.createButton(container, Messages.CompilerSectionPart_disableOptsButton, SWT.CHECK);
        srcdebugButton.setToolTipText(Messages.CompilerSectionPart_srcdebugTooltip);
        final FormData formData_3 = new FormData();
        formData_3.top = new FormAttachment(0, 260);
        formData_3.left = new FormAttachment(tree, 0, SWT.LEFT);
        srcdebugButton.setLayoutData(formData_3);

        compilerTreeViewer.expandAll();

        hookControls();
        refresh();
    }

    protected void viewerDoubleClicked() {
        Object selection = getViewerSelection();
        if (selection != null) {
            Object parent = model.getParent(selection);
            if (parent instanceof ITreeNode) {
                ITreeNode container = (ITreeNode) parent;
                container.doEdit(selection);
            }
        }
    }

    protected Object getViewerSelection() {
        // the tree view is set to single selection
        Object result = null;
        ISelection selection = compilerTreeViewer.getSelection();
        if (selection instanceof IStructuredSelection) {
            IStructuredSelection ss = (IStructuredSelection) selection;
            result = ss.getFirstElement();
        }
        return result;
    }

    protected void updateButtons() {
        boolean addEnabled = false;
        boolean editEnabled = false;
        boolean removeEnabled = false;
        boolean upEnabled = false;
        boolean downEnabled = false;
        Object selection = getViewerSelection();
        ITreeNode container = getSelectedContainer();
        if (selection != null) {
            addEnabled = container != null && container.canAdd();
            removeEnabled = container != null && container.canRemove(selection);
            editEnabled = container != null && container.canEdit(selection);
            if (container instanceof CompilerPresentationModel.IncludesContainer) {
                CompilerPresentationModel.IncludesContainer ic = (IncludesContainer) container;
                upEnabled = ic.canMoveUp(selection);
                downEnabled = ic.canMoveDown(selection);
            }
        }

        addButton.setEnabled(addEnabled);
        editButton.setEnabled(editEnabled);
        removeButton.setEnabled(removeEnabled);
        upButton.setEnabled(upEnabled);
        downButton.setEnabled(downEnabled);
    }

    private void hookControls() {
        controlManager.add(new CompilerTreeViewerHandler(model, compilerTreeViewer));
        controlManager.add(new FlagSettingHandler(srcdebugButton,
                new FormEditorEditingContext(editorContext.editor, srcdebugButton), EMMPStatement.SRCDBG,
                editorContext));
        controlManager.add(new FlagSettingHandler(strictDependenciesButton,
                new FormEditorEditingContext(editorContext.editor, strictDependenciesButton),
                EMMPStatement.STRICTDEPEND, editorContext));
    }

    @Override
    public void refresh() {
        super.refresh();
        updateButtons();
    }

    TreePresentationModel.ITreeNode getSelectedContainer() {
        TreePresentationModel.ITreeNode result = null;
        Object selection = getViewerSelection();
        if (selection instanceof TreePresentationModel.ITreeNode) {
            result = (ITreeNode) selection;
        } else if (selection != null) {
            Object parent = model.getParent(selection);
            if (parent instanceof TreePresentationModel.ITreeNode) {
                result = (ITreeNode) parent;
            }
        }
        return result;
    }

    private void doAdd() {
        TreePresentationModel.ITreeNode container = getSelectedContainer();
        if (container != null) {
            container.doAdd();
        }
    }

    private void doEdit() {
        Object element = getViewerSelection();
        TreePresentationModel.ITreeNode container = getSelectedContainer();
        if (container != null) {
            container.doEdit(element);
        }
    }

    private void doRemove() {
        Object element = getViewerSelection();
        TreePresentationModel.ITreeNode container = getSelectedContainer();
        if (container != null) {
            container.doRemove(element);
        }
    }

    private void doUp() {
        Object element = getViewerSelection();
        TreePresentationModel.ITreeNode container = getSelectedContainer();
        if (container instanceof CompilerPresentationModel.IncludesContainer) {
            CompilerPresentationModel.IncludesContainer ic = (IncludesContainer) container;
            ic.doMove(element, -1);
        }
    }

    private void doDown() {
        Object element = getViewerSelection();
        TreePresentationModel.ITreeNode container = getSelectedContainer();
        if (container instanceof CompilerPresentationModel.IncludesContainer) {
            CompilerPresentationModel.IncludesContainer ic = (IncludesContainer) container;
            ic.doMove(element, 1);
        }
    }

    CompilerPresentationModel getModel() {
        return model;
    }

    public TreeViewer getCompilerTreeViewer() {
        return compilerTreeViewer;
    }

    public Button getAddButton() {
        return addButton;
    }

    public Button getEditButton() {
        return editButton;
    }

    public Button getUpButton() {
        return upButton;
    }

    public Button getDownButton() {
        return downButton;
    }

    public Button getRemoveButton() {
        return removeButton;
    }

    public Button getSrcDebugButton() {
        return srcdebugButton;
    }

    public Button getStrictDependenciesButton() {
        return strictDependenciesButton;
    }

}