com.htmlhifive.tools.jslint.view.TargetStructureComposite.java Source code

Java tutorial

Introduction

Here is the source code for com.htmlhifive.tools.jslint.view.TargetStructureComposite.java

Source

/*
 * Copyright (C) 2012 NS Solutions Corporation
 *
 * 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 com.htmlhifive.tools.jslint.view;

import java.io.File;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Set;

import org.apache.commons.lang.StringUtils;
import org.eclipse.core.databinding.DataBindingContext;
import org.eclipse.core.databinding.beans.BeansObservables;
import org.eclipse.core.databinding.beans.PojoProperties;
import org.eclipse.core.databinding.observable.list.IObservableList;
import org.eclipse.core.databinding.observable.list.WritableList;
import org.eclipse.core.databinding.observable.set.IObservableSet;
import org.eclipse.core.databinding.observable.value.WritableValue;
import org.eclipse.core.databinding.property.list.IListProperty;
import org.eclipse.core.databinding.property.list.MultiListProperty;
import org.eclipse.core.resources.IFile;
import org.eclipse.core.runtime.IPath;
import org.eclipse.jface.databinding.viewers.ObservableListContentProvider;
import org.eclipse.jface.databinding.viewers.ObservableListTreeContentProvider;
import org.eclipse.jface.databinding.viewers.ObservableMapLabelProvider;
import org.eclipse.jface.databinding.viewers.ViewersObservables;
import org.eclipse.jface.viewers.CheckboxTableViewer;
import org.eclipse.jface.viewers.LabelProvider;
import org.eclipse.jface.viewers.TreeViewer;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Group;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Link;
import org.eclipse.swt.widgets.Table;
import org.eclipse.swt.widgets.Tree;
import org.eclipse.ui.preferences.IWorkbenchPreferenceContainer;
import org.eclipse.wst.jsdt.core.IJavaScriptProject;
import org.eclipse.wst.jsdt.internal.ui.JavaPluginImages;
import org.eclipse.wst.jsdt.ui.ISharedImages;
import org.eclipse.wst.jsdt.ui.JavaScriptUI;

import com.htmlhifive.tools.jslint.configure.ConfigBean;
import com.htmlhifive.tools.jslint.configure.JSLintConfigManager;
import com.htmlhifive.tools.jslint.library.IncludePathEntryWrapper;
import com.htmlhifive.tools.jslint.library.LibraryManager;
import com.htmlhifive.tools.jslint.messages.Messages;
import com.htmlhifive.tools.jslint.view.model.TargetStructureCompositeViewModel;

/**
 * 
 * ?????.
 * 
 * @author NS Solutions Corporation
 */
@SuppressWarnings("restriction")
public class TargetStructureComposite extends Group {

    /**
     * ID.
     */
    private static final String BUILD_PATHS_PROPERTY_PAGE_ID = "org.eclipse.wst.jsdt.ui.propertyPages.BuildPathsPropertyPage";

    /**
     * .
     */
    private static final String LABEL_INCLUDED = "Included";

    /**
     * .
     */
    private static final String LABEL_EXCLUDED = "Excluded";

    /**
     * All.
     */
    private static final String LABEL_ALL = "(All)";

    /**
     * "None"?.
     */
    private static final String LABEL_NONE = "(None)";

    /**
     * 
     * ?.
     * 
     * @author NS Solutions Corporation
     * 
     */
    public static class LibraryTreeModel {

        /**
         * ?.
         */
        private Object data;
        /**
         * .
         */
        private LibraryTreeModel parent;
        /**
         * .
         */
        private String label;

        /**
         * .
         * 
         * @param parent .
         * @param data ?.
         * @param label .
         */
        public LibraryTreeModel(LibraryTreeModel parent, Object data, String label) {
            this.data = data;
            this.parent = parent;
            this.label = label;
        }

        /**
         * ???.
         * 
         * @return ?.
         */
        public Object getData() {
            return data;
        }

        /**
         * ???.
         * 
         * @return ?
         */
        @SuppressWarnings("unchecked")
        public List<LibraryTreeModel> getChildren() {

            if (parent == null) {
                return (List<LibraryTreeModel>) data;
            }

            if (data instanceof IncludePathEntryWrapper) {
                IncludePathEntryWrapper wrapper = (IncludePathEntryWrapper) data;
                List<LibraryTreeModel> list = new ArrayList<TargetStructureComposite.LibraryTreeModel>();

                IPath[] includePath = wrapper.getFullInclusionPatterns();
                IPath[] excludePath = wrapper.getFullExclusionPatterns();
                list.add(new LibraryTreeModel(this, includePath, LABEL_INCLUDED));
                list.add(new LibraryTreeModel(this, excludePath, LABEL_EXCLUDED));
                return list;
            }
            if (data instanceof IPath[]) {
                IPath[] paths = (IPath[]) data;
                List<LibraryTreeModel> list = new ArrayList<TargetStructureComposite.LibraryTreeModel>();
                if (paths == null || paths.length == 0) {
                    String label = null;
                    if (StringUtils.equals(this.label, LABEL_INCLUDED)) {
                        label = LABEL_ALL;
                    } else {
                        label = LABEL_NONE;
                    }
                    list.add(new LibraryTreeModel(this, new Object(), label));
                    return list;
                }
                for (IPath iPath : paths) {
                    String label = iPath.toString();
                    list.add(new LibraryTreeModel(this, iPath, label));
                }
                return list;
            }
            return null;
        }

        /**
         * ??.
         * 
         * @return .
         */
        public LibraryTreeModel getParent() {
            return parent;
        }

        /**
         * ??.
         * 
         * @return .
         */
        public String getLabel() {
            return label;
        }

    }

    /**
     * ()?.
     */
    private IWorkbenchPreferenceContainer container;
    /**
     * javascript.
     */
    private IJavaScriptProject project;
    /**
     * ?.
     */
    private TreeViewer treeViewerSource;
    /**
     * .
     */
    private CheckboxTableViewer tableViewerInternalLib;

    /**
     * .
     */
    private final TargetStructureCompositeViewModel model = new TargetStructureCompositeViewModel();

    /**
     * ?.
     */
    private CheckboxTableViewer tableViewerExternalLib;

    /**
     * ?.
     */
    private DataBindingContext context;

    /**
     * .
     * 
     * @param parent ?.
     * @param project javascript.
     * @param container ()?.
     */
    public TargetStructureComposite(Composite parent, IJavaScriptProject project,
            IWorkbenchPreferenceContainer container) {
        super(parent, SWT.NONE);
        this.project = project;
        this.container = container;
        createContents();
    }

    @Override
    protected void checkSubclass() {
    }

    /**
     * ??.
     */
    private void createContents() {
        setText(Messages.WT0003.getText());
        setLayout(new GridLayout(1, false));

        Composite composite = new Composite(this, SWT.NONE);
        composite.setLayout(new GridLayout(1, false));

        Link link = new Link(composite, SWT.NONE);
        link.addSelectionListener(new SelectionAdapter() {
            @Override
            public void widgetSelected(SelectionEvent e) {
                doLinkWidgetSelected(e);
            }
        });
        link.setSize(84, 18);
        link.setText(Messages.DL0008.getText());

        Group group = new Group(this, SWT.NONE);
        GridData gdGroup = new GridData(SWT.FILL, SWT.FILL, true, false, 1, 1);
        gdGroup.heightHint = 150;
        group.setLayoutData(gdGroup);
        group.setText(Messages.WT0002.getText());
        group.setLayout(new GridLayout(1, false));

        treeViewerSource = new TreeViewer(group, SWT.BORDER);
        Tree treeSource = treeViewerSource.getTree();
        GridData gdTreeSource = new GridData(SWT.FILL, SWT.FILL, true, true, 1, 1);
        gdTreeSource.widthHint = 300;
        treeSource.setLayoutData(gdTreeSource);

        IListProperty childrenProperty = new MultiListProperty(
                new IListProperty[] { PojoProperties.list("children") });
        ObservableListTreeContentProvider contentProvider = new ObservableListTreeContentProvider(
                childrenProperty.listFactory(), null);
        treeViewerSource.setContentProvider(contentProvider);

        ObservableMapLabelProvider labelProvider = new ObservableMapLabelProvider(
                PojoProperties.value("label").observeDetail(contentProvider.getKnownElements())) {
            @Override
            public Image getImage(Object element) {
                LibraryTreeModel model = (LibraryTreeModel) element;
                Object data = model.getData();
                if (data instanceof IncludePathEntryWrapper) {
                    return JavaScriptUI.getSharedImages().getImage(ISharedImages.IMG_OBJS_PACKFRAG_ROOT);
                }
                if (data instanceof IPath) {
                    return JavaScriptUI.getSharedImages().getImage(ISharedImages.IMG_OBJS_CUNIT);
                }
                if (StringUtils.equals(model.getLabel(), LABEL_INCLUDED)) {
                    return JavaPluginImages.DESC_OBJS_INCLUSION_FILTER_ATTRIB.createImage();
                } else if (StringUtils.equals(model.getLabel(), LABEL_EXCLUDED)) {
                    return JavaPluginImages.DESC_OBJS_EXCLUSION_FILTER_ATTRIB.createImage();
                }
                return null;
            }
        };
        treeViewerSource.setLabelProvider(labelProvider);
        treeViewerSource.setInput(createSourceViewInput());

        Label labelDescLib = new Label(this, SWT.NONE);
        labelDescLib.setToolTipText(Messages.DTT0000.getText());
        labelDescLib.setText(Messages.DL0017.getText());

        // ?.
        Group grpInternalLibrary = new Group(this, SWT.NONE);
        grpInternalLibrary.setLayout(new GridLayout(2, false));
        GridData gdGrpInternalLibrary = new GridData(SWT.FILL, SWT.FILL, true, false, 1, 1);
        gdGrpInternalLibrary.heightHint = 150;
        grpInternalLibrary.setLayoutData(gdGrpInternalLibrary);
        grpInternalLibrary.setText(Messages.WT0004.getText());
        tableViewerInternalLib = CheckboxTableViewer.newCheckList(grpInternalLibrary,
                SWT.BORDER | SWT.FULL_SELECTION);
        // tableViewerInternalLib = new TableViewer(grpLibrary, SWT.BORDER |
        // SWT.CHECK |
        // SWT.FULL_SELECTION);
        Table table = tableViewerInternalLib.getTable();
        GridData gridData = new GridData(SWT.FILL, SWT.FILL, true, true, 1, 1);
        gridData.widthHint = 300;
        table.setLayoutData(gridData);

        Composite compInternalLibButton = new Composite(grpInternalLibrary, SWT.NONE);
        compInternalLibButton.setLayoutData(new GridData(SWT.FILL, SWT.FILL, false, false, 1, 1));
        compInternalLibButton.setLayout(new GridLayout(1, false));

        Button btnInternalAllSelect = new Button(compInternalLibButton, SWT.NONE);
        btnInternalAllSelect.addSelectionListener(new SelectionAdapter() {
            @Override
            public void widgetSelected(SelectionEvent e) {
                doBtnInternalAllSelectWidgetSelected(e);
            }
        });
        GridData gdBtnInternalAllSelect = new GridData(SWT.LEFT, SWT.CENTER, false, false, 1, 1);
        gdBtnInternalAllSelect.widthHint = 60;
        btnInternalAllSelect.setLayoutData(gdBtnInternalAllSelect);
        btnInternalAllSelect.setText(Messages.B0006.getText());

        Button btnInternalAllRelease = new Button(compInternalLibButton, SWT.NONE);
        btnInternalAllRelease.addSelectionListener(new SelectionAdapter() {
            @Override
            public void widgetSelected(SelectionEvent e) {
                doBtnInternalAllReleaseWidgetSelected(e);
            }
        });
        GridData gdBtnInternalAllRelease = new GridData(SWT.LEFT, SWT.CENTER, false, false, 1, 1);
        gdBtnInternalAllRelease.widthHint = 60;
        btnInternalAllRelease.setLayoutData(gdBtnInternalAllRelease);
        btnInternalAllRelease.setText(Messages.B0007.getText());

        IObservableList observableList = createInternalLibViewInput();
        tableViewerInternalLib.setLabelProvider(new LabelProvider() {

            @Override
            public String getText(Object element) {
                WritableValue value = (WritableValue) element;
                return value.getValue().toString();
            }

            @Override
            public Image getImage(Object element) {
                return JavaScriptUI.getSharedImages().getImage(ISharedImages.IMG_OBJS_LIBRARY);
            }
        });
        ObservableListContentProvider listContentProvider = new ObservableListContentProvider();
        tableViewerInternalLib.setContentProvider(listContentProvider);
        tableViewerInternalLib.setInput(observableList);

        // ?.
        Group grpExternalLibrary = new Group(this, SWT.NONE);
        grpExternalLibrary.setText(Messages.WT0006.getText());
        grpExternalLibrary.setLayout(new GridLayout(2, false));
        GridData gdGrpExternalLibrary = new GridData(SWT.FILL, SWT.FILL, true, false, 1, 1);
        gdGrpExternalLibrary.heightHint = 150;
        grpExternalLibrary.setLayoutData(gdGrpExternalLibrary);

        tableViewerExternalLib = CheckboxTableViewer.newCheckList(grpExternalLibrary,
                SWT.BORDER | SWT.FULL_SELECTION);
        Table tableExternalLib = tableViewerExternalLib.getTable();
        GridData gdTableExternalLib = new GridData(SWT.FILL, SWT.FILL, true, true, 1, 1);
        gdTableExternalLib.widthHint = 300;
        tableExternalLib.setLayoutData(gdTableExternalLib);

        Composite compExternalLibButton = new Composite(grpExternalLibrary, SWT.NONE);
        compExternalLibButton.setLayoutData(new GridData(SWT.FILL, SWT.FILL, false, false, 1, 1));
        compExternalLibButton.setLayout(new GridLayout(1, false));

        Button btnExternalAllSelect = new Button(compExternalLibButton, SWT.NONE);
        btnExternalAllSelect.addSelectionListener(new SelectionAdapter() {
            @Override
            public void widgetSelected(SelectionEvent e) {
                doBtnExternalAllSelectWidgetSelected(e);
            }
        });
        GridData gdBtnExternalAllSelect = new GridData(SWT.LEFT, SWT.CENTER, false, false, 1, 1);
        gdBtnExternalAllSelect.widthHint = 60;
        btnExternalAllSelect.setLayoutData(gdBtnExternalAllSelect);
        btnExternalAllSelect.setText(Messages.B0006.getText());

        Button btnExternalAllRelease = new Button(compExternalLibButton, SWT.NONE);
        btnExternalAllRelease.addSelectionListener(new SelectionAdapter() {
            @Override
            public void widgetSelected(SelectionEvent e) {
                doBtnExternalAllReleaseWidgetSelected(e);
            }
        });
        GridData gdBtnExternalAllRelease = new GridData(SWT.LEFT, SWT.CENTER, false, false, 1, 1);
        gdBtnExternalAllRelease.widthHint = 60;
        btnExternalAllRelease.setLayoutData(gdBtnExternalAllRelease);
        btnExternalAllRelease.setText(Messages.B0007.getText());

        IObservableList externalObservableList = createExternalLibViewInput();
        tableViewerExternalLib.setLabelProvider(new LabelProvider() {

            @Override
            public String getText(Object element) {
                String value = (String) element;
                return value;
            }

            @Override
            public Image getImage(Object element) {
                return JavaScriptUI.getSharedImages().getImage(ISharedImages.IMG_OBJS_LIBRARY);
            }
        });
        ObservableListContentProvider listExternalContentProvider = new ObservableListContentProvider();
        tableViewerExternalLib.setContentProvider(listExternalContentProvider);
        tableViewerExternalLib.setInput(externalObservableList);

        initialDataBinding();
        initialModel();
    }

    /**
     * model??.
     */
    private void initialModel() {
        ConfigBean bean = JSLintConfigManager.getConfigBean(project.getProject());
        Set<String> set = new HashSet<String>(bean.getExternalLibPathList());
        model.setCheckedExternalLibElement(set);
        Set<String> internalLibSet = new HashSet<String>(bean.getInternalLibPathList());
        model.setCheckedInternalLibElement(internalLibSet);
    }

    /**
     * ???.
     */
    private void initialDataBinding() {

        context = new DataBindingContext();

        // ?????.
        IObservableSet obsCheckedElemInternalLibTableViewer = ViewersObservables
                .observeCheckedElements(tableViewerInternalLib, String.class);
        IObservableSet obsCheckedInternalLibElemModel = BeansObservables.observeSet(model,
                "checkedInternalLibElement");
        context.bindSet(obsCheckedElemInternalLibTableViewer, obsCheckedInternalLibElemModel, null, null);

        // ?????.
        IObservableSet obsCheckedElemExternalLibTableViewer = ViewersObservables
                .observeCheckedElements(tableViewerExternalLib, String.class);
        IObservableSet obsCheckedExternalLibElemModel = BeansObservables.observeSet(model,
                "checkedExternalLibElement");
        context.bindSet(obsCheckedElemExternalLibTableViewer, obsCheckedExternalLibElemModel, null, null);

    }

    /**
     * ???.
     * 
     * @return ?
     */
    private IObservableList createInternalLibViewInput() {
        List<String> libPathList = new ArrayList<String>();
        LibraryManager manager = LibraryManager.getInstance(project);
        IObservableList observableList = new WritableList(libPathList, String.class);
        IFile[] internalLibs = manager.getInternalLibPaths();
        for (IFile iFile : internalLibs) {
            observableList.add(iFile.getFullPath().toString());
        }
        return observableList;
    }

    /**
     * ???.
     * 
     * @return ?
     */
    private IObservableList createExternalLibViewInput() {
        List<String> libPathList = new ArrayList<String>();
        LibraryManager manager = LibraryManager.getInstance(project);
        IObservableList observableList = new WritableList(libPathList, String.class);
        File[] externalLibs = manager.getExternalLibFiles();
        for (File file : externalLibs) {
            observableList.add(file.getPath());
        }
        return observableList;
    }

    /**
     * ???.
     * 
     * @return ?.
     */
    private Object createSourceViewInput() {
        List<LibraryTreeModel> list = new ArrayList<TargetStructureComposite.LibraryTreeModel>();
        LibraryTreeModel root = new LibraryTreeModel(null, list, "root");
        LibraryManager manager = LibraryManager.getInstance(project);
        IncludePathEntryWrapper[] entrys = manager.getIncludePathEntries();
        for (IncludePathEntryWrapper includePathEntryWrapper : entrys) {
            if (includePathEntryWrapper.getEntryKind() == IncludePathEntryWrapper.CPE_SOURCE) {
                list.add(new LibraryTreeModel(root, includePathEntryWrapper,
                        includePathEntryWrapper.getPath().toString()));
            }
        }
        return root;
    }

    /**
     * ??.
     * 
     * @param e .
     */
    protected void doLinkWidgetSelected(SelectionEvent e) {
        container.openPage(BUILD_PATHS_PROPERTY_PAGE_ID, null);
    }

    /**
     * ?.
     */
    public void refreshViewer() {
        treeViewerSource.setInput(createSourceViewInput());
        treeViewerSource.refresh();

        tableViewerInternalLib.setInput(createRefreshedInput((IObservableList) tableViewerInternalLib.getInput(),
                createInternalLibViewInput()));
        tableViewerInternalLib.refresh();

        tableViewerExternalLib.setInput(createRefreshedInput((IObservableList) tableViewerExternalLib.getInput(),
                createExternalLibViewInput()));
        tableViewerExternalLib.refresh();
    }

    /**
     * ???????????????.
     * 
     * @param inputList ?.
     * @param newList ??????.
     * @return ?????.
     */
    private WritableList createRefreshedInput(IObservableList inputList, IObservableList newList) {
        // ??.
        List<String> list = new ArrayList<String>();
        Object[] newValues = newList.toArray();
        Object[] inputValues = inputList.toArray();

        // ????????
        for (Object value : newValues) {
            String newWr = (String) value;
            // ???????????
            boolean exist = false;
            for (Object inputValue : inputValues) {
                String inputWr = (String) inputValue;
                if (inputWr.equals(newWr)) {
                    // ??????????????.
                    list.add(inputWr);
                    exist = true;
                    break;
                }
            }
            if (!exist) {
                // ???????????.
                list.add(newWr);
            }
        }
        return new WritableList(list, String.class);
    }

    /**
     * 
     * ??.
     * 
     * @param e .
     */
    protected void doBtnInternalAllSelectWidgetSelected(SelectionEvent e) {

        tableViewerInternalLib.setAllChecked(true);
        context.updateModels();
    }

    /**
     * ?.
     * 
     * @param e .
     */
    protected void doBtnInternalAllReleaseWidgetSelected(SelectionEvent e) {

        tableViewerInternalLib.setAllChecked(false);
        context.updateModels();
    }

    /**
     * ??.
     * 
     * @param e .
     */
    protected void doBtnExternalAllSelectWidgetSelected(SelectionEvent e) {

        tableViewerExternalLib.setAllChecked(true);
        context.updateModels();
    }

    /**
     * ?..
     * 
     * @param e .
     */
    protected void doBtnExternalAllReleaseWidgetSelected(SelectionEvent e) {

        tableViewerExternalLib.setAllChecked(false);
        context.updateModels();
    }

    /**
     * ??.
     * 
     * @return .
     */
    public TargetStructureCompositeViewModel getModel() {
        return model;
    }
}