sysmodelmgr/com.symbian.smt.gui/src/com/symbian/smt/gui/smtwidgets/resources/ResourcesWidget.java
changeset 0 522a326673b6
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sysmodelmgr/com.symbian.smt.gui/src/com/symbian/smt/gui/smtwidgets/resources/ResourcesWidget.java	Thu Mar 11 19:08:43 2010 +0200
@@ -0,0 +1,974 @@
+// Copyright (c) 2008-2009 Nokia Corporation and/or its subsidiary(-ies).
+// All rights reserved.
+// This component and the accompanying materials are made available
+// under the terms of "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.symbian.smt.gui.smtwidgets.resources;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+
+import org.eclipse.jface.viewers.CheckStateChangedEvent;
+import org.eclipse.jface.viewers.CheckboxTableViewer;
+import org.eclipse.jface.viewers.ICheckStateListener;
+import org.eclipse.jface.viewers.ILabelProvider;
+import org.eclipse.jface.viewers.ILabelProviderListener;
+import org.eclipse.jface.viewers.ISelectionChangedListener;
+import org.eclipse.jface.viewers.IStructuredContentProvider;
+import org.eclipse.jface.viewers.IStructuredSelection;
+import org.eclipse.jface.viewers.ITableLabelProvider;
+import org.eclipse.jface.viewers.ListViewer;
+import org.eclipse.jface.viewers.SelectionChangedEvent;
+import org.eclipse.jface.viewers.StructuredSelection;
+import org.eclipse.jface.viewers.Viewer;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.custom.SashForm;
+import org.eclipse.swt.events.SelectionAdapter;
+import org.eclipse.swt.events.SelectionEvent;
+import org.eclipse.swt.graphics.Image;
+import org.eclipse.swt.layout.FillLayout;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.layout.GridLayout;
+import org.eclipse.swt.layout.RowData;
+import org.eclipse.swt.layout.RowLayout;
+import org.eclipse.swt.widgets.Button;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Label;
+import org.eclipse.swt.widgets.List;
+import org.eclipse.swt.widgets.Table;
+
+import com.symbian.smt.gui.Helper;
+import com.symbian.smt.gui.ResourcesEnums;
+
+public class ResourcesWidget extends Composite {
+
+	/**
+	 * This is the content provider for the list of resource types.
+	 * 
+	 * @author barbararosi-schwartz
+	 */
+	private class ResourceFilesContentProvider implements
+			IStructuredContentProvider {
+
+		public void dispose() {
+		}
+
+		@SuppressWarnings("unchecked")
+		public Object[] getElements(Object inputElement) {
+			return ResourcesWidgetHelper
+					.toArrayOfCheckableResourceFilenames((java.util.List<CheckableResourceFilename>) inputElement);
+		}
+
+		public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
+		}
+	}
+
+	/**
+	 * This is the label provider for the list of of resource types.
+	 * 
+	 * @author barbararosi-schwartz
+	 */
+	private class ResourceFilesLabelProvider implements ITableLabelProvider {
+
+		public void addListener(ILabelProviderListener listener) {
+		}
+
+		public void dispose() {
+		}
+
+		public Image getColumnImage(Object element, int columnIndex) {
+			return null;
+		}
+
+		public String getColumnText(Object element, int columnIndex) {
+			CheckableResourceFilename crf = (CheckableResourceFilename) element;
+
+			return (columnIndex == 0) ? crf.getFilename() : null;
+		}
+
+		public boolean isLabelProperty(Object element, String property) {
+			return false;
+		}
+
+		public void removeListener(ILabelProviderListener listener) {
+		}
+
+	}
+
+	/**
+	 * This is the content provider for the list of resource types.
+	 * 
+	 * @author barbararosi-schwartz
+	 */
+	private class ResourceTypesContentProvider implements
+			IStructuredContentProvider {
+
+		public void dispose() {
+		}
+
+		public Object[] getElements(Object inputElement) {
+			return (ResourcesEnums[]) inputElement;
+		}
+
+		public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
+		}
+	}
+
+	/**
+	 * This is the label provider for the list of of resource types.
+	 * 
+	 * @author barbararosi-schwartz
+	 */
+	private class ResourceTypesLabelProvider implements ILabelProvider {
+
+		public void addListener(ILabelProviderListener listener) {
+		}
+
+		public void dispose() {
+		}
+
+		public Image getImage(Object element) {
+			return null;
+		}
+
+		public String getText(Object element) {
+			return ((ResourcesEnums) element).arg();
+		}
+
+		public boolean isLabelProperty(Object element, String property) {
+			return false;
+		}
+
+		public void removeListener(ILabelProviderListener listener) {
+		}
+
+	}
+
+	/**
+	 * The Map that caches all defined resource files, keyed by the
+	 * ResourcesEnums enums.
+	 */
+	private final HashMap<ResourcesEnums, java.util.List<CheckableResourceFilename>> resourceFilesMap = new HashMap<ResourcesEnums, java.util.List<CheckableResourceFilename>>();
+
+	/**
+	 * The viewer associated with the Resource Files List widget.
+	 */
+	private CheckboxTableViewer resourceFilesViewer;
+
+	/**
+	 * The viewer associated with the Resource Types List widget.
+	 */
+	private ListViewer resourceTypesViewer;
+
+	/**
+	 * Creates a ResourcesWidget composite object
+	 * 
+	 * @return void
+	 */
+	public ResourcesWidget(final Composite parent, int style) {
+		super(parent, style);
+
+		initialiseMaps();
+		this.setLayout(new FillLayout());
+
+		// The Composite that contains all widgets
+		final Composite gridLayoutComposite = new Composite(this, SWT.NONE);
+		final GridLayout gridLayout = new GridLayout();
+		gridLayout.numColumns = 1;
+
+		gridLayoutComposite.setLayout(gridLayout);
+
+		// The SashForm that contains the resource types and resource files
+		// widgets
+		// side by side
+		SashForm sash = new SashForm(gridLayoutComposite, SWT.HORIZONTAL);
+		GridData gd = new GridData(SWT.FILL, SWT.FILL, true, true, 1, 1);
+
+		sash.setLayoutData(gd);
+		createResourceTypesComposite(sash);
+		createResourceFilesComposite(sash);
+		sash.setWeights(new int[] { 30, 70 });
+		createButtonsComposite(gridLayoutComposite);
+	}
+
+	private void addAddResourceButton(Composite parent) {
+		// The "Add" button
+		final Button addResourceFileButton = new Button(parent, SWT.NONE);
+		RowData rd = new RowData();
+		rd.width = 75;
+
+		addResourceFileButton.setLayoutData(rd);
+
+		// The action that backs the "Add" button
+		final AddResourceFileAction addResourceFileAction = new AddResourceFileAction(
+				addResourceFileButton, resourceFilesViewer, resourceFilesMap,
+				resourceTypesViewer);
+
+		// When button is pressed, listener invokes the action's run() method,
+		// then ensures that the newly added file is checked, guaranteeing that
+		// all rules around multiple checked files are respected.
+		// Finally refreshes the List of assigned options and set the selection
+		// appropriately.
+		// If the newly added file failed validation during the action's run()
+		// method,
+		// none of the operations above is taken and all is left as it was prior
+		// to
+		// the request to add a new file.
+		addResourceFileButton.addSelectionListener(new SelectionAdapter() {
+			public void widgetSelected(final SelectionEvent e) {
+				addResourceFileAction.run();
+				resourceFilesViewer.refresh();
+
+				String newFileLocation = addResourceFileAction
+						.getNewFileLocation();
+
+				// newFile could be null if an error was detected in the
+				// validations
+				// performed in the action's run() method.
+				if (newFileLocation != null) {
+					ResourcesEnums type = ResourcesWidgetHelper
+							.getSelectedResourceType(resourceTypesViewer);
+					CheckableResourceFilename crf = ResourcesWidgetHelper
+							.filename2checkableFilename(newFileLocation, type,
+									resourceFilesMap);
+
+					handleMultipleCheckRules(crf);
+
+					StructuredSelection oldSel = (StructuredSelection) resourceFilesViewer
+							.getSelection();
+
+					StructuredSelection newSel = (newFileLocation == null) ? oldSel
+							: new StructuredSelection(newFileLocation);
+
+					resourceFilesViewer.setSelection(newSel);
+				}
+			}
+		});
+	}
+
+	private void addMoveDownResourceButton(Composite parent) {
+		// The "Move Down" button
+		final Button moveResourceFileDownButton = new Button(parent, SWT.NONE);
+		RowData rd = new RowData();
+		rd.width = 75;
+
+		moveResourceFileDownButton.setLayoutData(rd);
+
+		// The action that backs the "Move Down" button
+		final MoveResourceFileDownAction moveResourceFileDownAction = new MoveResourceFileDownAction(
+				moveResourceFileDownButton, resourceFilesViewer,
+				resourceFilesMap, resourceTypesViewer);
+
+		// When button is pressed, listener invokes the action's run() method,
+		// then refreshes the List of assigned options and set the selection
+		// appropriately
+		moveResourceFileDownButton.addSelectionListener(new SelectionAdapter() {
+			public void widgetSelected(final SelectionEvent e) {
+				moveResourceFileDownAction.run();
+				resourceFilesViewer.refresh();
+
+				StructuredSelection newSel = new StructuredSelection(
+						moveResourceFileDownAction.getMovedCheckableFilename());
+
+				resourceFilesViewer.setSelection(newSel);
+			}
+		});
+	}
+
+	private void addMoveUpResourceButton(Composite parent) {
+		// The "Move Up" button
+		final Button moveResourceFileUpButton = new Button(parent, SWT.NONE);
+		RowData rd = new RowData();
+		rd.width = 75;
+
+		moveResourceFileUpButton.setLayoutData(rd);
+
+		// The action that backs the "Move Up" button
+		final MoveResourceFileUpAction moveResourceFileUpAction = new MoveResourceFileUpAction(
+				moveResourceFileUpButton, resourceFilesViewer,
+				resourceFilesMap, resourceTypesViewer);
+
+		// When button is pressed, listener invokes the action's run() method,
+		// then refreshes the List of assigned options and set the selection
+		// appropriately
+		moveResourceFileUpButton.addSelectionListener(new SelectionAdapter() {
+			public void widgetSelected(final SelectionEvent e) {
+				moveResourceFileUpAction.run();
+				resourceFilesViewer.refresh();
+
+				StructuredSelection newSel = new StructuredSelection(
+						moveResourceFileUpAction.getMovedCheckableFilename());
+
+				resourceFilesViewer.setSelection(newSel);
+			}
+		});
+
+	}
+
+	private void addRemoveResourceButton(Composite parent) {
+		// The "Remove" button
+		final Button removeResourceFileButton = new Button(parent, SWT.NONE);
+		RowData rd = new RowData();
+		rd.width = 75;
+
+		removeResourceFileButton.setLayoutData(rd);
+
+		// The action that backs the "Remove" button
+		final RemoveResourceFileAction removeResourceFileAction = new RemoveResourceFileAction(
+				removeResourceFileButton, resourceFilesViewer,
+				resourceFilesMap, resourceTypesViewer);
+
+		// When button is pressed, listener invokes the action's run() method,
+		// then refreshes the List of assigned options and set the selection
+		// appropriately
+		removeResourceFileButton.addSelectionListener(new SelectionAdapter() {
+			public void widgetSelected(SelectionEvent e) {
+				removeResourceFileAction.run();
+				resourceFilesViewer.refresh();
+
+				Object firstElement = resourceFilesViewer.getElementAt(0);
+				StructuredSelection ssel = (firstElement == null) ? new StructuredSelection(
+						StructuredSelection.EMPTY)
+						: new StructuredSelection(firstElement);
+
+				resourceFilesViewer.setSelection(ssel);
+			}
+		});
+	}
+
+	private void checkFilesInResourceFilesTable(String[] filenames,
+			ResourcesEnums resourceType) {
+		if (filenames == null) {
+			throw new IllegalArgumentException(
+					"Argument filenames cannot be null.");
+		}
+
+		java.util.List<String> listOfFilenames = Helper
+				.toListOfStrings(filenames);
+		java.util.List<CheckableResourceFilename> checkableFilenames = resourceFilesMap
+				.get(resourceType);
+
+		if (checkableFilenames == null) {
+			throw new IllegalArgumentException(
+					"Could not find any elements of type [" + resourceType
+							+ "] in resourceFilesMap.");
+		}
+
+		CheckableResourceFilename[] viewerElementsToBeChecked = new CheckableResourceFilename[filenames.length];
+		int i = 0;
+
+		for (String filename : listOfFilenames) {
+
+			CheckableResourceFilename checkableFilename = ResourcesWidgetHelper
+					.filename2checkableFilename(filename, resourceType,
+							resourceFilesMap);
+
+			checkableFilename.setChecked(true);
+
+			viewerElementsToBeChecked[i] = checkableFilename;
+			i++;
+		}
+		
+		IStructuredSelection ssel = (IStructuredSelection) resourceTypesViewer.getSelection();
+		if (!ssel.isEmpty()) {
+			ResourcesEnums selectedType = (ResourcesEnums) ssel.getFirstElement();
+			if (selectedType.equals(resourceType)) {
+				resourceFilesViewer.setCheckedElements(viewerElementsToBeChecked);
+			}
+		}
+		
+		
+	}
+
+	private void createButtonsComposite(Composite parent) {
+		// The Composite that contains all buttons in a horizontal stack
+		final Composite buttonsComposite = new Composite(parent, SWT.NONE);
+		final RowLayout rowLayout = new RowLayout(SWT.HORIZONTAL);
+		rowLayout.spacing = 5;
+		rowLayout.wrap = false;
+		rowLayout.fill = true;
+
+		buttonsComposite.setLayout(rowLayout);
+
+		GridData gd = new GridData(SWT.BEGINNING, SWT.BEGINNING, true, false,
+				1, 1);
+
+		buttonsComposite.setLayoutData(gd);
+		addAddResourceButton(buttonsComposite);
+		addRemoveResourceButton(buttonsComposite);
+		addMoveUpResourceButton(buttonsComposite);
+		addMoveDownResourceButton(buttonsComposite);
+	}
+
+	private void createResourceFilesComposite(SashForm sash) {
+		// The Composite that contains the resource files table, along with a
+		// label
+		Composite resourceFilesComposite = new Composite(sash, SWT.NONE);
+		GridData gd = new GridData(SWT.BEGINNING, SWT.FILL, false, true, 1, 1);
+
+		resourceFilesComposite.setLayoutData(gd);
+		resourceFilesComposite.setLayout(new GridLayout());
+
+		Label label = new Label(resourceFilesComposite, SWT.NONE);
+		gd = new GridData(SWT.BEGINNING, SWT.BEGINNING, false, false, 1, 1);
+
+		label.setLayoutData(gd);
+		label.setText("Resource Files");
+
+		// The Table that contains all assigned resource files for the selected
+		// resource type
+		final Table table = new Table(resourceFilesComposite, SWT.BORDER
+				| SWT.H_SCROLL | SWT.V_SCROLL | SWT.MULTI | SWT.CHECK
+				| SWT.FULL_SELECTION);
+		gd = new GridData(SWT.FILL, SWT.FILL, true, true, 1, 1);
+
+		table.setLayoutData(gd);
+
+		// The resource type viewer associated with the list
+		resourceFilesViewer = new CheckboxTableViewer(table);
+
+		resourceFilesViewer
+				.setContentProvider(new ResourceFilesContentProvider());
+		resourceFilesViewer.setLabelProvider(new ResourceFilesLabelProvider());
+
+		resourceFilesViewer.addCheckStateListener(new ICheckStateListener() {
+
+			// When the user changed the checked state of the checkbox in the
+			// table, set
+			// or unset the isChecked attribute in the corresponding
+			// CheckableResourceFilename object
+			public void checkStateChanged(CheckStateChangedEvent event) {
+				CheckableResourceFilename checkableFilename = (CheckableResourceFilename) event
+						.getElement();
+				boolean isSelected = event.getChecked();
+
+				if (isSelected) {
+					handleMultipleCheckRules(checkableFilename);
+				} else {
+					handleNoCheckRules(checkableFilename);
+				}
+			}
+
+		});
+	}
+
+	private void createResourceTypesComposite(SashForm sash) {
+		// The Composite that contains the resource types list, along with a
+		// label
+		Composite resourceTypesComposite = new Composite(sash, SWT.NONE);
+		GridData gd = new GridData(SWT.BEGINNING, SWT.FILL, false, true, 1, 1);
+
+		resourceTypesComposite.setLayoutData(gd);
+		resourceTypesComposite.setLayout(new GridLayout());
+
+		Label l = new Label(resourceTypesComposite, SWT.NONE);
+		gd = new GridData(SWT.BEGINNING, SWT.BEGINNING, false, false, 1, 1);
+
+		l.setLayoutData(gd);
+		l.setText("Resource Types");
+
+		// The List that contains all possible resource types
+		final List list = new List(resourceTypesComposite, SWT.BORDER
+				| SWT.H_SCROLL | SWT.V_SCROLL | SWT.SINGLE);
+		gd = new GridData(SWT.FILL, SWT.FILL, true, true, 1, 1);
+
+		list.setLayoutData(gd);
+
+		// The resource type viewer associated with the list
+		resourceTypesViewer = new ListViewer(list);
+
+		resourceTypesViewer
+				.setContentProvider(new ResourceTypesContentProvider());
+		resourceTypesViewer.setLabelProvider(new ResourceTypesLabelProvider());
+		resourceTypesViewer.setInput(ResourcesEnums.values());
+
+		resourceTypesViewer
+				.addSelectionChangedListener(new ISelectionChangedListener() {
+					public void selectionChanged(SelectionChangedEvent event) {
+						IStructuredSelection ssel = (IStructuredSelection) event
+								.getSelection();
+						if (ssel.isEmpty()) {
+							return;
+						}
+						ResourcesEnums selectedType = (ResourcesEnums) ssel.getFirstElement();
+
+						resourceFilesViewer.setInput(ResourcesWidgetHelper
+								.getCheckableResourceFilenames(selectedType,
+										resourceFilesMap));
+						
+						resourceFilesViewer
+								.setCheckedElements(ResourcesWidgetHelper
+										.getCheckedResourceFilenames(
+												selectedType, resourceFilesMap));
+					}
+				});
+	}
+
+	@Override
+	public void dispose() {
+		resourceFilesMap.clear();
+		super.dispose();
+	}
+
+	/**
+	 * Returns the shapes file or an empty string if no shapes file has been
+	 * specified
+	 * 
+	 * @return String
+	 */
+	public String[] getBorderShapesFiles() {
+		return ResourcesWidgetHelper.getFilenames(ResourcesEnums.BORDER_SHAPES,
+				resourceFilesMap);
+	}
+
+	/**
+	 * Returns the shapes file or an empty string if no shapes file has been
+	 * specified
+	 * 
+	 * @return String
+	 */
+	public String[] getBorderStylesFiles() {
+		return ResourcesWidgetHelper.getFilenames(ResourcesEnums.BORDER_STYLES,
+				resourceFilesMap);
+	}
+
+	/**
+	 * Returns the shapes file or an empty string if no shapes file has been
+	 * specified
+	 * 
+	 * @return String
+	 */
+	public String[] getColoursFiles() {
+		return ResourcesWidgetHelper.getFilenames(ResourcesEnums.COLOURS,
+				resourceFilesMap);
+	}
+
+	/**
+	 * Returns the shapes file or an empty string if no shapes file has been
+	 * specified
+	 * 
+	 * @return String
+	 */
+	public String[] getDependenciesFiles() {
+		return ResourcesWidgetHelper.getFilenames(ResourcesEnums.DEPENDENCIES,
+				resourceFilesMap);
+	}
+
+	/**
+	 * Returns the shapes file or an empty string if no shapes file has been
+	 * specified
+	 * 
+	 * @return String
+	 */
+	public String[] getLevelsFiles() {
+		return ResourcesWidgetHelper.getFilenames(ResourcesEnums.LEVELS,
+				resourceFilesMap);
+	}
+
+	/**
+	 * Returns the shapes file or an empty string if no shapes file has been
+	 * specified
+	 * 
+	 * @return String
+	 */
+	public String[] getLocalisationFiles() {
+		return ResourcesWidgetHelper.getFilenames(ResourcesEnums.LOCALISATION,
+				resourceFilesMap);
+	}
+
+	/**
+	 * Returns the shapes file or an empty string if no shapes file has been
+	 * specified
+	 * 
+	 * @return String
+	 */
+	public String[] getPatternsFiles() {
+		return ResourcesWidgetHelper.getFilenames(ResourcesEnums.PATTERNS,
+				resourceFilesMap);
+	}
+
+	/**
+	 * Returns the shapes file or an empty string if no shapes file has been
+	 * specified
+	 * 
+	 * @return String
+	 */
+	public String[] getS12XmlFiles() {
+		return ResourcesWidgetHelper.getFilenames(ResourcesEnums.S12_XML,
+				resourceFilesMap);
+	}
+
+	/**
+	 * Returns the border shapes file or an empty string if no border shapes
+	 * file has been specified
+	 * 
+	 * @return String
+	 */
+	public String[] getSelectedBorderShapesFiles() {
+		return ResourcesWidgetHelper.getCheckedFilenames(
+				ResourcesEnums.BORDER_SHAPES, resourceFilesMap);
+	}
+
+	/**
+	 * Returns the border styles file or an empty string if no border styles
+	 * file has been specified
+	 * 
+	 * @return String
+	 */
+	public String[] getSelectedBorderStylesFiles() {
+		return ResourcesWidgetHelper.getCheckedFilenames(
+				ResourcesEnums.BORDER_STYLES, resourceFilesMap);
+	}
+
+	/**
+	 * Returns the colours file or an empty string if no colours file has been
+	 * specified
+	 * 
+	 * @return String
+	 */
+	public String[] getSelectedColoursFiles() {
+		return ResourcesWidgetHelper.getCheckedFilenames(
+				ResourcesEnums.COLOURS, resourceFilesMap);
+	}
+
+	/**
+	 * Returns the dependencies file or an empty string if no dependencies file
+	 * has been specified
+	 * 
+	 * @return String
+	 */
+	public String[] getSelectedDependenciesFiles() {
+		return ResourcesWidgetHelper.getCheckedFilenames(
+				ResourcesEnums.DEPENDENCIES, resourceFilesMap);
+	}
+
+	/**
+	 * Returns the levels file or an empty string if no levels file has been
+	 * specified
+	 * 
+	 * @return String
+	 */
+	public String[] getSelectedLevelsFiles() {
+		return ResourcesWidgetHelper.getCheckedFilenames(ResourcesEnums.LEVELS,
+				resourceFilesMap);
+	}
+
+	/**
+	 * Returns the localisation file or an empty string if no localisation file
+	 * has been specified
+	 * 
+	 * @return String
+	 */
+	public String[] getSelectedLocalisationFiles() {
+		return ResourcesWidgetHelper.getCheckedFilenames(
+				ResourcesEnums.LOCALISATION, resourceFilesMap);
+	}
+
+	/**
+	 * Returns the patterns file or an empty string if no patterns file has been
+	 * specified
+	 * 
+	 * @return String
+	 */
+	public String[] getSelectedPatternsFiles() {
+		return ResourcesWidgetHelper.getCheckedFilenames(
+				ResourcesEnums.PATTERNS, resourceFilesMap);
+	}
+
+	/**
+	 * Returns the patterns file or an empty string if no patterns file has been
+	 * specified
+	 * 
+	 * @return String
+	 */
+	public String[] getSelectedS12XmlFiles() {
+		return ResourcesWidgetHelper.getCheckedFilenames(
+				ResourcesEnums.S12_XML, resourceFilesMap);
+	}
+
+	/**
+	 * Returns the shapes file or an empty string if no shapes file has been
+	 * specified
+	 * 
+	 * @return String
+	 */
+	public String[] getSelectedShapesFiles() {
+		return ResourcesWidgetHelper.getCheckedFilenames(ResourcesEnums.SHAPES,
+				resourceFilesMap);
+	}
+
+	/**
+	 * Returns the system info file or an empty string if no system info file
+	 * has been specified
+	 * 
+	 * @return String
+	 */
+	public String[] getSelectedSystemInfoFiles() {
+		return ResourcesWidgetHelper.getCheckedFilenames(
+				ResourcesEnums.SYSTEM_INFO, resourceFilesMap);
+	}
+
+	/**
+	 * Returns the shapes file or an empty string if no shapes file has been
+	 * specified
+	 * 
+	 * @return String
+	 */
+	public String[] getShapesFiles() {
+		return ResourcesWidgetHelper.getFilenames(ResourcesEnums.SHAPES,
+				resourceFilesMap);
+	}
+
+	/**
+	 * Returns the shapes file or an empty string if no shapes file has been
+	 * specified
+	 * 
+	 * @return String
+	 */
+	public String[] getSystemInfoFiles() {
+		return ResourcesWidgetHelper.getFilenames(ResourcesEnums.SYSTEM_INFO,
+				resourceFilesMap);
+	}
+
+	/**
+	 * Checks the designated resource file and sets its <code>isChecked</code>
+	 * attribute to true. Handles business rules around the acceptability of
+	 * having multiple checked files.
+	 * <p>
+	 * The rules are as follows:
+	 * <ul>
+	 * <li>If resource type is DEPENDENCIES or SHAPES, only allow one check at a
+	 * time: uncheck all other files and remove them from
+	 * <code>selectedResourceFilesMap</code></li>
+	 * <li>In all other cases, allow multiple checks</li>
+	 * </ul>
+	 * </p>
+	 * 
+	 * @param resourceFile
+	 *            the CheckableResourceFilename object that has been checked by
+	 *            the user
+	 */
+	private void handleMultipleCheckRules(
+			CheckableResourceFilename checkedCheckableFilename) {
+		ResourcesEnums selectedResourceType = ResourcesWidgetHelper
+				.getSelectedResourceType(resourceTypesViewer);
+		java.util.List<CheckableResourceFilename> checkableFilenames = ResourcesWidgetHelper
+				.getCheckableResourceFilenames(selectedResourceType,
+						resourceFilesMap);
+
+		checkedCheckableFilename.setChecked(true);
+
+		switch (selectedResourceType) {
+		// Only one file can be checked at a time, therefore uncheck all others
+		case DEPENDENCIES:
+		case SHAPES:
+			for (CheckableResourceFilename checkableFilename : checkableFilenames) {
+				if (!checkableFilename.equals(checkedCheckableFilename)) {
+					checkableFilename.setChecked(false);
+				}
+			}
+
+			resourceFilesViewer
+					.setCheckedElements(new CheckableResourceFilename[] { checkedCheckableFilename });
+			break;
+
+		// If multiple files are checked and they contain the same elements,
+		// prevent checking from happening as it will generate an error in
+		// the build. Produce an explanatory error dialog.
+		case BORDER_SHAPES:
+		case PATTERNS:
+			// TODO:BRS:This piece of code is unfinished. If it is required to check 
+			// that there are no duplicate items across 
+			// the defined XML files, check similar behaviour in ResourceFileValidator.
+			// If ok
+			// resourceFilesViewer.setChecked(resourceFile, true);
+			// selectedResourceFiles.add(resourceFile);
+			// else
+			// MessageDialog.openError("Checked files contain the same element and the process will fail.\n"
+			// +
+			// "Please remove duplicate elements or uncheck one or more of the other files.");
+			// resourceFilesViewer.setChecked(resourceFile, false);
+
+			resourceFilesViewer.setChecked(checkedCheckableFilename, true);
+			break;
+
+		// If "Auto" is checked, uncheck everything else. If another option is
+		// checked, uncheck "Auto".
+		case LEVELS:
+			if (checkedCheckableFilename.getFilename().equals("Auto")) {
+				for (CheckableResourceFilename checkableFilename : checkableFilenames) {
+					if (!checkableFilename.equals(checkedCheckableFilename)) {
+						checkableFilename.setChecked(false);
+					}
+				}
+
+				resourceFilesViewer
+						.setCheckedElements(new CheckableResourceFilename[] { checkedCheckableFilename });
+			} else {
+				resourceFilesViewer.setChecked(checkedCheckableFilename, true);
+
+				CheckableResourceFilename autocfn = ResourcesWidgetHelper
+						.filename2checkableFilename("Auto",
+								ResourcesEnums.LEVELS, resourceFilesMap);
+
+				if (autocfn.isChecked()) {
+					autocfn.setChecked(false);
+					resourceFilesViewer.setChecked(autocfn, false);
+				}
+			}
+
+			break;
+
+		// No special rules, proceed with the operation.
+		case BORDER_STYLES:
+		case COLOURS:
+		case LOCALISATION:
+		case S12_XML:
+		case SYSTEM_INFO:
+			resourceFilesViewer.setChecked(checkedCheckableFilename, true);
+			break;
+
+		default:
+			throw new IllegalArgumentException("Unknown resource type ["
+					+ selectedResourceType + "]");
+		}
+	}
+
+	/**
+	 * Unchecks the designated CheckableResourceFilename object. Handles
+	 * business rules around the acceptability of having no checked files.
+	 * <p>
+	 * The rules are as follows:
+	 * <ul>
+	 * <li></li>
+	 * </ul>
+	 * </p>
+	 * 
+	 * @param selectedCheckableFilename
+	 *            the file that has been unchecked by the user
+	 */
+	private void handleNoCheckRules(
+			CheckableResourceFilename uncheckedCheckableFilename) {
+		uncheckedCheckableFilename.setChecked(false);
+		resourceFilesViewer.setChecked(uncheckedCheckableFilename, false);
+	}
+
+	private void initialiseMaps() {
+		for (ResourcesEnums type : ResourcesEnums.values()) {
+			resourceFilesMap.put(type, null);
+		}
+	}
+
+	private void populateResourceFilesTable(String[] filenames,
+			ResourcesEnums resourceType) {
+		java.util.List<String> listOfFilenames = Helper
+				.toListOfStrings(filenames);
+		java.util.List<CheckableResourceFilename> checkableFilenames = new ArrayList<CheckableResourceFilename>();
+
+		for (String filename : listOfFilenames) {
+			CheckableResourceFilename crf = new CheckableResourceFilename(
+					filename);
+			checkableFilenames.add(crf);
+		}
+
+		IStructuredSelection ssel = (IStructuredSelection) resourceTypesViewer.getSelection();
+		if (!ssel.isEmpty()) {
+			ResourcesEnums selectedType = (ResourcesEnums) ssel.getFirstElement();
+			if (selectedType.equals(resourceType)) {
+				resourceFilesViewer.setInput(checkableFilenames);
+			}
+		}
+		resourceFilesMap.put(resourceType, checkableFilenames);
+	}
+
+	public void setBorderShapesFiles(String[] filenames) {
+		populateResourceFilesTable(filenames, ResourcesEnums.BORDER_SHAPES);
+	}
+
+	public void setBorderStylesFiles(String[] filenames) {
+		populateResourceFilesTable(filenames, ResourcesEnums.BORDER_STYLES);
+	}
+
+	public void setColoursFiles(String[] filenames) {
+		populateResourceFilesTable(filenames, ResourcesEnums.COLOURS);
+	}
+
+	public void setDependenciesFiles(String[] filenames) {
+		populateResourceFilesTable(filenames, ResourcesEnums.DEPENDENCIES);
+	}
+
+	public void setLevelsFiles(String[] filenames) {
+		populateResourceFilesTable(filenames, ResourcesEnums.LEVELS);
+	}
+
+	public void setLocalisationFiles(String[] filenames) {
+		populateResourceFilesTable(filenames, ResourcesEnums.LOCALISATION);
+	}
+
+	public void setPatternsFiles(String[] filenames) {
+		populateResourceFilesTable(filenames, ResourcesEnums.PATTERNS);
+	}
+
+	public void setS12XmlFiles(String[] filenames) {
+		populateResourceFilesTable(filenames, ResourcesEnums.S12_XML);
+	}
+
+	public void setSelectedBorderShapesFiles(String[] filenames) {
+		checkFilesInResourceFilesTable(filenames, ResourcesEnums.BORDER_SHAPES);
+	}
+
+	public void setSelectedBorderStylesFiles(String[] filenames) {
+		checkFilesInResourceFilesTable(filenames, ResourcesEnums.BORDER_STYLES);
+	}
+
+	public void setSelectedColoursFiles(String[] filenames) {
+		checkFilesInResourceFilesTable(filenames, ResourcesEnums.COLOURS);
+	}
+
+	public void setSelectedDependenciesFiles(String[] filenames) {
+		checkFilesInResourceFilesTable(filenames, ResourcesEnums.DEPENDENCIES);
+	}
+
+	public void setSelectedLevelsFiles(String[] filenames) {
+		checkFilesInResourceFilesTable(filenames, ResourcesEnums.LEVELS);
+	}
+
+	public void setSelectedLocalisationFiles(String[] filenames) {
+		checkFilesInResourceFilesTable(filenames, ResourcesEnums.LOCALISATION);
+	}
+
+	public void setSelectedPatternsFiles(String[] filenames) {
+		checkFilesInResourceFilesTable(filenames, ResourcesEnums.PATTERNS);
+	}
+
+	public void setSelectedS12XmlFiles(String[] filenames) {
+		checkFilesInResourceFilesTable(filenames, ResourcesEnums.S12_XML);
+	}
+
+	public void setSelectedShapesFiles(String[] filenames) {
+		checkFilesInResourceFilesTable(filenames, ResourcesEnums.SHAPES);
+	}
+
+	public void setSelectedSystemInfoFiles(String[] filenames) {
+		checkFilesInResourceFilesTable(filenames, ResourcesEnums.SYSTEM_INFO);
+	}
+
+	public void setShapesFiles(String[] filenames) {
+		populateResourceFilesTable(filenames, ResourcesEnums.SHAPES);
+	}
+
+	public void setSystemInfoFiles(String[] filenames) {
+		populateResourceFilesTable(filenames, ResourcesEnums.SYSTEM_INFO);
+	}
+
+}
\ No newline at end of file