net.rim.ejde.internal.ui.editors.model.BlackBerryProjectOutlinePage.java Source code

Java tutorial

Introduction

Here is the source code for net.rim.ejde.internal.ui.editors.model.BlackBerryProjectOutlinePage.java

Source

/*
* Copyright (c) 2010-2012 Research In Motion Limited. All rights reserved.
*
* This program and the accompanying materials are made available
* under the terms of the Eclipse Public License, Version 1.0,
* which accompanies this distribution and is available at
*
* http://www.eclipse.org/legal/epl-v10.html
*
*/
package net.rim.ejde.internal.ui.editors.model;

import net.rim.ejde.internal.core.ContextManager;
import net.rim.ejde.internal.core.IConstants;

import org.eclipse.jface.resource.ImageDescriptor;
import org.eclipse.jface.viewers.ILabelProvider;
import org.eclipse.jface.viewers.ILabelProviderListener;
import org.eclipse.jface.viewers.ISelectionChangedListener;
import org.eclipse.jface.viewers.ITreeContentProvider;
import org.eclipse.jface.viewers.SelectionChangedEvent;
import org.eclipse.jface.viewers.TreePath;
import org.eclipse.jface.viewers.TreeSelection;
import org.eclipse.jface.viewers.TreeViewer;
import org.eclipse.jface.viewers.Viewer;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.Table;
import org.eclipse.swt.widgets.TableItem;
import org.eclipse.swt.widgets.Text;
import org.eclipse.swt.widgets.Tree;
import org.eclipse.swt.widgets.TreeItem;
import org.eclipse.ui.forms.SectionPart;
import org.eclipse.ui.views.contentoutline.ContentOutlinePage;

/**
 * The outline view page for the editor. Please note, some of this code was created for demo purposes only and does not reflect
 * the final implementation. Some areas of this code should be changed and coded better once implementation of the outline view
 * officially begins. Also note that the outline view prototype is currently disabled and to re-enable it, please uncomment the
 * appropriate code in getAdapter() method.
 *
 * @author jkeshavarzi
 *
 */
public class BlackBerryProjectOutlinePage extends ContentOutlinePage implements ISelectionChangedListener {
    BlackBerryProjectFormEditor _editor;

    public BlackBerryProjectOutlinePage(BlackBerryProjectFormEditor editor) {
        this._editor = editor;
    }

    @Override
    public void createControl(Composite parent) {
        super.createControl(parent);
        TreeViewer contentOutlineViewer = getTreeViewer();
        contentOutlineViewer.addSelectionChangedListener(this);

        contentOutlineViewer.setContentProvider(new ContentProvider());
        contentOutlineViewer.setLabelProvider(new LabelProvider());
        contentOutlineViewer.setInput(_editor.getPages());
    }

    @Override
    public void selectionChanged(SelectionChangedEvent event) {
        super.selectionChanged(event);
        Object source = event.getSource();
        BlackBerryProjectPropertiesPage page = null;
        Control control = null;

        if (source instanceof TreeViewer) {
            TreeViewer v = (TreeViewer) source;
            TreeSelection t = (TreeSelection) v.getSelection();
            Object obj = t.getFirstElement();
            if (obj instanceof BlackBerryProjectPropertiesPage) {
                page = (BlackBerryProjectPropertiesPage) obj;
            } else {
                page = (BlackBerryProjectPropertiesPage) t.getPaths()[0].getFirstSegment();
            }

            if (_editor.getActivePage() != page.getIndex()) {
                _editor.setActivePage(page.getIndex());
            }

            if (obj instanceof Control) {
                control = (Control) obj;
                control.setFocus();
                if (control instanceof Text) {
                    Text text = (Text) control;
                    text.selectAll();
                }
            } else if (obj instanceof TableItem) {
                // Table table = (Table) t.getPaths()[ 0 ].getParentPath().getLastSegment();
                TreePath path = t.getPaths()[0];
                Object parentObject = path.getSegment(path.getSegmentCount() - 2);
                if (parentObject instanceof Table) {
                    Table table = (Table) parentObject;
                    table.select(BlackBerryProjectPropertiesPage
                            .getItemIndex(table, v.getTree().getSelection()[0].getText()).intValue());
                }
            }
        }
    }

    public void updateTreeSelection(Control control) {
        TreeViewer viewer = getTreeViewer();
        Tree tree = viewer.getTree();
        TreeItem item = null;

        if (tree.getSelection() == null) {
            return;
        }

        if (control instanceof Table) {
            Table table = (Table) control;
            TableItem selections[] = table.getSelection();

            if (selections.length > 0) {
                item = getTableItem(tree, selections[0].getText(2));
            }
        } else {
            item = getControlItem(tree,
                    control.getData(BlackBerryProjectPropertiesPage.CONTROL_TITLE_KEY).toString());
        }

        if (item != null) {
            TreeItem selectedItem[] = tree.getSelection();

            if ((selectedItem.length > 0) && selectedItem[0].equals(item)) {
                return;
            }

            tree.deselectAll();
            tree.select(item);
        }
    }

    public void updateTreeSelection(BlackBerryProjectPropertiesPage page) {
        TreeViewer viewer = getTreeViewer();
        Tree tree = viewer.getTree();
        TreeItem item = getPageItem(tree, page.getTitle());

        if (item != null) {
            TreeItem selectedItem[] = tree.getSelection();

            if ((selectedItem.length > 0) && selectedItem[0].equals(item)) {
                return;
            }

            tree.deselectAll();
            tree.select(item);
        }
    }

    private TreeItem getControlItem(Tree tree, String text) {
        // TODO Change this demo prototype code. Find a better way to get a control item.
        for (TreeItem item : tree.getItems()[0].getItems()) {
            if (item.getText().equals(text)) {
                return item;
            }
        }

        return null;
    }

    private TreeItem getTableItem(Tree tree, String text) {
        // TODO Change this demo prototype code. Find a better way to get a table item.
        for (TreeItem item : tree.getItems()[0].getItems()[4].getItems()) {
            if (item.getText().equals(text)) {
                return item;
            }
        }

        return null;
    }

    private TreeItem getPageItem(Tree tree, String text) {
        // TODO Change this demo prototype code. Find a better way to get a page item.
        for (TreeItem item : tree.getItems()) {
            if (item.getText().equals(text)) {
                return item;
            }
        }

        return null;
    }

    private class LabelProvider implements ILabelProvider {
        Image image = null;

        @Override
        public Image getImage(Object element) {
            if (element instanceof BlackBerryProjectPropertiesPage) {
                ImageDescriptor desc = ContextManager.getImageDescriptor("icons/obj16/page_obj.gif"); //$NON-NLS-1$
                image = desc.createImage();
                return image;
            }
            if (element instanceof TableItem) {
                TableItem item = (TableItem) element;
                return item.getImage(1);
            }

            return null;
        }

        @Override
        public String getText(Object element) {
            if (element instanceof BlackBerryProjectPropertiesPage) {
                return ((BlackBerryProjectPropertiesPage) element).getTitle();
            } else if (element instanceof SectionPart) {
                return ((SectionPart) element).getSection().getText();
            } else if (element instanceof Control) {
                Object text = ((Control) element).getData(BlackBerryProjectPropertiesPage.CONTROL_TITLE_KEY);
                return text == null ? IConstants.EMPTY_STRING : text.toString();
            } else if (element instanceof TableItem) {
                TableItem item = ((TableItem) element);
                Object obj = item.getParent().getData(BlackBerryProjectPropertiesPage.TABLE_TEXT_INDEX_KEY);
                if ((obj != null) && (obj instanceof Integer)) {
                    return item.getText(((Integer) obj).intValue());
                }
            }

            return null;
        }

        @Override
        public void addListener(ILabelProviderListener listener) {
            // Do Nothing
        }

        @Override
        public void dispose() {
            // Do Nothing
        }

        @Override
        public boolean isLabelProperty(Object element, String property) {
            return false;
        }

        @Override
        public void removeListener(ILabelProviderListener listener) {
            // Do Nothing
        }
    }

    private class ContentProvider implements ITreeContentProvider {
        @Override
        public Object[] getChildren(Object parentElement) {
            if (parentElement instanceof BlackBerryProjectPropertiesPage) {
                return ((BlackBerryProjectPropertiesPage) parentElement).getSections();
            } else if (parentElement instanceof AbstractSection) {
                return ((AbstractSection) parentElement).getOutlineControls();
            } else if (parentElement instanceof Table) {
                return ((Table) parentElement).getItems();
            }
            return null;
        }

        @Override
        public Object getParent(Object element) {
            return null;
        }

        @Override
        public boolean hasChildren(Object element) {
            if ((element instanceof BlackBerryProjectPropertiesPage) || (element instanceof SectionPart)
                    || (element instanceof Table)) {
                return true;
            }
            return false;
        }

        @Override
        public Object[] getElements(Object inputElement) {
            if (inputElement instanceof BlackBerryProjectPropertiesPage[]) {
                return (BlackBerryProjectPropertiesPage[]) inputElement;
            } else if (inputElement instanceof TableItem[]) {
                return (TableItem[]) inputElement;
            }
            return new Object[] {};
        }

        @Override
        public void dispose() {
            // Do Nothing
        }

        @Override
        public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
            // Do Nothing
        }
    }
}