From 1d1417952279a484a1e7b01eba2df0189f93e3a6 Mon Sep 17 00:00:00 2001 From: Massimiliano Assante Date: Fri, 20 Sep 2013 10:04:05 +0000 Subject: [PATCH] pinned bar restyled git-svn-id: http://svn.research-infrastructures.eu/public/d4science/gcube/trunk/portlets/admin/resource-management@81792 82a268e6-3cf1-43bd-a215-b396298e98cf --- .classpath | 11 - pom.xml | 31 +- .../client/ResourceManagementPortlet.java | 69 ++--- .../client/widgets/taskbar/TaskbarButton.java | 270 ++++++++++-------- .../client/widgets/taskbar/TaskbarItem.java | 3 +- .../ResourceManagementPortlet.gwt.xml | 4 +- src/main/webapp/ResourceManagementPortlet.css | 24 +- .../jsp/ResourceManagementPortlet_view.jsp | 2 + src/main/webapp/WEB-INF/web.xml | 16 +- src/main/webapp/d4scienceOrg.css | 55 ++-- src/main/webapp/images/bg_custom.png | Bin 2848 -> 0 bytes src/main/webapp/images/pattern.gif | Bin 1243 -> 0 bytes 12 files changed, 271 insertions(+), 214 deletions(-) delete mode 100644 src/main/webapp/images/bg_custom.png delete mode 100644 src/main/webapp/images/pattern.gif diff --git a/.classpath b/.classpath index 3fc34b0..d0c2c7b 100644 --- a/.classpath +++ b/.classpath @@ -34,17 +34,6 @@ - - - - - - - - - - - diff --git a/pom.xml b/pom.xml index 00d4291..b565af2 100644 --- a/pom.xml +++ b/pom.xml @@ -50,23 +50,28 @@ ${gwtVersion} provided - - xalan - xalan - 2.7.1 - com.google.gwt gwt-servlet ${gwtVersion} provided + + xalan + xalan + 2.7.1 + com.sencha.gxt gxt 2.2.5 provided + + com.googlecode.gwtquery + gwtquery + 1.3.3 + org.gcube.portlets.admin rmp-common-library @@ -120,20 +125,20 @@ ishealth-monitor-widget [1.0.0-SNAPSHOT, 2.0.0-SNAPSHOT) - - - - - + + org.gcube.portlets.admin + resource-sweeper-widget + [2.0.0-SNAPSHOT, 3.0.0-SNAPSHOT) + - org.gcube.portlets.admin - activation-record-widgets - [1.2.0-SNAPSHOT, 2.0.0-SNAPSHOT) + org.gcube.portlets.admin + activation-record-widgets + [1.2.0-SNAPSHOT, 2.0.0-SNAPSHOT) diff --git a/src/main/java/org/gcube/portlets/admin/resourcemanagement/client/ResourceManagementPortlet.java b/src/main/java/org/gcube/portlets/admin/resourcemanagement/client/ResourceManagementPortlet.java index a80afbd..a2e65da 100644 --- a/src/main/java/org/gcube/portlets/admin/resourcemanagement/client/ResourceManagementPortlet.java +++ b/src/main/java/org/gcube/portlets/admin/resourcemanagement/client/ResourceManagementPortlet.java @@ -33,11 +33,12 @@ import org.gcube.portlets.admin.resourcemanagement.client.widgets.panels.MainPan import org.gcube.portlets.admin.resourcemanagement.client.widgets.registry.UIIdentifiers; import org.gcube.portlets.admin.resourcemanagement.client.widgets.registry.WidgetsRegistry; import org.gcube.portlets.admin.resourcemanagement.client.widgets.viewport.MainContainer; -//import org.gcube.portlets.admin.resourcesweeper.client.dialog.SweeperDialog; +import org.gcube.portlets.admin.resourcesweeper.client.dialog.SweeperDialog; import org.gcube.resourcemanagement.support.client.Resource_support; import org.gcube.resourcemanagement.support.client.events.SetScopeEvent; import org.gcube.resourcemanagement.support.client.events.SetScopeEventHandler; import org.gcube.resourcemanagement.support.client.utils.CurrentStatus; +import org.gcube.resourcemanagement.support.client.utils.LocalStatus; import org.gcube.resourcemanagement.support.client.utils.StatusHandler; import org.gcube.resourcemanagement.support.shared.exceptions.InvalidParameterException; import org.gcube.resourcemanagement.support.shared.operations.SupportedOperations; @@ -87,9 +88,8 @@ import com.google.gwt.user.client.ui.RootPanel; public class ResourceManagementPortlet implements EntryPoint { public static final String CONTAINER_DIV = "MyUniqueDIV"; - - private final HandlerManager eventBus = new HandlerManager(null); + private final HandlerManager eventBus = new HandlerManager(null); private void printStatus(final CurrentStatus status) { ConsoleMessageBroker.trace(this, "User: " + status.getCurrentUser()); @@ -103,7 +103,7 @@ public class ResourceManagementPortlet implements EntryPoint { private void bind() { //set the eventbus to the support common classes new Resource_support(eventBus); - + eventBus.addHandler(SetScopeEvent.TYPE, new SetScopeEventHandler() { @Override public void onSetScope(SetScopeEvent event) { @@ -117,7 +117,7 @@ public class ResourceManagementPortlet implements EntryPoint { public final void onModuleLoad() { //for event handling bind(); - + MainContainer vp = buildUI(); RootPanel.get(CONTAINER_DIV).add(vp); Commands.mask("Waiting servlet initialization", UIIdentifiers.MAIN_CONTAINER_VIEWPORT_ID); @@ -438,15 +438,19 @@ public class ResourceManagementPortlet implements EntryPoint { MenuItem testIS = new MenuItem("Check IS Health") { protected void onClick(final ComponentEvent be) { super.onClick(be); - GWT.runAsync(ISMonitor.class, new RunAsyncCallback() { - @Override - public void onSuccess() { - ISMonitor.pingIS(); - } - public void onFailure(Throwable reason) { - Window.alert("There are networks problem, please check your connection."); - } - }); + if (LocalStatus.getInstance().getAvailableScopes() == null || LocalStatus.getInstance().getAvailableScopes().isEmpty()) { + MessageBox.info("Sorry", "This functionality is not available in logged-in mode.", null); + } else { + GWT.runAsync(ISMonitor.class, new RunAsyncCallback() { + @Override + public void onSuccess() { + ISMonitor.pingIS(); + } + public void onFailure(Throwable reason) { + Window.alert("There are networks problem, please check your connection."); + } + }); + } }; }; testIS.setIconStyle("is-icon"); @@ -458,22 +462,22 @@ public class ResourceManagementPortlet implements EntryPoint { MenuItem cleanGHN = new MenuItem("Resource Sweeper") { protected void onClick(final ComponentEvent be) { -// super.onClick(be); -// if (SupportedOperations.SWEEP_GHN.isAllowed(StatusHandler.getStatus().getCredentials())) { -// GWT.runAsync(SweeperDialog.class, new RunAsyncCallback() { -// @Override -// public void onSuccess() { -// String currentScope = StatusHandler.getStatus().getCurrentScope(); -// new SweeperDialog(currentScope); -// } -// -// public void onFailure(Throwable reason) { -// Window.alert("There are networks problem, please check your connection."); -// } -// }); -// } -// else -// MessageBox.alert("Resource Sweeper", "You are not allowed to execute this operation", null); + super.onClick(be); + if (SupportedOperations.SWEEP_GHN.isAllowed(StatusHandler.getStatus().getCredentials())) { + GWT.runAsync(SweeperDialog.class, new RunAsyncCallback() { + @Override + public void onSuccess() { + String currentScope = StatusHandler.getStatus().getCurrentScope(); + new SweeperDialog(currentScope); + } + + public void onFailure(Throwable reason) { + Window.alert("There are networks problem, please check your connection."); + } + }); + } + else + MessageBox.alert("Resource Sweeper", "You are not allowed to execute this operation", null); }; }; @@ -621,8 +625,9 @@ public class ResourceManagementPortlet implements EntryPoint { "implied warranty is given for its use, quality or fitness for a " + "particular case.

" + "" + - "

Bugs can be submitted here.

" + - "

Notice: specify this Component:
portlets/admin/ResourceManagementPortlet

" + + "

Issues can be submitted here.

" + + "

Notice: specify this Component:
Repository Path: /org/gcube/portlets/admin/resource-management

" + + "
This software was built over the gCube Featherweight Stack (FWS) and Google Webtool Kit (GWT) technologies.
" + "
"); dlg.setClosable(true); diff --git a/src/main/java/org/gcube/portlets/admin/resourcemanagement/client/widgets/taskbar/TaskbarButton.java b/src/main/java/org/gcube/portlets/admin/resourcemanagement/client/widgets/taskbar/TaskbarButton.java index 5dcbc78..d8b6c1c 100644 --- a/src/main/java/org/gcube/portlets/admin/resourcemanagement/client/widgets/taskbar/TaskbarButton.java +++ b/src/main/java/org/gcube/portlets/admin/resourcemanagement/client/widgets/taskbar/TaskbarButton.java @@ -15,6 +15,9 @@ ***************************************************************************/ package org.gcube.portlets.admin.resourcemanagement.client.widgets.taskbar; +import static com.google.gwt.query.client.GQuery.$; + +import java.util.ArrayList; import org.gcube.portlets.admin.resourcemanagement.client.utils.FWSTranslate; @@ -28,6 +31,8 @@ import com.extjs.gxt.ui.client.widget.IconSupport; import com.google.gwt.user.client.DOM; import com.google.gwt.user.client.Element; import com.google.gwt.user.client.Event; +import com.google.gwt.user.client.Random; +import com.google.gwt.user.client.Timer; import com.google.gwt.user.client.ui.AbstractImagePrototype; /** @@ -36,144 +41,163 @@ import com.google.gwt.user.client.ui.AbstractImagePrototype; * A selectable icon (post-it styled) and text added to the pinned resources (TaskbarWindow). */ public class TaskbarButton extends Component implements IconSupport { - private String type; - private String text; - private AbstractImagePrototype icon; - private El iconEl; + private String type; + private String text; + private AbstractImagePrototype icon; + private El iconEl; - /** - * Creates a new shortcut. - */ - public TaskbarButton() { + private ArrayList extractedColors = new ArrayList(); - } + /** + * Creates a new shortcut. + */ + public TaskbarButton() { - /** - * Creates a new shortcut. - * - * @param id the shortcut id - * @param text the shortcut text - */ - public TaskbarButton(final String id, final String type, final String text) { - setId(id); - setText(text); - this.type = type; - } + } - /** - * Adds a selection listener. - * - * @param listener the listener to add - */ - public final void addSelectionListener(final SelectionListener listener) { - addListener(Events.Select, listener); - } + /** + * Creates a new shortcut. + * + * @param id the shortcut id + * @param text the shortcut text + */ + public TaskbarButton(final String id, final String type, final String text) { + setId(id); + setText(text); + this.type = type; + //need to make sure the element is attached to the DOM + Timer t = new Timer() { + @Override + public void run() { + $(getElement().getFirstChildElement()).animate("opacity:'0.9'", 500); + } + }; + t.schedule(100); + } - public final AbstractImagePrototype getIcon() { - return icon; - } + /** + * Adds a selection listener. + * + * @param listener the listener to add + */ + public final void addSelectionListener(final SelectionListener listener) { + addListener(Events.Select, listener); + } - /** - * Returns the shortcuts text. - * - * @return the text - */ - public final String getText() { - return text; - } + public final AbstractImagePrototype getIcon() { + return icon; + } - @Override - public final void onComponentEvent(final ComponentEvent ce) { - super.onComponentEvent(ce); - if (ce.getEventTypeInt() == Event.ONCLICK) { - onClick(ce); - } - } + /** + * Returns the shortcuts text. + * + * @return the text + */ + public final String getText() { + return text; + } - /** - * Removes a previously added listener. - * - * @param listener the listener to be removed - */ - public final void removeSelectionListener(final SelectionListener listener) { - removeListener(Events.Select, listener); - } + @Override + public final void onComponentEvent(final ComponentEvent ce) { + super.onComponentEvent(ce); + if (ce.getEventTypeInt() == Event.ONCLICK) { + onClick(ce); + } + } - public final void setIcon(final AbstractImagePrototype icon) { - if (rendered) { - iconEl.setInnerHtml(""); - iconEl.appendChild((Element) icon.createElement().cast()); - } - this.icon = icon; + /** + * Removes a previously added listener. + * + * @param listener the listener to be removed + */ + public final void removeSelectionListener(final SelectionListener listener) { + removeListener(Events.Select, listener); + } - } + public final void setIcon(final AbstractImagePrototype icon) { + if (rendered) { + iconEl.setInnerHtml(""); + iconEl.appendChild((Element) icon.createElement().cast()); + } + this.icon = icon; - public final void setIconStyle(final String icon) { - setIcon(IconHelper.create(icon, 48, 48)); + } - } + public final void setIconStyle(final String icon) { + setIcon(IconHelper.create(icon, 48, 48)); - /** - * Sets the shortcuts text. - * - * @param text the text - */ - public final void setText(final String text) { - this.text = text; - } + } - protected void onClick(final ComponentEvent ce) { - ce.stopEvent(); - fireEvent(Events.Select, ce); - } + /** + * Sets the shortcuts text. + * + * @param text the text + */ + public final void setText(final String text) { + this.text = text; + } - @Override - protected final void onRender(final Element target, final int index) { - super.onRender(target, index); - int splitTextTo = 16; - String style = "background:#ffc; display:block; margin-left: 15px; margin-top: 10px; " + - "padding:3px; width: 120px; height: 120px;font-family:'Reenie Beanie',arial,sans-serif; font-size:19px;line-height:1;" + - "-moz-box-shadow:5px 5px 7px rgba(33,33,33,1);"+ - "-webkit-box-shadow: 5px 5px 7px rgba(33,33,33,.7);"+ - "box-shadow: 5px 5px 7px rgba(33,33,33,.7); " + - ""; - - //add the (fake) randomly tilted effect - int rd = index + 1; - if (rd % 2 == 0) { //even - style += "-o-transform:rotate(5deg); -webkit-transform:rotate(5deg); -moz-transform:rotate(5deg); position:relative;"; - } else if (rd % 3 == 0) { // 3 times - style += "-o-transform:rotate(-3deg); -webkit-transform:rotate(-3deg); -moz-transform:rotate(-3deg); position:relative; top: -5px; "; - } else { //antyhing else - style += "-o-transform:rotate(2deg); -webkit-transform:rotate(2deg); -moz-transform:rotate(2deg); position:relative;"; - } - - - String fontStyle = "font-family:'Reenie Beanie',arial,sans-serif; font-size:20px; padding: 5px; overflow-x: hidden; overflow-y: hidden;"; - setElement(DOM.createElement("dt"), target, index); - El a = el().createChild("
"); - iconEl = a.createChild("

"+FWSTranslate.getFWSNameFromLabel(type)+"

"); - El txt = a.createChild("
"); - String toShow = ""; - if (text.length() / splitTextTo > 0) { - int iterateTo = ((text.length() / splitTextTo) < 4) ? (text.length() / splitTextTo) : 3; - for (int i = 0; i < iterateTo; i++) - toShow += text.substring(i*splitTextTo, (i+1)*splitTextTo) + " "; - - if (iterateTo < 4) - toShow += text.substring((text.length() / splitTextTo)*splitTextTo,text.length()); - } - else - toShow = text; + protected void onClick(final ComponentEvent ce) { + ce.stopEvent(); + fireEvent(Events.Select, ce); + } - if (txt != null) { - txt.setInnerHtml(toShow); - } - el().updateZIndex(0); - sinkEvents(Event.ONCLICK); - if (icon != null) { - setIcon(icon); - } - } + @Override + protected final void onRender(final Element target, final int index) { + super.onRender(target, index); + + + String fontStyle = "font-size:12px; font-weight: 300; margin-top: 5px; padding: 5px; word-wrap: break-word;"; + setElement(DOM.createElement("dt"), target, index); + + + + + final El a = el().createChild("
"); + iconEl = a.createChild(FWSTranslate.getFWSNameFromLabel(type)); + El txt = a.createChild("
"); + + if (txt != null) { + txt.setInnerHtml(text); + } + + el().updateZIndex(0); + sinkEvents(Event.ONCLICK); + if (icon != null) { + setIcon(icon); + } + } + + private String getExaBackgroundColor() { + //pick a random color + int no = Random.nextInt(7); + while (extractedColors.contains(no)) { + no = Random.nextInt(7); + } + extractedColors.add(no); + if (extractedColors.size() > 6) + extractedColors = new ArrayList(); + + switch (no) { + case 0: + return "#bebee4"; + case 1: + return "#CAEBFA"; + case 2: + return "#a8f2b5"; + case 3: + return "#fe99ad"; + case 4: + return "#ffd395"; + case 5: + return "#ffea97"; + case 6: + return "#d4d4d4"; + default: + return "#a8f2b5"; + } + + + } } diff --git a/src/main/java/org/gcube/portlets/admin/resourcemanagement/client/widgets/taskbar/TaskbarItem.java b/src/main/java/org/gcube/portlets/admin/resourcemanagement/client/widgets/taskbar/TaskbarItem.java index b4b6f2e..bee1a5d 100644 --- a/src/main/java/org/gcube/portlets/admin/resourcemanagement/client/widgets/taskbar/TaskbarItem.java +++ b/src/main/java/org/gcube/portlets/admin/resourcemanagement/client/widgets/taskbar/TaskbarItem.java @@ -16,6 +16,8 @@ package org.gcube.portlets.admin.resourcemanagement.client.widgets.taskbar; +import static com.google.gwt.query.client.GQuery.$; + import org.gcube.portlets.admin.resourcemanagement.client.remote.ProxyRegistry; import org.gcube.portlets.admin.resourcemanagement.client.utils.Callbacks; import org.gcube.portlets.admin.resourcemanagement.client.utils.Commands; @@ -69,7 +71,6 @@ public class TaskbarItem { relatedWidget.doMinimize(); } }; - GWT.log("TITLE: " + title); this.detachButton.setStyleName("taskbar-button"); this.detachButton.setIconStyle(buttonIcon); diff --git a/src/main/resources/org/gcube/portlets/admin/resourcemanagement/ResourceManagementPortlet.gwt.xml b/src/main/resources/org/gcube/portlets/admin/resourcemanagement/ResourceManagementPortlet.gwt.xml index c35fc10..d98b914 100644 --- a/src/main/resources/org/gcube/portlets/admin/resourcemanagement/ResourceManagementPortlet.gwt.xml +++ b/src/main/resources/org/gcube/portlets/admin/resourcemanagement/ResourceManagementPortlet.gwt.xml @@ -6,11 +6,11 @@ - + - + diff --git a/src/main/webapp/ResourceManagementPortlet.css b/src/main/webapp/ResourceManagementPortlet.css index f5e800b..e09fe96 100644 --- a/src/main/webapp/ResourceManagementPortlet.css +++ b/src/main/webapp/ResourceManagementPortlet.css @@ -4,9 +4,25 @@ /* Fix the scrollbar background style*/ .x-progress-text div { - background-color: transparent !important; - font-size: 11px; - font-weight: bold; + background-color: transparent !important; + font-size: 11px; + font-weight: bold; +} + +.iosItem { + color: #4c68a6; + font-family: "HelveticaNeue-Light", "Helvetica Neue Light", + "Helvetica Neue", Helvetica, Arial, "Lucida Grande", sans-serif; + font-weight: 300; + font-size: 15px; + display: block; + margin-left: 10px; + margin-top: 10px; + padding: 5px; + width: 120px; + border-radius: 10px; + -moz-border-radius: 10px; + -webkit-border-radius: 10px; } .wizardTextBox { @@ -52,7 +68,7 @@ .taskbar-pattern { background-image: url(images/pattern.gif); background-repeat: repeat; - border: 2px solid #A9BFD3; + border: 2px solid #A9BFD3; border-radius: 5px; -moz-border-radius: 5px; -webkit-border-radius: 5px; diff --git a/src/main/webapp/WEB-INF/jsp/ResourceManagementPortlet_view.jsp b/src/main/webapp/WEB-INF/jsp/ResourceManagementPortlet_view.jsp index 41237d1..b523cba 100644 --- a/src/main/webapp/WEB-INF/jsp/ResourceManagementPortlet_view.jsp +++ b/src/main/webapp/WEB-INF/jsp/ResourceManagementPortlet_view.jsp @@ -13,6 +13,8 @@ + +
diff --git a/src/main/webapp/WEB-INF/web.xml b/src/main/webapp/WEB-INF/web.xml index 73a65ac..c8273ef 100644 --- a/src/main/webapp/WEB-INF/web.xml +++ b/src/main/webapp/WEB-INF/web.xml @@ -16,15 +16,15 @@ - - - - + + sweeperServlet + org.gcube.portlets.admin.resourcesweeper.server.SweeperServiceImpl + - - - - + + sweeperServlet + /resourcemanagementportlet/sweeper + diff --git a/src/main/webapp/d4scienceOrg.css b/src/main/webapp/d4scienceOrg.css index 6844da1..9db23d3 100644 --- a/src/main/webapp/d4scienceOrg.css +++ b/src/main/webapp/d4scienceOrg.css @@ -5,8 +5,13 @@ width: 92% !important; } +#bottombar { + width: 100% !important; +} + .x-menubar { - background: #FFF url(images/bg-pattern.png) repeat; + background-image: none; + background-color: #FFF; } .x-panel-body-noheader { @@ -22,41 +27,45 @@ .x-toolbar { border-color: transparent; - background: #FFF url(images/bg-pattern.png) repeat; + background-image: none; + background-color: #FFF; } .x-panel-header { - background: #FFF url(images/bg-pattern.png) repeat; + background-image: none; + background-color: #FFF; } .x-toolbar .xtb-sep { - background-image: none !important; - background-color: transparent; + background-image: none !important; + background-color: transparent; } .x-accordion-hd { background-position: 0 0px; } -.x-status-text { - color: #226599; - font-weight: bold !important; +.x-status-text,.x-tree3-node-text,.x-status .x-status-text,.x-toolbar label,.x-component,.x-btn button + { + color: #4c68a6; + font-family: "HelveticaNeue-Light", "Helvetica Neue Light", + "Helvetica Neue", Helvetica, Arial, "Lucida Grande", sans-serif; + font-weight: 300; + font-size: 12px !important; } -.x-status-text-panel { +.x-grid-group-hd .x-grid-group-div { + color: #4c68a6; + font-family: "HelveticaNeue-Light", "Helvetica Neue Light", + "Helvetica Neue", Helvetica, Arial, "Lucida Grande", sans-serif; + font-weight: 500; + font-size: 12px !important; +} + +.x-status-text-panel { border-color: transparent; } -.x-component { - color: #226599; -} - -.x-btn button { - color: #226599; - font-weight: bold !important; - -} - .x-panel-mc { padding-top: 5px; background: #FFF url(images/bg-pattern.png) repeat; @@ -72,9 +81,15 @@ border-radius: 5px; border-width: 2px; background-color: #FFF; + background-image: none; } .ext-el-mask-msg div { + color: #4c68a6; + font-family: "HelveticaNeue-Light", "Helvetica Neue Light", + "Helvetica Neue", Helvetica, Arial, "Lucida Grande", sans-serif; + font-weight: 300; + font-size: 12px !important; border-color: transparent; background-color: transparent; } @@ -82,4 +97,4 @@ .loading-indicator { background-position: 5px 50%; background-image: url("images/loader.gif"); - } +} \ No newline at end of file diff --git a/src/main/webapp/images/bg_custom.png b/src/main/webapp/images/bg_custom.png deleted file mode 100644 index ec909f315d227a520bd12e102f6dd3c095d81373..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2848 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 Wd}HOKn-N`^RbH!hc7-r7SOWmwN7Zov