/*
* $Id$
*
* SARL is an general-purpose agent programming language.
* More details on http://www.sarl.io
*
* Copyright (C) 2014-2017 the original authors or authors.
*
* Licensed 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 io.sarl.eclipse.log;
import java.net.URL;
import java.text.MessageFormat;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.preferences.IEclipsePreferences;
import org.eclipse.debug.internal.ui.SWTFactory;
import org.eclipse.jface.dialogs.Dialog;
import org.eclipse.jface.dialogs.ErrorDialog;
import org.eclipse.jface.dialogs.IMessageProvider;
import org.eclipse.jface.wizard.IWizard;
import org.eclipse.jface.wizard.WizardDialog;
import org.eclipse.jface.wizard.WizardPage;
import org.eclipse.swt.SWT;
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.Composite;
import org.eclipse.swt.widgets.Link;
import org.eclipse.swt.widgets.Text;
import org.eclipse.ui.PartInitException;
import org.eclipse.ui.PlatformUI;
import org.eclipse.ui.browser.IWebBrowser;
import org.eclipse.xtext.util.Strings;
import org.osgi.service.prefs.BackingStoreException;
import io.sarl.eclipse.SARLEclipsePlugin;
/**
* Page for entering information on an issue to submit to the SARL tracker.
*
* @author $Author: sgalland$
* @version $FullVersion$
* @mavengroupid $GroupId$
* @mavenartifactid $ArtifactId$
* @since 0.5
*/
public class IssueInformationPage extends WizardPage {
/** Preference key that stores the Github login.
*/
public static final String PREFERENCE_LOGIN = IssueInformationPage.class.getName() + ".githubLogin"; //$NON-NLS-1$
private static final char ECHO_CHAR = '*';
private final URL link;
private Text titleField;
private Text descriptionField;
private Text trackerLogin;
private Text trackerPassword;
/** Constructor.
*
* @param link the link to put in the page.
*/
protected IssueInformationPage(URL link) {
super(Messages.IssueInformationPage_0);
this.link = link;
setTitle(Messages.SubmitEclipseLogWizard_0);
}
@Override
public void createControl(Composite parent) {
// create a composite with standard margins and spacing
final Composite composite = new Composite(parent, SWT.NONE);
final GridLayout layout = new GridLayout();
layout.numColumns = 2;
composite.setLayout(layout);
composite.setLayoutData(new GridData(GridData.FILL_BOTH));
if (this.link != null) {
final Link linkWidget = new Link(composite, SWT.BORDER);
linkWidget.setText(MessageFormat.format(Messages.IssueInformationPage_9, this.link.toString()));
linkWidget.setFont(composite.getFont());
final GridData gd = new GridData(GridData.FILL_HORIZONTAL);
gd.horizontalSpan = 2;
linkWidget.setLayoutData(gd);
linkWidget.addSelectionListener(new SelectionAdapter() {
@SuppressWarnings("synthetic-access")
@Override
public void widgetSelected(SelectionEvent event) {
try {
final IWebBrowser browser = PlatformUI.getWorkbench().getBrowserSupport().getExternalBrowser();
browser.openURL(IssueInformationPage.this.link);
final IWizard wizard = IssueInformationPage.this.getWizard();
if (wizard instanceof SubmitEclipseLogWizard) {
final WizardDialog dialog = ((SubmitEclipseLogWizard) wizard).getWizardDialog();
if (dialog != null) {
dialog.close();
}
}
} catch (PartInitException e) {
//
}
}
});
}
SWTFactory.createLabel(composite, Messages.IssueInformationPage_1, 1);
this.titleField = SWTFactory.createSingleText(composite, 1);
SWTFactory.createLabel(composite, Messages.IssueInformationPage_2, 1);
this.descriptionField = SWTFactory.createText(composite, SWT.MULTI | SWT.BORDER | SWT.WRAP | SWT.V_SCROLL, 1);
this.descriptionField.setLayoutData(new GridData(GridData.FILL_BOTH));
SWTFactory.createLabel(composite, Messages.IssueInformationPage_3, 1);
this.trackerLogin = SWTFactory.createSingleText(composite, 1);
SWTFactory.createLabel(composite, Messages.IssueInformationPage_4, 1);
this.trackerPassword = SWTFactory.createSingleText(composite, 1);
this.trackerPassword.setEchoChar(ECHO_CHAR);
//add the listeners now to prevent them from monkeying with initialized settings
this.titleField.addModifyListener((listeningEvent) -> {
updatePageStatus();
});
this.descriptionField.addModifyListener((listeningEvent) -> {
updatePageStatus();
});
this.trackerLogin.addModifyListener((listeningEvent) -> {
updatePageStatus();
});
this.trackerPassword.addModifyListener((listeningEvent) -> {
updatePageStatus();
});
Dialog.applyDialogFont(composite);
setControl(composite);
initFields();
updatePageStatus();
}
/** Replies the title of the issue.
*
* @return the title.
*/
public String getIssueTitle() {
return this.titleField.getText();
}
/** Replies the description of the issue.
*
* @return the description.
*/
public String getIssueDescription() {
return this.descriptionField.getText();
}
/** Replies the Github login.
*
* @return the login.
*/
public String getGithubLogin() {
return this.trackerLogin.getText();
}
/** Replies the Github password.
*
* @return the password.
*/
public String getGithubPassword() {
return this.trackerPassword.getText();
}
/** Set the initial values to the fields.
*/
protected void initFields() {
final IEclipsePreferences prefs = SARLEclipsePlugin.getDefault().getPreferences();
this.trackerLogin.setText(prefs.get(PREFERENCE_LOGIN, "")); //$NON-NLS-1$
}
/** Update the page status and change the "finish" state button.
*/
protected void updatePageStatus() {
final boolean ok;
if (Strings.isEmpty(this.titleField.getText())) {
ok = false;
setMessage(Messages.IssueInformationPage_5, IMessageProvider.ERROR);
} else if (Strings.isEmpty(this.trackerLogin.getText())) {
ok = false;
setMessage(Messages.IssueInformationPage_6, IMessageProvider.ERROR);
} else if (Strings.isEmpty(this.trackerPassword.getText())) {
ok = false;
setMessage(Messages.IssueInformationPage_7, IMessageProvider.ERROR);
} else {
ok = true;
if (Strings.isEmpty(this.descriptionField.getText())) {
setMessage(Messages.IssueInformationPage_8, IMessageProvider.WARNING);
} else {
setMessage(null, IMessageProvider.NONE);
}
}
setPageComplete(ok);
}
/** Invoked when the wizard is closed with the "Finish" button.
*
* @return {@code true} for closing the wizard; {@code false} for keeping it open.
*/
public boolean performFinish() {
final IEclipsePreferences prefs = SARLEclipsePlugin.getDefault().getPreferences();
final String login = this.trackerLogin.getText();
if (Strings.isEmpty(login)) {
prefs.remove(PREFERENCE_LOGIN);
} else {
prefs.put(PREFERENCE_LOGIN, login);
}
try {
prefs.sync();
return true;
} catch (BackingStoreException e) {
ErrorDialog.openError(getShell(), e.getLocalizedMessage(), e.getLocalizedMessage(),
SARLEclipsePlugin.getDefault().createStatus(IStatus.ERROR, e));
return false;
}
}
}