blob: d78b29a72f7c454f208455f4ba011600c2f966d0 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2008-2010 Sonatype, Inc.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License 2.0
* which accompanies this distribution, and is available at
* https://www.eclipse.org/legal/epl-2.0/
*
* SPDX-License-Identifier: EPL-2.0
*
* Contributors:
* Sonatype, Inc. - initial API and implementation
*******************************************************************************/
package org.eclipse.m2e.core.ui.internal.wizards;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.LinkedHashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
import org.eclipse.core.resources.IResource;
import org.eclipse.core.resources.ResourcesPlugin;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.jface.dialogs.DialogSettings;
import org.eclipse.jface.dialogs.IDialogSettings;
import org.eclipse.jface.wizard.WizardPage;
import org.eclipse.osgi.util.NLS;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.widgets.Combo;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.m2e.core.internal.MavenPluginActivator;
import org.eclipse.m2e.core.project.ProjectImportConfiguration;
import org.eclipse.m2e.core.ui.internal.M2EUIPluginActivator;
import org.eclipse.m2e.core.ui.internal.Messages;
/**
* AbstractMavenImportWizardPage
*
* @author Eugene Kuleshov
*/
public abstract class AbstractMavenWizardPage extends WizardPage {
/** the history limit */
protected static final int MAX_HISTORY = 15;
/**
* The project import configuration
*/
private ProjectImportConfiguration importConfiguration;
/** The resolver configuration panel */
protected ResolverConfigurationComponent resolverConfigurationComponent;
/** dialog settings to store input history */
protected IDialogSettings dialogSettings;
/** the Map of field ids to List of comboboxes that share the same history */
private Map<String, List<Combo>> fieldsWithHistory;
private boolean isHistoryLoaded = false;
/** @wbp.parser.constructor */
protected AbstractMavenWizardPage(String pageName) {
this(pageName, null);
}
/**
* Creates a page. This constructor should be used for the wizards where you need to have the advanced settings box on
* each page. Pass the same bean to each page so they can share the data.
*/
protected AbstractMavenWizardPage(String pageName, ProjectImportConfiguration importConfiguration) {
super(pageName);
this.importConfiguration = importConfiguration;
fieldsWithHistory = new HashMap<String, List<Combo>>();
initDialogSettings();
}
public ProjectImportConfiguration getImportConfiguration() {
return this.importConfiguration;
}
/** Creates an advanced settings panel. */
protected void createAdvancedSettings(Composite composite, GridData gridData) {
if(importConfiguration != null) {
// Label separator = new Label(composite, SWT.HORIZONTAL | SWT.SEPARATOR);
// GridData separatorData = new GridData(SWT.FILL, SWT.TOP, false, false, gridData.horizontalSpan, 1);
// separatorData.verticalIndent = 7;
// separator.setLayoutData(separatorData);
gridData.verticalIndent = 7;
resolverConfigurationComponent = new ResolverConfigurationComponent(composite, importConfiguration, true);
resolverConfigurationComponent.setLayoutData(gridData);
addFieldWithHistory("projectNameTemplate", resolverConfigurationComponent.template); //$NON-NLS-1$
}
}
/** Loads the advanced settings data when the page is displayed. */
public void setVisible(boolean visible) {
if(visible) {
if(!isHistoryLoaded) {
// load data before history kicks in
if(resolverConfigurationComponent != null) {
resolverConfigurationComponent.loadData();
}
loadInputHistory();
isHistoryLoaded = true;
} else {
saveInputHistory();
}
if(resolverConfigurationComponent != null) {
resolverConfigurationComponent.loadData();
}
}
super.setVisible(visible);
}
/** Saves the history when the page is disposed. */
public void dispose() {
saveInputHistory();
super.dispose();
}
/** Loads the dialog settings using the page name as a section name. */
private void initDialogSettings() {
IDialogSettings pluginSettings;
// This is strictly to get SWT Designer working locally without blowing up.
if(MavenPluginActivator.getDefault() == null) {
pluginSettings = new DialogSettings("Workbench");
} else {
pluginSettings = M2EUIPluginActivator.getDefault().getDialogSettings();
}
dialogSettings = pluginSettings.getSection(getName());
if(dialogSettings == null) {
dialogSettings = pluginSettings.addNewSection(getName());
pluginSettings.addSection(dialogSettings);
}
}
/** Loads the input history from the dialog settings. */
private void loadInputHistory() {
for(Map.Entry<String, List<Combo>> e : fieldsWithHistory.entrySet()) {
String id = e.getKey();
String[] items = dialogSettings.getArray(id);
if(items != null) {
for(Combo combo : e.getValue()) {
String text = combo.getText();
combo.setItems(items);
if(text.length() > 0) {
// setItems() clears the text input, so we need to restore it
combo.setText(text);
}
}
}
}
}
/** Saves the input history into the dialog settings. */
private void saveInputHistory() {
for(Map.Entry<String, List<Combo>> e : fieldsWithHistory.entrySet()) {
String id = e.getKey();
Set<String> history = new LinkedHashSet<String>(MAX_HISTORY);
for(Combo combo : e.getValue()) {
String lastValue = combo.getText();
if(lastValue != null && lastValue.trim().length() > 0) {
history.add(lastValue);
}
}
Combo combo = e.getValue().iterator().next();
String[] items = combo.getItems();
for(int j = 0; j < items.length && history.size() < MAX_HISTORY; j++ ) {
history.add(items[j]);
}
dialogSettings.put(id, history.toArray(new String[history.size()]));
}
}
/** Adds an input control to the list of fields to save. */
protected void addFieldWithHistory(String id, Combo combo) {
if(combo != null) {
List<Combo> combos = fieldsWithHistory.get(id);
if(combos == null) {
combos = new ArrayList<Combo>();
fieldsWithHistory.put(id, combos);
}
combos.add(combo);
}
}
protected String validateArtifactIdInput(String text) {
return validateIdInput(text, true);
}
protected String validateGroupIdInput(String text) {
return validateIdInput(text, false);
}
private String validateIdInput(String text, boolean artifact) {
if(text == null || text.length() == 0) {
return artifact ? Messages.wizardProjectPageMaven2ValidatorArtifactID
: Messages.wizardProjectPageMaven2ValidatorGroupID;
}
if(text.contains(" ")) { //$NON-NLS-1$
return artifact ? Messages.wizardProjectPageMaven2ValidatorArtifactIDnospaces
: Messages.wizardProjectPageMaven2ValidatorGroupIDnospaces;
}
IStatus nameStatus = ResourcesPlugin.getWorkspace().validateName(text, IResource.PROJECT);
if(!nameStatus.isOK()) {
return NLS.bind(artifact ? Messages.wizardProjectPageMaven2ValidatorArtifactIDinvalid
: Messages.wizardProjectPageMaven2ValidatorGroupIDinvalid, nameStatus.getMessage());
}
if(!text.matches("[A-Za-z0-9_\\-.]+")) { //$NON-NLS-1$
return NLS.bind(artifact ? Messages.wizardProjectPageMaven2ValidatorArtifactIDinvalid
: Messages.wizardProjectPageMaven2ValidatorGroupIDinvalid, text);
}
return null;
}
}