Package org.apache.sling.ide.eclipse.ui.propertyPages

Source Code of org.apache.sling.ide.eclipse.ui.propertyPages.SlingProjectPropertyPage

/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements.  See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You 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.apache.sling.ide.eclipse.ui.propertyPages;

import java.util.List;

import org.apache.sling.ide.eclipse.core.ProjectUtil;
import org.apache.sling.ide.eclipse.core.internal.Activator;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.resources.IResource;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IPath;
import org.eclipse.core.runtime.NullProgressMonitor;
import org.eclipse.core.runtime.Path;
import org.eclipse.jface.dialogs.Dialog;
import org.eclipse.jface.preference.IPreferenceNode;
import org.eclipse.jface.preference.PreferenceDialog;
import org.eclipse.jface.preference.PreferenceManager;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.ModifyEvent;
import org.eclipse.swt.events.ModifyListener;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
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.Control;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.swt.widgets.Text;
import org.eclipse.ui.dialogs.ContainerSelectionDialog;
import org.eclipse.ui.dialogs.ISelectionValidator;
import org.eclipse.ui.dialogs.PreferencesUtil;
import org.eclipse.ui.dialogs.PropertyPage;
import org.eclipse.ui.internal.dialogs.PropertyPageContributorManager;
import org.eclipse.ui.internal.dialogs.PropertyPageManager;

public class SlingProjectPropertyPage extends PropertyPage {

    private static final String PAGE_ID = "org.apache.sling.ide.projectPropertyPage";
    private static final String PAGE_ID_OVERRIDE = PAGE_ID + ".override";

    public static void openPropertyDialog(Shell shell, IProject project) {

        // find out if the override page is contributed, and show that instead of the default one
        // TODO - stop relying on internals

        PropertyPageManager pageManager = new PropertyPageManager();
        PropertyPageContributorManager.getManager().contribute(pageManager, project);

        List<?> nodes = pageManager.getElements(PreferenceManager.PRE_ORDER);
        boolean overridePresent = false;
        for (Object node : nodes) {
            if (((IPreferenceNode) node).getId().equals(PAGE_ID_OVERRIDE)) {
                overridePresent = true;
                break;
            }
        }

        String pageId = overridePresent ? PAGE_ID_OVERRIDE : PAGE_ID;

        PreferenceDialog dialog = PreferencesUtil.createPropertyDialogOn(shell, project,
                pageId, new String[] { pageId }, null);
        dialog.open();
    }

    private Text folderText;

    @Override
    protected Control createContents(Composite parent) {

        Composite c = new Composite(parent, SWT.NONE);

        c.setLayout(new GridLayout(3, false));

        new Label(c, SWT.NONE).setText("Content sync root directory");
        folderText = new Text(c, SWT.BORDER);
        folderText.setLayoutData(new GridData(SWT.FILL, SWT.TOP, true, false));
        folderText.setText(ProjectUtil.getSyncDirectoryValue(getProject()).toString());

        folderText.addModifyListener(new ModifyListener() {

            @Override
            public void modifyText(ModifyEvent e) {
                updateApplyButton();
            }
        });

        Button browseButton = new Button(c, SWT.PUSH);
        browseButton.setText("Browse...");
        browseButton.addSelectionListener(new SelectionAdapter() {
            @Override
            public void widgetSelected(SelectionEvent e) {
                final IProject project = getProject();
                ContainerSelectionDialog dialog = new ContainerSelectionDialog(getShell(), project, false, null);
                dialog.showClosedProjects(false);
                dialog.setValidator(new ISelectionValidator() {

                    @Override
                    public String isValid(Object selection) {

                        if (!(selection instanceof IPath)) {
                            return null;
                        }

                        IPath path = (IPath) selection;
                        if (project.getFullPath().isPrefixOf(path)) {
                            return null;
                        }

                        return "The folder must be contained in the " + project.getName() + " project";
                    }
                });

                dialog.open();

                Object[] results = dialog.getResult();
                if (results == null) {
                    return;
                }

                IPath selectedPath = (IPath) results[0];
                folderText.setText(selectedPath.removeFirstSegments(1).toString());
            }
        });

        Dialog.applyDialogFont(c);

        return c;
    }

    @Override
    public boolean isValid() {

        String path = folderText.getText();
        IResource member = getProject().findMember(path);

        if (member == null) {
            setErrorMessage("Resource " + path + " is not a part of project " + getProject().getName());
            return false;
        } else if (member.getType() != IResource.FOLDER) {
            setErrorMessage("Resource " + path + " is not a folder");
            return false;
        }

        setErrorMessage(null);

        return true;
    }

    @Override
    public boolean performOk() {

        try {
            ProjectUtil.setSyncDirectoryPath(getProject(), new Path(folderText.getText()));
            getProject().refreshLocal(IResource.DEPTH_INFINITE, new NullProgressMonitor());
        } catch (Exception e) {
            setErrorMessage("Could not refresh project "+getProject()+", "+e);
            return false;
        } catch(Error er) {
            Activator.getDefault().getPluginLogger().error("Error occurred: "+er, er);
            // rethrow though
            throw er;
        }

        return super.performOk();
    }

    private IProject getProject() {
        IProject project = (IProject) getElement().getAdapter(IProject.class);
        return project;
    }
}
TOP

Related Classes of org.apache.sling.ide.eclipse.ui.propertyPages.SlingProjectPropertyPage

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.