From: <pat...@us...> - 2010-07-08 17:37:48
|
Revision: 1082 http://cishell.svn.sourceforge.net/cishell/?rev=1082&view=rev Author: pataphil Date: 2010-07-08 17:37:42 +0000 (Thu, 08 Jul 2010) Log Message: ----------- * Committing (partially done) GUIModel framework and additional MapUtilities. Modified Paths: -------------- trunk/core/org.cishell.utilities/META-INF/MANIFEST.MF trunk/core/org.cishell.utilities/src/org/cishell/utilities/MapUtilities.java Added Paths: ----------- trunk/core/org.cishell.utilities/src/org/cishell/utilities/swt/model/ trunk/core/org.cishell.utilities/src/org/cishell/utilities/swt/model/GUIModel.java trunk/core/org.cishell.utilities/src/org/cishell/utilities/swt/model/GUIModelField.java trunk/core/org.cishell.utilities/src/org/cishell/utilities/swt/model/ModelFieldException.java trunk/core/org.cishell.utilities/src/org/cishell/utilities/swt/model/datasynchronizer/ trunk/core/org.cishell.utilities/src/org/cishell/utilities/swt/model/datasynchronizer/CheckBoxDataSynchronizer.java trunk/core/org.cishell.utilities/src/org/cishell/utilities/swt/model/datasynchronizer/DateDataSynchronizer.java trunk/core/org.cishell.utilities/src/org/cishell/utilities/swt/model/datasynchronizer/DropDownDataSynchronizer.java trunk/core/org.cishell.utilities/src/org/cishell/utilities/swt/model/datasynchronizer/ModelDataSynchronizer.java trunk/core/org.cishell.utilities/src/org/cishell/utilities/swt/model/datasynchronizer/TimeDataSynchronizer.java Modified: trunk/core/org.cishell.utilities/META-INF/MANIFEST.MF =================================================================== --- trunk/core/org.cishell.utilities/META-INF/MANIFEST.MF 2010-07-06 20:19:54 UTC (rev 1081) +++ trunk/core/org.cishell.utilities/META-INF/MANIFEST.MF 2010-07-08 17:37:42 UTC (rev 1082) @@ -36,6 +36,8 @@ org.cishell.utilities.mutateParameter.defaultvalue, org.cishell.utilities.mutateParameter.dropdown, org.cishell.utilities.osgi.logging, - org.cishell.utilities.swt + org.cishell.utilities.swt, + org.cishell.utilities.swt.model, + org.cishell.utilities.swt.model.datasynchronizer Require-Bundle: org.eclipse.ui;resolution:=optional, org.eclipse.core.runtime;resolution:=optional Modified: trunk/core/org.cishell.utilities/src/org/cishell/utilities/MapUtilities.java =================================================================== --- trunk/core/org.cishell.utilities/src/org/cishell/utilities/MapUtilities.java 2010-07-06 20:19:54 UTC (rev 1081) +++ trunk/core/org.cishell.utilities/src/org/cishell/utilities/MapUtilities.java 2010-07-08 17:37:42 UTC (rev 1082) @@ -2,6 +2,8 @@ import java.util.ArrayList; import java.util.Collection; +import java.util.HashMap; +import java.util.List; import java.util.Map; public class MapUtilities { @@ -20,4 +22,44 @@ return workingKeys; } + + public static<T> Map<T, T> mirror(Collection<T> items) { + Map<T, T> mirroredItems = new HashMap<T, T>(); + + for (T item : items) { + mirroredItems.put(item, item); + } + + return mirroredItems; + } + + public static<K, V> List<K> keysWithOrder(Map<K, V> map) { + List<K> keys = new ArrayList<K>(); + + for (K key : map.keySet()) { + keys.add(key); + } + + return keys; + } + + public static<K, V> Collection<V> valuesWithPreservedOrder(Map<K, V> map, Collection<K> keys) { + List<V> values = new ArrayList<V>(); + + for (K key : keys) { + values.add(map.get(key)); + } + + return values; + } + + public static<V> Map<Integer, V> mapIndexToValues(List<V> values) { + Map<Integer, V> valuesByIndex = new HashMap<Integer, V>(); + + for (int ii = 0; ii < values.size(); ii++) { + valuesByIndex.put(ii, values.get(ii)); + } + + return valuesByIndex; + } } \ No newline at end of file Added: trunk/core/org.cishell.utilities/src/org/cishell/utilities/swt/model/GUIModel.java =================================================================== --- trunk/core/org.cishell.utilities/src/org/cishell/utilities/swt/model/GUIModel.java (rev 0) +++ trunk/core/org.cishell.utilities/src/org/cishell/utilities/swt/model/GUIModel.java 2010-07-08 17:37:42 UTC (rev 1082) @@ -0,0 +1,110 @@ +package org.cishell.utilities.swt.model; + +import java.util.ArrayList; +import java.util.Collection; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import org.cishell.utilities.swt.model.datasynchronizer.CheckBoxDataSynchronizer; +import org.cishell.utilities.swt.model.datasynchronizer.DateDataSynchronizer; +import org.cishell.utilities.swt.model.datasynchronizer.DropDownDataSynchronizer; +import org.cishell.utilities.swt.model.datasynchronizer.ModelDataSynchronizer; +import org.cishell.utilities.swt.model.datasynchronizer.TimeDataSynchronizer; +import org.eclipse.swt.SWT; +import org.eclipse.swt.widgets.Button; +import org.eclipse.swt.widgets.Combo; +import org.eclipse.swt.widgets.Composite; +import org.eclipse.swt.widgets.DateTime; + +public class GUIModel { + private Map<String, GUIModelField<?>> inputFieldsByName = + new HashMap<String, GUIModelField<?>>(); + + public GUIModel() { + } + + public Collection<String> getFieldNames() { + return this.inputFieldsByName.keySet(); + } + + public Collection<GUIModelField<?>> getFields() { + return this.inputFieldsByName.values(); + } + + public GUIModelField<?> getField(String name) { + return this.inputFieldsByName.get(name); + } + + public Button addCheckBox(String name, boolean on, Composite parent, int style) { + Button checkBox = new Button(parent, style | SWT.CHECK); + ModelDataSynchronizer<Boolean> dataSynchronizer = + new CheckBoxDataSynchronizer(checkBox, on); + GUIModelField<Boolean> field = + new GUIModelField<Boolean>(name, on, checkBox, dataSynchronizer); + addField(field); + + return checkBox; + } + + public Combo addDropDown( + String name, + int selectedIndex, + Collection<String> unorderedOptionLabels, + Map<String, String> optionValuesByLabels, + Composite parent, + int style) { + List<String> orderedOptionLabels = new ArrayList<String>(unorderedOptionLabels); + Combo dropDown = new Combo(parent, style | SWT.DROP_DOWN); + ModelDataSynchronizer<String> dataSynchronizer = new DropDownDataSynchronizer( + dropDown, selectedIndex, orderedOptionLabels, optionValuesByLabels); + GUIModelField<String> field = new GUIModelField<String>( + name, orderedOptionLabels.get(selectedIndex), dropDown, dataSynchronizer); + addField(field); + + return dropDown; + } + + // TODO: Test this out. + public DateTime addDate( + String name, org.joda.time.DateTime date, Composite parent, int style) { + DateTime dateSelector = new DateTime(parent, style | SWT.DATE); + ModelDataSynchronizer<org.joda.time.DateTime> dataSynchronizer = + new DateDataSynchronizer(dateSelector, date); + GUIModelField<org.joda.time.DateTime> field = new GUIModelField<org.joda.time.DateTime>( + name, date, dateSelector, dataSynchronizer); + addField(field); + + return dateSelector; + } + + // TODO: Test this out. + public DateTime addTime( + String name, org.joda.time.DateTime time, Composite parent, int style) { + DateTime timeSelector = new DateTime(parent, style | SWT.TIME); + ModelDataSynchronizer<org.joda.time.DateTime> dataSynchronizer = + new TimeDataSynchronizer(timeSelector, time); + GUIModelField<org.joda.time.DateTime> field = new GUIModelField<org.joda.time.DateTime>( + name, time, timeSelector, dataSynchronizer); + addField(field); + + return timeSelector; + } + + // TODO: addCalendar + +// public List addSingleSelectionList( +// String name, + + public<T> void addField(GUIModelField<T> field) { + String fieldName = field.getName(); + + if (this.inputFieldsByName.containsKey(fieldName)) { + String exceptionMessage = + "A field with the name \"" + fieldName + "\" already exists. Unable to continue."; + throw new ModelFieldException(exceptionMessage); + } + + this.inputFieldsByName.put(fieldName, field); + } +} \ No newline at end of file Added: trunk/core/org.cishell.utilities/src/org/cishell/utilities/swt/model/GUIModelField.java =================================================================== --- trunk/core/org.cishell.utilities/src/org/cishell/utilities/swt/model/GUIModelField.java (rev 0) +++ trunk/core/org.cishell.utilities/src/org/cishell/utilities/swt/model/GUIModelField.java 2010-07-08 17:37:42 UTC (rev 1082) @@ -0,0 +1,51 @@ +package org.cishell.utilities.swt.model; + +import org.cishell.utilities.swt.model.datasynchronizer.ModelDataSynchronizer; +import org.eclipse.swt.widgets.Event; +import org.eclipse.swt.widgets.Listener; +import org.eclipse.swt.widgets.Widget; + +public class GUIModelField<T> { + private String name; + private T defaultValue; + private T value; + private Widget widget; + private ModelDataSynchronizer<T> dataSynchronizer; + + public GUIModelField( + String name, + T defaultValue, + Widget widget, + ModelDataSynchronizer<T> dataSynchronizer) { + this.name = name; + this.defaultValue = defaultValue; + this.value = this.defaultValue; + this.widget = widget; + this.dataSynchronizer = dataSynchronizer; + + this.widget.addListener(this.dataSynchronizer.swtUpdateListenerCode(), new Listener() { + public void handleEvent(Event event) { + if (event.type == GUIModelField.this.dataSynchronizer.swtUpdateListenerCode()) { + GUIModelField.this.value = + GUIModelField.this.dataSynchronizer.synchronizeFromGUI(); + } + } + }); + } + + public String getName() { + return this.name; + } + + public T getValue() { + return this.value; + } + + public void setValue(T value) { + this.value = this.dataSynchronizer.synchronizeToGUI(value); + } + + public void reset() { + this.value = this.dataSynchronizer.reset(this.defaultValue); + } +} \ No newline at end of file Added: trunk/core/org.cishell.utilities/src/org/cishell/utilities/swt/model/ModelFieldException.java =================================================================== --- trunk/core/org.cishell.utilities/src/org/cishell/utilities/swt/model/ModelFieldException.java (rev 0) +++ trunk/core/org.cishell.utilities/src/org/cishell/utilities/swt/model/ModelFieldException.java 2010-07-08 17:37:42 UTC (rev 1082) @@ -0,0 +1,21 @@ +package org.cishell.utilities.swt.model; + +public class ModelFieldException extends RuntimeException { + private static final long serialVersionUID = 1L; + + public ModelFieldException() { + super(); + } + + public ModelFieldException(String arg0) { + super(arg0); + } + + public ModelFieldException(Throwable arg0) { + super(arg0); + } + + public ModelFieldException(String arg0, Throwable arg1) { + super(arg0, arg1); + } +} \ No newline at end of file Added: trunk/core/org.cishell.utilities/src/org/cishell/utilities/swt/model/datasynchronizer/CheckBoxDataSynchronizer.java =================================================================== --- trunk/core/org.cishell.utilities/src/org/cishell/utilities/swt/model/datasynchronizer/CheckBoxDataSynchronizer.java (rev 0) +++ trunk/core/org.cishell.utilities/src/org/cishell/utilities/swt/model/datasynchronizer/CheckBoxDataSynchronizer.java 2010-07-08 17:37:42 UTC (rev 1082) @@ -0,0 +1,35 @@ +package org.cishell.utilities.swt.model.datasynchronizer; + +import org.eclipse.swt.SWT; +import org.eclipse.swt.widgets.Button; + +public class CheckBoxDataSynchronizer implements ModelDataSynchronizer<Boolean> { + private Button checkBox; + + public CheckBoxDataSynchronizer(Button checkBox, boolean on) { + this.checkBox = checkBox; + this.checkBox.setSelection(on); + } + + public int swtUpdateListenerCode() { + return SWT.Selection; + } + + public Boolean value() { + return this.checkBox.getSelection(); + } + + public Boolean synchronizeFromGUI() { + return value(); + } + + public Boolean synchronizeToGUI(Boolean value) { + this.checkBox.setSelection(value); + + return value; + } + + public Boolean reset(Boolean defaultValue) { + return synchronizeToGUI(defaultValue); + } +} \ No newline at end of file Added: trunk/core/org.cishell.utilities/src/org/cishell/utilities/swt/model/datasynchronizer/DateDataSynchronizer.java =================================================================== --- trunk/core/org.cishell.utilities/src/org/cishell/utilities/swt/model/datasynchronizer/DateDataSynchronizer.java (rev 0) +++ trunk/core/org.cishell.utilities/src/org/cishell/utilities/swt/model/datasynchronizer/DateDataSynchronizer.java 2010-07-08 17:37:42 UTC (rev 1082) @@ -0,0 +1,42 @@ +package org.cishell.utilities.swt.model.datasynchronizer; + +import org.eclipse.swt.SWT; +import org.eclipse.swt.widgets.DateTime; + +public class DateDataSynchronizer implements ModelDataSynchronizer<org.joda.time.DateTime> { + private DateTime dateSelector; + + public DateDataSynchronizer(DateTime dateSelector, org.joda.time.DateTime date) { + this.dateSelector = dateSelector; + synchronizeToGUI(date); + } + + public int swtUpdateListenerCode() { + return SWT.Selection; + } + + public org.joda.time.DateTime value() { + return new org.joda.time.DateTime( + this.dateSelector.getYear(), + this.dateSelector.getMonth(), + this.dateSelector.getDay(), + 0, + 0, + 0, + 0); + } + + public org.joda.time.DateTime synchronizeFromGUI() { + return value(); + } + + public org.joda.time.DateTime synchronizeToGUI(org.joda.time.DateTime date) { + this.dateSelector.setDate(date.getYear(), date.getMonthOfYear(), date.getDayOfMonth()); + + return value(); + } + + public org.joda.time.DateTime reset(org.joda.time.DateTime defaultValue) { + return synchronizeToGUI(defaultValue); + } +} \ No newline at end of file Added: trunk/core/org.cishell.utilities/src/org/cishell/utilities/swt/model/datasynchronizer/DropDownDataSynchronizer.java =================================================================== --- trunk/core/org.cishell.utilities/src/org/cishell/utilities/swt/model/datasynchronizer/DropDownDataSynchronizer.java (rev 0) +++ trunk/core/org.cishell.utilities/src/org/cishell/utilities/swt/model/datasynchronizer/DropDownDataSynchronizer.java 2010-07-08 17:37:42 UTC (rev 1082) @@ -0,0 +1,54 @@ +package org.cishell.utilities.swt.model.datasynchronizer; + +import java.util.List; +import java.util.Map; + +import org.cishell.utilities.MapUtilities; +import org.eclipse.swt.SWT; +import org.eclipse.swt.widgets.Combo; + +import com.google.common.collect.BiMap; +import com.google.common.collect.HashBiMap; + +// TODO: Make this so options can change on it. +public class DropDownDataSynchronizer implements ModelDataSynchronizer<String> { + private Combo dropDown; + private BiMap<Integer, String> optionLabels; + private Map<String, String> optionValuesByLabels; + + public DropDownDataSynchronizer( + Combo dropDown, + int selectedIndex, + List<String> optionLabels, + Map<String, String> optionValuesByLabels) { + this.dropDown = dropDown; + this.optionLabels = HashBiMap.create(MapUtilities.mapIndexToValues(optionLabels)); + this.optionValuesByLabels = optionValuesByLabels; + + this.dropDown.setItems(optionLabels.toArray(new String[0])); + this.dropDown.select(selectedIndex); + } + + public int swtUpdateListenerCode() { + return SWT.Selection; + } + + public String value() { + return this.optionValuesByLabels.get( + this.optionLabels.get(this.dropDown.getSelectionIndex())); + } + + public String synchronizeFromGUI() { + return this.optionLabels.get(this.dropDown.getSelectionIndex()); + } + + public String synchronizeToGUI(String value) { + this.dropDown.select(this.optionLabels.inverse().get(value)); + + return value(); + } + + public String reset(String defaultValue) { + return synchronizeToGUI(defaultValue); + } +} \ No newline at end of file Added: trunk/core/org.cishell.utilities/src/org/cishell/utilities/swt/model/datasynchronizer/ModelDataSynchronizer.java =================================================================== --- trunk/core/org.cishell.utilities/src/org/cishell/utilities/swt/model/datasynchronizer/ModelDataSynchronizer.java (rev 0) +++ trunk/core/org.cishell.utilities/src/org/cishell/utilities/swt/model/datasynchronizer/ModelDataSynchronizer.java 2010-07-08 17:37:42 UTC (rev 1082) @@ -0,0 +1,9 @@ +package org.cishell.utilities.swt.model.datasynchronizer; + +public interface ModelDataSynchronizer<T> { + public int swtUpdateListenerCode(); + public T value(); + public T synchronizeFromGUI(); + public T synchronizeToGUI(T value); + public T reset(T defaultValue); +} \ No newline at end of file Added: trunk/core/org.cishell.utilities/src/org/cishell/utilities/swt/model/datasynchronizer/TimeDataSynchronizer.java =================================================================== --- trunk/core/org.cishell.utilities/src/org/cishell/utilities/swt/model/datasynchronizer/TimeDataSynchronizer.java (rev 0) +++ trunk/core/org.cishell.utilities/src/org/cishell/utilities/swt/model/datasynchronizer/TimeDataSynchronizer.java 2010-07-08 17:37:42 UTC (rev 1082) @@ -0,0 +1,43 @@ +package org.cishell.utilities.swt.model.datasynchronizer; + +import org.eclipse.swt.SWT; +import org.eclipse.swt.widgets.DateTime; + +public class TimeDataSynchronizer implements ModelDataSynchronizer<org.joda.time.DateTime> { + private DateTime timeSelector; + + public TimeDataSynchronizer(DateTime timeSelector, org.joda.time.DateTime time) { + this.timeSelector = timeSelector; + synchronizeToGUI(time); + } + + public int swtUpdateListenerCode() { + return SWT.Selection; + } + + public org.joda.time.DateTime value() { + return new org.joda.time.DateTime( + 0, + 0, + 0, + this.timeSelector.getHours(), + this.timeSelector.getMinutes(), + this.timeSelector.getSeconds(), + 0); + } + + public org.joda.time.DateTime synchronizeFromGUI() { + return value(); + } + + public org.joda.time.DateTime synchronizeToGUI(org.joda.time.DateTime time) { + this.timeSelector.setTime( + time.getHourOfDay(), time.getMinuteOfHour(), time.getSecondOfMinute()); + + return value(); + } + + public org.joda.time.DateTime reset(org.joda.time.DateTime defaultValue) { + return synchronizeToGUI(defaultValue); + } +} \ No newline at end of file This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |