This is a test list for the import wizard.

Common Properties for All Pages
	Verify that all listboxes show appropriate scrollbars when 
		their contents extends beyond their client area.
	The Cancel button is enabled all the time.
	Verify that Cancel discards all changes made to the wizard by doing 
		the following:
		- on the Select page, choose any one of items in the list and 
			click Next.
		- make change to the destination or the option settings or both.
		- cancel the wizard.
		- open the wizard again and ensure that the preselection of 
			the Select page( if there was any ), and the values of 
			the destination and the options remain the same as before 
			the change.

Select Page( first page )
	The Next button is enabled only if there is selection in the list.
	Verify that the source from the most recent import, regardless 
		of session, is preselected in the listbox.
	Verify icons for items in the list.

Common Properties for Import Pages( second page )
* Please run this test separately for each of the pages
	[Presentation]
		The source combo listbox stores the five most recent 
			sources from which resources were imported.
		Verify icons for files in the file listbox.
	[Enablement]
		The Back button is enabled and the Next button is greyed out all the time.
		Both of the Browse buttons are enabled.
		The 'Select Types', 'Select All', and 'Deselect All' buttons are enabled only if there is at least one item in the folder tree.
		Finish is enabled only if there is one or more resources selected and the destination folder is not empty.
	[Selection Action]		
		Verify that 'Select All' and 'Deselect All' work.
		Selecting a folder resource shows all files it has in the file listbox.
		Checking a folder resource checks all of its subfolders and its files, and always grey-checks its ancestor folders.
		Unchecking a folder unchecks files and subfolders underneath it. It unchecks its ancestor folder recursively if 
			it is last resource checked. Otherwise, it grey-checks its ancestor recursively.
		Checking a file always grey-checks the folder it is in.
		Unchecking a file unchecks its ancestor folder recursively if it is last file selected. Otherwise, it grey-checks its ancestor recursively.
	[Select Types Dialog]
		Verify that the 'Other Extensions' text box shows only those user-defined file types that are not in the list.
		e.g. 
			- type in *.java and click OK
			- open the dialog again and ensure that the .java check box is checked and the textbox does NOT have .java in it.
			- in the dialog, type in *.eclipse and click OK
			- open the dialog again and ensure that the textbox has .eclipse in it.
		Verify that the filter selects files by both checked file types and specified types among the selected resources only.
		Verify that invoking the filter updates appropriate checkboxes of files and folders.
		Verify that invoking the filter by one type and then immediately by a different type leaves all resources unchecked.
	[Destination Folder Selection Dialog]
		Go-into is enabled only if the selected folder has a subfolder.
		If the root of the tree widget is the same as the root of the workspace, Home is enabled and Back is not.
		If the root of the tree widget is NOT the same as the root of the workspace, Home is disabled and Back is enabled.
		Verify that Home, Back, and Go-Into work.
		Selecting a folder shows its complete path in the text box.
		Clicking on OK in the dialog updates the contents of the Folder textbox in the wizard.
	[Options]
		The setting for common options are shared by pages.
		If the Overwrite checkbox is unchecked, importing a resource to the same destination twice pops up the Confirm Overwrite dialog.
		If the Overwrite checkbox is checked, you can import a resource to the same destination twice without confirming it.
	[Navigator View]
		Verify that the navigator view is updated after importing.
	[Persistence]
		Verify that the five most recent sources stored in the source combo listbox are persistent between sessions.
		Verify that the settings of the options are persistent between sessions.

File System Page
	Selecting a source directory shows its folder structure using itself as the root in the left tree.
	Verify that all of the selected resources are imported successfully.	
	If the 'Complete folder structure' checkbox is unchecked, importing a resource creates a folder structure relative 
		to the root of the tree widget in the destination folder.
	If the 'Complete folder structure' checkbox is checked, importing a resource creates a folder structure using the 
		source's absolute path in the destination folder.

Zip File Page
	Selecting a source archive shows its folder structure in the left tree AND checks all of resources in it.
