Updates to preference and build

modified preferences to support multiple filters

modified pom target builds
diff --git a/cda/plugins/org.eclipse.mdht.cda.xml.ui/src/org/eclipse/mdht/cda/xml/ui/handlers/GenerateCDADataHandler.java b/cda/plugins/org.eclipse.mdht.cda.xml.ui/src/org/eclipse/mdht/cda/xml/ui/handlers/GenerateCDADataHandler.java
index 0a6dcff..75ed50c 100644
--- a/cda/plugins/org.eclipse.mdht.cda.xml.ui/src/org/eclipse/mdht/cda/xml/ui/handlers/GenerateCDADataHandler.java
+++ b/cda/plugins/org.eclipse.mdht.cda.xml.ui/src/org/eclipse/mdht/cda/xml/ui/handlers/GenerateCDADataHandler.java
@@ -30,7 +30,6 @@
 import java.nio.file.Files;
 import java.nio.file.Paths;
 import java.util.ArrayList;
-import java.util.Arrays;
 import java.util.Collection;
 import java.util.Collections;
 import java.util.Comparator;
@@ -304,7 +303,9 @@
 
 	static HashMap<String, String> organizations = new HashMap<String, String>();
 
-	static String preferenceFilters;
+	static Map<String, List<String>> preferenceFilters = new HashMap<String, List<String>>();
+
+	static String activeFilter;
 
 	static String fileNameFilters;
 
@@ -474,8 +475,13 @@
 		omitUnits = org.eclipse.mdht.uml.cda.ui.internal.Activator.getDefault().getPreferenceStore().getBoolean(
 			MDHTPreferences.OMIT_UNITS_STORE_VALUE);
 
-		preferenceFilters = org.eclipse.mdht.uml.cda.ui.internal.Activator.getDefault().getPreferenceStore().getString(
-			MDHTPreferences.CDA_REPORT_DEFAULT_FILTER);
+		MDHTPreferences.filtersFromString(
+			org.eclipse.mdht.uml.cda.ui.internal.Activator.getDefault().getPreferenceStore().getString(
+				MDHTPreferences.CDA_REPORT_FILTERS),
+			preferenceFilters);
+
+		activeFilter = org.eclipse.mdht.uml.cda.ui.internal.Activator.getDefault().getPreferenceStore().getString(
+			MDHTPreferences.CDA_REPORT_ACTIVE_FILTER);
 
 		fileNameFilters = org.eclipse.mdht.uml.cda.ui.internal.Activator.getDefault().getPreferenceStore().getString(
 			MDHTPreferences.CDA_REPORT_FILE_NAME_FILTERS);
@@ -559,16 +565,14 @@
 			if (filterSelectionDialog.open() != Window.OK) {
 				return null;
 			}
-			// return the selection
 
 			for (Object object : filterSelectionDialog.getResult()) {
 				theSections.add((EClass) object);
 			}
 
-		} else if (filterOption == null && !StringUtils.isEmpty(preferenceFilters)) {
+		} else if (filterOption == null && preferenceFilters.containsKey(activeFilter)) {
 			getFilterHash(theSectionCache);
-			List<String> result = Arrays.asList(preferenceFilters.split("\\s*,\\s*"));
-			for (String r : result) {
+			for (String r : preferenceFilters.get(activeFilter)) {
 				if (theSectionCache.containsKey(ConsolPackage.eINSTANCE.getEClassifier(r))) {
 					theSections.add((EClass) ConsolPackage.eINSTANCE.getEClassifier(r));
 				}
diff --git a/cda/plugins/org.eclipse.mdht.uml.cda.ui/src/org/eclipse/mdht/uml/cda/ui/editors/MDHTPreferences.java b/cda/plugins/org.eclipse.mdht.uml.cda.ui/src/org/eclipse/mdht/uml/cda/ui/editors/MDHTPreferences.java
index fc47833..2a0d2d2 100644
--- a/cda/plugins/org.eclipse.mdht.uml.cda.ui/src/org/eclipse/mdht/uml/cda/ui/editors/MDHTPreferences.java
+++ b/cda/plugins/org.eclipse.mdht.uml.cda.ui/src/org/eclipse/mdht/uml/cda/ui/editors/MDHTPreferences.java
@@ -18,7 +18,9 @@
 import java.util.HashMap;
 import java.util.HashSet;
 import java.util.List;
+import java.util.Map;
 import java.util.Set;
+import java.util.stream.Collectors;
 
 import org.apache.commons.lang.StringUtils;
 import org.eclipse.emf.common.util.TreeIterator;
@@ -26,13 +28,19 @@
 import org.eclipse.emf.ecore.EObject;
 import org.eclipse.emf.ecore.EPackage;
 import org.eclipse.jface.dialogs.IDialogConstants;
+import org.eclipse.jface.dialogs.IInputValidator;
+import org.eclipse.jface.dialogs.InputDialog;
 import org.eclipse.jface.preference.IPreferenceStore;
 import org.eclipse.jface.preference.PreferencePage;
 import org.eclipse.jface.viewers.ILabelProvider;
 import org.eclipse.jface.viewers.ILabelProviderListener;
 import org.eclipse.jface.window.Window;
 import org.eclipse.mdht.uml.cda.ui.internal.Activator;
+import org.eclipse.mdht.uml.cda.ui.internal.Logger;
 import org.eclipse.swt.SWT;
+import org.eclipse.swt.custom.CCombo;
+import org.eclipse.swt.events.SelectionAdapter;
+import org.eclipse.swt.events.SelectionEvent;
 import org.eclipse.swt.graphics.Image;
 import org.eclipse.swt.layout.GridData;
 import org.eclipse.swt.layout.GridLayout;
@@ -86,7 +94,9 @@
 
 	public static String OMIT_VALIDATION_STORE_VALUE = "OmitValidationStoreValue";
 
-	public static String CDA_REPORT_DEFAULT_FILTER = "CDAReportDefaultFilter";
+	public static String CDA_REPORT_FILTERS = "CDAReportDefaultFilter";
+
+	public static String CDA_REPORT_ACTIVE_FILTER = "CDAReportActiveFilter";
 
 	public static final String CDA_REPORT_FILE_NAME_FILTERS = "fileNameFilter";
 
@@ -102,6 +112,7 @@
 
 	private static String OMIT_VALIDATION_CHECK_BOX_TOOLTIP = "Do not include DCDA Validation in reports";
 
+	// org.eclipse.ui.dialogs.EditorSelectionDialog
 	/**
 	 * FilterListSelectionDialog
 	 * The dialog buttons were not easily accessible to change the text for OK and Cancel
@@ -148,11 +159,15 @@
 
 	private Text cdaReportFilterText;
 
+	private CCombo cdaReportFilterCombo;
+
 	private Text cdaFileFiltersText;
 
 	private Button omitValidationCheckBox;
 
-	final ArrayList<String> cdaReportfilters = new ArrayList<String>();
+	String cdaReportActivefilter;
+
+	Map<String, List<String>> cdaReportfilters = new HashMap<String, List<String>>();
 
 	/**
 	 * Creates an new checkbox instance and sets the default
@@ -175,6 +190,26 @@
 
 	FilterListSelectionDialog filterSelectionDialog = null;
 
+	private Button setFilterButton;
+
+	private Button createAddFilterButton(Composite group, String label, String toolTip) {
+		Button button = new Button(group, SWT.PUSH | SWT.LEFT);
+		button.setText(label);
+		button.setToolTipText(toolTip);
+		GridData data = new GridData();
+		button.setLayoutData(data);
+
+		button.addListener(SWT.Selection, new Listener() {
+
+			@Override
+			public void handleEvent(Event event) {
+				addFilterName("<<FilterName>>", cdaReportfilters.keySet());
+			}
+		});
+		return button;
+
+	}
+
 	private Button createFilterButton(Composite group, String label, String toolTip) {
 
 		ILabelProvider lp = new ILabelProvider() {
@@ -238,12 +273,6 @@
 
 		filterSelectionDialog.setMultipleSelection(true);
 
-		String currentSelections = cdaReportFilterText.getText();
-
-		// currentSelections.split("\\s*,\\s*"));
-
-		// filterSelectionDialog.setInitialElementSelections(selectedElements);
-
 		Button button = new Button(group, SWT.PUSH | SWT.LEFT);
 		button.setText(label);
 		button.setToolTipText(toolTip);
@@ -269,13 +298,19 @@
 
 				switch (filterSelectionDialog.open()) {
 					case Window.OK:
-						for (Object object : filterSelectionDialog.getResult()) {
-							cdaReportfilters.add(((EClass) object).getName());
+						if (cdaReportfilters.containsKey(cdaReportActivefilter)) {
+							cdaReportfilters.get(cdaReportActivefilter).clear();
+						} else {
+							cdaReportfilters.put(cdaReportActivefilter, new ArrayList<String>());
 						}
-						cdaReportFilterText.setText(formatFilterNames(cdaReportfilters));
+
+						for (Object object : filterSelectionDialog.getResult()) {
+							cdaReportfilters.get(cdaReportActivefilter).add(((EClass) object).getName());
+						}
+						cdaReportFilterText.setText(formatFilterNames(cdaReportfilters.get(cdaReportActivefilter)));
 						break;
 					case Window.CANCEL:
-						cdaReportfilters.clear();
+						cdaReportfilters.get(cdaReportActivefilter).clear();
 						cdaReportFilterText.setText(NONE);
 						break;
 				}
@@ -286,11 +321,15 @@
 
 	private String formatFilterNames(List<String> filterNames) {
 		StringBuilder formattedFilters = new StringBuilder();
-		for (String filter : filterNames) {
-			if (formattedFilters.length() > 0) {
-				formattedFilters.append(System.getProperty("line.separator"));
+		if (filterNames != null) {
+			for (String filter : filterNames) {
+				if (formattedFilters.length() > 0) {
+					formattedFilters.append(System.getProperty("line.separator"));
+				}
+				formattedFilters.append(formatFilterName(filter));
 			}
-			formattedFilters.append(formatFilterName(filter));
+		} else {
+			formattedFilters.append("NONE");
 		}
 		return formattedFilters.toString();
 	}
@@ -344,6 +383,7 @@
 	 */
 	@Override
 	protected Control createContents(Composite parent) {
+
 		PlatformUI.getWorkbench().getHelpSystem().setHelp(parent, "MDHTPreferences");
 
 		Composite composite_textField = createComposite(parent, 2);
@@ -365,12 +405,51 @@
 		omitUnitsCheckBox = createCheckBox(
 			units_composite_textField, OMIT_UNITS_CHECK_BOX_LABEL, OMIT_UNITS_CHECK_BOX_TOOLTIP);
 
+		// Need to call ths before combo set up but after check box setups - bad design swm
+		initializeValues();
+
 		Composite filterLabelComposite = createComposite(parent, 2);
 		Label filterLabel = new Label(filterLabelComposite, SWT.LEFT);
-		filterLabel.setText("CDA Default Report Filters");
+		filterLabel.setText("Report Section Filters");
+
+		Composite filterComboLabelComposite = createComposite(parent, 2);
+		Label filterComboLabel = new Label(filterComboLabelComposite, SWT.LEFT);
+		filterComboLabel.setText("Active Filter");
+
+		Composite filter_Combo = createComposite(parent, 1);
+
+		cdaReportFilterCombo = new CCombo(filter_Combo, SWT.READ_ONLY);
+
+		String[] items = cdaReportfilters.keySet().stream().toArray(String[]::new);
+
+		if (items.length == 0) {
+			ArrayList<String> noneList = new ArrayList<String>();
+			noneList.add(NONE);
+			items = noneList.toArray(String[]::new);
+		}
+
+		cdaReportFilterCombo.setItems(items);
+		cdaReportFilterCombo.select(Arrays.asList(cdaReportFilterCombo.getItems()).indexOf(this.cdaReportActivefilter));
+
+		cdaReportFilterCombo.addSelectionListener(new SelectionAdapter() {
+			@Override
+			public void widgetSelected(SelectionEvent e) {
+				Logger.log(
+					Logger.INFO,
+					"Selection: " + cdaReportFilterCombo.getItem(cdaReportFilterCombo.getSelectionIndex()));
+				cdaReportActivefilter = cdaReportFilterCombo.getItem(cdaReportFilterCombo.getSelectionIndex());
+				cdaReportFilterText.setText(formatFilterNames(cdaReportfilters.get(cdaReportActivefilter)));
+				if (cdaReportActivefilter.equals("NONE") || StringUtils.isEmpty(cdaReportActivefilter)) {
+					setFilterButton.setEnabled(false);
+				} else {
+					setFilterButton.setEnabled(true);
+				}
+
+			}
+		});
 
 		Composite filter_text = createComposite(parent, 1);
-		// filter_text
+
 		cdaReportFilterText = new Text(filter_text, SWT.MULTI | SWT.BORDER | SWT.WRAP | SWT.V_SCROLL | SWT.LEFT);
 
 		GridData gd = new GridData(SWT.FILL, SWT.FILL, true, true);
@@ -379,9 +458,19 @@
 		cdaReportFilterText.setEditable(false);
 
 		Composite filter_composite = createComposite(parent, 2);
-		createFilterButton(filter_composite, "Set Default Filters", "Set the default filters for CDA spreadsheet");
+		setFilterButton = createFilterButton(
+			filter_composite, "Set Section Filters", "Set the Section filters for CDA spreadsheet");
 
-		initializeValues();
+		if (this.cdaReportActivefilter.equals("NONE") || StringUtils.isEmpty(cdaReportActivefilter)) {
+			setFilterButton.setEnabled(false);
+		} else {
+			setFilterButton.setEnabled(true);
+		}
+
+		Composite addFilter_composite = createComposite(parent, 3);
+		createAddFilterButton(addFilter_composite, "Add Filters", "Add filter for CDA spreadsheet");
+
+		cdaReportFilterText.setText(formatFilterNames(cdaReportfilters.get(cdaReportActivefilter)));
 
 		return new Composite(parent, SWT.NULL);
 	}
@@ -412,6 +501,7 @@
 		omitUnitsCheckBox.setSelection(store.getBoolean(OMIT_UNITS_STORE_VALUE));
 		omitValidationCheckBox.setSelection(store.getBoolean(OMIT_VALIDATION_STORE_VALUE));
 		cdaReportFilterText.setText(NONE);
+		cdaReportActivefilter = NONE;
 	}
 
 	/**
@@ -424,8 +514,21 @@
 		omitDOBCheckBox.setSelection(store.getBoolean(OMIT_DOB_STORE_VALUE));
 		omitUnitsCheckBox.setSelection(store.getBoolean(OMIT_UNITS_STORE_VALUE));
 		omitValidationCheckBox.setSelection(store.getBoolean(OMIT_VALIDATION_STORE_VALUE));
-		String preferenceFilters = store.getString(CDA_REPORT_DEFAULT_FILTER);
-		cdaReportFilterText.setText(formatFilterNames(Arrays.asList(preferenceFilters.split("\\s*,\\s*"))));
+
+		filtersFromString(store.getString(CDA_REPORT_FILTERS), cdaReportfilters);
+		for (String k3 : cdaReportfilters.keySet()) {
+			Logger.log(Logger.INFO, "LOOPNG " + k3);
+			Logger.log(Logger.INFO, "VALUE " + cdaReportfilters.get(k3));
+		}
+		cdaReportActivefilter = store.getString(CDA_REPORT_ACTIVE_FILTER);
+
+		// cdaReportActivefilter = DEFAULT;
+
+		Logger.log(Logger.INFO, "READING  " + cdaReportActivefilter);
+		if (StringUtils.isEmpty(cdaReportActivefilter)) {
+			cdaReportActivefilter = NONE;
+		}
+
 	}
 
 	@Override
@@ -450,16 +553,39 @@
 		store.setValue(OMIT_DOB_STORE_VALUE, omitDOBCheckBox.getSelection());
 		store.setValue(OMIT_UNITS_STORE_VALUE, omitUnitsCheckBox.getSelection());
 		store.setValue(OMIT_VALIDATION_STORE_VALUE, omitValidationCheckBox.getSelection());
-		StringBuilder sb = new StringBuilder();
-		for (String filter : cdaReportfilters) {
-			if (sb.length() > 0) {
-				sb.append(",");
-			}
-			sb.append(filter);
-		}
-		store.setValue(CDA_REPORT_DEFAULT_FILTER, sb.toString());
-
+		store.setValue(CDA_REPORT_FILTERS, filtersToString(cdaReportfilters));
 		store.setValue(CDA_REPORT_FILE_NAME_FILTERS, "C62TXT");
+		store.setValue(CDA_REPORT_ACTIVE_FILTER, cdaReportActivefilter);
+	}
+
+	private static String filtersToString(Map<String, List<String>> map) {
+		String mapAsString = map.keySet().stream().map(
+			key -> key + "=" + " " + String.join(" ", map.get(key)) + " ").collect(Collectors.joining(", ", " ", " "));
+
+		Logger.log(Logger.INFO, "STORING  " + mapAsString);
+		return mapAsString;
+	}
+
+	public static void filtersFromString(String mapAsString, Map<String, List<String>> filters) {
+
+		filters.clear();
+		Logger.log(Logger.INFO, "READING  " + mapAsString);
+
+		if (mapAsString.contains("=")) {
+			Map<String, String> map1 = Arrays.stream(mapAsString.split(",")).map(entry -> entry.split("=")).collect(
+				Collectors.toMap(entry -> entry[0], entry -> entry[1]));
+
+			for (String k : map1.keySet()) {
+				String key = StringUtils.trim(k);
+				filters.put(key, new ArrayList<String>());
+				filters.get(key).addAll(Arrays.asList(map1.get(k).split(" ")));
+			}
+
+		} else {
+			filters.put(NONE, new ArrayList<String>());
+			filters.get(NONE).addAll(Arrays.asList(mapAsString.split(" ")));
+		}
+
 	}
 
 	void getFilterHash(HashMap<EClass, HashSet<EClass>> theSections) {
@@ -540,4 +666,45 @@
 		}
 	}
 
+	private void addFilterName(String initialName, final Set<String> usedNames) {
+		InputDialog dlg = new InputDialog(
+			getShell(), "Add New Filter", "Enter Filter Name : ", initialName, new IInputValidator() {
+
+				@Override
+				public String isValid(String newText) {
+					newText = newText.trim();
+					if (newText.isEmpty()) {
+						return "EMPTY";
+					} else if (usedNames.contains(newText)) {
+						return "FILTER EXISTS";
+					}
+					return null;
+				}
+			});
+		if (dlg.open() == Window.OK) {
+			cdaReportActivefilter = dlg.getValue().trim();
+
+			Logger.log(Logger.INFO, "cdaReportActivefilter >>>" + cdaReportActivefilter);
+
+			ArrayList<String> filters = new ArrayList<String>();
+
+			filters.addAll(Arrays.asList(cdaReportFilterCombo.getItems()));
+			filters.add(cdaReportActivefilter);
+
+			for (String filter : filters) {
+				Logger.log(Logger.INFO, "filter >>>" + filter);
+			}
+			cdaReportFilterCombo.setItems(filters.toArray(String[]::new));
+			cdaReportFilterCombo.redraw();
+			cdaReportFilterCombo.select(
+				Arrays.asList(cdaReportFilterCombo.getItems()).indexOf(this.cdaReportActivefilter));
+			if (cdaReportActivefilter.equals("NONE") || StringUtils.isEmpty(cdaReportActivefilter)) {
+				setFilterButton.setEnabled(false);
+			} else {
+				setFilterButton.setEnabled(true);
+			}
+
+		}
+	}
+
 }
diff --git a/pom.xml b/pom.xml
index 23047bc..650b6fb 100644
--- a/pom.xml
+++ b/pom.xml
@@ -11,13 +11,13 @@
 

 	<properties>

 		<tycho-version>1.7.0</tycho-version>

-		<tychoExtrasVersion>1.7.0</tychoExtrasVersion>

+		<tychoExtrasVersion>2.0.0</tychoExtrasVersion>

 		<tycho.scmUrl>scm:git:git://git.eclipse.org/gitroot/mdht/org.eclipse.mdht</tycho.scmUrl>

 		<jarSignerVersion>1.1.2</jarSignerVersion>

 		<findbugs.version>3.0.1</findbugs.version>

 		<xtext.version>2.7.3</xtext.version>

-		<java.source.version>1.7</java.source.version>

-		<java.target.version>1.7</java.target.version>

+		<java.source.version>1.8</java.source.version>

+		<java.target.version>1.8</java.target.version>

 		<mylyn.wikitext.version>2.4.0-SNAPSHOT</mylyn.wikitext.version>

 		<skipAllTests>false</skipAllTests>

 		<skipInnerTests>true</skipInnerTests>

@@ -28,12 +28,12 @@
 

 		<!-- MDHT repositories. Used when we're building individual components 

 			(vs building the parent pom including everything) -->

-		<mdht.eclipse.target>oxygen</mdht.eclipse.target>

+		<mdht.eclipse.target>2019-09</mdht.eclipse.target>

 		<mdht.repo.main>${eclipse.download}/modeling/mdht/updates/nightly/${mdht.eclipse.target}</mdht.repo.main>

 		

 		 

-    <maven.compiler.source>1.7</maven.compiler.source>

-    <maven.compiler.target>1.7</maven.compiler.target>

+    <maven.compiler.source>1.8</maven.compiler.source>

+    <maven.compiler.target>1.8</maven.compiler.target>

  

 

 	</properties>

@@ -114,26 +114,11 @@
 					<configuration>

 						<environments>

 							<environment>

-								<os>linux</os>

-								<ws>gtk</ws>

-								<arch>x86_64</arch>

-							</environment>

-							<environment>

-								<os>linux</os>

-								<ws>gtk</ws>

-								<arch>x86</arch>

-							</environment>

-							<environment>

 								<os>win32</os>

 								<ws>win32</ws>

 								<arch>x86_64</arch>

 							</environment>

 							<environment>

-								<os>win32</os>

-								<ws>win32</ws>

-								<arch>x86</arch>

-							</environment>

-							<environment>

 								<os>macosx</os>

 								<ws>cocoa</ws>

 								<arch>x86_64</arch>