/* * 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.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; } }