/*******************************************************************************
* Copyright (c) 2013 Red Hat Inc. 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:
* Neil Guzman - initial API and implementation
*******************************************************************************/
package org.eclipse.linuxtools.internal.rpm.createrepo.wizard;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import org.eclipse.jface.wizard.WizardPage;
import org.eclipse.linuxtools.internal.rpm.createrepo.ICreaterepoConstants;
import org.eclipse.linuxtools.internal.rpm.createrepo.Messages;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.ModifyListener;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Text;
/**
* This page allows the user to initialize the .repo file
* for the repository with the mandatory options: id, name, and
* base url.
*/
public class CreaterepoNewWizardPageTwo extends WizardPage {
private Text repositoryIDTxt;
private Text repositoryNameTxt;
private Text repositoryBaseURLTxt;
/**
* Constructor for CreaterepoWizardPage. Will set the page name, title, and
* description.
*
* @param pageName The wizard page's name.
*/
public CreaterepoNewWizardPageTwo(String pageName) {
super(pageName);
setTitle(Messages.CreaterepoNewWizardPageTwo_wizardPageTitle);
setDescription(Messages.CreaterepoNewWizardPageTwo_wizardPageDescription);
setPageComplete(false);
}
@Override
public void createControl(Composite parent) {
Composite container = new Composite(parent, SWT.NONE);
GridLayout layout = new GridLayout();
GridData layoutData = new GridData();
layoutData.grabExcessHorizontalSpace = true;
layoutData.grabExcessVerticalSpace = true;
layoutData.horizontalAlignment = GridData.FILL;
layoutData.verticalAlignment = GridData.FILL;
container.setLayout(layout);
container.setLayoutData(layoutData);
// composite to hold the required information
Composite information = new Composite(container, SWT.NONE);
layout = new GridLayout(2, false);
layoutData = new GridData();
layoutData.grabExcessHorizontalSpace = true;
layoutData.horizontalAlignment = GridData.FILL;
layoutData.verticalAlignment = GridData.CENTER;
information.setLayoutData(layoutData);
information.setLayout(layout);
// listen on modifying the Text widgets
ModifyListener modifyListner = e -> setPageComplete(isValid());
repositoryIDTxt = createTextFieldWithLabel(information, Messages.CreaterepoNewWizardPageTwo_labelID,
Messages.CreaterepoNewWizardPageTwo_tooltipID);
repositoryIDTxt.addModifyListener(modifyListner);
repositoryNameTxt = createTextFieldWithLabel(information, Messages.CreaterepoNewWizardPageTwo_labelName,
Messages.CreaterepoNewWizardPageTwo_tooltipName);
repositoryNameTxt.addModifyListener(modifyListner);
repositoryBaseURLTxt = createTextFieldWithLabel(information, Messages.CreaterepoNewWizardPageTwo_labelURL,
Messages.CreaterepoNewWizardPageTwo_tooltipURL);
repositoryBaseURLTxt.addModifyListener(modifyListner);
setControl(container);
}
/**
* Create a text field with a label.
*
* @param parent The parent of the text field and label.
* @param labelName The name on the label.
* @return The newly created text field.
*/
protected Text createTextFieldWithLabel(Composite parent, String labelName, String tooltip) {
// create the label
Label respositoryBaseURLLbl = new Label(parent, SWT.NONE);
respositoryBaseURLLbl.setText(labelName);
GridData layoutData = new GridData();
layoutData.horizontalAlignment = GridData.BEGINNING;
layoutData.verticalAlignment = GridData.CENTER;
respositoryBaseURLLbl.setToolTipText(tooltip);
// create the text field
Text textField = new Text(parent, SWT.BORDER | SWT.SINGLE);
layoutData = new GridData();
layoutData.grabExcessHorizontalSpace = true;
layoutData.horizontalAlignment = GridData.FILL;
layoutData.verticalAlignment = GridData.CENTER;
textField.setLayoutData(layoutData);
textField.setToolTipText(tooltip);
return textField;
}
/**
* Check to see if all the text fields are valid. Otherwise, set error
* messages appropriately.
*
* @return True if all the text fields are valid, false otherwise.
*/
protected boolean isValid() {
if (!validateID()) {
setErrorMessage(Messages.CreaterepoNewWizardPageTwo_errorID);
}
if (repositoryNameTxt.getText().trim().isEmpty()) {
setErrorMessage(Messages.CreaterepoNewWizardPageTwo_errorName);
}
if (!validateURL()) {
setErrorMessage(Messages.CreaterepoNewWizardPageTwo_errorURL);
}
if (validateID() && validateURL() && !repositoryNameTxt.getText().trim().isEmpty()) {
setErrorMessage(null);
return true;
} else {
return false;
}
}
/**
* Check if the ID is valid. It is valid if it is a single string and
* not empty.
*
* @return True if the ID is valid, false otherwise.
*/
private boolean validateID() {
// check if repository ID is a single string
String tmpRepoID = repositoryIDTxt.getText().trim();
Pattern singleStringPattern = Pattern.compile("\\b(\\S+)\\b", //$NON-NLS-1$
Pattern.CASE_INSENSITIVE);
Matcher singleStringMatcher = singleStringPattern.matcher(tmpRepoID);
if (singleStringMatcher.matches()) {
return true;
}
return false;
}
/**
* Check if the URL is valid. It is valid if it contains a valid protocol and link.
*
* @return True if the URL is valid, false otherwise.
*/
private boolean validateURL() {
// check if baseURL is a valid URL
String tmpRepoURL = repositoryBaseURLTxt.getText().trim();
// TODO: possibly validate if pointing to something that exists (not really necessary, but nice)
try {
new URL(tmpRepoURL);
return true;
} catch (MalformedURLException e) {
return false;
}
}
public String getRepositoryID() {
if (repositoryIDTxt == null) {
return ICreaterepoConstants.EMPTY_STRING;
}
return repositoryIDTxt.getText().trim();
}
public String getRepositoryName() {
if (repositoryNameTxt == null) {
return ICreaterepoConstants.EMPTY_STRING;
}
return repositoryNameTxt.getText().trim();
}
public String getRepositoryURL() {
if (repositoryBaseURLTxt == null) {
return ICreaterepoConstants.EMPTY_STRING;
}
return repositoryBaseURLTxt.getText().trim();
}
}