org.seasar.s2jsfplugin.editor.HTMLOutlinePage.java Source code

Java tutorial

Introduction

Here is the source code for org.seasar.s2jsfplugin.editor.HTMLOutlinePage.java

Source

/*
 * Copyright 2004-2009 the Seasar Foundation and the Others.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, 
 * either express or implied. See the License for the specific language
 * governing permissions and limitations under the License.
 */
package org.seasar.s2jsfplugin.editor;

import java.util.ArrayList;

import jp.aonir.fuzzyxml.FuzzyXMLAttribute;
import jp.aonir.fuzzyxml.FuzzyXMLComment;
import jp.aonir.fuzzyxml.FuzzyXMLDocType;
import jp.aonir.fuzzyxml.FuzzyXMLDocument;
import jp.aonir.fuzzyxml.FuzzyXMLElement;
import jp.aonir.fuzzyxml.FuzzyXMLNode;
import jp.aonir.fuzzyxml.FuzzyXMLParser;

import org.eclipse.jface.viewers.ISelectionChangedListener;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.jface.viewers.ITreeContentProvider;
import org.eclipse.jface.viewers.LabelProvider;
import org.eclipse.jface.viewers.SelectionChangedEvent;
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.ui.IEditorPart;
import org.eclipse.ui.IWorkbenchPage;
import org.eclipse.ui.PlatformUI;
import org.eclipse.ui.views.contentoutline.ContentOutlinePage;
import org.seasar.s2jsfplugin.S2JSFPlugin;

/**
 * HTMLAEgC\ContentOutlinePage?B
 * 
 * @author Naoki Takezoe
 */
public class HTMLOutlinePage extends ContentOutlinePage {

    private RootNode root;
    private HTMLSourceEditor editor;
    private FuzzyXMLDocument doc;

    public HTMLOutlinePage(HTMLSourceEditor editor) {
        super();
        this.editor = editor;
    }

    public void createControl(Composite parent) {
        super.createControl(parent);
        TreeViewer viewer = getTreeViewer();
        root = new RootNode();
        viewer.setContentProvider(new HTMLContentProvider());
        viewer.setLabelProvider(new HTMLLabelProvider());
        viewer.setInput(root);
        viewer.addSelectionChangedListener(new HTMLSelectionChangedListener());
        try {
            viewer.setExpandedState(root.getChildren()[0], true);
        } catch (Exception ex) {
            // ignore
        }
        update();
    }

    protected Image getNodeImage(FuzzyXMLNode element) {
        if (element instanceof FuzzyXMLElement) {
            FuzzyXMLElement e = (FuzzyXMLElement) element;
            if (e.getName().equalsIgnoreCase("html")) {
                return S2JSFPlugin.getDefault().getImageRegistry().get(S2JSFPlugin.ICON_HTML);
            } else if (e.getName().equalsIgnoreCase("title")) {
                return S2JSFPlugin.getDefault().getImageRegistry().get(S2JSFPlugin.ICON_TITLE);
            } else if (e.getName().equalsIgnoreCase("body")) {
                return S2JSFPlugin.getDefault().getImageRegistry().get(S2JSFPlugin.ICON_BODY);
            } else if (e.getName().equalsIgnoreCase("form")) {
                return S2JSFPlugin.getDefault().getImageRegistry().get(S2JSFPlugin.ICON_FORM);
            } else if (e.getName().equalsIgnoreCase("img")) {
                return S2JSFPlugin.getDefault().getImageRegistry().get(S2JSFPlugin.ICON_IMAGE);
            } else if (e.getName().equalsIgnoreCase("a")) {
                return S2JSFPlugin.getDefault().getImageRegistry().get(S2JSFPlugin.ICON_LINK);
            } else if (e.getName().equalsIgnoreCase("table")) {
                return S2JSFPlugin.getDefault().getImageRegistry().get(S2JSFPlugin.ICON_TABLE);
            } else if (e.getName().equalsIgnoreCase("input")) {
                String type = e.getAttributeValue("type");
                if (type != null) {
                    if (type.equalsIgnoreCase("button") || type.equalsIgnoreCase("reset")
                            || type.equalsIgnoreCase("submit")) {
                        return S2JSFPlugin.getDefault().getImageRegistry().get(S2JSFPlugin.ICON_BUTTON);
                    } else if (type.equalsIgnoreCase("radio")) {
                        return S2JSFPlugin.getDefault().getImageRegistry().get(S2JSFPlugin.ICON_RADIO);
                    } else if (type.equalsIgnoreCase("checkbox")) {
                        return S2JSFPlugin.getDefault().getImageRegistry().get(S2JSFPlugin.ICON_CHECK);
                    } else if (type.equalsIgnoreCase("text")) {
                        return S2JSFPlugin.getDefault().getImageRegistry().get(S2JSFPlugin.ICON_TEXT);
                    } else if (type.equalsIgnoreCase("password")) {
                        return S2JSFPlugin.getDefault().getImageRegistry().get(S2JSFPlugin.ICON_PASSWD);
                    } else if (type.equalsIgnoreCase("hidden")) {
                        return S2JSFPlugin.getDefault().getImageRegistry().get(S2JSFPlugin.ICON_HIDDEN);
                    }
                }
            } else if (e.getName().equalsIgnoreCase("select")) {
                return S2JSFPlugin.getDefault().getImageRegistry().get(S2JSFPlugin.ICON_SELECT);
            } else if (e.getName().equalsIgnoreCase("textarea")) {
                return S2JSFPlugin.getDefault().getImageRegistry().get(S2JSFPlugin.ICON_TEXTAREA);
            }
            return S2JSFPlugin.getDefault().getImageRegistry().get(S2JSFPlugin.ICON_TAG);
        } else if (element instanceof FuzzyXMLDocType) {
            return S2JSFPlugin.getDefault().getImageRegistry().get(S2JSFPlugin.ICON_DOCTYPE);
        } else if (element instanceof FuzzyXMLComment) {
            return S2JSFPlugin.getDefault().getImageRegistry().get(S2JSFPlugin.ICON_COMMENT);
        }
        return null;
    }

    protected Object[] getNodeChildren(FuzzyXMLElement element) {
        ArrayList children = new ArrayList();
        FuzzyXMLNode[] nodes = element.getChildren();
        for (int i = 0; i < nodes.length; i++) {
            if (nodes[i] instanceof FuzzyXMLElement) {
                children.add(nodes[i]);
            } else if (nodes[i] instanceof FuzzyXMLDocType) {
                children.add(nodes[i]);
            } else if (nodes[i] instanceof FuzzyXMLComment) {
                children.add(nodes[i]);
            }
        }
        return (FuzzyXMLNode[]) children.toArray(new FuzzyXMLNode[children.size()]);
    }

    protected String getNodeText(FuzzyXMLNode node) {
        if (node instanceof FuzzyXMLElement) {
            StringBuffer sb = new StringBuffer();
            FuzzyXMLAttribute[] attrs = ((FuzzyXMLElement) node).getAttributes();
            for (int i = 0; i < attrs.length; i++) {
                if (sb.length() != 0) {
                    sb.append(", ");
                }
                sb.append(attrs[i].getName() + "=" + attrs[i].getValue());
            }
            if (sb.length() == 0) {
                return ((FuzzyXMLElement) node).getName();
            } else {
                return ((FuzzyXMLElement) node).getName() + "(" + sb.toString() + ")";
            }
        }
        if (node instanceof FuzzyXMLDocType) {
            return "DOCTYPE";
        }
        if (node instanceof FuzzyXMLComment) {
            return "#comment";
        }
        return node.toString();
    }

    protected boolean isHTML() {
        return true;
    }

    public void update() {
        String source = editor.getDocumentProvider().getDocument(editor.getEditorInput()).get();
        this.doc = new FuzzyXMLParser(isHTML()).parse(source);
        TreeViewer viewer = getTreeViewer();
        if (viewer != null) {
            viewer.refresh();
        }
    }

    /** ?[gG?g */
    private class RootNode {

        public RootNode() {
            super();
        }

        public Object[] getChildren() {
            FuzzyXMLNode[] nodes = doc.getDocumentElement().getChildren();
            ArrayList children = new ArrayList();
            for (int i = 0; i < nodes.length; i++) {
                if (nodes[i] instanceof FuzzyXMLElement) {
                    children.add(nodes[i]);
                }
            }
            return (FuzzyXMLElement[]) children.toArray(new FuzzyXMLElement[children.size()]);
        }

        public boolean equals(Object obj) {
            if (obj instanceof RootNode) {
                return true;
            }
            return false;
        }
    }

    /** HTMLAEgCRecv?oC_ */
    private class HTMLContentProvider implements ITreeContentProvider {

        public Object[] getChildren(Object parentElement) {
            if (parentElement instanceof RootNode) {
                return ((RootNode) parentElement).getChildren();
            } else if (parentElement instanceof FuzzyXMLElement) {
                return getNodeChildren((FuzzyXMLElement) parentElement);
            }
            return new Object[0];
        }

        public Object getParent(Object element) {
            if (element instanceof FuzzyXMLNode) {
                FuzzyXMLNode parent = ((FuzzyXMLNode) element).getParentNode();
                if (parent == null) {
                    return root.getChildren()[0];
                }
                return parent;
            }
            return null;
        }

        public boolean hasChildren(Object element) {
            if (getChildren(element).length == 0) {
                return false;
            } else {
                return true;
            }
        }

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

        public void dispose() {
        }

        public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
        }
    }

    /** HTMLAEgCxv?oC_ */
    private class HTMLLabelProvider extends LabelProvider {

        public Image getImage(Object element) {
            if (element instanceof FuzzyXMLNode) {
                return getNodeImage((FuzzyXMLNode) element);
            }
            return null;
        }

        public String getText(Object element) {
            if (element instanceof FuzzyXMLNode) {
                return getNodeText((FuzzyXMLNode) element);
            }
            return super.getText(element);
        }
    }

    /** c?[r?[AI?X??Xi */
    private class HTMLSelectionChangedListener implements ISelectionChangedListener {
        public void selectionChanged(SelectionChangedEvent event) {
            IStructuredSelection sel = (IStructuredSelection) event.getSelection();
            Object element = sel.getFirstElement();
            if (element instanceof FuzzyXMLNode) {
                int offset = ((FuzzyXMLNode) element).getOffset();
                IWorkbenchPage page = PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage();
                IEditorPart editorPart = page.getActiveEditor();
                if (editorPart instanceof HTMLEditor) {
                    ((HTMLEditor) editorPart).setOffset(offset);
                } else if (editorPart instanceof HTMLSourceEditor) {
                    ((HTMLSourceEditor) editorPart).selectAndReveal(offset, 0);
                }
            }
        }
    }
}