diff -r 000000000000 -r fb279309251b core/com.nokia.carbide.bugreport/src/com/nokia/carbide/internal/bugreport/ui/wizards/BugDescriptionPage.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/core/com.nokia.carbide.bugreport/src/com/nokia/carbide/internal/bugreport/ui/wizards/BugDescriptionPage.java Fri Apr 03 23:33:03 2009 +0100 @@ -0,0 +1,290 @@ +/* +* Copyright (c) 2007 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of the License "Eclipse Public License v1.0" +* which accompanies this distribution, and is available +* at the URL "http://www.eclipse.org/legal/epl-v10.html". +* +* Initial Contributors: +* Nokia Corporation - initial contribution. +* +* Contributors: +* +* Description: +* +*/ + +package com.nokia.carbide.internal.bugreport.ui.wizards; + +import java.io.File; +import java.util.Hashtable; +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.Composite; +import org.eclipse.swt.widgets.FileDialog; +import org.eclipse.swt.widgets.Label; +import org.eclipse.swt.widgets.Combo; +import org.eclipse.swt.widgets.Link; +import org.eclipse.swt.widgets.Text; +import org.eclipse.swt.widgets.Button; +import org.eclipse.ui.PlatformUI; +import org.eclipse.jface.wizard.WizardPage; +import org.eclipse.jface.dialogs.MessageDialog; +import com.nokia.carbide.internal.bugreport.export.IProduct; +import com.nokia.carbide.internal.bugreport.model.*; +import com.nokia.carbide.internal.bugreport.resources.HelpContextIDs; +import com.nokia.carbide.internal.bugreport.resources.Messages; + + +/** + * Details Description wizard page. This page is used entering issue type, summary, + * description and attachment file. + * + */ +public class BugDescriptionPage extends WizardPage implements SelectionListener, + ModifyListener { + Label typeLabel; + Combo typeCombo; + Label summaryLabel; + Text summaryText = null; + Label descriptionLabel; + Text descriptionText; + Label attachmentLabel; + Text attachmentText; + Button browseButton; + Link uiServiceLink; + IProduct product = null; + long maxAttachmentSize = 1024*1024; // megabyte + + public BugDescriptionPage(){ + super(Messages.getString("BugDescriptionPage.BugReporting")); //$NON-NLS-1$ + + // User cannot finish the page before some valid + // selection is made. + setPageComplete(false); + } + + /** + * Sets the product for this page. + * @param prdct product plug-in + */ + public void setProduct(IProduct prdct) { + if (prdct == null) + return; + + product = prdct; + + setTitle(product.getPageTitleText()); + setDescription(product.getPageDescriptionText()); + maxAttachmentSize = product.getMaxAttachmentSize(); + + // if page is constructed. + if (summaryText != null) { + summaryText.setTextLimit(product.getMaxSummaryLength()); + descriptionLabel.setText(product.getDescriptionLabelText()); + descriptionText.setTextLimit(product.getMaxDescriptionLength()); + String linkText = product.getUiServiceLinkText(); + if (linkText == null || linkText == "") { //$NON-NLS-1$ + uiServiceLink.setVisible(false); + } else { + uiServiceLink.setVisible(true); + uiServiceLink.setText(""+linkText+""); //$NON-NLS-1$ //$NON-NLS-2$ + } + + } + } + + public void createControl(Composite parent) { + Composite composite = new Composite(parent, SWT.NULL); + + // create the desired layout for this wizard page + GridLayout gl = new GridLayout(); + gl.numColumns = 2; + composite.setLayout(gl); + + GridData twoColumnGridData = new GridData(GridData.FILL_HORIZONTAL); + twoColumnGridData.horizontalSpan = 2; + + typeLabel = new Label(composite, SWT.LEFT); + typeLabel.setText(Messages.getString("BugDescriptionPage.Type")); //$NON-NLS-1$ + typeLabel.setLayoutData(twoColumnGridData); + + typeCombo = new Combo(composite, SWT.READ_ONLY); + typeCombo.setItems(new String[] {Messages.getString("BugDescriptionPage.Defect"), //$NON-NLS-1$ + Messages.getString("BugDescriptionPage.Enhancement")}); //$NON-NLS-1$ + typeCombo.select(0); + GridData comboGD = new GridData(); + comboGD.horizontalSpan = 2; + typeCombo.setLayoutData(comboGD); + + summaryLabel = new Label(composite, SWT.LEFT); + summaryLabel.setText(Messages.getString("BugDescriptionPage.ShortSummary")); //$NON-NLS-1$ + summaryLabel.setLayoutData(twoColumnGridData); + + summaryText = new Text(composite, SWT.SINGLE | SWT.BORDER); + GridData summaryTextGD = new GridData(GridData.FILL_HORIZONTAL); + summaryTextGD.horizontalSpan = 2; + summaryText.setLayoutData(summaryTextGD); + summaryText.addModifyListener(this); + if (product == null) { + summaryText.setTextLimit(255); + } else { + summaryText.setTextLimit(product.getMaxSummaryLength()); + } + + descriptionLabel = new Label(composite, SWT.LEFT | SWT.WRAP); + if (product == null) { + descriptionLabel.setText(Messages.getString("BugDescriptionPage.Description")); //$NON-NLS-1$ + } else { + descriptionLabel.setText(product.getDescriptionLabelText()); + } + descriptionLabel.setLayoutData(twoColumnGridData); + + descriptionText = new Text(composite, SWT.MULTI | SWT.BORDER); + if (product == null) { + descriptionText.setTextLimit(1000); + } else { + descriptionText.setTextLimit(product.getMaxDescriptionLength()); + } + GridData descriptionGD = new GridData(GridData.FILL_BOTH); + descriptionGD.horizontalSpan = 2; + descriptionText.setLayoutData(descriptionGD); + descriptionText.addModifyListener(this); + + attachmentLabel = new Label(composite, SWT.LEFT); + attachmentLabel.setText(Messages.getString("BugDescriptionPage.AttachmentFile")); //$NON-NLS-1$ + attachmentLabel.setLayoutData(twoColumnGridData); + + attachmentText = new Text(composite, SWT.SINGLE | SWT.BORDER); + attachmentText.setTextLimit(1000); + GridData single = new GridData(GridData.FILL_HORIZONTAL); + attachmentText.setLayoutData(single); + attachmentText.addModifyListener(this); + + browseButton = new Button(composite, SWT.PUSH); + browseButton.setText(Messages.getString("BugDescriptionPage.Browse")); //$NON-NLS-1$ + browseButton.addSelectionListener(this); + + uiServiceLink = new Link(composite, SWT.NONE); + uiServiceLink.addSelectionListener(this); + if (product == null) { + uiServiceLink.setVisible(false); + } else { + String linkText = product.getUiServiceLinkText(); + if (linkText == null || linkText == "") { //$NON-NLS-1$ + uiServiceLink.setVisible(false); + } else { + uiServiceLink.setText(""+linkText+""); //$NON-NLS-1$ //$NON-NLS-2$ + } + } + + setControl(composite); + + PlatformUI.getWorkbench().getHelpSystem().setHelp(parent, HelpContextIDs.BUG_DESCRIPTION_PAGE); + } + + public void widgetDefaultSelected(SelectionEvent arg0) { + } + + public void widgetSelected(SelectionEvent event) { + if (event.widget == browseButton) { + FileDialog dialog = new FileDialog(this.getShell(), SWT.OPEN); + dialog.setText(Messages.getString("BugDescriptionPage.SelectAttachmentFile")); //$NON-NLS-1$ + String result = dialog.open(); + attachmentText.setText(result); + } else if (event.widget == uiServiceLink) { + product.showUiService(this.getShell()); + } + } + + public void modifyText(ModifyEvent arg0) { + try { + getWizard().getContainer().updateButtons(); + } catch (Exception e) { + e.printStackTrace(); + } + } + + @Override + public boolean canFlipToNextPage() { + + if (attachmentFileIsValidOrEmpty() && + summaryText.getText().length() > 0 && + descriptionText.getText().length() > 0) + return true; + + return false; + } + + /** + * Checks that the selected attachment file is a valid file (or + * no file is even selected) and that it's too big in size. + * @return true if attachment file is valid and not too big, otherwise false. + */ + boolean attachmentFileIsValidOrEmpty() { + String attachmentFilePath = attachmentText.getText(); + + // no attachment -> ok + if (attachmentFilePath.length() == 0) { + this.setErrorMessage(null); + return true; + // check that attachment file is ok + } else { + File file = new File(attachmentFilePath); + if (file.isFile() && file.exists() && file.length() <= maxAttachmentSize) { // file is ok + this.setErrorMessage(null); + return true; + } else if (!file.isFile() || !file.exists()) { // file does not exist or is a directory + this.setErrorMessage(Messages.getString("BugDescriptionPage.AttachmentFileIsInvalid")); //$NON-NLS-1$ + return false; + } else { // file is too big + if (maxAttachmentSize > 1024*1024) { // format error for megabyte size + this.setErrorMessage(Messages.getString("BugDescriptionPage.AttachmentTooBig1")+maxAttachmentSize/(1024*1024)+Messages.getString("BugDescriptionPage.MegaByte")); //$NON-NLS-1$ //$NON-NLS-2$ + } else if (maxAttachmentSize > 1024) { // format error for kilobyte size + this.setErrorMessage(Messages.getString("BugDescriptionPage.AttachmentTooBig2")+maxAttachmentSize/1024+Messages.getString("BugDescriptionPage.KiloByte")); //$NON-NLS-1$ //$NON-NLS-2$ + } else { // format error for byte size + this.setErrorMessage(Messages.getString("BugDescriptionPage.AttachmentTooBig3")+maxAttachmentSize+Messages.getString("BugDescriptionPage.Byte")); //$NON-NLS-1$ //$NON-NLS-2$ + } + return false; + } + } + } + + /** + * Returns the fields and their values (entered by user) which are to + * be sent to the server. + * @return fields and values which need to be sent to server + */ + public Hashtable getFields() { + Hashtable fields = new Hashtable(); + fields.put(FieldsHandler.FIELD_SUMMARY, summaryText.getText()); + fields.put(FieldsHandler.FIELD_DESCRIPTION, descriptionText.getText()); + fields.put(FieldsHandler.FIELD_TYPE, typeCombo.getText()); + if (attachmentText.getText().trim() != "") //$NON-NLS-1$ + fields.put(FieldsHandler.FIELD_ATTACHMENT, attachmentText.getText().trim()); + return fields; + } + + /** + * The product plug-in might need to ask user some settings before we can move to + * next page. This method asks the product if UI service is needed; if UI is needed, + * method queries the user if (s)he wants to provide the necessary information, and + * opens the product's UI if user wants to do so. + * @return true if we can move to next page, false if not. + */ + public boolean canChangePage() { + if (!product.uiServiceNeeded()) + return true; + + if (MessageDialog.openQuestion(this.getShell(), Messages.getString("BugDescriptionPage.BugReporting"), product.getUiServiceText())) //$NON-NLS-1$ + product.showUiService(this.getShell()); + + return false; + } +}