blob: c877b963e4545aa716a04c43f4a4b515a0f21d95 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2011, 2020 Red Hat, Inc.
*
* This program and the accompanying materials are made
* available under the terms of the Eclipse Public License 2.0
* which is available at https://www.eclipse.org/legal/epl-2.0/
*
* SPDX-License-Identifier: EPL-2.0
*
* Contributors:
* Alexander Kurtakov - initial API and implementation
*******************************************************************************/
package org.eclipse.linuxtools.internal.rpm.ui;
import java.util.ArrayList;
import java.util.List;
import org.eclipse.jface.viewers.ArrayContentProvider;
import org.eclipse.jface.viewers.ComboViewer;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.jface.viewers.ITreeSelection;
import org.eclipse.jface.viewers.TreePath;
import org.eclipse.linuxtools.rpm.core.RPMProjectLayout;
import org.eclipse.swt.SWT;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.Group;
import org.eclipse.swt.widgets.Label;
import org.eclipse.ui.IWorkingSet;
import org.eclipse.ui.PlatformUI;
import org.eclipse.ui.dialogs.WizardNewProjectCreationPage;
import org.eclipse.ui.dialogs.WorkingSetConfigurationBlock;
import org.osgi.framework.FrameworkUtil;
/**
* Standard page for project creation adding some rpm specific controls.
*
*/
public class NewProjectCreationPage extends WizardNewProjectCreationPage {
private ComboViewer typeCombo;
private final WorkingSetGroup wsGroup;
private static final IWorkingSet[] EMPTY_WORKING_SET_ARRAY = {};
/**
* Instantiate the page.
*
* @param pageName The name of the page.
*/
public NewProjectCreationPage(String pageName) {
super(pageName);
wsGroup = new WorkingSetGroup();
setWorkingSets(EMPTY_WORKING_SET_ARRAY);
}
/**
* The wizard owning this page can call this method to initialise fields using
* the current selection.
*
* @param selection the current object selection
*/
public void init(IStructuredSelection selection) {
setWorkingSets(getSelectedWorkingSet(selection));
}
@Override
public void createControl(Composite parent) {
super.createControl(parent);
Composite control = (Composite) getControl();
Composite projectTypeGroup = new Composite(control, SWT.NONE);
GridLayout layout = new GridLayout();
layout.numColumns = 2;
projectTypeGroup.setLayout(layout);
projectTypeGroup.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
Label typeLabel = new Label(projectTypeGroup, SWT.NONE);
typeLabel.setText(Messages.getString("SRPMImportPage.4")); //$NON-NLS-1$
GridData data = new GridData(GridData.FILL_HORIZONTAL);
data.grabExcessHorizontalSpace = true;
typeCombo = new ComboViewer(projectTypeGroup, SWT.READ_ONLY);
typeCombo.getControl().setLayoutData(data);
typeCombo.setContentProvider(ArrayContentProvider.getInstance());
typeCombo.setInput(RPMProjectLayout.values());
typeCombo.getCombo().select(0);
// Working set controls
Control workingSetControl = wsGroup.createControl(control);
workingSetControl.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
}
/**
* Returns the selected layout if any or the default one - RPMBUILD.
*
* @return The selected project layout.
*/
public RPMProjectLayout getSelectedLayout() {
return RPMProjectLayout.valueOf(typeCombo.getCombo().getItem(typeCombo.getCombo().getSelectionIndex()));
}
/**
* Returns the working sets to which the new project should be added.
*
* @return the selected working sets to which the new project should be added
*/
public IWorkingSet[] getWorkingSets() {
return wsGroup.getSelectedWorkingSets();
}
/**
* Sets the working sets to which the new project should be added.
*
* @param workingSets the initial selected working sets
*/
public void setWorkingSets(IWorkingSet[] workingSets) {
if (workingSets == null) {
wsGroup.setWorkingSets(EMPTY_WORKING_SET_ARRAY);
}
wsGroup.setWorkingSets(workingSets);
}
/**
* Try our best to set the working sets field to something sensible based on the
* current selection.
*/
private IWorkingSet[] getSelectedWorkingSet(IStructuredSelection selection) {
if (!(selection instanceof ITreeSelection)) {
return EMPTY_WORKING_SET_ARRAY;
}
ITreeSelection treeSelection = (ITreeSelection) selection;
if (treeSelection.isEmpty()) {
return EMPTY_WORKING_SET_ARRAY;
}
List<?> elements = treeSelection.toList();
if (elements.size() == 1) {
Object element = elements.get(0);
TreePath[] paths = treeSelection.getPathsFor(element);
if (paths.length != 1 || paths[0].getSegmentCount() == 0) {
return EMPTY_WORKING_SET_ARRAY;
}
Object candidate = paths[0].getSegment(0);
if (!(candidate instanceof IWorkingSet)) {
return EMPTY_WORKING_SET_ARRAY;
}
IWorkingSet workingSetCandidate = (IWorkingSet) candidate;
if (!workingSetCandidate.isAggregateWorkingSet()) {
return new IWorkingSet[] { workingSetCandidate };
}
return EMPTY_WORKING_SET_ARRAY;
}
ArrayList<IWorkingSet> result = new ArrayList<>();
for (Object element : elements) {
if (element instanceof IWorkingSet && !((IWorkingSet) element).isAggregateWorkingSet()) {
result.add((IWorkingSet) element);
}
}
if (!result.isEmpty()) {
return result.toArray(new IWorkingSet[result.size()]);
} else {
return EMPTY_WORKING_SET_ARRAY;
}
}
/**
* Little class to encapsulate the working set group of controls.
*/
private static final class WorkingSetGroup {
private WorkingSetConfigurationBlock workingSetBlock;
public WorkingSetGroup() {
String[] workingSetIds = { "org.eclipse.ui.resourceWorkingSetPage" }; //$NON-NLS-1$
workingSetBlock = new WorkingSetConfigurationBlock(workingSetIds,
PlatformUI.getDialogSettingsProvider(FrameworkUtil.getBundle(NewProjectCreationPage.class))
.getDialogSettings());
}
public Control createControl(Composite composite) {
Group workingSetGroup = new Group(composite, SWT.NONE);
workingSetGroup.setFont(composite.getFont());
workingSetGroup.setText(Messages.getString("NewProjectCreationPage.0")); //$NON-NLS-1$
workingSetGroup.setLayout(new GridLayout(1, false));
workingSetBlock.createContent(workingSetGroup);
return workingSetGroup;
}
public void setWorkingSets(IWorkingSet[] workingSets) {
workingSetBlock.setWorkingSets(workingSets);
}
public IWorkingSet[] getSelectedWorkingSets() {
return workingSetBlock.getSelectedWorkingSets();
}
}
}