From 4de0b73cd83a4949e820926d854c2dd30596b129 Mon Sep 17 00:00:00 2001 From: z3d Date: Thu, 30 Jul 2009 23:10:48 +0000 Subject: [PATCH 01/21] Ongoing UI enhancements; peers.jsp gets some love. --- .../org/klomp/snark/web/I2PSnarkServlet.java | 4 +- .../i2p/router/web/ConfigClientsHelper.java | 6 +- .../net/i2p/router/web/ConfigUIHelper.java | 2 +- .../i2p/router/web/ConfigUpdateHelper.java | 4 +- .../src/net/i2p/router/web/GraphHelper.java | 4 +- apps/routerconsole/jsp/config.jsp | 38 ++-- apps/routerconsole/jsp/configstats.jsp | 18 +- .../src/src/i2p/susi/webmail/WebMail.java | 6 +- .../crypto/TransientSessionKeyManager.java | 4 +- .../themes/console/light/console.css | 22 +++ router/java/src/net/i2p/router/JobQueue.java | 2 +- .../src/net/i2p/router/PersistentKeyRing.java | 2 +- router/java/src/net/i2p/router/Router.java | 2 +- .../transport/FIFOBandwidthLimiter.java | 6 +- .../router/transport/TransportManager.java | 2 +- .../router/transport/ntcp/NTCPTransport.java | 56 +++--- .../router/transport/udp/UDPTransport.java | 184 +++++++++--------- 17 files changed, 192 insertions(+), 170 deletions(-) diff --git a/apps/i2psnark/java/src/org/klomp/snark/web/I2PSnarkServlet.java b/apps/i2psnark/java/src/org/klomp/snark/web/I2PSnarkServlet.java index 21d1edc27..9e1bf8f07 100644 --- a/apps/i2psnark/java/src/org/klomp/snark/web/I2PSnarkServlet.java +++ b/apps/i2psnark/java/src/org/klomp/snark/web/I2PSnarkServlet.java @@ -711,7 +711,7 @@ public class I2PSnarkServlet extends HttpServlet { out.write("Configuration:
\n"); out.write("Data directory: (Edit i2psnark.config and restart to change)
\n"); - out.write("Auto start: "); //Auto add: @@ -738,7 +738,7 @@ public class I2PSnarkServlet extends HttpServlet { out.write("Up bandwidth limit: KBps (Half available bandwidth recommended.)
\n"); - out.write("Use open trackers also: "); out.write("Announce URLs: \n"); + buf.append("\n"); buf.append("\n"); List clients = ClientAppConfig.getClientApps(_context); @@ -30,7 +30,7 @@ public class ConfigClientsHelper extends HelperBase { public String getForm2() { StringBuilder buf = new StringBuilder(1024); - buf.append("
ClientRun at Startup?Start NowClass and arguments
\n"); + buf.append("
\n"); buf.append("\n"); Properties props = RouterConsoleRunner.webAppProperties(); Set keys = new TreeSet(props.keySet()); @@ -56,7 +56,7 @@ public class ConfigClientsHelper extends HelperBase { } else { buf.append(name); } - buf.append(" - - - +
WebAppRun at Startup?Start NowDescription
").append(theme).append("
\n"); diff --git a/apps/routerconsole/java/src/net/i2p/router/web/ConfigUpdateHelper.java b/apps/routerconsole/java/src/net/i2p/router/web/ConfigUpdateHelper.java index d67f63bfa..5d03d9024 100644 --- a/apps/routerconsole/java/src/net/i2p/router/web/ConfigUpdateHelper.java +++ b/apps/routerconsole/java/src/net/i2p/router/web/ConfigUpdateHelper.java @@ -42,10 +42,10 @@ public class ConfigUpdateHelper extends HelperBase { public String getUpdateThroughProxy() { String proxy = _context.getProperty(ConfigUpdateHandler.PROP_SHOULD_PROXY, ConfigUpdateHandler.DEFAULT_SHOULD_PROXY); if (Boolean.valueOf(proxy).booleanValue()) - return ""; + return ""; else - return ""; + return ""; } private static final long PERIODS[] = new long[] { 12*60*60*1000l, 24*60*60*1000l, 48*60*60*1000l, -1l }; diff --git a/apps/routerconsole/java/src/net/i2p/router/web/GraphHelper.java b/apps/routerconsole/java/src/net/i2p/router/web/GraphHelper.java index 2ab03ed58..037ca17af 100644 --- a/apps/routerconsole/java/src/net/i2p/router/web/GraphHelper.java +++ b/apps/routerconsole/java/src/net/i2p/router/web/GraphHelper.java @@ -109,8 +109,8 @@ public class GraphHelper extends HelperBase { _out.write("

[Select Stats to Graph]

"); _out.write("

"); _out.write("Periods:
\n"); - _out.write("Plot averages: "); - _out.write("or plot events:
\n"); + _out.write("Plot averages: "); + _out.write("or plot events:
\n"); _out.write("Image sizes: width: pixels, height:
\n"); diff --git a/apps/routerconsole/jsp/config.jsp b/apps/routerconsole/jsp/config.jsp index 1cf5da92c..d19742e14 100644 --- a/apps/routerconsole/jsp/config.jsp +++ b/apps/routerconsole/jsp/config.jsp @@ -59,7 +59,7 @@ out.print("It improves your anonymity by creating cover traffic, and helps the network.
"); } else { out.print("You have configured I2P to share " + share + "KBps. "); - out.print("The higher the share bandwidth the more you improve your anonymity and help the network.
"); + out.print("The higher the share bandwidth the more you improve your anonymity and help the network.
"); } %>

@@ -67,7 +67,7 @@

<% } %> -

-
+ +

Adjust Profile Bonuses

Bonuses may be positive or negative, and affect the peer's inclusion in Fast and High Capacity tiers. Fast peers are used for client tunnels, and High @@ -59,7 +60,8 @@ if (! "".equals(peer)) { // get existing bonus values? } - %> + %> +
Speed: Capacity: @@ -68,7 +70,6 @@

-
" /> diff --git a/apps/routerconsole/jsp/configservice.jsp b/apps/routerconsole/jsp/configservice.jsp index 8ca0087c7..942aedf0d 100644 --- a/apps/routerconsole/jsp/configservice.jsp +++ b/apps/routerconsole/jsp/configservice.jsp @@ -26,11 +26,11 @@

Graceful shutdown lets the router satisfy the agreements it has already made before shutting down, but may take a few minutes. If you need to kill the router immediately, that option is available as well.

- +
-
+
<% if (System.getProperty("wrapper.version") != null) { %>

If you want the router to restart itself after shutting down, you can choose one of the following. This is useful in some situations - for example, if you changed @@ -38,30 +38,32 @@ or the interface it listens on. A graceful restart will take a few minutes (but your peers will appreciate your patience), while a hard restart does so immediately. After tearing down the router, it will wait 1 minute before starting back up again.

- +
- <% } %> -
+ <% } %>
+ <% if ( (System.getProperty("os.name") != null) && (System.getProperty("os.name").startsWith("Win")) ) { %>

Systray integration

On the windows platform, there is a small application to sit in the system tray, allowing you to view the router's status (later on, I2P client applications will be able to integrate their own functionality into the system tray as well). If you are on windows, you can either enable or disable that icon here.

+
-
+

Run on startup

You can control whether I2P is run on startup or not by selecting one of the following options - I2P will install (or remove) a service accordingly. You can also run the install_i2p_service_winnt.bat (or uninstall_i2p_service_winnt.bat) from the command line, if you prefer.

+
-
+

Note: If you are running I2P as service right now, removing it will shut down your router immediately. You may want to consider shutting down gracefully, as - above, then running uninstall_i2p_service_winnt.bat.


+ above, then running uninstall_i2p_service_winnt.bat.

<% } %> <% if (System.getProperty("wrapper.version") != null) { %> @@ -69,17 +71,19 @@

At times, it may be helpful to debug I2P by getting a thread dump. To do so, please select the following option and review the thread dumped to wrapper.log.

+
- <% } %>
+<% } %>

Launch browser on router startup?

I2P's main configuration interface is this web console, so for your convenience I2P can launch a web browser pointing at http://127.0.0.1:7657/index.jsp whenever the router starts up.

+
-
+
diff --git a/apps/routerconsole/jsp/configstats.jsp b/apps/routerconsole/jsp/configstats.jsp index a1298d444..cf4bd8dc4 100644 --- a/apps/routerconsole/jsp/configstats.jsp +++ b/apps/routerconsole/jsp/configstats.jsp @@ -101,9 +101,7 @@ function toggleAll(category)
Advanced filter:
diff --git a/apps/routerconsole/jsp/configtunnels.jsp b/apps/routerconsole/jsp/configtunnels.jsp index f7c4911ba..6782ea116 100644 --- a/apps/routerconsole/jsp/configtunnels.jsp +++ b/apps/routerconsole/jsp/configtunnels.jsp @@ -42,7 +42,7 @@ Note - Exploratory tunnel setting changes are stored in the router.config file.
Client tunnel changes are temporary and are not saved.
To make permanent client tunnel changes see the i2ptunnel page.
-
+
diff --git a/apps/routerconsole/jsp/configui.jsp b/apps/routerconsole/jsp/configui.jsp index 3835db33b..c8a28956a 100644 --- a/apps/routerconsole/jsp/configui.jsp +++ b/apps/routerconsole/jsp/configui.jsp @@ -34,9 +34,9 @@ " /> -
+
- +
<% } else { %> Theme selection disabled for Internet Explorer, sorry.
If you're not using IE, it's likely that your browser is pretending to be IE; please configure your browser (or proxy) to use a different User Agent string if you'd like to access the console themes. diff --git a/apps/routerconsole/jsp/configupdate.jsp b/apps/routerconsole/jsp/configupdate.jsp index a8cfa33cd..80cbbf04d 100644 --- a/apps/routerconsole/jsp/configupdate.jsp +++ b/apps/routerconsole/jsp/configupdate.jsp @@ -32,44 +32,40 @@ - News: + News: <% if ("true".equals(System.getProperty("net.i2p.router.web.UpdateHandler.updateInProgress", "false"))) { %> Update In Progress
<% } else { %> <% } %>
- News URL: + News URL: "> - Refresh frequency: + Refresh frequency: - Update policy: + Update policy: - Update through the eepProxy? + Update through the eepProxy? - eepProxy host: + eepProxy host: " /> - eepProxy port: + eepProxy port: " /> - Update URLs: + Update URLs: - Trusted keys: + Trusted keys: - - -
- -
+
diff --git a/installer/resources/themes/console/dark/console.css b/installer/resources/themes/console/dark/console.css index 60bc544de..8e0d75d60 100644 --- a/installer/resources/themes/console/dark/console.css +++ b/installer/resources/themes/console/dark/console.css @@ -536,6 +536,11 @@ input[type=text]:active, input[type=text]:hover { background: #001; } +fieldset { +overflow: hidden; +position: relative; +} + select { background: #002; color: #eef; @@ -636,6 +641,8 @@ form {} border: 0; margin: 5px 5px 5px 10px; padding: 2px; +overflow: hidden; +position: relative; } .optbox:hover { @@ -662,4 +669,8 @@ form {} border-bottom: 1px solid #99f !important; font-size: 7pt; line-height: 110%; +} + +.formaction { + text-align: right; } \ No newline at end of file diff --git a/installer/resources/themes/console/light/console.css b/installer/resources/themes/console/light/console.css index b8368bebf..d87217c98 100644 --- a/installer/resources/themes/console/light/console.css +++ b/installer/resources/themes/console/light/console.css @@ -716,4 +716,8 @@ form {} padding: 8px 2px !important; font-size: 7pt; line-height: 110%; +} + +.formaction { + text-align: right; } \ No newline at end of file diff --git a/router/java/src/net/i2p/router/Blocklist.java b/router/java/src/net/i2p/router/Blocklist.java index 1ce5cb5e7..a166939b4 100644 --- a/router/java/src/net/i2p/router/Blocklist.java +++ b/router/java/src/net/i2p/router/Blocklist.java @@ -767,10 +767,10 @@ public class Blocklist { out.write(""); } if (_blocklistSize > 0) { - out.write(""); + out.write("
IPs from Blocklist File
FromTo
"); for (int i = 0; i < _blocklistSize; i++) { int from = getFrom(_blocklist[i]); - out.write("\n"); @@ -779,7 +779,7 @@ public class Blocklist { } out.write("
IPs from Blocklist File
From:To:
"); out.write(toStr(from)); out.write(""); + out.write("
"); out.write(toStr(from)); out.write(""); int to = getTo(_blocklist[i]); if (to != from) { out.write(toStr(to)); out.write("
"); } else { - out.write("
No blocklist file entries"); + out.write("
No blocklist file entries."); } out.flush(); } diff --git a/router/java/src/net/i2p/router/RouterVersion.java b/router/java/src/net/i2p/router/RouterVersion.java index 326d2e110..e74d70743 100644 --- a/router/java/src/net/i2p/router/RouterVersion.java +++ b/router/java/src/net/i2p/router/RouterVersion.java @@ -18,9 +18,9 @@ public class RouterVersion { /** deprecated */ public final static String ID = "Monotone"; public final static String VERSION = CoreVersion.VERSION; - public final static long BUILD = 02; + public final static long BUILD = 03; /** for example "-test" */ - public final static String EXTRA = "-zed"; + public final static String EXTRA = ""; public final static String FULL_VERSION = VERSION + "-" + BUILD + EXTRA; public static void main(String args[]) { System.out.println("I2P Router version: " + FULL_VERSION); From 1afd946a9410115243f7c773a9d0734b900ac285 Mon Sep 17 00:00:00 2001 From: z3d Date: Sat, 1 Aug 2009 01:36:59 +0000 Subject: [PATCH 06/21] Close quotes on div to ensure buttons align to the right in configui.jsp. --- apps/routerconsole/jsp/configui.jsp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/routerconsole/jsp/configui.jsp b/apps/routerconsole/jsp/configui.jsp index c8a28956a..f918bd5b5 100644 --- a/apps/routerconsole/jsp/configui.jsp +++ b/apps/routerconsole/jsp/configui.jsp @@ -34,7 +34,7 @@ " /> -
<% } else { %> From 65ae26a9610c56a0eaa6d41f8124912b4d200818 Mon Sep 17 00:00:00 2001 From: z3d Date: Sat, 1 Aug 2009 03:28:42 +0000 Subject: [PATCH 07/21] More UI layout enhancements to the config pages. --- .../net/i2p/router/web/ConfigClientsHandler.java | 16 ++++++++-------- .../net/i2p/router/web/ConfigClientsHelper.java | 12 ++++++------ .../src/net/i2p/router/web/ConfigUIHelper.java | 2 +- apps/routerconsole/jsp/configkeyring.jsp | 13 ++++++------- apps/routerconsole/jsp/configlogging.jsp | 14 +++++++------- apps/routerconsole/jsp/configpeer.jsp | 6 +++--- .../java/src/net/i2p/router/RouterVersion.java | 2 +- 7 files changed, 32 insertions(+), 33 deletions(-) diff --git a/apps/routerconsole/java/src/net/i2p/router/web/ConfigClientsHandler.java b/apps/routerconsole/java/src/net/i2p/router/web/ConfigClientsHandler.java index 5fc3679e0..285cdd385 100644 --- a/apps/routerconsole/java/src/net/i2p/router/web/ConfigClientsHandler.java +++ b/apps/routerconsole/java/src/net/i2p/router/web/ConfigClientsHandler.java @@ -55,7 +55,7 @@ public class ConfigClientsHandler extends FormHandler { else startWebApp(app); } else { - addFormError("Unsupported " + _action); + addFormError("Unsupported " + _action + "."); } } @@ -70,18 +70,18 @@ public class ConfigClientsHandler extends FormHandler { ca.disabled = val == null; } ClientAppConfig.writeClientAppConfig(_context, clients); - addFormNotice("Client configuration saved successfully - restart required to take effect"); + addFormNotice("Client configuration saved successfully - restart required to take effect."); } private void startClient(int i) { List clients = ClientAppConfig.getClientApps(_context); if (i >= clients.size()) { - addFormError("Bad client index"); + addFormError("Bad client index."); return; } ClientAppConfig ca = (ClientAppConfig) clients.get(i); LoadClientAppsJob.runClient(ca.className, ca.clientName, LoadClientAppsJob.parseArgs(ca.args), _log); - addFormNotice("Client " + ca.clientName + " started"); + addFormNotice("Client " + ca.clientName + " started."); } private void saveWebAppChanges() { @@ -98,7 +98,7 @@ public class ConfigClientsHandler extends FormHandler { props.setProperty(name, "" + (val != null)); } RouterConsoleRunner.storeWebAppProperties(props); - addFormNotice("WebApp configuration saved successfully - restart required to take effect"); + addFormNotice("WebApp configuration saved successfully - restart required to take effect."); } // Big hack for the moment, not using properties for directory and port @@ -116,14 +116,14 @@ public class ConfigClientsHandler extends FormHandler { path = new File(path, app + ".war"); s.addWebApplication("/"+ app, path.getAbsolutePath()).start(); // no passwords... initialize(wac); - addFormNotice("WebApp " + app + " started"); + addFormNotice("WebApp " + app + " started."); } catch (Exception ioe) { - addFormError("Failed to start " + app + " " + ioe); + addFormError("Failed to start " + app + " " + ioe + "."); } return; } } } - addFormError("Failed to find server"); + addFormError("Failed to find server."); } } diff --git a/apps/routerconsole/java/src/net/i2p/router/web/ConfigClientsHelper.java b/apps/routerconsole/java/src/net/i2p/router/web/ConfigClientsHelper.java index 3cdcbfa19..47b301d28 100644 --- a/apps/routerconsole/java/src/net/i2p/router/web/ConfigClientsHelper.java +++ b/apps/routerconsole/java/src/net/i2p/router/web/ConfigClientsHelper.java @@ -15,7 +15,7 @@ public class ConfigClientsHelper extends HelperBase { public String getForm1() { StringBuilder buf = new StringBuilder(1024); buf.append("\n"); - buf.append("\n"); + buf.append("\n"); List clients = ClientAppConfig.getClientApps(_context); for (int cur = 0; cur < clients.size(); cur++) { @@ -31,7 +31,7 @@ public class ConfigClientsHelper extends HelperBase { public String getForm2() { StringBuilder buf = new StringBuilder(1024); buf.append("
ClientRun at Startup?Start NowClass and arguments
ClientRun at Startup?Start NowClass and arguments
\n"); - buf.append("\n"); + buf.append("\n"); Properties props = RouterConsoleRunner.webAppProperties(); Set keys = new TreeSet(props.keySet()); for (Iterator iter = keys.iterator(); iter.hasNext(); ) { @@ -47,7 +47,7 @@ public class ConfigClientsHelper extends HelperBase { } private void renderForm(StringBuilder buf, String index, String name, boolean urlify, boolean enabled, boolean ro, String desc) { - buf.append("\n"); + buf.append("\n"); } } diff --git a/apps/routerconsole/java/src/net/i2p/router/web/ConfigUIHelper.java b/apps/routerconsole/java/src/net/i2p/router/web/ConfigUIHelper.java index 11830975b..74f259485 100644 --- a/apps/routerconsole/java/src/net/i2p/router/web/ConfigUIHelper.java +++ b/apps/routerconsole/java/src/net/i2p/router/web/ConfigUIHelper.java @@ -3,7 +3,7 @@ package net.i2p.router.web; public class ConfigUIHelper extends HelperBase { public ConfigUIHelper() {} - private static final String themes[] = {"classic", "dark", "light"}; + private static final String themes[] = {"Classic", "Dark", "Light"}; public String getSettings() { StringBuilder buf = new StringBuilder(512); diff --git a/apps/routerconsole/jsp/configkeyring.jsp b/apps/routerconsole/jsp/configkeyring.jsp index 2c2394e76..9363ba04b 100644 --- a/apps/routerconsole/jsp/configkeyring.jsp +++ b/apps/routerconsole/jsp/configkeyring.jsp @@ -42,16 +42,15 @@

WebAppRun at Startup?Start NowDescription
WebAppRun at Startup?Start NowDescription
"); + buf.append("
"); if (urlify && enabled) { String link = "/"; if (! RouterConsoleRunner.ROUTERCONSOLE.equals(name)) @@ -56,16 +56,16 @@ public class ConfigClientsHelper extends HelperBase { } else { buf.append(name); } - buf.append(" "); + buf.append("/>"); if (!enabled) { buf.append(""); } - buf.append(" ").append(desc).append("
").append(desc).append("
- + - +
Dest. name, hash, or full key: - + Dest. name, hash, or full key:
Session Key: - + Session Key:
-
- -
+
+
diff --git a/apps/routerconsole/jsp/configlogging.jsp b/apps/routerconsole/jsp/configlogging.jsp index 8d655b8e9..a854b0750 100644 --- a/apps/routerconsole/jsp/configlogging.jsp +++ b/apps/routerconsole/jsp/configlogging.jsp @@ -28,32 +28,32 @@

Configure I2P Logging Options

- - - - - - - "); + buf.append(""); else if (in.getLength() <= 1 || in.getLength() + in.getLengthVariance() <= 1 || out.getLength() <= 1 || out.getLength() + out.getLengthVariance() <= 1) - buf.append(""); + buf.append(""); if (in.getLength() + Math.abs(in.getLengthVariance()) >= WARN_LENGTH || out.getLength() + Math.abs(out.getLengthVariance()) >= WARN_LENGTH) - buf.append(""); + buf.append(""); if (in.getQuantity() + in.getBackupQuantity() >= WARN_QUANTITY || out.getQuantity() + out.getBackupQuantity() >= WARN_QUANTITY) - buf.append(""); + buf.append(""); buf.append("\n"); diff --git a/apps/routerconsole/jsp/configpeer.jsp b/apps/routerconsole/jsp/configpeer.jsp index a4d22c6c8..4cf9c7bdb 100644 --- a/apps/routerconsole/jsp/configpeer.jsp +++ b/apps/routerconsole/jsp/configpeer.jsp @@ -37,8 +37,8 @@

Manual Peer Controls

-
Router Hash:
- +
Router Hash: +

Manually Shitlist / Unshitlist a Router

Shitlisting will prevent the participation of this peer in tunnels you create.
@@ -62,11 +62,11 @@ } %>
-
Speed:
+
Speed: -
Capacity:
+ Capacity: - +

diff --git a/apps/routerconsole/jsp/configtunnels.jsp b/apps/routerconsole/jsp/configtunnels.jsp index 6782ea116..cc5e3389f 100644 --- a/apps/routerconsole/jsp/configtunnels.jsp +++ b/apps/routerconsole/jsp/configtunnels.jsp @@ -42,7 +42,7 @@ Note - Exploratory tunnel setting changes are stored in the router.config file.
Client tunnel changes are temporary and are not saved.
To make permanent client tunnel changes see the i2ptunnel page.
-
+
From abf7296de12632833caf93c2644094b215b9f9ba Mon Sep 17 00:00:00 2001 From: z3d Date: Sun, 2 Aug 2009 12:57:50 +0000 Subject: [PATCH 09/21] Fix for IE overflow issue; classic theme enhanced; more UI enhancements. --- .../i2p/router/web/ConfigTunnelsHandler.java | 12 +- .../net/i2p/router/web/ConfigUIHandler.java | 4 +- .../net/i2p/router/web/ConfigUIHelper.java | 2 +- apps/routerconsole/jsp/config.jsp | 3 +- apps/routerconsole/jsp/configadvanced.jsp | 4 +- apps/routerconsole/jsp/configclients.jsp | 7 +- apps/routerconsole/jsp/configkeyring.jsp | 10 +- apps/routerconsole/jsp/configlogging.jsp | 4 +- apps/routerconsole/jsp/configpeer.jsp | 4 +- apps/routerconsole/jsp/configstats.jsp | 4 +- apps/routerconsole/jsp/configtunnels.jsp | 4 +- apps/routerconsole/jsp/configupdate.jsp | 3 +- apps/routerconsole/jsp/css.jsp | 1 + history.txt | 6 +- .../themes/console/classic/console.css | 203 +++++++++++++++--- .../themes/console/classic/ieshim.css | 6 + .../themes/console/light/console.css | 5 +- router/java/src/net/i2p/router/JobQueue.java | 4 +- .../src/net/i2p/router/RouterVersion.java | 2 +- .../router/transport/ntcp/NTCPTransport.java | 4 +- .../router/transport/udp/UDPTransport.java | 4 +- .../router/tunnel/pool/TunnelPoolManager.java | 4 +- 22 files changed, 227 insertions(+), 73 deletions(-) create mode 100644 installer/resources/themes/console/classic/ieshim.css diff --git a/apps/routerconsole/java/src/net/i2p/router/web/ConfigTunnelsHandler.java b/apps/routerconsole/java/src/net/i2p/router/web/ConfigTunnelsHandler.java index c7c7c2eb9..0e59380e1 100644 --- a/apps/routerconsole/java/src/net/i2p/router/web/ConfigTunnelsHandler.java +++ b/apps/routerconsole/java/src/net/i2p/router/web/ConfigTunnelsHandler.java @@ -47,7 +47,7 @@ public class ConfigTunnelsHandler extends FormHandler { boolean saveRequired = false; if (_log.shouldLog(Log.DEBUG)) - _log.debug("Saving changes, with props = " + _settings); + _log.debug("Saving changes, with props = " + _settings + "."); int updated = 0; int index = 0; @@ -67,7 +67,7 @@ public class ConfigTunnelsHandler extends FormHandler { try { client.fromBase64(poolName); } catch (DataFormatException dfe) { - addFormError("Internal error (pool name could not resolve - " + poolName + ")"); + addFormError("Internal error (pool name could not resolve - " + poolName + ")."); index++; continue; } @@ -76,7 +76,7 @@ public class ConfigTunnelsHandler extends FormHandler { } if ( (in == null) || (out == null) ) { - addFormError("Internal error (pool settings cound not be found for " + poolName + ")"); + addFormError("Internal error (pool settings cound not be found for " + poolName + ")."); index++; continue; } @@ -131,14 +131,14 @@ public class ConfigTunnelsHandler extends FormHandler { } if (updated > 0) - addFormNotice("Updated settings for " + updated + " pools"); + addFormNotice("Updated settings for " + updated + " pools."); if (saveRequired) { boolean saved = _context.router().saveConfig(); if (saved) - addFormNotice("Exploratory tunnel configuration saved successfully"); + addFormNotice("Exploratory tunnel configuration saved successfully."); else - addFormNotice("Error saving the configuration (applied but not saved) - please see the error logs"); + addFormNotice("Error saving the configuration (applied but not saved) - please see the error logs."); } } private static final int getInt(Object val) { diff --git a/apps/routerconsole/java/src/net/i2p/router/web/ConfigUIHandler.java b/apps/routerconsole/java/src/net/i2p/router/web/ConfigUIHandler.java index 934bb0c88..79ea1d182 100644 --- a/apps/routerconsole/java/src/net/i2p/router/web/ConfigUIHandler.java +++ b/apps/routerconsole/java/src/net/i2p/router/web/ConfigUIHandler.java @@ -24,8 +24,8 @@ public class ConfigUIHandler extends FormHandler { else _context.router().setConfigSetting(CSSHelper.PROP_THEME_NAME, _config); if (_context.router().saveConfig()) - addFormNotice("Theme change successfully saved (refresh page to view)"); + addFormNotice("Theme change successfully saved (refresh page to view)."); else - addFormNotice("Error saving the configuration (applied but not saved) - please see the error logs"); + addFormNotice("Error saving the configuration (applied but not saved) - please see the error logs."); } } diff --git a/apps/routerconsole/java/src/net/i2p/router/web/ConfigUIHelper.java b/apps/routerconsole/java/src/net/i2p/router/web/ConfigUIHelper.java index 74f259485..11830975b 100644 --- a/apps/routerconsole/java/src/net/i2p/router/web/ConfigUIHelper.java +++ b/apps/routerconsole/java/src/net/i2p/router/web/ConfigUIHelper.java @@ -3,7 +3,7 @@ package net.i2p.router.web; public class ConfigUIHelper extends HelperBase { public ConfigUIHelper() {} - private static final String themes[] = {"Classic", "Dark", "Light"}; + private static final String themes[] = {"classic", "dark", "light"}; public String getSettings() { StringBuilder buf = new StringBuilder(512); diff --git a/apps/routerconsole/jsp/config.jsp b/apps/routerconsole/jsp/config.jsp index 8dad41943..b91a1ce24 100644 --- a/apps/routerconsole/jsp/config.jsp +++ b/apps/routerconsole/jsp/config.jsp @@ -30,6 +30,7 @@ I2P will work best if you configure your rates to match the speed of your internet connection.

+

Logging filename: + Logging filename: " />
(the symbol '@' will be replaced during log rotation)
Log record format: + Log record format: " />
(use 'd' = date, 'c' = class, 't' = thread, 'p' = priority, 'm' = message)
Log date format: + Log date format: " />
('MM' = month, 'dd' = day, 'HH' = hour, 'mm' = minute, 'ss' = second, 'SSS' = millisecond)
Max log file size: + Max log file size: " />
Default log level: + Default log level:
(DEBUG and INFO are not recommended defaults, as they will drastically slow down your router)
Log level overrides: + Log level overrides:

+

diff --git a/apps/routerconsole/jsp/configpeer.jsp b/apps/routerconsole/jsp/configpeer.jsp index 8264a9538..a4d22c6c8 100644 --- a/apps/routerconsole/jsp/configpeer.jsp +++ b/apps/routerconsole/jsp/configpeer.jsp @@ -37,7 +37,7 @@

Manual Peer Controls

- Router Hash: +
Router Hash:

Manually Shitlist / Unshitlist a Router

Shitlisting will prevent the participation of this peer in tunnels you create. @@ -62,9 +62,9 @@ } %>
- Speed: +
Speed:
- Capacity: +
Capacity:

diff --git a/router/java/src/net/i2p/router/RouterVersion.java b/router/java/src/net/i2p/router/RouterVersion.java index e74d70743..79a99b76c 100644 --- a/router/java/src/net/i2p/router/RouterVersion.java +++ b/router/java/src/net/i2p/router/RouterVersion.java @@ -18,7 +18,7 @@ public class RouterVersion { /** deprecated */ public final static String ID = "Monotone"; public final static String VERSION = CoreVersion.VERSION; - public final static long BUILD = 03; + public final static long BUILD = 04; /** for example "-test" */ public final static String EXTRA = ""; public final static String FULL_VERSION = VERSION + "-" + BUILD + EXTRA; From 6e29eddaa73276c3492e7910ea8914714b8227be Mon Sep 17 00:00:00 2001 From: z3d Date: Sat, 1 Aug 2009 04:14:05 +0000 Subject: [PATCH 08/21] More UI layout tweak & fixes to config page(s). --- .../src/net/i2p/router/web/ConfigTunnelsHelper.java | 8 ++++---- apps/routerconsole/jsp/configpeer.jsp | 10 +++++----- apps/routerconsole/jsp/configtunnels.jsp | 2 +- 3 files changed, 10 insertions(+), 10 deletions(-) diff --git a/apps/routerconsole/java/src/net/i2p/router/web/ConfigTunnelsHelper.java b/apps/routerconsole/java/src/net/i2p/router/web/ConfigTunnelsHelper.java index aa2b6a1b0..e5e0a2922 100644 --- a/apps/routerconsole/java/src/net/i2p/router/web/ConfigTunnelsHelper.java +++ b/apps/routerconsole/java/src/net/i2p/router/web/ConfigTunnelsHelper.java @@ -62,18 +62,18 @@ public class ConfigTunnelsHelper extends HelperBase { in.getLength() + in.getLengthVariance() <= 0 || out.getLength() <= 0 || out.getLength() + out.getLengthVariance() <= 0) - buf.append("
ANONYMITY WARNING - Settings include 0-hop tunnels
ANONYMITY WARNING - Settings include 0-hop tunnels.
ANONYMITY WARNING - Settings include 1-hop tunnels
ANONYMITY WARNING - Settings include 1-hop tunnels.
PERFORMANCE WARNING - Settings include very long tunnels
PERFORMANCE WARNING - Settings include very long tunnels.
PERFORMANCE WARNING - Settings include high tunnel quantities
PERFORMANCE WARNING - Settings include high tunnel quantities.
\"Inbound\"  Inbound\"Outbound  Outbound
" /> KBps In ()
@@ -49,7 +50,7 @@ -->
Share ()
-
+

<% int share = nethelper.getShareBandwidth(); if (share < 12) { diff --git a/apps/routerconsole/jsp/configadvanced.jsp b/apps/routerconsole/jsp/configadvanced.jsp index f435c68a9..6fe8723dc 100644 --- a/apps/routerconsole/jsp/configadvanced.jsp +++ b/apps/routerconsole/jsp/configadvanced.jsp @@ -16,12 +16,13 @@

<%@include file="confignav.jsp" %> - + " />
+
<% String prev = System.getProperty("net.i2p.router.web.ConfigAdvancedHandler.nonce"); if (prev != null) System.setProperty("net.i2p.router.web.ConfigAdvancedHandler.noncePrev", prev); @@ -38,5 +39,6 @@
+
diff --git a/apps/routerconsole/jsp/configclients.jsp b/apps/routerconsole/jsp/configclients.jsp index 91a2dd8cb..8921987f4 100644 --- a/apps/routerconsole/jsp/configclients.jsp +++ b/apps/routerconsole/jsp/configclients.jsp @@ -35,13 +35,13 @@ button span.hide{

Client Configuration

The Java clients listed below are started by the router and run in the same JVM. -

+

All changes require restart to take effect. To change other client options, edit the clients.config file.


-
+

WebApp Configuration

The Java web applications listed below are started by the webConsole client and run in the same JVM as the router. @@ -53,7 +53,7 @@ button span.hide{ A web app may also be disabled by removing the .war file from the webapps directory; however the .war file and web app will reappear when you update your router to a newer version, so disabling the web app here is the preferred method. -

+

@@ -65,5 +65,6 @@ button span.hide{

+ diff --git a/apps/routerconsole/jsp/configkeyring.jsp b/apps/routerconsole/jsp/configkeyring.jsp index 9363ba04b..7e58f4a15 100644 --- a/apps/routerconsole/jsp/configkeyring.jsp +++ b/apps/routerconsole/jsp/configkeyring.jsp @@ -11,7 +11,7 @@

I2P Keyring Configuration

<%@include file="confignav.jsp" %> - + " /> @@ -26,8 +26,9 @@

Keyring

The router keyring is used to decrypt encrypted leaseSets. The keyring may contain keys for local or remote encrypted destinations. -

-

+

+ +


@@ -40,6 +41,7 @@ Enter keys for encrypted remote destinations here. Keys for local destinations must be entered on the I2PTunnel page.

+

@@ -54,7 +56,7 @@
Dest. name, hash, or full key:
- +
diff --git a/apps/routerconsole/jsp/configlogging.jsp b/apps/routerconsole/jsp/configlogging.jsp index a854b0750..432acdfb8 100644 --- a/apps/routerconsole/jsp/configlogging.jsp +++ b/apps/routerconsole/jsp/configlogging.jsp @@ -13,7 +13,7 @@

I2P Logging Configuration

<%@include file="confignav.jsp" %> - + " /> @@ -26,6 +26,7 @@ " />

Configure I2P Logging Options

+
"); buf.append("\n"); - buf.append("
Logging filename: @@ -64,5 +65,6 @@ + diff --git a/apps/routerconsole/jsp/configpeer.jsp b/apps/routerconsole/jsp/configpeer.jsp index 4cf9c7bdb..debe2676b 100644 --- a/apps/routerconsole/jsp/configpeer.jsp +++ b/apps/routerconsole/jsp/configpeer.jsp @@ -69,15 +69,15 @@

- " />
+
- +
diff --git a/apps/routerconsole/jsp/configstats.jsp b/apps/routerconsole/jsp/configstats.jsp index cf4bd8dc4..9a2435ec4 100644 --- a/apps/routerconsole/jsp/configstats.jsp +++ b/apps/routerconsole/jsp/configstats.jsp @@ -56,7 +56,7 @@ function toggleAll(category)

I2P Stats Configuration

<%@include file="confignav.jsp" %> - + " /> @@ -78,6 +78,7 @@ function toggleAll(category) (change requires restart to take effect)
Stat file:
Filter: (toggle all)
+
<% while (statshelper.hasMoreStats()) { while (statshelper.groupRequired()) { %> @@ -105,5 +106,6 @@ function toggleAll(category)
+ diff --git a/apps/routerconsole/jsp/configtunnels.jsp b/apps/routerconsole/jsp/configtunnels.jsp index cc5e3389f..f6ccb44d7 100644 --- a/apps/routerconsole/jsp/configtunnels.jsp +++ b/apps/routerconsole/jsp/configtunnels.jsp @@ -14,7 +14,6 @@

I2P Tunnel Configuration

<%@include file="confignav.jsp" %> - " /> " /> @@ -31,7 +30,7 @@ High CPU and/or high outbound bandwidth usage may result. Change these settings with care, and adjust them if you have problems.

- +
<% String prev = System.getProperty("net.i2p.router.web.ConfigTunnelsHandler.nonce"); if (prev != null) System.setProperty("net.i2p.router.web.ConfigTunnelsHandler.noncePrev", prev); @@ -46,5 +45,6 @@
+ diff --git a/apps/routerconsole/jsp/configupdate.jsp b/apps/routerconsole/jsp/configupdate.jsp index 80cbbf04d..d82600da2 100644 --- a/apps/routerconsole/jsp/configupdate.jsp +++ b/apps/routerconsole/jsp/configupdate.jsp @@ -28,7 +28,7 @@ System.setProperty("net.i2p.router.web.ConfigUpdateHandler.nonce", new java.util.Random().nextLong()+""); %> " />

Check for I2P and news updates

- +
@@ -70,6 +70,7 @@
+ diff --git a/apps/routerconsole/jsp/css.jsp b/apps/routerconsole/jsp/css.jsp index 60db06835..37b649780 100644 --- a/apps/routerconsole/jsp/css.jsp +++ b/apps/routerconsole/jsp/css.jsp @@ -18,3 +18,4 @@ " /> console.css" rel="stylesheet" type="text/css" /> + \ No newline at end of file diff --git a/history.txt b/history.txt index b5509a770..e50e75d28 100644 --- a/history.txt +++ b/history.txt @@ -1,8 +1,12 @@ +2009-08-02 + * Better support for Internet Explorer/classic theme. + * Incremental improvements to classic theme. + * More UI tweaks and fiddles. + 2009-07-31 dr|z3d * Resolve anomalous buttons and text fields in console ui. * Enhance presentation of data in /peers.jsp. * Fix themes issue with horizontal width of radio/checkbox icons. - (Radioboxes currently non-functional in Opera). * Other cosmetic UI enhancements. * 2009-07-31 0.7.6 released diff --git a/installer/resources/themes/console/classic/console.css b/installer/resources/themes/console/classic/console.css index 5cd5ceb85..9ed070e12 100644 --- a/installer/resources/themes/console/classic/console.css +++ b/installer/resources/themes/console/classic/console.css @@ -1,10 +1,13 @@ body { - margin: 1em 0em; - padding: 0em; + margin: 15px 0; + padding: 0; text-align: left; background: #FFF; color: #000; - font: 10pt/120% Verdana, Tahoma, Helvetica, sans-serif; +/* + font: 10pt/140% Verdana, Tahoma, Helvetica, sans-serif; +*/ + font: 10pt/140% "Lucida Sans Unicode", "Bitstream Vera Sans", Verdana, Tahoma, Helvetica, sans-serif; } .hide { @@ -16,8 +19,9 @@ img { } pre { + overflow: auto; + font-size: 8pt !important; width: 100%; - overflow-x: scroll; } div.logo { @@ -37,25 +41,25 @@ div.toolbar { } div.routersummaryouter { - float: left; + float: left; width: 200px; margin: 0; padding: 0; border: 0; - clear: left;/* fixes a bug in Opera */ - overflow: auto; + clear: left; /* fixes a bug in Opera */ } div.routersummary { background: #fafaff; - width: 175px; + width: 180px; color: inherit; - margin: 0em; - padding: 5px; - text-align: left; - border: medium solid #efefff; + margin: 0; + padding: 5px 0 0 10px; + text-align: left !important; + border: 5px solid #efefff; font-size: 9pt; word-wrap: break-word; + font: 9pt/125%; } div.routersummary hr { @@ -63,11 +67,16 @@ div.routersummary hr { background: #ccf; height: 2px; border: 0px solid #ccf; - margin: 10px 0; + margin: 4px 0; } + +div.routersummary p { + padding: 0; +} + div.warning { - margin: 0em 1em 1em 224px; - padding: .5em 1em; + margin: 0 10px 10px 205px; + padding: 5px 10px; background: #ffefef; border: medium solid #ffafaf; text-align: left; @@ -75,40 +84,63 @@ div.warning { } div.main { - margin: 0em 1em 1em 224px; - padding: .5em 1em; + margin: 0 20px 10px 205px; + padding: 5px 15px 15px 15px; background: #ffffef; - border: medium solid #ffffd0; + border: 5px solid #ffffd0; text-align: left; color: inherit; } + div.main textarea { - width: 100% !important; +/* width: 100% !important; breaks IE */ + width: 600px; } div.news { - margin: 0em 1em 1em 224px; - padding: .5em 1em; + margin: 0 20px 0 205px; + padding: -10px 15px 5px 15px; background: #ffffc0; - border: medium solid #ffffa0; + border: 5px solid #ffffa0; text-align: justify; color: inherit; } +div.news li { + text-align: justify; + list-style: none; + margin: -10px 20px -20px -20px; + padding: 8px 0; + border: 1px solid #330; + border-left: 5px solid #330; + padding: 3px 5px 3px 5px; + background: #fe7; + font-size: 12pt; +} + +div.news a:link { + +} + div.confignav { - padding: 1em; - background: #efefff; + padding: 12px 0 15px 0; + background: #cfc; + margin: -10px -20px 0 -10px; + border: 5px solid #9f9; } div.configure { - padding: 1em; + margin: 0 -20px 0 -10px; + padding: 10px 20px 5px 20px; background: #ffffc0; } div.messages { - padding: 1em; + padding: 10px; background: #fafaff; + border: 5px solid #fdd; + margin: 0px -20px 0px -10px; } div.messages span.error { @@ -122,21 +154,37 @@ div.messages span.notice { h1 { font-size: 18pt; text-align: center; + border: 5px solid #efefff; + border-bottom: 5px solid #efefff; + padding: 10px; + margin: 0 20px 0 205px; + line-height: 93%; + text-transform: uppercase; + letter-spacing: 0.3em; + background: #fff; } h2 { - font-size: 12pt; + font-size: 14pt; + padding: 10px; + border-bottom: 2px solid #001; + border-top: 2px solid #001; + letter-spacing: 0.04em; } h3 { - font-size: 10pt; + font-size: 12pt; + padding: 10px; + border-bottom: 2px solid #001; + border-top: 2px solid #001; + letter-spacing: 0.04em; } + .proxyfooter{ font-size: 7pt; display: none !important; } - table { /* border-collapse: collapse; */ border: 5px solid #dfd; @@ -144,12 +192,13 @@ table { cell-padding: 1px; font-size: 7pt; background: #fff; + width: 100%; } - th { background-color: #ccf; padding: 5px 2px; + text-align: center; } tt { @@ -169,11 +218,11 @@ tr:nth-child(odd) { } hr { - color: #ff9; - background: #ff9; + color: #dd9; + background: #dd9; height: 2px; - border: 0px solid #ff9; - margin: 10px 0; + border: 0px solid #dd5; + margin: 5px 0; } .statusnotes { @@ -183,4 +232,88 @@ hr { text-align: center; margin: -3px 0 0 0; background: #fff; - } \ No newline at end of file + } + +input { + margin: 3px 5px 3px 0; + vertical-align: middle; +} + +select { + margin: 3px 5px 3px 0; + vertical-align: middle; +} + +submit { + padding 0 2px; +} + +p { + padding: 5px 20px 0px 20px; + text-align: justify; +} + +.formaction { + text-align: right; +} + +.langbox { + margin: 30px 0 0px 5px; + color: #001; + font-size: 7pt; + width: 180px; + text-align: center; + float: right; + valign: middle; +} + +.langbox img { + padding: 0 2px; /* Ignored by IE8 */ +} + +a:link{ + color: #006; + text-decoration: none; + font-weight: bold; + word-wrap: break-word; +} + +a:visited{ + color: #448; + text-decoration: none; + font-weight: bold; +} + +a:hover{ + color: #f60; + text-decoration: underline; + font-weight: bold; +} + +a:active{ + color: #f93; + text-decoration: underline; + font-weight: bold; +} + +pre { + font-size: 9pt; + margin: 0px 20px; +} + +tt { + font-size: 9pt; + font-weight: bold; + color: darkgreen; +} + +.tablefooter { + border: 1px solid #f00; +} + +.tablefooter tr, .tablefooter td { + background: #aaf; + font-size: 8pt; + font-weight: bold; + line-height: 150%; +} \ No newline at end of file diff --git a/installer/resources/themes/console/classic/ieshim.css b/installer/resources/themes/console/classic/ieshim.css new file mode 100644 index 000000000..0e47dae15 --- /dev/null +++ b/installer/resources/themes/console/classic/ieshim.css @@ -0,0 +1,6 @@ +/* Welcome to the wonderful world of kludgey IE fixes */ + +.wideload { + overflow: auto; + width: 100%; +} \ No newline at end of file diff --git a/installer/resources/themes/console/light/console.css b/installer/resources/themes/console/light/console.css index d87217c98..20d8c28cf 100644 --- a/installer/resources/themes/console/light/console.css +++ b/installer/resources/themes/console/light/console.css @@ -19,7 +19,7 @@ img { pre { width: 98%; - overflow-x: scroll; + overflow: auto; text-align: left; font: 8pt "Lucida Console", "DejaVu Sans Mono", Courier, mono; color: #333; @@ -130,7 +130,6 @@ div.main { text-align: left; color: #001; width: auto; -/* overflow-x: scroll; */ } div.main hr, hr { @@ -652,7 +651,7 @@ form {} -khtml-border-radius: 4px; text-align: justify; -moz-box-shadow: inset 0px 0px 1px 0px #002; - overflow-x: scroll; + overflow: auto; } div.joblog:li { diff --git a/router/java/src/net/i2p/router/JobQueue.java b/router/java/src/net/i2p/router/JobQueue.java index 6adcc4b3e..af58277ca 100644 --- a/router/java/src/net/i2p/router/JobQueue.java +++ b/router/java/src/net/i2p/router/JobQueue.java @@ -607,7 +607,7 @@ public class JobQueue { out.flush(); StringBuilder buf = new StringBuilder(32*1024); - buf.append("

I2P JobQueue

# runners: ").append(numRunners).append(" [states="); + buf.append("

I2P JobQueue

# runners: ").append(numRunners).append(" [states="); if (states != null) for (int i = 0; i < states.length; i++) buf.append(states[i]).append(" "); @@ -734,6 +734,6 @@ public class JobQueue { buf.append("
").append(minPendingTime).append("
\n"); + buf.append("
\n"); } } diff --git a/router/java/src/net/i2p/router/RouterVersion.java b/router/java/src/net/i2p/router/RouterVersion.java index 79a99b76c..f23327089 100644 --- a/router/java/src/net/i2p/router/RouterVersion.java +++ b/router/java/src/net/i2p/router/RouterVersion.java @@ -18,7 +18,7 @@ public class RouterVersion { /** deprecated */ public final static String ID = "Monotone"; public final static String VERSION = CoreVersion.VERSION; - public final static long BUILD = 04; + public final static long BUILD = 05; /** for example "-test" */ public final static String EXTRA = ""; public final static String FULL_VERSION = VERSION + "-" + BUILD + EXTRA; diff --git a/router/java/src/net/i2p/router/transport/ntcp/NTCPTransport.java b/router/java/src/net/i2p/router/transport/ntcp/NTCPTransport.java index a21ad2790..b21156f1c 100644 --- a/router/java/src/net/i2p/router/transport/ntcp/NTCPTransport.java +++ b/router/java/src/net/i2p/router/transport/ntcp/NTCPTransport.java @@ -643,7 +643,7 @@ public class NTCPTransport extends TransportImpl { buf.append(". Limit: ").append(getMaxConnections()); buf.append(". Timeout: ").append(DataHelper.formatDuration(_pumper.getIdleTimeout())); buf.append(".\n"); - buf.append("\n"); + buf.append("
\n"); buf.append(""); buf.append(""); buf.append(""); @@ -727,7 +727,7 @@ public class NTCPTransport extends TransportImpl { buf.append("\n"); } - buf.append("
PeerDirIdle

\n"); + buf.append("

\n"); out.write(buf.toString()); buf.setLength(0); } diff --git a/router/java/src/net/i2p/router/transport/udp/UDPTransport.java b/router/java/src/net/i2p/router/transport/udp/UDPTransport.java index 2d38730ae..044b33b8e 100644 --- a/router/java/src/net/i2p/router/transport/udp/UDPTransport.java +++ b/router/java/src/net/i2p/router/transport/udp/UDPTransport.java @@ -1767,7 +1767,7 @@ public class UDPTransport extends TransportImpl implements TimedWeightedPriority buf.append(". Limit: ").append(getMaxConnections()); buf.append(". Timeout: ").append(DataHelper.formatDuration(_expireTimeout)); buf.append(".\n"); - buf.append("\n"); + buf.append("
\n"); buf.append("\n"); buf.append(" \n"); - buf.append("
Peer"); if (sortFlags != FLAG_ALPHA) buf.append(" V "); @@ -1998,7 +1998,7 @@ public class UDPTransport extends TransportImpl implements TimedWeightedPriority buf.append(sendTotal).append(" ").append(recvTotal).append("").append(resentTotal); buf.append(" ").append(dupRecvTotal).append("

\n"); + buf.append("

\n"); long bytesTransmitted = _context.bandwidthLimiter().getTotalAllocatedOutboundBytes(); // NPE here early double averagePacketSize = _context.statManager().getRate("udp.sendPacketSize").getLifetimeAverageValue(); diff --git a/router/java/src/net/i2p/router/tunnel/pool/TunnelPoolManager.java b/router/java/src/net/i2p/router/tunnel/pool/TunnelPoolManager.java index 70b869b55..7ffbac578 100644 --- a/router/java/src/net/i2p/router/tunnel/pool/TunnelPoolManager.java +++ b/router/java/src/net/i2p/router/tunnel/pool/TunnelPoolManager.java @@ -405,7 +405,7 @@ public class TunnelPoolManager implements TunnelManagerFacade { public void renderStatusHTML(Writer out) throws IOException { - out.write("

Exploratory tunnels (config):

\n"); + out.write("

Exploratory tunnels (config):

\n"); renderPool(out, _inboundExploratory, _outboundExploratory); List destinations = null; @@ -623,7 +623,7 @@ public class TunnelPoolManager implements TunnelManagerFacade { } out.write(" Tunnels " + tunnelCount); out.write("   " + partCount); - out.write("  \n"); + out.write("  
\n"); } /** @return total number of non-fallback expl. + client tunnels */ From 3a0cdf13882a7cf72159f68e1faca118931c726a Mon Sep 17 00:00:00 2001 From: z3d Date: Sun, 2 Aug 2009 13:57:29 +0000 Subject: [PATCH 10/21] More IE overflow fixes; remove max-width from i2psnark css. --- apps/routerconsole/jsp/graphs.jsp | 2 ++ apps/routerconsole/jsp/netdb.jsp | 3 ++- apps/routerconsole/jsp/profiles.jsp | 4 ++-- installer/resources/themes/console/classic/console.css | 8 ++++++-- installer/resources/themes/console/snark.css | 2 +- 5 files changed, 13 insertions(+), 6 deletions(-) diff --git a/apps/routerconsole/jsp/graphs.jsp b/apps/routerconsole/jsp/graphs.jsp index 64277f0d0..34ee723b7 100644 --- a/apps/routerconsole/jsp/graphs.jsp +++ b/apps/routerconsole/jsp/graphs.jsp @@ -11,6 +11,7 @@

I2P Performance Graphs

+
" /> @@ -18,5 +19,6 @@
+
\ No newline at end of file diff --git a/apps/routerconsole/jsp/netdb.jsp b/apps/routerconsole/jsp/netdb.jsp index d3c70811c..cac11bf05 100644 --- a/apps/routerconsole/jsp/netdb.jsp +++ b/apps/routerconsole/jsp/netdb.jsp @@ -10,6 +10,7 @@ <%@include file="summary.jsp" %>

I2P Network Database Summary

+
" /> @@ -18,6 +19,6 @@ " />
- +
diff --git a/apps/routerconsole/jsp/profiles.jsp b/apps/routerconsole/jsp/profiles.jsp index c9e673c79..11529cf55 100644 --- a/apps/routerconsole/jsp/profiles.jsp +++ b/apps/routerconsole/jsp/profiles.jsp @@ -9,7 +9,7 @@ <%@include file="summary.jsp" %>

I2P Network Peer Profiles

-
+
" /> @@ -17,6 +17,6 @@
- +
diff --git a/installer/resources/themes/console/classic/console.css b/installer/resources/themes/console/classic/console.css index 9ed070e12..b63795545 100644 --- a/installer/resources/themes/console/classic/console.css +++ b/installer/resources/themes/console/classic/console.css @@ -94,8 +94,8 @@ div.main { div.main textarea { -/* width: 100% !important; breaks IE */ - width: 600px; + width: 100% !important; + } div.news { @@ -316,4 +316,8 @@ tt { font-size: 8pt; font-weight: bold; line-height: 150%; +} + +.tidylist { + text-align: justify; } \ No newline at end of file diff --git a/installer/resources/themes/console/snark.css b/installer/resources/themes/console/snark.css index f78956ad1..501312743 100644 --- a/installer/resources/themes/console/snark.css +++ b/installer/resources/themes/console/snark.css @@ -135,7 +135,7 @@ td { background-color: #fff; color:#310; min-width: 700px !important; - max-width: 800px !important; +/* max-width: 800px !important; */ margin: 20px; padding: 10px 20px 5px 20px; -moz-border-radius: 4px; From c7c132c0ac488165f57e5c98c04925208bdc768d Mon Sep 17 00:00:00 2001 From: z3d Date: Sun, 2 Aug 2009 19:05:40 +0000 Subject: [PATCH 11/21] More classic theme tweaks, I2PSnark UI fixes, and enhanced proxy error messages for classic. --- history.txt | 3 ++- .../themes/console/classic/console.css | 18 ++++++++++-------- .../themes/console/images/errortriangle.png | Bin 0 -> 1637 bytes .../themes/console/images/i2psnark.png | Bin 26085 -> 39305 bytes installer/resources/themes/console/snark.css | 15 +++++++++------ .../src/net/i2p/router/RouterVersion.java | 2 +- .../router/tunnel/pool/TunnelPoolManager.java | 4 ++-- 7 files changed, 24 insertions(+), 18 deletions(-) create mode 100644 installer/resources/themes/console/images/errortriangle.png diff --git a/history.txt b/history.txt index e50e75d28..2fd710c64 100644 --- a/history.txt +++ b/history.txt @@ -2,7 +2,8 @@ * Better support for Internet Explorer/classic theme. * Incremental improvements to classic theme. * More UI tweaks and fiddles. - + * Fixes for I2PSnark UI; more to come. + 2009-07-31 dr|z3d * Resolve anomalous buttons and text fields in console ui. * Enhance presentation of data in /peers.jsp. diff --git a/installer/resources/themes/console/classic/console.css b/installer/resources/themes/console/classic/console.css index b63795545..80c00304f 100644 --- a/installer/resources/themes/console/classic/console.css +++ b/installer/resources/themes/console/classic/console.css @@ -26,12 +26,11 @@ pre { div.logo { float: left; - width: 200px; - left: 1em; - top: 1em; - margin: 0em; - padding: .5em; + width: 175px; + margin: 0 0 0 20px; + padding: 10px; text-align: center; + border: 5px solid #dedeff; } div.toolbar { @@ -75,12 +74,15 @@ div.routersummary p { } div.warning { - margin: 0 10px 10px 205px; - padding: 5px 10px; + margin: 20px 20px 10px 240px; + padding: 10px 20px 20px 75px; background: #ffefef; - border: medium solid #ffafaf; + border: 5px solid #ffafaf; text-align: left; color: inherit; + background-image:url("../images/errortriangle.png"); + background-position:15px center; + background-repeat:no-repeat; } div.main { diff --git a/installer/resources/themes/console/images/errortriangle.png b/installer/resources/themes/console/images/errortriangle.png new file mode 100644 index 0000000000000000000000000000000000000000..f1730ccbf6280167680a8ac21b942faa282a7f21 GIT binary patch literal 1637 zcmV-r2AcVaP)pL7fD1xRCt`lSba>DWfVX6gUc0e0v9dfqE-^12q8mlbs5t|Z9zGm zZVbz<<(wDh#~-z!ZDi@RS%27;VoxxdYTUd?F;Tkos$ zZ|f;3F!4foLAp|WWV{$YKI%HP6u7z}SF1MYrGe=AT~O_2}WaOP()G=2b+^j$Cvebl_j2Hn3r3;BucM?Ac88+sCv zXTHg3jLj?>#@dIrZwK&t0g8$sD@zJv{r&x-&-}s0Mj;o^ znB6&RmeV#mDlKuz60q59VxWi(QJ?wt@o``|V%yX_R50P@#9UX0I5-%5=fH=dfcZ53 zhsnhJ2`xjlUm4`Ak>ijuhD>ZMyf4N{j^$ZTF%W*l91#Qp1Kx;PGAO=zy^%cQGZ~^y z8xPr0_UvR=3V<((N{RY<@XNr?J5K*vFrrpAS7f zv3%naDd4nI-Q1 z`@v?lhDHhssQAw%kEn8RyMycpl;H|CY=B!sLzk&rMl_k|WO`{d8g`;VXI@^3XYXFH z(WD~MGf`%&-m*pHA#P#e!r&Oou{`UszHH}zbxs&=sI0WNZ`>GiibLs&6>#qQb!cmA z6N2sS?QrTcZPN1P(zqH52^o$=j+L`WOA8ggwZ+9DuASzg;{ucPThT;q zfbLsLN(yv#b^`tElS%|SezdjC@DFM@rACv~=lG z;ao*Ug{F+}+ixQ5vHfDH0P%oIi4=XT6bs-2hc zK?SF2`D^rU`-80S$hF2X@mWoDD%`o9L?0cZ+Pl;oX2dZY0v~^_KhYFm{NzJ`TYm-n z7pYu*=O6L8mFP2et~td3?;oE*oAf9l`7vRTvfqlkR1qS4&HH4tl2d2=R8Cst|FJwF jaGl>xeoQk6=Vty3)E|I^+PrRf00000NkvXXu0mjf7tJ0E literal 0 HcmV?d00001 diff --git a/installer/resources/themes/console/images/i2psnark.png b/installer/resources/themes/console/images/i2psnark.png index 31722ab9d2fcea7ce8ec8a61082217e37cdca8b9..63fddb10799a9ad2394efbf065a182906ff234a2 100644 GIT binary patch literal 39305 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 )DTJ0)a2eZbReE3>M1fhJ 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 N002ovPDHLkV1k87r8)or literal 26085 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 diff --git a/installer/resources/themes/console/snark.css b/installer/resources/themes/console/snark.css index 501312743..4b6fbb2c3 100644 --- a/installer/resources/themes/console/snark.css +++ b/installer/resources/themes/console/snark.css @@ -63,11 +63,12 @@ body { -khtml-border-radius: 4px; border-radius: 4px; border: 2px solid #930; - text-align: center; - overflow-x: scroll; - background: #ddf url('../console/images/orangetile.png'); + text-align: left; + overflow: auto; + background: #f40 url('../console/images/orangetile.png'); color: #531; height: 64px; + width: 100%; } pre { @@ -85,6 +86,7 @@ table { padding: 0px; border-width: 0px; border-spacing: 0px; + border-collapse: collapse; } th { @@ -92,8 +94,9 @@ th { font-size: 8pt; border-top: 1px outset #001; border-bottom: 1px inset #001; - background: #f91 url('/themes/console/images/tabletitleorange.png') repeat-x; + background: #f60 url('/themes/console/images/tabletitleorange.png') repeat-x; text-align: left; + whitespace: nowrap; } .SnarkTorrents { @@ -134,7 +137,7 @@ td { .page { background-color: #fff; color:#310; - min-width: 700px !important; + min-width: 800px !important; /* max-width: 800px !important; */ margin: 20px; padding: 10px 20px 5px 20px; @@ -186,7 +189,7 @@ a:visited{ } a:hover{ - color: #f60; + color: #f40; font-weight: bold; } diff --git a/router/java/src/net/i2p/router/RouterVersion.java b/router/java/src/net/i2p/router/RouterVersion.java index f23327089..266c93290 100644 --- a/router/java/src/net/i2p/router/RouterVersion.java +++ b/router/java/src/net/i2p/router/RouterVersion.java @@ -18,7 +18,7 @@ public class RouterVersion { /** deprecated */ public final static String ID = "Monotone"; public final static String VERSION = CoreVersion.VERSION; - public final static long BUILD = 05; + public final static long BUILD = 06; /** for example "-test" */ public final static String EXTRA = ""; public final static String FULL_VERSION = VERSION + "-" + BUILD + EXTRA; diff --git a/router/java/src/net/i2p/router/tunnel/pool/TunnelPoolManager.java b/router/java/src/net/i2p/router/tunnel/pool/TunnelPoolManager.java index 7ffbac578..7b86ba83b 100644 --- a/router/java/src/net/i2p/router/tunnel/pool/TunnelPoolManager.java +++ b/router/java/src/net/i2p/router/tunnel/pool/TunnelPoolManager.java @@ -583,8 +583,8 @@ public class TunnelPoolManager implements TunnelManagerFacade { live += pending.size(); } if (live <= 0) - out.write("
NNo tunnels; waiting for the grace period to end.
\n"); - out.write("
Lifetime bandwidth usage: " + DataHelper.formatSize(processedIn*1024) + "
No tunnels; waiting for the grace period to end.
\n"); + out.write("
Lifetime bandwidth usage: " + DataHelper.formatSize(processedIn*1024) + "B in, " + DataHelper.formatSize(processedOut*1024) + "B out
"); } From 460c8a319f232ed3166c1a2a0796f730862c81ad Mon Sep 17 00:00:00 2001 From: z3d Date: Mon, 3 Aug 2009 13:24:55 +0000 Subject: [PATCH 12/21] Extensive overhaul of the classic theme; css hacks for IE! --- history.txt | 5 +- .../themes/console/classic/console.css | 106 ++++++++++-------- .../themes/console/classic/ieshim.css | 72 +++++++++++- .../src/net/i2p/router/RouterVersion.java | 2 +- 4 files changed, 138 insertions(+), 47 deletions(-) diff --git a/history.txt b/history.txt index 2fd710c64..890f0cd80 100644 --- a/history.txt +++ b/history.txt @@ -1,4 +1,7 @@ -2009-08-02 +2009-08-03 dr|z3d + * Extensive update to the Classic theme; custom css hacks for IE. + +2009-08-02 dr|z3d * Better support for Internet Explorer/classic theme. * Incremental improvements to classic theme. * More UI tweaks and fiddles. diff --git a/installer/resources/themes/console/classic/console.css b/installer/resources/themes/console/classic/console.css index 80c00304f..0ebbbccab 100644 --- a/installer/resources/themes/console/classic/console.css +++ b/installer/resources/themes/console/classic/console.css @@ -1,5 +1,7 @@ +/* Optimised for less capable browers and system specifications */ + body { - margin: 15px 0; + margin: 0; padding: 0; text-align: left; background: #FFF; @@ -7,7 +9,7 @@ body { /* font: 10pt/140% Verdana, Tahoma, Helvetica, sans-serif; */ - font: 10pt/140% "Lucida Sans Unicode", "Bitstream Vera Sans", Verdana, Tahoma, Helvetica, sans-serif; + font: 9pt/140% "Lucida Sans Unicode", "Bitstream Vera Sans", Verdana, Tahoma, Helvetica, sans-serif; } .hide { @@ -49,23 +51,23 @@ div.routersummaryouter { } div.routersummary { - background: #fafaff; - width: 180px; + background: #ddf; + width: 190px; color: inherit; margin: 0; - padding: 5px 0 0 10px; + padding: 7px 0 0 0px; text-align: left !important; - border: 5px solid #efefff; + border: 5px solid #bbf; font-size: 9pt; word-wrap: break-word; font: 9pt/125%; } div.routersummary hr { - color: #ccf; - background: #ccf; - height: 2px; - border: 0px solid #ccf; + color: #bbf; + background: #bbf; + height: 5px; + border: 0px solid #bbf; margin: 4px 0; } @@ -86,12 +88,14 @@ div.warning { } div.main { - margin: 0 20px 10px 205px; + margin: 0px 0px 10px 195px; padding: 5px 15px 15px 15px; - background: #ffffef; - border: 5px solid #ffffd0; + background: #eef; + border: 5px solid #bbf; + border-top: 0; text-align: left; - color: inherit; + color: #001; + min-width: 570px; } @@ -101,12 +105,13 @@ div.main textarea { } div.news { - margin: 0 20px 0 205px; - padding: -10px 15px 5px 15px; + margin: -5px 0px 0 195px; + padding: -10px 15px 15px 15px; background: #ffffc0; - border: 5px solid #ffffa0; + border: 5px solid #bbf; text-align: justify; color: inherit; + min-width: 600px; } div.news li { @@ -128,21 +133,26 @@ div.news a:link { div.confignav { padding: 12px 0 15px 0; background: #cfc; - margin: -10px -20px 0 -10px; - border: 5px solid #9f9; + margin: -10px -20px 0 -23px; + border: 5px solid #bbf; } div.configure { - margin: 0 -20px 0 -10px; - padding: 10px 20px 5px 20px; - background: #ffffc0; + margin: 0 -20px 0 -20px; + padding: 0px 20px 0px 20px; +/* background: #eeffee;*/ } div.messages { padding: 10px; background: #fafaff; border: 5px solid #fdd; - margin: 0px -20px 0px -10px; + border-right: 0; + margin: 0px -15px 0px -20px; + text-align: center; + font-size: 9pt; + font-weight: bold; + color: #444455; } div.messages span.error { @@ -156,29 +166,29 @@ div.messages span.notice { h1 { font-size: 18pt; text-align: center; - border: 5px solid #efefff; - border-bottom: 5px solid #efefff; - padding: 10px; - margin: 0 20px 0 205px; + border: 5px solid #bbf; + padding: 13px 10px 12px 10px; + margin: 0 0px 0 175px; line-height: 93%; text-transform: uppercase; letter-spacing: 0.3em; background: #fff; + min-width: 600px; } h2 { font-size: 14pt; padding: 10px; - border-bottom: 2px solid #001; - border-top: 2px solid #001; + border-bottom: 2px solid #003; + border-top: 0px solid #003; letter-spacing: 0.04em; } h3 { font-size: 12pt; - padding: 10px; - border-bottom: 2px solid #001; - border-top: 2px solid #001; + padding: 0 10px 10px 10px; + border-bottom: 5px solid #bbf; + border-top: 0px solid #bbf; letter-spacing: 0.04em; } @@ -188,8 +198,8 @@ h3 { } table { -/* border-collapse: collapse; */ - border: 5px solid #dfd; + border-collapse: collapse; + border: 5px solid #bbf; margin: 5px 0px; cell-padding: 1px; font-size: 7pt; @@ -197,10 +207,15 @@ table { width: 100%; } +table hr { + display: none +} + th { - background-color: #ccf; + background-color: #def; padding: 5px 2px; text-align: center; + border-bottom: 1px solid #88f; } tt { @@ -208,7 +223,7 @@ tt { } td { - padding: 2px; + padding: 4px; } tr:nth-child(even) { @@ -220,10 +235,10 @@ tr:nth-child(odd) { } hr { - color: #dd9; - background: #dd9; - height: 2px; - border: 0px solid #dd5; + color: #bbf; + background: #bbf; + height: 5px; + border: 0px solid #bbf; margin: 5px 0; } @@ -242,11 +257,12 @@ input { } select { - margin: 3px 5px 3px 0; + margin: 3px 5px 3px 5px; vertical-align: middle; } submit { + margin: 3px 5px 3px 5px; padding 0 2px; } @@ -310,16 +326,18 @@ tt { } .tablefooter { - border: 1px solid #f00; + border: 1px solid #88f; } .tablefooter tr, .tablefooter td { - background: #aaf; + background: #bbf; font-size: 8pt; font-weight: bold; line-height: 150%; + word-wrap: nowrap; + padding: 8px 1px; } .tidylist { text-align: justify; -} \ No newline at end of file +} diff --git a/installer/resources/themes/console/classic/ieshim.css b/installer/resources/themes/console/classic/ieshim.css index 0e47dae15..79b903861 100644 --- a/installer/resources/themes/console/classic/ieshim.css +++ b/installer/resources/themes/console/classic/ieshim.css @@ -3,4 +3,74 @@ .wideload { overflow: auto; width: 100%; -} \ No newline at end of file +} + +.formaction { + text-align: left !important; +} +div.configure textarea { + width: 450px !important; +} + +h1 { + padding: 15px 10px 16px 10px !important; + border-right: 0; +} + +div.confignav { + padding: 15px 0 15px 0; + border-left: 0px solid #bbf; + margin-left: -15px; + border-right: 0; + border-top: 0; +} + +div.main { + border-left: 5px solid #bbf !important; + margin-top: 0; +} + +div.messages { + border-left: 0px solid #bbf; + border-right: 0px solid #ddf; + margin: 0px -15px 0px -15px; +} + +div.main, div.news { + margin: 0px 0px 10px 185px; + border: 0px solid #bbf; +} + +div.main hr, div.news hr { + margin: 5px 0px; +} + +div.main { + border-top: 5px solid #eef; +} + +div.news { + border-left: 5px solid #bbf; + border-right: 0px solid #ffffc0; + margin-right: 0px; + margin: -20px 0px 0 185px; +} + +div.routersummary { + color: #001; + padding-left: 0px; + border-left: 5px solid #bbf; +} + +/* +div.routersummary, div.routersummary hr { + background: #ddf; + height: 5px; + border: 0px solid #ddf; + margin: 4px 0; +} +*/ + +text { + padding-left: 5px; +} diff --git a/router/java/src/net/i2p/router/RouterVersion.java b/router/java/src/net/i2p/router/RouterVersion.java index 266c93290..0226e038b 100644 --- a/router/java/src/net/i2p/router/RouterVersion.java +++ b/router/java/src/net/i2p/router/RouterVersion.java @@ -18,7 +18,7 @@ public class RouterVersion { /** deprecated */ public final static String ID = "Monotone"; public final static String VERSION = CoreVersion.VERSION; - public final static long BUILD = 06; + public final static long BUILD = 07; /** for example "-test" */ public final static String EXTRA = ""; public final static String FULL_VERSION = VERSION + "-" + BUILD + EXTRA; From 0930ead81410f2cfa61f239ed1702ec316846c0f Mon Sep 17 00:00:00 2001 From: z3d Date: Mon, 3 Aug 2009 14:45:44 +0000 Subject: [PATCH 13/21] Ongoing Classic theme renovations. --- .../themes/console/classic/console.css | 27 ++++++++++------ .../themes/console/classic/ieshim.css | 31 +++++++++++++++++++ 2 files changed, 48 insertions(+), 10 deletions(-) diff --git a/installer/resources/themes/console/classic/console.css b/installer/resources/themes/console/classic/console.css index 0ebbbccab..2f006203c 100644 --- a/installer/resources/themes/console/classic/console.css +++ b/installer/resources/themes/console/classic/console.css @@ -33,6 +33,7 @@ div.logo { padding: 10px; text-align: center; border: 5px solid #dedeff; + background-color: #eef; } div.toolbar { @@ -56,7 +57,7 @@ div.routersummary { color: inherit; margin: 0; padding: 7px 0 0 0px; - text-align: left !important; + text-align: center !important; border: 5px solid #bbf; font-size: 9pt; word-wrap: break-word; @@ -89,7 +90,7 @@ div.warning { div.main { margin: 0px 0px 10px 195px; - padding: 5px 15px 15px 15px; + padding: 15px 15px 15px 15px; background: #eef; border: 5px solid #bbf; border-top: 0; @@ -98,6 +99,9 @@ div.main { min-width: 570px; } +div.main li { + padding-bottom: 10px; +} div.main textarea { width: 100% !important; @@ -133,7 +137,7 @@ div.news a:link { div.confignav { padding: 12px 0 15px 0; background: #cfc; - margin: -10px -20px 0 -23px; + margin: -20px -20px 0 -23px; border: 5px solid #bbf; } @@ -179,8 +183,8 @@ h1 { h2 { font-size: 14pt; padding: 10px; - border-bottom: 2px solid #003; - border-top: 0px solid #003; + border-bottom: 5px solid #bbf; + border-top: 0px solid #bbf; letter-spacing: 0.04em; } @@ -208,12 +212,12 @@ table { } table hr { - display: none + padding: 1px 0; } th { background-color: #def; - padding: 5px 2px; + padding: 8px 2px; text-align: center; border-bottom: 1px solid #88f; } @@ -247,9 +251,12 @@ hr { font-size: 8pt; color: #001; text-align: center; - margin: -3px 0 0 0; - background: #fff; - } + margin: -7px 0 7px 0; + background: #bbf; + border: 5px solid #bbf; + border-top: 0; + padding: 4px 0 2px 0; +} input { margin: 3px 5px 3px 0; diff --git a/installer/resources/themes/console/classic/ieshim.css b/installer/resources/themes/console/classic/ieshim.css index 79b903861..0e6eddd49 100644 --- a/installer/resources/themes/console/classic/ieshim.css +++ b/installer/resources/themes/console/classic/ieshim.css @@ -7,26 +7,57 @@ .formaction { text-align: left !important; + margin: -10px 0 10px 0; } + +div.configure { + text-align: center; +} + +div.configure p { + text-align: justify; +} + +div.main ul { + margin-right: 20px; +} + div.configure textarea { width: 450px !important; } +div.configure table { + width: 350px !important; + text-align: center; +} + h1 { padding: 15px 10px 16px 10px !important; border-right: 0; } +h2 { + padding-top: 0; + text-align: left !important; +} + +h3 { + margin-top: 10px; + text-align: left !important +} + div.confignav { padding: 15px 0 15px 0; border-left: 0px solid #bbf; margin-left: -15px; border-right: 0; border-top: 0; + margin-bottom: 10px !important; } div.main { border-left: 5px solid #bbf !important; + border-bottom: 5px solid #bbf !important; margin-top: 0; } From fc8c0ccfe15be831558d9379e182f3eca707b540 Mon Sep 17 00:00:00 2001 From: z3d Date: Mon, 3 Aug 2009 15:00:15 +0000 Subject: [PATCH 14/21] Minor classic theme tweakage. --- installer/resources/themes/console/classic/console.css | 3 +++ 1 file changed, 3 insertions(+) diff --git a/installer/resources/themes/console/classic/console.css b/installer/resources/themes/console/classic/console.css index 2f006203c..93dd06014 100644 --- a/installer/resources/themes/console/classic/console.css +++ b/installer/resources/themes/console/classic/console.css @@ -147,6 +147,9 @@ div.configure { /* background: #eeffee;*/ } +div.configure table { +} + div.messages { padding: 10px; background: #fafaff; From 59a5776f9d548f1aa7a70909d80ed54e471a5c16 Mon Sep 17 00:00:00 2001 From: z3d Date: Mon, 3 Aug 2009 15:28:49 +0000 Subject: [PATCH 15/21] More Classic theme tweaks. --- .../themes/console/classic/console.css | 26 ++++++++++++++----- .../themes/console/classic/ieshim.css | 5 ++++ 2 files changed, 24 insertions(+), 7 deletions(-) diff --git a/installer/resources/themes/console/classic/console.css b/installer/resources/themes/console/classic/console.css index 93dd06014..300abdecf 100644 --- a/installer/resources/themes/console/classic/console.css +++ b/installer/resources/themes/console/classic/console.css @@ -118,22 +118,34 @@ div.news { min-width: 600px; } +/* convert the list entry to our title */ + div.news li { text-align: justify; list-style: none; - margin: -10px 20px -20px -20px; - padding: 8px 0; - border: 1px solid #330; - border-left: 5px solid #330; - padding: 3px 5px 3px 5px; - background: #fe7; + margin: -15px 20px -20px -20px; + padding: 0px 0 15px 0; + border-bottom: 2px solid #cc7; + border-top: 2px solid #cc7; + padding: 3px 5px 5px 5px; font-size: 12pt; + color: #661; } +div.news p { + color: #330; +} div.news a:link { - + color: #883; } +div.news hr { + color: #cc7; + background: #cc7; + height: 2px; + border: 0px solid #cc7; + margin: 5px 0; +} div.confignav { padding: 12px 0 15px 0; background: #cfc; diff --git a/installer/resources/themes/console/classic/ieshim.css b/installer/resources/themes/console/classic/ieshim.css index 0e6eddd49..9c9b72b3b 100644 --- a/installer/resources/themes/console/classic/ieshim.css +++ b/installer/resources/themes/console/classic/ieshim.css @@ -105,3 +105,8 @@ div.routersummary, div.routersummary hr { text { padding-left: 5px; } + +div.news li { + margin-top: 0 !important; + margin-bottom: -23px !important; +} \ No newline at end of file From 895cb1f2e5ea405a0de01ddd00a742a391e74ab2 Mon Sep 17 00:00:00 2001 From: z3d Date: Mon, 3 Aug 2009 15:48:17 +0000 Subject: [PATCH 16/21] More ieshim.css goodness. --- .../themes/console/classic/ieshim.css | 19 ++++++++----------- 1 file changed, 8 insertions(+), 11 deletions(-) diff --git a/installer/resources/themes/console/classic/ieshim.css b/installer/resources/themes/console/classic/ieshim.css index 9c9b72b3b..e1129e786 100644 --- a/installer/resources/themes/console/classic/ieshim.css +++ b/installer/resources/themes/console/classic/ieshim.css @@ -51,16 +51,10 @@ div.confignav { border-left: 0px solid #bbf; margin-left: -15px; border-right: 0; - border-top: 0; + border-top: 5px solid #bbf; margin-bottom: 10px !important; } -div.main { - border-left: 5px solid #bbf !important; - border-bottom: 5px solid #bbf !important; - margin-top: 0; -} - div.messages { border-left: 0px solid #bbf; border-right: 0px solid #ddf; @@ -68,8 +62,11 @@ div.messages { } div.main, div.news { - margin: 0px 0px 10px 185px; + margin: -5px 0px 10px 185px; border: 0px solid #bbf; + border-top: 5px solid #bbf; + border-left: 5px solid #bbf; + border-bottom: 5px solid #bbf; } div.main hr, div.news hr { @@ -77,14 +74,14 @@ div.main hr, div.news hr { } div.main { - border-top: 5px solid #eef; + border-top: 5px solid #bbf; } div.news { border-left: 5px solid #bbf; border-right: 0px solid #ffffc0; margin-right: 0px; - margin: -20px 0px 0 185px; + margin: -5px 0px 0 185px; } div.routersummary { @@ -107,6 +104,6 @@ text { } div.news li { - margin-top: 0 !important; + padding-top: 0px 0px !important; margin-bottom: -23px !important; } \ No newline at end of file From 32c143f8d742fd5ac745535c7d2a5286f606a3b5 Mon Sep 17 00:00:00 2001 From: z3d Date: Mon, 3 Aug 2009 18:17:11 +0000 Subject: [PATCH 17/21] More classic tweaks. --- .../themes/console/classic/console.css | 98 ++++++++++++++++--- .../themes/console/classic/ieshim.css | 25 ++++- 2 files changed, 109 insertions(+), 14 deletions(-) diff --git a/installer/resources/themes/console/classic/console.css b/installer/resources/themes/console/classic/console.css index 300abdecf..131dad496 100644 --- a/installer/resources/themes/console/classic/console.css +++ b/installer/resources/themes/console/classic/console.css @@ -28,12 +28,57 @@ pre { div.logo { float: left; - width: 175px; + position-relative: top 20px ; + width: 200px; margin: 0 0 0 20px; - padding: 10px; + padding: 10px 5px; text-align: center; - border: 5px solid #dedeff; + border: 5px solid #ddf; background-color: #eef; + -moz-border-radius: 15px; + -moz-box-shadow: inset 0px 0px 0px 2px #99f; + -khtml-border-radius: 15px; + -khtml-box-shadow: inset 0px 0px 0px 2px #99f; +} + +div.logo hr { + color: #ddf; + background: #ddf; + height: 5px; + border: 0px solid #ddf; + margin: 8px -3px; +} + +div.logo a:link, div.logo a:visited { + text-shadow: 0px 0px 1px rgba(0, 0, 32, 0.5); +} + +div.logo a:active { + text-shadow: 0px 0px 1px rgba(255, 96, 0, 0.7); + color: #f60; +} + +div.logo a:hover { + text-shadow: 0px 0px 1px rgba(128, 0, 0, 0.7); + color: #900; +} + +div.warning a:link { + color: #f60; + text-shadow: 0px 0px 1px rgba(255, 96, 0, 0.5); +} + +div.warning a:visited{ + color: #f90; +} + +div.warning a:hover{ + color: #d30; + text-shadow: 0px 0px 1px rgba(255, 96, 0, 0.7); +} + +div.warning a:active{ + color: #900; } div.toolbar { @@ -48,7 +93,7 @@ div.routersummaryouter { margin: 0; padding: 0; border: 0; - clear: left; /* fixes a bug in Opera */ + clear: left; /* fixes a bug in Opera */ } div.routersummary { @@ -77,15 +122,33 @@ div.routersummary p { } div.warning { - margin: 20px 20px 10px 240px; - padding: 10px 20px 20px 75px; - background: #ffefef; - border: 5px solid #ffafaf; + margin: 20px 20px 10px 260px; + padding: 0px 20px 20px 75px; + background: #ffd; + border: 5px solid #fb7; text-align: left; color: inherit; background-image:url("../images/errortriangle.png"); - background-position:15px center; + background-position: 20px center; background-repeat:no-repeat; + -moz-border-radius: 15px; + -moz-box-shadow: inset 0px 0px 0px 2px #f60; + -kthml-border-radius: 15px; + -khtml-box-shadow: inset 0px 0px 0px 2px #f60; +} + +div.warning hr { + color: #fb7; + background: #fb7; + height: 5px; + border: 0px solid #fb7; + margin: 5px 0; + margin: 20px 0; +} + +div.warning h3 { + border-bottom: 5px solid #fb7; + padding-bottom: 10px; } div.main { @@ -103,6 +166,10 @@ div.main li { padding-bottom: 10px; } +div.main li:first-child { + padding-top: 20px; +} + div.main textarea { width: 100% !important; @@ -110,12 +177,15 @@ div.main textarea { div.news { margin: -5px 0px 0 195px; - padding: -10px 15px 15px 15px; + padding: -10px 15px 8px 15px; background: #ffffc0; border: 5px solid #bbf; text-align: justify; color: inherit; min-width: 600px; + padding-bottom: 8px; + padding-left: 10px; + padding-right: 10px; } /* convert the list entry to our title */ @@ -123,7 +193,7 @@ div.news { div.news li { text-align: justify; list-style: none; - margin: -15px 20px -20px -20px; + margin: -15px 15px -20px -20px; padding: 0px 0 15px 0; border-bottom: 2px solid #cc7; border-top: 2px solid #cc7; @@ -146,6 +216,7 @@ div.news hr { border: 0px solid #cc7; margin: 5px 0; } + div.confignav { padding: 12px 0 15px 0; background: #cfc; @@ -298,7 +369,7 @@ p { } .langbox { - margin: 30px 0 0px 5px; + margin: 29px -15px 0px 5px; color: #001; font-size: 7pt; width: 180px; @@ -362,4 +433,5 @@ tt { .tidylist { text-align: justify; -} + padding-right: 30px; +} \ No newline at end of file diff --git a/installer/resources/themes/console/classic/ieshim.css b/installer/resources/themes/console/classic/ieshim.css index e1129e786..20906c94e 100644 --- a/installer/resources/themes/console/classic/ieshim.css +++ b/installer/resources/themes/console/classic/ieshim.css @@ -70,7 +70,7 @@ div.main, div.news { } div.main hr, div.news hr { - margin: 5px 0px; + margin: 0; } div.main { @@ -82,8 +82,17 @@ div.news { border-right: 0px solid #ffffc0; margin-right: 0px; margin: -5px 0px 0 185px; + padding-bottom: 8px; } +div.news hr { + color: #bbf; + background: #bbf; + height: 3px; + border: 0px solid #bbf; + margin: 0px 0px 0 -13px; +} + div.routersummary { color: #001; padding-left: 0px; @@ -106,4 +115,18 @@ text { div.news li { padding-top: 0px 0px !important; margin-bottom: -23px !important; +} + +div.logo { + float: left; + margin: 20px 0 0 20px !important; + border: 0; +} + +div.warning { + padding: 0px 20px 20px 80px; +} + +.langbox { + margin: 22px -20px 0px 5px; } \ No newline at end of file From cce72a5f1bd9d3f2f9c4725f6746f6774e2858e1 Mon Sep 17 00:00:00 2001 From: z3d Date: Mon, 3 Aug 2009 19:09:21 +0000 Subject: [PATCH 18/21] More classic manoeuvres --- .../resources/themes/console/classic/console.css | 2 +- .../resources/themes/console/classic/ieshim.css | 16 +++++++++++++++- 2 files changed, 16 insertions(+), 2 deletions(-) diff --git a/installer/resources/themes/console/classic/console.css b/installer/resources/themes/console/classic/console.css index 131dad496..22654c11c 100644 --- a/installer/resources/themes/console/classic/console.css +++ b/installer/resources/themes/console/classic/console.css @@ -356,7 +356,7 @@ select { submit { margin: 3px 5px 3px 5px; - padding 0 2px; + padding 2px 0; } p { diff --git a/installer/resources/themes/console/classic/ieshim.css b/installer/resources/themes/console/classic/ieshim.css index 20906c94e..1bc96d4c5 100644 --- a/installer/resources/themes/console/classic/ieshim.css +++ b/installer/resources/themes/console/classic/ieshim.css @@ -14,7 +14,7 @@ div.configure { text-align: center; } -div.configure p { +div.configure p, div.configure table { text-align: justify; } @@ -129,4 +129,18 @@ div.warning { .langbox { margin: 22px -20px 0px 5px; +} + +td { + text-align: left; +} + +th { + text-align: left; + padding-left: 3px; + padding-right: 1px; +} + +div.configure hr{ + margin: 10px 0 15px 0; } \ No newline at end of file From 5395b6829a120ce1c13d9af113248ad0ba23b3b8 Mon Sep 17 00:00:00 2001 From: z3d Date: Mon, 3 Aug 2009 22:07:34 +0000 Subject: [PATCH 19/21] Ongoing betterment of the classic theme. --- .../themes/console/classic/console.css | 89 ++++++++++++++++--- .../themes/console/classic/ieshim.css | 48 ++++------ 2 files changed, 93 insertions(+), 44 deletions(-) diff --git a/installer/resources/themes/console/classic/console.css b/installer/resources/themes/console/classic/console.css index 22654c11c..d69cea40c 100644 --- a/installer/resources/themes/console/classic/console.css +++ b/installer/resources/themes/console/classic/console.css @@ -107,20 +107,31 @@ div.routersummary { font-size: 9pt; word-wrap: break-word; font: 9pt/125%; + -moz-box-shadow: inset 0px 0px 0px 1px #99f; } div.routersummary hr { color: #bbf; background: #bbf; - height: 5px; - border: 0px solid #bbf; - margin: 4px 0; + height: 2px; + border-bottom: 1px inset #bbf; + margin: 5px 1px 4px 1px; + -moz-box-shadow: inset 0px -1px 0px 1px #99f; } div.routersummary p { padding: 0; } +div.routersummary a:link, div.routersummary a:visited { + text-shadow: 0px 0px 1px rgba(0, 0, 32, 0.3); +} + +div.routersummary a:hover { + text-shadow: 0px 0px 1px rgba(255, 96, 0, 0.7); + color: #f60; +} + div.warning { margin: 20px 20px 10px 260px; padding: 0px 20px 20px 75px; @@ -160,6 +171,7 @@ div.main { text-align: left; color: #001; min-width: 570px; + -moz-box-shadow: inset 0px 0px 0px 1px #99f; } div.main li { @@ -171,8 +183,8 @@ div.main li:first-child { } div.main textarea { - width: 100% !important; - + width: 98% !important; + margin: 2px 0 2px 5px; } div.news { @@ -186,6 +198,7 @@ div.news { padding-bottom: 8px; padding-left: 10px; padding-right: 10px; + -moz-box-shadow: inset 0px 0px 0px 1px #99f; } /* convert the list entry to our title */ @@ -196,17 +209,18 @@ div.news li { margin: -15px 15px -20px -20px; padding: 0px 0 15px 0; border-bottom: 2px solid #cc7; - border-top: 2px solid #cc7; + border-top: 0px solid #cc7; padding: 3px 5px 5px 5px; font-size: 12pt; - color: #661; + color: #540; } div.news p { color: #330; } div.news a:link { - color: #883; + color: #773; + text-shadow: 0px 0px 1px rgba(128, 128, 48, 0.3); } div.news hr { @@ -231,18 +245,20 @@ div.configure { } div.configure table { + font-size: 9pt; + font-weight: bold; } div.messages { padding: 10px; - background: #fafaff; - border: 5px solid #fdd; + background: #fff; + border: 5px solid #feb; border-right: 0; margin: 0px -15px 0px -20px; text-align: center; font-size: 9pt; font-weight: bold; - color: #444455; + color: #474; } div.messages span.error { @@ -255,15 +271,17 @@ div.messages span.notice { h1 { font-size: 18pt; + text-shadow: 0px 0px 1px rgba(0, 0, 32, 0.7); text-align: center; border: 5px solid #bbf; padding: 13px 10px 12px 10px; - margin: 0 0px 0 175px; + margin: 0 0px 0 195px; line-height: 93%; text-transform: uppercase; letter-spacing: 0.3em; background: #fff; min-width: 600px; + -moz-box-shadow: inset 0px 0px 0px 1px #99f; } h2 { @@ -349,6 +367,10 @@ input { vertical-align: middle; } +input[type=text] { + margin: 3px 5px 3px 5px; + vertical-align: middle; +} select { margin: 3px 5px 3px 5px; vertical-align: middle; @@ -357,6 +379,7 @@ select { submit { margin: 3px 5px 3px 5px; padding 2px 0; + font: 8pt/140% "Lucida Sans Unicode", "Bitstream Vera Sans", Verdana, Tahoma, Helvetica, sans-serif; } p { @@ -434,4 +457,46 @@ tt { .tidylist { text-align: justify; padding-right: 30px; +} + +div.graphspanel { + padding: 20px 10px; + margin: -20px; + background: #ddf url('images/lightbluetile.png'); + -moz-border-radius: 4px; + -khtml-border-radius: 4px; + border-radius: 4px; + border: 5px solid #bbf; + -moz-box-shadow: inset 0px 0px 1px 0px #002; + text-align: center !important; +} + +div.graphspanel img { + border: 1px solid #003; + padding: 2px; + margin: 6px; + background: #001; + -moz-box-shadow: inset 0px 0px 1px 1px #99f; +} + +div.graphspanel img:hover { + border: 1px solid #003; + padding: 2px; + margin: 6px; + text-align: center !important; + background: #001; + -moz-box-shadow: inset 0px 0px 2px 1px #f60; +} + +div.graphspanel hr { + margin: 20px 0; +} + +div.graphspanel form { + text-align: left; + margin: 0 20px; +} + +div.graphspanel h3 { + text-align: left; } \ No newline at end of file diff --git a/installer/resources/themes/console/classic/ieshim.css b/installer/resources/themes/console/classic/ieshim.css index 1bc96d4c5..29fbbd4cf 100644 --- a/installer/resources/themes/console/classic/ieshim.css +++ b/installer/resources/themes/console/classic/ieshim.css @@ -26,14 +26,18 @@ div.configure textarea { width: 450px !important; } +div.configure input { + margin-left: 5px; +} + div.configure table { - width: 350px !important; + width: 550px !important; text-align: center; } h1 { padding: 15px 10px 16px 10px !important; - border-right: 0; + margin: 0 0px 0 175px !important; } h2 { @@ -48,29 +52,25 @@ h3 { div.confignav { padding: 15px 0 15px 0; - border-left: 0px solid #bbf; + border-left: 0px; margin-left: -15px; - border-right: 0; border-top: 5px solid #bbf; margin-bottom: 10px !important; } div.messages { - border-left: 0px solid #bbf; - border-right: 0px solid #ddf; - margin: 0px -15px 0px -15px; + border-left: 0; + border-right: 0; + margin: -10px -15px 0px -15px; } div.main, div.news { margin: -5px 0px 10px 185px; - border: 0px solid #bbf; - border-top: 5px solid #bbf; - border-left: 5px solid #bbf; - border-bottom: 5px solid #bbf; + border: 5px solid #bbf; } div.main hr, div.news hr { - margin: 0; + margin: 0; } div.main { @@ -79,8 +79,6 @@ div.main { div.news { border-left: 5px solid #bbf; - border-right: 0px solid #ffffc0; - margin-right: 0px; margin: -5px 0px 0 185px; padding-bottom: 8px; } @@ -89,8 +87,8 @@ div.news hr { color: #bbf; background: #bbf; height: 3px; - border: 0px solid #bbf; - margin: 0px 0px 0 -13px; + border: 0px; + margin: 0 -10px 0 -13px !important; } div.routersummary { @@ -99,32 +97,18 @@ div.routersummary { border-left: 5px solid #bbf; } -/* -div.routersummary, div.routersummary hr { - background: #ddf; - height: 5px; - border: 0px solid #ddf; - margin: 4px 0; -} -*/ - -text { - padding-left: 5px; -} - div.news li { padding-top: 0px 0px !important; margin-bottom: -23px !important; } div.logo { - float: left; - margin: 20px 0 0 20px !important; - border: 0; } div.warning { padding: 0px 20px 20px 80px; + margin-top: -20px; + margin-left: -10px !important; } .langbox { From 2436ea11313beab1acf669537b53e195aa290751 Mon Sep 17 00:00:00 2001 From: z3d Date: Mon, 3 Aug 2009 23:10:53 +0000 Subject: [PATCH 20/21] More classic/ieshim futzing. --- .../themes/console/classic/console.css | 37 +++++++++++++------ .../themes/console/classic/ieshim.css | 4 ++ 2 files changed, 30 insertions(+), 11 deletions(-) diff --git a/installer/resources/themes/console/classic/console.css b/installer/resources/themes/console/classic/console.css index d69cea40c..7b79f2860 100644 --- a/installer/resources/themes/console/classic/console.css +++ b/installer/resources/themes/console/classic/console.css @@ -4,7 +4,7 @@ body { margin: 0; padding: 0; text-align: left; - background: #FFF; + background: #bbf; color: #000; /* font: 10pt/140% Verdana, Tahoma, Helvetica, sans-serif; @@ -140,7 +140,7 @@ div.warning { text-align: left; color: inherit; background-image:url("../images/errortriangle.png"); - background-position: 20px center; + background-position: 17px center; background-repeat:no-repeat; -moz-border-radius: 15px; -moz-box-shadow: inset 0px 0px 0px 2px #f60; @@ -163,7 +163,7 @@ div.warning h3 { } div.main { - margin: 0px 0px 10px 195px; + margin: 0px 0px 0px 195px; padding: 15px 15px 15px 15px; background: #eef; border: 5px solid #bbf; @@ -234,31 +234,46 @@ div.news hr { div.confignav { padding: 12px 0 15px 0; background: #cfc; - margin: -20px -20px 0 -23px; + margin: -20px -20px 0 -20px; border: 5px solid #bbf; + -moz-box-shadow: inset 0px 0px 0px 1px #99f; } div.configure { - margin: 0 -20px 0 -20px; + margin: 1px -20px 0 -20px; padding: 0px 20px 0px 20px; -/* background: #eeffee;*/ } div.configure table { font-size: 9pt; font-weight: bold; + -moz-box-shadow: inset 0px 0px 1px 1px #001; +} + +div.configure tr, div.configure td { + padding: 10px 2px; +} + +div.configure tr { + -moz-box-shadow: inset 0px 0px 1px 0px #bbf; } div.messages { - padding: 10px; + padding: 0px 10px; background: #fff; - border: 5px solid #feb; + border: 5px solid #bbf; border-right: 0; - margin: 0px -15px 0px -20px; + margin: -5px -15px 10px -20px; text-align: center; font-size: 9pt; font-weight: bold; color: #474; + -moz-box-shadow: inset 0px 0px 0px 1px #99f; +} + +div.messages li, div.messages ul { + padding: 15px 0 5px 5px; + margin: -15px 0 0 0; } div.messages span.error { @@ -472,10 +487,10 @@ div.graphspanel { } div.graphspanel img { - border: 1px solid #003; + border: 1px solid #99f; padding: 2px; margin: 6px; - background: #001; + background: #ddf; -moz-box-shadow: inset 0px 0px 1px 1px #99f; } diff --git a/installer/resources/themes/console/classic/ieshim.css b/installer/resources/themes/console/classic/ieshim.css index 29fbbd4cf..3e897a7af 100644 --- a/installer/resources/themes/console/classic/ieshim.css +++ b/installer/resources/themes/console/classic/ieshim.css @@ -127,4 +127,8 @@ th { div.configure hr{ margin: 10px 0 15px 0; +} + +input { + padding: 0; } \ No newline at end of file From e36f9b22731f1aa7b363b7c100b10f468ce37223 Mon Sep 17 00:00:00 2001 From: z3d Date: Fri, 7 Aug 2009 18:19:42 +0000 Subject: [PATCH 21/21] UI enhancements. --- .../src/net/i2p/router/web/GraphHelper.java | 2 +- apps/routerconsole/jsp/summarynoframe.jsp | 6 +- .../themes/console/classic/console.css | 27 +++++++- .../themes/console/classic/ieshim.css | 20 +++++- .../resources/themes/console/dark/console.css | 62 +++++++++++++++--- .../themes/console/dark/images/titletile.png | Bin 0 -> 2181 bytes .../themes/console/light/console.css | 55 +++++++++++++--- .../console/light/images/lightbluetile.png | Bin 1410 -> 3486 bytes .../themes/console/light/images/titletile.png | Bin 0 -> 1112 bytes installer/resources/themes/console/snark.css | 14 ++-- 10 files changed, 156 insertions(+), 30 deletions(-) create mode 100644 installer/resources/themes/console/dark/images/titletile.png create mode 100644 installer/resources/themes/console/light/images/titletile.png diff --git a/apps/routerconsole/java/src/net/i2p/router/web/GraphHelper.java b/apps/routerconsole/java/src/net/i2p/router/web/GraphHelper.java index 037ca17af..e9749750c 100644 --- a/apps/routerconsole/java/src/net/i2p/router/web/GraphHelper.java +++ b/apps/routerconsole/java/src/net/i2p/router/web/GraphHelper.java @@ -115,7 +115,7 @@ public class GraphHelper extends HelperBase { + "\" /> pixels, height:
\n"); _out.write("Refresh delay:
\n"); - _out.write("
"); + _out.write("
"); } catch (IOException ioe) { ioe.printStackTrace(); } diff --git a/apps/routerconsole/jsp/summarynoframe.jsp b/apps/routerconsole/jsp/summarynoframe.jsp index 655741b83..6333a14cf 100644 --- a/apps/routerconsole/jsp/summarynoframe.jsp +++ b/apps/routerconsole/jsp/summarynoframe.jsp @@ -26,9 +26,9 @@ <% } else { %> I2P Services
-Susimail -SusiDNS -Torrents +Addressbook +Torrents +Webmail Webserver
I2P Internals
I2PTunnel diff --git a/installer/resources/themes/console/classic/console.css b/installer/resources/themes/console/classic/console.css index 7b79f2860..3231ef874 100644 --- a/installer/resources/themes/console/classic/console.css +++ b/installer/resources/themes/console/classic/console.css @@ -132,6 +132,10 @@ div.routersummary a:hover { color: #f60; } +div.routersummary input[type=text] { + text-align: right !important; +} + div.warning { margin: 20px 20px 10px 260px; padding: 0px 20px 20px 75px; @@ -176,6 +180,7 @@ div.main { div.main li { padding-bottom: 10px; + list-style: square; } div.main li:first-child { @@ -223,6 +228,11 @@ div.news a:link { text-shadow: 0px 0px 1px rgba(128, 128, 48, 0.3); } +div.news a:visited { + color: #f00 !important; + text-shadow: 0px 0px 1px rgba(128, 128, 48, 0.3); +} + div.news hr { color: #cc7; background: #cc7; @@ -331,11 +341,20 @@ table { } table hr { - padding: 1px 0; + padding: 0px 0; + color: #bbf; + background: #bbf; + border: 0px solid #bbf; + margin: 0px -5px; + height: 1px; +} + +table tt { + font-size: 7.5pt; } th { - background-color: #def; + background-color: #fff; padding: 8px 2px; text-align: center; border-bottom: 1px solid #88f; @@ -345,6 +364,10 @@ tt { font-size: 8pt; } +tt, pre { + font: 8pt "Lucida Console", "DejaVu Sans Mono", Courier, mono; +} + td { padding: 4px; } diff --git a/installer/resources/themes/console/classic/ieshim.css b/installer/resources/themes/console/classic/ieshim.css index 3e897a7af..9fff032b1 100644 --- a/installer/resources/themes/console/classic/ieshim.css +++ b/installer/resources/themes/console/classic/ieshim.css @@ -36,8 +36,10 @@ div.configure table { } h1 { - padding: 15px 10px 16px 10px !important; + padding: 15px 10px 16px -10px !important; margin: 0 0px 0 175px !important; + background-color: #bbf !important; + color: #001; } h2 { @@ -97,6 +99,11 @@ div.routersummary { border-left: 5px solid #bbf; } +div.routersummary submit { + padding: 0; + margin-bottom: 5px; +} + div.news li { padding-top: 0px 0px !important; margin-bottom: -23px !important; @@ -131,4 +138,15 @@ div.configure hr{ input { padding: 0; +} + +div.graphspanel img { + border: 1px solid #99f; + margin: 6px 0 !important; + background: #ddf; + -moz-box-shadow: inset 0px 0px 1px 1px #99f; +} + +div.graphspanel hr { + margin: 20px 0; } \ No newline at end of file diff --git a/installer/resources/themes/console/dark/console.css b/installer/resources/themes/console/dark/console.css index 8e0d75d60..5c561e94a 100644 --- a/installer/resources/themes/console/dark/console.css +++ b/installer/resources/themes/console/dark/console.css @@ -89,7 +89,7 @@ div.routersummary { width: 175px; padding: 10px; text-align: center; - border: 1px solid #9999ff; + border: 1px solid #99f; background: #003; background: url(images/darkbluebg.png); color: #eef; @@ -102,6 +102,28 @@ div.routersummary { -moz-box-shadow: inset 0px 0px 1px 0px #eef; } +div.routersummary input[type=text] { + text-align: right !important; + -moz-box-shadow: inset 1px 1px 1px 0px #000; +} + +div.routersummary hr { + color: #99f; + background: #99f; + height: 1px; + border-bottom: 1px outset #bbf; + margin: 5px -10px 4px -10px; +} + +div.routersummary hr { + color: #bbf; + background: #bbf; + height: 2px; + border-bottom: 1px outset #bbf; + margin: 8px -10px 7px -10px; + -moz-box-shadow: inset 0px -4px 2px 1px #001; +} + div.warning { margin: 5px 20px 10px 240px; padding: 0px 25px 20px 75px; @@ -254,6 +276,16 @@ table { background: #003; } +table hr { + padding: 0px 0; + color: #99f; + background: #99f; + border: 0px solid #99f; + margin: 0px 0px; + height: 1px; + display: none; +} + th { padding: 6px 2px; color: #eef; @@ -392,7 +424,7 @@ h2 { color: #fff; text-shadow: 0px 0px 1px rgba(255, 255, 255, 0.5); letter-spacing: 0.05em; - background: #003 url('images/darkbluebg.png'); + background: #003 url('images/titletile.png'); padding: 5px 10px 8px 10px; wordwrap: none; border: 1px solid #99f; @@ -435,9 +467,9 @@ h4 { font-size: 11pt; } -button { +button, button:visited { font: bold 9pt "Lucida Sans Unicode", "Bitstream Vera Sans", Verdana, Tahoma, Helvetica, sans-serif; - border: 1px outset #ddddc0; + border: 1px outset #77f; padding: 1px 3px; background: #bbf; text-decoration: none; @@ -450,12 +482,23 @@ button { text-align: center; vertical-align: middle; min-width: 76px; + -moz-box-shadow: inset 0px 1px 1px 0px #55f; + background: #003; + color: #99f; } +button:hover { + border: 1px solid #f60; + -moz-box-shadow: inset 0px 1px 1px 0px #eef; + background: #001; + color: #f60; +} + button:active { border: 1px inset #f60; background: #f60; color: #fff; + -moz-box-shadow: inset 0px 0px 0px 0px #f60; } .underline { @@ -488,9 +531,10 @@ sidebarlogo { } input { - border: 1px outset #bbf; - background: #bbf; - color: #002; + border: 1px outset #55f; + -moz-box-shadow: inset 0px 1px 1px 0px #55f; + background: #003; + color: #99f; margin: 5px; font: bold 8pt "Lucida Sans Unicode", "Bitstream Vera Sans", Verdana, Tahoma, Helvetica, sans-serif; padding: 1px 2px; @@ -502,9 +546,10 @@ input { } input:hover { - background: #003; + background: #001; color: #f60; border: 1px solid #f60; + -moz-box-shadow: inset 0px 1px 1px 0px #eef; } input:active { @@ -530,6 +575,7 @@ input[type=text] { border-radius: 4px; -moz-border-radius: 4px; -khtml-border-radius: 4px; + -moz-box-shadow: inset 1px 1px 1px 0px #000; } input[type=text]:active, input[type=text]:hover { diff --git a/installer/resources/themes/console/dark/images/titletile.png b/installer/resources/themes/console/dark/images/titletile.png new file mode 100644 index 0000000000000000000000000000000000000000..945acc5b981b768b8a64a6a9f7a8c969c17733ba GIT binary patch literal 2181 zcmdsyX*3&%7ROUf2^q^MrnWK^rxf+3r3s-?v2=+ocwQ`3I&>(dQcI)`Mvdwd+ObP4 zK@dr*_ASOUAzD*WB6j1{5{acqsHAx2%$NE2zP$J0-E;rv{(tx0bMCpBZb&D2ISn}g z03h$;?BH=yfB8coDFEP9eaE|j6Oeu6?E4r1Q0V_drv{^HLjVAfm5T!$6<@khJQJzu zrSgnB`O0%<+-2-T>9pa4tQ@6`f>RgbrP>!$!L;l4v$_|`Q^96Rc+jBx&^71$z3&RYjSn>z)+X zt^P;C@f7K}+7WJ15GjElwUSSD%SK|tK5<76zpour|Bx@TX7>g3Nl#z){Q0>a!d|i-(e4v2S9b` zht8TLW3Ic4EH^mt(Q2n@f8ASwE|HXsyoSV7;kjczR$J!Ds(d04w)brM=ivP?_UPBL zi6r>OVSqXc=q#Z;I!36QTj0r)S#zIHONfaC<=EHU!Oi8!oIzmb3qu{3&~-wh|Gm0i zUDl)~=DRS5u8>VQ^(*7qto}+>Y4votV^EI!xe%5AiiL--U~|vp%1ntXS-9Nrjy-`M zMbGMs@Uj+R%*mg{){mQLrt=#*ge(Hq7JDu`WEeTl^+YanxE{y@UQiQ+f`^q=gt|<< z?%GnxfbXW*9$&)s0FX@C9d5s4uy@(9-!md(LhUi1YZG|C0;niD2wh_aoxJW6XIWyc zm=&FOfOKoZtfdXhLRZ}PB!;WFxm}!N{5S!d_iGf730XT7ed0ZWVK%xubjtJ@MVuzmClyQA-(DyW5@HK%uZ2h#v z>7KKm;;rrZBkGuh7lci&D45%YErjDBYsr}n@jSRv5^W^e6pe@d<9!Rg)`^(txulO< zxuq_C6L8<8xTaftN5l$@;tlnbQWv-jnWde1f%qr9R_Jn_m9WT;HR0oNewl;Asu+b` zMEBB>)H=@ukr#$fgf5fzi_0;}KO4XyiOt39R6FVWv8#n+kbpoVo1IZjajp7Rn)fT~ z>FO`yxut+;rfZZizM#FBV!i)m!Q`c`vO}t~lB^#5!cV~5|2Z5ftK1Ge^js=p<+BoU z^TTm)Q8s@_Ly%S9CZu>7X#4qoLAF5>pLOZYYznLR!IB>+=z9GdmWY~qa@th2ov<#F z9Jc6omUI?4O)FGbiF#U+^YJq~x*C0xL|t@fx&*alwNf-lcenSpI+te>w_>6}(AF68 zyx2avb=D$<)^qqz7Ua;odzmIY;DS)DxFnMv-yG98N(r^d)d8w^oOuOd)-_SVQq4V` zn~ZS$p}`3;uRP@m^ES{v!|M-uH&eHvkzR`0vCZ#day$Xwa z5Gon9K8|)(TV+Qd8b>S(f*9%Tl+fg_=ik2DH~p2*kSp=;B%v8a5gm_V1e*|os8NJA zt|z6LfCDc=YF_%t(}V)L?FXMAYHU)@L%tOm72)M5Q$RaffgDW%pWC?HKaJH*SFxh zpevvh+cDGR%H;UVt4Q*LaU`NX5_*Sph^jKKBmsKpXxkDkC{0+)Z>_=H*2lQrg3%HK zWv^7^PE%fH%Pv_$_3L;q)b4_JInl8LSxw84EizKDw^%UPzC7d1R164ZCZD3K1WdiI z1d_@_-OvRA|3m}MN#o@H3A(vl{d0bTD3Aa1bqrHhXeZaL9=g#y%L1H)3j*mtv%j1A EZ)FP6B>(^b literal 0 HcmV?d00001 diff --git a/installer/resources/themes/console/light/console.css b/installer/resources/themes/console/light/console.css index 20d8c28cf..26f8b40c5 100644 --- a/installer/resources/themes/console/light/console.css +++ b/installer/resources/themes/console/light/console.css @@ -105,6 +105,19 @@ div.routersummary { -moz-box-shadow: inset 0px 0px 1px 0px #002; } +div.routersummary input[type=text] { + text-align: right !important; +} + +div.routersummary hr { + color: #eef; + background: #eef; + height: 2px; + border-bottom: 1px solid #eef; + margin: 8px -10px 7px -10px; + -moz-box-shadow: inset 0px 1px 1px 1px #001; +} + div.warning { margin: 5px 20px 10px 240px; padding: 0px 25px 20px 75px; @@ -226,6 +239,7 @@ div.configure { border-radius: 4px; border: 1px solid #000022; -moz-box-shadow: inset 0px 0px 1px 0px #002; + min-width: 400px; } div.graphspanel { @@ -237,9 +251,9 @@ div.graphspanel { border-radius: 4px; border: 1px solid #000022; -moz-box-shadow: inset 0px 0px 1px 0px #002; + text-align: center !important; } - div.graphspanel img { border: 1px solid #003; padding: 2px; @@ -247,7 +261,7 @@ div.graphspanel img { text-align: center !important; background: #001; -moz-box-shadow: inset 0px 0px 1px 1px #99f; - opacity: 0.9; + opacity: 0.8; } div.graphspanel img:hover { @@ -260,6 +274,10 @@ div.graphspanel img:hover { opacity: 1; } +div.graphspanel form { + text-align: left; +} + div.messages { padding: 10px; margin: 10px 0 20px 0; @@ -301,6 +319,16 @@ table { font: 7pt/130% "Lucida Sans Unicode", Verdana, Bitstream Vera Sans", Tahoma, Helvetica, sans-serif; } +table hr { + padding: 0px 0; + color: #99f; + background: #99f; + border: 0px solid #99f; + margin: 0px 0px; + height: 1px; + display: none; +} + th { padding: 6px 2px; color: #000; @@ -433,7 +461,7 @@ h2 { font-size: 12pt; color: #001; letter-spacing: 0.05em; - background: #ddf url('images/lightbluetile.png'); + background: #ddf url('images/titletile.png'); text-shadow: 0px 0px 1px rgba(0, 0, 64, 0.5); padding: 7px 10px; wordwrap: none; @@ -476,9 +504,9 @@ h4 { button, button:visited { font: bold 9pt "Lucida Sans Unicode", "Bitstream Vera Sans", Verdana, Tahoma, Helvetica, sans-serif; - border: 1px outset #ddddc0; + border: 1px outset #999; padding: 1px 3px; - background: #bbf !important; + background: #ddf !important; text-decoration: none; border-radius: 4px; -moz-border-radius: 4px; @@ -488,18 +516,22 @@ button, button:visited { margin: 0 1px; text-align: center; min-width: 80px; + -moz-box-shadow: inset 0px 2px 8px 0px #fff; + color: #006; } button:hover{ border: 1px solid #f60; background: #f60 !important; color: #fff; + -moz-box-shadow: inset 0px 0px 0px 1px #fff; } button:active{ border: 1px solid #f60; background: #001 !important; color: #f60; + -moz-box-shadow: inset 0px 0px 0px 1px #f60; } .underline { @@ -531,8 +563,8 @@ input { } input, input:visited { - border: 1px outset #bbf; - background: #bbf; + border: 1px outset #999; + background: #ddf; color: #001; margin: 5px; font: bold 8pt "Lucida Sans Unicode", "Bitstream Vera Sans", Verdana, Tahoma, Helvetica, sans-serif; @@ -542,6 +574,9 @@ input, input:visited { border-radius: 4px; -moz-border-radius: 4px; -khtml-border-radius: 4px; + -moz-box-shadow: inset 0px 2px 8px 0px #fff; + color: #006; + opacity: 0.9; } @@ -549,7 +584,9 @@ input:hover { background: #f60; color: #fff; border: 1px solid #f60; - opacity: 0.9; + opacity: 1.0; + -moz-box-shadow: inset 0px 0px 0px 1px #fff; + } input:active { @@ -557,6 +594,7 @@ input:active { color: #f60; border: 1px solid #f60; opacity: 1.0; + -moz-box-shadow: inset 0px 0px 0px 1px #f60; } input[type=text] { @@ -595,6 +633,7 @@ select { border-radius: 4px; -moz-border-radius: 4px; -khtml-border-radius: 4px; + text-align: left !important; } textarea { diff --git a/installer/resources/themes/console/light/images/lightbluetile.png b/installer/resources/themes/console/light/images/lightbluetile.png index e7fc6c1f12ab57637c3c0858a74ad87643a76b28..53f9d54deaaa6cc333aca3c07e71848e26f5d2b0 100644 GIT binary patch literal 3486 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 fN8k0?++?ap?AKg@mOq``P$!{ literal 1410 zcmeAS@N?(olHy`uVBq!ia0vp^2SAvEiGhJ})y~t$fE>;OkH}&M2EM}}%y>M1MG6B0 ztBI$JV@SoEw|8&nO$n7a_VMf1D?w5P)e2W!T03q>fAYvbWW4S)voL>;c>>3~0AT_C zJ0Y`}E*-M?E9Euw+!^D|X}u;Nzss!IliOzc{`;5t|Cc;maQAsU|0$1MALGk{ZB>=wK1TpH3%wH693lc?_Qn1m!`!V{G7V@{)_!~rM!`t>ab`< z7n;)iU;p;sWjS>rS?Bmqzx%rB=Rv0Dzf-@v-K^1{^F41$@#gvOr&Zto_PqS*ovR<8 zAG=yqf9j{-&i}Rb{|bK9B`w$G;tCAtXmSz}S+qcawN*pI#Zi%VLM8F{q-=IYhv`q* z_i30w+n#RwecS0<7k`FFR`0Zr*Q~A&n_E9+>-AIj-h11GYu(T;Iezb z_oH7A{tBzy68vvxY}onfhM(6q@4I&2V#S*bIk7JVA1hbSuYdd8`|-2S$K#4E-cM=Y zuKm38yhY7A_4n3kcK>Fb{Jv*Hs9gB@>A!yZ*~iDc+f%pk{?80KyX*Pq&mB&$ubuaE z^7(bPKVClYznUAP7aKlrX8yO&Q!h>Z^x(K*@ydDn-#?#i-mkFZW0_|2zuMix#g)7K zU%q;N@wwHk)0e-$ViSHQ^v-hkiJFT4`t0vZzpZ_GPCEFRqdkAUSpKwkA8S6pIzB&c zc39zcskz$z7he97|EyBNc03@$%x&@o$vF9NbTmpO09_Z-$;WIM zz}y4mYh6rKV9RO{1oBm_fDYv~NK#;1<xsF@2mk*YJ*dqLWf4+foWC&kZC*}}`cm<-?K@2^r=;8Y z%r~2U^2d)GH@()@{@7ONt}JIAkh`8wcJt%yTIH)>eK_vJ2SdvZMmy93x!V4s) z+b%zy)3BRAa`*Q2i><$%&7I4*OwNcW=CJ9j>o<-rf6X}kZuc>-<#T7nguj=we!oGz zI)8tr?~DDZ{9TRR%2QXksA>gzt_Z41uH7MQw{5AdT>U%et9jPH*2ymF`l^%qY4sPL z)U=h8cE2pRcEWw*&Sxg68qSiZ0@{qGEaU+)XVxW7k6(BC`GFr_D*INvs$C`Oee~ka z+84<`I~Vsviyk_e{$lp@-Wm2U&KX=zo0GqDuHWXTDep|wpG$1F-rpfnyuNU;;lrHy z@2_WnX8D`JP6Rq${Q9_E&Hkc?XMX;=n6t0%(a%qxkNtemRL^#^UEMQ@Kui=LyQ|K#`mo9geQ3O^j$dFJ=T%9nC=&o9nh(qp92 zY^1Td#!YgHBO02y)EZp~q@vL;fGrgb{VPm;^LKe~=(#Y(ce?L#RDOqYBv+)r4EtX3 zw8nHs@;~hPW4~hw$iw{Y(-M%(`07-4Ek>(en_B_pyJeW#6MJp8Gw` zd;i)0KDPdJ`mIOJJ1cMRGd;wAWBy*Qb1^rK?-;$|vi`vrowk38R$zjNiRJnnx%(bQ z`!1%|EI$3iZTiPvy~onA$IN&2@b(FRuUq literal 0 HcmV?d00001 diff --git a/installer/resources/themes/console/snark.css b/installer/resources/themes/console/snark.css index 4b6fbb2c3..a5551156f 100644 --- a/installer/resources/themes/console/snark.css +++ b/installer/resources/themes/console/snark.css @@ -56,8 +56,8 @@ body { font-size: 9pt; font-weight: bold; text-align: left; - margin: 0 0 15px 0; - padding: 0px; + margin: 0 0px 10px 0px; + padding: 0; border-spacing: 0px; -moz-border-radius: 4px 0 0 0; -khtml-border-radius: 4px; @@ -68,7 +68,7 @@ body { background: #f40 url('../console/images/orangetile.png'); color: #531; height: 64px; - width: 100%; + width: auto; } pre { @@ -95,7 +95,7 @@ th { border-top: 1px outset #001; border-bottom: 1px inset #001; background: #f60 url('/themes/console/images/tabletitleorange.png') repeat-x; - text-align: left; + text-align: right; whitespace: nowrap; } @@ -107,7 +107,7 @@ th { td { padding: 5px; - text-align: left; + text-align: right; } .snarkTorrentEven { background-color: #fb1; @@ -176,7 +176,7 @@ hr { } a:link{ - color: #830; + color: #930; text-decoration: none; font-weight: bold; word-wrap: break-word; @@ -189,7 +189,7 @@ a:visited{ } a:hover{ - color: #f40; + color: #900; font-weight: bold; }