|
From: <pat...@us...> - 2010-08-03 17:21:08
|
Revision: 1105
http://cishell.svn.sourceforge.net/cishell/?rev=1105&view=rev
Author: pataphil
Date: 2010-08-03 17:21:00 +0000 (Tue, 03 Aug 2010)
Log Message:
-----------
* Moved SWT Utilities out of org.cishell.utilities bundle.
Modified Paths:
--------------
trunk/core/org.cishell.utilities.swt/META-INF/MANIFEST.MF
Added Paths:
-----------
trunk/core/org.cishell.utilities.swt/src/org/cishell/utilities/swt/ExpandableComponentWidget.java
trunk/core/org.cishell.utilities.swt/src/org/cishell/utilities/swt/FileSaveAs.java
trunk/core/org.cishell.utilities.swt/src/org/cishell/utilities/swt/GUIBuilderUtilities.java
trunk/core/org.cishell.utilities.swt/src/org/cishell/utilities/swt/GUICanceledException.java
trunk/core/org.cishell.utilities.swt/src/org/cishell/utilities/swt/GridContainer.java
trunk/core/org.cishell.utilities.swt/src/org/cishell/utilities/swt/SWTUtilities.java
trunk/core/org.cishell.utilities.swt/src/org/cishell/utilities/swt/ScrolledComponentFactory.java
trunk/core/org.cishell.utilities.swt/src/org/cishell/utilities/swt/URLClickedListener.java
trunk/core/org.cishell.utilities.swt/src/org/cishell/utilities/swt/URLMouseCursorListener.java
trunk/core/org.cishell.utilities.swt/src/org/cishell/utilities/swt/model/
trunk/core/org.cishell.utilities.swt/src/org/cishell/utilities/swt/model/GUIModel.java
trunk/core/org.cishell.utilities.swt/src/org/cishell/utilities/swt/model/GUIModelField.java
trunk/core/org.cishell.utilities.swt/src/org/cishell/utilities/swt/model/GUIModelGroup.java
trunk/core/org.cishell.utilities.swt/src/org/cishell/utilities/swt/model/ModelFieldException.java
trunk/core/org.cishell.utilities.swt/src/org/cishell/utilities/swt/model/datasynchronizer/
trunk/core/org.cishell.utilities.swt/src/org/cishell/utilities/swt/model/datasynchronizer/CheckBoxDataSynchronizer.java
trunk/core/org.cishell.utilities.swt/src/org/cishell/utilities/swt/model/datasynchronizer/DateDataSynchronizer.java
trunk/core/org.cishell.utilities.swt/src/org/cishell/utilities/swt/model/datasynchronizer/DropDownDataSynchronizer.java
trunk/core/org.cishell.utilities.swt/src/org/cishell/utilities/swt/model/datasynchronizer/ModelDataSynchronizer.java
trunk/core/org.cishell.utilities.swt/src/org/cishell/utilities/swt/model/datasynchronizer/SingleListSelectionDataSynchronizer.java
trunk/core/org.cishell.utilities.swt/src/org/cishell/utilities/swt/model/datasynchronizer/TextDataSynchronizer.java
trunk/core/org.cishell.utilities.swt/src/org/cishell/utilities/swt/model/datasynchronizer/TimeDataSynchronizer.java
Modified: trunk/core/org.cishell.utilities.swt/META-INF/MANIFEST.MF
===================================================================
--- trunk/core/org.cishell.utilities.swt/META-INF/MANIFEST.MF 2010-08-03 17:18:39 UTC (rev 1104)
+++ trunk/core/org.cishell.utilities.swt/META-INF/MANIFEST.MF 2010-08-03 17:21:00 UTC (rev 1105)
@@ -4,3 +4,9 @@
Bundle-SymbolicName: org.cishell.utilities.swt
Bundle-Version: 1.0.0
Bundle-RequiredExecutionEnvironment: J2SE-1.5
+Require-Bundle: org.eclipse.ui;bundle-version="3.4.1",
+ org.eclipse.core.runtime;bundle-version="3.4.0"
+Import-Package: com.google.common.collect,
+ org.cishell.utilities,
+ org.cishell.utilities.datastructure
+Export-Package: org.cishell.utilities.swt
Copied: trunk/core/org.cishell.utilities.swt/src/org/cishell/utilities/swt/ExpandableComponentWidget.java (from rev 1098, trunk/core/org.cishell.utilities/src/org/cishell/utilities/swt/ExpandableComponentWidget.java)
===================================================================
--- trunk/core/org.cishell.utilities.swt/src/org/cishell/utilities/swt/ExpandableComponentWidget.java (rev 0)
+++ trunk/core/org.cishell.utilities.swt/src/org/cishell/utilities/swt/ExpandableComponentWidget.java 2010-08-03 17:21:00 UTC (rev 1105)
@@ -0,0 +1,243 @@
+package org.cishell.utilities.swt;
+
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.List;
+import java.util.Map;
+
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.custom.ScrolledComposite;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.layout.GridLayout;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Label;
+
+/**
+ * This is meant to be subclassed.
+ */
+public class ExpandableComponentWidget<T> extends Composite {
+ public static final int COLUMN_AREA_LAYOUT_VERTICAL_SPACING = 1;
+ public static final int VERTICAL_SCROLL_INCREMENT = 50;
+
+ private ScrolledComponentFactory<T> componentFactory;
+ private Composite headerArea;
+ private ScrolledComposite scrollingArea;
+ private GridContainer scrolledAreaGrid;
+ private Composite footerArea;
+ private List<T> components = new ArrayList<T>();
+ private int uniqueComponentCount = 0;
+ private Collection<Label> columnLabels;
+
+ public ExpandableComponentWidget(
+ Composite parent, ScrolledComponentFactory<T> componentFactory) {
+ super(parent, SWT.NONE);
+ this.componentFactory = componentFactory;
+
+ setLayout(createLayout());
+ this.headerArea = createHeaderArea();
+ this.scrollingArea = createScrollingArea();
+ this.footerArea = createFooterArea();
+ this.scrolledAreaGrid = createScrolledAreaGrid(this.scrollingArea);
+
+ this.scrollingArea.setExpandHorizontal(true);
+ this.scrollingArea.setExpandVertical(true);
+ this.scrollingArea.setAlwaysShowScrollBars(true);
+ fixSize();
+ this.scrollingArea.setContent(this.scrolledAreaGrid.getActualParent());
+ this.scrollingArea.getVerticalBar().setPageIncrement(VERTICAL_SCROLL_INCREMENT);
+ this.columnLabels = createColumnLabels(this.scrolledAreaGrid.getActualParent(), SWT.NONE);
+ }
+
+ public Composite getHeaderArea() {
+ return this.headerArea;
+ }
+
+ public Composite getFooterArea() {
+ return this.footerArea;
+ }
+
+ public List<T> getComponents() {
+ return Collections.unmodifiableList(this.components);
+ }
+
+ public int getColumnCount() {
+ return 1;
+ }
+
+ public T addComponent(int style, Map<String, Object> arguments) {
+ // TODO: Fix this terrible hack?
+ if (this.components.size() == 0) {
+ for (Label columnLabel : this.columnLabels) {
+ columnLabel.setVisible(true);
+ }
+ }
+
+ final int componentCount = this.components.size();
+ T component = this.componentFactory.constructWidget(
+ this, this.scrolledAreaGrid, style, arguments, componentCount, this.uniqueComponentCount);
+ this.uniqueComponentCount++;
+
+ fixSize();
+
+ this.components.add(component);
+
+ return component;
+ }
+
+ public void removeComponent(int index) {
+ this.scrolledAreaGrid.removeRow(index);
+ this.components.remove(index);
+ fixSize();
+
+ for (int ii = 0; ii < this.components.size(); ii++) {
+ this.componentFactory.reindexComponent(this.components.get(ii), ii);
+ }
+
+ // TODO: Fix this terrible hack?
+ if (this.components.size() == 0) {
+ for (Label columnLabel : this.columnLabels) {
+ columnLabel.setVisible(false);
+ }
+ }
+ }
+
+ public Collection<Label> createColumnLabels(Composite parent, int style) {
+ List<Label> columnLabels = new ArrayList<Label>();
+
+ for (String columnLabelText : createColumnLabelTexts()) {
+ Label columnLabel = new Label(parent, style);
+ columnLabel.setLayoutData(createColumnLabelLayoutData());
+ columnLabel.setText(columnLabelText);
+ columnLabels.add(columnLabel);
+ }
+
+ return columnLabels;
+ }
+
+ public Collection<String> createColumnLabelTexts() {
+ List<String> columnLabelTexts = new ArrayList<String>();
+
+ for (int ii = 0; ii < getColumnCount(); ii++) {
+ columnLabelTexts.add("Column " + ii);
+ }
+
+ return columnLabelTexts;
+ }
+
+ private void fixSize() {
+ Composite scrolledArea = this.scrolledAreaGrid.getActualParent();
+ this.scrollingArea.setMinSize(scrolledArea.computeSize(SWT.DEFAULT, SWT.DEFAULT));
+ scrolledArea.pack();
+ }
+
+ protected Composite createHeaderArea() {
+ Composite headerArea = new Composite(this, SWT.NONE);
+ headerArea.setLayoutData(createHeaderAreaLayoutData());
+ headerArea.setLayout(createHeaderLayout());
+
+ return headerArea;
+ }
+
+ protected GridData createHeaderAreaLayoutData() {
+ GridData layoutData = new GridData(SWT.FILL, SWT.TOP, true, false);
+
+ return layoutData;
+ }
+
+ protected GridLayout createHeaderLayout() {
+ GridLayout layout = new GridLayout(1, false);
+ GUIBuilderUtilities.clearMargins(layout);
+ GUIBuilderUtilities.clearSpacing(layout);
+
+ return layout;
+ }
+
+ protected ScrolledComposite createScrollingArea() {
+ ScrolledComposite scrollingArea =
+ new ScrolledComposite(this, SWT.BORDER | SWT.V_SCROLL);
+ scrollingArea.setLayoutData(createScrollingAreaLayoutData());
+ scrollingArea.setLayout(createScrollingLayout());
+
+ return scrollingArea;
+ }
+
+ protected GridData createScrollingAreaLayoutData() {
+ GridData layoutData = new GridData(SWT.FILL, SWT.FILL, true, true);
+
+ return layoutData;
+ }
+
+ private GridLayout createScrollingLayout() {
+ GridLayout layout = new GridLayout(1, true);
+ GUIBuilderUtilities.clearMargins(layout);
+ GUIBuilderUtilities.clearSpacing(layout);
+
+ return layout;
+ }
+
+ protected Composite createFooterArea() {
+ Composite footerArea = new Composite(this, SWT.BORDER);
+ footerArea.setLayoutData(createFooterAreaLayoutData());
+ footerArea.setLayout(createFooterLayout());
+
+ return footerArea;
+ }
+
+ protected GridData createFooterAreaLayoutData() {
+ GridData layoutData = new GridData(SWT.FILL, SWT.TOP, true, false);
+
+ return layoutData;
+ }
+
+ protected GridLayout createFooterLayout() {
+ GridLayout layout = new GridLayout(1, false);
+ GUIBuilderUtilities.clearMargins(layout);
+ GUIBuilderUtilities.clearSpacing(layout);
+
+ return layout;
+ }
+
+ private GridContainer createScrolledAreaGrid(Composite parent) {
+ Composite columnArea = new Composite(parent, SWT.NONE);
+ columnArea.setLayoutData(createScrolledAreaLayoutData());
+ final int columnCount = getColumnCount();
+ columnArea.setLayout(createScrolledAreaLayout(columnCount));
+
+ return new GridContainer(columnArea, columnCount);
+ }
+
+ protected GridData createScrolledAreaLayoutData() {
+ GridData layoutData = new GridData(SWT.FILL, SWT.FILL, true, true);
+
+ return layoutData;
+ }
+
+ protected GridLayout createScrolledAreaLayout(int columnCount) {
+ GridLayout layout = new GridLayout(columnCount, false);
+// GUIBuilderUtilities.clearMargins(layout);
+// GUIBuilderUtilities.clearSpacing(layout);
+
+ return layout;
+ }
+
+ protected GridData createColumnLabelLayoutData() {
+ GridData layoutData = new GridData(SWT.CENTER, SWT.CENTER, false, false);
+
+ return layoutData;
+ }
+
+ protected GridData createComponentLayoutData() {
+ GridData layoutData = new GridData(SWT.FILL, SWT.TOP, true, false);
+
+ return layoutData;
+ }
+
+ private static GridLayout createLayout() {
+ GridLayout layout = new GridLayout(1, true);
+ GUIBuilderUtilities.clearMargins(layout);
+ GUIBuilderUtilities.clearSpacing(layout);
+
+ return layout;
+ }
+}
\ No newline at end of file
Property changes on: trunk/core/org.cishell.utilities.swt/src/org/cishell/utilities/swt/ExpandableComponentWidget.java
___________________________________________________________________
Added: svn:mergeinfo
+
Copied: trunk/core/org.cishell.utilities.swt/src/org/cishell/utilities/swt/FileSaveAs.java (from rev 1098, trunk/core/org.cishell.utilities/src/org/cishell/utilities/swt/FileSaveAs.java)
===================================================================
--- trunk/core/org.cishell.utilities.swt/src/org/cishell/utilities/swt/FileSaveAs.java (rev 0)
+++ trunk/core/org.cishell.utilities.swt/src/org/cishell/utilities/swt/FileSaveAs.java 2010-08-03 17:21:00 UTC (rev 1105)
@@ -0,0 +1,52 @@
+package org.cishell.utilities.swt;
+
+import java.io.File;
+
+import org.cishell.utilities.StringUtilities;
+import org.eclipse.jface.dialogs.MessageDialog;
+import org.eclipse.swt.widgets.FileDialog;
+import org.eclipse.swt.widgets.Shell;
+
+public class FileSaveAs {
+ public static final String DEFAULT_WINDOW_TITLE = "Save As";
+ public static final String CONFIRMATION_DIALOG_FORMAT =
+ "%s already exists.\nDo you want to replace it?";
+// public static final String YES_BUTTON_LABEL = "Yes";
+// public static final String NO_BUTTON_LABEL = "No";
+// public static final String[] BUTTON_LABELS = { YES_BUTTON_LABEL, NO_BUTTON_LABEL };
+
+ public static String saveFileAs(Shell parent) {
+ FileDialog saveDialog = new FileDialog(parent);
+ saveDialog.setText(DEFAULT_WINDOW_TITLE);
+
+ return saveFileAs(saveDialog);
+ }
+
+ public static String saveFileAs(Shell parent, int style) {
+ FileDialog saveDialog = new FileDialog(parent, style);
+ saveDialog.setText(DEFAULT_WINDOW_TITLE);
+
+ return saveFileAs(saveDialog);
+ }
+
+ public static String saveFileAs(FileDialog saveDialog) {
+ while (true) {
+ String selectedFilePath = saveDialog.open();
+
+ if (StringUtilities.isNull_Empty_OrWhitespace(selectedFilePath)) {
+ return null;
+ } else {
+ if (new File(selectedFilePath).exists()) {
+ if (MessageDialog.openConfirm(
+ saveDialog.getParent(),
+ saveDialog.getText(),
+ String.format(CONFIRMATION_DIALOG_FORMAT, selectedFilePath))) {
+ return selectedFilePath;
+ }
+ } else {
+ return selectedFilePath;
+ }
+ }
+ }
+ }
+}
\ No newline at end of file
Property changes on: trunk/core/org.cishell.utilities.swt/src/org/cishell/utilities/swt/FileSaveAs.java
___________________________________________________________________
Added: svn:mergeinfo
+
Copied: trunk/core/org.cishell.utilities.swt/src/org/cishell/utilities/swt/GUIBuilderUtilities.java (from rev 1101, trunk/core/org.cishell.utilities/src/org/cishell/utilities/swt/GUIBuilderUtilities.java)
===================================================================
--- trunk/core/org.cishell.utilities.swt/src/org/cishell/utilities/swt/GUIBuilderUtilities.java (rev 0)
+++ trunk/core/org.cishell.utilities.swt/src/org/cishell/utilities/swt/GUIBuilderUtilities.java 2010-08-03 17:21:00 UTC (rev 1105)
@@ -0,0 +1,124 @@
+package org.cishell.utilities.swt;
+
+import org.cishell.utilities.datastructure.ObjectContainer;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.events.ShellEvent;
+import org.eclipse.swt.events.ShellListener;
+import org.eclipse.swt.graphics.Point;
+import org.eclipse.swt.layout.GridLayout;
+import org.eclipse.swt.widgets.Display;
+import org.eclipse.swt.widgets.Event;
+import org.eclipse.swt.widgets.Listener;
+import org.eclipse.swt.widgets.Shell;
+
+public class GUIBuilderUtilities {
+ public static Display createDisplay() {
+ return new Display();
+ }
+
+ public static Shell createShell(
+ Display display,
+ String windowTitle,
+ int windowWidth,
+ int windowHeight,
+ int columnCount,
+ boolean clearSpacing) {
+ Shell shell = new Shell(display, SWT.CLOSE | SWT.MIN | SWT.TITLE);
+ shell.setText(windowTitle);
+ shell.setSize(windowWidth, windowHeight);
+ shell.setLayout(createShellLayout(columnCount, clearSpacing));
+
+ return shell;
+ }
+
+ public static GridLayout createShellLayout(int columnCount, boolean clearSpacing) {
+ GridLayout layout = new GridLayout(columnCount, true);
+
+ if (clearSpacing) {
+ clearSpacing(layout);
+ }
+
+ return layout;
+ }
+
+ public static void openShell(
+ Shell shell, int windowHeight, boolean useWindowHeightToSizeShell) {
+// if (useWindowHeightToSizeShell) {
+// /* (So far, we've created the shell at the maximum possible size we'll allow
+// * (according to windowHeight). This line shrinks the shell to be a more fitting size
+// * if the actual contents (i.e. our (number of) columns) are smaller than the maximum
+// * size we set.)
+// */
+// Point shellSize = shell.computeSize(SWT.DEFAULT, SWT.DEFAULT);
+// shell.setMinimumSize(shellSize.x, Math.min(windowHeight, shellSize.y));
+// }
+
+ shell.pack();
+ shell.open();
+
+ if (useWindowHeightToSizeShell) {
+ Point shellSize = shell.computeSize(SWT.DEFAULT, SWT.DEFAULT);
+ shell.setSize(shell.getSize().x, Math.min(windowHeight, shellSize.y));
+ }
+ }
+
+ public static void swtLoop(Display display, Shell shell) {
+ while (!shell.isDisposed()) {
+ if (!display.readAndDispatch()) {
+ display.sleep();
+ }
+ }
+
+ display.dispose();
+ }
+
+ public static void clearMargins(GridLayout layout) {
+ layout.marginTop = layout.marginBottom = layout.marginHeight = 0;
+ layout.marginLeft = layout.marginRight = layout.marginWidth = 0;
+ }
+
+ public static void clearSpacing(GridLayout layout) {
+ layout.horizontalSpacing = layout.verticalSpacing = 0;
+ }
+
+ public static void setCancelable(
+ final Shell shell, final ObjectContainer<GUICanceledException> exceptionThrown) {
+ shell.addListener(SWT.Traverse, new Listener() {
+ public void handleEvent(Event event) {
+ switch (event.detail) {
+ case SWT.TRAVERSE_ESCAPE:
+ shell.close();
+ event.detail = SWT.TRAVERSE_NONE;
+ event.doit = false;
+
+// if (exceptionThrown != null) {
+// String exceptionMessage = "Canceled by user.";
+// exceptionThrown.object = new GUICanceledException(exceptionMessage);
+// }
+
+ break;
+ }
+ }
+ });
+ shell.addShellListener(new ShellListener() {
+ public void shellActivated(ShellEvent event) {
+ }
+
+ public void shellClosed(ShellEvent event) {
+ if (exceptionThrown != null) {
+ String exceptionMessage = "Canceled by user.";
+ exceptionThrown.object = new GUICanceledException(exceptionMessage);
+ }
+ }
+
+ public void shellDeactivated(ShellEvent event) {
+ }
+
+ public void shellDeiconified(ShellEvent event) {
+ }
+
+ public void shellIconified(ShellEvent event) {
+ }
+ });
+ }
+}
\ No newline at end of file
Property changes on: trunk/core/org.cishell.utilities.swt/src/org/cishell/utilities/swt/GUIBuilderUtilities.java
___________________________________________________________________
Added: svn:mergeinfo
+
Copied: trunk/core/org.cishell.utilities.swt/src/org/cishell/utilities/swt/GUICanceledException.java (from rev 1098, trunk/core/org.cishell.utilities/src/org/cishell/utilities/swt/GUICanceledException.java)
===================================================================
--- trunk/core/org.cishell.utilities.swt/src/org/cishell/utilities/swt/GUICanceledException.java (rev 0)
+++ trunk/core/org.cishell.utilities.swt/src/org/cishell/utilities/swt/GUICanceledException.java 2010-08-03 17:21:00 UTC (rev 1105)
@@ -0,0 +1,21 @@
+package org.cishell.utilities.swt;
+
+public class GUICanceledException extends Exception {
+ private static final long serialVersionUID = 1L;
+
+ public GUICanceledException() {
+ super();
+ }
+
+ public GUICanceledException(String arg0) {
+ super(arg0);
+ }
+
+ public GUICanceledException(Throwable arg0) {
+ super(arg0);
+ }
+
+ public GUICanceledException(String arg0, Throwable arg1) {
+ super(arg0, arg1);
+ }
+}
\ No newline at end of file
Property changes on: trunk/core/org.cishell.utilities.swt/src/org/cishell/utilities/swt/GUICanceledException.java
___________________________________________________________________
Added: svn:mergeinfo
+
Copied: trunk/core/org.cishell.utilities.swt/src/org/cishell/utilities/swt/GridContainer.java (from rev 1098, trunk/core/org.cishell.utilities/src/org/cishell/utilities/swt/GridContainer.java)
===================================================================
--- trunk/core/org.cishell.utilities.swt/src/org/cishell/utilities/swt/GridContainer.java (rev 0)
+++ trunk/core/org.cishell.utilities.swt/src/org/cishell/utilities/swt/GridContainer.java 2010-08-03 17:21:00 UTC (rev 1105)
@@ -0,0 +1,92 @@
+package org.cishell.utilities.swt;
+
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.List;
+
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Widget;
+
+public class GridContainer {
+ private Composite actualParent;
+ private int columnCount;
+ private List<GridRow> rows = new ArrayList<GridRow>();
+
+ public GridContainer(Composite actualParent, int columnCount) {
+ this.actualParent = actualParent;
+ this.columnCount = columnCount;
+ }
+
+ public Composite getActualParent() {
+ return this.actualParent;
+ }
+
+ public int getColumnCount() {
+ return this.columnCount;
+ }
+
+ public int getRowCount() {
+ return this.rows.size();
+ }
+
+ public GridRow addComponent(Widget component) {
+ GridRow lastRow = getOrCreateLastUsableRow();
+ lastRow.addComponent(component);
+
+ return lastRow;
+ }
+
+ public void removeRow(int rowIndex) {
+ this.rows.get(rowIndex).dispose();
+ this.rows.remove(rowIndex);
+ }
+
+ private GridRow getOrCreateLastUsableRow() {
+ final int rowCount = getRowCount();
+
+ if (rowCount == 0) {
+ return addNewRow();
+ } else {
+ GridRow lastRow = this.rows.get(rowCount - 1);
+
+ if (lastRow.componentCount < getColumnCount()) {
+ return lastRow;
+ } else {
+ return addNewRow();
+ }
+ }
+ }
+
+ private GridRow addNewRow() {
+ GridRow row = new GridRow(getRowCount());
+ this.rows.add(row);
+
+ return row;
+ }
+
+ public class GridRow {
+ private int rowIndex;
+ private int componentCount = 0;
+ private Collection<Widget> components =
+ new ArrayList<Widget>(GridContainer.this.columnCount);
+
+ private GridRow(int rowIndex) {
+ this.rowIndex = rowIndex;
+ }
+
+ public int getRowIndex() {
+ return this.rowIndex;
+ }
+
+ private void addComponent(Widget component) {
+ this.components.add(component);
+ this.componentCount++;
+ }
+
+ private void dispose() {
+ for (Widget component : this.components) {
+ component.dispose();
+ }
+ }
+ }
+}
Property changes on: trunk/core/org.cishell.utilities.swt/src/org/cishell/utilities/swt/GridContainer.java
___________________________________________________________________
Added: svn:mergeinfo
+
Copied: trunk/core/org.cishell.utilities.swt/src/org/cishell/utilities/swt/SWTUtilities.java (from rev 1098, trunk/core/org.cishell.utilities/src/org/cishell/utilities/swt/SWTUtilities.java)
===================================================================
--- trunk/core/org.cishell.utilities.swt/src/org/cishell/utilities/swt/SWTUtilities.java (rev 0)
+++ trunk/core/org.cishell.utilities.swt/src/org/cishell/utilities/swt/SWTUtilities.java 2010-08-03 17:21:00 UTC (rev 1105)
@@ -0,0 +1,123 @@
+package org.cishell.utilities.swt;
+
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.custom.StyleRange;
+import org.eclipse.swt.custom.StyledText;
+import org.eclipse.swt.graphics.Color;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Display;
+
+public class SWTUtilities {
+ /*
+ * Append the given string to the console with the given color, this will do the job of
+ * checking for URLs within the string and registering the proper listeners on them as well.
+ */
+ public static void appendStringWithURL(
+ StyledText textField,
+ URLClickedListener urlListener,
+ URLMouseCursorListener urlCursorListener,
+ String message,
+ Color normalColor,
+ Color urlColor) {
+
+ //find a URL in the message
+
+ int index = message.indexOf("http://");
+ if (index == -1) {
+ index = message.indexOf("https://");
+ }
+ if (index == -1) {
+ index = message.indexOf("www.");
+ }
+
+ if (index > -1) {
+ String url = message.substring(index);
+ if (url.indexOf(") ") > -1) {
+ url = url.substring(0, url.indexOf(") "));
+ }
+ else if (url.indexOf(" ") > -1) {
+ url = url.substring(0, url.indexOf(" "));
+ if (url.trim().endsWith(".") ){
+ url=url.substring(0, url.length()-1);
+ }
+ }
+ if (url.endsWith(".\n") || url.endsWith(".\t")){
+ url=url.substring(0, url.length()-2);
+ }
+ if (url.indexOf("\n") > -1) {
+ url = url.substring(0, url.indexOf("\n"));
+ }
+ if (url.indexOf("\t") > -1) {
+ url = url.substring(0, url.indexOf("\n"));
+ }
+
+
+ syncedStyledPrint(textField, message.substring(0, index), normalColor, SWT.NORMAL);
+ urlListener.addURL(textField.getText().length(), url);
+ urlCursorListener.addURL(textField.getText().length(), url);
+ syncedStyledPrint(textField, url, urlColor, SWT.BOLD);
+ appendStringWithURL(
+ textField,
+ urlListener,
+ urlCursorListener,
+ message.substring(index + url.length()),
+ normalColor,urlColor);
+ } else {
+ syncedStyledPrint(textField, message, normalColor, SWT.NORMAL);
+ }
+ }
+
+ /*
+ * Helper to actually format the string with a style range and
+ * append it to the StyledText control.
+ */
+
+ public static void syncedStyledPrint(
+ final StyledText textField, final String message, final Color color, final int style) {
+ Display.getDefault().syncExec(new Runnable() {
+ public void run(){
+ styledPrint(textField, message, color, style);
+ }
+ });
+ }
+
+ public static void styledPrint(StyledText textField, String message, Color color, int style) {
+ if (!textField.isDisposed()) {
+ textField.append(message);
+
+ StyleRange styleRange = new StyleRange();
+ styleRange.start = textField.getText().length() - message.length();
+ styleRange.length = message.length();
+ styleRange.foreground = color;
+ styleRange.fontStyle = style;
+ textField.setStyleRange(styleRange);
+
+ // This makes it autoscroll.
+ textField.setTopIndex(textField.getLineCount());
+ }
+ }
+
+ public static void printURL(
+ Composite parent,
+ StyledText textField,
+ String url,
+ String displayURL,
+ Color color,
+ int style) {
+ URLClickedListener urlClickedListener = new URLClickedListener(textField);
+ URLMouseCursorListener urlCursorListener =
+ new URLMouseCursorListener(parent, textField);
+ textField.addMouseListener(urlClickedListener);
+ textField.addMouseMoveListener(urlCursorListener);
+
+ urlClickedListener.addURL(
+ textField.getText().length(), url, displayURL);
+ urlCursorListener.addURL(
+ textField.getText().length(), url, displayURL);
+ SWTUtilities.styledPrint(
+ textField,
+ displayURL,
+ color,
+ style);
+ }
+}
\ No newline at end of file
Property changes on: trunk/core/org.cishell.utilities.swt/src/org/cishell/utilities/swt/SWTUtilities.java
___________________________________________________________________
Added: svn:mergeinfo
+
Copied: trunk/core/org.cishell.utilities.swt/src/org/cishell/utilities/swt/ScrolledComponentFactory.java (from rev 1098, trunk/core/org.cishell.utilities/src/org/cishell/utilities/swt/ScrolledComponentFactory.java)
===================================================================
--- trunk/core/org.cishell.utilities.swt/src/org/cishell/utilities/swt/ScrolledComponentFactory.java (rev 0)
+++ trunk/core/org.cishell.utilities.swt/src/org/cishell/utilities/swt/ScrolledComponentFactory.java 2010-08-03 17:21:00 UTC (rev 1105)
@@ -0,0 +1,15 @@
+package org.cishell.utilities.swt;
+
+import java.util.Map;
+
+public interface ScrolledComponentFactory<T> {
+ public T constructWidget(
+ ExpandableComponentWidget<T> componentWidget,
+ GridContainer scrolledAreaGrid,
+ int style,
+ Map<String, Object> arguments,
+ int index,
+ int uniqueIndex);
+
+ public void reindexComponent(T component, int newIndex);
+}
\ No newline at end of file
Property changes on: trunk/core/org.cishell.utilities.swt/src/org/cishell/utilities/swt/ScrolledComponentFactory.java
___________________________________________________________________
Added: svn:mergeinfo
+
Copied: trunk/core/org.cishell.utilities.swt/src/org/cishell/utilities/swt/URLClickedListener.java (from rev 1098, trunk/core/org.cishell.utilities/src/org/cishell/utilities/swt/URLClickedListener.java)
===================================================================
--- trunk/core/org.cishell.utilities.swt/src/org/cishell/utilities/swt/URLClickedListener.java (rev 0)
+++ trunk/core/org.cishell.utilities.swt/src/org/cishell/utilities/swt/URLClickedListener.java 2010-08-03 17:21:00 UTC (rev 1105)
@@ -0,0 +1,70 @@
+package org.cishell.utilities.swt;
+
+import java.util.HashMap;
+import java.util.Map;
+
+import org.eclipse.swt.custom.StyledText;
+import org.eclipse.swt.events.MouseAdapter;
+import org.eclipse.swt.events.MouseEvent;
+import org.eclipse.swt.graphics.Point;
+import org.eclipse.swt.program.Program;
+
+/*
+ * Listens for clicks on urls and launches a browser.
+ */
+public class URLClickedListener extends MouseAdapter {
+ private Map<Integer, String> offsetsToURLs = new HashMap<Integer, String>();
+ private Map<String, String> urlsToDisplayURLs = new HashMap<String, String>();
+ private StyledText textField;
+
+ public URLClickedListener(StyledText textField) {
+ super();
+ this.textField = textField;
+ }
+
+ public void addURL(int offset, String url) {
+ addURL(offset, url, url);
+ }
+
+ public void addURL(int offset, String url, String displayURL) {
+ this.offsetsToURLs.put(offset, url);
+ this.urlsToDisplayURLs.put(url, displayURL);
+ }
+
+ public void mouseDown(MouseEvent event) {
+ if (event.button != 1) {
+ return;
+ }
+
+ int clickedPosition = determineClickedPosition(event);
+
+ if (clickedPosition < 0) {
+ return;
+ }
+
+ for (Integer offset : this.offsetsToURLs.keySet().toArray(new Integer[0])) {
+ String url = this.offsetsToURLs.get(offset);
+ String displayURL = this.urlsToDisplayURLs.get(url);
+
+ if ((displayURL != null) &&
+ (clickedPosition >= offset.intValue()) &&
+ (clickedPosition <= (offset.intValue() + displayURL.length()))) {
+ try {
+ Program.launch(url);
+ } catch (Exception e) {
+ }
+ }
+ }
+ }
+
+ private int determineClickedPosition(MouseEvent event) {
+ int clickedPosition = -1;
+
+ try {
+ clickedPosition = this.textField.getOffsetAtLocation(new Point(event.x, event.y));
+ } catch (IllegalArgumentException ex) {
+ }
+
+ return clickedPosition;
+ }
+}
\ No newline at end of file
Property changes on: trunk/core/org.cishell.utilities.swt/src/org/cishell/utilities/swt/URLClickedListener.java
___________________________________________________________________
Added: svn:mergeinfo
+
Copied: trunk/core/org.cishell.utilities.swt/src/org/cishell/utilities/swt/URLMouseCursorListener.java (from rev 1098, trunk/core/org.cishell.utilities/src/org/cishell/utilities/swt/URLMouseCursorListener.java)
===================================================================
--- trunk/core/org.cishell.utilities.swt/src/org/cishell/utilities/swt/URLMouseCursorListener.java (rev 0)
+++ trunk/core/org.cishell.utilities.swt/src/org/cishell/utilities/swt/URLMouseCursorListener.java 2010-08-03 17:21:00 UTC (rev 1105)
@@ -0,0 +1,79 @@
+package org.cishell.utilities.swt;
+
+import java.util.HashMap;
+import java.util.Map;
+
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.custom.StyledText;
+import org.eclipse.swt.events.MouseEvent;
+import org.eclipse.swt.events.MouseMoveListener;
+import org.eclipse.swt.graphics.Cursor;
+import org.eclipse.swt.graphics.Point;
+import org.eclipse.swt.widgets.Composite;
+
+/*
+ * Monitors the mouse and changes the cursor when it is over a URL.
+ */
+public class URLMouseCursorListener implements MouseMoveListener {
+ private Map<Integer, String> offsetsToURLs = new HashMap<Integer, String>();
+ private Map<String, String> urlsToDisplayURLs = new HashMap<String, String>();
+ private Composite parent;
+ private StyledText textField;
+
+ public URLMouseCursorListener(Composite parent, StyledText textField) {
+ this.parent = parent;
+ this.textField = textField;
+ }
+
+ public void addURL(int offset, String url) {
+ addURL(offset, url, url);
+ }
+
+ public void addURL(int offset, String url, String displayURL) {
+ this.offsetsToURLs.put(new Integer(offset), url);
+ this.urlsToDisplayURLs.put(url, displayURL);
+ }
+
+ public void mouseMove(MouseEvent event) {
+ int urlOffsetOfMousePosition = determineURLOffsetOfMousePosition(event);
+ Integer[] urlOffsets = this.offsetsToURLs.keySet().toArray(new Integer[0]);
+ boolean mouseIsOverURL = determineIfMouseIsHoveringOverURL(urlOffsetOfMousePosition, urlOffsets);
+ Cursor cursor = new Cursor(parent.getDisplay(), determineMouseCursor(mouseIsOverURL));
+ textField.setCursor(cursor);
+ }
+
+ private int determineURLOffsetOfMousePosition(MouseEvent event) {
+ try {
+ return textField.getOffsetAtLocation(new Point(event.x, event.y));
+ } catch (IllegalArgumentException e) {
+ Cursor cursor = new Cursor(parent.getDisplay(), SWT.CURSOR_ARROW);
+ textField.setCursor(cursor);
+ }
+
+ return -1;
+ }
+
+ private boolean determineIfMouseIsHoveringOverURL(
+ int urlOffsetOfMousePosition, Integer[] urlOffsets) {
+ for (Integer urlOffset : urlOffsets) {
+ String url = this.offsetsToURLs.get(urlOffset);
+
+ if ((urlOffset != null) &&
+ (url != null) &&
+ (urlOffsetOfMousePosition >= urlOffset.intValue()) &&
+ (urlOffsetOfMousePosition <= (urlOffset.intValue() + url.length()))) {
+ return true;
+ }
+ }
+
+ return false;
+ }
+
+ private int determineMouseCursor(boolean mouseIsOverURL) {
+ if (mouseIsOverURL) {
+ return SWT.CURSOR_HAND;
+ } else {
+ return SWT.CURSOR_ARROW;
+ }
+ }
+}
\ No newline at end of file
Property changes on: trunk/core/org.cishell.utilities.swt/src/org/cishell/utilities/swt/URLMouseCursorListener.java
___________________________________________________________________
Added: svn:mergeinfo
+
Copied: trunk/core/org.cishell.utilities.swt/src/org/cishell/utilities/swt/model/GUIModel.java (from rev 1098, trunk/core/org.cishell.utilities/src/org/cishell/utilities/swt/model/GUIModel.java)
===================================================================
--- trunk/core/org.cishell.utilities.swt/src/org/cishell/utilities/swt/model/GUIModel.java (rev 0)
+++ trunk/core/org.cishell.utilities.swt/src/org/cishell/utilities/swt/model/GUIModel.java 2010-08-03 17:21:00 UTC (rev 1105)
@@ -0,0 +1,190 @@
+package org.cishell.utilities.swt.model;
+
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.HashMap;
+import java.util.Map;
+
+import org.cishell.utilities.swt.model.datasynchronizer.CheckBoxDataSynchronizer;
+import org.cishell.utilities.swt.model.datasynchronizer.DropDownDataSynchronizer;
+import org.cishell.utilities.swt.model.datasynchronizer.ModelDataSynchronizer;
+import org.cishell.utilities.swt.model.datasynchronizer.SingleListSelectionDataSynchronizer;
+import org.cishell.utilities.swt.model.datasynchronizer.TextDataSynchronizer;
+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.List;
+import org.eclipse.swt.widgets.Text;
+import org.eclipse.swt.widgets.Widget;
+
+public class GUIModel {
+ private Map<String, GUIModelGroup> groups = new HashMap<String, GUIModelGroup>();
+
+ public GUIModel() {
+ }
+
+ public Collection<String> getGroupNames() {
+ return this.groups.keySet();
+ }
+
+ public Collection<GUIModelGroup> getGroups() {
+ return this.groups.values();
+ }
+
+ public GUIModelGroup getGroup(String name) {
+ if (!this.groups.containsKey(name)) {
+ GUIModelGroup newGroup = new GUIModelGroup(name);
+ this.groups.put(name, newGroup);
+
+ return newGroup;
+ } else {
+ return this.groups.get(name);
+ }
+ }
+
+ public GUIModelField<Boolean, Button, CheckBoxDataSynchronizer> addCheckBox(
+ String groupName, String name, boolean on, Composite parent, int style) {
+ Button checkBox = new Button(parent, style | SWT.CHECK);
+ CheckBoxDataSynchronizer dataSynchronizer = new CheckBoxDataSynchronizer(checkBox, on);
+ GUIModelField<Boolean, Button, CheckBoxDataSynchronizer> field =
+ new GUIModelField<Boolean, Button, CheckBoxDataSynchronizer>(
+ name, on, checkBox, dataSynchronizer);
+ addField(groupName, field);
+
+ return field;
+ }
+
+ public GUIModelField<String, Combo, DropDownDataSynchronizer> addDropDown(
+ String groupName,
+ String name,
+ int selectedIndex,
+ Collection<String> unorderedOptionLabels,
+ Map<String, String> optionValuesByLabels,
+ Composite parent,
+ int style) {
+ java.util.List<String> orderedOptionLabels = new ArrayList<String>(unorderedOptionLabels);
+ Combo dropDown = new Combo(parent, style | SWT.DROP_DOWN);
+ DropDownDataSynchronizer dataSynchronizer = new DropDownDataSynchronizer(
+ dropDown, selectedIndex, orderedOptionLabels, optionValuesByLabels);
+ GUIModelField<String, Combo, DropDownDataSynchronizer> field =
+ new GUIModelField<String, Combo, DropDownDataSynchronizer>(
+ name,
+ optionValuesByLabels.get(orderedOptionLabels.get(selectedIndex)),
+ dropDown,
+ dataSynchronizer);
+ addField(groupName, field);
+
+ return field;
+ }
+
+ // TODO: addMultiSelectionDropDown
+
+ // TODO: Test this out.
+ // TODO: Make it so the build works with this stuff.
+// public GUIModelField<
+// org.joda.time.DateTime, org.eclipse.swt.widgets.DateTime, DateDataSynchronizer>
+// addDate(String name, org.joda.time.DateTime date, Composite parent, int style) {
+// org.eclipse.swt.widgets.DateTime dateSelector =
+// new org.eclipse.swt.widgets.DateTime(parent, style | SWT.DATE);
+// DateDataSynchronizer dataSynchronizer = new DateDataSynchronizer(dateSelector, date);
+// GUIModelField<
+// org.joda.time.DateTime, org.eclipse.swt.widgets.DateTime, DateDataSynchronizer> field =
+// new GUIModelField<
+// org.joda.time.DateTime,
+// org.eclipse.swt.widgets.DateTime,
+// DateDataSynchronizer>(
+// name, date, dateSelector, dataSynchronizer);
+// addField(field);
+//
+// return field;
+// }
+
+ // TODO: Test this out.
+// public GUIModelField<
+// org.joda.time.DateTime, org.eclipse.swt.widgets.DateTime, TimeDataSynchronizer>
+// addTime(String name, org.joda.time.DateTime time, Composite parent, int style) {
+// org.eclipse.swt.widgets.DateTime timeSelector =
+// new org.eclipse.swt.widgets.DateTime(parent, style | SWT.TIME);
+// TimeDataSynchronizer dataSynchronizer = new TimeDataSynchronizer(timeSelector, time);
+// GUIModelField<
+// org.joda.time.DateTime, org.eclipse.swt.widgets.DateTime, TimeDataSynchronizer> field =
+// new GUIModelField<
+// org.joda.time.DateTime,
+// org.eclipse.swt.widgets.DateTime,
+// TimeDataSynchronizer>(
+// name, time, timeSelector, dataSynchronizer);
+// addField(field);
+//
+// return field;
+// }
+
+ // TODO: addCalendar
+
+ // TODO: Test this out.
+ public GUIModelField<String, List, SingleListSelectionDataSynchronizer> addList(
+ String groupName,
+ String name,
+ int selectedIndex,
+ Collection<String> unorderedOptionLabels,
+ Map<String, String> optionValuesByLabels,
+ Composite parent,
+ int style) {
+ java.util.List<String> orderedOptionLabels = new ArrayList<String>(unorderedOptionLabels);
+ List list = new List(parent, style | SWT.SINGLE);
+ SingleListSelectionDataSynchronizer dataSynchronizer =
+ new SingleListSelectionDataSynchronizer(
+ list, selectedIndex, orderedOptionLabels, optionValuesByLabels);
+ GUIModelField<String, List, SingleListSelectionDataSynchronizer> field =
+ new GUIModelField<String, List, SingleListSelectionDataSynchronizer>(
+ name, list.getItem(selectedIndex), list, dataSynchronizer);
+ addField(groupName, field);
+
+ return field;
+ }
+
+ // TODO: addMultiSelectionList
+ // TODO: addProgressBar
+ // TODO: addSash?
+ // TODO: addSlider
+ // TODO: addScale
+ // TODO: addSpinner
+ // TODO: addStyledText
+
+ public GUIModelField<String, Text, TextDataSynchronizer> addText(
+ String groupName,
+ String name,
+ String value,
+ boolean isMultiLined,
+ Composite parent,
+ int style) {
+ if (isMultiLined) {
+ style = style | SWT.MULTI;
+ } else {
+ style = style | SWT.SINGLE;
+ }
+
+ Text text = new Text(parent, style);
+ TextDataSynchronizer dataSynchronizer = new TextDataSynchronizer(text, value);
+ GUIModelField<String, Text, TextDataSynchronizer> field =
+ new GUIModelField<String, Text, TextDataSynchronizer>(
+ name, value, text, dataSynchronizer);
+ addField(groupName, field);
+
+ return field;
+ }
+
+ public<T> void addField(
+ String groupName,
+ GUIModelField<T, ? extends Widget, ? extends ModelDataSynchronizer<?>> field) {
+ GUIModelGroup group = getGroup(groupName);
+ group.addField(field);
+ }
+
+ public<T> void removeField(
+ GUIModelField<T, ? extends Widget, ? extends ModelDataSynchronizer<?>> field) {
+ for (GUIModelGroup group : this.groups.values()) {
+ group.removeField(field);
+ }
+ }
+}
\ No newline at end of file
Property changes on: trunk/core/org.cishell.utilities.swt/src/org/cishell/utilities/swt/model/GUIModel.java
___________________________________________________________________
Added: svn:mergeinfo
+
Copied: trunk/core/org.cishell.utilities.swt/src/org/cishell/utilities/swt/model/GUIModelField.java (from rev 1098, trunk/core/org.cishell.utilities/src/org/cishell/utilities/swt/model/GUIModelField.java)
===================================================================
--- trunk/core/org.cishell.utilities.swt/src/org/cishell/utilities/swt/model/GUIModelField.java (rev 0)
+++ trunk/core/org.cishell.utilities.swt/src/org/cishell/utilities/swt/model/GUIModelField.java 2010-08-03 17:21:00 UTC (rev 1105)
@@ -0,0 +1,65 @@
+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, U extends Widget, V extends ModelDataSynchronizer<T>> {
+ private String name;
+ private T defaultValue;
+ private T previousValue;
+ private T value;
+ private U widget;
+ private V dataSynchronizer;
+
+ public GUIModelField(
+ String name,
+ T defaultValue,
+ U widget,
+ V 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.previousValue = GUIModelField.this.value;
+ GUIModelField.this.value =
+ GUIModelField.this.dataSynchronizer.synchronizeFromGUI();
+ }
+ }
+ });
+ }
+
+ public String getName() {
+ return this.name;
+ }
+
+ public T getPreviousValue() {
+ return this.previousValue;
+ }
+
+ public T getValue() {
+ return this.value;
+ }
+
+ public U getWidget() {
+ return this.widget;
+ }
+
+ public V getDataSynchronizer() {
+ return this.dataSynchronizer;
+ }
+
+ 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
Property changes on: trunk/core/org.cishell.utilities.swt/src/org/cishell/utilities/swt/model/GUIModelField.java
___________________________________________________________________
Added: svn:mergeinfo
+
Copied: trunk/core/org.cishell.utilities.swt/src/org/cishell/utilities/swt/model/GUIModelGroup.java (from rev 1098, trunk/core/org.cishell.utilities/src/org/cishell/utilities/swt/model/GUIModelGroup.java)
===================================================================
--- trunk/core/org.cishell.utilities.swt/src/org/cishell/utilities/swt/model/GUIModelGroup.java (rev 0)
+++ trunk/core/org.cishell.utilities.swt/src/org/cishell/utilities/swt/model/GUIModelGroup.java 2010-08-03 17:21:00 UTC (rev 1105)
@@ -0,0 +1,57 @@
+package org.cishell.utilities.swt.model;
+
+import java.util.Collection;
+import java.util.HashMap;
+import java.util.Map;
+
+import org.cishell.utilities.swt.model.datasynchronizer.ModelDataSynchronizer;
+import org.eclipse.swt.widgets.Widget;
+
+public class GUIModelGroup {
+ private String name;
+ private Map<String, GUIModelField<?, ? extends Widget, ? extends ModelDataSynchronizer<?>>>
+ inputFieldsByName = new HashMap<
+ String, GUIModelField<?, ? extends Widget, ? extends ModelDataSynchronizer<?>>>();
+
+ public GUIModelGroup(String name) {
+ this.name = name;
+ }
+
+ public String getName() {
+ return this.name;
+ }
+
+ public Collection<String> getFieldNames() {
+ return this.inputFieldsByName.keySet();
+ }
+
+ public Collection<
+ GUIModelField<?, ? extends Widget, ? extends ModelDataSynchronizer<?>>> getFields() {
+ return this.inputFieldsByName.values();
+ }
+
+ public GUIModelField<
+ ?, ? extends Widget, ? extends ModelDataSynchronizer<?>> getField(String name) {
+ return this.inputFieldsByName.get(name);
+ }
+
+ public<T> void addField(
+ GUIModelField<T, ? extends Widget, ? extends ModelDataSynchronizer<?>> 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);
+ }
+
+ public<T> void removeField(
+ GUIModelField<T, ? extends Widget, ? extends ModelDataSynchronizer<?>> field) {
+ if (this.inputFieldsByName.containsValue(field)) {
+ this.inputFieldsByName.remove(field.getName());
+ }
+ }
+}
\ No newline at end of file
Property changes on: trunk/core/org.cishell.utilities.swt/src/org/cishell/utilities/swt/model/GUIModelGroup.java
___________________________________________________________________
Added: svn:mergeinfo
+
Copied: trunk/core/org.cishell.utilities.swt/src/org/cishell/utilities/swt/model/ModelFieldException.java (from rev 1098, trunk/core/org.cishell.utilities/src/org/cishell/utilities/swt/model/ModelFieldException.java)
===================================================================
--- trunk/core/org.cishell.utilities.swt/src/org/cishell/utilities/swt/model/ModelFieldException.java (rev 0)
+++ trunk/core/org.cishell.utilities.swt/src/org/cishell/utilities/swt/model/ModelFieldException.java 2010-08-03 17:21:00 UTC (rev 1105)
@@ -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
Property changes on: trunk/core/org.cishell.utilities.swt/src/org/cishell/utilities/swt/model/ModelFieldException.java
___________________________________________________________________
Added: svn:mergeinfo
+
Copied: trunk/core/org.cishell.utilities.swt/src/org/cishell/utilities/swt/model/datasynchronizer/CheckBoxDataSynchronizer.java (from rev 1098, trunk/core/org.cishell.utilities/src/org/cishell/utilities/swt/model/datasynchronizer/CheckBoxDataSynchronizer.java)
===================================================================
--- trunk/core/org.cishell.utilities.swt/src/org/cishell/utilities/swt/model/datasynchronizer/CheckBoxDataSynchronizer.java (rev 0)
+++ trunk/core/org.cishell.utilities.swt/src/org/cishell/utilities/swt/model/datasynchronizer/CheckBoxDataSynchronizer.java 2010-08-03 17:21:00 UTC (rev 1105)
@@ -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
Property changes on: trunk/core/org.cishell.utilities.swt/src/org/cishell/utilities/swt/model/datasynchronizer/CheckBoxDataSynchronizer.java
___________________________________________________________________
Added: svn:mergeinfo
+
Copied: trunk/core/org.cishell.utilities.swt/src/org/cishell/utilities/swt/model/datasynchronizer/DateDataSynchronizer.java (from rev 1098, trunk/core/org.cishell.utilities/src/org/cishell/utilities/swt/model/datasynchronizer/DateDataSynchronizer.java)
===================================================================
--- trunk/core/org.cishell.utilities.swt/src/org/cishell/utilities/swt/model/datasynchronizer/DateDataSynchronizer.java (rev 0)
+++ trunk/core/org.cishell.utilities.swt/src/org/cishell/utilities/swt/model/datasynchronizer/DateDataSynchronizer.java 2010-08-03 17:21:00 UTC (rev 1105)
@@ -0,0 +1,42 @@
+//package org.cishell.utilities.swt.model.datasynchronizer;
+//
+//import org.eclipse.swt.SWT;
+//
+//public class DateDataSynchronizer implements ModelDataSynchronizer<org.joda.time.DateTime> {
+// private org.eclipse.swt.widgets.DateTime dateSelector;
+//
+// public DateDataSynchronizer(
+// org.eclipse.swt.widgets.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
Property changes on: trunk/core/org.cishell.utilities.swt/src/org/cishell/utilities/swt/model/datasynchronizer/DateDataSynchronizer.java
___________________________________________________________________
Added: svn:mergeinfo
+
Copied: trunk/core/org.cishell.utilities.swt/src/org/cishell/utilities/swt/model/datasynchronizer/DropDownDataSynchronizer.java (from rev 1098, trunk/core/org.cishell.utilities/src/org/cishell/utilities/swt/model/datasynchronizer/DropDownDataSynchronizer.java)
===================================================================
--- trunk/core/org.cishell.utilities.swt/src/org/cishell/utilities/swt/model/datasynchronizer/DropDownDataSynchronizer.java (rev 0)
+++ trunk/core/org.cishell.utilities.swt/src/org/cishell/utilities/swt/model/datasynchronizer/DropDownDataSynchronizer.java 2010-08-03 17:21:00 UTC (rev 1105)
@@ -0,0 +1,61 @@
+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 BiMap<String, String> optionValuesByLabels;
+
+ public DropDownDataSynchronizer(
+ Combo dropDown,
+ int selectedIndex,
+ List<String> optionLabels,
+ Map<String, String> optionValuesByLabels) {
+ this.dropDown = dropDown;
+
+ setOptions(optionLabels, optionValuesByLabels);
+ 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 value();
+ }
+
+ public String synchronizeToGUI(String value) {
+ String label = this.optionValuesByLabels.inverse().get(value);
+ this.dropDown.select(this.optionLabels.inverse().get(label));
+
+ return value();
+ }
+
+ public String reset(String defaultValue) {
+ return synchronizeToGUI(defaultValue);
+ }
+
+ public void setOptions(List<String> optionLabels, Map<String, String> optionValuesByLabels) {
+ this.optionLabels = HashBiMap.create(MapUtilities.mapIndexToValues(optionLabels));
+ this.optionValuesByLabels = HashBiMap.create(optionValuesByLabels);
+
+ this.dropDown.setItems(optionLabels.toArray(new String[0]));
+ this.dropDown.select(0);
+ }
+}
\ No newline at end of file
Property changes on: trunk/core/org.cishell.utilities.swt/src/org/cishell/utilities/swt/model/datasynchronizer/DropDownDataSynchronizer.java
___________________________________________________________________
Added: svn:mergeinfo
+
Copied: trunk/core/org.cishell.utilities.swt/src/org/cishell/utilities/swt/model/datasynchronizer/ModelDataSynchronizer.java (from rev 1098, trunk/core/org.cishell.utilities/src/org/cishell/utilities/swt/model/datasynchronizer/ModelDataSynchronizer.java)
===================================================================
--- trunk/core/org.cishell.utilities.swt/src/org/cishell/utilities/swt/model/datasynchronizer/ModelDataSynchronizer.java (rev 0)
+++ trunk/core/org.cishell.utilities.swt/src/org/cishell/utilities/swt/model/datasynchronizer/ModelDataSynchronizer.java 2010-08-03 17:21:00 UTC (rev 1105)
@@ -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
Property changes on: trunk/core/org.cishell.utilities.swt/src/org/cishell/utilities/swt/model/datasynchronizer/ModelDataSynchronizer.java
___________________________________________________________________
Added: svn:mergeinfo
+
Copied: trunk/core/org.cishell.utilities.swt/src/org/cishell/utilities/swt/model/datasynchronizer/SingleListSelectionDataSynchronizer.java (from rev 1098, trunk/core/org.cishell.utilities/src/org/cishell/utilities/swt/model/datasynchronizer/SingleListSelectionDataSynchronizer.java)
===================================================================
--- trunk/core/org.cishell.utilities.swt/src/org/cishell/utilities/swt/model/datasynchronizer/SingleListSelectionDataSynchronizer.java (rev 0)
+++ trunk/core/org.cishell.utilities.swt/src/org/cishell/utilities/swt/model/datasynchronizer/SingleListSelectionDataSynchronizer.java 2010-08-03 17:21:00 UTC (rev 1105)
@@ -0,0 +1,53 @@
+package org.cishell.utilities.swt.model.datasynchronizer;
+
+import java.util.Map;
+
+import org.cishell.utilities.MapUtilities;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.widgets.List;
+
+import com.google.common.collect.BiMap;
+import com.google.common.collect.HashBiMap;
+
+// TODO: Make this so options can change on it.
+public class SingleListSelectionDataSynchronizer implements ModelDataSynchronizer<String> {
+ private List singleSelectionList;
+ private BiMap<Integer, String> optionLabels;
+ private Map<String, String> optionValuesByLabels;
+
+ public SingleListSelectionDataSynchronizer(
+ List singleSelectionList,
+ int selectedIndex,
+ java.util.List<String> optionLabels,
+ Map<String, String> optionValuesByLabels) {
+ this.singleSelectionList = singleSelectionList;
+ this.optionLabels = HashBiMap.create(MapUtilities.mapIndexToValues(optionLabels));
+ this.optionValuesByLabels = optionValuesByLabels;
+
+ this.singleSelectionList.setItems(optionLabels.toArray(new String[0]));
+ this.singleSelectionList.select(selectedIndex);
+ }
+
+ public int swtUpdateListenerCode() {
+ return SWT.Selection;
+ }
+
+ public String value() {
+ return this.optionValuesByLabels.get(
+ this.optionLabels.get(this.singleSelectionList.getSelectionIndex()));
+ }
+
+ public String synchronizeFromGUI() {
+ return this.optionLabels.get(this.singleSelectionList.getSelectionIndex());
+ }
+
+ public String synchronizeToGUI(String value) {
+ this.singleSelectionList.select(this.optionLabels.inverse().get(value));
+
+ return value();
+ }
+
+ public String reset(String defaultValue) {
+ return synchronizeToGUI(defaultValue);
+ }
+}
\ No newline at end of file
Property changes on: trunk/core/org.cishell.utilities.swt/src/org/cishell/utilities/swt/model/datasynchronizer/SingleListSelectionDataSynchronizer.java
___________________________________________________________________
Added: svn:mergeinfo
+
Copied: trunk/core/org.cishell.utilities.swt/src/org/cishell/utilities/swt/model/datasynchronizer/TextDataSynchronizer.java (from rev 1098, trunk/core/org.cishell.utilities/src/org/cishell/utilities/swt/model/datasynchronizer/TextDataSynchronizer.java)
===================================================================
--- trunk/core/org.cishell.utilities.swt/src/org/cishell/utilities/swt/model/datasynchronizer/TextDataSynchronizer.java (rev 0)
+++ trunk/core/org.cishell.utilities.swt/src/org/cishell/utilities/swt/model/datasynchronizer/TextDataSynchronizer.java 2010-08-03 17:21:00 UTC (rev 1105)
@@ -0,0 +1,36 @@
+package org.cishell.utilities.swt.model.datasynchronizer;
+
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.widgets.Text;
+
+public class TextDataSynchronizer implements ModelDataSynchronizer<String> {
+ private Text text;
+
+ public TextDataSynchronizer(Text text, String value) {
+ this.text = text;
+
+ this.text.setText(value);
+ }
+
+ public int swtUpdateListenerCode() {
+ return SWT.Modify;
+ }
+
+ public String value() {
+ return this.text.getText();
+ }
+
+ public String synchronizeFromGUI() {
+ return value();
+ }
+
+ public String synchronizeToGUI(String value) {
+ this.text.setText(value);
+
+ return value();
+ }
+
+ public String reset(String defaultValue) {
+ return synchronizeToGUI(defaultValue);
+ }
+}
\ No newline at end of file
Property changes on: trunk/core/org.cishell.utilities.swt/src/org/cishell/utilities/swt/model/datasynchronizer/TextDataSynchronizer.java
___________________________________________________________________
Added: svn:mergeinfo
+
Copied: trunk/core/org.cishell.utilities.swt/src/org/cishell/utilities/swt/model/datasynchronizer/TimeDataSynchronizer.java (from rev 1098, trunk/core/org.cishell.utilities/src/...
[truncated message content] |