org.eclipse.fx.ide.fxml.wizards.FXMLWizardPage.java Source code

Java tutorial

Introduction

Here is the source code for org.eclipse.fx.ide.fxml.wizards.FXMLWizardPage.java

Source

/*******************************************************************************
 * Copyright (c) 2012 BestSolution.at and others.
 * 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:
 *     Tom Schindl<tom.schindl@bestsolution.at> - initial API and implementation
 *******************************************************************************/
package org.eclipse.fx.ide.fxml.wizards;

import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;
import java.util.ArrayList;
import java.util.List;

import org.eclipse.core.databinding.DataBindingContext;
import org.eclipse.core.databinding.beans.BeanProperties;
import org.eclipse.core.resources.IWorkspaceRoot;
import org.eclipse.fx.ide.fxml.Activator;
import org.eclipse.fx.ide.fxml.wizards.template.FXMLElement;
import org.eclipse.jdt.core.IJavaProject;
import org.eclipse.jdt.core.IPackageFragment;
import org.eclipse.jdt.core.IPackageFragmentRoot;
import org.eclipse.jdt.core.IType;
import org.eclipse.jdt.core.JavaModelException;
import org.eclipse.jdt.core.search.IJavaSearchScope;
import org.eclipse.jdt.core.search.SearchEngine;
import org.eclipse.jdt.ui.IJavaElementSearchConstants;
import org.eclipse.jdt.ui.JavaUI;
import org.eclipse.jface.databinding.swt.WidgetProperties;
import org.eclipse.jface.databinding.viewers.ViewerProperties;
import org.eclipse.jface.dialogs.IMessageProvider;
import org.eclipse.jface.resource.ImageDescriptor;
import org.eclipse.jface.viewers.ArrayContentProvider;
import org.eclipse.jface.viewers.ComboViewer;
import org.eclipse.jface.viewers.LabelProvider;
import org.eclipse.jface.viewers.StructuredSelection;
import org.eclipse.jface.window.Window;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Label;
import org.eclipse.ui.PlatformUI;
import org.eclipse.ui.dialogs.SelectionDialog;
import org.eclipse.ui.plugin.AbstractUIPlugin;
import org.eclipse.fx.ide.ui.wizards.AbstractJDTElementPage;

/**
 * Page to create FXML
 */
public class FXMLWizardPage extends AbstractJDTElementPage<FXMLElement> {
    IType customSelection;

    protected FXMLWizardPage(IPackageFragmentRoot froot, IPackageFragment fragment, IWorkspaceRoot fWorkspaceRoot) {
        super("fxml", Messages.FXMLWizardPage_1, Messages.FXMLWizardPage_0, froot, fragment, fWorkspaceRoot); //$NON-NLS-1$
    }

    @Override
    protected ImageDescriptor getTitleAreaImage(Display display) {
        return AbstractUIPlugin.imageDescriptorFromPlugin(Activator.PLUGIN_ID, "/icons/title_banner.png"); //$NON-NLS-1$
    }

    @Override
    protected void createFields(Composite parent, DataBindingContext dbc) {
        {
            Label l = new Label(parent, SWT.NONE);
            l.setText(Messages.FXMLWizardPage_4);

            final ComboViewer viewer = new ComboViewer(parent);
            viewer.setLabelProvider(new LabelProvider() {
                @Override
                public String getText(Object element) {
                    IType t = (IType) element;
                    return t.getElementName() + " - " + t.getPackageFragment().getElementName(); //$NON-NLS-1$
                }
            });
            viewer.setContentProvider(new ArrayContentProvider());
            List<IType> types = getTypes();
            viewer.setInput(types);
            viewer.getControl().setLayoutData(new GridData(GridData.FILL_HORIZONTAL));

            Button button = new Button(parent, SWT.PUSH);
            button.setText(Messages.FXMLWizardPage_6);
            button.addSelectionListener(new SelectionAdapter() {
                @Override
                public void widgetSelected(SelectionEvent e) {
                    IType type = findContainerType();
                    if (type != null) {
                        FXMLWizardPage.this.customSelection = type;
                        viewer.setInput(getTypes());
                        viewer.setSelection(new StructuredSelection(type));
                    }
                }
            });

            FXMLElement element = getClazz();
            element.addPropertyChangeListener(new PropertyChangeListener() {

                @Override
                public void propertyChange(PropertyChangeEvent evt) {
                    if ("fragmentRoot".equals(evt.getPropertyName())) { //$NON-NLS-1$
                        viewer.setInput(getTypes());
                    }
                }
            });
            dbc.bindValue(ViewerProperties.singleSelection().observe(viewer),
                    BeanProperties.value("rootElement").observe(getClazz())); //$NON-NLS-1$

            if (types.size() > 0) {
                viewer.setSelection(new StructuredSelection(types.get(0)));
            }
        }

        {
            Label l = new Label(parent, SWT.NONE);
            l.setText(Messages.FXMLWizardPage_9);

            Button b = new Button(parent, SWT.CHECK);
            dbc.bindValue(WidgetProperties.selection().observe(b),
                    BeanProperties.value("fxRoot").observe(getClazz())); //$NON-NLS-1$
        }
    }

    IType findContainerType() {
        if (getClazz().getFragmentRoot() != null) {
            IJavaProject project = getClazz().getFragmentRoot().getJavaProject();

            try {
                IType superType = project.findType("javafx.scene.Parent"); //$NON-NLS-1$

                if (superType != null) {
                    IJavaSearchScope searchScope = SearchEngine.createStrictHierarchyScope(project, superType, true,
                            false, null);

                    SelectionDialog dialog = JavaUI.createTypeDialog(getShell(),
                            PlatformUI.getWorkbench().getProgressService(), searchScope,
                            IJavaElementSearchConstants.CONSIDER_CLASSES, false, ""); //$NON-NLS-1$
                    dialog.setTitle(Messages.FXMLWizardPage_3);
                    if (dialog.open() == Window.OK) {
                        IType type = (IType) dialog.getResult()[0];
                        return type;
                    }
                }
            } catch (JavaModelException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }

        return null;
    }

    @Override
    protected void revalidate() {
        if (getClazz().getName() == null || getClazz().getName().trim().length() == 0) {
            setPageComplete(false);
            setMessage(Messages.FXMLWizardPage_2, IMessageProvider.ERROR);
        } else if (getClazz().getRootElement() == null) {
            setPageComplete(false);
            setMessage(Messages.FXMLWizardPage_10, IMessageProvider.ERROR);
        } else if (Character.isLowerCase(getClazz().getName().charAt(0))) {
            setPageComplete(true);
            setMessage(Messages.FXMLWizardPage_5, IMessageProvider.WARNING);
        } else {
            setPageComplete(true);
            setMessage(null);
        }
    }

    List<IType> getTypes() {
        List<IType> list = new ArrayList<IType>();

        if (getClazz().getFragmentRoot() != null) {
            IJavaProject jp = getClazz().getFragmentRoot().getJavaProject();

            if (this.customSelection != null) {
                try {
                    IType t = jp.findType(this.customSelection.getFullyQualifiedName());
                    if (t != null && !list.contains(t)) {
                        list.add(t);
                    }
                } catch (JavaModelException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
            }

            if (getDialogSettings() != null) {
                if (getDialogSettings().getArray(NewFXMLWizard.KEY_LAST_SELECTIONS) != null) {
                    for (String s : getDialogSettings().getArray(NewFXMLWizard.KEY_LAST_SELECTIONS)) {
                        try {
                            IType t = jp.findType(s);
                            if (t != null && !list.contains(t)) {
                                list.add(t);
                            }
                        } catch (JavaModelException e) {
                            // TODO Auto-generated catch block
                            e.printStackTrace();
                        }
                    }
                }
            }

            for (String s : new String[] { "javafx.scene.layout.AnchorPane", //$NON-NLS-1$
                    "javafx.scene.layout.BorderPane", //$NON-NLS-1$
                    "javafx.scene.layout.FlowPane", //$NON-NLS-1$
                    "javafx.scene.layout.GridPane", //$NON-NLS-1$
                    "javafx.scene.layout.HBox", //$NON-NLS-1$
                    "javafx.scene.layout.Region", //$NON-NLS-1$
                    "javafx.scene.layout.StackPane", //$NON-NLS-1$
                    "javafx.scene.layout.TilePane", //$NON-NLS-1$
                    "javafx.scene.layout.VBox", //$NON-NLS-1$
                    "javafx.scene.Scene" //$NON-NLS-1$
            }) {
                try {
                    IType t = jp.findType(s);
                    if (t != null && !list.contains(t)) {
                        list.add(t);
                    }
                } catch (JavaModelException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
            }
        }

        return list;
    }

    @Override
    protected FXMLElement createInstance() {
        return new FXMLElement();
    }
}