/*******************************************************************************
 * Copyright (c) 2010 Neil Bartlett.
 * 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:
 *     Neil Bartlett - initial API and implementation
 ******************************************************************************/
package bndtools.editor;

import org.eclipse.jface.viewers.ISelectionChangedListener;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.jface.viewers.SelectionChangedEvent;
import org.eclipse.jface.viewers.TreeViewer;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.ui.views.contentoutline.ContentOutlinePage;

import aQute.bnd.build.model.BndEditModel;
import aQute.bnd.build.model.clauses.ExportedPackage;
import aQute.bnd.build.model.clauses.ImportPattern;
import bndtools.editor.pages.BundleContentPage;
import bndtools.editor.pages.WorkspacePage;

public class BndEditorContentOutlinePage extends ContentOutlinePage {

    private final BndEditModel model;
    private final BndEditor editor;

    public BndEditorContentOutlinePage(BndEditor editor, BndEditModel model) {
        this.editor = editor;
        this.model = model;
    }

    @Override
    public void createControl(Composite parent) {
        super.createControl(parent);

        TreeViewer viewer = getTreeViewer();
        viewer.setAutoExpandLevel(2);
        viewer.setContentProvider(new BndEditorContentOutlineProvider(viewer));
        viewer.setLabelProvider(new BndEditorContentOutlineLabelProvider());

        viewer.addSelectionChangedListener(new ISelectionChangedListener() {
            @Override
            public void selectionChanged(SelectionChangedEvent event) {
                IStructuredSelection selection = (IStructuredSelection) event.getSelection();
                Object element = selection.getFirstElement();

                if (element instanceof String) {
                    if (BndEditorContentOutlineProvider.EXPORTS.equals(element)) {
                        editor.setActivePage(BndEditor.CONTENT_PAGE);
                    } else if (BndEditorContentOutlineProvider.IMPORT_PATTERNS.equals(element)) {
                        editor.setActivePage(BndEditor.CONTENT_PAGE);
                    } else if (BndEditorContentOutlineProvider.PRIVATE_PKGS.equals(element)) {
                        editor.setActivePage(BndEditor.CONTENT_PAGE);
                    } else if (BndEditorContentOutlineProvider.PLUGINS.equals(element)) {
                        editor.setActivePage(BndEditor.WORKSPACE_PAGE);
                    } else {
                        editor.setActivePage((String) element);
                    }
                } else if (element instanceof ExportedPackage) {
                    BundleContentPage contentsPage = (BundleContentPage) editor.setActivePage(BndEditor.CONTENT_PAGE);
                    if (contentsPage != null) {
                        contentsPage.setSelectedExport((ExportedPackage) element);
                    }
                } else if (element instanceof PrivatePkg) {
                    BundleContentPage contentsPage = (BundleContentPage) editor.setActivePage(BndEditor.CONTENT_PAGE);
                    if (contentsPage != null) {
                        contentsPage.setSelectedPrivatePkg(((PrivatePkg) element).pkg);
                    }
                } else if (element instanceof ImportPattern) {
                    BundleContentPage contentsPage = (BundleContentPage) editor.setActivePage(BndEditor.CONTENT_PAGE);
                    if (contentsPage != null) {
                        contentsPage.setSelectedImport((ImportPattern) element);
                    }
                } else if (element instanceof PluginClause) {
                    WorkspacePage workspacePage = (WorkspacePage) editor.setActivePage(BndEditor.WORKSPACE_PAGE);
                    if (workspacePage != null)
                        workspacePage.setSelectedPlugin(((PluginClause) element).header);
                }
            }
        });

        viewer.setInput(model);
    }
}
