/******************************************************************************* * Copyright (c) 2004, 2008 Tasktop Technologies 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: * Tasktop Technologies - initial API and implementation *******************************************************************************/ package org.eclipse.mylyn.examples.monitor.study; import java.io.File; import java.io.FileOutputStream; import java.io.IOException; import java.io.OutputStream; import org.eclipse.core.resources.ResourcesPlugin; import org.eclipse.core.runtime.IPath; import org.eclipse.core.runtime.IStatus; import org.eclipse.core.runtime.Status; import org.eclipse.jface.wizard.IWizardPage; import org.eclipse.jface.wizard.WizardPage; import org.eclipse.mylyn.commons.core.StatusHandler; import org.eclipse.mylyn.internal.monitor.usage.StudyParameters; import org.eclipse.mylyn.internal.monitor.usage.UiUsageMonitorPlugin; import org.eclipse.mylyn.internal.monitor.usage.wizards.UsageSubmissionWizard; import org.eclipse.swt.SWT; import org.eclipse.swt.events.ModifyEvent; import org.eclipse.swt.events.ModifyListener; import org.eclipse.swt.events.SelectionEvent; import org.eclipse.swt.events.SelectionListener; 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.Group; import org.eclipse.swt.widgets.Label; import org.eclipse.swt.widgets.Text; /** * Page to submit feedback for the user study * * @author Shawn Minto * @author Mik Kersten */ public class SubmitFeedbackPage extends WizardPage { private Text firstName; private Text lastName; private Text emailAddress; private Text feedback; private Text uid; private Button totallyAnonymous; private Button identifiedUserStudyId; private Button identifiedNameEmail; private String first; private String last; private String email; private String feed; private int id; private boolean anon; private boolean named; private final UsageSubmissionWizard uploadWizard; private final StudyParameters studyParameters; /** * Constructor */ public SubmitFeedbackPage(UsageSubmissionWizard uploadWizard, StudyParameters studyParameters) { super("Feedback Wizard"); this.studyParameters = studyParameters; setTitle("Submit feedback for Mylyn User Study"); // setDescription(QuestionnaireWizardPage.FEEDBACK_REQUEST); this.uploadWizard = uploadWizard; } /** * @see org.eclipse.jface.dialogs.IDialogPage#createControl(org.eclipse.swt.widgets.Composite) */ public void createControl(Composite parent) { Composite container = new Composite(parent, SWT.NULL); GridLayout layout = new GridLayout(); container.setLayout(layout); layout.numColumns = 1; Composite container2 = null; if (uploadWizard == null) { container2 = new Composite(container, SWT.NULL); layout = new GridLayout(2, false); container2.setLayout(layout); container2 = addSubmissionStyleControls(container2); } else { container2 = new Composite(container, SWT.NULL); layout = new GridLayout(2, true); container2.setLayout(layout); } Label label = new Label(container2, SWT.NONE); // HACK used to make the feedback column a nice width label.setText("Feedback: "); GridData gd = new GridData(GridData.GRAB_HORIZONTAL | GridData.FILL_BOTH); gd.horizontalSpan = 2; label.setLayoutData(gd); feedback = new Text(container2, SWT.BORDER | SWT.V_SCROLL | SWT.WRAP); gd = new GridData(GridData.GRAB_HORIZONTAL | GridData.FILL_BOTH | GridData.HORIZONTAL_ALIGN_FILL); gd.horizontalSpan = 2; gd.verticalSpan = 40; feedback.setLayoutData(gd); feedback.setEditable(true); feedback.addModifyListener(new ModifyListener() { public void modifyText(ModifyEvent e) { feed = feedback.getText(); SubmitFeedbackPage.this.setPageComplete(SubmitFeedbackPage.this.isPageComplete()); } }); setControl(container); } private Composite addSubmissionStyleControls(Composite container) { totallyAnonymous = new Button(container, SWT.RADIO); GridData gd = new GridData(GridData.HORIZONTAL_ALIGN_BEGINNING); totallyAnonymous.setLayoutData(gd); totallyAnonymous.setSelection(false); totallyAnonymous.addSelectionListener(new SelectionListener() { public void widgetSelected(SelectionEvent e) { if (e.widget == totallyAnonymous) { anon = true; named = false; boolean edit = !anon; firstName.setEditable(edit); lastName.setEditable(edit); emailAddress.setEditable(edit); SubmitFeedbackPage.this.setPageComplete(SubmitFeedbackPage.this.isPageComplete()); } } public void widgetDefaultSelected(SelectionEvent e) { // don't care about default selection } }); Group anonCont = new Group(container, SWT.SHADOW_ETCHED_IN); GridLayout layout = new GridLayout(1, true); layout.verticalSpacing = 9; layout.horizontalSpacing = 4; anonCont.setLayout(layout); anonCont.setText("Anonymous"); identifiedUserStudyId = new Button(container, SWT.RADIO); gd = new GridData(GridData.HORIZONTAL_ALIGN_BEGINNING); identifiedUserStudyId.setLayoutData(gd); identifiedUserStudyId.setSelection(false); identifiedUserStudyId.addSelectionListener(new SelectionListener() { public void widgetSelected(SelectionEvent e) { if (e.widget == identifiedUserStudyId) { anon = true; named = false; boolean edit = !anon; firstName.setEditable(edit); lastName.setEditable(edit); emailAddress.setEditable(edit); SubmitFeedbackPage.this.setPageComplete(SubmitFeedbackPage.this.isPageComplete()); } } public void widgetDefaultSelected(SelectionEvent e) { // don't care about default selection } }); Group idUserCont = new Group(container, SWT.SHADOW_ETCHED_IN); layout = new GridLayout(2, true); layout.verticalSpacing = 9; layout.horizontalSpacing = 4; idUserCont.setLayout(layout); idUserCont.setText("Identified By User Study Id"); Label label = new Label(idUserCont, SWT.NULL); label.setText("User Id:"); uid = new Text(idUserCont, SWT.BORDER | SWT.SINGLE); gd = new GridData(SWT.FILL, SWT.FILL, true, true); gd.horizontalSpan = 1; uid.setLayoutData(gd); uid.setEditable(false); id = UiUsageMonitorPlugin.getDefault().getPreferenceStore().getInt(studyParameters.getUserIdPreferenceId()); if (id == 0) { id = -1; } uid.setText(id + ""); identifiedNameEmail = new Button(container, SWT.RADIO); gd = new GridData(GridData.HORIZONTAL_ALIGN_BEGINNING); identifiedNameEmail.setLayoutData(gd); identifiedNameEmail.setSelection(false); identifiedNameEmail.addSelectionListener(new SelectionListener() { public void widgetSelected(SelectionEvent e) { if (e.widget == identifiedNameEmail) { anon = false; named = true; boolean edit = !anon; firstName.setEditable(edit); lastName.setEditable(edit); emailAddress.setEditable(edit); SubmitFeedbackPage.this.setPageComplete(SubmitFeedbackPage.this.isPageComplete()); } } public void widgetDefaultSelected(SelectionEvent e) { // don't care about default selection } }); Group idCont = new Group(container, SWT.SHADOW_ETCHED_IN); layout = new GridLayout(1, true); layout.verticalSpacing = 9; layout.horizontalSpacing = 4; idCont.setLayout(layout); idCont.setText("Identifed By Name and Email"); Composite names = new Composite(idCont, SWT.NULL); layout = new GridLayout(6, true); layout.verticalSpacing = 9; layout.horizontalSpacing = 4; names.setLayout(layout); label = new Label(names, SWT.NULL); label.setText("First Name:"); firstName = new Text(names, SWT.BORDER | SWT.SINGLE); gd = new GridData(SWT.FILL, SWT.FILL, true, true); gd.horizontalSpan = 2; firstName.setLayoutData(gd); firstName.setEditable(true); firstName.addModifyListener(new ModifyListener() { public void modifyText(ModifyEvent e) { first = firstName.getText(); SubmitFeedbackPage.this.setPageComplete(SubmitFeedbackPage.this.isPageComplete()); } }); label = new Label(names, SWT.NULL); label.setText("Last Name:"); lastName = new Text(names, SWT.BORDER | SWT.SINGLE); gd = new GridData(SWT.FILL, SWT.FILL, true, true); gd.horizontalSpan = 2; lastName.setLayoutData(gd); lastName.setEditable(true); lastName.addModifyListener(new ModifyListener() { public void modifyText(ModifyEvent e) { last = lastName.getText(); SubmitFeedbackPage.this.setPageComplete(SubmitFeedbackPage.this.isPageComplete()); } }); label = new Label(names, SWT.NONE); label.setText("Email Address:"); emailAddress = new Text(names, SWT.BORDER | SWT.SINGLE); gd = new GridData(GridData.GRAB_HORIZONTAL | GridData.FILL_BOTH); gd.horizontalSpan = 5; emailAddress.setLayoutData(gd); emailAddress.setEditable(true); emailAddress.addModifyListener(new ModifyListener() { public void modifyText(ModifyEvent e) { email = emailAddress.getText(); boolean valid = vaidateEmail(email); if (!valid) { SubmitFeedbackPage.this.setErrorMessage("Must be a valid e-mail address"); } else { SubmitFeedbackPage.this.setErrorMessage(null); } SubmitFeedbackPage.this.setPageComplete(SubmitFeedbackPage.this.isPageComplete()); } }); if (id == -1) { identifiedUserStudyId.setEnabled(false); identifiedNameEmail.setSelection(true); } else { identifiedUserStudyId.setSelection(true); firstName.setEditable(false); lastName.setEditable(false); emailAddress.setEditable(false); } return container; } private boolean vaidateEmail(String emailToVerify) { if (emailToVerify.contains("@")) { emailToVerify = emailToVerify.substring(emailToVerify.indexOf("@")); return emailToVerify.contains("."); } return false; } public boolean hasAllFields() { if (uploadWizard != null) { return (((!firstName.getText().equals("") && !lastName.getText().equals("") && !emailAddress.getText() .equals("")) || anon) && !feedback.getText().equals("")); } else { return !feedback.getText().equals(""); } } @Override public boolean isPageComplete() { if (hasAllFields() && this.getErrorMessage() == null) { return true; } else { return false; } } @Override public IWizardPage getNextPage() { return super.getNextPage(); } /** ONLY VALID IF WIZARD NOT STARTED FROM UPLOAD WIZARD */ public boolean isAnon() { return anon; } public int getUid() { if (anon || named) { return -1; } return id; } public String getStringUid() { if (anon) { return "anon"; } else if (named) { return "named"; } else { return "" + getUid(); } } /** ONLY VALID IF WIZARD NOT STARTED FROM UPLOAD WIZARD */ public String getEmailAddress() { if (anon) { return "null"; } return email; } /** ONLY VALID IF WIZARD NOT STARTED FROM UPLOAD WIZARD */ public String getFirstName() { if (anon) { return "null"; } return first; } /** ONLY VALID IF WIZARD NOT STARTED FROM UPLOAD WIZARD */ public String getLastName() { if (anon) { return "null"; } return last; } /** ONLY VALID IF WIZARD NOT STARTED FROM UPLOAD WIZARD */ public String getFeedback() { return feed; } public File createFeedbackFile() { IPath rootPath = ResourcesPlugin.getWorkspace().getRoot().getLocation(); String path = rootPath.toString() + File.separator + "feedback.txt"; File feedbackFile = new File(path); if (feedbackFile.exists()) { feedbackFile.delete(); } OutputStream outputStream; try { outputStream = new FileOutputStream(feedbackFile); String buffer = "First Name: " + getFirstName() + "\r\n"; outputStream.write(buffer.getBytes()); buffer = "Last Name: " + getLastName() + "\r\n"; outputStream.write(buffer.getBytes()); buffer = "E-mail Address: " + getEmailAddress() + "\r\n"; outputStream.write(buffer.getBytes()); buffer = "UID: " + getUid() + "\r\n"; outputStream.write(buffer.getBytes()); buffer = "Feedback: " + getFeedback() + "\r\n"; outputStream.write(buffer.getBytes()); outputStream.close(); return feedbackFile; } catch (IOException e) { StatusHandler.log(new Status(IStatus.ERROR, MylynUserStudyExamplePlugin.ID_PLUGIN, "Failed to submit", e)); } return null; } }