From a920199ab72bf9f0d99735d1a252d3dd90abb275 Mon Sep 17 00:00:00 2001 From: Michael Jumper Date: Wed, 30 Oct 2013 23:43:30 -0700 Subject: [PATCH] Add support for multiline text fields. --- .../net/basic/ProtocolParameter.java | 8 ++++- .../net/basic/crud/protocols/List.java | 5 +++ .../basic/xml/protocol/ParamTagHandler.java | 4 +++ guacamole/src/main/webapp/scripts/admin-ui.js | 35 +++++++++++++++++++ guacamole/src/main/webapp/scripts/service.js | 18 +++++++--- guacamole/src/main/webapp/styles/ui.css | 11 +++++- 6 files changed, 75 insertions(+), 6 deletions(-) diff --git a/guacamole/src/main/java/org/glyptodon/guacamole/net/basic/ProtocolParameter.java b/guacamole/src/main/java/org/glyptodon/guacamole/net/basic/ProtocolParameter.java index 4b2319ea6..16e2822ed 100644 --- a/guacamole/src/main/java/org/glyptodon/guacamole/net/basic/ProtocolParameter.java +++ b/guacamole/src/main/java/org/glyptodon/guacamole/net/basic/ProtocolParameter.java @@ -58,7 +58,13 @@ public class ProtocolParameter { * An enumerated parameter, whose legal values are fully enumerated * by a provided, finite list. */ - ENUM + ENUM, + + /** + * A text parameter that can span more than one line. + */ + MULTILINE + } /** diff --git a/guacamole/src/main/java/org/glyptodon/guacamole/net/basic/crud/protocols/List.java b/guacamole/src/main/java/org/glyptodon/guacamole/net/basic/crud/protocols/List.java index f219cb42e..be5b809ab 100644 --- a/guacamole/src/main/java/org/glyptodon/guacamole/net/basic/crud/protocols/List.java +++ b/guacamole/src/main/java/org/glyptodon/guacamole/net/basic/crud/protocols/List.java @@ -166,6 +166,11 @@ public class List extends AuthenticatingHttpServlet { xml.writeAttribute("type", "enum"); break; + // Multiline parameter + case MULTILINE: + xml.writeAttribute("type", "multiline"); + break; + // If unknown, fail explicitly default: throw new UnsupportedOperationException( diff --git a/guacamole/src/main/java/org/glyptodon/guacamole/net/basic/xml/protocol/ParamTagHandler.java b/guacamole/src/main/java/org/glyptodon/guacamole/net/basic/xml/protocol/ParamTagHandler.java index b4223f72f..cceb783d5 100644 --- a/guacamole/src/main/java/org/glyptodon/guacamole/net/basic/xml/protocol/ParamTagHandler.java +++ b/guacamole/src/main/java/org/glyptodon/guacamole/net/basic/xml/protocol/ParamTagHandler.java @@ -61,6 +61,10 @@ public class ParamTagHandler implements TagHandler { else if ("enum".equals(type)) protocolParameter.setType(ProtocolParameter.Type.ENUM); + // Multiline field + else if ("multiline".equals(type)) + protocolParameter.setType(ProtocolParameter.Type.MULTILINE); + // Boolean field else if ("boolean".equals(type)) { protocolParameter.setType(ProtocolParameter.Type.BOOLEAN); diff --git a/guacamole/src/main/webapp/scripts/admin-ui.js b/guacamole/src/main/webapp/scripts/admin-ui.js index 4370cf181..3eb276079 100644 --- a/guacamole/src/main/webapp/scripts/admin-ui.js +++ b/guacamole/src/main/webapp/scripts/admin-ui.js @@ -121,6 +121,36 @@ GuacAdmin.Field.TEXT = function() { GuacAdmin.Field.TEXT.prototype = new GuacAdmin.Field._HTML_INPUT(); +/** + * A basic multiline text field. + * + * @augments GuacAdmin.Field + */ +GuacAdmin.Field.MULTILINE = function() { + + // Call parent constructor + GuacAdmin.Field.apply(this); + + // Create backing element + var element = GuacUI.createElement("textarea"); + + this.getValue = function() { + return element.value; + }; + + this.getElement = function() { + return element; + }; + + this.setValue = function(value) { + element.value = value; + }; + +}; + +GuacAdmin.Field.MULTILINE.prototype = new GuacAdmin.Field(); + + /** * A basic password field. * @@ -882,6 +912,11 @@ GuacAdmin.ConnectionEditor = function(connection, parameters) { field = new GuacAdmin.Field.ENUM(parameter.options); break; + // Multiline text field + case GuacamoleService.Protocol.Parameter.MULTILINE: + field = new GuacAdmin.Field.MULTILINE(); + break; + default: continue; diff --git a/guacamole/src/main/webapp/scripts/service.js b/guacamole/src/main/webapp/scripts/service.js index c427356a8..2d31f0a06 100644 --- a/guacamole/src/main/webapp/scripts/service.js +++ b/guacamole/src/main/webapp/scripts/service.js @@ -1250,7 +1250,7 @@ GuacamoleService.Protocol.Parameter.Option = function(value, title) { /** * A free-form text field. */ -GuacamoleService.Protocol.Parameter.TEXT = 0; +GuacamoleService.Protocol.Parameter.TEXT = 0; /** * A password field. @@ -1260,17 +1260,22 @@ GuacamoleService.Protocol.Parameter.PASSWORD = 1; /** * A numeric field. */ -GuacamoleService.Protocol.Parameter.NUMERIC = 2; +GuacamoleService.Protocol.Parameter.NUMERIC = 2; /** * A boolean (checkbox) field. */ -GuacamoleService.Protocol.Parameter.BOOLEAN = 3; +GuacamoleService.Protocol.Parameter.BOOLEAN = 3; /** * An enumerated (select) field. */ -GuacamoleService.Protocol.Parameter.ENUM = 4; +GuacamoleService.Protocol.Parameter.ENUM = 4; + +/** + * A free-form, multi-line text field. + */ +GuacamoleService.Protocol.Parameter.MULTILINE = 5; /** * Collection of service functions which deal with protocols. Each function @@ -1364,6 +1369,11 @@ GuacamoleService.Protocols = { parameter.type = GuacamoleService.Protocol.Parameter.ENUM; break; + // Multiline text parameter + case "multiline": + parameter.type = GuacamoleService.Protocol.Parameter.MULTILINE; + break; + } // Parse all options diff --git a/guacamole/src/main/webapp/styles/ui.css b/guacamole/src/main/webapp/styles/ui.css index fe4f72f27..23a656471 100644 --- a/guacamole/src/main/webapp/styles/ui.css +++ b/guacamole/src/main/webapp/styles/ui.css @@ -31,19 +31,28 @@ input[type=submit], button { -webkit-appearance: none; } -div.location, input[type=text], input[type=number], input[type=password] { +div.location, input[type=text], input[type=number], input[type=password], textarea { border: 1px solid #777; -moz-border-radius: 0.2em; -webkit-border-radius: 0.2em; -khtml-border-radius: 0.2em; border-radius: 0.2em; width: 100%; + max-width: 16em; padding: 0.25em; font-size: 10pt; background: white; cursor: text; } +textarea { + max-width: none; + width: 30em; + height: 10em; + white-space: nowrap; + overflow: auto; +} + button { background: #8A6;