/*******************************************************************************
 * Copyright (c) 2000, 2003 IBM Corporation and others.
 * All rights reserved. This program and the accompanying materials 
 * are made available under the terms of the Common Public License v1.0
 * which accompanies this distribution, and is available at
 * http://www.eclipse.org/legal/cpl-v10.html
 * 
 * Contributors:
 *     IBM Corporation - initial API and implementation
 *******************************************************************************/
package org.eclipse.ui.tests.dialogs;

import java.util.ResourceBundle;

import junit.framework.TestCase;

import org.eclipse.swt.widgets.Shell;

import org.eclipse.jface.dialogs.Dialog;
import org.eclipse.jface.dialogs.IDialogConstants;
import org.eclipse.jface.dialogs.MessageDialog;
import org.eclipse.jface.resource.JFaceResources;

import org.eclipse.ui.internal.WorkbenchMessages;
import org.eclipse.ui.tests.util.DialogCheck;


public class UIMessageDialogsAuto extends TestCase {
	private static final String DUMMY_RESOURCE = "Dummy.resource";
	private static final String DUMMY_PROJECT = "DummyProject";
	private static final String DUMMY_ABSOLUTE_PATH = "C:\\Dummypath\\Dummy.resource";
	private static final String DUMMY_RELATIVE_PATH = "\\" + DUMMY_PROJECT + "\\" + DUMMY_RESOURCE;
	
	public UIMessageDialogsAuto(String name) {
		super(name);
	}
	private Shell getShell() {
		return DialogCheck.getShell();
	}
	
	/*
	 * Convenience method simliar to org.eclipse.jface.dialogs.MessageDialog::openConfirm.
	 * The method will return the dialog instead of opening.
	 * @param title the dialog's title, or <code>null</code> if none.
	 * @param message the message.
	 * @return Dialog the confirm dialog.
	 */
	private MessageDialog getConfirmDialog(String title, String message) {
		return new MessageDialog(
			getShell(), 
			title, 
			null,
			message, 
			MessageDialog.QUESTION, 
			new String[] {IDialogConstants.OK_LABEL, IDialogConstants.CANCEL_LABEL}, 
			0);
	}
	/*
	 * Convenience method simliar to org.eclipse.jface.dialogs.MessageDialog::openError.
	 * The method will return the dialog instead of opening.
	 * @param title the dialog's title, or <code>null</code> if none.
	 * @param message the message.
	 * @return MessageDialog the error confirm dialog.
	 */
	private MessageDialog getErrorDialog(String title, String message) {
		return new MessageDialog(
			getShell(),
			title, 
			null,
			message, 
			MessageDialog.ERROR, 
			new String[] {IDialogConstants.OK_LABEL}, 
			0);
	}
	/*
	 * Convenience method simliar to org.eclipse.jface.dialogs.MessageDialog::openInformation.
	 * The method will return the dialog instead of opening.
	 * @param title the dialog's title, or <code>null</code> if none.
	 * @param message the message.
	 * @return MessageDialog the information dialog.
	 */
	private MessageDialog getInformationDialog(String title, String message) {
		return new MessageDialog(
			getShell(),
			title,
			null,
			message,
			MessageDialog.INFORMATION,
			new String[] { IDialogConstants.OK_LABEL },
			0);
	}
	/*
	 * Convenience method simliar to org.eclipse.jface.dialogs.MessageDialog::openQuestion.
	 * The method will return the dialog instead of opening.
	 * @param title the dialog's title, or <code>null</code> if none.
	 * @param message the message.
	 * @return MessageDialog the question dialog.
	 */
	private MessageDialog getQuestionDialog(String title, String message) {
		return new MessageDialog(
			getShell(),
			title, 
			null,
			message, 
			MessageDialog.QUESTION, 
			new String[] {IDialogConstants.YES_LABEL, IDialogConstants.NO_LABEL}, 
			0);
	}
	/*
	 * Convenience method simliar to org.eclipse.jface.dialogs.MessageDialog::getWarningDialog.
	 * The method will return the dialog instead of opening.
	 * @param title the dialog's title, or <code>null</code> if none.
	 * @param message the message.
	 * @return MessageDialog the confirm dialog.
	 */
	private MessageDialog getWarningDialog(String title, String message) {
		return new MessageDialog(
			getShell(),
			title, 
			null,
			message, 
			MessageDialog.WARNING, 
			new String[] {IDialogConstants.OK_LABEL}, 
			0);
	}
	
	public void testAbortPageFlipping() {
		Dialog dialog = getWarningDialog (
			JFaceResources.getString("AbortPageFlippingDialog.title"),
			JFaceResources.getString("AbortPageFlippingDialog.message") );
		DialogCheck.assertDialogTexts(dialog, this);
	}
	public void testCloseFileDeleted() {
		Dialog dialog = null;
		ResourceBundle bundle = ResourceBundle.getBundle("org.eclipse.ui.texteditor.EditorMessages");
		if (bundle != null) {
			dialog = getConfirmDialog(
				bundle.getString("Editor.error.activated.deleted.close.title"),
				bundle.getString("Editor.error.activated.deleted.close.message") );
		}
		DialogCheck.assertDialogTexts(dialog, this);
	}
	public void testCopyOverwrite() {
		Dialog dialog = getQuestionDialog(
			WorkbenchMessages.getString("CopyResourceAction.resourceExists"),
			WorkbenchMessages.format("CopyResourceAction.overwriteQuestion", new Object[] {DUMMY_RELATIVE_PATH}) );
		DialogCheck.assertDialogTexts(dialog, this);
	}
	public void testDeleteProject() {
		String title = WorkbenchMessages.getString("DeleteResourceAction.titleProject");
		String msg = WorkbenchMessages.format("DeleteResourceAction.confirmProject1", new Object[] {DUMMY_PROJECT, DUMMY_ABSOLUTE_PATH});
		Dialog dialog = new MessageDialog(
			getShell(),
			title, 
			null,	// accept the default window icon
			msg, 
			MessageDialog.QUESTION, 
			new String[] {IDialogConstants.YES_LABEL, IDialogConstants.NO_LABEL, IDialogConstants.CANCEL_LABEL},
			0);
		DialogCheck.assertDialogTexts(dialog, this);
	}
	public void testDeleteReadOnlyCheck() {
		Dialog dialog = new MessageDialog(
			getShell(),
			WorkbenchMessages.getString("DeleteResourceAction.checkDelete"),
			null,
			WorkbenchMessages.format("DeleteResourceAction.readOnlyQuestion", new Object[] {DUMMY_RESOURCE}),
			MessageDialog.QUESTION,
			new String[] {
				IDialogConstants.YES_LABEL,
				IDialogConstants.YES_TO_ALL_LABEL,
				IDialogConstants.NO_LABEL,
				IDialogConstants.CANCEL_LABEL },
			0);
		DialogCheck.assertDialogTexts(dialog, this);
	}
	public void testDeleteResource() {
		Dialog dialog = getQuestionDialog(
			WorkbenchMessages.getString("DeleteResourceAction.title"),
			WorkbenchMessages.format("DeleteResourceAction.confirm1", new Object[] {DUMMY_RESOURCE}) );
		DialogCheck.assertDialogTexts(dialog, this);
	}
	public void testDeleteResources() {
		Dialog dialog = getQuestionDialog(
			WorkbenchMessages.getString("DeleteResourceAction.title"),
			WorkbenchMessages.format("DeleteResourceAction.confirmN", new Object[] {DUMMY_RESOURCE}) );
		DialogCheck.assertDialogTexts(dialog, this);
	}
	public void testDropOverwrite() {
		Dialog dialog = new MessageDialog(
			getShell(),
			ResourceNavigatorMessagesCopy.getString("DropAdapter.question"),
			null,
			ResourceNavigatorMessagesCopy.format("DropAdapter.overwriteQuery", new Object[] {DUMMY_RELATIVE_PATH}),
			MessageDialog.QUESTION,
			new String[] {
				IDialogConstants.YES_LABEL,
				IDialogConstants.YES_TO_ALL_LABEL,
				IDialogConstants.NO_LABEL,
				IDialogConstants.CANCEL_LABEL},
			0);
		DialogCheck.assertDialogTexts(dialog, this);
	}
	public void testErrorClosing() {
		Dialog dialog = getQuestionDialog(
			WorkbenchMessages.getString("Error"),
			WorkbenchMessages.getString("ErrorClosingNoArg") );
		DialogCheck.assertDialogTexts(dialog, this);
	}
	public void testFileChanged() {
		MessageDialog dialog = null;
		ResourceBundle bundle = ResourceBundle.getBundle("org.eclipse.ui.texteditor.EditorMessages");
		if (bundle != null) {
			dialog = getQuestionDialog(
				bundle.getString("Editor.error.activated.outofsync.title"),
				bundle.getString("Editor.error.activated.outofsync.message") );
		}
		DialogCheck.assertDialogTexts(dialog, this);
	}
	public void testFileExtensionEmpty() {
		Dialog dialog = getInformationDialog(
			WorkbenchMessages.getString("FileEditorPreference.extensionEmptyTitle"),
			WorkbenchMessages.getString("FileEditorPreference.extensionEmptyMessage") );
		DialogCheck.assertDialogTexts(dialog, this);
	}
	public void testFileNameWrong() {
		Dialog dialog = getInformationDialog(
			WorkbenchMessages.getString("FileEditorPreference.fileNameInvalidTitle"),
			WorkbenchMessages.getString("FileEditorPreference.fileNameInvalidMessage") );
		DialogCheck.assertDialogTexts(dialog, this);
	}
	public void testFileTypeExists() {
		Dialog dialog = getInformationDialog(
			WorkbenchMessages.getString("FileEditorPreference.existsTitle"),
			WorkbenchMessages.getString("FileEditorPreference.existsMessage") );
		DialogCheck.assertDialogTexts(dialog, this);
	}
	public void testInvalidType_1() {
		Dialog dialog = getWarningDialog(
			WorkbenchMessages.getString("FileExtension.invalidTitle"),
			WorkbenchMessages.getString("FileExtension.invalidMessage") );
		DialogCheck.assertDialogTexts(dialog, this);
	}
	public void testInvalidType_2() {
		Dialog dialog = getWarningDialog(
			WorkbenchMessages.getString("FileExtension.invalidType"),
			WorkbenchMessages.getString("FileExtension.invalidTypeMessage") );
		DialogCheck.assertDialogTexts(dialog, this);
	}
	public void testMoveReadOnlyCheck() {
		Dialog dialog = new MessageDialog(
			getShell(),
			WorkbenchMessages.getString("MoveResourceAction.title"),
			null,
			WorkbenchMessages.format("MoveResourceAction.checkMoveMessage", new Object[] {DUMMY_RESOURCE}),
			MessageDialog.QUESTION,
			new String[] {
				IDialogConstants.YES_LABEL,
				IDialogConstants.YES_TO_ALL_LABEL,
				IDialogConstants.NO_LABEL,
				IDialogConstants.CANCEL_LABEL },
			0);
		DialogCheck.assertDialogTexts(dialog, this);
	}
	public void testNoBuilders() {
		Dialog dialog = getWarningDialog(
			WorkbenchMessages.getString("BuildAction.warning"),
			WorkbenchMessages.getString("BuildAction.noBuilders") );
		DialogCheck.assertDialogTexts(dialog, this);
	}
	public void testNoGlobalBuildersDialog() {
		Dialog dialog = getWarningDialog(
			WorkbenchMessages.getString("GlobalBuildAction.warning"),
			WorkbenchMessages.getString("GlobalBuildAction.noBuilders") );
		DialogCheck.assertDialogTexts(dialog, this);
	}
	public void testNoPropertyPage() {
		Dialog dialog = getInformationDialog(
			WorkbenchMessages.getString("PropertyDialog.messageTitle"),
			WorkbenchMessages.format("PropertyDialog.noPropertyMessage", new Object[] {"DummyPropertyPage"}) );	
		DialogCheck.assertDialogTexts(dialog, this);
	}
	public void testNoSelectedExportResources() {
		Dialog dialog = getInformationDialog(
			DataTransferMessagesCopy.getString("DataTransfer.information"),
			DataTransferMessagesCopy.getString("FileExport.noneSelected") );
		DialogCheck.assertDialogTexts(dialog, this);
	}
	public void testNoSelectedImportResources() {
		Dialog dialog = getInformationDialog(
			DataTransferMessagesCopy.getString("DataTransfer.information"),
			DataTransferMessagesCopy.getString("FileImport.noneSelected") );
		DialogCheck.assertDialogTexts(dialog, this);
	}
	public void testOperationNotAvailable() {
		Dialog dialog = getInformationDialog(
			WorkbenchMessages.getString("Information"),
			WorkbenchMessages.getString("PluginActino.operationNotAvailableMessage") );
		DialogCheck.assertDialogTexts(dialog, this);
	}
	public void testOverwritePerspective() {
		Dialog dialog = new MessageDialog(
			getShell(),
			WorkbenchMessages.getString("SavePerspective.overwriteTitle"),
			null,
			WorkbenchMessages.format("SavePerspective.overwriteQuestion", new Object[] {"Dummy Perspective"}),
			MessageDialog.QUESTION,
			new String[] {IDialogConstants.YES_LABEL, IDialogConstants.NO_LABEL, IDialogConstants.CANCEL_LABEL},
			0);
		DialogCheck.assertDialogTexts(dialog, this);
	}
	public void testRefreshDeleteProject() {
		Dialog dialog = new MessageDialog(
			getShell(),
			WorkbenchMessages.getString("RefreshAction.dialogTitle"),
			null,
			WorkbenchMessages.format("RefreshAction.locationDeletedMessage", new Object[] {DUMMY_PROJECT, "c:\\dummypath\\" + DUMMY_PROJECT}),
			MessageDialog.QUESTION,
			new String[] {IDialogConstants.YES_LABEL, IDialogConstants.NO_LABEL},
			0);
		DialogCheck.assertDialogTexts(dialog, this);
	}
	public void testRenameOverwrite() {
		Dialog dialog = getQuestionDialog(
			WorkbenchMessages.getString("RenameResourceAction.resourceExists"),
			WorkbenchMessages.format("RenameResourceAction.overwriteQuestion", new Object[] {DUMMY_RELATIVE_PATH}) );
		DialogCheck.assertDialogTexts(dialog, this);
	}
	public void testResetPerspective() {		
		Dialog dialog = new MessageDialog(
			getShell(),
			WorkbenchMessages.getString("ResetPerspective.title"),
			null,
			WorkbenchMessages.format("ResetPerspective.message", new Object[] {"Dummy Perspective"}),
			MessageDialog.QUESTION,
			new String[] {IDialogConstants.OK_LABEL, IDialogConstants.CANCEL_LABEL},
			0);
		DialogCheck.assertDialogTexts(dialog, this);
	}
	public void testSaveAsOverwrite() {
		Dialog dialog = new MessageDialog(
			getShell(),
			WorkbenchMessages.getString("Question"),
			null,
			WorkbenchMessages.format("SaveAsDialog.overwriteQuestion", new Object[] {DUMMY_RELATIVE_PATH}),
			MessageDialog.QUESTION,
			new String[] {IDialogConstants.YES_LABEL, IDialogConstants.NO_LABEL, IDialogConstants.CANCEL_LABEL},
			0);
		DialogCheck.assertDialogTexts(dialog, this);
	}
	public void testSaveChanges() {
		Dialog dialog = new MessageDialog(
			getShell(),
			WorkbenchMessages.getString("Save_Resource"),
			null,
			WorkbenchMessages.format("EditorManager.saveChangesQuestion", new Object[] {DUMMY_RESOURCE}),
			MessageDialog.QUESTION,
			new String[] {IDialogConstants.YES_LABEL, IDialogConstants.NO_LABEL, IDialogConstants.CANCEL_LABEL},
			0);
		DialogCheck.assertDialogTexts(dialog, this);
	}
	public void testSaveFileDeleted() {
		MessageDialog dialog = null;
		ResourceBundle bundle = ResourceBundle.getBundle("org.eclipse.ui.texteditor.EditorMessages");
		if (bundle != null) {
			dialog= new MessageDialog(
				getShell(),
				bundle.getString("Editor.error.activated.deleted.save.title"),
				null,
				bundle.getString("Editor.error.activated.deleted.save.message"),
				MessageDialog.QUESTION,
				new String[] {
					bundle.getString("Editor.error.activated.deleted.save.button.save"),
					bundle.getString("Editor.error.activated.deleted.save.button.close")},
				0);
		}
		DialogCheck.assertDialogTexts(dialog, this);
	}
	public void testUpdateConflict() {
		MessageDialog dialog = null;
		ResourceBundle bundle = ResourceBundle.getBundle("org.eclipse.ui.texteditor.EditorMessages");
		if (bundle != null) {
			dialog = getQuestionDialog(
				bundle.getString("Editor.error.save.outofsync.title"),
				bundle.getString("Editor.error.save.outofsync.message") );
		}
		DialogCheck.assertDialogTexts(dialog, this);
	}
	public void testWizardClosing() {
		Dialog dialog = new MessageDialog(
			getShell(),
			JFaceResources.getString("WizardClosingDialog.title"),
			null,
			JFaceResources.getString("WizardClosingDialog.message"),
			MessageDialog.QUESTION,
			new String[] {IDialogConstants.OK_LABEL},
			0);
		DialogCheck.assertDialogTexts(dialog, this);
	}
	public void testWizardOverwrite() {
		Dialog dialog = new MessageDialog(
			getShell(),
			WorkbenchMessages.getString("Question"),
			null, 
			WorkbenchMessages.format("WizardDataTransfer.existsQuestion", new Object[] {DUMMY_ABSOLUTE_PATH}),
			MessageDialog.QUESTION, 
			new String[] {
				IDialogConstants.YES_LABEL, 
				IDialogConstants.YES_TO_ALL_LABEL, 
				IDialogConstants.NO_LABEL, 
				IDialogConstants.CANCEL_LABEL}, 
			0);
		DialogCheck.assertDialogTexts(dialog, this);
	}



}

