diff --git a/.classpath b/.classpath new file mode 100644 index 0000000..a5791c6 --- /dev/null +++ b/.classpath @@ -0,0 +1,35 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/.project b/.project new file mode 100644 index 0000000..004b9d5 --- /dev/null +++ b/.project @@ -0,0 +1,59 @@ + + + resource-management + resource-management project + + + + + org.eclipse.wst.jsdt.core.javascriptValidator + + + + + org.eclipse.wst.common.project.facet.core.builder + + + + + org.eclipse.jdt.core.javabuilder + + + + + org.eclipse.wst.validation.validationbuilder + + + + + org.maven.ide.eclipse.maven2Builder + + + + + com.google.gdt.eclipse.core.webAppProjectValidator + + + + + com.google.gwt.eclipse.core.gwtProjectValidator + + + + + org.eclipse.m2e.core.maven2Builder + + + + + + org.eclipse.m2e.core.maven2Nature + org.eclipse.jem.workbench.JavaEMFNature + org.eclipse.wst.common.modulecore.ModuleCoreNature + org.maven.ide.eclipse.maven2Nature + org.eclipse.jdt.core.javanature + org.eclipse.wst.common.project.facet.core.nature + org.eclipse.wst.jsdt.core.jsNature + com.google.gwt.eclipse.core.gwtNature + + diff --git a/.settings/.jsdtscope b/.settings/.jsdtscope new file mode 100644 index 0000000..ba3c245 --- /dev/null +++ b/.settings/.jsdtscope @@ -0,0 +1,15 @@ + + + + + + + + + + + + diff --git a/.settings/com.google.appengine.eclipse.core.prefs b/.settings/com.google.appengine.eclipse.core.prefs new file mode 100644 index 0000000..a60576c --- /dev/null +++ b/.settings/com.google.appengine.eclipse.core.prefs @@ -0,0 +1,3 @@ +#Thu Jun 16 10:18:26 CEST 2011 +eclipse.preferences.version=1 +filesCopiedToWebInfLib= diff --git a/.settings/com.google.gdt.eclipse.core.prefs b/.settings/com.google.gdt.eclipse.core.prefs new file mode 100644 index 0000000..a2bcbaf --- /dev/null +++ b/.settings/com.google.gdt.eclipse.core.prefs @@ -0,0 +1,6 @@ +#Wed Feb 27 16:43:28 CET 2013 +eclipse.preferences.version=1 +jarsExcludedFromWebInfLib= +lastWarOutDir=/Users/massi/Documents/workspace/resource-management/target/resource-management-4.0.0-SNAPSHOT +warSrcDir=src/main/webapp +warSrcDirIsOutput=false diff --git a/.settings/com.google.gwt.eclipse.core.prefs b/.settings/com.google.gwt.eclipse.core.prefs new file mode 100644 index 0000000..c803c44 --- /dev/null +++ b/.settings/com.google.gwt.eclipse.core.prefs @@ -0,0 +1,5 @@ +#Thu Jun 16 11:14:17 CEST 2011 +eclipse.preferences.version=1 +entryPointModules= +filesCopiedToWebInfLib=gwt-servlet.jar +gwtCompileSettings=PGd3dC1jb21waWxlLXNldHRpbmdzPjxsb2ctbGV2ZWw+SU5GTzwvbG9nLWxldmVsPjxvdXRwdXQtc3R5bGU+T0JGVVNDQVRFRDwvb3V0cHV0LXN0eWxlPjxleHRyYS1hcmdzPjwhW0NEQVRBWy13YXIgc3JjL21haW4vd2ViYXBwXV0+PC9leHRyYS1hcmdzPjx2bS1hcmdzPjwhW0NEQVRBWy1YbXg1MTJtXV0+PC92bS1hcmdzPjxlbnRyeS1wb2ludC1tb2R1bGU+Y29tLmNvbXBhbnkuU29tZU1vZHVsZTwvZW50cnktcG9pbnQtbW9kdWxlPjwvZ3d0LWNvbXBpbGUtc2V0dGluZ3M+ diff --git a/.settings/org.eclipse.core.resources.prefs b/.settings/org.eclipse.core.resources.prefs new file mode 100644 index 0000000..dd9c6a1 --- /dev/null +++ b/.settings/org.eclipse.core.resources.prefs @@ -0,0 +1,7 @@ +#Wed Feb 27 16:43:28 CET 2013 +eclipse.preferences.version=1 +encoding//src/main/java=UTF-8 +encoding//src/main/resources=UTF-8 +encoding//src/test/java=UTF-8 +encoding//src/test/resources=UTF-8 +encoding/=UTF-8 diff --git a/.settings/org.eclipse.jdt.core.prefs b/.settings/org.eclipse.jdt.core.prefs new file mode 100644 index 0000000..2677fd4 --- /dev/null +++ b/.settings/org.eclipse.jdt.core.prefs @@ -0,0 +1,9 @@ +#Wed Feb 27 16:47:37 CET 2013 +eclipse.preferences.version=1 +org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled +org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.6 +org.eclipse.jdt.core.compiler.compliance=1.6 +org.eclipse.jdt.core.compiler.problem.assertIdentifier=error +org.eclipse.jdt.core.compiler.problem.enumIdentifier=error +org.eclipse.jdt.core.compiler.problem.forbiddenReference=warning +org.eclipse.jdt.core.compiler.source=1.6 diff --git a/.settings/org.eclipse.m2e.core.prefs b/.settings/org.eclipse.m2e.core.prefs new file mode 100644 index 0000000..4258307 --- /dev/null +++ b/.settings/org.eclipse.m2e.core.prefs @@ -0,0 +1,5 @@ +#Wed Feb 27 16:43:28 CET 2013 +activeProfiles= +eclipse.preferences.version=1 +resolveWorkspaceProjects=true +version=1 diff --git a/.settings/org.eclipse.wst.common.component b/.settings/org.eclipse.wst.common.component new file mode 100644 index 0000000..2852ff5 --- /dev/null +++ b/.settings/org.eclipse.wst.common.component @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/.settings/org.eclipse.wst.common.project.facet.core.xml b/.settings/org.eclipse.wst.common.project.facet.core.xml new file mode 100644 index 0000000..fefc63a --- /dev/null +++ b/.settings/org.eclipse.wst.common.project.facet.core.xml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/.settings/org.eclipse.wst.jsdt.ui.superType.container b/.settings/org.eclipse.wst.jsdt.ui.superType.container new file mode 100644 index 0000000..3bd5d0a --- /dev/null +++ b/.settings/org.eclipse.wst.jsdt.ui.superType.container @@ -0,0 +1 @@ +org.eclipse.wst.jsdt.launching.baseBrowserLibrary \ No newline at end of file diff --git a/.settings/org.maven.ide.eclipse.prefs b/.settings/org.maven.ide.eclipse.prefs new file mode 100644 index 0000000..c74c58e --- /dev/null +++ b/.settings/org.maven.ide.eclipse.prefs @@ -0,0 +1,9 @@ +#Thu Sep 02 10:42:12 CEST 2010 +activeProfiles= +eclipse.preferences.version=1 +fullBuildGoals=process-test-resources +includeModules=false +resolveWorkspaceProjects=true +resourceFilterGoals=process-resources resources\:testResources +skipCompilerPlugin=true +version=1 diff --git a/ResourceManagementPortletTest-dev.launch b/ResourceManagementPortletTest-dev.launch new file mode 100644 index 0000000..aa419ab --- /dev/null +++ b/ResourceManagementPortletTest-dev.launch @@ -0,0 +1,22 @@ + + + + + + + + + + + + + + + + + + + + + + diff --git a/ResourceManagementPortletTest-prod.launch b/ResourceManagementPortletTest-prod.launch new file mode 100644 index 0000000..d15cdab --- /dev/null +++ b/ResourceManagementPortletTest-prod.launch @@ -0,0 +1,22 @@ + + + + + + + + + + + + + + + + + + + + + + diff --git a/distro/INSTALL b/distro/INSTALL new file mode 100644 index 0000000..72b5dd1 --- /dev/null +++ b/distro/INSTALL @@ -0,0 +1 @@ +Use the respective war file of this component diff --git a/distro/LICENSE b/distro/LICENSE new file mode 100644 index 0000000..cdb5851 --- /dev/null +++ b/distro/LICENSE @@ -0,0 +1,7 @@ +gCube System - License +------------------------------------------------------------ + +The gCube/gCore software is licensed as Free Open Source software conveying to the EUPL (http://ec.europa.eu/idabc/eupl). +The software and documentation is provided by its authors/distributors "as is" and no expressed or +implied warranty is given for its use, quality or fitness for a particular case. + diff --git a/distro/MAINTAINERS b/distro/MAINTAINERS new file mode 100644 index 0000000..ffed162 --- /dev/null +++ b/distro/MAINTAINERS @@ -0,0 +1,5 @@ +Mantainers +------- + +* Massimiliano Assante (massimiliano.assante@isti.cnr.it), CNR Pisa, + Istituto di Scienza e Tecnologie dell'Informazione "A. Faedo". diff --git a/distro/README b/distro/README new file mode 100644 index 0000000..f85f1f0 --- /dev/null +++ b/distro/README @@ -0,0 +1,51 @@ +The gCube System - Portlets - Resource Management Portlet +------------------------------------------------------------ + + +This work has been partially supported by the following European projects: +DILIGENT (FP6-2003-IST-2), D4Science (FP7-INFRA-2007-1.2.2), D4Science-II (FP7-INFRA-2008-1.2.2), +iMarine (FP7-INFRASTRUCTURES-2011-2), and EUBrazilOpenBio (FP7-ICT-2011-EU-Brazil). + + +Authors +------- +* Massimiliano Assante (massimiliano.assante@isti.cnr.it), CNR Pisa, Istituto di Scienza e Tecnologie dell'Informazione "A. Faedo" +* Daniele Strollo + + +Version and Release Date +------------------------ + +v. 2.1.0, September 21st 2012 + +Description +----------- +EXT-GWT based portlet application to manage resources and their related operations + +Download information +-------------------- +Source code is available from SVN: +https://svn.d4science.research-infrastructures.eu/gcube/trunk/portlets/admin/ResourceManagementPortlet + +Binaries can be downloaded from: +http://software.d4science.research-infrastructures.eu/ + +Documentation +------------- +Documentation is available on-line from the Projects Documentation Wiki: + +https://gcube.wiki.gcube-system.org/gcube/index.php/Developer%27s_Guide + + +Licensing +--------- + +This software is licensed under the terms you may find in the file named "LICENSE" in this directory. + +On OSX +--------- +If having troubles with xerces: +javax.xml.parsers.FactoryConfigurationError: Provider org.apache.xerces.jaxp.DocumentBuilderFactoryImpl not found + +With jdk1.5 use sax.jar provided in the lib dir in behalf of $GLOBUS_LOCATION/lib/xercesImpl.jar +and xml-apis.jar. \ No newline at end of file diff --git a/distro/changelog.xml b/distro/changelog.xml new file mode 100644 index 0000000..f58076e --- /dev/null +++ b/distro/changelog.xml @@ -0,0 +1,90 @@ + + + Mavenized + + + Reengineered completely to support modules + Added one click feature for retrieving resource profiles + generic Resource grid view show description + + + Added plugin for TreeManager activation record creation + + + + New Software Upload Wizard integrated + Added support for resource manger service 2 + + + Completely restyled pinned resources panel (former opened + resources panel) using CSS3 and HTML5 + + Added support for runtime resources editing + Added support for remove from scope + Added automatic show of gHN List at startup with possibility + to set it on or off by editing a configuration file + + Added automatic highlighting of low memory or disk machines + and gHN States + + + + First release on gxt and gwt2.0 + for etics 2.0.1 release + + + for etics 2.1.0 release + + + for etics 2.2.0 release + + + for etics 2.2.1 release + + + for etics 2.2.2 release + Added sweeper for invalid resources (expired GHNs and orphan + RIs) + + + + Correctly lists GCUBECollection type from new Content Manager + + Correctly lists VIEW type from new Content Manager + Ported to GWT 2.2 GXT 2.2.3 + + + Added support for runtime resources + + + Added support for runtime resources removal + Added support for runtime resources scope change + + \ No newline at end of file diff --git a/distro/descriptor.xml b/distro/descriptor.xml new file mode 100644 index 0000000..4efc827 --- /dev/null +++ b/distro/descriptor.xml @@ -0,0 +1,48 @@ + + servicearchive + + tar.gz + + / + + + ${distroDirectory} + / + true + + README + LICENSE + INSTALL + MAINTAINERS + changelog.xml + + 755 + true + + + target/apidocs + /${artifactId}/doc/api + true + 755 + + + + + ${distroDirectory}/profile.xml + ./ + true + + + target/${build.finalName}.war + /${artifactId} + + + ${distroDirectory}/svnpath.txt + /${artifactId} + true + + + \ No newline at end of file diff --git a/distro/profile.xml b/distro/profile.xml new file mode 100644 index 0000000..05f3322 --- /dev/null +++ b/distro/profile.xml @@ -0,0 +1,25 @@ + + + + Service + + ${description} + PortletAdmin + ${artifactId} + ${version} + + + ${artifactId} + ${version} + + ${groupId} + ${artifactId} + ${version} + + + target/${build.finalName}.war + + + + + diff --git a/distro/svnpath.txt b/distro/svnpath.txt new file mode 100644 index 0000000..edacb04 --- /dev/null +++ b/distro/svnpath.txt @@ -0,0 +1 @@ +${scm.url} \ No newline at end of file diff --git a/pom.xml b/pom.xml new file mode 100644 index 0000000..93144b9 --- /dev/null +++ b/pom.xml @@ -0,0 +1,338 @@ + + + + 4.0.0 + + maven-parent + org.gcube.tools + 1.0.0 + + + + org.gcube.portlets.admin + resource-management + 4.0.0-SNAPSHOT + war + gCube Resource Management Portlet + + Cube Resource Management Portlet + + + scm:svn:http://svn.d4science.research-infrastructures.eu/gcube/trunk/portlets/user/${project.artifactId} + scm:https://svn.d4science.research-infrastructures.eu/gcube/trunk/portlets/user/${project.artifactId} + http://svn.d4science.research-infrastructures.eu/gcube/trunk/portlets/user/${project.artifactId} + + + + 2.4.0 + 3.0 + distro + + 1.6 + 1.6 + ${project.build.directory}/${project.build.finalName} + + UTF-8 + UTF-8 + + + + + + + xerces + xercesImpl + 2.9.1 + provided + + + com.google.gwt + gwt-user + ${gwtVersion} + provided + + + com.google.gwt + gwt-servlet + ${gwtVersion} + provided + + + com.sencha.gxt + gxt + 2.2.5 + provided + + + org.gcube.applicationsupportlayer + aslcore + [3.2.0-SNAPSHOT, 4.0.0-SNAPSHOT) + provided + + + org.gcube.portlets.user + home-library + [4.3.0-SNAPSHOT, 5.0.0-SNAPSHOT) + provided + + + org.gcube.portlets.user + home-library-jcr + [1.3.0-SNAPSHOT, 2.0.0-SNAPSHOT) + provided + + + org.gcube.applicationsupportlayer + accesslogger + [1.2.0-SNAPSHOT, 2.0.0-SNAPSHOT) + provided + + + org.gcube.portlets.user + gcube-widgets + [1.4.0-SNAPSHOT, 2.0.0-SNAPSHOT) + provided + + + org.gcube.portlets.user + guided-tour-widget + [1.2.0-SNAPSHOT, 2.0.0-SNAPSHOT) + provided + + + org.gcube.portal + custom-portal-handler + [1.2.0-SNAPSHOT, 2.0.0-SNAPSHOT) + provided + + + org.gcube.core + gcf + [1.4.0-SNAPSHOT, 2.0.0-SNAPSHOT) + provided + + + org.gcube.resourcemanagement + resource-manager-stubs + [2.0.1-SNAPSHOT, 3.0.0-SNAPSHOT) + provided + + + org.gcube.resourcemanagement + ghnmanager-stubs + [1.5.0-SNAPSHOT, 2.0.0-SNAPSHOT) + provided + + + org.gcube.portlets.admin + rmp-common-library + [1.1.0-SNAPSHOT, 2.0.0-SNAPSHOT) + + + org.gcube.portlets.admin + ishealth-monitor-widget + [1.0.0-SNAPSHOT, 2.0.0-SNAPSHOT) + + + org.gcube.portlets.admin + resource-sweeper-widget + [1.0.0-SNAPSHOT, 2.0.0-SNAPSHOT) + + + org.gcube.portlets.admin + software-upload-wizard + [1.1.0-SNAPSHOT, 2.0.0-SNAPSHOT) + + + com.allen-sauer.gwt.log + gwt-log + 3.1.7 + provided + + + javax.mail + javax.mail-api + 1.4.5 + provided + + + com.liferay.portal + portal-service + 6.0.6 + provided + + + log4j + log4j + 1.2.16 + runtime + + + org.slf4j + slf4j-log4j12 + 1.6.4 + runtime + + + org.slf4j + slf4j-api + 1.6.4 + runtime + + + javax.portlet + portlet-api + 2.0 + provided + + + + commons-lang + commons-lang + 2.6 + provided + + + org.apache.commons + commons-compress + 1.4.1 + provided + + + commons-fileupload + commons-fileupload + 1.2.1 + provided + + + commons-io + commons-io + 2.4 + provided + + + junit + junit + 4.7 + test + + + javax.validation + validation-api + 1.0.0.GA + test + + + javax.validation + validation-api + 1.0.0.GA + sources + test + + + + + + ${webappDirectory}/WEB-INF/classes + + + + + + org.codehaus.mojo + gwt-maven-plugin + 2.4.0 + + + + compile + + + + + + + Messages.html + ${webappDirectory} + + + + + + org.apache.maven.plugins + maven-war-plugin + 2.1.1 + + + compile + + exploded + + + + + ${webappDirectory} + + + + org.apache.maven.plugins + maven-compiler-plugin + 2.3.2 + + 1.6 + 1.6 + + + + + org.apache.maven.plugins + maven-assembly-plugin + 2.2 + + + ${distroDirectory}/descriptor.xml + + + + + servicearchive + install + + single + + + + + + org.apache.maven.plugins + maven-resources-plugin + 2.5 + + + copy-profile + install + + copy-resources + + + target + + + ${distroDirectory} + true + + profile.xml + + + + + + + + + + + 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 new file mode 100644 index 0000000..e236e4b --- /dev/null +++ b/src/main/java/org/gcube/portlets/admin/resourcemanagement/client/ResourceManagementPortlet.java @@ -0,0 +1,720 @@ +/**************************************************************************** + * This software is part of the gCube Project. + * Site: http://www.gcube-system.org/ + **************************************************************************** + * The gCube/gCore software is licensed as Free Open Source software + * conveying to the EUPL (http://ec.europa.eu/idabc/eupl). + * The software and documentation is provided by its authors/distributors + * "as is" and no expressed or + * implied warranty is given for its use, quality or fitness for a + * particular case. + **************************************************************************** + * Filename: ResourceManagementPortlet.java + **************************************************************************** + * @author Daniele Strollo + ***************************************************************************/ + +package org.gcube.portlets.admin.resourcemanagement.client; + + +import org.gcube.portlets.admin.ishealthmonitor.client.dialog.ISMonitor; +import org.gcube.portlets.admin.resourcemanagement.client.forms.genericresources.ActivationRecordVMForm; +import org.gcube.portlets.admin.resourcemanagement.client.forms.genericresources.DeployVirtualCollection; +import org.gcube.portlets.admin.resourcemanagement.client.forms.genericresources.GenericResourceCMForm; +import org.gcube.portlets.admin.resourcemanagement.client.forms.genericresources.GenericResourceTreeManagerForm; +import org.gcube.portlets.admin.resourcemanagement.client.remote.ProxyRegistry; +import org.gcube.portlets.admin.resourcemanagement.client.utils.Commands; +import org.gcube.portlets.admin.resourcemanagement.client.utils.Messages; +import org.gcube.portlets.admin.resourcemanagement.client.utils.OpCommands; +import org.gcube.portlets.admin.resourcemanagement.client.views.resourcedetails.ResourceDetailsPanel; +import org.gcube.portlets.admin.resourcemanagement.client.widgets.console.ConsoleMessageBroker; +import org.gcube.portlets.admin.resourcemanagement.client.widgets.console.ConsolePanel; +import org.gcube.portlets.admin.resourcemanagement.client.widgets.dialogs.ExtendedMessageBox; +import org.gcube.portlets.admin.resourcemanagement.client.widgets.panels.DetachablePanel; +import org.gcube.portlets.admin.resourcemanagement.client.widgets.panels.MainPanel; +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.resourcemanagement.shared.Configuration; +import org.gcube.portlets.admin.resourcemanagement.shared.utils.DelayedOperation; +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.StatusHandler; +import org.gcube.resourcemanagement.support.shared.exceptions.InvalidParameterException; +import org.gcube.resourcemanagement.support.shared.operations.SupportedOperations; +import org.gcube.resourcemanagement.support.shared.types.RunningMode; +import org.gcube.resourcemanagement.support.shared.types.UserGroup; + +import com.extjs.gxt.ui.client.Style.LayoutRegion; +import com.extjs.gxt.ui.client.Style.Scroll; +import com.extjs.gxt.ui.client.event.ComponentEvent; +import com.extjs.gxt.ui.client.event.Listener; +import com.extjs.gxt.ui.client.event.MessageBoxEvent; +import com.extjs.gxt.ui.client.util.Margins; +import com.extjs.gxt.ui.client.widget.ContentPanel; +import com.extjs.gxt.ui.client.widget.Dialog; +import com.extjs.gxt.ui.client.widget.Label; +import com.extjs.gxt.ui.client.widget.MessageBox; +import com.extjs.gxt.ui.client.widget.ProgressBar; +import com.extjs.gxt.ui.client.widget.Status; +import com.extjs.gxt.ui.client.widget.Text; +import com.extjs.gxt.ui.client.widget.button.Button; +import com.extjs.gxt.ui.client.widget.layout.AccordionLayout; +import com.extjs.gxt.ui.client.widget.layout.BorderLayout; +import com.extjs.gxt.ui.client.widget.layout.FitLayout; +import com.extjs.gxt.ui.client.widget.menu.CheckMenuItem; +import com.extjs.gxt.ui.client.widget.menu.Menu; +import com.extjs.gxt.ui.client.widget.menu.MenuBar; +import com.extjs.gxt.ui.client.widget.menu.MenuBarItem; +import com.extjs.gxt.ui.client.widget.menu.MenuItem; +import com.extjs.gxt.ui.client.widget.menu.SeparatorMenuItem; +import com.extjs.gxt.ui.client.widget.toolbar.FillToolItem; +import com.extjs.gxt.ui.client.widget.toolbar.SeparatorToolItem; +import com.extjs.gxt.ui.client.widget.toolbar.ToolBar; +import com.google.gwt.core.client.EntryPoint; +import com.google.gwt.core.client.GWT; +import com.google.gwt.core.client.RunAsyncCallback; +import com.google.gwt.event.logical.shared.ResizeEvent; +import com.google.gwt.event.logical.shared.ResizeHandler; +import com.google.gwt.event.shared.HandlerManager; +import com.google.gwt.user.client.Window; +import com.google.gwt.user.client.rpc.AsyncCallback; +import com.google.gwt.user.client.ui.RootPanel; + +/** + * Entry point classes define onModuleLoad(). + */ +public class ResourceManagementPortlet implements EntryPoint { + + public static final String CONTAINER_DIV = "MyUniqueDIV"; + + private final HandlerManager eventBus = new HandlerManager(null); + + + private void printStatus(final CurrentStatus status) { + ConsoleMessageBroker.trace(this, "User: " + status.getCurrentUser()); + ConsoleMessageBroker.trace(this, "Scope: " + status.getCurrentScope()); + ConsoleMessageBroker.trace(this, "Credentials: " + status.getCredentials()); + ConsoleMessageBroker.trace(this, "Running Mode: " + status.getRunningMode()); + } + /** + * events binder + */ + 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) { + Commands.setStatusScope(event.getScope()); + } + }); + } + /** + * This is the entry point method. + */ + 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); + + ProxyRegistry.getProxyInstance().initStatus(new AsyncCallback() { + // Received status + public void onSuccess(final CurrentStatus result) { + StatusHandler.setStatus(result); + printStatus(result); + + Commands.mask("Contacting the Infrastructure, please wait", UIIdentifiers.MAIN_CONTAINER_VIEWPORT_ID); + + // loads the scopes + ProxyRegistry.getProxyInstance().initScopes(true, new AsyncCallback() { + public void onSuccess(final Void result) { + // Now that both scopes and user credentials have been loaded + // the menu and statusbar can be built. + buildMenu(); + buildStatusBar(); + Commands.mask("Loading scopes", UIIdentifiers.MAIN_CONTAINER_VIEWPORT_ID); + Commands.doGetAvailableScopes(this); + + if (StatusHandler.getStatus().getCurrentScope() != null) { + Commands.setStatusScope(StatusHandler.getStatus().getCurrentScope()); + Commands.doLoadResourceTree(this, StatusHandler.getStatus().getCurrentScope()); + } + } + public void onFailure(final Throwable caught) { + } + }); + + + } + public void onFailure(final Throwable caught) { + MessageBox.info("Failure", "cannot initialize servlet", null); + } + }); + } + + private MainContainer buildUI() { + MainContainer viewport = new MainContainer(); + BorderLayout bl = new BorderLayout(); + viewport.setLayout(bl); + WidgetsRegistry.registerWidget(UIIdentifiers.MAIN_CONTAINER_VIEWPORT_ID, viewport); + + MainPanel northPanel = new MainPanel(53, "Main App", LayoutRegion.NORTH) { + @Override + public void init() { + ConsoleMessageBroker.log(this, "Initializing north panel"); + this.setCollapsible(false); + this.setMargins(new Margins(5, 5, 0, 5)); + + this.setSplit(false); + this.hideHeader(); + } + }; + + MainPanel eastPanel = new MainPanel(150, "Pinned Resources", LayoutRegion.EAST) { + @Override + public void init() { + ConsoleMessageBroker.log(this, "Initializing east panel"); + this.setCollapsible(true); + this.setMargins(new Margins(5, 5, 5, 0)); + this.getContainer().setScrollMode(Scroll.AUTOY); + this.getContainer().setHeight(100); + ((ContentPanel) this.getContainer()).getBody().setStyleName("taskbar-pattern"); + } + }; + + MainPanel westPanel = new MainPanel(200, "ResourceNavigation", LayoutRegion.WEST) { + @Override + public void init() { + ConsoleMessageBroker.log(this, "Initializing west panel"); + this.setCollapsible(true); + this.setMargins(new Margins(5, 0, 5, 5)); + Text widget = new Text(); + widget.setId("res-details-widget-fake"); + widget.setStyleName("left-panel-tree-background"); + this.getContainer().setLayout(new AccordionLayout()); + ContentPanel cp = new ContentPanel(); + cp.setAnimCollapse(false); + cp.setHeading("Resources"); + cp.setLayout(new FitLayout()); + cp.add(widget); + this.getContainer().add(cp); + } + }; + + MainPanel southPanel = new MainPanel(180, "Console (debug mode)", LayoutRegion.SOUTH) { + @Override + public void init() { + ConsoleMessageBroker.log(this, "Initializing south panel"); + this.setCollapsible(false); + this.setSplit(true); + this.setMargins(new Margins(0, 0, 0, 0)); + + // Inserts the console + this.getContainer().setLayout(new FitLayout()); + //this.getContainer().setScrollMode(Scroll.AUTOY); + try { + // Creates a detachable panel in which a console will be inserted + DetachablePanel consolePanel = new DetachablePanel( + this.getContainer(), + "Console (debug mode)", + UIIdentifiers.CONSOLE_COMPONENT_ID , + false); + ConsolePanel console = new ConsolePanel(consolePanel); + WidgetsRegistry.registerElem(UIIdentifiers.CONSOLE_WIDGET_ID, console); + // initially the console will be hidden + Commands.showHideConsole(); + } catch (InvalidParameterException e) { + e.printStackTrace(); + } + } + }; + + + MainPanel centerPanel = new MainPanel(LayoutRegion.CENTER) { + @Override + public void init() { + this.getContainer().setLayout(new FitLayout()); + this.hideHeader(); + ConsoleMessageBroker.log(this, "Initialiting center panel"); + this.setMargins(new Margins(5)); + ResourceDetailsPanel resourceDetailGrid = new ResourceDetailsPanel(); + this.add(resourceDetailGrid.getWidget(), false); + WidgetsRegistry.registerElem(UIIdentifiers.RESOURCE_DETAIL_GRID_CONTAINER_ID, resourceDetailGrid); + } + }; + + viewport.addPanel(UIIdentifiers.GLOBAL_MENU_CONTAINER_PANEL, northPanel); + viewport.addPanel(UIIdentifiers.RESOURCE_NAVIGATION_PANEL, westPanel); + viewport.addPanel(UIIdentifiers.RESOURCE_DETAIL_GRID_PANEL, centerPanel); + viewport.addPanel(UIIdentifiers.TASKBAR_PANEL, eastPanel); + viewport.addPanel(UIIdentifiers.CONSOLE_PANEL_ID, southPanel); + + Window.addResizeHandler(new ResizeHandler() { + public void onResize(final ResizeEvent event) { + updateSize(); + } + }); + + // updates for the first time + updateSize(); + + //viewport.setAutoHeight(false); + //viewport.setAutoWidth(false); + return viewport; + } + + private void updateSize() { + RootPanel workspace = RootPanel.get(CONTAINER_DIV); + + if (workspace == null) { + return; + } + + int topBorder = workspace.getAbsoluteTop(); + int leftBorder = workspace.getAbsoluteLeft(); + int rightScrollBar = 17; + int rootHeight = Window.getClientHeight() - topBorder - 4; + int rootWidth = (Window.getClientWidth() - 2 * leftBorder - rightScrollBar); + + ConsoleMessageBroker.debug(this, "New workspace dimension Height: " + rootHeight + " Width: " + rootWidth); + + MainContainer viewport = (MainContainer) WidgetsRegistry.getWidget(UIIdentifiers.MAIN_CONTAINER_VIEWPORT_ID); + + viewport.setHeight(rootHeight); + viewport.setWidth(rootWidth); + } + + /** + * Internally used to build up the main panel menu. + * @return the menu + */ + private void buildMenu() { + + /*********************************************************** + * MENU - OPTIONS + **********************************************************/ + Menu optionsMenu = new Menu(); + + CheckMenuItem highlightInvalid = new CheckMenuItem("Highlight invalid fields") { + @Override + protected void onClick(final ComponentEvent be) { + super.onClick(be); + Commands.getResourceDetailPanel().toggleHighlightInvalidFields(); + } + }; + highlightInvalid.setChecked(false); + optionsMenu.add(highlightInvalid); + + CheckMenuItem showConsole = new CheckMenuItem("Show Console") { + @Override + protected void onClick(final ComponentEvent be) { + super.onClick(be); + Commands.showHideConsole(); + } + }; + showConsole.setChecked(false); + // Checks that this menu item is permitted to the current user + Commands.evaluateCredentials( + showConsole, + UserGroup.ADMIN, UserGroup.DEBUG); + optionsMenu.add(showConsole); + + CheckMenuItem superUser = new CheckMenuItem("Super User Mode") { + @Override + protected void onClick(final ComponentEvent be) { + super.onClick(be); + + if (this.isChecked()) { + ConsoleMessageBroker.info(this, "Going in super user mode"); + + + + ExtendedMessageBox.password("Super User Authentication", new Listener() { + public void handleEvent(final MessageBoxEvent be) { + String pwd = be.getValue(); + Commands.mask("Applying super user mode", UIIdentifiers.MAIN_CONTAINER_VIEWPORT_ID); + if (pwd != null && pwd.equals(Configuration.SUPER_USER_CODE)) { + Commands.doSetSuperUser(true); + } else { + MessageBox.alert("Wrong code", "Invalid Password entered.", null); + setChecked(false); + Commands.unmask(UIIdentifiers.MAIN_CONTAINER_VIEWPORT_ID); + } + } + }); + + //reloadMenu(); + } else { + ConsoleMessageBroker.info(this, "Going in debug mode"); + Commands.doSetSuperUser(false); + //reloadMenu(); + + } + } + }; + // Checks that this menu item is permitted to the current user + Commands.evaluateCredentials( + superUser, + UserGroup.DEBUG); + superUser.setChecked(StatusHandler.getStatus().getCredentials() == UserGroup.ADMIN); + optionsMenu.add(superUser); + + + CheckMenuItem useCache = new CheckMenuItem("Use Remote Cache") { + @Override + protected void onClick(final ComponentEvent be) { + super.onClick(be); + StatusHandler.getStatus().setUseCache(this.isChecked()); + ProxyRegistry.getProxyInstance().setUseCache(this.isChecked(), + new AsyncCallback() { + public void onSuccess(final Void result) { + } + public void onFailure(final Throwable caught) { + } + }); + } + }; + useCache.setChecked(StatusHandler.getStatus().useCache()); + optionsMenu.add(useCache); + + CheckMenuItem openProfileOnLoad = new CheckMenuItem("Open Profile onLoad") { + @Override + protected void onClick(final ComponentEvent be) { + super.onClick(be); + Configuration.openProfileOnLoad = !Configuration.openProfileOnLoad; + } + }; + openProfileOnLoad.setChecked(false); + optionsMenu.add(openProfileOnLoad); + + + CheckMenuItem allowMultipleProfiles = new CheckMenuItem("Allow Multiple Profiles") { + @Override + protected void onClick(final ComponentEvent be) { + super.onClick(be); + Configuration.allowMultipleProfiles = !Configuration.allowMultipleProfiles; + } + }; + allowMultipleProfiles.setChecked(false); + optionsMenu.add(allowMultipleProfiles); + + + /*********************************************************** + * MENU - SEARCH + **********************************************************/ + Menu searchMenu = new Menu(); + MenuItem getResource = new MenuItem("Get Resource By ID") { + protected void onClick(final ComponentEvent be) { + OpCommands.doGetResourceByID(); + }; + }; + getResource.setIconStyle("resources-icon"); + Commands.evaluateCredentials( + getResource, + SupportedOperations.SERVICE_GET_RESOURCE_BY_ID.getPermissions()); + searchMenu.add(getResource); + + MenuItem getReport = new MenuItem("Get Report") { + protected void onClick(final ComponentEvent be) { + OpCommands.doGetDeployReport(); + }; + }; + getReport.setIconStyle("getreport-icon"); + Commands.evaluateCredentials( + getReport, + SupportedOperations.SERVICE_GET_REPORT.getPermissions()); + searchMenu.add(getReport); + + /*********************************************************** + * MENU - TOOLS + **********************************************************/ + Menu toolsMenu = new Menu(); + + 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."); + } + }); + }; + }; + testIS.setIconStyle("is-icon"); + Commands.evaluateCredentials( + testIS, + SupportedOperations.SERVICE_GET_RESOURCE_BY_ID.getPermissions()); + toolsMenu.add(testIS); + + + 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); + + }; + }; + cleanGHN.setIconStyle("sweeper-icon"); + toolsMenu.add(cleanGHN); + + MenuItem createSub = new MenuItem("Create"); + createSub.setIconStyle("new-icon"); + Menu createMnu = new Menu(); + + // Create Generic Resource + MenuItem createGR = new MenuItem("Generic Resource") { + protected void onClick(final ComponentEvent be) { + super.onClick(be); + OpCommands.doOpenGenericResourceForm(); + }; + }; + createGR.setIconStyle("genericresource-icon"); + createMnu.add(createGR); + + // Create activation record from plugins + MenuItem createARTM = new MenuItem("Activation Record for Tree Manager") { + protected void onClick(final ComponentEvent be) { + super.onClick(be); + if (SupportedOperations.GENERIC_RESOURCE_CREATE.isAllowed(StatusHandler.getStatus().getCredentials())) { + new GenericResourceTreeManagerForm().show(); + } else { + MessageBox.alert("Activation Record for TM", "You are not allowed to execute this operation", null); + } + }; + }; + createARTM.setIconStyle("pluginTM-icon"); + createMnu.add(createARTM); + + // Create activation record from plugins + MenuItem createACM = new MenuItem("Activation Record for Content Manager") { + protected void onClick(final ComponentEvent be) { + super.onClick(be); + if (SupportedOperations.GENERIC_RESOURCE_CREATE.isAllowed(StatusHandler.getStatus().getCredentials())) { + new GenericResourceCMForm().show(); + } else { + MessageBox.alert("Activation Record for CM", "You are not allowed to execute this operation", null); + } + }; + }; + createACM.setIconStyle("pluginCM-icon"); + createMnu.add(createACM); + + // Create activation record from VM + MenuItem createVM = new MenuItem("Activation Record for View Manager") { + protected void onClick(final ComponentEvent be) { + super.onClick(be); + if (SupportedOperations.GENERIC_RESOURCE_CREATE.isAllowed(StatusHandler.getStatus().getCredentials())) { + //MessageBox.alert("Activation Record for VM", "Operation not implemented yet.", null); + new ActivationRecordVMForm().show(); + } else { + MessageBox.alert("Activation Record for VM", "You are not allowed to execute this operation", null); + } + }; + }; + createVM.setIconStyle("pluginVM-icon"); + createMnu.add(createVM); + + // Create Generic Resource + MenuItem deployVirtualCollection = new MenuItem("Instantiate Virtual Collections") { + protected void onClick(final ComponentEvent be) { + super.onClick(be); + if (SupportedOperations.GENERIC_RESOURCE_CREATE.isAllowed(StatusHandler.getStatus().getCredentials())) { + new DeployVirtualCollection().show(); + } else { + MessageBox.alert("Instantiate Virtual Collections", "You are not allowed to execute this operation", null); + } + }; + }; + deployVirtualCollection.setIconStyle("install-icon"); + createMnu.add(deployVirtualCollection); + + createSub.setSubMenu(createMnu); + Commands.evaluateCredentials( + createSub, + SupportedOperations.CREATE_MENU_SHOW.getPermissions()); + toolsMenu.add(createSub); + + + toolsMenu.add(new SeparatorMenuItem()); + + /*********************************************************** + * SUBMENU - OPTIONS->REFRESH + **********************************************************/ + MenuItem sub = new MenuItem("Refresh"); + sub.setIconStyle("refresh-icon"); + Menu refresh = new Menu(); + refresh.add(new MenuItem("Resource Navigation") { + @Override + protected void onClick(final ComponentEvent be) { + super.onClick(be); + Commands.refreshResourceTree(); + } + }); + refresh.add(new MenuItem("Resource Details Grid") { + @Override + protected void onClick(final ComponentEvent be) { + super.onClick(be); + Commands.refreshResourceGrid(); + } + }); + refresh.add(new MenuItem("Console (UI)") { + @Override + protected void onClick(final ComponentEvent be) { + super.onClick(be); + Commands.refreshConsole(); + } + }); + refresh.add(new MenuItem("Resource Details (UI)") { + @Override + protected void onClick(final ComponentEvent be) { + super.onClick(be); + Commands.refreshResourceDetails(); + } + }); + refresh.add(new MenuItem("Desktop (UI)") { + @Override + protected void onClick(final ComponentEvent be) { + super.onClick(be); + Commands.refreshViewport(); + } + }); + sub.setSubMenu(refresh); + toolsMenu.add(sub); + + MenuItem emptyCache = new MenuItem("Empty Cache") { + protected void onClick(final ComponentEvent be) { + super.onClick(be); + ProxyRegistry.getProxyInstance().emptyCache(new AsyncCallback() { + public void onSuccess(final Void result) { + Commands.showPopup("Empty cache", "The remote cache has been cleaned"); + } + public void onFailure(final Throwable caught) { + Commands.showPopup("Empty cache error", "The remote cache has not been cleaned"); + } + }); + }; + }; + emptyCache.setIconStyle("clear-icon"); + toolsMenu.add(emptyCache); + + + /*********************************************************** + * MENU - ABOUT + **********************************************************/ + Menu helpMenu = new Menu(); + MenuItem aboutMnuItem = new MenuItem("About") { + @Override + protected void onClick(final ComponentEvent be) { + super.onClick(be); + Dialog dlg = new Dialog(); + dlg.setHeading("About - Resource Management"); + dlg.addText("
This software is part of the gCube Project.
" + + "Site: http://www.gcube-system.org/" + + "

The gCube/gCore software is licensed as Free Open Source software " + + "conveying to the EUPL (http://ec.europa.eu/idabc/eupl).


" + + "

The software and documentation is provided by its authors/distributors " + + "\"as is\" and no expressed or " + + "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

" + + "
"); + + dlg.setClosable(true); + dlg.setModal(true); + dlg.setHideOnButtonClick(true); + dlg.show(); + } + }; + aboutMnuItem.setIconStyle("about-icon"); + helpMenu.add(aboutMnuItem); + + MenuBar mb = new MenuBar(); + mb.add(new MenuBarItem("Tools", toolsMenu)); + mb.add(new MenuBarItem("Options", optionsMenu)); + mb.add(new MenuBarItem("Search", searchMenu)); + mb.add(new MenuBarItem("Help", helpMenu)); + + + MainPanel menuPanel = WidgetsRegistry.getPanel(UIIdentifiers.GLOBAL_MENU_CONTAINER_PANEL); + WidgetsRegistry.registerWidget(UIIdentifiers.GLOBAL_MENUBAR_ID, mb); + menuPanel.add(mb, true); + } + + private void buildStatusBar() { + MainPanel menuPanel = WidgetsRegistry.getPanel(UIIdentifiers.GLOBAL_MENU_CONTAINER_PANEL); + ToolBar statusbar = new ToolBar(); + statusbar.add(new SeparatorToolItem()); + + if (StatusHandler.getStatus().getRunningMode() != RunningMode.PORTAL) { + Button btnScope = new Button("Available Scopes"); + btnScope.setMenu(new Menu()); + WidgetsRegistry.registerWidget(UIIdentifiers.BUTTON_AVAILABLE_SCOPES_ID, btnScope); + // Checks that this menu item is permitted to the current user + statusbar.add(btnScope); + } else { + statusbar.add(new Label("Current role: " + StatusHandler.getStatus().getCredentials())); + } + + //statusbar.add(new FillToolItem()); + statusbar.add(new Label("                   ")); + ProgressBar progressStatus = new ProgressBar(); + progressStatus.setWidth(200); + progressStatus.updateText("Updating Infrastructure..."); + statusbar.add(progressStatus); + progressStatus.hide(); + WidgetsRegistry.registerWidget(UIIdentifiers.STATUS_PROGRESS_BAR_ID, progressStatus); + + statusbar.add(new FillToolItem()); + statusbar.add(new Label("Current Scope:  ")); + Status scopeInfo = new Status(); + scopeInfo.setWidth(350); + scopeInfo.setText(Messages.NO_SCOPE_SELECTED); + scopeInfo.setBox(true); + statusbar.add(scopeInfo); + WidgetsRegistry.registerWidget(UIIdentifiers.STATUS_SCOPE_INFO_ID, scopeInfo); + + statusbar.add(new Label("  Loaded Resources:  ")); + Status loadedResources = new Status(); + loadedResources.setWidth(35); + loadedResources.setText("0"); + loadedResources.setBox(true); + statusbar.add(loadedResources); + WidgetsRegistry.registerWidget(UIIdentifiers.STATUS_LOADED_RESOURCES_ID, loadedResources); + + menuPanel.add(statusbar, false); + + menuPanel.getContainer().setBorders(false); + menuPanel.getContainer().setShadow(true); + WidgetsRegistry.registerWidget(UIIdentifiers.GLOBAL_STATUS_BAR_ID, statusbar); + } + + +} diff --git a/src/main/java/org/gcube/portlets/admin/resourcemanagement/client/forms/DeployServicesForm.java b/src/main/java/org/gcube/portlets/admin/resourcemanagement/client/forms/DeployServicesForm.java new file mode 100644 index 0000000..b8a5227 --- /dev/null +++ b/src/main/java/org/gcube/portlets/admin/resourcemanagement/client/forms/DeployServicesForm.java @@ -0,0 +1,346 @@ +/**************************************************************************** + * This software is part of the gCube Project. + * Site: http://www.gcube-system.org/ + **************************************************************************** + * The gCube/gCore software is licensed as Free Open Source software + * conveying to the EUPL (http://ec.europa.eu/idabc/eupl). + * The software and documentation is provided by its authors/distributors + * "as is" and no expressed or + * implied warranty is given for its use, quality or fitness for a + * particular case. + **************************************************************************** + * Filename: DeployServicesForm.java + **************************************************************************** + * @author Daniele Strollo + ***************************************************************************/ + +package org.gcube.portlets.admin.resourcemanagement.client.forms; + +import java.util.List; +import java.util.Vector; +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; +import org.gcube.portlets.admin.resourcemanagement.client.views.resourcedetails.ResourceGridFactory; +import org.gcube.portlets.admin.resourcemanagement.client.widgets.console.ConsoleMessageBroker; +import org.gcube.portlets.admin.resourcemanagement.client.widgets.registry.UIIdentifiers; +import org.gcube.resourcemanagement.support.client.utils.StatusHandler; +import org.gcube.resourcemanagement.support.client.views.ResourceTypeDecorator; +import org.gcube.resourcemanagement.support.shared.operations.SupportedOperations; +import org.gcube.resourcemanagement.support.shared.types.datamodel.ResourceDescriptor; +import org.gcube.resourcemanagement.support.shared.types.datamodel.ResourceDetailModel; + +import com.extjs.gxt.ui.client.Style.Orientation; +import com.extjs.gxt.ui.client.data.ModelData; +import com.extjs.gxt.ui.client.event.ComponentEvent; +import com.extjs.gxt.ui.client.event.Listener; +import com.extjs.gxt.ui.client.event.MessageBoxEvent; +import com.extjs.gxt.ui.client.store.ListStore; +import com.extjs.gxt.ui.client.store.StoreSorter; +import com.extjs.gxt.ui.client.util.Margins; +import com.extjs.gxt.ui.client.widget.Component; +import com.extjs.gxt.ui.client.widget.ContentPanel; +import com.extjs.gxt.ui.client.widget.MessageBox; +import com.extjs.gxt.ui.client.widget.Text; +import com.extjs.gxt.ui.client.widget.Window; +import com.extjs.gxt.ui.client.widget.button.Button; +import com.extjs.gxt.ui.client.widget.form.DualListField; +import com.extjs.gxt.ui.client.widget.form.FormPanel; +import com.extjs.gxt.ui.client.widget.form.ListField; +import com.extjs.gxt.ui.client.widget.grid.Grid; +import com.extjs.gxt.ui.client.widget.layout.FitLayout; +import com.extjs.gxt.ui.client.widget.layout.FormData; +import com.extjs.gxt.ui.client.widget.layout.RowData; +import com.extjs.gxt.ui.client.widget.layout.RowLayout; +import com.extjs.gxt.ui.client.widget.menu.Menu; +import com.extjs.gxt.ui.client.widget.menu.MenuItem; +import com.google.gwt.core.client.GWT; +import com.google.gwt.user.client.rpc.AsyncCallback; + + +/** + * @author Daniele Strollo + * @author Massimiliano Assante (ISTI-CNR) + * @version 2.1 APR 2012 + */ +public class DeployServicesForm { + private ContentPanel rootPanel = null; + private ContentPanel ghnContainer = null; + private ContentPanel serviceContainer = null; + private final ListStore GHNstore = new ListStore(); + private final ListStore selectedGHNs = new ListStore(); + private final Window window = new Window(); + private int resourceLoaded = 0; + + + public DeployServicesForm() { + this.ghnContainer = new ContentPanel(new FitLayout()); + this.serviceContainer = new ContentPanel(new FitLayout()); + + this.ghnContainer.getHeader().setStyleName("x-hide-panel-header"); + this.ghnContainer.setHeaderVisible(false); + this.serviceContainer.getHeader().setStyleName("x-hide-panel-header"); + this.serviceContainer.setHeaderVisible(false); + + this.ghnContainer.add(new Text()); + this.serviceContainer.add(new Text()); + this.init(); + } + + private void markResourceLoaded() { + this.resourceLoaded++; + if (this.resourceLoaded >= 2) { + Commands.unmask(Commands.getViewport()); + Commands.unmask(this.rootPanel); + } + } + + private void loadGHNs(final String scope) { + ProxyRegistry.getProxyInstance().getResourcesModel(scope, + ResourceTypeDecorator.GHN.name(), + null, + null, + new AsyncCallback>() { + + public void onSuccess(final List result) { + ghnContainer.removeAll(); + ghnContainer.add(createGHNForm()); + GHNstore.add(result); + ghnContainer.layout(true); + Commands.showPopup("GHN load", "Loaded " + result.size() + " GHNs"); + markResourceLoaded(); + } + public void onFailure(final Throwable caught) { + markResourceLoaded(); + } + }); + } + + private void closeDialog() { + this.window.hide(); + } + + private Component createGHNForm() { + FormPanel panel = new FormPanel(); + panel.setFrame(true); + panel.getHeader().setStyleName("x-hide-panel-header"); + + DualListField lists = new DualListField(); + lists.setFieldLabel("GHNs"); + + ListField from = lists.getFromList(); + from.setDisplayField("name"); + GHNstore.setStoreSorter(new StoreSorter()); + GHNstore.setSortField("name"); + from.setStore(GHNstore); + ListField to = lists.getToList(); + to.setDisplayField("name"); + to.setStore(this.selectedGHNs); + + panel.addButton(new Button("Cancel") { + @Override + protected void onClick(final ComponentEvent ce) { + super.onClick(ce); + closeDialog(); + } + }); + panel.addButton(new Button("Apply Deploy") { + @Override + protected void onClick(final ComponentEvent ce) { + super.onClick(ce); + MessageBox.confirm("Software Deployment", + "Are you sure you want to apply the deployment plan?", + new Listener() { + public void handleEvent(final MessageBoxEvent be) { + if (be.getButtonClicked().getItemId().equalsIgnoreCase("yes")) { + // - THE OPERATION IS CONFIRMED + List ghns = getSelectedGHNs(); + List sw = getSelectedSoftwares(); + + if (ghns == null || ghns.size() == 0) { + MessageBox.alert("Service Deployment", "No GHNs have been selected", null); + return; + } + if (sw == null || sw.size() == 0) { + MessageBox.alert("Service Deployment", "No softwares have been selected", null); + return; + } + + List ghnNames = new Vector(); + for (ModelData m : ghns) { + String name = m.get("name").toString(); + ghnNames.add(name); + } + List swIDs = new Vector(); + for (ModelData m : sw) { + swIDs.add(((Object) m.get("ID")).toString()); + } + ConsoleMessageBroker.info(this, "Applying deployment of " + swIDs.size() + " softwares on " + ghnNames.size() + " gHNs"); + Commands.mask("Waiting the deployment report", UIIdentifiers.GLOBAL_STATUS_BAR_ID); + ProxyRegistry.getProxyInstance().deploy( + ghnNames, + swIDs, + new AsyncCallback() { + public void onSuccess(final String result) { + if (result != null) { + MessageBox.info("Service Deployment", + "The required deployment has been applied.
" + + "The generated report ID is:
" + + "" + result + "", + null); + ProxyRegistry.getProxyInstance().checkDeployStatus( + StatusHandler.getStatus().getCurrentScope(), + result.trim(), + Callbacks.handleGetDeploymentReport); + } else { + MessageBox.alert("Service Deployment", + "The required deployment has been applied.
" + + "But the resulting report ID is null or invalid.", + null); + Commands.unmask(UIIdentifiers.GLOBAL_STATUS_BAR_ID); + } + } + public void onFailure(final Throwable caught) { + Commands.unmask(UIIdentifiers.GLOBAL_STATUS_BAR_ID); + MessageBox.alert("Service Deployment error", + "The required deployment has not been applied. " + + "Received exception:
" + caught.getMessage(), + null); + } + }); + + closeDialog(); + } + } + }); + + } + }); + + panel.add(lists, new FormData("100%")); + return panel; + } + + private List getSelectedGHNs() { + return this.selectedGHNs.getModels(); + } + + private List getSelectedSoftwares() { + List retval = new Vector(); + if (serviceContainer.getWidget(0) == null || + !(serviceContainer.getWidget(0) instanceof Grid)) { + return null; + } + @SuppressWarnings("unchecked") + Grid grid = (Grid) serviceContainer.getWidget(0); + if (grid.getSelectionModel().getSelectedItems() == null) { + return null; + } + Object toDeploy = null; + for (ModelData m : grid.getStore().getModels()) { + toDeploy = m.get(ResourceDetailModel.SERVICE_INSTALL_KEY); + if (toDeploy != null && Boolean.parseBoolean(toDeploy.toString())) { + retval.add(m); + } + } + return retval; + } + + private void loadSoftwares(final String scope) { + + ProxyRegistry.getProxyInstance().getResourcesByType( + scope, + ResourceTypeDecorator.Service.name(), + new AsyncCallback>() { + + public void onSuccess(final List result) { + Grid grid = + ResourceGridFactory.createGrid(ResourceTypeDecorator.InstallableSoftware.name(), + result, + null, + false); + + /****************************************** + * ADD TO INSTALL FEATURE + *****************************************/ + // 0 - INSTALL button + MenuItem toInstall = new MenuItem("Mark for install") { + @Override + protected void onClick(final ComponentEvent be) { + super.onClick(be); + + if (serviceContainer.getWidget(0) == null || + !(serviceContainer.getWidget(0) instanceof Grid)) { + return; + } + @SuppressWarnings("unchecked") + Grid grid = (Grid) serviceContainer.getWidget(0); + if (grid.getSelectionModel().getSelectedItems() == null) { + return; + } + + for (ModelData e : grid.getSelectionModel().getSelectedItems()) { + ConsoleMessageBroker.info(this, "Required install for: " + e.get("ServiceName") + " " + e.get("ID")); + if (e.getProperties().containsKey(ResourceDetailModel.SERVICE_INSTALL_KEY) && + Boolean.parseBoolean(((Object) e.get(ResourceDetailModel.SERVICE_INSTALL_KEY)).toString())) + { + e.set(ResourceDetailModel.SERVICE_INSTALL_KEY, false); + } else { + e.set(ResourceDetailModel.SERVICE_INSTALL_KEY, true); + } + grid.getStore().update(e); + } + } + }; + Commands.evaluateCredentials( + toInstall, + SupportedOperations.SERVICE_DEPLOY.getPermissions()); + + Menu menu = new Menu(); + menu.add(toInstall); + grid.setContextMenu(menu); + /****************************************** + * ENDOF ADD TO INSTALL FEATURE + *****************************************/ + + serviceContainer.removeAll(); + serviceContainer.add(grid); + serviceContainer.layout(true); + Commands.showPopup("Service load", "Loaded " + result.size() + " services"); + markResourceLoaded(); + } + + public void onFailure(final Throwable caught) { + markResourceLoaded(); + } + }); + } + + private void init() { + this.rootPanel = new ContentPanel(); + this.rootPanel.getHeader().setStyleName("x-hide-panel-header"); + this.rootPanel.setHeaderVisible(false); + this.rootPanel.setLayout(new RowLayout(Orientation.VERTICAL)); + + this.rootPanel.add(this.ghnContainer, new RowData(1, .4, new Margins(4))); + this.rootPanel.add(this.serviceContainer, new RowData(1, .6, new Margins(0, 4, 0, 4))); + + String scope = StatusHandler.getStatus().getCurrentScope(); + + Commands.mask("Loading Deployment Resources in scope: " + scope, Commands.getViewport()); + Commands.mask("Loading Deployment Resources in scope: " + scope, this.rootPanel); + + this.loadGHNs(scope); + this.loadSoftwares(scope); + } + + public final void show() { + window.setPlain(true); + window.setSize(800, 600); + window.setHeading("Software Deployment"); + window.setLayout(new FitLayout()); + window.add(this.rootPanel); + window.show(); + window.layout(true); + } +} diff --git a/src/main/java/org/gcube/portlets/admin/resourcemanagement/client/forms/genericresources/ActivationRecordVMForm.java b/src/main/java/org/gcube/portlets/admin/resourcemanagement/client/forms/genericresources/ActivationRecordVMForm.java new file mode 100644 index 0000000..7c3d086 --- /dev/null +++ b/src/main/java/org/gcube/portlets/admin/resourcemanagement/client/forms/genericresources/ActivationRecordVMForm.java @@ -0,0 +1,420 @@ +/**************************************************************************** += * This software is part of the gCube Project. + * Site: http://www.gcube-system.org/ + **************************************************************************** + * The gCube/gCore software is licensed as Free Open Source software + * conveying to the EUPL (http://ec.europa.eu/idabc/eupl). + * The software and documentation is provided by its authors/distributors + * "as is" and no expressed or + * implied warranty is given for its use, quality or fitness for a + * particular case. + **************************************************************************** + * Filename: ActivationRecordVMForm.java + **************************************************************************** + * @author Daniele Strollo + ***************************************************************************/ + +package org.gcube.portlets.admin.resourcemanagement.client.forms.genericresources; + +import java.util.List; +import java.util.Vector; +import org.gcube.portlets.admin.resourcemanagement.client.remote.ProxyRegistry; +import org.gcube.portlets.admin.resourcemanagement.client.utils.Commands; +import org.gcube.portlets.admin.resourcemanagement.client.utils.OpCommands; + + +import org.gcube.resourcemanagement.support.client.utils.StatusHandler; +import org.gcube.resourcemanagement.support.client.views.ResourceTypeDecorator; +import org.gcube.resourcemanagement.support.client.views.validators.SelectValidator; +import org.gcube.resourcemanagement.support.shared.exceptions.InvalidParameterException; +import org.gcube.resourcemanagement.support.shared.types.Tuple; +import org.gcube.resourcemanagement.support.shared.types.datamodel.AtomicTreeNode; +import org.gcube.resourcemanagement.support.shared.types.datamodel.ResourceDescriptor; + +import com.extjs.gxt.ui.client.Style.HorizontalAlignment; +import com.extjs.gxt.ui.client.Style.Scroll; +import com.extjs.gxt.ui.client.data.ModelData; +import com.extjs.gxt.ui.client.event.ComponentEvent; +import com.extjs.gxt.ui.client.store.ListStore; +import com.extjs.gxt.ui.client.widget.Dialog; +import com.extjs.gxt.ui.client.widget.HorizontalPanel; +import com.extjs.gxt.ui.client.widget.MessageBox; +import com.extjs.gxt.ui.client.widget.button.Button; +import com.extjs.gxt.ui.client.widget.form.ComboBox; +import com.extjs.gxt.ui.client.widget.form.Field; +import com.extjs.gxt.ui.client.widget.form.FieldSet; +import com.extjs.gxt.ui.client.widget.form.FormButtonBinding; +import com.extjs.gxt.ui.client.widget.form.FormPanel; +import com.extjs.gxt.ui.client.widget.form.TextArea; +import com.extjs.gxt.ui.client.widget.form.TextField; +import com.extjs.gxt.ui.client.widget.form.ComboBox.TriggerAction; +import com.extjs.gxt.ui.client.widget.layout.FitLayout; +import com.extjs.gxt.ui.client.widget.layout.FormData; +import com.extjs.gxt.ui.client.widget.layout.FormLayout; +import com.google.gwt.user.client.Element; +import com.google.gwt.user.client.rpc.AsyncCallback; + +enum StaticFields { + VIEW_NAME("name", "e.g.: the name of the property", "e.g.: put here the name"), + METADATA_NAME("schemaName", "e.g.: metadata prefix", "e.g.: FARM_dc"), + METADATA_LANG("language", "e.g.: metadata language", "e.g.: en"), + METADATA_SCHEMA("schemaURI", "e.g.: metadata schema", "e.g.: http://193.43.36.238:8282/fi/figis/devcon/schema/dc/qualifieddc.xsd"), + IS_EDITABLE("isEditable", "e.g.: editable", "e.g.: true"), + IS_INDEXABLE("isIndexable", "e.g.: indexable", "e.g.: true"), + IS_USER_COLLECTION("isUserCollection", "e.g.: user collection", "e.g.: true"); + + private String name = null; + private String description = null; + private String value = null; + + + private StaticFields(final String name, final String description, final String value) { + this.name = name; + this.description = description; + this.value = value; + } + + + public String getName() { + return name; + } + + public String getDescription() { + return description; + } + + public String getValue() { + return value; + } +} + +public class ActivationRecordVMForm extends Dialog { + private FormData formData = null; + private FormPanel form = null; + + public ActivationRecordVMForm() { + this.setLayout(new FitLayout()); + this.setHeading("Activation Record for VM"); + this.setModal(true); + this.setWidth(700); + this.setHeight(500); + this.setResizable(false); + this.getButtonBar().removeAll(); + this.setHideOnButtonClick(true); + } + + @Override + protected final void onRender(final Element parent, final int index) { + super.onRender(parent, index); + formData = new FormData("-20"); + createForm(); + } + + public final void closeDialog() { + this.hide(); + } + + private void addStaticProperty(final String pfield, final String pdescription, final String pvalue) { + final FieldSet fieldSet = new FieldSet(); + fieldSet.setLayout(new FormLayout()); + + fieldSet.setHeading("Property"); + fieldSet.setCollapsible(false); + + TextField name = new TextField(); + name.setFieldLabel("Name"); + name.setValue(pfield); + name.setEnabled(false); + name.setAllowBlank(false); + fieldSet.add(name, formData); + + TextField description = new TextField(); + description.setFieldLabel("Description"); + description.setEmptyText(pdescription); + description.setAllowBlank(true); + fieldSet.add(description, formData); + + TextField value = new TextField(); + value.setFieldLabel("Value"); + value.setEmptyText(pvalue); + value.setAllowBlank(false); + fieldSet.add(value, formData); + + form.add(fieldSet, formData); + fieldSet.recalculate(); + this.doLayout(true); + } + + private void addProperty() { + final FieldSet fieldSet = new FieldSet(); + fieldSet.setLayout(new FormLayout()); + + fieldSet.setHeading("Property"); + fieldSet.setCollapsible(false); + + TextField name = new TextField(); + name.setFieldLabel("Name"); + name.setAllowBlank(false); + fieldSet.add(name, formData); + + TextField description = new TextField(); + description.setFieldLabel("Description"); + description.setAllowBlank(true); + fieldSet.add(description, formData); + + TextField value = new TextField(); + value.setFieldLabel("Value"); + value.setAllowBlank(false); + fieldSet.add(value, formData); + + final HorizontalPanel buttonPanel = new HorizontalPanel(); + Button addButton = new Button("Add New Property") { + @Override + protected void onClick(final ComponentEvent ce) { + addProperty(); + } + }; + addButton.setIconStyle("new-icon"); + buttonPanel.add(addButton); + + Button delButton = new Button("Remove This Property") { + @Override + protected void onClick(final ComponentEvent ce) { + form.remove(fieldSet); + } + }; + delButton.setIconStyle("delete-icon"); + buttonPanel.add(delButton); + fieldSet.add(buttonPanel, formData); + + form.add(fieldSet, formData); + fieldSet.recalculate(); + this.doLayout(true); + } + + private void createForm() { + form = new FormPanel(); + form.setFrame(true); + form.setAutoWidth(true); + + //form.setLayout(new FlowLayout()); + form.setScrollMode(Scroll.AUTO); + + form.setHeaderVisible(false); + form.getHeader().setStyleName("x-hide-panel-header"); + + TextField resID = new TextField(); + resID.setFieldLabel("Resource ID"); + resID.setEnabled(false); + resID.setAllowBlank(true); // is required + + resID.setEmptyText(""); + + form.add(resID, formData); + + TextField resName = new TextField(); + resName.setFieldLabel("Resource Name"); + resName.setValue("VMRecord"); + resName.setEnabled(false); + //resName.setValidator(new StringValidator(20, false)); + resName.setAllowBlank(false); // is required + form.add(resName, formData); + + TextField resType = new TextField(); + resType.setFieldLabel("Secondary type"); + resType.setValue("ActivationRecord"); + resType.setEnabled(false); + // resType.setValidator(new StringValidator(20, false)); + resType.setAllowBlank(false); // is required + form.add(resType, formData); + + TextArea description = new TextArea(); + description.setFieldLabel("Description"); + form.add(description, formData); + + ComboBox pluginSelect = new ComboBox(); + ListStore storePlugin = new ListStore(); + storePlugin.add(new AtomicTreeNode("Metadata")); + storePlugin.add(new AtomicTreeNode("Annotation")); + pluginSelect.setStore(storePlugin); + pluginSelect.setFieldLabel("Plugin Kind:"); + pluginSelect.setEmptyText("Select a plugin..."); + pluginSelect.setTypeAhead(true); + pluginSelect.setTriggerAction(TriggerAction.ALL); + pluginSelect.setDisplayField("name"); + pluginSelect.setForceSelection(true); + form.add(pluginSelect, formData); + + // The select for collections + ComboBox collectionSelect = new ComboBox(); + ListStore store = new ListStore(); + try { + store.add(new ResourceDescriptor("type", "subtype", "ID", "the name")); + } catch (InvalidParameterException e) { + e.printStackTrace(); + } + collectionSelect.setStore(store); + collectionSelect.setFieldLabel("Collection"); + collectionSelect.setEmptyText("Select a collection..."); + collectionSelect.setDisplayField("name"); + collectionSelect.setTypeAhead(true); + collectionSelect.setTriggerAction(TriggerAction.ALL); + collectionSelect.setForceSelection(true); + collectionSelect.setData("text", "Select a collection"); + + form.add(collectionSelect, formData); + + loadCollections(StatusHandler.getStatus().getCurrentScope(), collectionSelect); + // -- ENDOF The select for collections + + // Inserts the static fields + for (StaticFields entry : StaticFields.values()) { + this.addStaticProperty(entry.getName(), entry.getDescription(), entry.getValue()); + } + + HorizontalPanel buttonPanel = new HorizontalPanel(); + Button addButton = new Button("Add New Property") { + @Override + protected void onClick(final ComponentEvent ce) { + addProperty(); + } + }; + addButton.setIconStyle("new-icon"); + buttonPanel.add(addButton); + + form.add(buttonPanel, formData); + + Button submitBtn = new Button("Submit") { + @Override + protected void onClick(final ComponentEvent ce) { + super.onClick(ce); + if (!form.isValid()) { + return; + } + + List> fields = form.getFields(); + + // Creation mode + // the parameter in position 0 is the + // auto-generated ID. + String resName = fields.get(1).getRawValue(); + String resType = fields.get(2).getRawValue(); + String description = fields.get(3).getRawValue(); + String plugin = fields.get(4).getRawValue() + "Plugin"; + String viewType = fields.get(4).getRawValue() + "View"; + String viewID = generateID(); + + String collectionID = ((ResourceDescriptor) fields.get(5).getValue()).getID(); + + // builds a list of tuples each one representing a single property + // properties are supposed to be represented by three fields each one. + List> properties = new Vector>(); + if (fields.size() > StaticFields.values().length - 1) { + for (int i = StaticFields.values().length - 1; i < fields.size(); i = i + 3) { + properties.add(new Tuple( + fields.get(i).getRawValue().trim(), + (fields.get(i + 1).getRawValue() != null) ? fields.get(i + 1).getRawValue().trim() : "", // description can be null + fields.get(i + 2).getRawValue().trim())); + } + } else { + MessageBox.alert("Create Activation Form for VM", "No properties defined", null); + return; + } + + StringBuilder body = new StringBuilder(); + + body.append(""); + body.append("ResourceManagementPortlet"); + body.append("" + plugin + ""); + + body.append(""); + + body.append("" + viewID + ""); + body.append("" + collectionID + ""); + body.append("" + viewType + ""); + body.append(""); + body.append("" + fields.get(4).getRawValue() + " view for collection " + collectionID + ""); + body.append("0"); + body.append("" + "2010-10-25T14:01:55.948+00:00" + ""); + + for (Tuple prop : properties) { + body.append(""); + + body.append("" + prop.get(0) + ""); + body.append("" + prop.get(1) + ""); + body.append("" + prop.get(2) + ""); + + body.append(""); + } + + body.append(""); + body.append(""); + + OpCommands.doCreateGenericResource(viewID, resName, description, body.toString(), resType); + closeDialog(); + } + }; + form.addButton(submitBtn); + form.addButton(new Button("Cancel") { + @Override + protected void onClick(final ComponentEvent ce) { + super.onClick(ce); + closeDialog(); + } + }); + + form.setButtonAlign(HorizontalAlignment.CENTER); + + FormButtonBinding binding = new FormButtonBinding(form); + binding.addButton(submitBtn); + + this.add(form); + } + + private String generateID() { + char[] s = new char[36]; + String itoh = "0123456789abcdef"; + + // Make array of random hex digits. The UUID only has 32 digits in it, but we + // allocate an extra items to make room for the '-'s we'll be inserting. + for (int i = 0; i < 36; i++) { + s[i] = (char) Math.floor(Math.random() * 0x10); + } + + // Conform to RFC-4122, section 4.4 + s[14] = 4; // Set 4 high bits of time_high field to version + s[19] = (char) ((s[19] & 0x3) | 0x8); // Specify 2 high bits of clock sequence + + // Convert to hex chars + for (int i = 0; i < 36; i++) { + s[i] = itoh.charAt((int) s[i]); + } + + // Insert '-'s + s[8] = s[13] = s[18] = s[23] = '-'; + return new String(s); + } + + private void loadCollections(final String scope, final ComboBox combo) { + ProxyRegistry.getProxyInstance().getResourcesModel(scope, + ResourceTypeDecorator.GenericResource.name(), + "GCUBECollection", + null, + new AsyncCallback>() { + + public void onSuccess(final List result) { + combo.getStore().removeAll(); + combo.getStore().add(result); + + combo.setValidator(new SelectValidator(false)); + combo.setAllowBlank(false); + combo.setTriggerAction(TriggerAction.ALL); + combo.recalculate(); + Commands.showPopup("Collection load", "Loaded (" + result.size() + ") Collections"); + } + public void onFailure(final Throwable e) { + MessageBox.alert("Error getting collections", e.getMessage(), null); + } + }); + } +} diff --git a/src/main/java/org/gcube/portlets/admin/resourcemanagement/client/forms/genericresources/DeployVirtualCollection.java b/src/main/java/org/gcube/portlets/admin/resourcemanagement/client/forms/genericresources/DeployVirtualCollection.java new file mode 100644 index 0000000..16ec8b1 --- /dev/null +++ b/src/main/java/org/gcube/portlets/admin/resourcemanagement/client/forms/genericresources/DeployVirtualCollection.java @@ -0,0 +1,173 @@ +/**************************************************************************** + * This software is part of the gCube Project. + * Site: http://www.gcube-system.org/ + **************************************************************************** + * The gCube/gCore software is licensed as Free Open Source software + * conveying to the EUPL (http://ec.europa.eu/idabc/eupl). + * The software and documentation is provided by its authors/distributors + * "as is" and no expressed or + * implied warranty is given for its use, quality or fitness for a + * particular case. + **************************************************************************** + * Filename: DeployVirtualCollection.java + **************************************************************************** + * @author Daniele Strollo + ***************************************************************************/ + +package org.gcube.portlets.admin.resourcemanagement.client.forms.genericresources; + +import java.util.ArrayList; +import java.util.List; +import java.util.Vector; + +import org.gcube.portlets.admin.resourcemanagement.client.remote.ProxyRegistry; +import org.gcube.portlets.admin.resourcemanagement.client.utils.Commands; +import org.gcube.portlets.admin.resourcemanagement.client.widgets.console.ConsoleMessageBroker; + +import org.gcube.resourcemanagement.support.client.utils.StatusHandler; +import org.gcube.resourcemanagement.support.client.views.ResourceTypeDecorator; +import org.gcube.resourcemanagement.support.shared.exceptions.InvalidParameterException; +import org.gcube.resourcemanagement.support.shared.types.Tuple; +import org.gcube.resourcemanagement.support.shared.types.datamodel.AtomicTreeNode; +import org.gcube.resourcemanagement.support.shared.types.datamodel.ResourceDescriptor; +import com.extjs.gxt.ui.client.data.ModelData; +import com.extjs.gxt.ui.client.event.ComponentEvent; +import com.extjs.gxt.ui.client.store.ListStore; +import com.extjs.gxt.ui.client.widget.Dialog; +import com.extjs.gxt.ui.client.widget.MessageBox; +import com.extjs.gxt.ui.client.widget.button.Button; +import com.extjs.gxt.ui.client.widget.form.FormPanel; +import com.extjs.gxt.ui.client.widget.grid.CheckBoxSelectionModel; +import com.extjs.gxt.ui.client.widget.grid.ColumnConfig; +import com.extjs.gxt.ui.client.widget.grid.ColumnModel; +import com.extjs.gxt.ui.client.widget.grid.Grid; +import com.extjs.gxt.ui.client.widget.layout.FitLayout; +import com.extjs.gxt.ui.client.widget.toolbar.FillToolItem; +import com.google.gwt.user.client.Element; +import com.google.gwt.user.client.rpc.AsyncCallback; + +/** + * @author Daniele Strollo (ISTI-CNR) + * + */ +public class DeployVirtualCollection extends Dialog { + private Grid grid = null; + + public DeployVirtualCollection() { + this.setLayout(new FitLayout()); + this.setHeading("Deploy Virtual Collections"); + this.setModal(true); + this.setWidth(700); + this.setHeight(500); + this.setResizable(false); + //this.getButtonBar().removeAll(); + this.setHideOnButtonClick(true); + } + + protected final void onRender(final Element parent, final int index) { + super.onRender(parent, index); + initForm(); + } + + private void closeDialog() { + this.hide(); + } + + private void initForm() { + String scope = StatusHandler.getStatus().getCurrentScope(); + FormPanel form = new FormPanel(); + form.setFrame(true); + form.setAutoWidth(true); + + initModel(scope); + this.add(grid); + + this.getButtonBar().removeAll(); + this.getButtonBar().add(new FillToolItem()); + this.getButtonBar().add(new Button("Cancel") { + @Override + protected void onClick(final ComponentEvent ce) { + super.onClick(ce); + closeDialog(); + } + }); + this.getButtonBar().add(new Button("Submit") { + @Override + protected void onClick(final ComponentEvent ce) { + super.onClick(ce); + for (ResourceDescriptor elem : grid.getSelectionModel().getSelectedItems()) { + ConsoleMessageBroker.info(this, "Selected: " + elem.getID()); + + String body = ""; + if (elem.getProperty("body") != null) { + body = ((Object) elem.getProperty("body")).toString().trim(); + if (body.startsWith("")) { + body = body.replace("", "").trim(); + body = body.substring(0, body.lastIndexOf("")).trim(); + } + } + + ProxyRegistry.getProxyInstance().createGenericResource( + null, // id auto-provided + "CMSRecord", // name fixed + "Activation Record for collection " + elem.getName(), // description + body, // the body + "ActivationRecord", // the subtype + new AsyncCallback() { + public void onSuccess(final String result) { + Commands.showPopup("Deploy Virtual Collection", "Deployed virtual collection with id " + result); + } + public void onFailure(final Throwable caught) { + Commands.showPopup("Deploy Virtual Collection", "Creation failed " + caught.getMessage()); + } + }); + } + closeDialog(); + } + }); + + updateGrid(scope); + } + + private void initModel(final String scope) { + // loads the model of generic resources + final List modelColumns = new ArrayList(); + modelColumns.add(new ColumnConfig("name", "Name", 300)); + //modelColumns.add(new ColumnConfig("subtype", "Secondary Type", 170)); + modelColumns.add(new ColumnConfig("ID", "ID", 300)); + modelColumns.add(new ColumnConfig("description", "Description", 300)); + final ColumnModel cm = new ColumnModel(modelColumns); + + final CheckBoxSelectionModel sm = new CheckBoxSelectionModel(); + // adds the checkbox at the beginning + modelColumns.add(0, sm.getColumn()); + ListStore store = new ListStore(); + this.grid = new Grid(store, cm); + } + + private void updateGrid(final String scope) { + final List> additionalFields = new Vector>(); + additionalFields.add(new Tuple("description", "//Profile/Description/text()")); + additionalFields.add(new Tuple("body", "//Profile/Body")); + + ProxyRegistry.getProxyInstance().getResourcesModel(scope, + ResourceTypeDecorator.GenericResource.name(), + "VirtualCollection", + additionalFields, + new AsyncCallback>() { + public void onSuccess(final List result) { + if (result == null || result.size() == 0) { + MessageBox.alert("Deploy Virtual Collections", "No deployable resources found in the current scope", + null); + closeDialog(); + } else { + grid.getStore().removeAll(); + grid.getStore().add(result); + } + } + public void onFailure(final Throwable caught) { + ConsoleMessageBroker.error(this, caught.getMessage()); + } + }); + } +} diff --git a/src/main/java/org/gcube/portlets/admin/resourcemanagement/client/forms/genericresources/GenericResourceCMForm.java b/src/main/java/org/gcube/portlets/admin/resourcemanagement/client/forms/genericresources/GenericResourceCMForm.java new file mode 100644 index 0000000..d2355bf --- /dev/null +++ b/src/main/java/org/gcube/portlets/admin/resourcemanagement/client/forms/genericresources/GenericResourceCMForm.java @@ -0,0 +1,329 @@ +/**************************************************************************** + * This software is part of the gCube Project. + * Site: http://www.gcube-system.org/ + **************************************************************************** + * The gCube/gCore software is licensed as Free Open Source software + * conveying to the EUPL (http://ec.europa.eu/idabc/eupl). + * The software and documentation is provided by its authors/distributors + * "as is" and no expressed or + * implied warranty is given for its use, quality or fitness for a + * particular case. + **************************************************************************** + * Filename: GenericResourcePluginForm.java + **************************************************************************** + * @author Daniele Strollo + ***************************************************************************/ + +package org.gcube.portlets.admin.resourcemanagement.client.forms.genericresources; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.Map; + +import org.gcube.portlets.admin.resourcemanagement.client.remote.ProxyRegistry; +import org.gcube.portlets.admin.resourcemanagement.client.utils.OpCommands; +import org.gcube.resourcemanagement.support.client.views.validators.SelectValidator; +import org.gcube.resourcemanagement.support.shared.plugins.GenericResourcePlugin; +import org.gcube.resourcemanagement.support.shared.types.Tuple; +import org.gcube.resourcemanagement.support.shared.types.datamodel.AtomicTreeNode; + +import com.extjs.gxt.ui.client.Style.Scroll; +import com.extjs.gxt.ui.client.data.ModelData; +import com.extjs.gxt.ui.client.event.ComponentEvent; +import com.extjs.gxt.ui.client.event.SelectionChangedEvent; +import com.extjs.gxt.ui.client.event.SelectionChangedListener; +import com.extjs.gxt.ui.client.store.ListStore; +import com.extjs.gxt.ui.client.widget.Component; +import com.extjs.gxt.ui.client.widget.Dialog; +import com.extjs.gxt.ui.client.widget.MessageBox; +import com.extjs.gxt.ui.client.widget.button.Button; +import com.extjs.gxt.ui.client.widget.form.ComboBox; +import com.extjs.gxt.ui.client.widget.form.ComboBox.TriggerAction; +import com.extjs.gxt.ui.client.widget.form.Field; +import com.extjs.gxt.ui.client.widget.form.FieldSet; +import com.extjs.gxt.ui.client.widget.form.FormButtonBinding; +import com.extjs.gxt.ui.client.widget.form.FormPanel; +import com.extjs.gxt.ui.client.widget.form.TextArea; +import com.extjs.gxt.ui.client.widget.form.TextField; +import com.extjs.gxt.ui.client.widget.layout.FitLayout; +import com.extjs.gxt.ui.client.widget.layout.FlowLayout; +import com.extjs.gxt.ui.client.widget.layout.FormData; +import com.extjs.gxt.ui.client.widget.layout.FormLayout; +import com.google.gwt.user.client.Element; +import com.google.gwt.user.client.rpc.AsyncCallback; + +public class GenericResourceCMForm extends Dialog { + private FormData formData = null; + private FormPanel form = null; + private FieldSet pluginFieldSet = null; + private String selectedPlugin = null; + private Map loadedPlugins = null; + private TextField resName = null; + + public GenericResourceCMForm() { + this.setLayout(new FitLayout()); + this.setHeading("Generic Resource Creation (Plugin)"); + this.setModal(true); + this.setWidth(700); + this.setHeight(500); + this.setResizable(false); + this.getButtonBar().removeAll(); + this.setHideOnButtonClick(true); + } + + @Override + protected final void onRender(final Element parent, final int index) { + super.onRender(parent, index); + formData = new FormData("-20"); + createForm(); + createPluginForm(); + this.add(form); + + this.initButtons(); + + this.recalculate(); + this.doLayout(true); + + this.form.mask("Loading plugins..."); + // Gets the plugins + ProxyRegistry.getProxyInstance().getGenericResourcePlugins(new AsyncCallback>() { + public void onSuccess(final Map result) { + addPluginSelect(result); + form.unmask(); + } + + public void onFailure(final Throwable caught) { + MessageBox.alert("Create Generic Resource (Plugin)", + "Received an exception: " + caught.getMessage(), null); + form.unmask(); + } + }); + } + + public final void closeDialog() { + this.hide(); + } + + private void setPluginFields(final GenericResourcePlugin plugin) { + if (plugin.getParams().size() == 0) { + return; + } + Component select = pluginFieldSet.getItem(0); + pluginFieldSet.removeAll(); + pluginFieldSet.add(select); + + for (GenericResourcePlugin.Field field : plugin.getParams()) { + if (field.getType() == GenericResourcePlugin.FieldType.string) { + TextField toAdd = new TextField(); + toAdd.setFieldLabel(field.getLabel() + (field.isRequired() ? "*" : "")); + toAdd.setName(field.getName()); + //toAdd.setValidator(new StringValidator(128, !field.isRequired())); + toAdd.setAllowBlank(!field.isRequired()); // is required + toAdd.setValue(field.getDefaultValue()); + pluginFieldSet.add(toAdd, formData); + pluginFieldSet.recalculate(); + this.doLayout(true); + } + } + } + + private void addPluginSelect(final Map plugins) { + ListStore store = new ListStore(); + for (String pluginName : plugins.keySet()) { + store.add(new AtomicTreeNode(pluginName)); + } + + ComboBox combo = new ComboBox(); + combo.setFieldLabel("Plugin"); + combo.addSelectionChangedListener(new SelectionChangedListener() { + @Override + public void selectionChanged(final SelectionChangedEvent se) { + if (se != null && + se.getSelection() != null + && se.getSelection() instanceof ArrayList) { + @SuppressWarnings("rawtypes") + String selection = ((ArrayList) se.getSelection()).get(0).toString(); + selectedPlugin = selection; + setPluginFields(loadedPlugins.get(selection)); + } + } + }); + combo.setEmptyText("Select a plugin..."); + combo.setDisplayField("name"); + combo.setStore(store); + combo.setTypeAhead(true); + combo.setValidator(new SelectValidator(false)); + combo.setAllowBlank(false); + combo.setForceSelection(true); + combo.setTriggerAction(TriggerAction.ALL); + combo.recalculate(); + + + pluginFieldSet.recalculate(); + pluginFieldSet.add(combo, formData); + this.doLayout(true); + this.loadedPlugins = plugins; + } + + private void createForm() { + form = new FormPanel(); + form.setFrame(true); + form.setAutoWidth(true); + + form.setHeaderVisible(false); + form.getHeader().setStyleName("x-hide-panel-header"); + form.setLayout(new FlowLayout()); + + form.setScrollMode(Scroll.AUTO); + + FieldSet formHead = new FieldSet(); + formHead.setHeading("Basic parameters"); + formHead.setCollapsible(true); + + FormLayout layout = new FormLayout(); + layout.setLabelWidth(90); + formHead.setLayout(layout); + + TextField resID = new TextField(); + resID.setFieldLabel("Resource ID"); + // resID.setValidator(new StringValidator(64, false)); + resID.setAllowBlank(false); // is required + // If in editing mode + + resID.setEmptyText(""); + resID.setEnabled(false); + formHead.add(resID, formData); + + this.resName = new TextField(); + resName.setFieldLabel("Resource Name"); + // resName.setValidator(new StringValidator(64, false)); + resName.setAllowBlank(false); // is required + resName.setValue("CMSRecord"); + resName.setEnabled(false); + formHead.add(resName, formData); + + ComboBox resType = new ComboBox(); + ListStore storePlugin = new ListStore(); + storePlugin.add(new AtomicTreeNode("ActivationRecord")); + storePlugin.add(new AtomicTreeNode("VirtualCollection")); + resType.setStore(storePlugin); + resType.setFieldLabel("Secondary Type"); + //resType.setEmptyText("Select a subtype..."); + resType.setValue(storePlugin.getAt(0)); + resType.setDisplayField("name"); + resType.setAllowBlank(false); + resType.setTypeAhead(true); + resType.setTriggerAction(TriggerAction.ALL); + resType.setForceSelection(true); + resType.addSelectionChangedListener(new SelectionChangedListener() { + @Override + public void selectionChanged(final SelectionChangedEvent se) { + // The usual casting trick for fixing invalid class specification + // of generic return in models. + if (se.getSelection().get(0).getName().equals("VirtualCollection")) { + resName.setFieldLabel("Collection Name"); + resName.setValue(null); + resName.setEnabled(true); + } else { + resName.setFieldLabel("Resource Name"); + resName.setValue("CMSRecord"); + resName.setEnabled(false); + } + } + }); + formHead.add(resType, formData); + + TextArea description = new TextArea(); + description.setFieldLabel("Description"); + description.setPreventScrollbars(false); + //description.setHeight(50); + formHead.add(description, formData); + + form.add(formHead); + } + + private void createPluginForm() { + this.pluginFieldSet = new FieldSet(); + pluginFieldSet.setHeading("Plugin parameters"); + pluginFieldSet.setCollapsible(true); + + FormLayout layout = new FormLayout(); + layout.setLabelWidth(110); + pluginFieldSet.setLayout(layout); + form.add(pluginFieldSet); + } + + public final void initButtons() { + Button submitBtn = new Button("Submit") { + @SuppressWarnings("deprecation") + @Override + protected void onClick(final ComponentEvent ce) { + super.onClick(ce); + if (!form.isValid()) { + return; + } + Tuple values = new Tuple(); + for (Field field : form.getFields()) { + values.append(field.getRawValue()); + } + + String resName = values.get(1); + String resType = values.get(2); + String description = values.get(3); + + StringBuilder body = new StringBuilder(); + body.append(""); + body.append("ResourceManagementPortlet"); + body.append(""); + body.append("true"); + + if (selectedPlugin == null) { + return; + } + GenericResourcePlugin plugin = loadedPlugins.get(selectedPlugin); + body.append(""); + Map submitted = new HashMap(); + for (Field field : form.getFields()) { + submitted.put(field.getName(), field.getRawValue()); + } + if (plugin.getParams() != null && plugin.getParams().size() > 0) { + for (GenericResourcePlugin.Field field : plugin.getParams()) { + try { + String tag = field.getName(); + String value = submitted.get(tag).toString(); + if (value != null && value.trim().length() > 0) { + body.append("<" + tag + ">" + value + ""); + } + } catch (RuntimeException e) { + // parsing errors will be skipped + } + } + } + + body.append(""); + body.append("" + plugin.getName() + ""); + body.append(""); + body.append(""); + + OpCommands.doCreateGenericResource(null, resName, description, body.toString(), resType); + + + closeDialog(); + } + }; + this.form.addButton(submitBtn); + + this.form.addButton(new Button("Cancel") { + @Override + protected void onClick(final ComponentEvent ce) { + super.onClick(ce); + closeDialog(); + } + }); + + ///form.setButtonAlign(HorizontalAlignment.CENTER); + + FormButtonBinding binding = new FormButtonBinding(form); + binding.addButton(submitBtn); + } +} diff --git a/src/main/java/org/gcube/portlets/admin/resourcemanagement/client/forms/genericresources/GenericResourceForm.java b/src/main/java/org/gcube/portlets/admin/resourcemanagement/client/forms/genericresources/GenericResourceForm.java new file mode 100644 index 0000000..6780998 --- /dev/null +++ b/src/main/java/org/gcube/portlets/admin/resourcemanagement/client/forms/genericresources/GenericResourceForm.java @@ -0,0 +1,183 @@ +/**************************************************************************** + * This software is part of the gCube Project. + * Site: http://www.gcube-system.org/ + **************************************************************************** + * The gCube/gCore software is licensed as Free Open Source software + * conveying to the EUPL (http://ec.europa.eu/idabc/eupl). + * The software and documentation is provided by its authors/distributors + * "as is" and no expressed or + * implied warranty is given for its use, quality or fitness for a + * particular case. + **************************************************************************** + * Filename: GenericResourceForm.java + **************************************************************************** + * @author Daniele Strollo + ***************************************************************************/ + +package org.gcube.portlets.admin.resourcemanagement.client.forms.genericresources; + +import org.gcube.portlets.admin.resourcemanagement.client.utils.OpCommands; +import org.gcube.resourcemanagement.support.client.views.validators.XMLValidator; +import org.gcube.resourcemanagement.support.shared.types.Tuple; +import org.gcube.resourcemanagement.support.shared.types.datamodel.ResourceDescriptor; + +import com.extjs.gxt.ui.client.Style.HorizontalAlignment; +import com.extjs.gxt.ui.client.event.ComponentEvent; +import com.extjs.gxt.ui.client.widget.Dialog; +import com.extjs.gxt.ui.client.widget.button.Button; +import com.extjs.gxt.ui.client.widget.form.Field; +import com.extjs.gxt.ui.client.widget.form.FormButtonBinding; +import com.extjs.gxt.ui.client.widget.form.FormPanel; +import com.extjs.gxt.ui.client.widget.form.TextArea; +import com.extjs.gxt.ui.client.widget.form.TextField; +import com.extjs.gxt.ui.client.widget.layout.FitLayout; +import com.extjs.gxt.ui.client.widget.layout.FormData; +import com.google.gwt.user.client.Element; + +public class GenericResourceForm extends Dialog { + private FormData formData = null; + private FormPanel form = null; + private ResourceDescriptor toEdit = null; + + public GenericResourceForm() { + this.setLayout(new FitLayout()); + this.setHeading("Generic Resource Creation"); + this.setModal(true); + this.setWidth(700); + this.setHeight(500); + this.setResizable(false); + this.getButtonBar().removeAll(); + this.setHideOnButtonClick(true); + } + + // Added for editing mode + public GenericResourceForm(final ResourceDescriptor genericRes) { + this(); + this.setHeading("Generic Resource Edit"); + this.toEdit = genericRes; + } + + @Override + protected final void onRender(final Element parent, final int index) { + super.onRender(parent, index); + formData = new FormData("-20"); + createForm(); + } + + public final void closeDialog() { + this.hide(); + } + + private boolean isEditing() { + return this.toEdit != null; + } + + private void createForm() { + form = new FormPanel(); + form.setFrame(true); + form.setAutoWidth(true); + + form.setHeaderVisible(false); + form.getHeader().setStyleName("x-hide-panel-header"); + + TextField resID = new TextField(); + resID.setFieldLabel("Resource ID"); + // resID.setValidator(new StringValidator(120, false)); + resID.setAllowBlank(false); // is required + // If in editing mode + if (toEdit != null && toEdit.getID() != null) { + resID.setValue(toEdit.getID()); + } else { + resID.setEmptyText(""); + } + resID.setEnabled(false); + form.add(resID, formData); + + TextField resName = new TextField(); + resName.setFieldLabel("Resource Name"); + // resName.setValidator(new StringValidator(120, false)); + resName.setAllowBlank(false); // is required + // If in editing mode + if (toEdit != null && toEdit.getName() != null) { + resName.setValue(toEdit.getName()); + } + form.add(resName, formData); + + TextField resType = new TextField(); + resType.setFieldLabel("Secondary type"); + // resType.setValidator(new StringValidator(120, false)); + resType.setAllowBlank(false); // is required + // If in editing mode + if (toEdit != null && toEdit.get("SecondaryType") != null) { + resType.setValue(((Object) toEdit.get("SecondaryType")).toString()); + } + form.add(resType, formData); + + TextArea description = new TextArea(); + description.setFieldLabel("Description"); + // If in editing mode + if (toEdit != null && toEdit.get("Description") != null) { + description.setValue(((Object) toEdit.get("Description")).toString()); + } + form.add(description, formData); + + TextArea body = new TextArea(); + body.setFieldLabel("Body"); + body.setHeight(235); + body.setValidator(new XMLValidator("body")); + // If in editing mode + if (toEdit != null && toEdit.get("Body") != null) { + body.setValue(((Object) toEdit.get("Body")).toString()); + } + form.add(body, formData); + + Button submitBtn = new Button("Submit") { + @SuppressWarnings("deprecation") + @Override + protected void onClick(final ComponentEvent ce) { + super.onClick(ce); + if (!form.isValid()) { + return; + } + Tuple values = new Tuple(); + for (Field field : form.getFields()) { + values.append(field.getRawValue()); + } + // Creation mode + if (!isEditing()) { + String resName = values.get(1); + String resType = values.get(2); + String description = values.get(3); + String body = values.get(4); + + OpCommands.doCreateGenericResource(null, resName, description, body, resType); + } else { + // Editing mode + String resID = values.get(0); + String resName = values.get(1); + String resType = values.get(2); + String description = values.get(3); + String body = values.get(4); + OpCommands.doEditGenericResource(resID, resName, description, body, resType); + } + + closeDialog(); + } + }; + form.addButton(submitBtn); + form.addButton(new Button("Cancel") { + @Override + protected void onClick(final ComponentEvent ce) { + super.onClick(ce); + closeDialog(); + } + }); + + form.setButtonAlign(HorizontalAlignment.CENTER); + + FormButtonBinding binding = new FormButtonBinding(form); + binding.addButton(submitBtn); + + this.add(form); + } +} diff --git a/src/main/java/org/gcube/portlets/admin/resourcemanagement/client/forms/genericresources/GenericResourceTreeManagerForm.java b/src/main/java/org/gcube/portlets/admin/resourcemanagement/client/forms/genericresources/GenericResourceTreeManagerForm.java new file mode 100644 index 0000000..d28a4f9 --- /dev/null +++ b/src/main/java/org/gcube/portlets/admin/resourcemanagement/client/forms/genericresources/GenericResourceTreeManagerForm.java @@ -0,0 +1,343 @@ +/**************************************************************************** + * This software is part of the gCube Project. + * Site: http://www.gcube-system.org/ + **************************************************************************** + * The gCube/gCore software is licensed as Free Open Source software + * conveying to the EUPL (http://ec.europa.eu/idabc/eupl). + * The software and documentation is provided by its authors/distributors + * "as is" and no expressed or + * implied warranty is given for its use, quality or fitness for a + * particular case. + **************************************************************************** + * Filename: GenericResourceTreeManagerForm.java + **************************************************************************** + * @author Massimiliano Assante + ***************************************************************************/ + +package org.gcube.portlets.admin.resourcemanagement.client.forms.genericresources; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.Map; + +import org.gcube.portlets.admin.resourcemanagement.client.remote.ProxyRegistry; +import org.gcube.portlets.admin.resourcemanagement.client.utils.OpCommands; +import org.gcube.resourcemanagement.support.client.views.validators.SelectValidator; +import org.gcube.resourcemanagement.support.shared.plugins.TMPluginFormField; +import org.gcube.resourcemanagement.support.shared.types.Tuple; +import org.gcube.resourcemanagement.support.shared.types.datamodel.AtomicTreeNode; + +import com.extjs.gxt.ui.client.Style.Scroll; +import com.extjs.gxt.ui.client.data.ModelData; +import com.extjs.gxt.ui.client.event.ComponentEvent; +import com.extjs.gxt.ui.client.event.SelectionChangedEvent; +import com.extjs.gxt.ui.client.event.SelectionChangedListener; +import com.extjs.gxt.ui.client.store.ListStore; +import com.extjs.gxt.ui.client.widget.Component; +import com.extjs.gxt.ui.client.widget.Dialog; +import com.extjs.gxt.ui.client.widget.MessageBox; +import com.extjs.gxt.ui.client.widget.button.Button; +import com.extjs.gxt.ui.client.widget.form.ComboBox; +import com.extjs.gxt.ui.client.widget.form.ComboBox.TriggerAction; +import com.extjs.gxt.ui.client.widget.form.Field; +import com.extjs.gxt.ui.client.widget.form.FieldSet; +import com.extjs.gxt.ui.client.widget.form.FormButtonBinding; +import com.extjs.gxt.ui.client.widget.form.FormPanel; +import com.extjs.gxt.ui.client.widget.form.TextArea; +import com.extjs.gxt.ui.client.widget.form.TextField; +import com.extjs.gxt.ui.client.widget.layout.FitLayout; +import com.extjs.gxt.ui.client.widget.layout.FlowLayout; +import com.extjs.gxt.ui.client.widget.layout.FormData; +import com.extjs.gxt.ui.client.widget.layout.FormLayout; +import com.google.gwt.user.client.Element; +import com.google.gwt.user.client.rpc.AsyncCallback; +/** + * + * @author Massimiliano Assante, ISTI-CNR + * @version 1.0 Oct 2012 + * + */ +public class GenericResourceTreeManagerForm extends Dialog { + private FormData formData = null; + private FormPanel form = null; + private FieldSet pluginFieldSet = null; + private String selectedPlugin = null; + private HashMap> loadedPlugins = null; + private TextField resName = null; + + public GenericResourceTreeManagerForm() { + this.setLayout(new FitLayout()); + this.setHeading("Generic Resource Creation (TM Plugin)"); + this.setModal(true); + this.setWidth(700); + this.setHeight(500); + this.setResizable(false); + this.getButtonBar().removeAll(); + this.setHideOnButtonClick(true); + } + + @Override + protected final void onRender(final Element parent, final int index) { + super.onRender(parent, index); + formData = new FormData("-20"); + createForm(); + createPluginForm(); + this.add(form); + + this.initButtons(); + + this.recalculate(); + this.doLayout(true); + + this.form.mask("Loading plugins..."); + // Gets the plugins + ProxyRegistry.getProxyInstance().getGenericResourceTreeMagnagerPlugins(new AsyncCallback>>() { + @Override + public void onSuccess(HashMap> result) { + addPluginSelect(result); + form.unmask(); + } + @Override + public void onFailure(final Throwable caught) { + MessageBox.alert("Create Generic Resource (Tree Manager Plugin)", + "Received an exception: " + caught.getMessage(), null); + form.unmask(); + } + }); + } + + public final void closeDialog() { + this.hide(); + } + + private void setPluginFields(final ArrayList fields) { + if (fields.size() == 0) { + return; + } + Component select = pluginFieldSet.getItem(0); + pluginFieldSet.removeAll(); + pluginFieldSet.add(select); + + for (TMPluginFormField field : fields) { + + TextField toAdd = new TextField(); + toAdd.setFieldLabel(field.getLabel() + (field.isRequired() ? "*" : "")); + toAdd.setName(field.getLabel()); + //toAdd.setValidator(new StringValidator(128, !field.isRequired())); + toAdd.setAllowBlank(!field.isRequired()); // is required + toAdd.setValue(field.getDefaultValue() + (field.isRepeatable() ? "," + field.getDefaultValue() + "2 (Repeatable, use comma to separate " + field.getLabel() + ")" : "")); + pluginFieldSet.add(toAdd, formData); + pluginFieldSet.recalculate(); + this.doLayout(true); + + } + } + + private void addPluginSelect(final HashMap> plugins) { + ListStore store = new ListStore(); + for (String pluginName : plugins.keySet()) { + store.add(new AtomicTreeNode(pluginName)); + } + + ComboBox combo = new ComboBox(); + combo.setFieldLabel("Plugin"); + combo.addSelectionChangedListener(new SelectionChangedListener() { + @Override + public void selectionChanged(final SelectionChangedEvent se) { + if (se != null && + se.getSelection() != null + && se.getSelection() instanceof ArrayList) { + @SuppressWarnings("rawtypes") + String selection = ((ArrayList) se.getSelection()).get(0).toString(); + selectedPlugin = selection; + setPluginFields(loadedPlugins.get(selection)); + } + } + }); + combo.setEmptyText("Select a plugin..."); + combo.setDisplayField("name"); + combo.setStore(store); + combo.setTypeAhead(true); + combo.setValidator(new SelectValidator(false)); + combo.setAllowBlank(false); + combo.setForceSelection(true); + combo.setTriggerAction(TriggerAction.ALL); + combo.recalculate(); + + + pluginFieldSet.recalculate(); + pluginFieldSet.add(combo, formData); + this.doLayout(true); + this.loadedPlugins = plugins; + } + + private void createForm() { + form = new FormPanel(); + form.setFrame(true); + form.setAutoWidth(true); + + form.setHeaderVisible(false); + form.getHeader().setStyleName("x-hide-panel-header"); + form.setLayout(new FlowLayout()); + + form.setScrollMode(Scroll.AUTO); + + FieldSet formHead = new FieldSet(); + formHead.setHeading("Basic parameters"); + formHead.setCollapsible(true); + + FormLayout layout = new FormLayout(); + layout.setLabelWidth(90); + formHead.setLayout(layout); + + TextField resID = new TextField(); + resID.setFieldLabel("Resource ID"); + // resID.setValidator(new StringValidator(64, false)); + resID.setAllowBlank(false); // is required + // If in editing mode + + resID.setEmptyText(""); + resID.setEnabled(false); + formHead.add(resID, formData); + + this.resName = new TextField(); + resName.setFieldLabel("Resource Name"); + // resName.setValidator(new StringValidator(64, false)); + resName.setAllowBlank(false); // is required + resName.setValue("TMRecord"); + resName.setEnabled(false); + formHead.add(resName, formData); + + ComboBox resType = new ComboBox(); + ListStore storePlugin = new ListStore(); + storePlugin.add(new AtomicTreeNode("ActivationRecord")); + resType.setStore(storePlugin); + resType.setFieldLabel("Secondary Type"); + //resType.setEmptyText("Select a subtype..."); + resType.setValue(storePlugin.getAt(0)); + resType.setDisplayField("name"); + resType.setAllowBlank(false); + resType.setEditable(false); + resType.setTypeAhead(false); + resType.setTriggerAction(TriggerAction.ALL); + resType.setForceSelection(true); + resType.addSelectionChangedListener(new SelectionChangedListener() { + @Override + public void selectionChanged(final SelectionChangedEvent se) { + // The usual casting trick for fixing invalid class specification + // of generic return in models. + if (se.getSelection().get(0).getName().equals("VirtualCollection")) { + resName.setFieldLabel("Collection Name"); + resName.setValue(null); + resName.setEnabled(true); + } else { + resName.setFieldLabel("Resource Name"); + resName.setValue("TMRecord"); + resName.setEnabled(false); + } + } + }); + formHead.add(resType, formData); + + TextArea description = new TextArea(); + description.setFieldLabel("Description"); + description.setPreventScrollbars(false); + //description.setHeight(50); + formHead.add(description, formData); + + form.add(formHead); + } + + private void createPluginForm() { + this.pluginFieldSet = new FieldSet(); + pluginFieldSet.setHeading("Plugin parameters"); + pluginFieldSet.setCollapsible(true); + + FormLayout layout = new FormLayout(); + layout.setLabelWidth(110); + pluginFieldSet.setLayout(layout); + form.add(pluginFieldSet); + } + + public final void initButtons() { + Button submitBtn = new Button("Submit") { + @SuppressWarnings("deprecation") + @Override + protected void onClick(final ComponentEvent ce) { + super.onClick(ce); + if (!form.isValid()) { + return; + } + Tuple values = new Tuple(); + for (Field field : form.getFields()) { + values.append(field.getRawValue()); + } + + String resName = values.get(1); + String resType = values.get(2); + String description = values.get(3); + + StringBuilder body = new StringBuilder(); + body.append(""); + body.append("ResourceManagementPortlet"); + body.append(""); + body.append("true"); + + if (selectedPlugin == null) { + return; + } + ArrayList fields = loadedPlugins.get(selectedPlugin); + body.append(""); + Map submitted = new HashMap(); + for (Field field : form.getFields()) { + submitted.put(field.getName(), field.getRawValue()); + } + if (fields != null && fields.size() > 0) { + for (TMPluginFormField field : fields) { + try { + String tag = field.getLabel(); + String value = submitted.get(tag).toString(); + if (value != null && value.trim().length() > 0) { + if (value.split(",").length > 0) { + String[] toAdd = value.split(","); + for (int i = 0; i < toAdd.length; i++) { + body.append("<" + tag + ">" + toAdd[i] + ""); + } + } + else + body.append("<" + tag + ">" + value + ""); + } + } catch (RuntimeException e) { + // parsing errors will be skipped + } + } + } + + body.append(""); + body.append("" + selectedPlugin + ""); + body.append(""); + body.append(""); + + + OpCommands.doCreateGenericResource(null, resName, description, body.toString(), resType); + + + closeDialog(); + } + }; + this.form.addButton(submitBtn); + + this.form.addButton(new Button("Cancel") { + @Override + protected void onClick(final ComponentEvent ce) { + super.onClick(ce); + closeDialog(); + } + }); + + ///form.setButtonAlign(HorizontalAlignment.CENTER); + + FormButtonBinding binding = new FormButtonBinding(form); + binding.addButton(submitBtn); + } +} diff --git a/src/main/java/org/gcube/portlets/admin/resourcemanagement/client/remote/ProxyRegistry.java b/src/main/java/org/gcube/portlets/admin/resourcemanagement/client/remote/ProxyRegistry.java new file mode 100644 index 0000000..752ed1d --- /dev/null +++ b/src/main/java/org/gcube/portlets/admin/resourcemanagement/client/remote/ProxyRegistry.java @@ -0,0 +1,46 @@ +/**************************************************************************** + * This software is part of the gCube Project. + * Site: http://www.gcube-system.org/ + **************************************************************************** + * The gCube/gCore software is licensed as Free Open Source software + * conveying to the EUPL (http://ec.europa.eu/idabc/eupl). + * The software and documentation is provided by its authors/distributors + * "as is" and no expressed or + * implied warranty is given for its use, quality or fitness for a + * particular case. + **************************************************************************** + * Filename: ProxyRegistry.java + **************************************************************************** + * @author Daniele Strollo + ***************************************************************************/ + +package org.gcube.portlets.admin.resourcemanagement.client.remote; + +import com.google.gwt.core.client.GWT; +import com.google.gwt.user.client.rpc.ServiceDefTarget; + +/** + * Utility to simply access in a singleton manner to the + * remote RPC proxy implemented by + * {@link org.gcube.portlets.admin.resourcemanagement.server.ServiceProxyImpl}. + * @author Daniele Strollo (ISTI-CNR) + */ +public class ProxyRegistry { + private static ServiceProxyAsync instance = null; + private static final String proxyURI = "ServiceProxy"; + + /** + * Access to the singleton instance of proxy to contact the + * servlet implementing the server side logics of the application. + * @return the proxy used to invoke the remote servlet. + */ + public static synchronized ServiceProxyAsync getProxyInstance() { + if (instance == null) { + String moduleURL = GWT.getModuleBaseURL() + proxyURI; + instance = (ServiceProxyAsync) GWT.create(ServiceProxy.class); + ServiceDefTarget endpoint = (ServiceDefTarget) instance; + endpoint.setServiceEntryPoint(moduleURL); + } + return instance; + } +} diff --git a/src/main/java/org/gcube/portlets/admin/resourcemanagement/client/remote/ServiceProxy.java b/src/main/java/org/gcube/portlets/admin/resourcemanagement/client/remote/ServiceProxy.java new file mode 100644 index 0000000..d672e25 --- /dev/null +++ b/src/main/java/org/gcube/portlets/admin/resourcemanagement/client/remote/ServiceProxy.java @@ -0,0 +1,181 @@ +/**************************************************************************** + * This software is part of the gCube Project. + * Site: http://www.gcube-system.org/ + **************************************************************************** + * The gCube/gCore software is licensed as Free Open Source software + * conveying to the EUPL (http://ec.europa.eu/idabc/eupl). + * The software and documentation is provided by its authors/distributors + * "as is" and no expressed or + * implied warranty is given for its use, quality or fitness for a + * particular case. + **************************************************************************** + * Filename: RemoteService.java + **************************************************************************** + * @author Daniele Strollo + ***************************************************************************/ + +package org.gcube.portlets.admin.resourcemanagement.client.remote; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import org.gcube.resourcemanagement.support.client.utils.CurrentStatus; +import org.gcube.resourcemanagement.support.shared.operations.SupportedOperations; +import org.gcube.resourcemanagement.support.shared.plugins.GenericResourcePlugin; +import org.gcube.resourcemanagement.support.shared.plugins.TMPluginFormField; +import org.gcube.resourcemanagement.support.shared.types.Tuple; +import org.gcube.resourcemanagement.support.shared.types.datamodel.CompleteResourceProfile; +import org.gcube.resourcemanagement.support.shared.types.datamodel.ResourceDescriptor; + +import com.google.gwt.user.client.rpc.RemoteService; + +/** + * Interface of RPC servlet implementing the server side logics + * of the application. + * @author Daniele Strollo (ISTI-CNR) + */ +public interface ServiceProxy extends RemoteService { + CurrentStatus initStatus(); + + void emptyCache(); + + void setUseCache(boolean flag); + + void initScopes(boolean doClean); + + void setSuperUser(boolean superUser); + + /** + * This way the servlet stores the scope in the session. + */ + void setCurrentScope(String scope); + + /** + * @return the list of all available scopes. + */ + List getAvailableScopes(); + List getAvailableAddScopes(); + + + /** + * + * @param resType + * @param resourceIDs + * @param scope + * @return the xml representation of the generated report (if not failed). + * it is a tuple consisting of: + *
0) the reportID + *
1) the resourceType + *
2) the xmlrepresentation + *
3) the html representation + * @throws Exception + */ + Tuple addResourcesToScope(final String resType, final List resourceIDs, final String scope) throws Exception; + + Tuple removeResourcesFromScope(String resType, List resourceIDs, String scope) throws Exception; + + + String deploy(final List ghnsID, final List servicesID) throws Exception; + Tuple checkDeployStatus(String scope, String deployID) throws Exception; + + List getResourcesModel(String scope, String type, String subType, final List> additionalMaps) throws Exception; + /** + * Given a scope, provides the set of (Type, SubType) couples + * defining resources in the system. + * The key of returned hashmap is the type and the associated + * value is a list of string representing its related sub-types. + * @see org.gcube.portlets.admin.resourcemanagement.server.gcube.services.ISClientRequester#getResourcesTypes(org.gcube.common.core.scope.GCUBEScope) + * @param scope the scope of resources + * @return the hash of (type, list(subtypes)) + */ + HashMap> getResourceTypeTree(String scope) throws Exception; + + /** + * Given a type retrieves its related resources. + * E.g. for GHN returns the RunningInstances on it. + * @param scope + * @param type + * @return + */ + List getRelatedResources(String type, String id, String scope); + + /** + * For a given type returns all the resources defined in the IS having + * the chosen type. + * @param scope the scope of resources + * @param type the type of searched resources (e.g. GHN, RunningInstance, ...) + * @return list of XML profiles of resources found + */ + List getResourcesByType(String scope, String type); + + /** + * Filters the resources in a given scope by their type and subtype. + * For example it allows to retrieve in a scope all the GHN (type) + * defined in a domain (its subtype). + * @param scope the scope of resources + * @param type the type of searched resources (e.g. GHN, RunningInstance, ...) + * @param subtype the subtype of search resources (e.g. for GHN is its domain). + * @return list of XML profiles of resources found + */ + List getResourcesBySubType(String scope, String type, String subtype); + + /** + * Used for generic resource editing form to retrieve the profile. + * @param scope + * @param resID + * @return + * @throws Exception + */ + ResourceDescriptor getGenericResourceDescriptor(String scope, String resID) throws Exception; + + /** + * Returns the list of WSResources + * @param scope the scope of resources + * @return list of XML profiles of resources found + */ + List getWSResources(String scope); + + /** + * Retrieves the XML profiles and its HTML representation of + * a resource given its unique identifier and its type. + * Notice that the ID is ensured to be unique for resources + * of the same type. + * @param scope the scope of the resource + * @param type the type of the searched resource (e.g. GHN, RunningInstance, ...) + * @param resID the unique identifier of the resource + * @return a couple of strings (XMLProfile, HTMLProfileRepresentation) + */ + CompleteResourceProfile getResourceByID(String scope, String type, String resID); + + + String createGenericResource( + final String id, + final String name, + final String description, + final String body, + final String subType) + throws Exception; + + void updateGenericResource( + final String id, + final String name, + final String description, + final String body, + final String subType) + throws Exception; + + Map getGenericResourcePlugins() throws Exception; + + HashMap> getGenericResourceTreeMagnagerPlugins() throws Exception; + + /*********************************************************** + * RESOURCE OPERATIONS + **********************************************************/ + void doOperation(SupportedOperations opCode, String scope, List resources) + throws Exception; + + + +} diff --git a/src/main/java/org/gcube/portlets/admin/resourcemanagement/client/remote/ServiceProxyAsync.java b/src/main/java/org/gcube/portlets/admin/resourcemanagement/client/remote/ServiceProxyAsync.java new file mode 100644 index 0000000..999b135 --- /dev/null +++ b/src/main/java/org/gcube/portlets/admin/resourcemanagement/client/remote/ServiceProxyAsync.java @@ -0,0 +1,125 @@ +/**************************************************************************** + * This software is part of the gCube Project. + * Site: http://www.gcube-system.org/ + **************************************************************************** + * The gCube/gCore software is licensed as Free Open Source software + * conveying to the EUPL (http://ec.europa.eu/idabc/eupl). + * The software and documentation is provided by its authors/distributors + * "as is" and no expressed or + * implied warranty is given for its use, quality or fitness for a + * particular case. + **************************************************************************** + * Filename: ServiceProxyAsync.java + **************************************************************************** + * @author Daniele Strollo + ***************************************************************************/ + +package org.gcube.portlets.admin.resourcemanagement.client.remote; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + + +import org.gcube.resourcemanagement.support.client.utils.CurrentStatus; +import org.gcube.resourcemanagement.support.shared.operations.SupportedOperations; +import org.gcube.resourcemanagement.support.shared.plugins.GenericResourcePlugin; +import org.gcube.resourcemanagement.support.shared.plugins.TMPluginFormField; +import org.gcube.resourcemanagement.support.shared.types.Tuple; +import org.gcube.resourcemanagement.support.shared.types.datamodel.CompleteResourceProfile; +import org.gcube.resourcemanagement.support.shared.types.datamodel.ResourceDescriptor; + + +import com.google.gwt.user.client.rpc.AsyncCallback; + +/** + * The asynchronous representation of {@link ServiceProxy} interface. + * Needed to implement the server side async RPC. + * + * @author Daniele Strollo (ISTI-CNR) + */ +public interface ServiceProxyAsync { + + void emptyCache(AsyncCallback callback); + void setUseCache(boolean flag, AsyncCallback callback); + + void setSuperUser(boolean superUser, AsyncCallback callback); + + void setCurrentScope(String scope, AsyncCallback callback); + + void initStatus(AsyncCallback callback); + + void initScopes(boolean doClean, AsyncCallback callback); + + void addResourcesToScope(final String resType, final List resourceIDs, final String scope, AsyncCallback> callback); + + void removeResourcesFromScope(final String resType, final List resourceIDs, final String scope, AsyncCallback> callback); + + void deploy(final List ghnsID, final List servicesID, AsyncCallback callback); + void checkDeployStatus(String scope, String deployID, AsyncCallback> callback); + + void getResourcesModel(String scope, String type, String subType, final List> additionalMaps, AsyncCallback> callback); + + void getGenericResourceDescriptor(String scope, String resID, AsyncCallback callback); + + /** + * @see ServiceProxy#getAvailableScopes() + */ + void getAvailableScopes(AsyncCallback> callback); + + void getAvailableAddScopes(AsyncCallback> callback); + + void getResourceTypeTree(String scope, + AsyncCallback>> callback); + + void getRelatedResources(String type, String id, String scope, AsyncCallback> callback); + + /** + * @see ServiceProxy#getResourcesByType(String, String) + */ + void getResourcesByType(String scope, String type, AsyncCallback> callback); + + /** + * @see ServiceProxy#getResourcesBySubType(String, String, String) + */ + void getResourcesBySubType(String scope, String type, String subtype, AsyncCallback> callback); + + + /** + * @see ServiceProxy#getWSResources(String) + */ + void getWSResources(String scope, AsyncCallback> callback); + + /** + * @see ServiceProxy#getResourceByID(String, String, String) + */ + void getResourceByID(String scope, String type, String resID, AsyncCallback callback); + + void createGenericResource( + final String id, + final String name, + final String description, + final String body, + final String subType, + AsyncCallback callback); + + void updateGenericResource( + final String id, + final String name, + final String description, + final String body, + final String subType, + AsyncCallback callback); + + void getGenericResourcePlugins(AsyncCallback> callback); + + + + /*********************************************************** + * RESOURCE OPERATIONS + **********************************************************/ + void doOperation(SupportedOperations opCode, String scope, List resources, AsyncCallback callback) throws Exception; + void getGenericResourceTreeMagnagerPlugins( + AsyncCallback>> callback); +} diff --git a/src/main/java/org/gcube/portlets/admin/resourcemanagement/client/utils/Callbacks.java b/src/main/java/org/gcube/portlets/admin/resourcemanagement/client/utils/Callbacks.java new file mode 100644 index 0000000..e1ca147 --- /dev/null +++ b/src/main/java/org/gcube/portlets/admin/resourcemanagement/client/utils/Callbacks.java @@ -0,0 +1,371 @@ +/**************************************************************************** + * This software is part of the gCube Project. + * Site: http://www.gcube-system.org/ + **************************************************************************** + * The gCube/gCore software is licensed as Free Open Source software + * conveying to the EUPL (http://ec.europa.eu/idabc/eupl). + * The software and documentation is provided by its authors/distributors + * "as is" and no expressed or + * implied warranty is given for its use, quality or fitness for a + * particular case. + **************************************************************************** + * Filename: Callbacks.java + **************************************************************************** + * @author Daniele Strollo + ***************************************************************************/ + +package org.gcube.portlets.admin.resourcemanagement.client.utils; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; + +import org.gcube.portlets.admin.resourcemanagement.client.views.profile.ResourceProfilePanel; +import org.gcube.portlets.admin.resourcemanagement.client.views.resourcedetails.ResourceDetailsPanel; +import org.gcube.portlets.admin.resourcemanagement.client.views.resourcedetails.ResourceGridFactory; +import org.gcube.portlets.admin.resourcemanagement.client.views.resourcetree.ResourcesTreePanel; +import org.gcube.portlets.admin.resourcemanagement.client.views.resourcetree.WSResourcesTreePanel; +import org.gcube.portlets.admin.resourcemanagement.client.widgets.console.ConsoleMessageBroker; +import org.gcube.portlets.admin.resourcemanagement.client.widgets.panels.MainPanel; +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.taskbar.TaskbarItem; +import org.gcube.portlets.admin.resourcemanagement.client.widgets.taskbar.TaskbarRegister; +import org.gcube.resourcemanagement.support.client.utils.LocalStatus; +import org.gcube.resourcemanagement.support.client.utils.StatusHandler; +import org.gcube.resourcemanagement.support.client.views.ResourceTypeDecorator; +import org.gcube.resourcemanagement.support.shared.types.Tuple; +import org.gcube.resourcemanagement.support.shared.types.datamodel.CompleteResourceProfile; + +import com.extjs.gxt.ui.client.data.ModelData; +import com.extjs.gxt.ui.client.event.ComponentEvent; +import com.extjs.gxt.ui.client.widget.ContentPanel; +import com.extjs.gxt.ui.client.widget.Dialog; +import com.extjs.gxt.ui.client.widget.MessageBox; +import com.extjs.gxt.ui.client.widget.button.Button; +import com.extjs.gxt.ui.client.widget.grid.Grid; +import com.extjs.gxt.ui.client.widget.layout.FitLayout; +import com.extjs.gxt.ui.client.widget.menu.Menu; +import com.extjs.gxt.ui.client.widget.menu.MenuItem; +import com.google.gwt.core.client.GWT; +import com.google.gwt.user.client.rpc.AsyncCallback; + +/** + * In order to simplify the management of asynchronous commands + * executed by the application that involve access to the servlet + * the invocations have been represented in {@link Commands} and + * the related callbacks here. + * + * @author Daniele Strollo (ISTI-CNR) + */ +public class Callbacks { + + + public static final AsyncCallback> handleGetAvailableScopes = new AsyncCallback>() { + public void onSuccess(final List result) { + + if (!WidgetsRegistry.containsElem(UIIdentifiers.BUTTON_AVAILABLE_SCOPES_ID)) { + //MessageBox.info("Failure", "cannot retrieve the scopes button", null); + Commands.unmask(UIIdentifiers.MAIN_CONTAINER_VIEWPORT_ID); + return; + } + Button btnScopes = (Button) WidgetsRegistry.getWidget(UIIdentifiers.BUTTON_AVAILABLE_SCOPES_ID); + + Menu scrollMenu = new Menu(); + scrollMenu.setMaxHeight(200); + + LocalStatus.getInstance().getAvailableScopes().clear(); + + for (String scope : result) { + final String currScope = scope; + LocalStatus.getInstance().getAvailableScopes().add(currScope); + scrollMenu.add(new MenuItem(currScope) { + @Override + protected void onClick(final ComponentEvent be) { + super.onClick(be); + Commands.doLoadResourceTree(this, currScope); + } + }); + } + + btnScopes.setMenu(scrollMenu); + Commands.unmask(UIIdentifiers.MAIN_CONTAINER_VIEWPORT_ID); + } + public void onFailure(final Throwable caught) { + Commands.unmask(UIIdentifiers.MAIN_CONTAINER_VIEWPORT_ID); + MessageBox.info("Failure", "cannot retrieve the scopes", null); + GWT.log("cannot retrieve the scopes", caught); + } + }; + + + + public static final void builtResourceTree(final HashMap> result, final boolean clearGrid) { + MainPanel panel = WidgetsRegistry.getPanel(UIIdentifiers.RESOURCE_NAVIGATION_PANEL); + + List wsResourcesTypes = null; + if (result.containsKey(ResourceTypeDecorator.WSResource.name())) { + wsResourcesTypes = result.get(ResourceTypeDecorator.WSResource.name()); + result.remove(ResourceTypeDecorator.WSResource.name()); + } + + // Creates the tree of resources + ResourcesTreePanel resourceTree = new ResourcesTreePanel(result); + resourceTree.getWidget().setWidth("100%"); + resourceTree.getWidget().setHeight("100%"); + ContentPanel cp = new ContentPanel(); + cp.setAnimCollapse(false); + cp.setHeading("Resources"); + cp.setLayout(new FitLayout()); + cp.add(resourceTree.getWidget()); + panel.add(cp, true); + + if (wsResourcesTypes != null && wsResourcesTypes.size() > 0) { + // Creates the tree of WSResources + WSResourcesTreePanel wsresourceTree = new WSResourcesTreePanel(wsResourcesTypes); + wsresourceTree.getWidget().setWidth("100%"); + wsresourceTree.getWidget().setHeight("100%"); + cp = new ContentPanel(); + cp.setAnimCollapse(false); + cp.setHeading("WSResources"); + cp.setLayout(new FitLayout()); + cp.add(wsresourceTree.getWidget()); + panel.add(cp, false); + } + + if (clearGrid) { + Commands.clearResourceGridPanel(); + } + + Commands.unmask(WidgetsRegistry.getPanel(UIIdentifiers.RESOURCE_NAVIGATION_PANEL).getContainer()); + Commands.unmask( + UIIdentifiers.GLOBAL_STATUS_BAR_ID, + UIIdentifiers.GLOBAL_MENUBAR_ID); + } + + /** + * Once received the list of Types/Subtypes they are shown in a tree panel. + * Here implemented the logics for that. + */ + public static final AsyncCallback>> handleLoadResourceTree = + new AsyncCallback>>() { + public void onSuccess(final HashMap> result) { + builtResourceTree(result, true); + } + public void onFailure(final Throwable caught) { + MessageBox.info("Failure", caught.getMessage(), null); + + Commands.clearResourceTreePanel(); + ConsoleMessageBroker.error("loading resource", caught.getMessage()); + Commands.unmask(WidgetsRegistry.getPanel(UIIdentifiers.RESOURCE_NAVIGATION_PANEL).getContainer()); + Commands.unmask( + UIIdentifiers.GLOBAL_STATUS_BAR_ID, + UIIdentifiers.GLOBAL_MENUBAR_ID); + } + }; + + /** + * Once received the list of Types/Subtypes they are shown in a tree panel. + * Here implemented the logics for that. + */ + public static final AsyncCallback>> handleReloadResourceTree = + new AsyncCallback>>() { + public void onSuccess(final HashMap> result) { + builtResourceTree(result, false); + } + public void onFailure(final Throwable caught) { + MessageBox.info("Failure", caught.getMessage(), null); + + Commands.clearResourceTreePanel(); + ConsoleMessageBroker.error("loading resource", caught.getMessage()); + Commands.unmask(WidgetsRegistry.getPanel(UIIdentifiers.RESOURCE_NAVIGATION_PANEL).getContainer()); + Commands.unmask( + UIIdentifiers.GLOBAL_STATUS_BAR_ID, + UIIdentifiers.GLOBAL_MENUBAR_ID); + } + }; + + /** + * Once received the list of resource profiles for resources of a given type, + * they will be shown inside a grid that is created here. + */ + public static final AsyncCallback> handleLoadResourceDetailsGrid = + new AsyncCallback>() { + public void onSuccess(final List result) { + + Commands.mask( + "Rendering grid", + WidgetsRegistry.getPanel(UIIdentifiers.RESOURCE_DETAIL_GRID_PANEL).getContainer() + ); + try { + ResourceDetailsPanel resGrid = Commands.getResourceDetailPanel(); + Grid grid = ResourceGridFactory.createGrid(StatusHandler.getStatus().getCurrentResourceType(), + result, + "SubType"); + resGrid.setGrid(grid, true); + } catch (NullPointerException e1) { + MessageBox.info( + "Failure", + "the grid container cannot be retrieved", + null); + } + Commands.unmask(WidgetsRegistry.getPanel(UIIdentifiers.RESOURCE_NAVIGATION_PANEL).getContainer()); + Commands.unmask(WidgetsRegistry.getPanel(UIIdentifiers.RESOURCE_DETAIL_GRID_PANEL).getContainer()); + + Commands.setLoadedResources(result != null ? result.size() : 0); + Commands.showPopup("Grid Creation", "Retrieved " + (result != null ? result.size() : 0) + " elements."); + } + + public void onFailure(final Throwable caught) { + MessageBox.info("Failure", "the grid has not been built", null); + Commands.unmask(WidgetsRegistry.getPanel(UIIdentifiers.RESOURCE_NAVIGATION_PANEL).getContainer()); + Commands.unmask(WidgetsRegistry.getPanel(UIIdentifiers.RESOURCE_DETAIL_GRID_PANEL).getContainer()); + } + }; + + + + public static final AsyncCallback> handleFilterResourceDetailsGrid = + new AsyncCallback>() { + public void onSuccess(final List result) { + try { + ResourceDetailsPanel resGrid = Commands.getResourceDetailPanel(); + Grid grid = ResourceGridFactory.createGrid(StatusHandler.getStatus().getCurrentResourceType(), + result, + null); + resGrid.setGrid(grid, false); + } catch (NullPointerException e1) { + MessageBox.info( + "Failure", + "the grid container cannot be retrieved", + null); + } finally { + Commands.unmask(WidgetsRegistry.getPanel(UIIdentifiers.RESOURCE_NAVIGATION_PANEL).getContainer()); + Commands.unmask(WidgetsRegistry.getPanel(UIIdentifiers.RESOURCE_DETAIL_GRID_PANEL).getContainer()); + } + + Commands.setLoadedResources(result != null ? result.size() : 0); + Commands.showPopup("Grid Creation", "Retrieved " + (result != null ? result.size() : 0) + " elements."); + } + + public void onFailure(final Throwable caught) { + MessageBox.info("Failure", "the grid has not been built", null); + + Commands.unmask(WidgetsRegistry.getPanel(UIIdentifiers.RESOURCE_NAVIGATION_PANEL).getContainer()); + Commands.unmask(WidgetsRegistry.getPanel(UIIdentifiers.RESOURCE_DETAIL_GRID_PANEL).getContainer()); + } + }; + + + public static final AsyncCallback handleGetResourceProfile = + new AsyncCallback() { + + public void onSuccess(final CompleteResourceProfile result) { + Dialog dlg = new Dialog(); + dlg.setLayout(new FitLayout()); + dlg.setHeading("XML Resource Profile"); + dlg.setModal(true); + dlg.setWidth(800); + dlg.setHeight(400); + dlg.setHideOnButtonClick(true); + // HtmlContainer htmlContainer = new HtmlContainer(); + try { + // This resource has already been opened + if (TaskbarRegister.contains(result.getID())) { + TaskbarRegister.getTaskbarItem(result.getID()).destroy(); + Commands.showPopup("Retrieve Resource Profile", "Refreshing profile for id: " + + result.getID(), 3000); + } + MainPanel taskbarContainer = WidgetsRegistry.getPanel(UIIdentifiers.TASKBAR_PANEL); + TaskbarItem tkItem = new TaskbarItem( + StatusHandler.getStatus().getCurrentScope(), + result.getType(), + taskbarContainer, + result.getID(), + //result.getType() + ": " + result.getTitle(), + result.getTitle(), + "resource-profile-taskbar-item", + "profile-big-icon"); + tkItem.getRelatedWindow().setMainWidget( + new ResourceProfilePanel( + result.getType(), + result.getXmlRepresentation(), + result.getHtmlRepresentation()).getWidget()); + TaskbarRegister.registerTaskbarWidget(result.getID(), tkItem); + } catch (Exception e) { + GWT.log("During HTML conversion", e); + } finally { + Commands.unmask(WidgetsRegistry.getPanel(UIIdentifiers.RESOURCE_DETAIL_GRID_PANEL).getContainer()); + } + } + + public void onFailure(final Throwable caught) { + MessageBox.info("Failure", "the profile has not been retrieved", null); + GWT.log("on handleGetResourceProfile", caught); + Commands.unmask(WidgetsRegistry.getPanel(UIIdentifiers.RESOURCE_DETAIL_GRID_PANEL).getContainer()); + } + }; + + + public static final AsyncCallback> handleGetDeploymentReport = + new AsyncCallback>() { + + public void onSuccess(final Tuple result) { + + if (result.size() < 3) { + MessageBox.alert("Invalid Report Received", "Don't know why :(", null); + Commands.unmask(UIIdentifiers.GLOBAL_STATUS_BAR_ID); + Commands.unmask(UIIdentifiers.MAIN_CONTAINER_VIEWPORT_ID, UIIdentifiers.RESOURCE_DETAIL_GRID_PANEL); + return; + } + + Dialog dlg = new Dialog(); + dlg.setLayout(new FitLayout()); + dlg.setHeading("XML Resource Profile"); + dlg.setModal(true); + dlg.setWidth(800); + dlg.setHeight(400); + dlg.setHideOnButtonClick(true); + // HtmlContainer htmlContainer = new HtmlContainer(); + try { + + String reportID = result.get(0); + String resourceTitle = ResourceTypeDecorator.DeployReport.getLabel() + ": " + reportID; + + // This resource has already been opened + if (TaskbarRegister.contains(reportID)) { + TaskbarRegister.getTaskbarItem(reportID).destroy(); + Commands.showPopup("Retrieve Report", "Refreshing Report id: " + + reportID, 3000); + } + MainPanel taskbarContainer = WidgetsRegistry.getPanel(UIIdentifiers.TASKBAR_PANEL); + TaskbarItem tkItem = new TaskbarItem( + StatusHandler.getStatus().getCurrentScope(), + ResourceTypeDecorator.DeployReport, + taskbarContainer, + reportID, + resourceTitle, + "resource-profile-taskbar-item", + ResourceTypeDecorator.DeployReport.getIcon()); + tkItem.getRelatedWindow().setMainWidget( + new ResourceProfilePanel( + ResourceTypeDecorator.DeployReport, + result.get(1), + result.get(2)).getWidget()); + TaskbarRegister.registerTaskbarWidget(reportID, tkItem); + } catch (Exception e) { + GWT.log("During HTML conversion", e); + } finally { + Commands.unmask(UIIdentifiers.MAIN_CONTAINER_VIEWPORT_ID, UIIdentifiers.RESOURCE_DETAIL_GRID_PANEL); + Commands.unmask(UIIdentifiers.GLOBAL_STATUS_BAR_ID); + } + } + + public void onFailure(final Throwable caught) { + MessageBox.info("Failure", "the report has not been retrieved", null); + GWT.log("on handleGetDeploymentReport", caught); + Commands.unmask(UIIdentifiers.MAIN_CONTAINER_VIEWPORT_ID, UIIdentifiers.RESOURCE_DETAIL_GRID_PANEL); + Commands.unmask(UIIdentifiers.GLOBAL_STATUS_BAR_ID); + } + }; +} diff --git a/src/main/java/org/gcube/portlets/admin/resourcemanagement/client/utils/Commands.java b/src/main/java/org/gcube/portlets/admin/resourcemanagement/client/utils/Commands.java new file mode 100644 index 0000000..48a9c0f --- /dev/null +++ b/src/main/java/org/gcube/portlets/admin/resourcemanagement/client/utils/Commands.java @@ -0,0 +1,532 @@ +/**************************************************************************** + * This software is part of the gCube Project. + * Site: http://www.gcube-system.org/ + **************************************************************************** + * The gCube/gCore software is licensed as Free Open Source software + * conveying to the EUPL (http://ec.europa.eu/idabc/eupl). + * The software and documentation is provided by its authors/distributors + * "as is" and no expressed or + * implied warranty is given for its use, quality or fitness for a + * particular case. + **************************************************************************** + * Filename: Commands.java + **************************************************************************** + * @author Daniele Strollo + ***************************************************************************/ + +package org.gcube.portlets.admin.resourcemanagement.client.utils; + +import java.util.List; + +import org.gcube.portlets.admin.resourcemanagement.client.remote.ProxyRegistry; +import org.gcube.portlets.admin.resourcemanagement.client.views.profile.ResourceProfilePanel; +import org.gcube.portlets.admin.resourcemanagement.client.views.resourcedetails.ResourceDetailsPanel; +import org.gcube.portlets.admin.resourcemanagement.client.views.resourcedetails.ResourceGridFactory; +import org.gcube.portlets.admin.resourcemanagement.client.widgets.console.ConsoleMessageBroker; +import org.gcube.portlets.admin.resourcemanagement.client.widgets.console.ConsolePanel; +import org.gcube.portlets.admin.resourcemanagement.client.widgets.panels.MainPanel; +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.taskbar.TaskbarItem; +import org.gcube.portlets.admin.resourcemanagement.client.widgets.taskbar.TaskbarRegister; +import org.gcube.portlets.admin.resourcemanagement.client.widgets.viewport.MainContainer; +import org.gcube.portlets.admin.resourcemanagement.shared.Configuration; +import org.gcube.portlets.admin.resourcemanagement.shared.exceptions.WidgetNotRegistered; + +import org.gcube.portlets.admin.resourcemanagement.shared.utils.DelayedOperation; +import org.gcube.resourcemanagement.support.client.utils.StatusHandler; +import org.gcube.resourcemanagement.support.client.views.ResourceTypeDecorator; +import org.gcube.resourcemanagement.support.shared.types.Tuple; +import org.gcube.resourcemanagement.support.shared.types.UserGroup; + +import com.extjs.gxt.ui.client.data.ModelData; +import com.extjs.gxt.ui.client.widget.Component; +import com.extjs.gxt.ui.client.widget.ContentPanel; +import com.extjs.gxt.ui.client.widget.Dialog; +import com.extjs.gxt.ui.client.widget.Info; +import com.extjs.gxt.ui.client.widget.InfoConfig; +import com.extjs.gxt.ui.client.widget.MessageBox; +import com.extjs.gxt.ui.client.widget.ProgressBar; +import com.extjs.gxt.ui.client.widget.Status; +import com.extjs.gxt.ui.client.widget.Text; +import com.extjs.gxt.ui.client.widget.grid.Grid; +import com.extjs.gxt.ui.client.widget.layout.FitLayout; +import com.google.gwt.core.client.GWT; +import com.google.gwt.user.client.rpc.AsyncCallback; + +/** + * Here is a set of commands executed inside callbacks that involve + * interactions with client-side widgets. + * Additionally other commands are provided for general purpose functionalities + * (e.g. refresh components, main components lookup, ...).m + * @author Daniele Strollo (ISTI-CNR) + */ +public class Commands { + + /************************************************************************** + * COMMANDS FOR RPC REQUESTS TO THE SERVLET + *************************************************************************/ + + public static final void refreshProgressBar() { + final ProgressBar progress = (ProgressBar) WidgetsRegistry.getElem(UIIdentifiers.STATUS_PROGRESS_BAR_ID); + + new DelayedOperation() { + @Override + public void doJob() { + + } + }.start(1000); + } + + /** + * Creates a new Navigation Tree for the resources in a given scope. + * @param caller for logging reasons the caller must be passed as parameter + * @param scope the scope for resources to retrieve + */ + public static final void doLoadResourceTree(final Object caller, final String scope) { + StatusHandler.getStatus().setCurrentScope(scope); + Commands.mask( + "Loading Resource Tree", + WidgetsRegistry.getPanel(UIIdentifiers.RESOURCE_NAVIGATION_PANEL).getContainer() + ); + Commands.mask(null, + UIIdentifiers.GLOBAL_STATUS_BAR_ID, + UIIdentifiers.GLOBAL_MENUBAR_ID); + ConsoleMessageBroker.info(caller, "Loading scope " + scope); + ProxyRegistry.getProxyInstance().getResourceTypeTree( + scope, + Callbacks.handleLoadResourceTree); + } + + public static final void doLoadResourceDetailsGrid(final Object caller, final String scope, final String resourceType) { + StatusHandler.getStatus().setCurrentScope(scope); + StatusHandler.getStatus().setCurrentResourceType(resourceType); + StatusHandler.getStatus().setCurrentResourceSubType(null); + WidgetsRegistry.getPanel(UIIdentifiers.RESOURCE_DETAIL_GRID_PANEL).removeAll(); + Commands.mask( + "Waiting for Resource Details", + WidgetsRegistry.getPanel(UIIdentifiers.RESOURCE_NAVIGATION_PANEL).getContainer() + ); + Commands.mask( + "Loading Resource Details for type: " + resourceType + " in scope: " + scope, + WidgetsRegistry.getPanel(UIIdentifiers.RESOURCE_DETAIL_GRID_PANEL).getContainer() + ); + ProxyRegistry.getProxyInstance().getResourcesByType( + scope, + resourceType, + Callbacks.handleLoadResourceDetailsGrid); + } + + public static final void doGetRelatedResources(final String type, final String id, final String scope) { + ProxyRegistry.getProxyInstance().getRelatedResources(type, id, scope, new AsyncCallback>() { + + public void onSuccess(final List result) { + final Grid grid = ResourceGridFactory.createGrid(type + "Related", result, null); + if (grid == null) { + Commands.showPopup("Grid Creation", + "The grid for related resource of " + type + " cannot be built", + 6000); + } + final Dialog dlg = new Dialog() { + protected void onRender(final com.google.gwt.user.client.Element parent, final int pos) { + super.onRender(parent, pos); + this.setLayout(new FitLayout()); + this.add(grid); + }; + }; + dlg.setSize(720, 250); + dlg.setHideOnButtonClick(true); + dlg.setHeading("Resource related to " + type + " " + id); + dlg.show(); + } + + public void onFailure(final Throwable caught) { + } + }); + + } + + public static final void doLoadWSResourceDetailsGrid( + final Object caller, + final String scope) { + StatusHandler.getStatus().setCurrentScope(scope); + StatusHandler.getStatus().setCurrentResourceType(ResourceTypeDecorator.WSResource.name()); + StatusHandler.getStatus().setCurrentResourceSubType(null); + WidgetsRegistry.getPanel(UIIdentifiers.RESOURCE_DETAIL_GRID_PANEL).removeAll(); + Commands.mask( + "Waiting for Resource Details", + WidgetsRegistry.getPanel(UIIdentifiers.RESOURCE_NAVIGATION_PANEL).getContainer() + ); + Commands.mask( + "Loading Resource Details for type: " + ResourceTypeDecorator.WSResource.name() + " in scope: " + scope, + WidgetsRegistry.getPanel(UIIdentifiers.RESOURCE_DETAIL_GRID_PANEL).getContainer() + ); + ProxyRegistry.getProxyInstance().getWSResources( + scope, + Callbacks.handleLoadResourceDetailsGrid); + } + + /** + * Filters the result of resource detail grid by using its subtye. + * @param caller + * @param resourceSubType + */ + public static final void doFilterResourceDetailsGrid( + final Object caller, final String scope, final String resourceType, final String resourceSubType) { + StatusHandler.getStatus().setCurrentScope(scope); + StatusHandler.getStatus().setCurrentResourceType(resourceType); + StatusHandler.getStatus().setCurrentResourceSubType(resourceSubType); + WidgetsRegistry.getPanel(UIIdentifiers.RESOURCE_DETAIL_GRID_PANEL).removeAll(); + Commands.mask( + "Waiting for Resource Details", + WidgetsRegistry.getPanel(UIIdentifiers.RESOURCE_NAVIGATION_PANEL).getContainer() + ); + Commands.mask( + "Filtering Resource Details for " + resourceType + "::" + resourceSubType, + WidgetsRegistry.getPanel(UIIdentifiers.RESOURCE_DETAIL_GRID_PANEL).getContainer() + ); + + ProxyRegistry.getProxyInstance().getResourcesBySubType( + scope, + resourceType, + resourceSubType, + Callbacks.handleFilterResourceDetailsGrid); + } + + public static final void doGetResourceProfileByID( + final Object caller, final String scope, final String resourceID) { + ProxyRegistry.getProxyInstance().getResourceByID( + scope, + null, // no type specified + resourceID, + Callbacks.handleGetResourceProfile); + } + + public static final void doGetResourceProfile( + final Object caller, final String scope, final String resourceType, final String resourceID) { + StatusHandler.getStatus().setCurrentScope(scope); + StatusHandler.getStatus().setCurrentResourceType(resourceType); + Commands.mask( + "Getting Profile Details for " + resourceType + ": " + resourceID, + WidgetsRegistry.getPanel(UIIdentifiers.RESOURCE_DETAIL_GRID_PANEL).getContainer() + ); + ProxyRegistry.getProxyInstance().getResourceByID( + scope, + resourceType, + resourceID, + Callbacks.handleGetResourceProfile); + } + + + public static final void doGetAvailableScopes(final Object caller) { + Commands.mask("Loading scopes", UIIdentifiers.MAIN_CONTAINER_VIEWPORT_ID); + ProxyRegistry.getProxyInstance().getAvailableScopes(Callbacks.handleGetAvailableScopes); + } + + public static final void buildAddToScopeReport(final Tuple result) { + if (result.size() < 4) { + MessageBox.alert("Invalid Report Received", "Don't know why :(", null); + Commands.unmask(UIIdentifiers.MAIN_CONTAINER_VIEWPORT_ID, UIIdentifiers.RESOURCE_DETAIL_GRID_PANEL); + return; + } + + Dialog dlg = new Dialog(); + dlg.setLayout(new FitLayout()); + dlg.setHeading("XML Resource Profile"); + dlg.setModal(true); + dlg.setWidth(800); + dlg.setHeight(400); + dlg.setHideOnButtonClick(true); + // HtmlContainer htmlContainer = new HtmlContainer(); + try { + + String reportID = result.get(0); + // String resType = result.get(1); + String xmlReport = result.get(2); + String htmlReport = result.get(3); + + //String resourceTitle = ResourceTypeDecorator.AddScopeReport.getLabel() + ": " + reportID; + int repSoFar = TaskbarRegister.getCurrAddScopeReportsNumber() + 1; + String resourceTitle = ResourceTypeDecorator.AddScopeReport.getLabel() + "("+repSoFar+")"; + + // This resource has already been opened + if (TaskbarRegister.contains(reportID)) { + TaskbarRegister.getTaskbarItem(reportID).destroy(); + Commands.showPopup("Retrieve Report", "Refreshing Report id: " + + reportID, 3000); + } + MainPanel taskbarContainer = WidgetsRegistry.getPanel(UIIdentifiers.TASKBAR_PANEL); + TaskbarItem tkItem = new TaskbarItem( + StatusHandler.getStatus().getCurrentScope(), + ResourceTypeDecorator.AddScopeReport, + taskbarContainer, + reportID, + resourceTitle, + "resource-profile-taskbar-item", + ResourceTypeDecorator.DeployReport.getIcon()); + tkItem.getRelatedWindow().setMainWidget( + new ResourceProfilePanel( + ResourceTypeDecorator.AddScopeReport, + xmlReport, htmlReport).getWidget()); + TaskbarRegister.registerTaskbarWidget(reportID, tkItem); + } catch (Exception e) { + GWT.log("During HTML conversion", e); + } finally { + Commands.unmask(UIIdentifiers.MAIN_CONTAINER_VIEWPORT_ID, UIIdentifiers.RESOURCE_DETAIL_GRID_PANEL); + } + } + + public static final void doSetSuperUser(final boolean state) { + if (state) { + StatusHandler.getStatus().setCredentials(UserGroup.ADMIN); + } else { + StatusHandler.getStatus().setCredentials(UserGroup.DEBUG); + } + ProxyRegistry.getProxyInstance().setSuperUser(state, new AsyncCallback() { + public void onSuccess(final Void result) { + ConsoleMessageBroker.info(this, "Currently super user"); + Commands.refreshResourceGrid(); + //Commands.refreshResourceTree(); + Commands.doGetAvailableScopes(Commands.class); + } + public void onFailure(final Throwable caught) { + ConsoleMessageBroker.error(this, "Super user mode failed"); + } + }); + } + + + /************************************************************************** + * GENERAL PURPOSE UTILITY COMMANDS + *************************************************************************/ + + public static final void refreshResourceTree() { + String scope = StatusHandler.getStatus().getCurrentScope(); + Commands.mask( + "Loading Resource Tree", + WidgetsRegistry.getPanel(UIIdentifiers.RESOURCE_NAVIGATION_PANEL).getContainer() + ); + Commands.mask(null, + UIIdentifiers.GLOBAL_STATUS_BAR_ID, + UIIdentifiers.GLOBAL_MENUBAR_ID); + ConsoleMessageBroker.info(Commands.class, "Loading scope " + scope); + ProxyRegistry.getProxyInstance().getResourceTypeTree( + scope, + Callbacks.handleReloadResourceTree); + } + + public static final void refreshResourceGrid() { + String scope = StatusHandler.getStatus().getCurrentScope(); + String resType = StatusHandler.getStatus().getCurrentResourceType(); + String resSubType = StatusHandler.getStatus().getCurrentResourceSubType(); + + if (scope != null && resType != null) { + if (resSubType == null) { + if (resType.equalsIgnoreCase(ResourceTypeDecorator.WSResource.name())) { + doLoadWSResourceDetailsGrid(Commands.class.getName(), + scope); + } else { + doLoadResourceDetailsGrid(Commands.class.getName(), + scope, + resType); + } + } else { + // Has a subtype + doFilterResourceDetailsGrid(Commands.class.getName(), + scope, + resType, + resSubType); + } + } + } + + public static void clearResourceTreePanel() { + MainPanel treePanel = WidgetsRegistry.getPanel(UIIdentifiers.RESOURCE_NAVIGATION_PANEL); + Text widget = new Text(); + widget.setId("res-details-widget-fake"); + widget.setStyleName("x-panel-tree-background"); + ContentPanel cp = new ContentPanel(); + cp.setAnimCollapse(false); + cp.setHeading("Resources"); + cp.setLayout(new FitLayout()); + cp.add(widget); + treePanel.add(cp, true); + } + + public static void clearResourceGridPanel() { + Component widget = new Text(); + widget.setId("res-details-widget-fake"); + widget.setStyleName("x-panel-cube-background"); + + WidgetsRegistry.getPanel(UIIdentifiers.RESOURCE_DETAIL_GRID_PANEL).add(widget, true); + } + + public static void showHideConsole() { + Object elem = WidgetsRegistry.getElem(UIIdentifiers.CONSOLE_COMPONENT_ID); + if (elem != null && elem instanceof Component) { + Component console = (Component) elem; + if (!console.isVisible()) { + console.show(); + } else { + console.hide(); + } + } + } + + public static MainContainer getViewport() { + return (MainContainer) WidgetsRegistry.getWidget(UIIdentifiers.MAIN_CONTAINER_VIEWPORT_ID); + } + + public static void refreshViewport() { + MainContainer viewport = (MainContainer) WidgetsRegistry.getWidget(UIIdentifiers.MAIN_CONTAINER_VIEWPORT_ID); + viewport.layout(true); + } + + public static void refreshConsole() { + ConsolePanel console = WidgetsRegistry.getConsole(); + if (console != null) { + console.refresh(); + } + } + + public static void refreshResourceDetails() { + WidgetsRegistry.getPanel(UIIdentifiers.RESOURCE_DETAIL_GRID_PANEL).getContainer().layout(true); + } + + @SuppressWarnings("unchecked") + public static Grid getResourceDetailGrid() { + Object retval = getResourceDetailPanel().getWidget(); + if (retval == null) { + return null; + } + if (retval != null && retval instanceof Grid) { + return (Grid) retval; + } + return null; + } + + public static ResourceDetailsPanel getResourceDetailPanel() { + try { + Object o = WidgetsRegistry.getElem(UIIdentifiers.RESOURCE_DETAIL_GRID_CONTAINER_ID, ResourceDetailsPanel.class); + if (o != null && o instanceof ResourceDetailsPanel) { + return (ResourceDetailsPanel) o; + } + return null; + } catch (WidgetNotRegistered e) { + return null; + } + } + + /** + * In the status bar sets the currently selected scope. + * @param scope + */ + public static void setStatusScope(final String scope) { + try { + Status scopeInfo = (Status) WidgetsRegistry.getWidget(UIIdentifiers.STATUS_SCOPE_INFO_ID); + scopeInfo.setText(scope); + + ProxyRegistry.getProxyInstance().setCurrentScope(scope, new AsyncCallback() { + public void onSuccess(final Void result) { + ConsoleMessageBroker.info(this, "The scope has been sent to server"); + } + public void onFailure(final Throwable caught) { + ConsoleMessageBroker.error(this, "The scope has not been sent to server"); + } + }); + + } catch (Exception e) { + ConsoleMessageBroker.error(Commands.class, e.getMessage()); + } + } + + + public static void setLoadedResources(final int number) { + try { + Status loadedResources = (Status) WidgetsRegistry.getWidget(UIIdentifiers.STATUS_LOADED_RESOURCES_ID); + loadedResources.setText(String.valueOf(number)); + } catch (Exception e) { + ConsoleMessageBroker.error(Commands.class, e.getMessage()); + } + } + + + /** + * When masking the component show the rotating gear. + * @param component the element to mask + * @param message the message to show during loading + */ + public static void mask(final String message, final Component component) { + if (component != null) { + if (message != null) { + component.mask(message, "loading-indicator"); + } else { + component.mask(); + } + } + } + + public static void unmask(final Component component) { + if (component != null) { + component.unmask(); + } + } + + public static void mask(final String message, final String... componentIDs) { + for (String componentID : componentIDs) { + if (WidgetsRegistry.containsElem(componentID)) { + try { + if (message == null) { + ((Component) WidgetsRegistry.getWidget(componentID)).mask(); + } else { + ((Component) WidgetsRegistry.getWidget(componentID)).mask(message, "loading-indicator"); + } + } catch (Exception e) {} + } + } + } + + public static void unmask(final String... componentIDs) { + for (String componentID : componentIDs) { + if (WidgetsRegistry.containsElem(componentID)) { + try { + ((Component) WidgetsRegistry.getWidget(componentID)).unmask(); + + } catch (Exception e) {} + } + } + } + + public static void showPopup(final String title, final String text) { + showPopup(title, text, Configuration.popupDelay); + } + + public static void showPopup(final String title, final String text, final int delayMills) { + InfoConfig cfg = new InfoConfig(title, text); + cfg.display = delayMills; + Info.display(cfg); + } + + /** + * Checks that a component is enabled for the current credentials. + * If not it will be disabled and hidden. + * @param w + * @param args a list of enabled groups. + */ + public static final void evaluateCredentials(final Component w, final UserGroup... args) { + if (StatusHandler.getStatus().getCredentials() == null) { + w.setEnabled(false); + w.hide(); + return; + } + for (UserGroup enabledGroup : args) { + if (StatusHandler.getStatus().getCredentials() == enabledGroup) { + w.setEnabled(true); + w.show(); + return; + } + } + w.setEnabled(false); + w.hide(); + } +} diff --git a/src/main/java/org/gcube/portlets/admin/resourcemanagement/client/utils/Messages.java b/src/main/java/org/gcube/portlets/admin/resourcemanagement/client/utils/Messages.java new file mode 100644 index 0000000..220516b --- /dev/null +++ b/src/main/java/org/gcube/portlets/admin/resourcemanagement/client/utils/Messages.java @@ -0,0 +1,27 @@ +/**************************************************************************** + * This software is part of the gCube Project. + * Site: http://www.gcube-system.org/ + **************************************************************************** + * The gCube/gCore software is licensed as Free Open Source software + * conveying to the EUPL (http://ec.europa.eu/idabc/eupl). + * The software and documentation is provided by its authors/distributors + * "as is" and no expressed or + * implied warranty is given for its use, quality or fitness for a + * particular case. + **************************************************************************** + * Filename: Messages.java + **************************************************************************** + * @author Daniele Strollo + ***************************************************************************/ + +package org.gcube.portlets.admin.resourcemanagement.client.utils; + +/** + * @author Daniele Strollo (ISTI-CNR) + * + */ +public class Messages { + public static final String UPDATE_SW_REPOSITORY_FAILURE = "You are not allowed to require the Software Repository Upgrade."; + public static final String UPDATE_SW_REPOSITORY_INSERT_URL = "Insert the URL for upgrade description."; + public static final String NO_SCOPE_SELECTED = "No current scope selected."; +} diff --git a/src/main/java/org/gcube/portlets/admin/resourcemanagement/client/utils/OpCommands.java b/src/main/java/org/gcube/portlets/admin/resourcemanagement/client/utils/OpCommands.java new file mode 100644 index 0000000..ed285af --- /dev/null +++ b/src/main/java/org/gcube/portlets/admin/resourcemanagement/client/utils/OpCommands.java @@ -0,0 +1,290 @@ +/**************************************************************************** + * This software is part of the gCube Project. + * Site: http://www.gcube-system.org/ + **************************************************************************** + * The gCube/gCore software is licensed as Free Open Source software + * conveying to the EUPL (http://ec.europa.eu/idabc/eupl). + * The software and documentation is provided by its authors/distributors + * "as is" and no expressed or + * implied warranty is given for its use, quality or fitness for a + * particular case. + **************************************************************************** + * Filename: OpCommands.java + **************************************************************************** + * @author Daniele Strollo + ***************************************************************************/ + +package org.gcube.portlets.admin.resourcemanagement.client.utils; + +import java.util.List; +import java.util.Vector; + +import org.gcube.portlets.admin.resourcemanagement.client.forms.genericresources.GenericResourceForm; +import org.gcube.portlets.admin.resourcemanagement.client.remote.ProxyRegistry; +import org.gcube.portlets.admin.resourcemanagement.client.widgets.console.ConsoleMessageBroker; +import org.gcube.portlets.admin.resourcemanagement.client.widgets.registry.UIIdentifiers; +import org.gcube.portlets.admin.resourcemanagement.shared.utils.DelayedOperation; +import org.gcube.resourcemanagement.support.client.utils.StatusHandler; +import org.gcube.resourcemanagement.support.client.views.ResourceTypeDecorator; +import org.gcube.resourcemanagement.support.shared.exceptions.InvalidParameterException; +import org.gcube.resourcemanagement.support.shared.operations.SupportedOperations; +import org.gcube.resourcemanagement.support.shared.types.datamodel.ResourceDescriptor; + +import com.extjs.gxt.ui.client.data.ModelData; +import com.extjs.gxt.ui.client.event.Listener; +import com.extjs.gxt.ui.client.event.MessageBoxEvent; +import com.extjs.gxt.ui.client.widget.MessageBox; +import com.google.gwt.user.client.rpc.AsyncCallback; + + +class OpCallBacks { + + public static final AsyncCallback handleGenericOperation(final SupportedOperations op) { + return new AsyncCallback() { + public void onSuccess(final Void result) { + MessageBox.info("Managing resources", "The operation " + op.name() + " has been successfully executed.", null); + if (op == SupportedOperations.GENERIC_RESOURCE_DELETE || + op == SupportedOperations.COLLECTION_DELETE) { + Commands.refreshResourceGrid(); + } + } + + public void onFailure(final Throwable caught) { + MessageBox.info("Managing resources", "The operation " + op.name() + " has failed." + + ((caught != null) ? "
" + caught.getMessage() : "") + + "
See server log for further details.", null); + } + }; + } +} + +/** + * Here the commands for operations on resources. + * @author Daniele Strollo (ISTI-CNR) + * + */ +public class OpCommands { + + /************************************************************* + * GHN + ************************************************************/ + + public static final void doShutdownGHNs(final List ghns) { + List toSend = new Vector(); + for (ModelData rawData : ghns) { + try { + toSend.add(new ResourceDescriptor( + ((Object) rawData.get("Type")).toString(), + null, // The subType is not required here + ((Object) rawData.get("ID")).toString(), + ((Object) rawData.get("Name")).toString())); + } catch (InvalidParameterException e) { + Commands.showPopup("Cannot shutdown GHN", e.getMessage()); + } + } + try { + ProxyRegistry.getProxyInstance().doOperation( + SupportedOperations.GHN_SHUTDOWN, + StatusHandler.getStatus().getCurrentScope(), + toSend, + OpCallBacks.handleGenericOperation(SupportedOperations.GHN_SHUTDOWN) + ); + } catch (Exception e) { + ConsoleMessageBroker.error(OpCommands.class, e.getMessage()); + MessageBox.info( + "Failure", + "the GHNs cannot be shut down", + null); + } + } + + public static final void doRestartGHNs(final List ghns, final boolean clean) { + List toSend = new Vector(); + for (ModelData rawData : ghns) { + try { + toSend.add(new ResourceDescriptor( + ((Object) rawData.get("Type")).toString(), + null, // The subType is not required here + ((Object) rawData.get("ID")).toString(), + ((Object) rawData.get("Name")).toString())); + } catch (InvalidParameterException e) { + Commands.showPopup("Cannot restart GHN", e.getMessage()); + } + } + try { + ProxyRegistry.getProxyInstance().doOperation( + ((clean) ? SupportedOperations.GHN_CLEAN_RESTART : SupportedOperations.GHN_RESTART), + StatusHandler.getStatus().getCurrentScope(), + toSend, + OpCallBacks.handleGenericOperation(SupportedOperations.GHN_RESTART) + ); + } catch (Exception e) { + ConsoleMessageBroker.error(OpCommands.class, e.getMessage()); + MessageBox.info( + "Failure", + "the GHNs cannot be restarted", + null); + } + } + + + /************************************************************* + * DELETE RESOURCE + ************************************************************/ + public static final void doDeleteItems( + final ResourceTypeDecorator type, + final List items, + final SupportedOperations requiredPermissions) { + List toSend = new Vector(); + for (ModelData rawData : items) { + try { + toSend.add(new ResourceDescriptor( + ((Object) rawData.get("Type")).toString(), + null, // The subType is not required here + ((Object) rawData.get("ID")).toString(), + ((Object) rawData.get("Name")).toString())); + } catch (InvalidParameterException e) { + Commands.showPopup("Cannot delete " + type.name(), e.getMessage()); + } + } + try { + ProxyRegistry.getProxyInstance().doOperation( + requiredPermissions, + StatusHandler.getStatus().getCurrentScope(), + toSend, + OpCallBacks.handleGenericOperation(requiredPermissions) + ); + } catch (Exception e) { + ConsoleMessageBroker.error(OpCommands.class, e.getMessage()); + MessageBox.info( + "Failure", + "the selected " + type.name() + "(s) cannot be deleted", + null); + } + } + + + /************************************************************* + * GENERIC RESOURCE + ************************************************************/ + public static final void doOpenGenericResourceForm() { + if (SupportedOperations.GENERIC_RESOURCE_CREATE.isAllowed(StatusHandler.getStatus().getCredentials())) { + new GenericResourceForm().show(); + } else { + MessageBox.alert("Generic Resource Creation", "You are not allowed to execute this operation", null); + } + } + + public static final void doCreateGenericResource( + final String id, + final String name, + final String description, + final String body, + final String subType) { + if (SupportedOperations.GENERIC_RESOURCE_CREATE.isAllowed(StatusHandler.getStatus().getCredentials())) { + ProxyRegistry.getProxyInstance().createGenericResource(id, name, description, body, subType, + new AsyncCallback() { + public void onSuccess(final String result) { + MessageBox.info("Generic Resouce Creation", + "The generic resource " + name + " has been created with ID:
" + result, + null); + new DelayedOperation() { + @Override + public void doJob() { + Commands.refreshResourceGrid(); + } + } + .start(3000); + + } + public void onFailure(final Throwable caught) { + MessageBox.alert("Generic Resouce Creation", + "Generic Resource Creation failure:
" + + ((caught != null && caught.getMessage() != null) ? + caught.getMessage() : + "See server log for further details."), + null); + } + }); + } else { + MessageBox.alert("Generic Resource Creation", "You are not allowed to execute this operation", null); + } + } + + public static final void doEditGenericResource( + final String id, + final String name, + final String description, + final String body, + final String subType) { + if (SupportedOperations.GENERIC_RESOURCE_EDIT.isAllowed(StatusHandler.getStatus().getCredentials())) { + ProxyRegistry.getProxyInstance().updateGenericResource(id, name, description, body, subType, + new AsyncCallback() { + public void onSuccess(final Void result) { + MessageBox.info("Generic Resouce Creation", + "The generic resource " + name + " has been updated", + null); + Commands.refreshResourceGrid(); + } + public void onFailure(final Throwable caught) { + MessageBox.alert("Generic Resouce Creation", + "Generic Resource Creation failure:
" + + ((caught != null && caught.getMessage() != null) ? + caught.getMessage() : + "See server log for further details."), + null); + } + }); + } else { + MessageBox.alert("Generic Resource Creation", "You are not allowed to execute this operation", null); + } + } + + + /************************************************************* + * SERVICE + ************************************************************/ + public static final void doOpenServiceForm() { + if (SupportedOperations.SERVICE_CREATE.isAllowed(StatusHandler.getStatus().getCredentials())) { + MessageBox.alert("Service Creation", "To implement", null); + } else { + MessageBox.alert("Service Creation", "You are not allowed to execute this operation", null); + } + } + + public static final void doGetDeployReport() { + if (SupportedOperations.SERVICE_GET_REPORT.isAllowed(StatusHandler.getStatus().getCredentials())) { + Commands.mask("Requesting deployment report", UIIdentifiers.MAIN_CONTAINER_VIEWPORT_ID); + MessageBox.prompt("Deployment Report Request", "Insert Report ID", false, new Listener() { + public void handleEvent(final MessageBoxEvent be) { + String reportID = be.getValue(); + if (reportID != null && reportID.trim().length() > 0) { + ProxyRegistry.getProxyInstance().checkDeployStatus( + reportID.trim(), + StatusHandler.getStatus().getCurrentScope(), + Callbacks.handleGetDeploymentReport); + } else { + Commands.unmask(UIIdentifiers.MAIN_CONTAINER_VIEWPORT_ID); + Commands.showPopup("Wrong input", "Invalid input.", 4000); + } + } + }); + } + } + + public static final void doGetResourceByID() { + if (SupportedOperations.SERVICE_GET_REPORT.isAllowed(StatusHandler.getStatus().getCredentials())) { + MessageBox.prompt("Lookup Resource", "Insert Resource ID", false, new Listener() { + public void handleEvent(final MessageBoxEvent be) { + String reportID = be.getValue(); + if (reportID != null && reportID.trim().length() > 0) { + Commands.doGetResourceProfileByID(this, StatusHandler.getStatus().getCurrentScope(), reportID.trim()); + } else { + Commands.unmask(UIIdentifiers.MAIN_CONTAINER_VIEWPORT_ID); + Commands.showPopup("Wrong input", "Invalid input.", 4000); + } + } + }); + } + } +} diff --git a/src/main/java/org/gcube/portlets/admin/resourcemanagement/client/views/profile/ResourceProfilePanel.java b/src/main/java/org/gcube/portlets/admin/resourcemanagement/client/views/profile/ResourceProfilePanel.java new file mode 100644 index 0000000..99ef214 --- /dev/null +++ b/src/main/java/org/gcube/portlets/admin/resourcemanagement/client/views/profile/ResourceProfilePanel.java @@ -0,0 +1,97 @@ +/**************************************************************************** + * This software is part of the gCube Project. + * Site: http://www.gcube-system.org/ + **************************************************************************** + * The gCube/gCore software is licensed as Free Open Source software + * conveying to the EUPL (http://ec.europa.eu/idabc/eupl). + * The software and documentation is provided by its authors/distributors + * "as is" and no expressed or + * implied warranty is given for its use, quality or fitness for a + * particular case. + **************************************************************************** + * Filename: ResourceProfilePanel.java + **************************************************************************** + * @author Daniele Strollo + ***************************************************************************/ + +package org.gcube.portlets.admin.resourcemanagement.client.views.profile; + + +import org.gcube.portlets.admin.resourcemanagement.client.widgets.panels.GenericTreePanel; +import org.gcube.resourcemanagement.support.client.views.ResourceTypeDecorator; + +import com.extjs.gxt.ui.client.Style.Scroll; +import com.extjs.gxt.ui.client.data.ModelData; +import com.extjs.gxt.ui.client.widget.Component; +import com.extjs.gxt.ui.client.widget.Html; +import com.extjs.gxt.ui.client.widget.TabItem; +import com.extjs.gxt.ui.client.widget.TabPanel; +import com.extjs.gxt.ui.client.widget.treepanel.TreePanel; + +/** + * @author Daniele Strollo (ISTI-CNR) + * + */ +public class ResourceProfilePanel extends TabPanel { + private String htmlProfile = null; + private String xmlProfile = null; + private static int counter = 0; + private ResourceTypeDecorator type = null; + + public ResourceProfilePanel(final ResourceTypeDecorator type, final String xmlProfile, final String htmlProfile) { + super(); + this.xmlProfile = xmlProfile; + this.htmlProfile = htmlProfile; + this.type = type; + this.init(); + } + + private void init() { + this.setId("resource-profile-panel-" + counter++); + + this.setPlain(true); + this.setHeight("100%"); + + TabItem xmlProfilePanel = new TabItem("XML Profile"); + //xmlProfilePanel.setScrollMode(Scroll.AUTO); + + TreePanel treepanel = null; + // depending on the resource to show the root node will be declared + if (this.type == ResourceTypeDecorator.WSResource) { + treepanel = new GenericTreePanel(xmlProfile, "Document").getWidget(); + } + else if (this.type == ResourceTypeDecorator.DeployReport) { + treepanel = new GenericTreePanel(xmlProfile, "ResourceReport").getWidget(); + } + else if (this.type == ResourceTypeDecorator.AddScopeReport) { + treepanel = new GenericTreePanel(xmlProfile, "ResourceReport").getWidget(); + } + else { + treepanel = new GenericTreePanel(xmlProfile, "Resource").getWidget(); + } + xmlProfilePanel.add(treepanel); + xmlProfilePanel.layout(true); + + xmlProfilePanel.setScrollMode(Scroll.AUTO); + + this.add(xmlProfilePanel); + + TabItem htmlProfilePanel = new TabItem("Source"); + //xmlProfilePanel.setScrollMode(Scroll.AUTO); + + Html htmlContainer = new Html(); + htmlContainer.setId("xml-container-" + counter); + htmlContainer.setHtml(htmlProfile); + htmlContainer.setAutoHeight(true); + + htmlProfilePanel.add(htmlContainer); + htmlProfilePanel.layout(true); + htmlProfilePanel.setScrollMode(Scroll.AUTO); + + this.add(htmlProfilePanel); + } + + public final Component getWidget() { + return this; + } +} diff --git a/src/main/java/org/gcube/portlets/admin/resourcemanagement/client/views/resourcedetails/ContextMenuFactory.java b/src/main/java/org/gcube/portlets/admin/resourcemanagement/client/views/resourcedetails/ContextMenuFactory.java new file mode 100644 index 0000000..e0d651f --- /dev/null +++ b/src/main/java/org/gcube/portlets/admin/resourcemanagement/client/views/resourcedetails/ContextMenuFactory.java @@ -0,0 +1,723 @@ +/**************************************************************************** + * This software is part of the gCube Project. + * Site: http://www.gcube-system.org/ + **************************************************************************** + * The gCube/gCore software is licensed as Free Open Source software + * conveying to the EUPL (http://ec.europa.eu/idabc/eupl). + * The software and documentation is provided by its authors/distributors + * "as is" and no expressed or + * implied warranty is given for its use, quality or fitness for a + * particular case. + **************************************************************************** + * Filename: ContextMenuFactory.java + **************************************************************************** + * @author Daniele Strollo + ***************************************************************************/ + +package org.gcube.portlets.admin.resourcemanagement.client.views.resourcedetails; + +import java.util.List; +import java.util.Vector; + +import org.gcube.portlets.admin.resourcemanagement.client.forms.genericresources.GenericResourceForm; +import org.gcube.portlets.admin.resourcemanagement.client.remote.ProxyRegistry; +import org.gcube.portlets.admin.resourcemanagement.client.utils.Commands; +import org.gcube.portlets.admin.resourcemanagement.client.utils.OpCommands; + +import org.gcube.portlets.admin.resourcemanagement.client.widgets.console.ConsoleMessageBroker; +import org.gcube.portlets.admin.resourcemanagement.client.widgets.registry.UIIdentifiers; + +import org.gcube.resourcemanagement.support.client.utils.StatusHandler; +import org.gcube.resourcemanagement.support.client.views.ResourceTypeDecorator; +import org.gcube.resourcemanagement.support.shared.operations.SupportedOperations; +import org.gcube.resourcemanagement.support.shared.types.Tuple; +import org.gcube.resourcemanagement.support.shared.types.datamodel.ResourceDescriptor; +import org.gcube.resourcemanagement.support.shared.types.datamodel.ResourceDetailModel; + +import com.extjs.gxt.ui.client.data.ModelData; +import com.extjs.gxt.ui.client.event.ComponentEvent; +import com.extjs.gxt.ui.client.event.Listener; +import com.extjs.gxt.ui.client.event.MessageBoxEvent; +import com.extjs.gxt.ui.client.widget.MessageBox; +import com.extjs.gxt.ui.client.widget.menu.Menu; +import com.extjs.gxt.ui.client.widget.menu.MenuItem; +import com.extjs.gxt.ui.client.widget.menu.SeparatorMenuItem; +import com.google.gwt.core.client.GWT; +import com.google.gwt.user.client.Window; +import com.google.gwt.user.client.rpc.AsyncCallback; + +/** + * @author Daniele Strollo + * @author Massimiliano Assante (ISTI-CNR) + * @version 2.0 Feb 2012 + */ +public class ContextMenuFactory { + private static final ContextMenuFactory INSTANCE = new ContextMenuFactory(); + + public static ContextMenuFactory getInstance() { + return INSTANCE; + } + + public final synchronized Menu buildContextMenu(final String resType, final ResourceDetailsPanel container) { + + Menu menu = new Menu(); + /************************************************************* + * FOR ALL RESOURCES + ************************************************************/ + + MenuItem getProfile = new MenuItem("Retrieve Profile") { + @Override + protected void onClick(final ComponentEvent be) { + super.onClick(be); + List selectedElems = container.getSelection(); + for (ModelData selectedElem : selectedElems) { + String type = ((Object) selectedElem.get("Type")).toString(); + String resID = ((Object) selectedElem.get("ID")).toString(); + String scope = StatusHandler.getStatus().getCurrentScope(); + Commands.doGetResourceProfile(this, scope, type, resID); + } + } + }; + getProfile.setIconStyle("profile-icon"); + menu.add(getProfile); + + MenuItem getErrors = new MenuItem("Validate") { + @Override + protected void onClick(final ComponentEvent be) { + super.onClick(be); + List selectedElems = container.getSelection(); + for (ModelData selectedElem : selectedElems) { + boolean isValid = true; + String[] reqs = ResourceDetailModel.getRequiredFields(((Object) selectedElem.get("Type")).toString()); + + for (String req : reqs) { + if (selectedElem.get(req) == null || ((Object) selectedElem.get(req)).toString().trim().length() == 0) { + isValid = false; + // Adds to the model with problems the error code + Commands.showPopup("Validation: Failure", "The value for field " + req + " is invalid"); + } + } + + if (isValid) { + Commands.showPopup("Validation: Success", "The current element is valid", 6000); + } + } + } + }; + getErrors.setIconStyle("validate-icon"); + menu.add(getErrors); + + + + MenuItem addToScope = new MenuItem("Add To Scope"); + final Menu addToScopeSub = new Menu(); + final Menu removeFromScopeSub = new Menu(); + + ProxyRegistry.getProxyInstance().getAvailableAddScopes(new AsyncCallback>() { + + public void onSuccess(final List result) { + for (final String scope : result) { + /* + * REMOVE FROM SCOPE RPC + */ + removeFromScopeSub.add(new MenuItem(scope) { + @Override + protected void onClick(final ComponentEvent be) { + super.onClick(be); + Commands.mask("Applying remove scope", UIIdentifiers.MAIN_CONTAINER_VIEWPORT_ID); + List selectedElems = container.getSelection(); + String resType = null; + List resourceIDs = new Vector(); + + // Builds the list of IDs to add to scope + for (ModelData selectedElem : selectedElems) { + if (resType == null) { + resType = ((Object) selectedElem.get("Type")).toString(); + } + resourceIDs.add(((Object) selectedElem.get("ID")).toString()); + + ConsoleMessageBroker.info(this, + "Removing ID: " + ((Object) selectedElem.get("ID")).toString() + + " type: " + ((Object) selectedElem.get("Type")).toString() + + " to scope: " + scope + ); + } + + ProxyRegistry.getProxyInstance().removeResourcesFromScope(resType, resourceIDs, scope, + new AsyncCallback>() { + public void onSuccess(final Tuple result) { + Commands.unmask(UIIdentifiers.MAIN_CONTAINER_VIEWPORT_ID); + if (result.get(0).equals("ACK")) { + MessageBox.info("Remove From Scope", + "The required remove from scope operation has been applied.
", null); + } else { + MessageBox.alert("Remove from Scope", + "The required remove from scope operation has NOT been applied.
" + + result.get(0), + null); + } + } + public void onFailure(final Throwable caught) { + Commands.unmask(UIIdentifiers.MAIN_CONTAINER_VIEWPORT_ID); + MessageBox.alert( + "Remove form Scope error", + "The required operation has not been applied due to server error:
" + caught.getMessage(), + null); + } + }); + } + }); + /* + * ADD TO SCOPE RPC + */ + + addToScopeSub.add(new MenuItem(scope) { + @Override + protected void onClick(final ComponentEvent be) { + super.onClick(be); + Commands.mask("Applying add scope", UIIdentifiers.MAIN_CONTAINER_VIEWPORT_ID); + List selectedElems = container.getSelection(); + String resType = null; + List resourceIDs = new Vector(); + + // Builds the list of IDs to add to scope + for (ModelData selectedElem : selectedElems) { + if (resType == null) { + resType = ((Object) selectedElem.get("Type")).toString(); + } + resourceIDs.add(((Object) selectedElem.get("ID")).toString()); + + ConsoleMessageBroker.info(this, + "Adding ID: " + ((Object) selectedElem.get("ID")).toString() + + " type: " + ((Object) selectedElem.get("Type")).toString() + + " to scope: " + scope + ); + } + + ProxyRegistry.getProxyInstance().addResourcesToScope(resType, resourceIDs, scope, + new AsyncCallback>() { + public void onSuccess(final Tuple result) { + Commands.unmask(UIIdentifiers.MAIN_CONTAINER_VIEWPORT_ID); + if (result != null) { + MessageBox.info("Add to Scope", + "The required add to scope operation has been applied.
" + + "The generated report ID is:
" + + "" + result.get(0) + "", + null); + Commands.buildAddToScopeReport(result); + } else { + MessageBox.alert("Add to Scope", + "The required add to scope operation has been applied.
" + + "But the resulting report ID is null or invalid.", + null); + } + } + public void onFailure(final Throwable caught) { + Commands.unmask(UIIdentifiers.MAIN_CONTAINER_VIEWPORT_ID); + MessageBox.alert( + "Add to Scope error", + "The required operation has not been applied:
" + caught.getMessage(), + null); + } + }); + } + }); + } + } + + public void onFailure(final Throwable caught) { + Commands.unmask(UIIdentifiers.MAIN_CONTAINER_VIEWPORT_ID, UIIdentifiers.RESOURCE_DETAIL_GRID_PANEL); + } + }); + addToScope.setSubMenu(addToScopeSub); + Commands.evaluateCredentials( + addToScope, + SupportedOperations.ADD_TO_SCOPE.getPermissions()); + addToScope.setIconStyle("addtoscope-icon"); + menu.add(addToScope); + + /************************************************************* + * REMOVE FROM SCOPE + ************************************************************/ + MenuItem removeFromScope = new MenuItem("Remove From Scope"); + removeFromScope.setSubMenu(removeFromScopeSub); + Commands.evaluateCredentials( + removeFromScope, + SupportedOperations.ADD_TO_SCOPE.getPermissions()); + removeFromScope.setIconStyle("removefromscope-icon"); + menu.add(removeFromScope); + + /************************************************************* + * GHN + ************************************************************/ + if (resType.equals(ResourceTypeDecorator.GHN.name())) { + + // 0 - GETRELATED button + MenuItem getRelated = new MenuItem("Get Related") { + @Override + protected void onClick(final ComponentEvent be) { + super.onClick(be); + Commands.doGetRelatedResources(ResourceTypeDecorator.GHN.name(), + ((Object) container.getSelection().get(0).get("ID")).toString(), + StatusHandler.getStatus().getCurrentScope()); + } + }; + getRelated.setIconStyle("link-icon"); + menu.add(getRelated); + + // 0 - DELETE button + menu.add(this.createSeparator(SupportedOperations.GHN_DELETE)); + menu.add(this.createDeleteButton( + container, + ResourceTypeDecorator.GHN, + SupportedOperations.GHN_DELETE)); + + // 1 - Force DELETE button + menu.add(this.createForceDeleteButton( + container, + ResourceTypeDecorator.GHN, + SupportedOperations.GHN_FORCE_DELETE)); + + // 1 - RESTART + menu.add(this.createSeparator(SupportedOperations.GHN_RESTART)); + + MenuItem restart = new MenuItem("Restart") { + @Override + protected void onClick(final ComponentEvent be) { + super.onClick(be); + MessageBox.confirm("GHN Restart", "Are you sure you want to restart the selected GHN(s)?", + new Listener() { + public void handleEvent(final MessageBoxEvent be) { + + if (be.getButtonClicked().getItemId().equalsIgnoreCase("yes")) { + // - THE OPERATION IF CONFIRMED + for (ModelData e : container.getSelection()) { + ConsoleMessageBroker.info(this, "Required restart for: " + e.get("Name") + " " + e.get("ID")); + } + OpCommands.doRestartGHNs(container.getSelection(), false); + } + } + }); + } + }; + Commands.evaluateCredentials( + restart, + SupportedOperations.GHN_RESTART.getPermissions()); + restart.setIconStyle("restart-icon"); + menu.add(restart); + + // 2 - CLEAN RESTART + MenuItem cleanRestart = new MenuItem("Clean & Restart") { + @Override + protected void onClick(final ComponentEvent be) { + super.onClick(be); + MessageBox.confirm("GHN Restart", "Are you sure you want to clean and restart the selected GHN(s)?", + new Listener() { + public void handleEvent(final MessageBoxEvent be) { + + if (be.getButtonClicked().getItemId().equalsIgnoreCase("yes")) { + // - THE OPERATION IF CONFIRMED + for (ModelData e : container.getSelection()) { + ConsoleMessageBroker.info(this, "Required restart for: " + e.get("Name") + " " + e.get("ID")); + } + OpCommands.doRestartGHNs(container.getSelection(), true); + } + } + }); + } + }; + Commands.evaluateCredentials( + cleanRestart, + SupportedOperations.GHN_CLEAN_RESTART.getPermissions()); + cleanRestart.setIconStyle("clean-restart-icon"); + menu.add(cleanRestart); + + // 3 - SHUTDOWN + MenuItem shutdown = new MenuItem("Shutdown") { + @Override + protected void onClick(final ComponentEvent be) { + super.onClick(be); + MessageBox.confirm("GHN Shutdown", "Are you sure you want to shut down the selected GHN(s)?", + new Listener() { + public void handleEvent(final MessageBoxEvent be) { + + if (be.getButtonClicked().getItemId().equalsIgnoreCase("yes")) { + // - THE OPERATION IF CONFIRMED + for (ModelData e : container.getSelection()) { + ConsoleMessageBroker.info(this, "Required shutdown for: " + e.get("Name") + " " + e.get("ID")); + } + OpCommands.doShutdownGHNs(container.getSelection()); + } + } + }); + } + }; + Commands.evaluateCredentials( + shutdown, + SupportedOperations.GHN_SHUTDOWN.getPermissions()); + shutdown.setIconStyle("shutdown-icon"); + menu.add(shutdown); + } // - ENDOF GHN + + + /************************************************************* + * RUNNING INSTANCE + ************************************************************/ + if (resType.equals(ResourceTypeDecorator.RunningInstance.name())) { + // 0 - GETRELATED button + MenuItem getRelated = new MenuItem("Get Related") { + @Override + protected void onClick(final ComponentEvent be) { + super.onClick(be); + Commands.doGetRelatedResources(ResourceTypeDecorator.RunningInstance.name(), + ((Object) container.getSelection().get(0).get("ID")).toString(), + StatusHandler.getStatus().getCurrentScope()); + } + }; + getRelated.setIconStyle("link-icon"); + menu.add(getRelated); + + // 1 - undeploy + MenuItem undeploy = new MenuItem("Undeploy") { + @Override + protected void onClick(final ComponentEvent be) { + super.onClick(be); + MessageBox.confirm("Running Instance Undeploy", "Are you sure you want to undeploy the selected RI(s)?", + new Listener() { + public void handleEvent(final MessageBoxEvent be) { + + if (be.getButtonClicked().getItemId().equalsIgnoreCase("yes")) { + Vector resources = new Vector(); + // - THE OPERATION IF CONFIRMED + for (ModelData e : container.getSelection()) { + ConsoleMessageBroker.info(this, "Required undeploy for: " + e.get("Name") + " " + e.get("ID")); + try { + resources.add(new ResourceDescriptor( + ResourceTypeDecorator.RunningInstance.name(), + null, + ((Object) e.get("ID")).toString(), + ((Object) e.get("Name")).toString())); + } catch (Exception ex) { + MessageBox.alert( + "Generic Resource Edit", + "Failure
" + ex.getMessage(), + null); + } + } + + try { + ProxyRegistry.getProxyInstance().doOperation( + SupportedOperations.RUNNING_INSTANCE_UNDEPLOY, + StatusHandler.getStatus().getCurrentScope(), + resources, //lista id risorse selzionati + new AsyncCallback() { + @Override + public void onSuccess(final Void result) { + Commands.showPopup("Undeployment", "success"); + } + @Override + public void onFailure( + final Throwable caught) { + Commands.showPopup("Undeployment", "failure"); + } + }); + } catch (Exception e) { + MessageBox.alert( + "Generic Resource Edit", + "Failure
" + e.getMessage(), + null); + } + } + } + }); + } + }; + Commands.evaluateCredentials( + undeploy, + SupportedOperations.RUNNING_INSTANCE_UNDEPLOY.getPermissions()); + undeploy.setIconStyle("delete-icon"); + menu.add(undeploy); + } + + /************************************************************* + * SERVICE + ************************************************************/ + if (resType.equals(ResourceTypeDecorator.Service.name())) { + // 0 - GETRELATED button + MenuItem getRelated = new MenuItem("Get Related") { + @Override + protected void onClick(final ComponentEvent be) { + super.onClick(be); + Commands.doGetRelatedResources(ResourceTypeDecorator.Service.name(), + ((Object) container.getSelection().get(0).get("ID")).toString(), + StatusHandler.getStatus().getCurrentScope()); + } + }; + getRelated.setIconStyle("link-icon"); + menu.add(getRelated); + } + + /************************************************************* + * GENERIC RESOURCE + ************************************************************/ + if (resType.equals(ResourceTypeDecorator.GenericResource.name())) { + + // 0 - EDIT + MenuItem edit = new MenuItem("Edit") { + @Override + protected void onClick(final ComponentEvent be) { + final List selection = container.getSelection(); + if (selection != null && selection.size() == 1) { + ProxyRegistry.getProxyInstance().getGenericResourceDescriptor( + StatusHandler.getStatus().getCurrentScope(), + ((Object) selection.get(0).get("ID")).toString(), + new AsyncCallback() { + public void onSuccess(final ResourceDescriptor result) { + new GenericResourceForm(result).show(); + } + public void onFailure(final Throwable caught) { + MessageBox.alert( + "Generic Resource Edit", + "Failure
" + caught.getMessage(), + null); + } + }); + } else { + MessageBox.info("Editing resource", "The editing is allowed on a single selected item", null); + } + } + }; + Commands.evaluateCredentials( + edit, + SupportedOperations.GHN_SHUTDOWN.getPermissions()); + edit.setIconStyle("edit-icon"); + menu.add(edit); + + + // 1 - DELETE button + menu.add(this.createSeparator(SupportedOperations.GENERIC_RESOURCE_DELETE)); + menu.add(this.createDeleteButton( + container, + ResourceTypeDecorator.GenericResource, + SupportedOperations.GENERIC_RESOURCE_DELETE)); + + // 2 - Force DELETE button + menu.add(this.createForceDeleteButton( + container, + ResourceTypeDecorator.GenericResource, + SupportedOperations.GENERIC_RESOURCE_FORCE_DELETE)); + } // - ENDOF generic resource + + + /************************************************************* + * RUNTIME RESOURCE + ************************************************************/ + + if (resType.equals(ResourceTypeDecorator.RuntimeResource.name())) { + // 0 - EDIT button + menu.add(this.createSeparator(SupportedOperations.RUNTIME_RESOURCE_DELETE)); + menu.add(this.createEditButton( + container, + ResourceTypeDecorator.RuntimeResource, + SupportedOperations.RUNTIME_RESOURCE_DELETE)); + + // 1 - DELETE button + menu.add(this.createSeparator(SupportedOperations.RUNTIME_RESOURCE_DELETE)); + menu.add(this.createDeleteButton( + container, + ResourceTypeDecorator.RuntimeResource, + SupportedOperations.RUNTIME_RESOURCE_DELETE)); + + // 2 - Force DELETE button + menu.add(this.createForceDeleteButton( + container, + ResourceTypeDecorator.RuntimeResource, + SupportedOperations.RUNTIME_RESOURCE_FORCE_DELETE)); + } + + /************************************************************* + * COLLECTION + ************************************************************/ + if (resType.equals(ResourceTypeDecorator.Collection.name())) { + // 0 - DELETE button + menu.add(this.createSeparator(SupportedOperations.COLLECTION_DELETE)); + menu.add(this.createDeleteButton( + container, + ResourceTypeDecorator.Collection, + SupportedOperations.COLLECTION_DELETE)); + + // 1 - Force DELETE button + menu.add(this.createForceDeleteButton( + container, + ResourceTypeDecorator.Collection, + SupportedOperations.COLLECTION_FORCE_DELETE)); + } // - ENDOF Collection + + /************************************************************* + * METADATA COLLECTION + ************************************************************/ + if (resType.equals(ResourceTypeDecorator.VIEW.name())) { + // 0 - DELETE button + menu.add(this.createSeparator(SupportedOperations.VIEW_DELETE)); + menu.add(this.createDeleteButton( + container, + ResourceTypeDecorator.VIEW, + SupportedOperations.VIEW_DELETE)); + + // 1 - Force DELETE button + menu.add(this.createForceDeleteButton( + container, + ResourceTypeDecorator.VIEW, + SupportedOperations.VIEW_FORCE_DELETE)); + } // - ENDOF Metadata Collection + + return menu; + } + + private SeparatorMenuItem createSeparator(final SupportedOperations operationID) { + // Builds the separator + SeparatorMenuItem separator = new SeparatorMenuItem(); + if (operationID != null) { + Commands.evaluateCredentials( + separator, + operationID.getPermissions()); + } + return separator; + } + + private MenuItem createDeleteButton( + final ResourceDetailsPanel container, + final ResourceTypeDecorator resType, + final SupportedOperations operationID) { + + // Builds the delete button + MenuItem delete = new MenuItem("Delete") { + @Override + protected void onClick(final ComponentEvent be) { + super.onClick(be); + MessageBox.confirm(resType.getLabel() + " Delete", + "Are you sure you want to delete the selected " + resType.getLabel() + "(s)?", + new Listener() { + public void handleEvent(final MessageBoxEvent be) { + if (be.getButtonClicked().getItemId().equalsIgnoreCase("yes")) { + // - THE OPERATION IF CONFIRMED + try { + for (ModelData e : container.getSelection()) { + ConsoleMessageBroker.info(this, "Required force delete for: " + e.get("Name") + " " + e.get("ID")); + } + } catch (Exception e) { + ConsoleMessageBroker.error(this, e.getMessage()); + } + OpCommands.doDeleteItems(resType, container.getSelection(), operationID); + } + } + }); + + + } + }; + // Checks the permissions on the operation + Commands.evaluateCredentials( + delete, + operationID.getPermissions()); + delete.setIconStyle("delete-icon"); + return delete; + } + + private MenuItem createEditButton( + final ResourceDetailsPanel container, + final ResourceTypeDecorator resType, + final SupportedOperations operationID) { + + // Builds the delete button + MenuItem edit = new MenuItem("Edit Runtime Resource") { + @Override + protected void onClick(final ComponentEvent be) { + String idToEdit = ""; + for (ModelData e : container.getSelection()) { + idToEdit = e.get("ID"); + } + loadRuntimeResourcePortlet(idToEdit); + } + }; + // Checks the permissions on the operation + Commands.evaluateCredentials( + edit, + operationID.getPermissions()); + edit.setIconStyle("edit-icon"); + return edit; + } + + private MenuItem createForceDeleteButton( + final ResourceDetailsPanel container, + final ResourceTypeDecorator resType, + final SupportedOperations operationID) { + + // Builds the delete button + MenuItem delete = new MenuItem("Force Delete") { + @Override + protected void onClick(final ComponentEvent be) { + super.onClick(be); + MessageBox.confirm(resType.getLabel() + " Force Delete", + "Are you sure you want to delete the selected " + resType.getLabel() + "(s)?", + new Listener() { + public void handleEvent(final MessageBoxEvent be) { + if (be.getButtonClicked().getItemId().equalsIgnoreCase("yes")) { + // - THE OPERATION IF CONFIRMED + try { + for (ModelData e : container.getSelection()) { + ConsoleMessageBroker.info(this, "Required force delete for: " + e.get("Name") + " " + e.get("ID")); + } + } catch (Exception e) { + ConsoleMessageBroker.error(this, e.getMessage()); + } + OpCommands.doDeleteItems(resType, container.getSelection(), operationID); + } + } + }); + + + } + }; + // Checks the permissions on the operation + Commands.evaluateCredentials( + delete, + operationID.getPermissions()); + delete.setIconStyle("force-delete-icon"); + return delete; + } + + String location; + /** + * Redirect to Runtime Resource Portlet + * @param idToEdit + */ + public void loadRuntimeResourcePortlet(String idToEdit){ + + getUrl(); + // Window.alert(location); + + if (location.endsWith("/") || location.endsWith("#")) { //standalone + location = com.google.gwt.user.client.Window.Location.getProtocol() +"//"+ com.google.gwt.user.client.Window.Location.getHost() + "/runtime-resource?pid=126&lifecycle=0&state=maximized&modes=view&doAsId=10136&refererPlid=10139&rid="+idToEdit+"&authzToken=101334249&curscope="+StatusHandler.getStatus().getCurrentScope(); + //GWT.log("OPEN " + location); + getURL(location); + } + else { //portal + getUrl(); + location += "/../runtime-resource?pid=126&lifecycle=0&state=maximized&modes=view&doAsId=10136&refererPlid=10139&rid="+idToEdit+"&authzToken=101334249&curscope="+StatusHandler.getStatus().getCurrentScope(); + Window.open(location, "_self", ""); + } + + } + + public static native void getURL(String url)/*-{ + $wnd.open(url,'target=_blank') + }-*/; + + /** + * Get URL from browser + */ + public native void getUrl()/*-{ + this.@org.gcube.portlets.admin.resourcemanagement.client.views.resourcedetails.ContextMenuFactory::location = $wnd.location.href; + }-*/; +} diff --git a/src/main/java/org/gcube/portlets/admin/resourcemanagement/client/views/resourcedetails/CustomSorter.java b/src/main/java/org/gcube/portlets/admin/resourcemanagement/client/views/resourcedetails/CustomSorter.java new file mode 100644 index 0000000..5d5855b --- /dev/null +++ b/src/main/java/org/gcube/portlets/admin/resourcemanagement/client/views/resourcedetails/CustomSorter.java @@ -0,0 +1,65 @@ +package org.gcube.portlets.admin.resourcemanagement.client.views.resourcedetails; + +import com.extjs.gxt.ui.client.data.ModelData; +import com.extjs.gxt.ui.client.store.Store; +import com.extjs.gxt.ui.client.store.StoreSorter; +import com.google.gwt.core.client.GWT; + +public class CustomSorter extends StoreSorter { + /** + * need to recalculate the percentage as the returned value is not what the render returns + */ + @Override + public int compare(Store store, ModelData m1, ModelData m2, String property) { + if (property != null) { + if (property.equals("VirtualAvailable")) { + String s1 = m1.get(property); + String s2 = m2.get(property); + int val1 = Integer.parseInt(s1); + int val2 = Integer.parseInt(s2); + + int tot1 = Integer.parseInt((String) m1.get("VirtualSize")); + int tot2 = Integer.parseInt((String) m2.get("VirtualSize")); + + int percentage1 = (val1 * 100) / tot1; + int percentage2 = (val2 * 100) / tot2; + + //GWT.log(val1 +"-"+val2); + GWT.log(""+percentage1); + if (percentage1 == percentage2) return 0; + if (percentage1 > percentage2) + return 1; + else + return -1; + } + else if (property.equals("LocalAvailableSpace")) { + String s1 = m1.get(property); + String s2 = m2.get(property); + int val1 = Integer.parseInt(s1); + int val2 = Integer.parseInt(s2); + + if (val1 == val2) return 0; + if (val1 > val2) + return 1; + else + return -1; + } + else if (property.equals("NumberOfMembers") || property.equals("Cardinality")) { + String s1 = m1.get(property); + String s2 = m2.get(property); + int val1 = Integer.parseInt(s1); + int val2 = Integer.parseInt(s2); + + if (val1 == val2) return 0; + if (val1 > val2) + return 1; + else + return -1; + } + Object v1 = m1.get(property); + Object v2 = m2.get(property); + return comparator.compare(v1, v2); + } + return comparator.compare(m1, m2); + } +} diff --git a/src/main/java/org/gcube/portlets/admin/resourcemanagement/client/views/resourcedetails/ResourceDetailsPanel.java b/src/main/java/org/gcube/portlets/admin/resourcemanagement/client/views/resourcedetails/ResourceDetailsPanel.java new file mode 100644 index 0000000..4cca817 --- /dev/null +++ b/src/main/java/org/gcube/portlets/admin/resourcemanagement/client/views/resourcedetails/ResourceDetailsPanel.java @@ -0,0 +1,422 @@ +/**************************************************************************** + * This software is part of the gCube Project. + * Site: http://www.gcube-system.org/ + **************************************************************************** + * The gCube/gCore software is licensed as Free Open Source software + * conveying to the EUPL (http://ec.europa.eu/idabc/eupl). + * The software and documentation is provided by its authors/distributors + * "as is" and no expressed or + * implied warranty is given for its use, quality or fitness for a + * particular case. + **************************************************************************** + * Filename: ResourceDetailsPanel.java + **************************************************************************** + * @author Daniele Strollo + ***************************************************************************/ + +package org.gcube.portlets.admin.resourcemanagement.client.views.resourcedetails; + +import java.util.List; +import java.util.Vector; + +import org.gcube.portlets.admin.resourcemanagement.client.forms.DeployServicesForm; +import org.gcube.portlets.admin.resourcemanagement.client.utils.Commands; +import org.gcube.portlets.admin.resourcemanagement.client.utils.OpCommands; +import org.gcube.portlets.admin.resourcemanagement.client.widgets.console.ConsoleMessageBroker; +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.software_upload_wizard.client.AppController; +import org.gcube.resourcemanagement.support.client.utils.StatusHandler; +import org.gcube.resourcemanagement.support.client.views.ResourceTypeDecorator; +import org.gcube.resourcemanagement.support.shared.operations.SupportedOperations; +import org.gcube.resourcemanagement.support.shared.types.datamodel.ResourceDetailModel; + +import com.extjs.gxt.ui.client.data.ModelData; +import com.extjs.gxt.ui.client.event.BaseEvent; +import com.extjs.gxt.ui.client.event.ComponentEvent; +import com.extjs.gxt.ui.client.event.Events; +import com.extjs.gxt.ui.client.event.GridEvent; +import com.extjs.gxt.ui.client.event.Listener; +import com.extjs.gxt.ui.client.store.GroupingStore; +import com.extjs.gxt.ui.client.store.ListStore; +import com.extjs.gxt.ui.client.widget.Component; +import com.extjs.gxt.ui.client.widget.ContentPanel; +import com.extjs.gxt.ui.client.widget.Text; +import com.extjs.gxt.ui.client.widget.button.Button; +import com.extjs.gxt.ui.client.widget.button.ToolButton; +import com.extjs.gxt.ui.client.widget.grid.Grid; +import com.extjs.gxt.ui.client.widget.grid.GridViewConfig; +import com.extjs.gxt.ui.client.widget.grid.GroupingView; +import com.extjs.gxt.ui.client.widget.layout.FitLayout; +import com.extjs.gxt.ui.client.widget.toolbar.SeparatorToolItem; +import com.extjs.gxt.ui.client.widget.toolbar.ToolBar; +import com.google.gwt.core.client.GWT; +import com.google.gwt.core.client.RunAsyncCallback; +import com.google.gwt.event.shared.HandlerManager; +import com.google.gwt.user.client.Window; + +/** + * @author Massimiliano Assante (ISTI-CNR) + * @author Daniele Strollo + * @version 2.1 APR 2012 + */ +public class ResourceDetailsPanel { + private ContentPanel rootPanel = null; + private Component widget = null; + private boolean groupingEnabled = true; + private String collapsibleColumn = "SubType"; + private ToolBar toolBar = new ToolBar(); + private final static String btnGroupID = "btn-grid-group"; + private final static String btnRefreshID = "btn-grid-refresh"; + private boolean highlightInvalidFields = false; + + public ResourceDetailsPanel() { + this.widget = new Text(); + this.init(); + } + + private ListStore getStore() { + return this.getGrid().getStore(); + } + + public final List getElemsForInstall() { + List retval = new Vector(); + for (ModelData r : this.getStore().getModels()) { + if (r.getProperties().containsKey(ResourceDetailModel.SERVICE_INSTALL_KEY) && + Boolean.parseBoolean(((Object) r.get(ResourceDetailModel.SERVICE_INSTALL_KEY)).toString())) { + retval.add(r); + } + } + return retval; + } + + public final void refreshModel() { + for (ModelData s : this.getSelection()) { + this.getStore().update(s); + } + } + + public final List getSelection() { + if (this.getGrid() == null || this.getGrid().getSelectionModel().getSelection() == null) { + return null; + } + return this.getGrid().getSelectionModel().getSelection(); + } + + /** + * Method called at initialization phase (Constructor). + */ + public final void init() { + this.rootPanel = new ContentPanel(new FitLayout()); + this.rootPanel.setHeading("Resource Details"); + this.widget.setId("res-details-widget-fake"); + this.widget.setStyleName("x-panel-cube-background"); + + // The first creation of button + Button groupButton = new Button() { + @Override + protected void onClick(final ComponentEvent ce) { + super.onClick(ce); + if (groupingEnabled) { + disableGrouping(); + } else { + enableGrouping(); + } + } + }; + groupButton.setId(btnGroupID); + groupButton.setIconStyle("grid-icon"); + groupButton.setToolTip("Enables/Disables grouping by " + this.collapsibleColumn); + this.toolBar.add(new SeparatorToolItem()); + this.toolBar.add(groupButton); + + // The first creation of button + Button refreshButton = new Button() { + @Override + protected void onClick(final ComponentEvent ce) { + Commands.refreshResourceGrid(); + } + }; + refreshButton.setId(btnRefreshID); + refreshButton.setIconStyle("refresh-icon"); + refreshButton.setToolTip("Refresh grid"); + this.toolBar.add(refreshButton); + + this.rootPanel.setTopComponent(this.toolBar); + } + + public final void toggleHighlightInvalidFields() { + this.highlightInvalidFields = !this.highlightInvalidFields; + if (this.getGridView() != null) { + this.getGridView().refresh(true); + } + } + + public final ToolBar getToolBar() { + return this.toolBar; + } + + public final Component getWidget() { + return this.widget; + } + + private void disableGrouping() { + GroupingStore groupingStore = null; + if (this.getStore() instanceof GroupingStore) { + groupingStore = (GroupingStore) this.getStore(); + if (groupingStore != null) { + groupingStore.clearGrouping(); + } + this.groupingEnabled = false; + } + } + + private void enableGrouping() { + GroupingStore groupingStore = null; + if (this.getStore() instanceof GroupingStore) { + groupingStore = (GroupingStore) this.getStore(); + if (groupingStore != null) { + groupingStore.groupBy(collapsibleColumn); + } + this.groupingEnabled = true; + } + } + + @SuppressWarnings("unchecked") + public final Grid getGrid() { + if (this.getWidget() != null && this.getWidget() instanceof Grid) { + return (Grid) this.getWidget(); + } + return null; + } + + private GroupingView getGridView() { + if (this.getGrid() != null && this.getGrid().getView() instanceof GroupingView) { + return (GroupingView) this.getGrid().getView(); + } + return null; + } + + public final void setWidget(final Component widget, final boolean enableGrouping) { + this.rootPanel.removeAll(); + this.widget = widget; + rootPanel.add(this.widget); + + Button groupButton = null; + try { + groupButton = (Button) this.toolBar.getItemByItemId(ResourceDetailsPanel.btnGroupID); + groupButton.setEnabled(enableGrouping); + } catch (Exception e) { + ConsoleMessageBroker.error(this, "During set widget. " + e.getMessage()); + } + + // FIXME check if needed --- Commands.refreshResourceDetails(); + } + + public final ContentPanel getContainer() { + return this.rootPanel; + } + + private void resetToolBar() { + List buttons = this.getToolBar().getItems(); + List toRemove = new Vector(); + if (buttons.size() > 3) { + for (int i = 3; i < buttons.size(); i++) { + toRemove.add(buttons.get(i)); + } + } + if (toRemove.size() > 0) { + for (Component c : toRemove) { + this.getToolBar().remove(c); + } + } + } + + public final void initToolbar() { + String resType = StatusHandler.getStatus().getCurrentResourceType(); + + // Removes from the toolbar specific buttons + resetToolBar(); + + /************************************************ + * GENERIC RESOURCE - customized toolbar + ***********************************************/ + + // Adds toolbar buttons for Generic Resources + if (resType.equals(ResourceTypeDecorator.GenericResource.name()) && + SupportedOperations.GENERIC_RESOURCE_CREATE.isAllowed(StatusHandler.getStatus().getCredentials())) { + this.getToolBar().add(new SeparatorToolItem()); + ToolButton createNew = new ToolButton("new-icon") { + @Override + protected void onClick(final ComponentEvent ce) { + super.onClick(ce); + OpCommands.doOpenGenericResourceForm(); + } + }; + createNew.setToolTip("Create new Generic Resource"); + this.getToolBar().add(createNew); + } + + /************************************************ + * SERVICES - customized toolbar + ***********************************************/ + + // Adds toolbar buttons for Services + //TODO: To be implemented in the future + // if (resType.equals(ResourceTypeDecorator.Service.name()) && + // SupportedOperations.SERVICE_CREATE.isAllowed(StatusHandler.getStatus().getCredentials())) { + // this.getToolBar().add(new SeparatorToolItem()); + // ToolButton createNew = new ToolButton("new-icon") { + // @Override + // protected void onClick(final ComponentEvent ce) { + // super.onClick(ce); + // OpCommands.doOpenServiceForm(); + // } + // }; + // createNew.setToolTip("Create new Software"); + // this.getToolBar().add(createNew); + // } + + // Adds toolbar buttons for Services + if (resType.equals(ResourceTypeDecorator.Service.name()) && + SupportedOperations.SERVICE_DEPLOY.isAllowed(StatusHandler.getStatus().getCredentials())) { + this.getToolBar().add(new SeparatorToolItem()); + ToolButton doDeploy = new ToolButton("deploy-icon") { + protected void onClick(final ComponentEvent be) { + super.onClick(be); + GWT.runAsync(DeployServicesForm.class, new RunAsyncCallback() { + @Override + public void onFailure(Throwable reason) { + Window.alert("Could not load the deploy form."); + } + @Override + public void onSuccess() { + new DeployServicesForm().show(); + } + }); + + }; + }; + doDeploy.setToolTip("Prepare a deployment plan"); + this.getToolBar().add(doDeploy); + } + + + // Adds toolbar buttons for Services + if (resType.equals(ResourceTypeDecorator.Service.name()) && + SupportedOperations.SERVICE_GET_REPORT.isAllowed(StatusHandler.getStatus().getCredentials())) { + this.getToolBar().add(new SeparatorToolItem()); + ToolButton doDeploy = new ToolButton("getreport-icon") { + protected void onClick(final ComponentEvent be) { + super.onClick(be); + OpCommands.doGetDeployReport(); + }; + }; + doDeploy.setToolTip("Get report for submitted deployment"); + this.getToolBar().add(doDeploy); + } + + // Adds toolbar button for software upload wizard (SUW) + if (resType.equals(ResourceTypeDecorator.Service.name()) && + SupportedOperations.SERVICE_DEPLOY.isAllowed(StatusHandler.getStatus().getCredentials())) { + this.getToolBar().add(new SeparatorToolItem()); + ToolButton doAddSoftware = new ToolButton("add-software-icon") { + protected void onClick(final ComponentEvent be) { + super.onClick(be); + + + GWT.runAsync(AppController.class, new RunAsyncCallback() { + @Override + public void onSuccess() { + String currentScope = StatusHandler.getStatus().getCurrentScope(); + HandlerManager eventBus = new HandlerManager(null); + AppController appViewer = new AppController(eventBus, currentScope); + //AppController appViewer = new AppController(eventBus); + appViewer.go(); + } + + public void onFailure(Throwable reason) { + Window.alert("There are networks problem, please check your connection."); + } + + }); + + }; + }; + doAddSoftware.setToolTip("Upload software"); + this.getToolBar().add(doAddSoftware); + this.getToolBar().add(new SeparatorToolItem()); + } + + } + + public final void setGrid(final Grid grid, final boolean groupingEnabled) { + // Sets the grid container title + this.rootPanel.setHeading("Resource Details (" + StatusHandler.getStatus().getCurrentResourceType() + ")"); + + this.initToolbar(); + + // adds highlighting support + // Annotates invalid cells + grid.getView().setViewConfig(new GridViewConfig() { + @Override + public String getRowStyle( + final ModelData model, + final int rowIndex, + final ListStore ds) { + try { + if (!highlightInvalidFields) { + return super.getRowStyle(model, rowIndex, ds); + } + + // NOTE this strange cast to object is due to: + // compilation error in jdk bug: java.lang.Object cannot be dereferenced + + // if no requirements expressed for this type, return the default style + if (ResourceDetailModel.getRequiredFields(((Object) model.get("Type")).toString()) == null) { + return super.getRowStyle(model, rowIndex, ds); + } + String[] reqs = ResourceDetailModel.getRequiredFields(((Object) model.get("Type")).toString()); + + for (String req : reqs) { + if (model.get(req) == null || ((Object) model.get(req)).toString().trim().length() == 0) { + // Adds to the model with problems the error code + return "x-grid-invalid-row"; + } + } + return super.getRowStyle(model, rowIndex, ds); + } catch (Exception e) { + GWT.log("getting required fields", e); + return super.getRowStyle(model, rowIndex, ds); + } + } + }); + /* + * add the row click listener by default open the profile + */ + grid.addListener(Events.RowClick, new Listener(){ + public void handleEvent(BaseEvent be) { + //GridEvent ge = (GridEvent)be; + openProfileInPinnedResources(); + } + }); + + grid.setContextMenu(ContextMenuFactory.getInstance().buildContextMenu( + StatusHandler.getStatus().getCurrentResourceType(), this)); + + this.setWidget(grid, groupingEnabled); + + // Add the new created widget inside the container + WidgetsRegistry.getPanel(UIIdentifiers.RESOURCE_DETAIL_GRID_PANEL).add(this.getContainer(), true); + } + + private void openProfileInPinnedResources() { + List selectedElems = this.getSelection(); + for (ModelData selectedElem : selectedElems) { + String type = ((Object) selectedElem.get("Type")).toString(); + String resID = ((Object) selectedElem.get("ID")).toString(); + String scope = StatusHandler.getStatus().getCurrentScope(); + Commands.doGetResourceProfile(this, scope, type, resID); + } + } +} diff --git a/src/main/java/org/gcube/portlets/admin/resourcemanagement/client/views/resourcedetails/ResourceGridFactory.java b/src/main/java/org/gcube/portlets/admin/resourcemanagement/client/views/resourcedetails/ResourceGridFactory.java new file mode 100644 index 0000000..dd1fcbb --- /dev/null +++ b/src/main/java/org/gcube/portlets/admin/resourcemanagement/client/views/resourcedetails/ResourceGridFactory.java @@ -0,0 +1,141 @@ +/**************************************************************************** + * This software is part of the gCube Project. + * Site: http://www.gcube-system.org/ + **************************************************************************** + * The gCube/gCore software is licensed as Free Open Source software + * conveying to the EUPL (http://ec.europa.eu/idabc/eupl). + * The software and documentation is provided by its authors/distributors + * "as is" and no expressed or + * implied warranty is given for its use, quality or fitness for a + * particular case. + **************************************************************************** + * Filename: ResourceGridFactory.java + **************************************************************************** + * @author Daniele Strollo + ***************************************************************************/ + +package org.gcube.portlets.admin.resourcemanagement.client.views.resourcedetails; + +import java.util.List; + +import org.gcube.portlets.admin.resourcemanagement.client.utils.Commands; +import org.gcube.portlets.admin.resourcemanagement.client.widgets.console.ConsoleMessageBroker; +import org.gcube.resourcemanagement.support.shared.types.datamodel.ResourceDetailModel; + +import com.extjs.gxt.ui.client.Style.SortDir; +import com.extjs.gxt.ui.client.data.BaseListLoader; +import com.extjs.gxt.ui.client.data.ListLoadResult; +import com.extjs.gxt.ui.client.data.MemoryProxy; +import com.extjs.gxt.ui.client.data.ModelData; +import com.extjs.gxt.ui.client.data.ModelType; +import com.extjs.gxt.ui.client.data.XmlLoadResultReader; +import com.extjs.gxt.ui.client.store.GroupingStore; +import com.extjs.gxt.ui.client.store.ListStore; +import com.extjs.gxt.ui.client.widget.MessageBox; +import com.extjs.gxt.ui.client.widget.grid.ColumnModel; +import com.extjs.gxt.ui.client.widget.grid.Grid; +import com.extjs.gxt.ui.client.widget.grid.GridGroupRenderer; +import com.extjs.gxt.ui.client.widget.grid.GroupColumnData; +import com.extjs.gxt.ui.client.widget.grid.GroupingView; + +/** + * @author Daniele Strollo (ISTI-CNR) + * + */ +public class ResourceGridFactory { + public static final synchronized Grid createGrid( + final String resourceType, + final List result, + final String groupingColumn) { + return createGrid(resourceType, result, groupingColumn, true); + } + + public static final synchronized Grid createGrid( + final String resourceType, + final List result, + final String groupingColumn, + final boolean autoExpand) { + try { + + if (result == null || result.size() == 0) { + Commands.showPopup( + "Failure", + "the retrieved result set for required resource is null or empty", + 6000); + return null; + } + + // The the XML reader + ModelType type = ResourceDetailModel.getXMLMapping(resourceType); + // For the grid representation + final ColumnModel cm = ResourceDetailModel.getRecordDefinition(resourceType); + + if (type == null || cm == null) { + MessageBox.alert("Failure", "the model representation has not been found", null); + return null; + } + + // need a loader, proxy, and reader + XmlLoadResultReader> reader = + new XmlLoadResultReader>(type); + + StringBuilder toParse = new StringBuilder().append("\n"); + for (String elem : result) { + toParse.append(elem.toString()); + } + toParse.append("\n"); + + MemoryProxy proxy = new MemoryProxy(toParse.toString()); + + final BaseListLoader> loader = + new BaseListLoader>(proxy, reader); + + ListStore store = null; + + if (groupingColumn != null) { + store = new GroupingStore(loader); + } else { + store = new ListStore(loader); + } + //apply the custom sorter + store.setStoreSorter(new CustomSorter()); + + final Grid grid = new Grid(store, cm); + + if (groupingColumn != null) { + ((GroupingStore) store).groupBy(groupingColumn); + + // GROUPING + // Builds the grouping structure to collapse elements + // having the same type (log severity). + GroupingView groupingView = new GroupingView(); + groupingView.setGroupRenderer(new GridGroupRenderer() { + public String render(final GroupColumnData data) { + int s = data.models.size(); + String f = cm.getColumnById(data.field).getHeader(); + String l = s == 1 ? "Item" : "Items"; + return f + ": " + ((data.group != null && data.group.trim().length() > 0) ? data.group : "Undefined") + " (" + s + " " + l + ")"; + } + }); + + groupingView.setAutoFill(true); + groupingView.setForceFit(false); + grid.setView(groupingView); + } + + if (autoExpand) { + // The first visible column will be considered auto-expand + grid.setAutoExpandColumn(cm.getColumn(0).getId()); + } + + loader.setSortField("ID"); + loader.setSortDir(SortDir.ASC); + loader.load(); + + return grid; + } catch (RuntimeException e) { + ConsoleMessageBroker.error(ResourceGridFactory.class, "During resourceDetailGrid creation"); + return null; + } + } +} diff --git a/src/main/java/org/gcube/portlets/admin/resourcemanagement/client/views/resourcetree/ResourcesTreePanel.java b/src/main/java/org/gcube/portlets/admin/resourcemanagement/client/views/resourcetree/ResourcesTreePanel.java new file mode 100644 index 0000000..bcf9bc5 --- /dev/null +++ b/src/main/java/org/gcube/portlets/admin/resourcemanagement/client/views/resourcetree/ResourcesTreePanel.java @@ -0,0 +1,218 @@ +/**************************************************************************** + * This software is part of the gCube Project. + * Site: http://www.gcube-system.org/ + **************************************************************************** + * The gCube/gCore software is licensed as Free Open Source software + * conveying to the EUPL (http://ec.europa.eu/idabc/eupl). + * The software and documentation is provided by its authors/distributors + * "as is" and no expressed or + * implied warranty is given for its use, quality or fitness for a + * particular case. + **************************************************************************** + * Filename: ResourcesTreePanel.java + **************************************************************************** + * @author Daniele Strollo + ***************************************************************************/ + +package org.gcube.portlets.admin.resourcemanagement.client.views.resourcetree; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map.Entry; + +import org.gcube.portlets.admin.resourcemanagement.client.utils.Commands; +import org.gcube.portlets.admin.resourcemanagement.client.widgets.console.ConsoleMessageBroker; +import org.gcube.resourcemanagement.support.client.utils.StatusHandler; +import org.gcube.resourcemanagement.support.client.views.ResourceTypeDecorator; +import org.gcube.resourcemanagement.support.shared.types.datamodel.AtomicTreeNode; + +import com.extjs.gxt.ui.client.Style.SelectionMode; +import com.extjs.gxt.ui.client.Style.SortDir; +import com.extjs.gxt.ui.client.data.ModelData; +import com.extjs.gxt.ui.client.data.ModelIconProvider; +import com.extjs.gxt.ui.client.event.ComponentEvent; +import com.extjs.gxt.ui.client.event.Events; +import com.extjs.gxt.ui.client.event.Listener; +import com.extjs.gxt.ui.client.event.TreePanelEvent; +import com.extjs.gxt.ui.client.store.TreeStore; +import com.extjs.gxt.ui.client.util.IconHelper; +import com.extjs.gxt.ui.client.widget.menu.Menu; +import com.extjs.gxt.ui.client.widget.menu.MenuItem; +import com.extjs.gxt.ui.client.widget.treepanel.TreePanel; +import com.google.gwt.core.client.GWT; +import com.google.gwt.user.client.Timer; +import com.google.gwt.user.client.ui.AbstractImagePrototype; + + +class TreeSelectionListener implements Listener> { + private boolean doExpand = false; + + public void handleEvent(final TreePanelEvent be) { + if (be.getType() == Events.Expand) { + be.cancelBubble(); + doExpand = true; + return; + } + + if (be.getType() == Events.Collapse) { + be.cancelBubble(); + doExpand = true; + return; + } + + if (be.getType() == Events.OnClick && + !be.isRightClick() && be.getItem() != null && + be.getItem() instanceof AtomicTreeNode) { + if (!doExpand) { + // do you stuff, right click detected for a click event + AtomicTreeNode selectedModel = (AtomicTreeNode) be.getItem(); + // -- SELECTED A LEAF + if (selectedModel != null && selectedModel.isLeaf()) { + ConsoleMessageBroker.trace(this, "Selected leaf: " + ((AtomicTreeNode) selectedModel.getParent()).getNode() + "::" + selectedModel.getName()); + Commands.doFilterResourceDetailsGrid(this, + StatusHandler.getStatus().getCurrentScope(), + ((AtomicTreeNode) selectedModel.getParent()).getNode(), + selectedModel.getSubType()); + } + // -- SELECTED A NOT LEAF NODE + if (selectedModel != null && !selectedModel.isLeaf()) { + ConsoleMessageBroker.trace(this, "Selected node: " + selectedModel.getNode()); + Commands.doLoadResourceDetailsGrid(this, StatusHandler.getStatus().getCurrentScope(), selectedModel.getNode()); + } + } + doExpand = false; + } + } +} + + + + +/** + * @author Daniele Strollo + * @author Massimiliano Assante (ISTI-CNR) + */ +public class ResourcesTreePanel { + private TreePanel tree = null; + + private boolean isOn = false; + private Timer t; + private int counter; + private ModelData gHN = null; + + public ResourcesTreePanel(final HashMap> rawmodel) { + AtomicTreeNode model = new AtomicTreeNode("Resource", null); + String icon = null; + String label = null; + counter = 0; + if (rawmodel == null) { + model.add(new AtomicTreeNode(ResourceTypeDecorator.Empty.getLabel(), null, ResourceTypeDecorator.Empty.getIcon())); + } else { + for (Entry> elems : rawmodel.entrySet()) { + String type = elems.getKey(); + List subtypes = elems.getValue(); + + try { + icon = ResourceTypeDecorator.valueOf(type).getIcon(); + label = ResourceTypeDecorator.valueOf(type).getLabel(); + } catch (java.lang.IllegalArgumentException e) { + label = type; + icon = null; + } + + AtomicTreeNode currType = new AtomicTreeNode(type, label, icon); + + for (String subtype : subtypes) { + currType.add(new AtomicTreeNode(subtype, null, icon)); + } + model.add(currType); + } + } + + final TreeStore store = new TreeStore(); + // The root node will not be shown + store.add(model.getChildren(), true); + // FIXME store.sort("sortIdx", SortDir.ASC); + store.sort("name", SortDir.ASC); + + this.tree = new TreePanel(store); + this.tree.setWidth(300); + this.tree.setDisplayProperty("name"); + + Menu contextMenu = new Menu(); + MenuItem refresh = new MenuItem("Refresh Tree") { + @Override + protected void onClick(final ComponentEvent be) { + super.onClick(be); + Commands.refreshResourceTree(); + } + }; + refresh.setIconStyle("refresh-icon"); + contextMenu.add(refresh); + this.tree.setContextMenu(contextMenu); + + + // The icon decorator + this.tree.setIconProvider( + new ModelIconProvider() { + public AbstractImagePrototype getIcon(final ModelData model) { + if (model.get("node") != null && model.get("icon") != null) { + return IconHelper.createStyle((String) model.get("icon")); + } + return IconHelper.createStyle("defaultleaf-icon"); + } + }); + + // Handles the selection + tree.getSelectionModel().setSelectionMode(SelectionMode.SINGLE); + + TreeSelectionListener handler = new TreeSelectionListener(); + + tree.addListener(Events.Expand, handler); + tree.addListener(Events.Collapse, handler); + tree.addListener(Events.OnClick, handler); + + /** + * show gHN list if the configuration says so. + */ + if (StatusHandler.getStatus().isLoadGHNatStartup()) { + GWT.log(""+StatusHandler.getStatus().isLoadGHNatStartup()); + + Commands.doLoadResourceDetailsGrid(this, + StatusHandler.getStatus().getCurrentScope(), + "GHN"); + + //select the GHN + for (ModelData md: store.getAllItems()) { + if (md.get("node").toString().compareTo("GHN") == 0) + gHN = md; + } + + if (gHN != null) { + tree.getSelectionModel().select(false, gHN); + t = new Timer() { + + @Override + public void run() { + if (isOn) + tree.getSelectionModel().deselectAll(); + else + tree.getSelectionModel().select(false, gHN); + t.schedule(80); + isOn = !isOn; + counter++; + if (counter > 10) + t.cancel(); + } + }; + t.schedule(100); + } + } + + } + + public final TreePanel getWidget() { + return this.tree; + } +} diff --git a/src/main/java/org/gcube/portlets/admin/resourcemanagement/client/views/resourcetree/WSResourcesTreePanel.java b/src/main/java/org/gcube/portlets/admin/resourcemanagement/client/views/resourcetree/WSResourcesTreePanel.java new file mode 100644 index 0000000..f17074f --- /dev/null +++ b/src/main/java/org/gcube/portlets/admin/resourcemanagement/client/views/resourcetree/WSResourcesTreePanel.java @@ -0,0 +1,112 @@ +/**************************************************************************** + * This software is part of the gCube Project. + * Site: http://www.gcube-system.org/ + **************************************************************************** + * The gCube/gCore software is licensed as Free Open Source software + * conveying to the EUPL (http://ec.europa.eu/idabc/eupl). + * The software and documentation is provided by its authors/distributors + * "as is" and no expressed or + * implied warranty is given for its use, quality or fitness for a + * particular case. + **************************************************************************** + * Filename: WSResourcesTreePanel.java + **************************************************************************** + * @author Daniele Strollo + ***************************************************************************/ + +package org.gcube.portlets.admin.resourcemanagement.client.views.resourcetree; + +import java.util.List; +import org.gcube.portlets.admin.resourcemanagement.client.utils.Commands; +import org.gcube.portlets.admin.resourcemanagement.client.widgets.console.ConsoleMessageBroker; +import org.gcube.resourcemanagement.support.client.utils.StatusHandler; +import org.gcube.resourcemanagement.support.client.views.ResourceTypeDecorator; +import org.gcube.resourcemanagement.support.shared.types.datamodel.AtomicTreeNode; + +import com.extjs.gxt.ui.client.Style.SelectionMode; +import com.extjs.gxt.ui.client.Style.SortDir; +import com.extjs.gxt.ui.client.data.ModelData; +import com.extjs.gxt.ui.client.data.ModelIconProvider; +import com.extjs.gxt.ui.client.event.Events; +import com.extjs.gxt.ui.client.event.Listener; +import com.extjs.gxt.ui.client.event.SelectionChangedEvent; +import com.extjs.gxt.ui.client.store.TreeStore; +import com.extjs.gxt.ui.client.util.IconHelper; +import com.extjs.gxt.ui.client.widget.treepanel.TreePanel; +import com.google.gwt.user.client.ui.AbstractImagePrototype; + +/** + * @author Daniele Strollo (ISTI-CNR) + * + */ +public class WSResourcesTreePanel { + private TreePanel tree = null; + + + public WSResourcesTreePanel(final List types) { + AtomicTreeNode model = new AtomicTreeNode(ResourceTypeDecorator.WSResource.name(), null); + + if (types != null && types.size() > 0) { + String elem = ResourceTypeDecorator.WSResource.name(); + String icon = ResourceTypeDecorator.valueOf(elem).getIcon(); + String label = ResourceTypeDecorator.valueOf(elem).getLabel(); + + AtomicTreeNode currType = new AtomicTreeNode(elem, label, icon); + + for (String subtype : types) { + currType.add(new AtomicTreeNode(subtype, null, icon)); + } + model.add(currType); + } + + TreeStore store = new TreeStore(); + // The root node will not be shown + store.add(model.getChildren(), true); + store.sort("name", SortDir.ASC); + + this.tree = new TreePanel(store); + this.tree.setWidth(300); + this.tree.setDisplayProperty("name"); + + // The icon decorator + this.tree.setIconProvider( + new ModelIconProvider() { + public AbstractImagePrototype getIcon(final ModelData model) { + if (model.get("node") != null && model.get("icon") != null) { + return IconHelper.createStyle((String) model.get("icon")); + } + return IconHelper.createStyle("defaultleaf-icon"); + } + }); + + // Handles the selection + tree.getSelectionModel().setSelectionMode(SelectionMode.SINGLE); + tree.getSelectionModel().addListener(Events.SelectionChange, new Listener>() { + public void handleEvent(final SelectionChangedEvent be) { + AtomicTreeNode selectedModel = be.getSelectedItem(); + // -- SELECTED A LEAF + if (selectedModel != null && selectedModel.isLeaf()) { + ConsoleMessageBroker.trace(this, "Selected leaf of WS-Resource: " + ((AtomicTreeNode) selectedModel.getParent()).getNode() + "::" + selectedModel.getName()); + // FIXME the AtomicTreeNode does not contain a subtype information + Commands.doFilterResourceDetailsGrid(this, + StatusHandler.getStatus().getCurrentScope(), + ((AtomicTreeNode) selectedModel.getParent()).getNode(), + selectedModel.getSubType()); + } + // -- SELECTED A NOT LEAF NODE + if (selectedModel != null && !selectedModel.isLeaf()) { + ConsoleMessageBroker.trace(this, "Selected node: " + selectedModel.getNode()); + Commands.doLoadWSResourceDetailsGrid(this, StatusHandler.getStatus().getCurrentScope()); + } + + be.setCancelled(true); + // Removes the selection so that it can be easily refreshed. + tree.getSelectionModel().deselectAll(); + } + }); + } + + public final TreePanel getWidget() { + return this.tree; + } +} diff --git a/src/main/java/org/gcube/portlets/admin/resourcemanagement/client/widgets/console/ConsoleLogSeverity.java b/src/main/java/org/gcube/portlets/admin/resourcemanagement/client/widgets/console/ConsoleLogSeverity.java new file mode 100644 index 0000000..8f0265a --- /dev/null +++ b/src/main/java/org/gcube/portlets/admin/resourcemanagement/client/widgets/console/ConsoleLogSeverity.java @@ -0,0 +1,27 @@ +/**************************************************************************** + * This software is part of the gCube Project. + * Site: http://www.gcube-system.org/ + **************************************************************************** + * The gCube/gCore software is licensed as Free Open Source software + * conveying to the EUPL (http://ec.europa.eu/idabc/eupl). + * The software and documentation is provided by its authors/distributors + * "as is" and no expressed or + * implied warranty is given for its use, quality or fitness for a + * particular case. + **************************************************************************** + * Filename: ConsoleLogSeverity.java + **************************************************************************** + * @author Daniele Strollo + ***************************************************************************/ + +package org.gcube.portlets.admin.resourcemanagement.client.widgets.console; + +public enum ConsoleLogSeverity { + INFO, + LOG, + TRACE, + DEBUG, + WARNING, + ERROR, + FATAL; +} diff --git a/src/main/java/org/gcube/portlets/admin/resourcemanagement/client/widgets/console/ConsoleMessage.java b/src/main/java/org/gcube/portlets/admin/resourcemanagement/client/widgets/console/ConsoleMessage.java new file mode 100644 index 0000000..a225b05 --- /dev/null +++ b/src/main/java/org/gcube/portlets/admin/resourcemanagement/client/widgets/console/ConsoleMessage.java @@ -0,0 +1,45 @@ +/**************************************************************************** + * This software is part of the gCube Project. + * Site: http://www.gcube-system.org/ + **************************************************************************** + * The gCube/gCore software is licensed as Free Open Source software + * conveying to the EUPL (http://ec.europa.eu/idabc/eupl). + * The software and documentation is provided by its authors/distributors + * "as is" and no expressed or + * implied warranty is given for its use, quality or fitness for a + * particular case. + **************************************************************************** + * Filename: ConsoleMessage.java + **************************************************************************** + * @author Daniele Strollo + ***************************************************************************/ + +package org.gcube.portlets.admin.resourcemanagement.client.widgets.console; + +import java.util.Date; +import com.extjs.gxt.ui.client.data.BaseModelData; +import com.google.gwt.i18n.client.DateTimeFormat; + +public class ConsoleMessage extends BaseModelData { + + private static final long serialVersionUID = 1422116123911146319L; + + public ConsoleMessage(final Object caller, final ConsoleLogSeverity type, final String message) { + this(caller.getClass(), type, message); + } + + public ConsoleMessage(final Class invoker, final ConsoleLogSeverity type, final String message) { + this(invoker.getName(), type, message); + } + + public ConsoleMessage(final String invoker, final ConsoleLogSeverity type, final String message) { + super(); + DateTimeFormat timeFormatter = DateTimeFormat.getFormat("dd-MM-yy hh:mm:ss"); + String timestamp = timeFormatter.format(new Date()); + set("timestamp", timestamp); + set("invoker", invoker); + set("type", type); + set("message", message); + } + +} diff --git a/src/main/java/org/gcube/portlets/admin/resourcemanagement/client/widgets/console/ConsoleMessageBroker.java b/src/main/java/org/gcube/portlets/admin/resourcemanagement/client/widgets/console/ConsoleMessageBroker.java new file mode 100644 index 0000000..0438ada --- /dev/null +++ b/src/main/java/org/gcube/portlets/admin/resourcemanagement/client/widgets/console/ConsoleMessageBroker.java @@ -0,0 +1,80 @@ +/**************************************************************************** + * This software is part of the gCube Project. + * Site: http://www.gcube-system.org/ + **************************************************************************** + * The gCube/gCore software is licensed as Free Open Source software + * conveying to the EUPL (http://ec.europa.eu/idabc/eupl). + * The software and documentation is provided by its authors/distributors + * "as is" and no expressed or + * implied warranty is given for its use, quality or fitness for a + * particular case. + **************************************************************************** + * Filename: ConsoleMessageBroker.java + **************************************************************************** + * @author Daniele Strollo + ***************************************************************************/ + +package org.gcube.portlets.admin.resourcemanagement.client.widgets.console; +import org.gcube.portlets.admin.resourcemanagement.client.widgets.registry.WidgetsRegistry; + +import com.google.gwt.core.client.GWT; + +public class ConsoleMessageBroker { + + private static void printMessage(final ConsoleLogSeverity severity, final Object caller, final String message) { + ConsolePanel console = WidgetsRegistry.getConsole(); + if (console != null) { + console.handle(new ConsoleMessage(caller, severity, message)); + } else { + GWT.log(message); + } + } + + private static void printMessage(final ConsoleLogSeverity severity, final Class caller, final String message) { + ConsolePanel console = WidgetsRegistry.getConsole(); + if (console != null) { + console.handle(new ConsoleMessage(caller.getName(), severity, message)); + } else { + GWT.log(message); + } + } + + public static void log(final Object caller, final String message) { + printMessage(ConsoleLogSeverity.LOG, caller, message); + } + public static void info(final Object caller, final String message) { + printMessage(ConsoleLogSeverity.INFO, caller, message); + } + public static void trace(final Object caller, final String message) { + printMessage(ConsoleLogSeverity.TRACE, caller, message); + } + public static void debug(final Object caller, final String message) { + printMessage(ConsoleLogSeverity.DEBUG, caller, message); + } + public static void warning(final Object caller, final String message) { + printMessage(ConsoleLogSeverity.WARNING, caller, message); + } + public static void error(final Object caller, final String message) { + printMessage(ConsoleLogSeverity.ERROR, caller, message); + } + + + public static void log(final Class caller, final String message) { + printMessage(ConsoleLogSeverity.LOG, caller, message); + } + public static void info(final Class caller, final String message) { + printMessage(ConsoleLogSeverity.INFO, caller, message); + } + public static void trace(final Class caller, final String message) { + printMessage(ConsoleLogSeverity.TRACE, caller, message); + } + public static void debug(final Class caller, final String message) { + printMessage(ConsoleLogSeverity.DEBUG, caller, message); + } + public static void warning(final Class caller, final String message) { + printMessage(ConsoleLogSeverity.WARNING, caller, message); + } + public static void error(final Class caller, final String message) { + printMessage(ConsoleLogSeverity.ERROR, caller, message); + } +} diff --git a/src/main/java/org/gcube/portlets/admin/resourcemanagement/client/widgets/console/ConsolePanel.java b/src/main/java/org/gcube/portlets/admin/resourcemanagement/client/widgets/console/ConsolePanel.java new file mode 100644 index 0000000..6c70097 --- /dev/null +++ b/src/main/java/org/gcube/portlets/admin/resourcemanagement/client/widgets/console/ConsolePanel.java @@ -0,0 +1,214 @@ +/**************************************************************************** + * This software is part of the gCube Project. + * Site: http://www.gcube-system.org/ + **************************************************************************** + * The gCube/gCore software is licensed as Free Open Source software + * conveying to the EUPL (http://ec.europa.eu/idabc/eupl). + * The software and documentation is provided by its authors/distributors + * "as is" and no expressed or + * implied warranty is given for its use, quality or fitness for a + * particular case. + **************************************************************************** + * Filename: ConsolePanel.java + **************************************************************************** + * @author Daniele Strollo + ***************************************************************************/ + +package org.gcube.portlets.admin.resourcemanagement.client.widgets.console; + +import java.util.ArrayList; +import java.util.List; + +import org.gcube.portlets.admin.resourcemanagement.client.widgets.panels.DetachablePanel; +import org.gcube.portlets.admin.resourcemanagement.client.widgets.panels.DetachablePanel.DetachablePanelHandler; +import org.gcube.portlets.admin.resourcemanagement.client.widgets.panels.ScrollablePanel; + +import com.extjs.gxt.ui.client.Style.SortDir; +import com.extjs.gxt.ui.client.event.ComponentEvent; +import com.extjs.gxt.ui.client.store.GroupingStore; +import com.extjs.gxt.ui.client.store.ListStore; +import com.extjs.gxt.ui.client.widget.Component; +import com.extjs.gxt.ui.client.widget.button.Button; +import com.extjs.gxt.ui.client.widget.grid.ColumnConfig; +import com.extjs.gxt.ui.client.widget.grid.ColumnData; +import com.extjs.gxt.ui.client.widget.grid.ColumnModel; +import com.extjs.gxt.ui.client.widget.grid.Grid; +import com.extjs.gxt.ui.client.widget.grid.GridCellRenderer; +import com.extjs.gxt.ui.client.widget.grid.GridGroupRenderer; +import com.extjs.gxt.ui.client.widget.grid.GroupColumnData; +import com.extjs.gxt.ui.client.widget.grid.GroupingView; +import com.google.gwt.core.client.GWT; +import com.google.gwt.user.client.ui.Widget; + +/** + * Consists of a widgets containing a grid with + * all the {@link ConsoleMessage} raised in the system. + * @author Daniele Strollo (ISTI-CNR) + */ +public class ConsolePanel implements DetachablePanelHandler { + private GroupingStore store; + private DetachablePanel rootPanel = null; + private boolean enableGrouping = false; + private Grid grid = null; + // The column on which the grouping is applied + private final static String collapsibleColumn = "type"; + + public ConsolePanel(final DetachablePanel rootPanel) { + super(); + this.rootPanel = rootPanel; + this.rootPanel.addHandler(this); + + store = new GroupingStore(); + if (enableGrouping) { + store.groupBy(collapsibleColumn); + } + store.sort("timestamp", SortDir.DESC); + this.onLoad(); + } + + private void onLoad() { + this.grid = createGrid(); + ScrollablePanel gridContainer = new ScrollablePanel("console-grid-container", grid); + rootPanel.insertMainWidget(gridContainer); + //rootPanel.getToolBar(). + Button groupButton = new Button("Group/Ungroup") { + @Override + protected void onClick(final ComponentEvent ce) { + super.onClick(ce); + if (enableGrouping) { + store.clearGrouping(); + } else { + store.groupBy(collapsibleColumn); + } + enableGrouping = !enableGrouping; + } + }; + groupButton.setIconStyle("grid-icon"); + rootPanel.getToolBar().add(groupButton); + + Button clearButton = new Button("Clear") { + @Override + protected void onClick(final ComponentEvent ce) { + super.onClick(ce); + store.removeAll(); + } + }; + clearButton.setIconStyle("clear-icon"); + rootPanel.getToolBar().add(clearButton); + } + + private Grid createGrid() { + List configs = new ArrayList(); + + ColumnConfig column = new ColumnConfig(); + column.setId("timestamp"); + column.setHeader("Time"); + column.setWidth(105); + configs.add(column); + + column = new ColumnConfig(); + column.setId("invoker"); + column.setHeader("Invoker"); + column.setWidth(420); + configs.add(column); + + column = new ColumnConfig(); + column.setId("type"); + column.setHeader("Type"); + column.setWidth(75); + + column.setRenderer(new GridCellRenderer() { + public Object render( + final ConsoleMessage model, + final String property, + final ColumnData config, + final int rowIndex, + final int colIndex, + final ListStore store, + final Grid grid + ) { + if (model.get("type") == ConsoleLogSeverity.WARNING) { + return "" + model.get("type") + ""; + } + if (model.get("type") == ConsoleLogSeverity.ERROR) { + return "" + model.get("type") + ""; + } + return "" + model.get("type"); + } + }); + + configs.add(column); + + column = new ColumnConfig(); + column.setId("message"); + column.setHeader("Message"); + configs.add(column); + + final ColumnModel cm = new ColumnModel(configs); + + // Builds the grouping structure to collapse elements + // having the same type (log severity). + GroupingView view = new GroupingView(); + view.setGroupRenderer(new GridGroupRenderer() { + public String render(final GroupColumnData data) { + int s = data.models.size(); + String f = cm.getColumnById(data.field).getHeader(); + String l = s == 1 ? "Item" : "Items"; + return f + ": " + data.group + " (" + s + " " + l + ")"; + } + }); + view.setShowGroupedColumn(false); + + Grid grid = new Grid(store, cm); + grid.setView(view); + grid.setStyleAttribute("borderTop", "none"); + grid.setAutoExpandColumn("message"); + grid.setId("console-internal-grid"); + return grid; + } + + public final boolean handle(final ConsoleMessage event) { + try { + store.add(event); + store.commitChanges(); + //this.rootPanel.layout(true); + //this.refresh(); + return true; + } catch (Exception e) { + GWT.log("During console handle", e); + return false; + } + } + + /** + * Is invoked by the time renderer on client side. + * It forces the row to refresh after it has received from + * the server side the required data. + * @see ConsoleMessage + */ + public final void refresh() { + this.rootPanel.layout(true); + this.rootPanel.getRootPanel().sync(true); + this.grid.sync(true); + this.grid.getView().refresh(true); + this.store.commitChanges(); + // Reapplies the sorting + this.store.sort(this.store.getSortField(), this.store.getSortDir()); + } + + public final DetachablePanel getContainer() { + return this.rootPanel; + } + + public final Widget getWidget() { + return this.grid; + } + + public final void onDetachEvent(final DetachablePanel container, final Component content) { + this.grid.getView().refresh(true); + } + + public final void onEmbedEvent(final DetachablePanel container, final Component content) { + this.grid.getView().refresh(true); + } +} diff --git a/src/main/java/org/gcube/portlets/admin/resourcemanagement/client/widgets/dialogs/ExtendedMessageBox.java b/src/main/java/org/gcube/portlets/admin/resourcemanagement/client/widgets/dialogs/ExtendedMessageBox.java new file mode 100644 index 0000000..03fddf0 --- /dev/null +++ b/src/main/java/org/gcube/portlets/admin/resourcemanagement/client/widgets/dialogs/ExtendedMessageBox.java @@ -0,0 +1,139 @@ +/**************************************************************************** + * This software is part of the gCube Project. + * Site: http://www.gcube-system.org/ + **************************************************************************** + * The gCube/gCore software is licensed as Free Open Source software + * conveying to the EUPL (http://ec.europa.eu/idabc/eupl). + * The software and documentation is provided by its authors/distributors + * "as is" and no expressed or + * implied warranty is given for its use, quality or fitness for a + * particular case. + **************************************************************************** + * Filename: ExtendedMessageBox.java + **************************************************************************** + * @author Daniele Strollo + ***************************************************************************/ + +package org.gcube.portlets.admin.resourcemanagement.client.widgets.dialogs; + +import com.extjs.gxt.ui.client.event.ComponentEvent; +import com.extjs.gxt.ui.client.event.EventType; +import com.extjs.gxt.ui.client.event.Events; +import com.extjs.gxt.ui.client.event.KeyListener; +import com.extjs.gxt.ui.client.event.KeyboardEvents; +import com.extjs.gxt.ui.client.event.Listener; +import com.extjs.gxt.ui.client.event.MessageBoxEvent; +import com.extjs.gxt.ui.client.event.WindowEvent; +import com.extjs.gxt.ui.client.widget.Dialog; +import com.extjs.gxt.ui.client.widget.Label; +import com.extjs.gxt.ui.client.widget.LayoutContainer; +import com.extjs.gxt.ui.client.widget.form.TextField; +import com.extjs.gxt.ui.client.widget.layout.FitLayout; +import com.extjs.gxt.ui.client.widget.layout.HBoxLayout; +import com.extjs.gxt.ui.client.widget.layout.HBoxLayout.HBoxLayoutAlign; +import com.google.gwt.event.dom.client.KeyDownEvent; +import com.google.gwt.event.dom.client.KeyDownHandler; +import com.google.gwt.user.client.Timer; +import com.google.gwt.user.client.ui.HasAlignment; +import com.google.gwt.user.client.ui.HasVerticalAlignment; +import com.google.gwt.user.client.ui.HorizontalPanel; +import com.google.gwt.user.client.ui.PasswordTextBox; +import com.google.gwt.user.client.ui.SimplePanel; +import com.google.gwt.user.client.ui.TextBox; + +/** + * @author Daniele Strollo (ISTI-CNR) + * + */ +public class ExtendedMessageBox { + private Dialog dialog = null; + + PasswordTextBox pwdField = new PasswordTextBox(); + + public static ExtendedMessageBox password( + final String title, + final Listener callback) { + ExtendedMessageBox box = new ExtendedMessageBox(); + + if (callback != null) { + box.addCallback(callback); + } + + box.setTitle(title); + box.show(); + return box; + } + + public ExtendedMessageBox() { + this.initDialog(); + } + + public final void setTitle(final String text) { + this.dialog.setHeading(text); + } + + + public final void addCallback(final Listener listener) { + dialog.addListener(Events.Hide, listener); + } + + private void initDialog() { + this.dialog = new Dialog() { + @Override + protected ComponentEvent previewEvent(final EventType type, final ComponentEvent ce) { + if (ce instanceof WindowEvent) { + WindowEvent we = (WindowEvent) ce; + MessageBoxEvent e = new MessageBoxEvent(null, this, we.getButtonClicked()); + if (type == Events.Hide || type == Events.BeforeHide) { + if (pwdField != null) { + e.setValue(pwdField.getValue()); + } + } + return e; + } + return super.previewEvent(type, ce); + } + }; + + dialog.setHideOnButtonClick(true); + + dialog.setLayout(new FitLayout()); + dialog.setWidth(280); + dialog.setHeight(120); + dialog.setResizable(false); + + pwdField.addKeyDownHandler(new KeyDownHandler() { + + @Override + public void onKeyDown(KeyDownEvent event) { + if (event.getNativeKeyCode() == KeyboardEvents.Enter.getEventCode()) + dialog.hide(); + + } + }); + pwdField.setStyleName("wizardTextBox"); + HorizontalPanel sp = new HorizontalPanel(); + sp.setHeight("120px"); + sp.setHorizontalAlignment(HasAlignment.ALIGN_CENTER); + sp.setVerticalAlignment(HasVerticalAlignment.ALIGN_MIDDLE); + sp.setWidth("100%"); + + pwdField.setWidth("250px"); + sp.add(pwdField); + this.dialog.add(sp); + } + + public final void show() { + this.dialog.show(); + Timer t = new Timer() { + @Override + public void run() { + focusPassword(); + } + }; + t.schedule(500); + } + void focusPassword() { + this.pwdField.setFocus(true); + } +} diff --git a/src/main/java/org/gcube/portlets/admin/resourcemanagement/client/widgets/panels/DetachablePanel.java b/src/main/java/org/gcube/portlets/admin/resourcemanagement/client/widgets/panels/DetachablePanel.java new file mode 100644 index 0000000..0bf4c8b --- /dev/null +++ b/src/main/java/org/gcube/portlets/admin/resourcemanagement/client/widgets/panels/DetachablePanel.java @@ -0,0 +1,282 @@ +/**************************************************************************** + * This software is part of the gCube Project. + * Site: http://www.gcube-system.org/ + **************************************************************************** + * The gCube/gCore software is licensed as Free Open Source software + * conveying to the EUPL (http://ec.europa.eu/idabc/eupl). + * The software and documentation is provided by its authors/distributors + * "as is" and no expressed or + * implied warranty is given for its use, quality or fitness for a + * particular case. + **************************************************************************** + * Filename: DetachablePanel.java + **************************************************************************** + * @author Daniele Strollo + ***************************************************************************/ + +package org.gcube.portlets.admin.resourcemanagement.client.widgets.panels; + +import java.util.List; +import java.util.Vector; +import org.gcube.portlets.admin.resourcemanagement.client.utils.Commands; +import org.gcube.portlets.admin.resourcemanagement.client.widgets.registry.WidgetsRegistry; +import org.gcube.portlets.admin.resourcemanagement.client.widgets.viewport.MainContainer; +import org.gcube.resourcemanagement.support.shared.util.Assertion; +import org.gcube.resourcemanagement.support.shared.exceptions.InvalidParameterException; + +import com.extjs.gxt.ui.client.event.ComponentEvent; +import com.extjs.gxt.ui.client.widget.Component; +import com.extjs.gxt.ui.client.widget.ContentPanel; +import com.extjs.gxt.ui.client.widget.Dialog; +import com.extjs.gxt.ui.client.widget.LayoutContainer; +import com.extjs.gxt.ui.client.widget.button.Button; +import com.extjs.gxt.ui.client.widget.layout.FitLayout; +import com.extjs.gxt.ui.client.widget.toolbar.SeparatorToolItem; +import com.extjs.gxt.ui.client.widget.toolbar.ToolBar; +import com.google.gwt.core.client.GWT; +import com.google.gwt.user.client.ui.Widget; + +/** + * Consists of a panel that can be inserted inside a container and + * provides a functionality to be detached (and attached to it again). + * + * The detach button is executed in toggle mode. + * + * Once detached a dialog window is created to contain it. + * + * @author Daniele Strollo (ISTI-CNR) + * + */ +public class DetachablePanel { + + public interface DetachablePanelHandler { + void onDetachEvent(DetachablePanel container, Component content); + void onEmbedEvent(DetachablePanel container, Component content); + } + + private ToolBar toolBar = new ToolBar(); + private LayoutContainer parent = null; + private boolean modal = true; + private boolean isDetached = false; + private ContentPanel rootPanel = null; + private Button detachButton = null; + private String title = ""; + private Component mainWidget = null; + private final List handlers = new Vector(); + + /** + * Depending on the status of detached panel, the + * actual container can be the container in which it is + * embedded or a dialog window. + */ + private LayoutContainer actualContainer = null; + + /** + * A detachable panel is created by specifying the widget + * suitable to contain it. + * Once detached the panel will be inserted in an ad-hoc dialog + * window. + * @param container the widget that will embed the panel + * @param modal if the detached window must be modal + */ + public DetachablePanel( + final LayoutContainer container, + final String title, + final String id, + final boolean modal) + throws InvalidParameterException { + super(); + Assertion checker = new Assertion(); + checker.validate(container != null, new InvalidParameterException("The container parameter is null")); + this.parent = container; + this.parent.setLayout(new FitLayout()); + this.modal = modal; + this.title = title; + this.onLoad(); + this.rootPanel.setId(id); + this.rootPanel.setHeaderVisible(false); + this.rootPanel.getHeader().setStyleName("x-hide-panel-header"); + WidgetsRegistry.registerWidget(id, this.rootPanel); + this.embedWindow(); + } + + /** + * Return the panel toolbar. + *

+ * Notice that the button for detaching the panel from its parent + * must not be removed to keep its functionality. + *

+ * @return + */ + public final ToolBar getToolBar() { + return this.toolBar; + } + + private void onLoad() { + this.rootPanel = new ContentPanel() { + @Override + public void hide() { + super.hide(); + if (actualContainer != null) { + actualContainer.hide(); + } + } + @Override + public void show() { + super.show(); + if (actualContainer != null) { + actualContainer.show(); + } + } + }; + this.initToolBar(); + this.rootPanel.setId("detachable-panel-root"); + this.rootPanel.setTopComponent(this.toolBar); + this.rootPanel.setLayout(new FitLayout()); + //this.rootPanel.setAutoHeight(true); + this.rootPanel.setHeight("100%"); + this.rootPanel.remove(this.rootPanel.getHeader()); + this.rootPanel.layout(); + } + + private void initToolBar() { + this.detachButton = new Button() { + @Override + protected void onClick(final ComponentEvent ce) { + toggleDetachWindow(); + } + }; + detachButton.setToolTip("Embeds/Detaches the dialog"); + detachButton.setIconStyle("detach-icon"); + detachButton.setEnabled(true); + toolBar.add(detachButton); + toolBar.add(new SeparatorToolItem()); + } + + /** + * Detaches the console from the main panel and inserts it + * inside a new dialog window. + * This happens in toggle mode. So further detach will + * attach again the console inside the main panel. + */ + private void toggleDetachWindow() { + // Console will be detached and inserted inside + // a newly created dialog. + if (!isDetached) { + this.detachWindow(); + this.onDetach(); + } else { + this.embedWindow(); + this.onEmbed(); + } + + isDetached = !isDetached; + } + + /** + * Here is implemented the detaching of the panel from its + * parent. + */ + private void detachWindow() { + GWT.log("Detaching panel " + this.title); + this.rootPanel.removeFromParent(); + + // The new window that will contain the detached panel + Dialog dlg = new Dialog(); + + // Closes the widgets that initially contained the panel + parent.disable(); + parent.removeFromParent(); + + dlg.setLayout(new FitLayout()); + // Setup the dialog window + dlg.setHeading(this.title); + dlg.setClosable(false); + dlg.setModal(this.modal); + dlg.setWidth(800); + dlg.setHeight(500); + dlg.setResizable(true); + dlg.getButtonBar().removeAll(); + dlg.add(this.rootPanel); + //dlg.setScrollMode(Scroll.AUTO); + + actualContainer = dlg; + + // Registers the dialog window + WidgetsRegistry.registerWidget(this.rootPanel.getId() + "-dlg-detached", dlg); + dlg.show(); + } + + /** + * Embeds the panel inside its parent and closes the detached window. + */ + private void embedWindow() { + GWT.log("Embedding panel " + this.title); + parent.add(this.rootPanel); + parent.enable(); + parent.layout(true); + + actualContainer = parent; + + Widget elem = WidgetsRegistry.getWidget(this.rootPanel.getId() + "-dlg-detached"); + if (elem != null) { + elem.removeFromParent(); + } + WidgetsRegistry.unregisterWidget(this.rootPanel.getId() + "-dlg-detached"); + } + + public final ContentPanel getRootPanel() { + return this.rootPanel; + } + + /** + * This method is called every time the panel is detached + * from its parent. + * + * The custom behavior when detached must be defined here. + */ + protected final void onDetach() { + // Forces the refresh of main container + Commands.refreshViewport(); + this.rootPanel.layout(true); + + for (DetachablePanelHandler handler : this.handlers) { + handler.onDetachEvent(this, this.mainWidget); + } + } + + /** + * This method is called once the detached panel is embedded + * inside its container. + */ + protected final void onEmbed() { + MainContainer viewport = Commands.getViewport(); + // Re-insert the component inside the viewport + viewport.add(this.parent); + + // Forces the refresh of main container + Commands.refreshViewport(); + this.rootPanel.layout(true); + + for (DetachablePanelHandler handler : this.handlers) { + handler.onEmbedEvent(this, this.mainWidget); + } + } + + public final void insertMainWidget(final Component widget) { + this.mainWidget = widget; + this.getRootPanel().add(widget); + } + + public final void layout(final boolean force) { + this.rootPanel.layout(force); + } + + public final void addHandler(final DetachablePanelHandler handler) { + this.handlers.add(handler); + } + + public final void removeHandler(final DetachablePanelHandler handler) { + this.handlers.remove(handler); + } +} diff --git a/src/main/java/org/gcube/portlets/admin/resourcemanagement/client/widgets/panels/GenericTreePanel.java b/src/main/java/org/gcube/portlets/admin/resourcemanagement/client/widgets/panels/GenericTreePanel.java new file mode 100644 index 0000000..1684768 --- /dev/null +++ b/src/main/java/org/gcube/portlets/admin/resourcemanagement/client/widgets/panels/GenericTreePanel.java @@ -0,0 +1,113 @@ +/**************************************************************************** + * This software is part of the gCube Project. + * Site: http://www.gcube-system.org/ + **************************************************************************** + * The gCube/gCore software is licensed as Free Open Source software + * conveying to the EUPL (http://ec.europa.eu/idabc/eupl). + * The software and documentation is provided by its authors/distributors + * "as is" and no expressed or + * implied warranty is given for its use, quality or fitness for a + * particular case. + **************************************************************************** + * Filename: GenericTreePanel.java + **************************************************************************** + * @author Daniele Strollo + ***************************************************************************/ + +package org.gcube.portlets.admin.resourcemanagement.client.widgets.panels; + +import org.gcube.portlets.admin.resourcemanagement.shared.utils.XMLUtil; +import org.gcube.resourcemanagement.support.shared.types.datamodel.AtomicTreeNode; + +import com.extjs.gxt.ui.client.Style.SortDir; +import com.extjs.gxt.ui.client.data.ModelData; +import com.extjs.gxt.ui.client.data.ModelIconProvider; +import com.extjs.gxt.ui.client.event.ComponentEvent; +import com.extjs.gxt.ui.client.store.TreeStore; +import com.extjs.gxt.ui.client.util.IconHelper; +import com.extjs.gxt.ui.client.widget.menu.Menu; +import com.extjs.gxt.ui.client.widget.menu.MenuItem; +import com.extjs.gxt.ui.client.widget.treepanel.TreePanel; +import com.google.gwt.core.client.GWT; +import com.google.gwt.user.client.ui.AbstractImagePrototype; + +/** + * @author Daniele Strollo (ISTI-CNR) + * + */ +public class GenericTreePanel { + private TreePanel tree = null; + + public GenericTreePanel(final String xml, final String rootNode) { + AtomicTreeNode model = new AtomicTreeNode(rootNode, null); + + try { + model.add(XMLUtil.XMLToTree(xml, rootNode)); + } catch (Exception e) { + GWT.log("During profile conversion", e); + } + + TreeStore store = new TreeStore(); + // The root node will not be shown + store.add(model.getChildren(), true); + + store.sort("name", SortDir.ASC); + + this.tree = new TreePanel(store) { + private boolean loaded = false; + @Override + protected void onLoad() { + super.onLoad(); + if (loaded) { + return; + } + // Expands the first level only + this.setExpanded(this.getStore().getRootItems().get(0), true, false); + this.loaded = true; + } + }; + this.tree.setWidth(300); + this.tree.setDisplayProperty("name"); + + this.tree.setHeight("100%"); + this.tree.setWidth("100%"); + + Menu subMenu = new Menu(); + subMenu.add(new MenuItem("Expand All") { + @Override + protected void onClick(final ComponentEvent be) { + super.onClick(be); + tree.expandAll(); + } + }); + subMenu.add(new MenuItem("Collapse All") { + @Override + protected void onClick(final ComponentEvent be) { + super.onClick(be); + tree.collapseAll(); + } + }); + this.tree.setContextMenu(subMenu); + + // The icon decorator + this.tree.setIconProvider( + new ModelIconProvider() { + public AbstractImagePrototype getIcon(final ModelData model) { + if (model instanceof AtomicTreeNode) { + AtomicTreeNode m = (AtomicTreeNode) model; + if (m.isLeaf()) { + return IconHelper.createStyle("console-log-icon"); + } else { + return IconHelper.createStyle("profile-folder-icon"); + } + } + return IconHelper.createStyle("defaultleaf-icon"); + } + }); + } + + public final TreePanel getWidget() { + return this.tree; + } + +} diff --git a/src/main/java/org/gcube/portlets/admin/resourcemanagement/client/widgets/panels/MainPanel.java b/src/main/java/org/gcube/portlets/admin/resourcemanagement/client/widgets/panels/MainPanel.java new file mode 100644 index 0000000..42ee844 --- /dev/null +++ b/src/main/java/org/gcube/portlets/admin/resourcemanagement/client/widgets/panels/MainPanel.java @@ -0,0 +1,117 @@ +/**************************************************************************** + * This software is part of the gCube Project. + * Site: http://www.gcube-system.org/ + **************************************************************************** + * The gCube/gCore software is licensed as Free Open Source software + * conveying to the EUPL (http://ec.europa.eu/idabc/eupl). + * The software and documentation is provided by its authors/distributors + * "as is" and no expressed or + * implied warranty is given for its use, quality or fitness for a + * particular case. + **************************************************************************** + * Filename: MainPanel.java + **************************************************************************** + * @author Daniele Strollo + ***************************************************************************/ + +package org.gcube.portlets.admin.resourcemanagement.client.widgets.panels; + +import com.extjs.gxt.ui.client.Style.LayoutRegion; +import com.extjs.gxt.ui.client.util.Margins; +import com.extjs.gxt.ui.client.widget.Component; +import com.extjs.gxt.ui.client.widget.ContentPanel; +import com.extjs.gxt.ui.client.widget.LayoutContainer; +import com.extjs.gxt.ui.client.widget.layout.BorderLayoutData; +import com.google.gwt.user.client.ui.Widget; + +public abstract class MainPanel { + private BorderLayoutData layout = null; + private ContentPanel container = null; + + public MainPanel(final LayoutRegion position) { + this.layout = new BorderLayoutData(position); + this.container = new ContentPanel() { + protected void onRender(final com.google.gwt.user.client.Element parent, final int pos) { + super.onRender(parent, pos); + init(); + }; + }; + this.setSplit(true); + } + + public MainPanel(final int size, final LayoutRegion position) { + this(position); + this.layout.setSize(size); + } + + public MainPanel(final int size, final String title, final LayoutRegion position) { + this(size, position); + if (title != null) { + this.container.setHeading(title); + } + } + + public final BorderLayoutData getLayout() { + return this.layout; + } + + public final void showHeader(final boolean showHeader) { + this.container.setHeaderVisible(showHeader); + } + + public final LayoutContainer getContainer() { + return this.container; + } + + public final void setMargins(final Margins margins) { + this.layout.setMargins(margins); + } + + public final void setCollapsible(final boolean collapsible) { + this.layout.setCollapsible(collapsible); + } + + public final void setFloatable(final boolean floatable) { + this.layout.setFloatable(floatable); + } + + public final void setSplit(final boolean split) { + this.layout.setSplit(split); + } + + public final void add(final Widget w, final boolean removeOthers) { + if (removeOthers) { + this.container.removeAll(); + } + this.container.add(w); + this.container.layout(); + } + + public final void setTopComponent(final Component component) { + this.container.setTopComponent(component); + } + + public final void setBottomComponent(final Component component) { + this.container.setBottomComponent(component); + } + + + public final void removeAll() { + this.container.removeAll(); + } + + /** + * Requires the following lines in the .css + *
+	 * .x-hide-panel-header {
+	 * 		display:none !important;
+	 * }
+	 * 
+ */ + public final void hideHeader() { + this.container.setHeaderVisible(false); + this.container.getHeader().setStyleName("x-hide-panel-header"); + } + + public abstract void init(); +} diff --git a/src/main/java/org/gcube/portlets/admin/resourcemanagement/client/widgets/panels/ScrollablePanel.java b/src/main/java/org/gcube/portlets/admin/resourcemanagement/client/widgets/panels/ScrollablePanel.java new file mode 100644 index 0000000..3c99cb6 --- /dev/null +++ b/src/main/java/org/gcube/portlets/admin/resourcemanagement/client/widgets/panels/ScrollablePanel.java @@ -0,0 +1,70 @@ +/**************************************************************************** + * This software is part of the gCube Project. + * Site: http://www.gcube-system.org/ + **************************************************************************** + * The gCube/gCore software is licensed as Free Open Source software + * conveying to the EUPL (http://ec.europa.eu/idabc/eupl). + * The software and documentation is provided by its authors/distributors + * "as is" and no expressed or + * implied warranty is given for its use, quality or fitness for a + * particular case. + **************************************************************************** + * Filename: ScrollablePanel.java + **************************************************************************** + * @author Daniele Strollo + ***************************************************************************/ + +package org.gcube.portlets.admin.resourcemanagement.client.widgets.panels; + +import com.extjs.gxt.ui.client.Style.Scroll; +import com.extjs.gxt.ui.client.widget.Component; +import com.extjs.gxt.ui.client.widget.ContentPanel; +import com.extjs.gxt.ui.client.widget.layout.FitLayout; +import com.google.gwt.user.client.Element; + +/** + * @author Daniele Strollo (ISTI-CNR) + * + */ +public class ScrollablePanel extends ContentPanel { + + public ScrollablePanel() { + super(); + this.setLayout(new FitLayout()); + this.setScrollMode(Scroll.AUTO); + this.setHeaderVisible(false); + this.setWidth("100%"); + this.setHeight("100%"); + this.setLayoutOnChange(true); + + this.getHeader().setStyleName("x-hide-panel-header"); + } + + public ScrollablePanel(final String id) { + this(); + this.setId(id); + } + + public ScrollablePanel(final Component widget) { + this(); + this.setScrollableWidget(widget); + } + + public ScrollablePanel(final String id, final Component widget) { + this(id); + this.setScrollableWidget(widget); + } + + public final void setScrollableWidget(final Component widget) { + this.removeAll(); + widget.setWidth("100%"); + widget.setHeight("100%"); + this.add(widget); + this.layout(true); + } + + @Override + protected final void onRender(final Element parent, final int pos) { + super.onRender(parent, pos); + } +} diff --git a/src/main/java/org/gcube/portlets/admin/resourcemanagement/client/widgets/registry/UIIdentifiers.java b/src/main/java/org/gcube/portlets/admin/resourcemanagement/client/widgets/registry/UIIdentifiers.java new file mode 100644 index 0000000..b7f0862 --- /dev/null +++ b/src/main/java/org/gcube/portlets/admin/resourcemanagement/client/widgets/registry/UIIdentifiers.java @@ -0,0 +1,52 @@ +/**************************************************************************** + * This software is part of the gCube Project. + * Site: http://www.gcube-system.org/ + **************************************************************************** + * The gCube/gCore software is licensed as Free Open Source software + * conveying to the EUPL (http://ec.europa.eu/idabc/eupl). + * The software and documentation is provided by its authors/distributors + * "as is" and no expressed or + * implied warranty is given for its use, quality or fitness for a + * particular case. + **************************************************************************** + * Filename: UIIdentifiers.java + **************************************************************************** + * @author Daniele Strollo + ***************************************************************************/ + +package org.gcube.portlets.admin.resourcemanagement.client.widgets.registry; + +/** + * @author Daniele Strollo (ISTI-CNR) + * + */ +public class UIIdentifiers { + // The panel containing the console + public static final String CONSOLE_COMPONENT_ID = "console-panel"; + // The widget that will be used to send notification messages to the + // console. + public static final String CONSOLE_WIDGET_ID = "console-widget"; + // The main panel that will contain the console + public static final String CONSOLE_PANEL_ID = "panel-south"; + // The ID of west panel (resource navigation) + public static final String RESOURCE_NAVIGATION_PANEL = "panel-west"; + // The main panel containing the resource detail grid + public static final String RESOURCE_DETAIL_GRID_PANEL = "resource-detail-grid-panel"; + // The wrapper of resource detail grid (getWidget will return the contained grid). + public static final String RESOURCE_DETAIL_GRID_CONTAINER_ID = "resource-detail-grid"; + + // The tool bar in the main menu panel + public static final String GLOBAL_STATUS_BAR_ID = "global-status-bar"; + public static final String STATUS_SCOPE_INFO_ID = "scope-info-status-bar"; + public static final String STATUS_LOADED_RESOURCES_ID = "loaded-resources-status-bar"; + public static final String STATUS_PROGRESS_BAR_ID = "progress-status-bar"; + + public static final String GLOBAL_MENUBAR_ID = "global-menu-bar"; + + public static final String BUTTON_AVAILABLE_SCOPES_ID = "btn-available-scopes"; + + public static final String MAIN_CONTAINER_VIEWPORT_ID = "main-container-viewport"; + + public static final String GLOBAL_MENU_CONTAINER_PANEL = "panel-north"; + public static final String TASKBAR_PANEL = "panel-est"; +} diff --git a/src/main/java/org/gcube/portlets/admin/resourcemanagement/client/widgets/registry/WidgetsRegistry.java b/src/main/java/org/gcube/portlets/admin/resourcemanagement/client/widgets/registry/WidgetsRegistry.java new file mode 100644 index 0000000..3dcb3d7 --- /dev/null +++ b/src/main/java/org/gcube/portlets/admin/resourcemanagement/client/widgets/registry/WidgetsRegistry.java @@ -0,0 +1,96 @@ +/**************************************************************************** + * This software is part of the gCube Project. + * Site: http://www.gcube-system.org/ + **************************************************************************** + * The gCube/gCore software is licensed as Free Open Source software + * conveying to the EUPL (http://ec.europa.eu/idabc/eupl). + * The software and documentation is provided by its authors/distributors + * "as is" and no expressed or + * implied warranty is given for its use, quality or fitness for a + * particular case. + **************************************************************************** + * Filename: WidgetsRegistry.java + **************************************************************************** + * @author Daniele Strollo + ***************************************************************************/ + +package org.gcube.portlets.admin.resourcemanagement.client.widgets.registry; + +import java.util.HashMap; + +import org.gcube.portlets.admin.resourcemanagement.client.widgets.console.ConsolePanel; +import org.gcube.portlets.admin.resourcemanagement.client.widgets.panels.MainPanel; +import org.gcube.portlets.admin.resourcemanagement.shared.exceptions.WidgetNotRegistered; +import org.gcube.resourcemanagement.support.shared.util.Assertion; + +import com.google.gwt.user.client.ui.Widget; + +public class WidgetsRegistry { + private static final HashMap registeredWidgets = new HashMap(); + + public static synchronized void registerWidget(final String ID, final Widget widget) { + registeredWidgets.put(ID, widget); + } + + public static synchronized void registerPanel(final String ID, final MainPanel widget) { + registeredWidgets.put(ID, widget); + } + + public static synchronized MainPanel getPanel(final String ID) { + if (!registeredWidgets.containsKey(ID) || !(registeredWidgets.get(ID) instanceof MainPanel)) { + return null; + } + return (MainPanel) registeredWidgets.get(ID); + } + + public static synchronized Widget getWidget(final String ID) { + if (!registeredWidgets.containsKey(ID) || !(registeredWidgets.get(ID) instanceof Widget)) { + return null; + } + return (Widget) registeredWidgets.get(ID); + } + public static synchronized boolean containsElem(final String ID) { + return registeredWidgets.containsKey(ID); + } + + public static synchronized Object getElem(final String key){ + return registeredWidgets.get(key); + } + + public static synchronized void unregisterWidget(final String key) { + if (registeredWidgets.containsKey(key)) { + registeredWidgets.remove(key); + } + } + + public static synchronized void registerElem(final String ID, final Object widget) { + registeredWidgets.put(ID, widget); + } + + @SuppressWarnings("unchecked") + public static final synchronized Object getElem(final String key, final Class elemType) + throws WidgetNotRegistered { + Assertion checker = new Assertion(); + checker.validate(registeredWidgets.containsKey(key), new WidgetNotRegistered("The widget " + key + " has not be registered")); + Object retval = registeredWidgets.get(key); + + try { + return (T) retval; + } catch (ClassCastException e) { + throw new WidgetNotRegistered("The registered element is not of declared type"); + } + } + + /** + * Utility that returns the singleton instance of console panel. + * @return null if the console has not been registered + */ + public static ConsolePanel getConsole() { + try { + return (ConsolePanel) WidgetsRegistry.getElem(UIIdentifiers.CONSOLE_WIDGET_ID, ConsolePanel.class); + } catch (WidgetNotRegistered e) { + return null; + } + } + +} 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 new file mode 100644 index 0000000..9c4206c --- /dev/null +++ b/src/main/java/org/gcube/portlets/admin/resourcemanagement/client/widgets/taskbar/TaskbarButton.java @@ -0,0 +1,177 @@ +/**************************************************************************** + * This software is part of the gCube Project. + * Site: http://www.gcube-system.org/ + **************************************************************************** + * The gCube/gCore software is licensed as Free Open Source software + * conveying to the EUPL (http://ec.europa.eu/idabc/eupl). + * The software and documentation is provided by its authors/distributors + * "as is" and no expressed or + * implied warranty is given for its use, quality or fitness for a + * particular case. + **************************************************************************** + * Filename: TaskbarButton.java + **************************************************************************** + * @author Daniele Strollo + ***************************************************************************/ + +package org.gcube.portlets.admin.resourcemanagement.client.widgets.taskbar; + +import com.extjs.gxt.ui.client.core.El; +import com.extjs.gxt.ui.client.event.ComponentEvent; +import com.extjs.gxt.ui.client.event.Events; +import com.extjs.gxt.ui.client.event.SelectionListener; +import com.extjs.gxt.ui.client.util.IconHelper; +import com.extjs.gxt.ui.client.widget.Component; +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.ui.AbstractImagePrototype; + +/** + * @author Massimiliano Assante (ISTI-CNR) + * + * 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; + + /** + * 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); + } + + public final AbstractImagePrototype getIcon() { + return icon; + } + + /** + * Returns the shortcuts text. + * + * @return the text + */ + public final String getText() { + return text; + } + + @Override + public final void onComponentEvent(final ComponentEvent ce) { + super.onComponentEvent(ce); + if (ce.getEventTypeInt() == Event.ONCLICK) { + onClick(ce); + } + } + + /** + * 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)); + + } + + /** + * 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); + } + + @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("

"+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; + + if (txt != null) { + txt.setInnerHtml(toShow); + } + el().updateZIndex(0); + sinkEvents(Event.ONCLICK); + if (icon != null) { + setIcon(icon); + } + } + +} 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 new file mode 100644 index 0000000..1f7c042 --- /dev/null +++ b/src/main/java/org/gcube/portlets/admin/resourcemanagement/client/widgets/taskbar/TaskbarItem.java @@ -0,0 +1,177 @@ +/**************************************************************************** + * This software is part of the gCube Project. + * Site: http://www.gcube-system.org/ + **************************************************************************** + * The gCube/gCore software is licensed as Free Open Source software + * conveying to the EUPL (http://ec.europa.eu/idabc/eupl). + * The software and documentation is provided by its authors/distributors + * "as is" and no expressed or + * implied warranty is given for its use, quality or fitness for a + * particular case. + **************************************************************************** + * Filename: IconizablePanel.java + **************************************************************************** + * @author Daniele Strollo + ***************************************************************************/ + +package org.gcube.portlets.admin.resourcemanagement.client.widgets.taskbar; + +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; +import org.gcube.portlets.admin.resourcemanagement.client.widgets.panels.MainPanel; +import org.gcube.portlets.admin.resourcemanagement.shared.Configuration; +import org.gcube.resourcemanagement.support.client.views.ResourceTypeDecorator; + +import com.extjs.gxt.ui.client.event.ComponentEvent; +import com.extjs.gxt.ui.client.widget.menu.Menu; +import com.extjs.gxt.ui.client.widget.menu.MenuItem; +import com.google.gwt.core.client.GWT; + +/** + * @author Massimiliano Assante (ISTI-CNR) + * @author Daniele Strollo + * + */ +public class TaskbarItem { + private MainPanel parent = null; + private TaskbarButton detachButton = null; + private TaskbarWindow relatedWidget = null; + private String resourceID = null; + private ResourceTypeDecorator type = null; + + + private String scope = null; + + public TaskbarItem( + final String scope, + final ResourceTypeDecorator type, // optional + final MainPanel container, + final String resourceID, + final String title, + final String uiComponentID, + final String buttonIcon) { + this.parent = container; + this.type = type; + this.initUI(title, uiComponentID, buttonIcon); + this.resourceID = resourceID; + this.scope = scope; + } + + private String getScope() { + return this.scope; + } + + private void initUI(final String title, + final String id, + final String buttonIcon) { + this.detachButton = new TaskbarButton("btn" + id, ""+type, title) { + protected void onClick(final com.extjs.gxt.ui.client.event.ComponentEvent ce) { + relatedWidget.doMinimize(); + } + }; + GWT.log("TITLE: " + title); + this.detachButton.setStyleName("taskbar-button"); + + this.detachButton.setIconStyle(buttonIcon); + this.parent.add(this.detachButton, false); + + this.relatedWidget = new TaskbarWindow(this); + this.relatedWidget.setHeading(title); + + if (Configuration.openProfileOnLoad) { + this.activate(); + } else { + this.relatedWidget.setIsMinimized(true); + } + + Menu mnu = new Menu(); + MenuItem close = new MenuItem("Close") { + @Override + protected void onClick(final ComponentEvent be) { + super.onClick(be); + relatedWidget.doClose(); + } + }; + close.setIconStyle("close-icon"); + mnu.add(close); + + MenuItem closeAll = new MenuItem("CloseAll") { + @Override + protected void onClick(final ComponentEvent be) { + super.onClick(be); + TaskbarRegister.closeAll(); + } + }; + closeAll.setIconStyle("closeall-icon"); + mnu.add(closeAll); + + if (type != null && type == ResourceTypeDecorator.DeployReport) { + MenuItem refresh = new MenuItem("Refresh") { + @Override + protected void onClick(final ComponentEvent be) { + super.onClick(be); + ProxyRegistry.getProxyInstance().checkDeployStatus( + getScope(), + resourceID.trim(), + Callbacks.handleGetDeploymentReport); + } + }; + refresh.setIconStyle("refresh-icon"); + mnu.add(refresh); + } + + if (type != null && + (type == ResourceTypeDecorator.GHN || + type == ResourceTypeDecorator.VIEW || + type == ResourceTypeDecorator.Collection || + type == ResourceTypeDecorator.GenericResource || + type == ResourceTypeDecorator.RunningInstance || + type == ResourceTypeDecorator.Service) + ) { + MenuItem refresh = new MenuItem("Refresh") { + @Override + protected void onClick(final ComponentEvent be) { + super.onClick(be); + Commands.doGetResourceProfileByID( + this, + getScope(), + resourceID.trim()); + } + }; + refresh.setIconStyle("refresh-icon"); + mnu.add(refresh); + } + + this.detachButton.setContextMenu(mnu); + } + + public final String getResourceID() { + return this.resourceID; + } + + public final void destroy() { + try { + TaskbarRegister.unregisterTaskbarWidget(this.resourceID); + this.parent.getContainer().remove(this.detachButton); + this.relatedWidget.hide(); + } catch (Exception e) { + } + } + + protected final void disactivate() { + this.detachButton.setStyleName("taskbar-button"); + } + + protected final void activate() { + this.detachButton.setStyleName("taskbar-button-active"); + } + + public final TaskbarWindow getRelatedWindow() { + return this.relatedWidget; + } + + public ResourceTypeDecorator getType() { + return type; + } +} diff --git a/src/main/java/org/gcube/portlets/admin/resourcemanagement/client/widgets/taskbar/TaskbarRegister.java b/src/main/java/org/gcube/portlets/admin/resourcemanagement/client/widgets/taskbar/TaskbarRegister.java new file mode 100644 index 0000000..963252f --- /dev/null +++ b/src/main/java/org/gcube/portlets/admin/resourcemanagement/client/widgets/taskbar/TaskbarRegister.java @@ -0,0 +1,114 @@ +/**************************************************************************** + * This software is part of the gCube Project. + * Site: http://www.gcube-system.org/ + **************************************************************************** + * The gCube/gCore software is licensed as Free Open Source software + * conveying to the EUPL (http://ec.europa.eu/idabc/eupl). + * The software and documentation is provided by its authors/distributors + * "as is" and no expressed or + * implied warranty is given for its use, quality or fitness for a + * particular case. + **************************************************************************** + * Filename: TaskbarRegister.java + **************************************************************************** + * @author Daniele Strollo + ***************************************************************************/ + +package org.gcube.portlets.admin.resourcemanagement.client.widgets.taskbar; + +import java.util.HashMap; + +import org.gcube.portlets.admin.resourcemanagement.client.widgets.console.ConsoleMessageBroker; +import org.gcube.resourcemanagement.support.client.views.ResourceTypeDecorator; + +import com.google.gwt.core.client.GWT; + +/** + * Manages the widgets registered in the taskbar. + * Useful to implement the "close all" and to avoid + * duplicates. + * @author Daniele Strollo (ISTI-CNR) + * + */ +public class TaskbarRegister { + final static HashMap registeredItems = new HashMap(); + static TaskbarWindow lastOpenedWindow = null; + + public static int getCurrAddScopeReportsNumber() { + int count = 0; + for (String item : registeredItems.keySet()) { + GWT.log(item); + if (registeredItems.get(item).getType() == ResourceTypeDecorator.AddScopeReport ) + count++; + } + return count; + } + + public static synchronized void setLastOpenedWindow(TaskbarWindow lastOpenedWindow) { + TaskbarRegister.lastOpenedWindow = lastOpenedWindow; + } + + public static synchronized TaskbarWindow getLastOpenedWindow() { + return TaskbarRegister.lastOpenedWindow; + } + + public static synchronized void registerTaskbarWidget(final String id, final TaskbarItem item) { + ConsoleMessageBroker.info(TaskbarRegister.class, "Registering res: " + id); + registeredItems.put(id, item); + } + + public static synchronized void unregisterTaskbarWidget(final String id) { + ConsoleMessageBroker.info(TaskbarRegister.class, "Unregistering res: " + id); + registeredItems.remove(id); + } + + public static synchronized TaskbarItem getTaskbarItem(final String id) { + if (registeredItems.containsKey(id)) { + return registeredItems.get(id); + } + return null; + } + + public static synchronized boolean contains(final String key) { + return registeredItems.containsKey(key); + } + + public static synchronized void minimizeAll() { + Object[] items = registeredItems.values().toArray(); + ConsoleMessageBroker.trace(TaskbarRegister.class, "Elems to remove: " + items.length); + TaskbarItem curItem = null; + for (Object elem : items){ + try { + if (elem != null) { + curItem = ((TaskbarItem)elem); + if (!curItem.getRelatedWindow().isMinimized()) { + curItem.getRelatedWindow().doMinimize(); + } + } + + } catch (Exception e) { + GWT.log("During remove all profiles", e); + ConsoleMessageBroker.error(TaskbarRegister.class, e.getMessage()); + } + } + ConsoleMessageBroker.info(TaskbarRegister.class, "Unregistering all resources"); + } + + public static synchronized void closeAll() { + Object[] items = registeredItems.values().toArray(); + ConsoleMessageBroker.trace(TaskbarRegister.class, "Elems to remove: " + items.length); + for (Object elem : items){ + try { + if (elem != null) { + ((TaskbarItem)elem).getRelatedWindow().doClose(); + } + + } catch (Exception e) { + GWT.log("During remove all profiles", e); + ConsoleMessageBroker.error(TaskbarRegister.class, e.getMessage()); + } + } + ConsoleMessageBroker.info(TaskbarRegister.class, "Unregistering all resources"); + registeredItems.clear(); + } +} diff --git a/src/main/java/org/gcube/portlets/admin/resourcemanagement/client/widgets/taskbar/TaskbarWindow.java b/src/main/java/org/gcube/portlets/admin/resourcemanagement/client/widgets/taskbar/TaskbarWindow.java new file mode 100644 index 0000000..452df1d --- /dev/null +++ b/src/main/java/org/gcube/portlets/admin/resourcemanagement/client/widgets/taskbar/TaskbarWindow.java @@ -0,0 +1,99 @@ +/**************************************************************************** + * This software is part of the gCube Project. + * Site: http://www.gcube-system.org/ + **************************************************************************** + * The gCube/gCore software is licensed as Free Open Source software + * conveying to the EUPL (http://ec.europa.eu/idabc/eupl). + * The software and documentation is provided by its authors/distributors + * "as is" and no expressed or + * implied warranty is given for its use, quality or fitness for a + * particular case. + **************************************************************************** + * Filename: TaskbarWindow.java + **************************************************************************** + * @author Daniele Strollo + ***************************************************************************/ + +package org.gcube.portlets.admin.resourcemanagement.client.widgets.taskbar; + +import org.gcube.portlets.admin.resourcemanagement.client.widgets.console.ConsoleMessageBroker; +import org.gcube.portlets.admin.resourcemanagement.shared.Configuration; + +import com.extjs.gxt.ui.client.event.IconButtonEvent; +import com.extjs.gxt.ui.client.event.SelectionListener; +import com.extjs.gxt.ui.client.widget.Component; +import com.extjs.gxt.ui.client.widget.Window; +import com.extjs.gxt.ui.client.widget.button.ToolButton; +import com.extjs.gxt.ui.client.widget.layout.FitLayout; + +/** + * @author Daniele Strollo (ISTI-CNR) + * + */ +public class TaskbarWindow extends Window { + private TaskbarItem relatedItem = null; + private boolean isMinimized = false; + + protected TaskbarWindow(final TaskbarItem relatedItem) { + super(); + this.setModal(false); + this.setClosable(false); + this.setLayout(new FitLayout()); + this.relatedItem = relatedItem; + + this.setWidth(800); + this.setHeight(500); + + this.getHeader().addTool(new ToolButton("x-tool-minimize", new SelectionListener() { + @Override + public void componentSelected(final IconButtonEvent ce) { + doMinimize(); + } + })); + /* removed the close functionality from the window. only the button can be closed + this.getHeader().addTool(new ToolButton("x-tool-close", new SelectionListener() { + @Override + public void componentSelected(final IconButtonEvent ce) { + doClose(); + } + })); + */ + if (Configuration.openProfileOnLoad) { + this.show(); + } + } + + protected final void doClose() { + ConsoleMessageBroker.trace(this, "Closing taskbar item: " + this.relatedItem.getResourceID()); + this.relatedItem.destroy(); + this.hide(); + } + + protected final void doMinimize() { + if (this.isMinimized) { + if (!Configuration.allowMultipleProfiles) { + TaskbarRegister.minimizeAll(); + } + this.show(); + this.relatedItem.activate(); + } else { + this.hide(); + this.relatedItem.disactivate(); + } + this.isMinimized = !isMinimized; + } + + public final void setIsMinimized(boolean minimized) { + this.isMinimized = minimized; + } + + public final boolean isMinimized() { + return this.isMinimized; + } + + public final void setMainWidget(final Component widget) { + this.removeAll(); + this.add(widget); + this.layout(true); + } +} diff --git a/src/main/java/org/gcube/portlets/admin/resourcemanagement/client/widgets/viewport/MainContainer.java b/src/main/java/org/gcube/portlets/admin/resourcemanagement/client/widgets/viewport/MainContainer.java new file mode 100644 index 0000000..3ea342c --- /dev/null +++ b/src/main/java/org/gcube/portlets/admin/resourcemanagement/client/widgets/viewport/MainContainer.java @@ -0,0 +1,42 @@ +/**************************************************************************** + * This software is part of the gCube Project. + * Site: http://www.gcube-system.org/ + **************************************************************************** + * The gCube/gCore software is licensed as Free Open Source software + * conveying to the EUPL (http://ec.europa.eu/idabc/eupl). + * The software and documentation is provided by its authors/distributors + * "as is" and no expressed or + * implied warranty is given for its use, quality or fitness for a + * particular case. + **************************************************************************** + * Filename: MainContainer.java + **************************************************************************** + * @author Daniele Strollo + ***************************************************************************/ + +package org.gcube.portlets.admin.resourcemanagement.client.widgets.viewport; + +import org.gcube.portlets.admin.resourcemanagement.client.widgets.panels.MainPanel; +import org.gcube.portlets.admin.resourcemanagement.client.widgets.registry.WidgetsRegistry; +import com.extjs.gxt.ui.client.widget.LayoutContainer; + +/** + * @author Daniele Strollo (ISTI-CNR) + */ +public class MainContainer extends LayoutContainer { + public MainContainer() { + super(); + //- this.setPagePosition(0, 150); + } + + public boolean add(String id, MainPanel item) { + WidgetsRegistry.registerWidget(id, item.getContainer()); + return super.add(item.getContainer(), item.getLayout()); + } + + public boolean addPanel(String id, MainPanel item) { + WidgetsRegistry.registerPanel(id, item); + return super.add(item.getContainer(), item.getLayout()); + } + +} diff --git a/src/main/java/org/gcube/portlets/admin/resourcemanagement/server/QueryTest.java b/src/main/java/org/gcube/portlets/admin/resourcemanagement/server/QueryTest.java new file mode 100644 index 0000000..33a0a12 --- /dev/null +++ b/src/main/java/org/gcube/portlets/admin/resourcemanagement/server/QueryTest.java @@ -0,0 +1,55 @@ +package org.gcube.portlets.admin.resourcemanagement.server; + +import java.util.List; + +import org.gcube.common.core.contexts.GHNContext; +import org.gcube.common.core.informationsystem.client.ISClient; +import org.gcube.common.core.informationsystem.client.XMLResult; +import org.gcube.common.core.informationsystem.client.queries.GCUBEGenericQuery; +import org.gcube.common.core.scope.GCUBEScope; + +public class QueryTest { + + public static void main(String[] args) throws Exception { + List results = null; + ISClient client = GHNContext.getImplementation(ISClient.class); + GCUBEGenericQuery isQuery = null; + isQuery = client.getQuery(GCUBEGenericQuery.class); + + String query = "declare namespace gc = 'http://gcube-system.org/namespaces/common/core/porttypes/GCUBEProvider'; " + + " declare namespace wmns= 'http://gcube-system.org/namespaces/contentmanagement/viewmanager'; " + + " for $outer in collection(\"/db/Properties\")//Document, $res in $outer/Data " + + " where $res/gc:ServiceClass/string() eq 'ContentManagement' and count($res//wmns:View)>0 " + + " and $res/gc:ServiceName/string() eq 'ViewManager'" + + "return " + + " " + + " {$outer//Document/ID} " + + " {$outer//Document/Source} " + + " {$outer//Document/SourceKey} " + + " {$outer//Document/Data/child::*[local-name()='ServiceClass']/text()} " + + " {$outer//Document/Data/child::*[local-name()='ServiceName']/text()} " + + " {$outer//Document/Data/child::*[local-name()='ServiceClass']/text()} " + + " {$outer//Document/TerminationTimeHuman} "+ + " {$outer//Document/LastUpdateHuman} " + + " {$outer//Document/Data/child::*[local-name()='RI']/text()} " + + " WSResource "+ + " {$outer//Document/Data/child::*[local-name()='Scope']/text()} "+ + " "; + + + System.out.println(query); + + isQuery.setExpression(query); + results = client.execute(isQuery, GCUBEScope.getScope("/gcube/devNext")); + for (XMLResult elem : results) { + try { + + System.out.println(elem.toString()); + + } catch (IndexOutOfBoundsException e) { + // ignore exception + } + + } + } +} diff --git a/src/main/java/org/gcube/portlets/admin/resourcemanagement/server/ResourceCommands.java b/src/main/java/org/gcube/portlets/admin/resourcemanagement/server/ResourceCommands.java new file mode 100644 index 0000000..5504115 --- /dev/null +++ b/src/main/java/org/gcube/portlets/admin/resourcemanagement/server/ResourceCommands.java @@ -0,0 +1,215 @@ +/**************************************************************************** + * This software is part of the gCube Project. + * Site: http://www.gcube-system.org/ + **************************************************************************** + * The gCube/gCore software is licensed as Free Open Source software + * conveying to the EUPL (http://ec.europa.eu/idabc/eupl). + * The software and documentation is provided by its authors/distributors + * "as is" and no expressed or + * implied warranty is given for its use, quality or fitness for a + * particular case. + **************************************************************************** + * Filename: ResourceCommands.java + **************************************************************************** + * @author Daniele Strollo + ***************************************************************************/ + +package org.gcube.portlets.admin.resourcemanagement.server; + +import java.util.List; + +import org.gcube.common.core.scope.GCUBEScope; + + +import org.gcube.resourcemanagement.support.client.utils.CurrentStatus; +import org.gcube.resourcemanagement.support.shared.util.Assertion; +import org.gcube.resourcemanagement.support.server.managers.resources.CollectionManager; +import org.gcube.resourcemanagement.support.server.managers.resources.GHNManager; +import org.gcube.resourcemanagement.support.server.managers.resources.GenericResourceManager; +import org.gcube.resourcemanagement.support.server.managers.resources.RuntimeResourceManager; +import org.gcube.resourcemanagement.support.server.managers.resources.ViewManager; +import org.gcube.resourcemanagement.support.server.managers.scope.ScopeManager; +import org.gcube.resourcemanagement.support.server.types.AllowedResourceTypes; +import org.gcube.resourcemanagement.support.server.utils.ServerConsole; +import org.gcube.resourcemanagement.support.shared.exceptions.InvalidParameterException; +import org.gcube.resourcemanagement.support.shared.operations.SupportedOperations; +import org.gcube.resourcemanagement.support.shared.types.datamodel.ResourceDescriptor; + +/** + * @author Daniele Strollo (ISTI-CNR) + * + */ +public class ResourceCommands { + private static final String LOG_PREFIX = "[RES-CMDS]"; + + @SuppressWarnings("deprecation") + public static void doOperation( + final CurrentStatus status, + final SupportedOperations opCode, + final String scope, + final List resources) + throws Exception { + ServerConsole.debug(LOG_PREFIX, "[RES-COMMANDS-DO] Required operation: " + opCode); + + Assertion checker = new Assertion(); + checker.validate(opCode != null, new InvalidParameterException("Invalid operation required")); + checker.validate(scope != null && scope.length() > 0, + new InvalidParameterException("Invalid scope.")); + checker.validate(resources != null && resources.size() > 0, + new InvalidParameterException("Invalid resource descriptor.")); + // Checks permissions + checker.validate(opCode.isAllowed(status.getCredentials()), + new InvalidParameterException("The current user is not allowed to execute the operation.")); + + GCUBEScope gscope = ScopeManager.getScope(scope); + + /********************************************************** + * GHN + *********************************************************/ + + // SHUTDOWN + if (opCode.equals(SupportedOperations.GHN_SHUTDOWN)) { + for (ResourceDescriptor resource : resources) { + checker.validate( + resource.getType().equals(AllowedResourceTypes.GHN.name()), + new InvalidParameterException("Invalid type. GHN required")); + new GHNManager(resource.getID(), resource.getName()).shutDown(gscope, false, false); + } + } + + // RESTART + if (opCode.equals(SupportedOperations.GHN_RESTART) || opCode.equals(SupportedOperations.GHN_CLEAN_RESTART)) { + for (ResourceDescriptor resource : resources) { + checker.validate( + resource.getType().equals(AllowedResourceTypes.GHN.name()), + new InvalidParameterException("Invalid type. GHN required")); + new GHNManager(resource.getID(), resource.getName()).shutDown(gscope, + // restart + true, + // to clean? + (opCode.equals(SupportedOperations.GHN_CLEAN_RESTART) ? true : false)); + } + } + + // DELETE + if (opCode.equals(SupportedOperations.GHN_DELETE)) { + for (ResourceDescriptor resource : resources) { + checker.validate( + resource.getType().equals(AllowedResourceTypes.GHN.name()), + new InvalidParameterException("Invalid type. GHN required")); + new GHNManager(resource.getID()).delete(gscope); + } + } + + // DELETE + if (opCode.equals(SupportedOperations.GHN_FORCE_DELETE)) { + for (ResourceDescriptor resource : resources) { + checker.validate( + resource.getType().equals(AllowedResourceTypes.GHN.name()), + new InvalidParameterException("Invalid type. GHN required")); + new GHNManager(resource.getID()).forceDelete(gscope); + } + } + + + /********************************************************** + * GENERIC RESOURCE + *********************************************************/ + // DELETE + if (opCode.equals(SupportedOperations.GENERIC_RESOURCE_DELETE)) { + for (ResourceDescriptor resource : resources) { + checker.validate( + resource.getType().equals(AllowedResourceTypes.GenericResource.name()), + new InvalidParameterException("Invalid type. " + AllowedResourceTypes.GenericResource.name() + " required")); + new GenericResourceManager(resource.getID()).delete(gscope); + } + } + // DELETE + if (opCode.equals(SupportedOperations.GENERIC_RESOURCE_FORCE_DELETE)) { + for (ResourceDescriptor resource : resources) { + checker.validate( + resource.getType().equals(AllowedResourceTypes.GenericResource.name()), + new InvalidParameterException("Invalid type. " + AllowedResourceTypes.GenericResource.name() + " required")); + new GenericResourceManager(resource.getID()).forceDelete(gscope); + } + } + + /********************************************************** + * RUNTIME RESOURCE + *********************************************************/ + // DELETE + if (opCode.equals(SupportedOperations.RUNTIME_RESOURCE_DELETE)) { + System.out.println("DELETING RUNTIME RESOURCE"); + for (ResourceDescriptor resource : resources) { + checker.validate( + resource.getType().equals(AllowedResourceTypes.RuntimeResource.name()), + new InvalidParameterException("Invalid type. " + AllowedResourceTypes.RuntimeResource.name() + " required")); + new RuntimeResourceManager(resource.getID()).delete(gscope); + } + } + // DELETE + if (opCode.equals(SupportedOperations.RUNTIME_RESOURCE_FORCE_DELETE)) { + for (ResourceDescriptor resource : resources) { + checker.validate( + resource.getType().equals(AllowedResourceTypes.RuntimeResource.name()), + new InvalidParameterException("Invalid type. " + AllowedResourceTypes.RuntimeResource.name() + " required")); + new RuntimeResourceManager(resource.getID()).forceDelete(gscope); + } + } + + /********************************************************** + * COLLECTION + *********************************************************/ + // DELETE + if (opCode.equals(SupportedOperations.COLLECTION_DELETE)) { + for (ResourceDescriptor resource : resources) { + checker.validate( + resource.getType().equals(AllowedResourceTypes.Collection.name()), + new InvalidParameterException("Invalid type. " + AllowedResourceTypes.Collection.name() + " required")); + new CollectionManager(resource.getID()).delete(gscope); + } + } + // DELETE + if (opCode.equals(SupportedOperations.COLLECTION_FORCE_DELETE)) { + for (ResourceDescriptor resource : resources) { + checker.validate( + resource.getType().equals(AllowedResourceTypes.Collection.name()), + new InvalidParameterException("Invalid type. " + AllowedResourceTypes.Collection.name() + " required")); + new CollectionManager(resource.getID()).forceDelete(gscope); + } + } + + /********************************************************** + * VIEW + *********************************************************/ + // DELETE + if (opCode.equals(SupportedOperations.VIEW_DELETE)) { + for (ResourceDescriptor resource : resources) { + checker.validate( + resource.getType().equals(AllowedResourceTypes.VIEW.name()), + new InvalidParameterException("Invalid type. " + AllowedResourceTypes.VIEW.name() + " required")); + new ViewManager(resource.getID()).delete(gscope); + } + } + // DELETE + if (opCode.equals(SupportedOperations.VIEW_FORCE_DELETE)) { + for (ResourceDescriptor resource : resources) { + checker.validate( + resource.getType().equals(AllowedResourceTypes.VIEW.name()), + new InvalidParameterException("Invalid type. " + AllowedResourceTypes.VIEW.name() + " required")); + new ViewManager(resource.getID()).forceDelete(gscope); + } + } + + /********************************************************** + * RUNNING INSTANCE + *********************************************************/ + if (opCode.equals(SupportedOperations.RUNNING_INSTANCE_UNDEPLOY)) { + for (ResourceDescriptor resource : resources) { + ServerConsole.debug(LOG_PREFIX, "Undeploying RI: " + resource.getID()); + // FIXME per massi: togli questi commenti per abilitare undeploy + // new RunningInstanceManager(resource.getID()).undeploy(gscope); + } + } + } +} diff --git a/src/main/java/org/gcube/portlets/admin/resourcemanagement/server/ServiceProxyImpl.java b/src/main/java/org/gcube/portlets/admin/resourcemanagement/server/ServiceProxyImpl.java new file mode 100644 index 0000000..d9bc871 --- /dev/null +++ b/src/main/java/org/gcube/portlets/admin/resourcemanagement/server/ServiceProxyImpl.java @@ -0,0 +1,507 @@ +/**************************************************************************** + * This software is part of the gCube Project. + * Site: http://www.gcube-system.org/ + **************************************************************************** + * The gCube/gCore software is licensed as Free Open Source software + * conveying to the EUPL (http://ec.europa.eu/idabc/eupl). + * The software and documentation is provided by its authors/distributors + * "as is" and no expressed or + * implied warranty is given for its use, quality or fitness for a + * particular case. + **************************************************************************** + * Filename: ServiceProxyImpl.java + **************************************************************************** + * @author Daniele Strollo + ***************************************************************************/ + +package org.gcube.portlets.admin.resourcemanagement.server; + +import java.io.File; +import java.security.InvalidParameterException; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Vector; + +import javax.servlet.http.HttpSession; + +import org.gcube.common.core.contexts.GHNContext; +import org.gcube.common.core.informationsystem.client.ISClient; +import org.gcube.common.core.informationsystem.client.QueryParameter; +import org.gcube.common.core.informationsystem.client.XMLResult; +import org.gcube.common.core.informationsystem.client.queries.GCUBEGenericQuery; +import org.gcube.common.core.scope.GCUBEScope; +import org.gcube.portlets.admin.resourcemanagement.client.remote.ServiceProxy; +import org.gcube.portlets.admin.resourcemanagement.server.gcube.services.StatusHandler; +import org.gcube.portlets.admin.resourcemanagement.server.gcube.services.configuration.ConfigurationLoader; +import org.gcube.portlets.admin.resourcemanagement.shared.exceptions.InvalidPermissionsException; +import org.gcube.resourcemanagement.support.client.utils.CurrentStatus; +import org.gcube.resourcemanagement.support.client.views.ResourceTypeDecorator; +import org.gcube.resourcemanagement.support.server.gcube.CacheManager; +import org.gcube.resourcemanagement.support.server.gcube.ISClientRequester; +import org.gcube.resourcemanagement.support.server.gcube.queries.QueryLoader; +import org.gcube.resourcemanagement.support.server.gcube.queries.QueryLocation; +import org.gcube.resourcemanagement.support.server.managers.resources.GenericResourceManager; +import org.gcube.resourcemanagement.support.server.managers.resources.ManagementUtils; +import org.gcube.resourcemanagement.support.server.managers.resources.ResourceFactory; +import org.gcube.resourcemanagement.support.server.managers.scope.ScopeManager; +import org.gcube.resourcemanagement.support.server.types.AllowedResourceTypes; +import org.gcube.resourcemanagement.support.server.utils.ServerConsole; +import org.gcube.resourcemanagement.support.shared.operations.SupportedOperations; +import org.gcube.resourcemanagement.support.shared.plugins.GenericResourcePlugin; +import org.gcube.resourcemanagement.support.shared.plugins.TMPluginFormField; +import org.gcube.resourcemanagement.support.shared.types.Tuple; +import org.gcube.resourcemanagement.support.shared.types.UserGroup; +import org.gcube.resourcemanagement.support.shared.types.datamodel.CompleteResourceProfile; +import org.gcube.resourcemanagement.support.shared.types.datamodel.ResourceDescriptor; +import org.gcube.resourcemanagement.support.shared.util.Assertion; +import org.gcube.vremanagement.resourcemanager.stubs.reporting.ReportingPortType; + +import com.google.gwt.core.client.GWT; +import com.google.gwt.user.server.rpc.RemoteServiceServlet; + +/** + * @author Daniele Strollo + * @author Massimiliano Assante (ISTI-CNR) + * + * + */ +@SuppressWarnings("serial") +public class ServiceProxyImpl extends RemoteServiceServlet implements ServiceProxy { + private static final String LOG_PREFIX = "[SERVICE-IMPL]"; + + public final void emptyCache() { + ISClientRequester.emptyCache(); + } + + public final void setUseCache(final boolean flag) { + this.getCurrentStatus().setUseCache(flag); + } + + public final void setSuperUser(final boolean superUser) { + if (superUser && this.getCurrentStatus().getCredentials() == UserGroup.DEBUG) { + this.getCurrentStatus().setCredentials(UserGroup.ADMIN); + } else { + this.getCurrentStatus().setCredentials(UserGroup.DEBUG); + } + initScopes(true); + } + + /** + * Called by portlet at module instantiation + */ + public final CurrentStatus initStatus() { + ServerConsole.trace(LOG_PREFIX, "[INIT-STATUS] initializing config parameters"); + + ServerConsole.info(LOG_PREFIX, "Clearing status"); + StatusHandler.clearStatus(getHttpSession()); + + ConfigurationLoader.setConfigurationFile(getPropertiesFSPath() + File.separator + "resourcemanagement.properties"); + return this.getCurrentStatus(); + } + + private HttpSession getHttpSession() { + return this.getThreadLocalRequest().getSession(); + } + + public final void initScopes(final boolean doClean) { + ServerConsole.trace(LOG_PREFIX, "[INIT-SCOPES] initializing scopes from: " + this.getScopeDataPath()); + + // Updates the scopes + try { + ScopeManager.setScopeConfigFile(this.getScopeDataPath()); + if (doClean) { + ScopeManager.clear(); + } + ScopeManager.update(); + } catch (Exception e) { + ServerConsole.error(LOG_PREFIX, "During scope caching", e); + } + + } + + private String getServletFSPath() { + return this.getServletContext().getRealPath("") + File.separator + "WEB-INF"; + } + + private String getPropertiesFSPath() { + return this.getServletContext().getRealPath("") + File.separator + "conf"; + } + + private String getScopeDataPath() { + String startDirectory = getServletFSPath(); + return startDirectory + File.separator + "xml" + File.separator + + ((this.getCurrentStatus().getCredentials() == UserGroup.ADMIN) ? + "scopedata_admin.xml" : + "scopedata.xml"); + } + + private String getRepositoryUpdgradeDirPath() { + String startDirectory = getServletFSPath(); + return startDirectory + File.separator + "reports"; + } + + private String getXML2HTMLMapping() { + String startDirectory = getServletFSPath(); + return startDirectory + File.separator + "xml" + File.separator + "xmlverbatim.xsl"; + } + + + public final Tuple addResourcesToScope( + final String resType, + final List resourceIDs, + final String scope) + throws Exception { + Assertion checker = new Assertion(); + + CurrentStatus status = this.getCurrentStatus(); + + checker.validate(SupportedOperations.ADD_TO_SCOPE.isAllowed(status.getCredentials()), + new Exception("User not allowed to request this operation")); + checker.validate(resType != null && resType.trim().length() > 0, new Exception("Invalid parameter type")); + checker.validate(resourceIDs != null && resourceIDs.size() > 0, new Exception("Invalid parameter type")); + checker.validate(scope != null && scope.trim().length() > 0, new Exception("Invalid parameter type")); + + AllowedResourceTypes type = AllowedResourceTypes.valueOf(resType); + GCUBEScope targetScope = ScopeManager.getScope(scope); + GCUBEScope sourceScope = ScopeManager.getScope(status.getCurrentScope()); + + String reportID = ManagementUtils.addToExistingScope(type, + resourceIDs.toArray(new String[]{}), + sourceScope, + targetScope); + + ReportingPortType manager = + ResourceFactory.createResourceManager(type).getReportResourceManager(targetScope); + + String xmlReport = manager.getReport(reportID); + String mappingPath = this.getXML2HTMLMapping(); + String htmlReport = ISClientRequester.XML2HTML(xmlReport, mappingPath); + return new Tuple( + reportID, + resType, + xmlReport, + htmlReport); + } + /** + * REMOVE FROM SCOPE + */ + public final Tuple removeResourcesFromScope( + final String resType, + final List resourceIDs, + final String scope) + throws Exception { + Assertion checker = new Assertion(); + + CurrentStatus status = this.getCurrentStatus(); + + checker.validate(SupportedOperations.ADD_TO_SCOPE.isAllowed(status.getCredentials()), + new Exception("User not allowed to request this operation")); + checker.validate(resType != null && resType.trim().length() > 0, new Exception("Invalid parameter type")); + checker.validate(resourceIDs != null && resourceIDs.size() > 0, new Exception("Invalid parameter type")); + checker.validate(scope != null && scope.trim().length() > 0, new Exception("Invalid parameter type")); + + AllowedResourceTypes type = AllowedResourceTypes.valueOf(resType); + GCUBEScope targetScope = ScopeManager.getScope(scope); + GCUBEScope sourceScope = ScopeManager.getScope(status.getCurrentScope()); + + return new Tuple(ManagementUtils.removeFromExistingScope(type, + resourceIDs.toArray(new String[]{}), + sourceScope, + targetScope)); + } + + public final String deploy(final List ghnsID, final List servicesID) throws Exception { + try { + GCUBEScope sourceScope = ScopeManager.getScope(this.getCurrentStatus().getCurrentScope()); + String[] param1 = ghnsID.toArray(new String[0]); + String[] param2 = servicesID.toArray(new String[0]); + return ManagementUtils.deploy(sourceScope, param1, param2); + } catch (Exception e) { + ServerConsole.error(LOG_PREFIX, "During service deployment", e); + throw new Exception(e.getMessage()); + } + } + + public final Tuple checkDeployStatus(final String scope, final String deployID) throws Exception { + if (SupportedOperations.SERVICE_GET_REPORT.isAllowed(this.getCurrentStatus().getCredentials())) { + GCUBEScope sourceScope = ScopeManager.getScope(scope); + ReportingPortType manager = + ResourceFactory.createResourceManager(AllowedResourceTypes.Service).getReportResourceManager(sourceScope); + String xmlReport = manager.getReport(deployID); + String mappingPath = this.getXML2HTMLMapping(); + String htmlReport = ISClientRequester.XML2HTML(xmlReport, mappingPath); + return new Tuple(deployID, xmlReport, htmlReport); + } else { + throw new Exception("The current user is not allowed to request the operation"); + } + } + + public final List getAvailableScopes() { + ServerConsole.trace(LOG_PREFIX, "[GET-SCOPES] getting available scopes"); + GWT.log("The CONTEXT PATH is: " + this.getScopeDataPath()); + Vector retval = new Vector(); + + try { + Map scopes = ScopeManager.getAvailableScopes(); + for (GCUBEScope scope : scopes.values()) { + //if ((scope.getType().compareTo(Type.INFRASTRUCTURE) == 0) + // || (scope.getType().compareTo(Type.VO) == 0)) { + retval.add(scope.toString()); + //} + } + return retval; + } catch (Exception e) { + retval.add("/gcube"); + retval.add("/gcube/devsec"); + } + return retval; + } + + public final List getAvailableAddScopes() { + List retval = new Vector(); + try { + GCUBEScope currScope = ScopeManager.getScope(this.getCurrentStatus().getCurrentScope()); + List scopes = this.getAvailableScopes(); + for (String scope : scopes) { + GCUBEScope trgScope = ScopeManager.getScope(scope); + if (trgScope.isEnclosedIn(currScope)) { + retval.add(trgScope.toString()); + } + } + return retval; + } catch (Exception e) { + ServerConsole.error(LOG_PREFIX, e); + } + return null; + } + + public final HashMap> getResourceTypeTree(final String scope) throws Exception { + try { + GCUBEScope gscope = ScopeManager.getScope(scope); + HashMap> results = ISClientRequester.getResourcesTree(getCacheManager(this.getCurrentStatus()), gscope); + return results; + } catch (Exception e) { + ServerConsole.error(LOG_PREFIX, "applying resource get", e); + throw e; + } + } + + public final List getRelatedResources(final String type, final String id, final String scope) + { + try { + return ISClientRequester.getRelatedResources( + getCacheManager(this.getCurrentStatus()), + type, + id, + ScopeManager.getScope(scope) + ); + } catch (Exception e) { + ServerConsole.error(LOG_PREFIX, e); + return null; + } + } + + public final List getResourcesByType(final String scope, final String type) + { + try { + return ISClientRequester.getResourcesByType( + getCacheManager(this.getCurrentStatus()), + ScopeManager.getScope(scope), type, null); + } catch (Exception e) { + ServerConsole.error(LOG_PREFIX, e); + return null; + } + } + + public final ResourceDescriptor getGenericResourceDescriptor(final String scope, final String resID) + throws Exception { + return this.getDescriptor(ScopeManager.getScope(scope), resID); + } + + private ResourceDescriptor getDescriptor(final GCUBEScope scope, final String resID) + throws Exception { + ISClient client = GHNContext.getImplementation(ISClient.class); + GCUBEGenericQuery isQuery = null; + isQuery = client.getQuery(GCUBEGenericQuery.class); + + isQuery.setExpression(QueryLoader.getQuery(QueryLocation.GET_RESOURCE_BYID)); + isQuery.addParameters( + new QueryParameter("RES_ID", resID), + new QueryParameter("RES_TYPE", ResourceTypeDecorator.GenericResource.name()) + ); + + List results = client.execute(isQuery, scope); + + if (results != null && results.size() > 0) { + ResourceDescriptor retval = new ResourceDescriptor(); + XMLResult node = results.get(0); + + List currValue = null; + + currValue = node.evaluate("/Resource/ID/text()"); + if (currValue != null && currValue.size() > 0) { + retval.setID(currValue.get(0)); + } + currValue = node.evaluate("/Resource/Profile/Name/text()"); + if (currValue != null && currValue.size() > 0) { + retval.setName(currValue.get(0)); + } + + currValue = node.evaluate("/Resource/Profile/Body/node()"); + if (currValue != null && currValue.size() > 0) { + StringBuilder bodytext = new StringBuilder(); + for (String line : currValue) { + bodytext.append(line); + } + retval.set("Body", bodytext.toString().trim()); + } else { + retval.set("Body", ""); + } + + + currValue = node.evaluate("/Resource/Profile/Description/text()"); + if (currValue != null && currValue.size() > 0) { + retval.set("Description", currValue.get(0)); + } else { + retval.set("Description", ""); + } + + + currValue = node.evaluate("/Resource/Profile/SecondaryType/text()"); + if (currValue != null && currValue.size() > 0) { + retval.set("SecondaryType", currValue.get(0)); + } else { + retval.set("SecondaryType", ""); + } + + return retval; + } + return null; + } + + public final List getResourcesModel(final String scope, final String type, final String subType, final List> additionalMaps) + throws Exception { + if (scope == null || type == null) { + return null; + } + return ISClientRequester.getResourceModels(ScopeManager.getScope(scope), type, subType, additionalMaps); + } + + + public final List getWSResources(final String scope) { + try { + return ISClientRequester.getWSResources(ScopeManager.getScope(scope)); + } catch (Exception e) { + ServerConsole.error(LOG_PREFIX, e); + return null; + } + } + + public final List getResourcesBySubType(final String scope, final String type, final String subtype) { + try { + return ISClientRequester.getResourcesByType( + getCacheManager(this.getCurrentStatus()), + ScopeManager.getScope(scope), type, subtype); + } catch (Exception e) { + ServerConsole.error(LOG_PREFIX, e); + return null; + } + } + + public final CompleteResourceProfile getResourceByID(final String scope, final String type, final String resID) { + try { + CompleteResourceProfile profile = ISClientRequester.getResourceByID( + this.getXML2HTMLMapping(), + ScopeManager.getScope(scope), + type, + resID); + return profile; + } catch (Exception e) { + ServerConsole.error(LOG_PREFIX, e); + return null; + } + } + + public final String createGenericResource( + final String ID, + final String name, + final String description, + final String body, + final String subType) + throws Exception { + // Check permissions + Assertion checker = new Assertion(); + checker.validate( + SupportedOperations.GENERIC_RESOURCE_CREATE.isAllowed(this.getCurrentStatus().getCredentials()), + new InvalidPermissionsException("The user is not allowed to execute the following operation")); + + return GenericResourceManager.create( + ID, + ScopeManager.getScope(this.getCurrentStatus().getCurrentScope()), + name, + description, + body, + subType); + } + + public final void updateGenericResource( + final String ID, + final String name, + final String description, + final String body, + final String subType) + throws Exception { + // Check permissions + Assertion checker = new Assertion(); + checker.validate( + SupportedOperations.GENERIC_RESOURCE_EDIT.isAllowed(this.getCurrentStatus().getCredentials()), + new InvalidPermissionsException("The user is not allowed to execute the following operation")); + + GCUBEScope sourceScope = ScopeManager.getScope(this.getCurrentStatus().getCurrentScope()); + GenericResourceManager resource = new GenericResourceManager(ID); + resource.update(name, description, body, subType, sourceScope); + } + + public final void setCurrentScope(final String scope) { + this.getCurrentStatus().setCurrentScope(scope); + } + + public final Map getGenericResourcePlugins() throws Exception { + return ISClientRequester.getGenericResourcePlugins(ScopeManager.getScope(this.getCurrentStatus().getCurrentScope())); + } + + + public final HashMap> getGenericResourceTreeMagnagerPlugins() throws Exception { + return ISClientRequester.getGenericResourceTreeManagerPlugins(ScopeManager.getScope(this.getCurrentStatus().getCurrentScope())); + } + + private CurrentStatus getCurrentStatus() { + return StatusHandler.getStatus(this.getHttpSession()); + } + + private CacheManager getCacheManager(CurrentStatus status) { + CacheManager cm = new CacheManager(); + cm.setUseCache(status.useCache()); + return cm; + } + /*********************************************************** + * RESOURCE OPERATIONS + * @throws InvalidParameterException + **********************************************************/ + public final void doOperation( + final SupportedOperations opCode, + final String scope, + final List resources) + throws Exception { + try { + ResourceCommands.doOperation( + this.getCurrentStatus(), + opCode, scope, resources); + } catch (final Exception e) { + ServerConsole.error(LOG_PREFIX, e); + throw new Exception(e.getMessage()); + } + } +} diff --git a/src/main/java/org/gcube/portlets/admin/resourcemanagement/server/gcube/services/MailSender.java b/src/main/java/org/gcube/portlets/admin/resourcemanagement/server/gcube/services/MailSender.java new file mode 100644 index 0000000..e4c3ee4 --- /dev/null +++ b/src/main/java/org/gcube/portlets/admin/resourcemanagement/server/gcube/services/MailSender.java @@ -0,0 +1,165 @@ +/**************************************************************************** + * This software is part of the gCube Project. + * Site: http://www.gcube-system.org/ + **************************************************************************** + * The gCube/gCore software is licensed as Free Open Source software + * conveying to the EUPL (http://ec.europa.eu/idabc/eupl). + * The software and documentation is provided by its authors/distributors + * "as is" and no expressed or + * implied warranty is given for its use, quality or fitness for a + * particular case. + **************************************************************************** + * Filename: MailSender.java + **************************************************************************** + * @author Daniele Strollo + ***************************************************************************/ + +package org.gcube.portlets.admin.resourcemanagement.server.gcube.services; + +import java.io.File; +import java.util.Date; +import java.util.List; +import java.util.Properties; +import java.util.StringTokenizer; +import java.util.Vector; + +import javax.activation.DataHandler; +import javax.activation.FileDataSource; +import javax.mail.Authenticator; +import javax.mail.Message; +import javax.mail.MessagingException; +import javax.mail.Multipart; +import javax.mail.NoSuchProviderException; +import javax.mail.PasswordAuthentication; +import javax.mail.Session; +import javax.mail.Transport; +import javax.mail.internet.AddressException; +import javax.mail.internet.InternetAddress; +import javax.mail.internet.MimeBodyPart; +import javax.mail.internet.MimeMessage; +import javax.mail.internet.MimeMultipart; + +import org.gcube.resourcemanagement.support.server.utils.ServerConsole; + +/** + * @author Daniele Strollo (ISTI-CNR) + * + */ +public class MailSender { + private static final String LOG_PREFIX = "[RPM-SENDMAIL]"; + + /** + * Given a list of addresses in the form addr1;addr2... + * builds the list of InternetAddress to use to send mail. + * @param toParse a string of email addresses of the form addr1;addr2... + * @return the array of converted valid email addresses + */ + private static InternetAddress[] buildAddress(final String toParse) { + if (toParse == null || toParse.trim().length() == 0) { + return null; + } + + List toReturn = new Vector(); + StringTokenizer parser = new StringTokenizer(toParse, ";"); + while (parser.hasMoreTokens()) { + try { + toReturn.add(new InternetAddress(parser.nextToken())); + } catch (AddressException e) { + ServerConsole.error(LOG_PREFIX, e); + } + } + return toReturn.toArray(new InternetAddress[]{}); + } + + public static void sendMail( + final String sender, + final String target, + final String cc, + final String subject, + final String bodyText, + final String[] attachments) throws Exception { + + if ((target == null || target.trim().length() == 0) + && (cc == null || cc.trim().length() == 0)) { + ServerConsole.warn(LOG_PREFIX, "No valid mail recipients specified."); + return; + } + + Properties properties = new Properties(); + properties.setProperty("mail.transport.protocol", "smtp"); + properties.put("mail.host", "smtp.isti.cnr.it"); + properties.put("mail.port", "587"); + properties.put("mail.auth", "true"); + properties.put("mail.smtps.auth", "true"); + properties.put("mail.smtp.auth", "true"); + + Session session = Session.getDefaultInstance(properties, + new Authenticator() { + public PasswordAuthentication getPasswordAuthentication() { + return new PasswordAuthentication("smtp-user", "UiBe7chae7eh"); + } + }); + Transport transport = null; + try { + transport = session.getTransport(); + } catch (NoSuchProviderException e) { + throw e; + } + + try { + MimeMessage message = new MimeMessage(session); + message.setFrom(new InternetAddress(sender)); + + // MAIL - TO + InternetAddress[] addressTo = MailSender.buildAddress(target); + if (addressTo != null) { + message.setRecipients(Message.RecipientType.TO, addressTo); + } + + // MAIL - CC + InternetAddress[] addressCC = MailSender.buildAddress(cc); + if (addressCC != null) { + message.setRecipients(Message.RecipientType.CC, addressCC); + } + + message.setSubject(subject); + message.setSentDate(new Date()); + + // + // Set the email message text. + // + MimeBodyPart messagePart = new MimeBodyPart(); + messagePart.setText(bodyText); + + // + // Set the email attachment file + // + + Multipart multipart = new MimeMultipart(); + multipart.addBodyPart(messagePart); + + for (String filename : attachments) { + MimeBodyPart attachmentPart = new MimeBodyPart(); + FileDataSource fileDataSource = new FileDataSource(filename) { + @Override + public String getContentType() { + return "application/octet-stream"; + } + }; + attachmentPart.setDataHandler(new DataHandler(fileDataSource)); + attachmentPart.setFileName(new File(filename).getName()); + multipart.addBodyPart(attachmentPart); + } + + message.setContent(multipart); + + transport.connect(); + // FIXME waiting new mail implementation (skipping liferay mail.jar) with CC support. + transport.sendMessage(message, + message.getRecipients(Message.RecipientType.TO)); + transport.close(); + } catch (MessagingException e) { + e.printStackTrace(); + } + } +} diff --git a/src/main/java/org/gcube/portlets/admin/resourcemanagement/server/gcube/services/StatusHandler.java b/src/main/java/org/gcube/portlets/admin/resourcemanagement/server/gcube/services/StatusHandler.java new file mode 100644 index 0000000..8153e15 --- /dev/null +++ b/src/main/java/org/gcube/portlets/admin/resourcemanagement/server/gcube/services/StatusHandler.java @@ -0,0 +1,164 @@ +/**************************************************************************** + * This software is part of the gCube Project. + * Site: http://www.gcube-system.org/ + **************************************************************************** + * The gCube/gCore software is licensed as Free Open Source software + * conveying to the EUPL (http://ec.europa.eu/idabc/eupl). + * The software and documentation is provided by its authors/distributors + * "as is" and no expressed or + * implied warranty is given for its use, quality or fitness for a + * particular case. + **************************************************************************** + * Filename: StatusHandler.java + **************************************************************************** + * @author Daniele Strollo + ***************************************************************************/ + +package org.gcube.portlets.admin.resourcemanagement.server.gcube.services; + +import java.util.List; + +import javax.servlet.http.HttpSession; + +import org.gcube.application.framework.core.session.ASLSession; +import org.gcube.application.framework.core.session.SessionManager; +import org.gcube.portal.custom.scopemanager.scopehelper.ScopeHelper; +import org.gcube.portlets.admin.resourcemanagement.server.gcube.services.configuration.ConfigurationLoader; +import org.gcube.resourcemanagement.support.client.utils.CurrentStatus; +import org.gcube.resourcemanagement.support.server.utils.ServerConsole; +import org.gcube.resourcemanagement.support.shared.types.RunningMode; +import org.gcube.resourcemanagement.support.shared.types.UserGroup; +import org.gcube.vomanagement.usermanagement.RoleManager; +import org.gcube.vomanagement.usermanagement.UserManager; +import org.gcube.vomanagement.usermanagement.impl.liferay.LiferayRoleManager; +import org.gcube.vomanagement.usermanagement.impl.liferay.LiferayUserManager; +import org.gcube.vomanagement.usermanagement.model.RoleModel; +import org.gcube.vomanagement.usermanagement.model.UserModel; + +/** + * @author Daniele Strollo (ISTI-CNR) + * + */ +public class StatusHandler { + private static final String STATUS_KEY = "current_status"; + public static final String USER_EMAIL_KEY = "theusermail"; + private static final String LOG_PREFIX = "[StatusHandler]"; + private static final String ADMIN_ROLE = "VO-Admin"; + + public static final void setStatus(final HttpSession session, final CurrentStatus status) { + session.setAttribute(STATUS_KEY, status); + } + + public static final void clearStatus(final HttpSession session) { + if (session != null && session.getAttribute(STATUS_KEY) != null) { + session.removeAttribute(STATUS_KEY); + } + } + + /** + * Initializes the status if running in portal mode otherwise returns null. + * @param session + * @return + */ + private static CurrentStatus initStatus(final HttpSession session) { + if (session == null || session.getAttribute(ScopeHelper.USERNAME_ATTRIBUTE) == null) { + return null; + } + + String username = session.getAttribute(ScopeHelper.USERNAME_ATTRIBUTE).toString(); + + // inside portal + if (username != null) { + ServerConsole.info(LOG_PREFIX, "Running inside portal... [OK]"); + CurrentStatus status = new CurrentStatus(); + status.setCurrentUser(username); + status.setCredentials(UserGroup.USER); + status.setRunningMode(RunningMode.PORTAL); + ASLSession aslSession = SessionManager.getInstance().getASLSession(session.getId(), username); + ServerConsole.error(LOG_PREFIX, "The portal scope is [" + aslSession.getScopeName() + "]"); + + status.setCurrentScope(aslSession.getScopeName()); + + aslSession.getGroupId(); + RoleManager rman = new LiferayRoleManager(); + UserManager uman = new LiferayUserManager(); + + + try { + List roles = null; + + // Gets the user email. If not provided the default one will be used. + // The mail will be store inside the session. + UserModel umodel = uman.getUserByScreenName(username); + session.setAttribute(USER_EMAIL_KEY, umodel.getEmail()); + + roles = rman.listRolesByUserAndGroup( + String.valueOf(aslSession.getGroupId()), + uman.getUserByScreenName(username).getUserId()); + for (RoleModel role : roles) { + if (role.getRoleName().equals(ADMIN_ROLE)) { + status.setCredentials(UserGroup.ADMIN); + } + } + } catch (Exception e) { + ServerConsole.error(LOG_PREFIX, e); + } + return status; + } + // not running in a portal + return null; + } + + public static final CurrentStatus getStatus(final HttpSession session) { + // CREATING THE STATUS + // Status initialization + if (session.getAttribute(STATUS_KEY) == null) { + CurrentStatus status = initStatus(session); + + // Not in portal mode + if (status == null) { + ServerConsole.info(LOG_PREFIX, "Running outside portal... [OK]"); + status = new CurrentStatus(); + + // LOADS THE DEFAULTS + try { + String runningMode = ConfigurationLoader.getProperty("RUNNING_MODE"); + status.setRunningMode(RunningMode.valueOf(runningMode)); + ServerConsole.debug(LOG_PREFIX, "Setting RUNNING_MODE to: " + status.getRunningMode()); + } catch (Exception e) { + ServerConsole.error(LOG_PREFIX, "Loading defaults", e); + } + try { + String credentials = ConfigurationLoader.getProperty("USER_CREDENTIALS"); + status.setCredentials(UserGroup.valueOf(credentials)); + ServerConsole.debug(LOG_PREFIX, "Setting USER_CREDENTIALS to: " + status.getCredentials()); + } catch (Exception e) { + ServerConsole.error(LOG_PREFIX, "Loading defaults", e); + } + try { + status.setCurrentUser(ConfigurationLoader.getProperty("DEFAULT_USER")); + ServerConsole.debug(LOG_PREFIX, "Setting DEFAULT_USER to: " + status.getCurrentUser()); + } catch (Exception e) { + ServerConsole.error(LOG_PREFIX, "Loading defaults", e); + } + try { + status.setCurrentScope(ConfigurationLoader.getProperty("DEFAULT_SCOPE")); + ServerConsole.debug(LOG_PREFIX, "Setting DEFAULT_SCOPE to: " + status.getCurrentScope()); + } catch (Exception e) { + ServerConsole.error(LOG_PREFIX, "Loading defaults", e); + } + try { + if (ConfigurationLoader.getProperty("LIST_GHN_STARTUP").equalsIgnoreCase("NO")) + status.setLoadGHNatStartup(false); + ServerConsole.debug(LOG_PREFIX, "*********************\n\n\nSetting LIST_GHN_STARTUP to: " + status.isLoadGHNatStartup()); + } catch (Exception e) { + ServerConsole.error(LOG_PREFIX, "Loading defaults", e); + } + } + session.setAttribute(STATUS_KEY, status); + return status; + } else { + return (CurrentStatus) session.getAttribute(STATUS_KEY); + } + } +} diff --git a/src/main/java/org/gcube/portlets/admin/resourcemanagement/server/gcube/services/configuration/ConfigurationLoader.java b/src/main/java/org/gcube/portlets/admin/resourcemanagement/server/gcube/services/configuration/ConfigurationLoader.java new file mode 100644 index 0000000..f899294 --- /dev/null +++ b/src/main/java/org/gcube/portlets/admin/resourcemanagement/server/gcube/services/configuration/ConfigurationLoader.java @@ -0,0 +1,111 @@ +/**************************************************************************** + * This software is part of the gCube Project. + * Site: http://www.gcube-system.org/ + **************************************************************************** + * The gCube/gCore software is licensed as Free Open Source software + * conveying to the EUPL (http://ec.europa.eu/idabc/eupl). + * The software and documentation is provided by its authors/distributors + * "as is" and no expressed or + * implied warranty is given for its use, quality or fitness for a + * particular case. + **************************************************************************** + * Filename: ConfigurationLoader.java + **************************************************************************** + * @author Daniele Strollo + ***************************************************************************/ + +package org.gcube.portlets.admin.resourcemanagement.server.gcube.services.configuration; + +import java.io.FileInputStream; +import java.io.IOException; +import java.lang.reflect.Field; +import java.util.Properties; + +import org.gcube.resourcemanagement.support.server.utils.ServerConsole; + +/** + * @author Daniele Strollo (ISTI-CNR) + * + */ +public final class ConfigurationLoader { + private static final String DEFAULT_PATH = "war/conf/resourcemanagement.properties"; + private static final ConfigurationLoader singleton = new ConfigurationLoader(DEFAULT_PATH); + private static final String LOG_PREFIX = "[CONF_LOADER]"; + private Properties properties = null; + private ConfigurationLoader(final String confFile) { + if (this.properties == null) { + this.properties = this.load(confFile); + } + } + + public static void setConfigurationFile(final String filename) { + singleton.properties = singleton.load(filename); + } + + /** + * Load a properties file from the classpath + * + * @param propsName + * @return Properties + * @throws Exception + */ + private Properties load(final String propsName) { + ServerConsole.debug(LOG_PREFIX, "[CONF] loading configuration in file: " + propsName); + + FileInputStream fis = null; + Properties props = new Properties(); + try { + fis = new FileInputStream(propsName); + props.load(fis); + } catch (Exception e) { + ServerConsole.debug(LOG_PREFIX, "[CONF] cannot find configuration file: " + propsName + " Trying in standalone mode."); + try { + fis = new FileInputStream(DEFAULT_PATH); + } catch (Exception e1) { + ServerConsole.debug(LOG_PREFIX, "[CONF] cannot find local standalone configuration file"); + } + } finally { + try { + if (fis != null) { + fis.close(); + } + } catch (IOException e) { + } + } + return props; + } + + protected static ConfigurationLoader getInstance() { + return ConfigurationLoader.singleton; + } + + public static Properties getProperties() { + return getInstance().properties; + } + + public static String getProperty(final String key) throws Exception { + // Getting the default value + try { + Class c = Class.forName(DefaultConfiguration.class.getName()); + Field field = c.getField(key); + String defaultValue = field.get(null).toString(); + if (getInstance().properties == null) { + return defaultValue; + } + return getInstance().properties.getProperty( + key.trim(), + defaultValue); + } catch (Exception e) { + throw new RuntimeException(e); + } + } + + public static int getIntProperty(final String key) throws Exception { + return Integer.parseInt(getProperty(key)); + } + + public static boolean getBoolProperty(final String key) throws Exception { + return Boolean.parseBoolean(getProperty(key)); + } + +} diff --git a/src/main/java/org/gcube/portlets/admin/resourcemanagement/server/gcube/services/configuration/DefaultConfiguration.java b/src/main/java/org/gcube/portlets/admin/resourcemanagement/server/gcube/services/configuration/DefaultConfiguration.java new file mode 100644 index 0000000..615ce52 --- /dev/null +++ b/src/main/java/org/gcube/portlets/admin/resourcemanagement/server/gcube/services/configuration/DefaultConfiguration.java @@ -0,0 +1,62 @@ +/**************************************************************************** + * This software is part of the gCube Project. + * Site: http://www.gcube-system.org/ + **************************************************************************** + * The gCube/gCore software is licensed as Free Open Source software + * conveying to the EUPL (http://ec.europa.eu/idabc/eupl). + * The software and documentation is provided by its authors/distributors + * "as is" and no expressed or + * implied warranty is given for its use, quality or fitness for a + * particular case. + **************************************************************************** + * Filename: DefaultConfiguration.java + **************************************************************************** + * @author Daniele Strollo + ***************************************************************************/ + +package org.gcube.portlets.admin.resourcemanagement.server.gcube.services.configuration; + +/** + * @author Daniele Strollo (ISTI-CNR) + * + */ +public class DefaultConfiguration { + + /** + * The user and its credentials + * Possible values for credentials: + * [USER,ADMIN,DEBUG] + * USER_CREDENTIALS = DEBUG + * Defines the modality in which the portlet is running + * possible values [STANDALONE,PORTAL,NOTDEFINED] + */ + public static final String USER_CREDENTIALS = "USER"; + public static final String RUNNING_MODE = "STANDALONE"; + public static final String DEFAULT_USER = "daniele.strollo"; + + /** + * The scope that will be used as default + */ + public static final String DEFAULT_SCOPE = "/d4science.research-infrastructures.eu"; + + /* + * The target of update notification (if in singleton mode). + * Mails MUST be separated by ";" + */ + public static final String USERMAIL_TO = "daniele.strollo@gmail.com"; + // USERMAIL_CC = Not supported due to old implementation of mail in liferay + + + /***************************************** + * PROPERTIES FOR THE SWEEPER + *****************************************/ + /* + * The max number of minutes from last profile update to consider a GHN alive. + */ + public static final String LIVE_GHN_MAX_MINUTES = "40"; + + /* + * The max number of minutes from last profile update to consider a GHN alive. + */ + public static final String LIST_GHN_STARTUP = "YES"; +} diff --git a/src/main/java/org/gcube/portlets/admin/resourcemanagement/server/portlet/ResourceManagementPortlet.java b/src/main/java/org/gcube/portlets/admin/resourcemanagement/server/portlet/ResourceManagementPortlet.java new file mode 100644 index 0000000..94e5156 --- /dev/null +++ b/src/main/java/org/gcube/portlets/admin/resourcemanagement/server/portlet/ResourceManagementPortlet.java @@ -0,0 +1,43 @@ + +package org.gcube.portlets.admin.resourcemanagement.server.portlet; + +import javax.portlet.GenericPortlet; +import javax.portlet.ActionRequest; +import javax.portlet.RenderRequest; +import javax.portlet.ActionResponse; +import javax.portlet.RenderResponse; +import javax.portlet.PortletException; +import java.io.IOException; +import javax.portlet.PortletRequestDispatcher; +import org.gcube.portal.custom.scopemanager.scopehelper.ScopeHelper; + +/** + * ResourceManagementPortlet Portlet Class + * @author massi + */ +public class ResourceManagementPortlet extends GenericPortlet { + // private static final String LOG_PREFIX = "[ResourceManagementPortlet]"; + + public final void doView(final RenderRequest request, final RenderResponse response) + throws PortletException, IOException { + + response.setContentType("text/html"); + try { + ScopeHelper.setContext(request); // <-- Static method which sets the username in the session and the scope depending on the context automatically + } + catch (Exception e) { + System.out.println("Could not initialize portlet context"); + } + PortletRequestDispatcher dispatcher = + getPortletContext().getRequestDispatcher("/WEB-INF/jsp/ResourceManagementPortlet_view.jsp"); + dispatcher.include(request, response); + + } + + + public void processAction(final ActionRequest request, final ActionResponse response) + throws PortletException, IOException { + // nop - done by massi + } + +} diff --git a/src/main/java/org/gcube/portlets/admin/resourcemanagement/shared/Configuration.java b/src/main/java/org/gcube/portlets/admin/resourcemanagement/shared/Configuration.java new file mode 100644 index 0000000..bdfcc2c --- /dev/null +++ b/src/main/java/org/gcube/portlets/admin/resourcemanagement/shared/Configuration.java @@ -0,0 +1,39 @@ +/**************************************************************************** + * This software is part of the gCube Project. + * Site: http://www.gcube-system.org/ + **************************************************************************** + * The gCube/gCore software is licensed as Free Open Source software + * conveying to the EUPL (http://ec.europa.eu/idabc/eupl). + * The software and documentation is provided by its authors/distributors + * "as is" and no expressed or + * implied warranty is given for its use, quality or fitness for a + * particular case. + **************************************************************************** + * Filename: Configuration.java + **************************************************************************** + * @author Daniele Strollo + ***************************************************************************/ + +package org.gcube.portlets.admin.resourcemanagement.shared; + +/** + * The client side UI configuration. + * @author Daniele Strollo (ISTI-CNR) + */ +public class Configuration { + // Delay of popups in mills + public static final int popupDelay = 4000; + // Configuration parameters that can be changed through options + // menu. + public static boolean openProfileOnLoad = false; + public static boolean allowMultipleProfiles = false; + //public static String scopeFile = null; + + public static final String SUPER_USER_CODE = "gcube2010"; + /* + * Forces to use flash based charts also in portal mode. + * Due to conflicts in the portal with the flash based + * charts this functionality usually is avoided. + */ + public static final boolean DISABLE_FLASH = false; +} diff --git a/src/main/java/org/gcube/portlets/admin/resourcemanagement/shared/exceptions/InvalidPermissionsException.java b/src/main/java/org/gcube/portlets/admin/resourcemanagement/shared/exceptions/InvalidPermissionsException.java new file mode 100644 index 0000000..d1e04e2 --- /dev/null +++ b/src/main/java/org/gcube/portlets/admin/resourcemanagement/shared/exceptions/InvalidPermissionsException.java @@ -0,0 +1,44 @@ +/**************************************************************************** + * This software is part of the gCube Project. + * Site: http://www.gcube-system.org/ + **************************************************************************** + * The gCube/gCore software is licensed as Free Open Source software + * conveying to the EUPL (http://ec.europa.eu/idabc/eupl). + * The software and documentation is provided by its authors/distributors + * "as is" and no expressed or + * implied warranty is given for its use, quality or fitness for a + * particular case. + **************************************************************************** + * Filename: InvalidPermissionsException.java + **************************************************************************** + * @author Daniele Strollo + ***************************************************************************/ + +package org.gcube.portlets.admin.resourcemanagement.shared.exceptions; + +import com.google.gwt.user.client.rpc.IsSerializable; + +/** + * @author Daniele Strollo (ISTI-CNR) + * + */ +public class InvalidPermissionsException extends Exception implements IsSerializable { + private static final long serialVersionUID = 1L; + + public InvalidPermissionsException() { + super(); + } + + public InvalidPermissionsException(String message, Throwable cause) { + super(message, cause); + } + + public InvalidPermissionsException(String message) { + super(message); + } + + public InvalidPermissionsException(Throwable cause) { + super(cause); + } + +} diff --git a/src/main/java/org/gcube/portlets/admin/resourcemanagement/shared/exceptions/WidgetNotRegistered.java b/src/main/java/org/gcube/portlets/admin/resourcemanagement/shared/exceptions/WidgetNotRegistered.java new file mode 100644 index 0000000..e70f02e --- /dev/null +++ b/src/main/java/org/gcube/portlets/admin/resourcemanagement/shared/exceptions/WidgetNotRegistered.java @@ -0,0 +1,43 @@ +/**************************************************************************** + * This software is part of the gCube Project. + * Site: http://www.gcube-system.org/ + **************************************************************************** + * The gCube/gCore software is licensed as Free Open Source software + * conveying to the EUPL (http://ec.europa.eu/idabc/eupl). + * The software and documentation is provided by its authors/distributors + * "as is" and no expressed or + * implied warranty is given for its use, quality or fitness for a + * particular case. + **************************************************************************** + * Filename: WidgetNotRegistered.java + **************************************************************************** + * @author Daniele Strollo + ***************************************************************************/ + +package org.gcube.portlets.admin.resourcemanagement.shared.exceptions; + +import com.google.gwt.user.client.rpc.IsSerializable; + +/** + * @author Daniele Strollo (ISTI-CNR) + * + */ +public class WidgetNotRegistered extends Exception implements IsSerializable { + private static final long serialVersionUID = -4492836891522593176L; + + public WidgetNotRegistered() { + super(); + } + + public WidgetNotRegistered(String message, Throwable cause) { + super(message, cause); + } + + public WidgetNotRegistered(String message) { + super(message); + } + + public WidgetNotRegistered(Throwable cause) { + super(cause); + } +} diff --git a/src/main/java/org/gcube/portlets/admin/resourcemanagement/shared/utils/DelayedOperation.java b/src/main/java/org/gcube/portlets/admin/resourcemanagement/shared/utils/DelayedOperation.java new file mode 100644 index 0000000..b4712d4 --- /dev/null +++ b/src/main/java/org/gcube/portlets/admin/resourcemanagement/shared/utils/DelayedOperation.java @@ -0,0 +1,57 @@ +/**************************************************************************** + * This software is part of the gCube Project. + * Site: http://www.gcube-system.org/ + **************************************************************************** + * The gCube/gCore software is licensed as Free Open Source software + * conveying to the EUPL (http://ec.europa.eu/idabc/eupl). + * The software and documentation is provided by its authors/distributors + * "as is" and no expressed or + * implied warranty is given for its use, quality or fitness for a + * particular case. + **************************************************************************** + * Filename: DelayedOperation.java + **************************************************************************** + * @author Daniele Strollo + ***************************************************************************/ + +package org.gcube.portlets.admin.resourcemanagement.shared.utils; + +import com.google.gwt.user.client.Timer; + +/** + * Performs a delayed action on client side. + * Usage: + *
+ *  new DelayedOperation() {
+ *    // @Override
+ *    public void doJob() {
+ *      // Here the code...
+ *    }
+ *  }.start(5000); // the operation will start after 5 secs.
+ * 
+ * @author Daniele Strollo (ISTI-CNR) + */ +public abstract class DelayedOperation { + public final void start(final int delayMills) { + Timer t = new Timer() { + @Override + public void run() { + doJob(); + } + }; + t.schedule(delayMills); + } + + public final void loop(final int delayMills) { + Timer t = new Timer() { + @Override + public void run() { + doJob(); + this.schedule(delayMills); + } + }; + t.schedule(delayMills); + } + + public abstract void doJob(); +} diff --git a/src/main/java/org/gcube/portlets/admin/resourcemanagement/shared/utils/XMLUtil.java b/src/main/java/org/gcube/portlets/admin/resourcemanagement/shared/utils/XMLUtil.java new file mode 100644 index 0000000..4b2f6a6 --- /dev/null +++ b/src/main/java/org/gcube/portlets/admin/resourcemanagement/shared/utils/XMLUtil.java @@ -0,0 +1,185 @@ +/**************************************************************************** + * This software is part of the gCube Project. + * Site: http://www.gcube-system.org/ + **************************************************************************** + * The gCube/gCore software is licensed as Free Open Source software + * conveying to the EUPL (http://ec.europa.eu/idabc/eupl). + * The software and documentation is provided by its authors/distributors + * "as is" and no expressed or + * implied warranty is given for its use, quality or fitness for a + * particular case. + **************************************************************************** + * Filename: XMLUtil.java + **************************************************************************** + * @author Daniele Strollo + ***************************************************************************/ + +package org.gcube.portlets.admin.resourcemanagement.shared.utils; + +import java.util.ArrayList; +import java.util.Iterator; +import java.util.List; + +import org.gcube.resourcemanagement.support.shared.types.datamodel.AtomicTreeNode; + + + +import com.google.gwt.xml.client.Document; +import com.google.gwt.xml.client.Element; +import com.google.gwt.xml.client.NamedNodeMap; +import com.google.gwt.xml.client.Node; +import com.google.gwt.xml.client.NodeList; +import com.google.gwt.xml.client.XMLParser; + +/** + * @author Daniele Strollo (ISTI-CNR) + * + */ + +public class XMLUtil { + + public static AtomicTreeNode XMLToTree(final String xml, final String rootName) + throws Exception { + AtomicTreeNode root = null; + Document doc = XMLParser.parse(xml); + String rootTag = rootName; + root = elementToNode((com.google.gwt.xml.client.Element) doc.getElementsByTagName(rootTag).item(0)); + return root; + } + + private static AtomicTreeNode elementToNode(final com.google.gwt.xml.client.Element el) throws Exception { + if (el == null) { + throw new Exception("Invalid Profile"); + } + StringBuffer value = new StringBuffer(XMLUtil.getTextContent(el).trim()); + + if (el.hasAttributes()) { + NamedNodeMap attr = el.getAttributes(); + String attrName = null; + String attrVal = null; + for (int i = 0; i < attr.getLength(); i++) { + attrName = attr.item(i).getNodeName(); + attrVal = attr.getNamedItem(attrName).getNodeValue(); + value.append(attrName + " = " + attrVal + "; "); + } + } else { + if (value != null && value.length() != 0) { + value = new StringBuffer("value = " + value); + } + } + + String tagName = el.getTagName() + ((value.length() != 0) ? " [" + value + "]" : ""); + AtomicTreeNode node = new AtomicTreeNode(tagName); + Iterator childrenIterator = XMLUtil.getElementChildren(el).iterator(); + while (childrenIterator.hasNext()) { + node.add(elementToNode(childrenIterator.next())); + } + return node; + } + + + public static Element getFirstElementChild(final Element parent) { + if (parent == null) { + return null; + } + + Node current = parent.getFirstChild(); + while (current != null) { + if (current.getNodeType() == Node.ELEMENT_NODE) { + Element elem = (Element) current; + return elem; + } + current = current.getNextSibling(); + } + return null; + } + + + public static Element getFirstElementChild(final Element parent, final String tagName) { + if (parent == null || tagName == null) { + return null; + } + + Node current = parent.getFirstChild(); + while (current != null) { + if (current.getNodeType() == Node.ELEMENT_NODE) { + Element elem = (Element) current; + if (tagName.equals(elem.getTagName())) { + return elem; + } + } + current = current.getNextSibling(); + } + return null; + } + + public static List getElementChildren(final Element parent) { + ArrayList result = new ArrayList(); + if (parent == null) { + return result; + } + + Node current = parent.getFirstChild(); + while (current != null) { + if (current.getNodeType() == Node.ELEMENT_NODE) { + Element elem = (Element) current; + result.add(elem); + } + current = current.getNextSibling(); + } + return result; + } + + + public static List getElementChildren(final Element parent, final String tagName) { + ArrayList result = new ArrayList(); + if (parent == null || tagName == null) { + return result; + } + Node current = parent.getFirstChild(); + while (current != null) { + if (current.getNodeType() == Node.ELEMENT_NODE) { + Element elem = (Element) current; + if (tagName.equals(elem.getTagName())) { + result.add(elem); + } + } + current = current.getNextSibling(); + } + return result; + } + + + public static String getTextContent(final Element parent) { + StringBuffer result = new StringBuffer(); + if (parent == null) { + return result.toString(); + } + Node current = parent.getFirstChild(); + while (current != null) { + if (current.getNodeType() == Node.TEXT_NODE) { + result.append(current.getNodeValue()); + } + current = current.getNextSibling(); + + } + + return result.toString(); + } + + public static String getEntireContent(final Node parent) { + StringBuilder result = new StringBuilder(); + if (parent != null) { + NodeList children = parent.getChildNodes(); + for (int i = 0; i < children.getLength(); i++) { + Node node = children.item(i); + result.append(node.toString()); + //if(node.hasChildNodes()) result.append(getEntireContent(node)); + } + } + return result.toString(); + } + +} + + 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 new file mode 100644 index 0000000..b024bb9 --- /dev/null +++ b/src/main/resources/org/gcube/portlets/admin/resourcemanagement/ResourceManagementPortlet.gwt.xml @@ -0,0 +1,32 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/main/webapp/ResourceManagementPortlet.css b/src/main/webapp/ResourceManagementPortlet.css new file mode 100644 index 0000000..1241356 --- /dev/null +++ b/src/main/webapp/ResourceManagementPortlet.css @@ -0,0 +1,311 @@ +/* Comment import to style regular, uncomment if deploying on openbio or d4science.org */ +/*@import url(openbio.css);*/ +/*@import url(d4scienceOrg.css);*/ + +/* Fix the scrollbar background style*/ +.x-progress-text div { + background-color: transparent !important; + font-size: 11px; + font-weight: bold; +} + +.wizardTextBox { + background-color: white; + border-width: 1px; + -moz-border-radius: 4px; + -webkit-border-radius: 4px; + border-radius: 4px; + letter-spacing: normal; + line-height: 20px !important;; + height: 35px !important; + width: 295px; + font-size: 18px !important; +} + +.portlet { + padding: 0; + margin: 0; +} + +.x-menubar { + padding: 5px; +} + +.portlet-wrapper { + padding: 0; + margin: 0; +} + +.lfr-grid .lfr-column { + padding: 0; + margin: 0; +} + +/** + * to fix bug in duallist + */ +.x-form-list input { + left: -5000px; +} + +/** Add css rules here for your application. */ +.taskbar-pattern { + background-image: url(images/pattern.gif); + background-repeat: repeat; +} + +.taskbar-button { + background: transparent; +} + +.taskbar-button:hover,.taskbar-button:focus { + border: 0px; + -moz-transition: -moz-transform .15s linear; + -o-transition: -o-transform .15s linear; + -webkit-transition: -webkit-transform .15s linear; + -webkit-transform: scale(1.10); + -moz-transform: scale(1.10); + -o-transform: scale(1.10); + position: relative; + z-index: 5; + cursor: pointer; + cursor: hand; +} + +.x-hide-panel-header { + display: none !important; +} + +.x-grid-invalid-row { + border: 1px solid; + background: repeat-x left top; + color: lime; +} + +/* + * Used as initial background for the central panel + */ +.x-panel-cube-background { + color: #000; + border: 0px; + /* background-image:url(images/icons/bigcube.gif); */ + background-repeat: no-repeat; + background-position: center center; +} + +.left-panel-tree-background { + color: #000; + border: 0px; + background-image: url(images/d4infra.gif); + background-repeat: no-repeat; + background-position: center center; +} + +/* HERE THE ICONS */ +.detach-icon { + background-image: url(images/icons/detach.png) !important; +} + +.profile-folder-icon { + background-image: url(images/icons/folder.png) !important; +} + +.profile-icon { + background-image: url(images/icons/profile.gif) !important; +} + +.shutdown-icon { + background-image: url(images/icons/shutdown.png) !important; +} + +.sweeper-icon { + background-image: url(images/icons/sweeper2.png) !important; +} + +.new-icon { + background-image: url(images/icons/new.png) !important; +} + +.install-icon { + background-image: url(images/icons/install.png) !important; +} + +.deploy-icon { + background-image: url(images/icons/deploy.png) !important; +} + +.add-software-icon { + background-image: url(images/icons/cog_add.png) !important; +} + +.is-icon { + background-image: url(images/icons/is.png) !important; +} + +.getreport-icon { + background-image: url(images/icons/report.png) !important; +} + +.link-icon { + background-image: url(images/icons/link.png) !important; +} + +.restart-icon { + background-image: url(images/icons/restart.png) !important; +} + +.clean-restart-icon { + background-image: url(images/icons/clean-restart.png) !important; +} +/* +.profile-big-icon { + background-image:url(images/icons/profile-big.gif) !important; +}*/ +.report-big-icon { + background-image: url(images/icons/report-big.png) !important; +} + +.refresh-icon { + background-image: url(images/icons/refresh.png) !important; +} + +.close-icon { + background-image: url(images/icons/close.png) !important; +} + +.closeall-icon { + background-image: url(images/icons/closeall.png) !important; +} + +.upgrade-icon { + background-image: url(images/icons/upgrade.png) !important; +} + +.delete-icon { + background-image: url(images/icons/delete.png) !important; +} + +.force-delete-icon { + background-image: url(images/icons/forcedelete.png) !important; +} + +.grid-icon { + background-image: url(images/icons/grid.png) !important; + top: -2px; +} + +.validate-icon { + background-image: url(images/icons/validate.gif) !important; + top: -2px; +} + +.console-error-icon { + background-image: url(images/icons/error.png) !important; +} + +.console-log-icon { + background-image: url(images/icons/log.png) !important; +} + +.clear-icon { + background-image: url(images/icons/trash.png) !important; +} + +.console-icon { + background-image: url(images/icons/console.png) !important; +} + +.about-icon { + background-image: url(images/icons/about.png) !important; +} + +.resources-icon { + background-image: url(images/icons/world.png) !important; +} + +.wsresources-icon { + background-image: url(images/icons/page_white_world.png) !important; +} + +.ghn-icon { + background-image: url(images/icons/server.png) !important; +} + +.defaultleaf-icon { + background-image: url(images/icons/grid.png) !important; +} + +.collection-icon { + background-image: url(images/icons/folder_database.png) !important; +} + +.genericresource-icon { + background-image: url(images/icons/plugin.png) !important; +} + +.runtimeresource-icon { + background-image: url(images/icons/application_cascade.png) !important; +} + +.pluginCM-icon { + background-image: url(images/icons/pluginCM.png) !important; +} + +.pluginTM-icon { + background-image: url(images/tree_diag.png) !important; +} + +.pluginVM-icon { + background-image: url(images/icons/eye.png) !important; +} + +.metadatacollection-icon { + background-image: url(images/icons/table_multiple.png) !important; +} + +.runninginstance-icon { + background-image: url(images/icons/cog_go.png) !important; +} + +.service-icon { + background-image: url(images/icons/cog.png) !important; +} + +.empty-icon { + background-image: url(images/icons/error.png) !important; +} + +.addtoscope-icon { + background-image: url(images/icons/brick_add.png) !important; +} + +.removefromscope-icon { + background-image: url(images/icons/brick_delete.png) !important; +} + +.edit-icon { + background-image: url(images/icons/wand.png) !important; +} + +.sendButton { + display: block; + font-size: 16pt; +} + +/** Most GWT widgets already have a style name defined */ +.gwt-DialogBox { + width: 400px; +} + +.dialogVPanel { + margin: 5px; +} + +.serverResponseLabelError { + color: red; +} + +/** Set ids using widget.getElement().setId("idOfElement") */ +#closeButton { + margin: 15px 6px 6px; +} \ No newline at end of file diff --git a/src/main/webapp/ResourceManagementPortlet.html b/src/main/webapp/ResourceManagementPortlet.html new file mode 100644 index 0000000..1935d5e --- /dev/null +++ b/src/main/webapp/ResourceManagementPortlet.html @@ -0,0 +1,118 @@ + + + + + + + + + + + + + + + + + +D4Science Infrastructure Monitor + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
   +    +
+
+ +
+ + +
EU FP7 e-Infrastructures FP7 Capacities programme
+
+ + + + + diff --git a/src/main/webapp/WEB-INF/jsp/ResourceManagementPortlet_edit.jsp b/src/main/webapp/WEB-INF/jsp/ResourceManagementPortlet_edit.jsp new file mode 100644 index 0000000..0a197a8 --- /dev/null +++ b/src/main/webapp/WEB-INF/jsp/ResourceManagementPortlet_edit.jsp @@ -0,0 +1,13 @@ +<%@page contentType="text/html"%> +<%@page pageEncoding="UTF-8"%> + +<%-- Uncomment below lines to add portlet taglibs to jsp +<%@ page import="javax.portlet.*"%> +<%@ taglib uri="http://java.sun.com/portlet_2_0" prefix="portlet"%> + + +--%> + + + EDIT MODE + \ No newline at end of file diff --git a/src/main/webapp/WEB-INF/jsp/ResourceManagementPortlet_help.jsp b/src/main/webapp/WEB-INF/jsp/ResourceManagementPortlet_help.jsp new file mode 100644 index 0000000..39ed5a1 --- /dev/null +++ b/src/main/webapp/WEB-INF/jsp/ResourceManagementPortlet_help.jsp @@ -0,0 +1,13 @@ +<%@page contentType="text/html"%> +<%@page pageEncoding="UTF-8"%> + +<%-- Uncomment below lines to add portlet taglibs to jsp +<%@ page import="javax.portlet.*"%> +<%@ taglib uri="http://java.sun.com/portlet_2_0" prefix="portlet"%> + + +--%> + + + HELP MODE + \ No newline at end of file diff --git a/src/main/webapp/WEB-INF/jsp/ResourceManagementPortlet_view.jsp b/src/main/webapp/WEB-INF/jsp/ResourceManagementPortlet_view.jsp new file mode 100644 index 0000000..41237d1 --- /dev/null +++ b/src/main/webapp/WEB-INF/jsp/ResourceManagementPortlet_view.jsp @@ -0,0 +1,18 @@ +<%@page contentType="text/html"%> +<%@page pageEncoding="UTF-8"%> + +<%-- Uncomment below lines to add portlet taglibs to jsp +<%@ page import="javax.portlet.*"%> +<%@ taglib uri="http://java.sun.com/portlet_2_0" prefix="portlet"%> + + +--%> + + + + + + + + +
diff --git a/src/main/webapp/WEB-INF/liferay-display.xml b/src/main/webapp/WEB-INF/liferay-display.xml new file mode 100644 index 0000000..c9124cc --- /dev/null +++ b/src/main/webapp/WEB-INF/liferay-display.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/src/main/webapp/WEB-INF/liferay-plugin-package.properties b/src/main/webapp/WEB-INF/liferay-plugin-package.properties new file mode 100644 index 0000000..b9ec862 --- /dev/null +++ b/src/main/webapp/WEB-INF/liferay-plugin-package.properties @@ -0,0 +1,9 @@ +name=Resources Management +module-group-id=liferay +module-incremental-version=1 +tags= +short-description= +change-log= +page-url=http://www.d4science.eu +author=D4Science EU +licenses= \ No newline at end of file diff --git a/src/main/webapp/WEB-INF/liferay-portlet.xml b/src/main/webapp/WEB-INF/liferay-portlet.xml new file mode 100644 index 0000000..4958dba --- /dev/null +++ b/src/main/webapp/WEB-INF/liferay-portlet.xml @@ -0,0 +1,28 @@ + + + + + + resources-management + false + false + false + /ResourceManagementPortlet.css + + + administrator + Administrator + + + guest + Guest + + + power-user + Power User + + + user + User + + diff --git a/src/main/webapp/WEB-INF/portlet.xml b/src/main/webapp/WEB-INF/portlet.xml new file mode 100644 index 0000000..0433b79 --- /dev/null +++ b/src/main/webapp/WEB-INF/portlet.xml @@ -0,0 +1,24 @@ + + + + resources-management + Resources Management + org.gcube.portlets.admin.resourcemanagement.server.portlet.ResourceManagementPortlet + + view-jsp + /WEB-INF/ResourceManagementPortlet_view.jsp + + 0 + + text/html + + + Resources Management + Resources Management + Resources Management + + + administrator + + + diff --git a/src/main/webapp/WEB-INF/web.xml b/src/main/webapp/WEB-INF/web.xml new file mode 100644 index 0000000..18ce158 --- /dev/null +++ b/src/main/webapp/WEB-INF/web.xml @@ -0,0 +1,72 @@ + + + + + + + ServiceProxy + org.gcube.portlets.admin.resourcemanagement.server.ServiceProxyImpl + + + ServiceProxy + /resourcemanagementportlet/ServiceProxy + + + + + sweeperServlet + org.gcube.portlets.admin.resourcesweeper.server.SweeperServiceImpl + + + + sweeperServlet + /resourcemanagementportlet/sweeper + + + + + + guiceFilter + com.google.inject.servlet.GuiceFilter + + + guiceFilter + /* + + + org.gcube.portlets.admin.software_upload_wizard.server.BootstrapListener + + + + + isHealthServlet + org.gcube.portlets.admin.ishealthmonitor.server.ISMonitorServiceImpl + + + + isHealthServlet + /resourcemanagementportlet/ishealth + + + + jUnitHostImpl + com.google.gwt.junit.server.JUnitHostImpl + + + jUnitHostImpl + /resourcemanagementportlet/junithost/* + + + jUnitHostImpl + /org.gcube.portlets.admin.resourcemanagement.ResourceManagementPortletJUnit/junithost/* + + + + + ResourceManagementPortlet.html + + + diff --git a/src/main/webapp/WEB-INF/xml/scopedata.xml b/src/main/webapp/WEB-INF/xml/scopedata.xml new file mode 100644 index 0000000..926cc04 --- /dev/null +++ b/src/main/webapp/WEB-INF/xml/scopedata.xml @@ -0,0 +1,56 @@ + + + + + d4science + + + d4science + ServiceMap_d4science.research-infrastructures.eu.xml + /d4science.research-infrastructures.eu + + + d4science/FARM + ServiceMap_FARM.xml + /d4science.research-infrastructures.eu/FARM + + + d4science/gCubeApps + ServiceMap_gCubeApps.xml + /d4science.research-infrastructures.eu/gCubeApps + + + d4science/Ecosystem + ServiceMap_Ecosystem.xml + /d4science.research-infrastructures.eu/Ecosystem + + + d4science/EUBrazilOpenBio + ServiceMap_EUBrazilOpenBio.xml + /d4science.research-infrastructures.eu/EUBrazilOpenBio + + + + + + gcube + + + gcube + ServiceMap_gcube.xml + /gcube + + + gcube/devsec + ServiceMap_devsec.xml + /gcube/devsec + + + gcube/devNext + ServiceMap_devNext.xml + /gcube/devNext + + + + + diff --git a/src/main/webapp/WEB-INF/xml/scopedata_admin.xml b/src/main/webapp/WEB-INF/xml/scopedata_admin.xml new file mode 100644 index 0000000..926cc04 --- /dev/null +++ b/src/main/webapp/WEB-INF/xml/scopedata_admin.xml @@ -0,0 +1,56 @@ + + + + + d4science + + + d4science + ServiceMap_d4science.research-infrastructures.eu.xml + /d4science.research-infrastructures.eu + + + d4science/FARM + ServiceMap_FARM.xml + /d4science.research-infrastructures.eu/FARM + + + d4science/gCubeApps + ServiceMap_gCubeApps.xml + /d4science.research-infrastructures.eu/gCubeApps + + + d4science/Ecosystem + ServiceMap_Ecosystem.xml + /d4science.research-infrastructures.eu/Ecosystem + + + d4science/EUBrazilOpenBio + ServiceMap_EUBrazilOpenBio.xml + /d4science.research-infrastructures.eu/EUBrazilOpenBio + + + + + + gcube + + + gcube + ServiceMap_gcube.xml + /gcube + + + gcube/devsec + ServiceMap_devsec.xml + /gcube/devsec + + + gcube/devNext + ServiceMap_devNext.xml + /gcube/devNext + + + + + diff --git a/src/main/webapp/WEB-INF/xml/xmlverbatim.xsl b/src/main/webapp/WEB-INF/xml/xmlverbatim.xsl new file mode 100644 index 0000000..f80d0d6 --- /dev/null +++ b/src/main/webapp/WEB-INF/xml/xmlverbatim.xsl @@ -0,0 +1,322 @@ + + + + + + + + + + + + + + + + + + + converted by xmlverbatim.xsl 1.1, (c) O. Becker + + +
+ + + +
+ +
+ + + + + + + + + + + + + + + + + + + + +
+ +
+ < + + + + + + : + + + + + + + + xmlns + + ="" + + + + + + + + + + + + > + + + + + + +
+ +
+ </ + + + + + : + + + + + > +
+ + /> + +
+
+
+ + + + + + + + =" + + + + + + + " + + + + + + + xmlns + + : + + + + =" + + + + " + + + + + + + + + + + + + + + + + + + <!-- + + + + + + --> +
+
+ + + + <? + + + + + + + + + + ?> +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + +
+ + + +
+
+ +
diff --git a/src/main/webapp/conf/resourcemanagement.properties b/src/main/webapp/conf/resourcemanagement.properties new file mode 100644 index 0000000..94b0ec3 --- /dev/null +++ b/src/main/webapp/conf/resourcemanagement.properties @@ -0,0 +1,33 @@ + +# The user and its credentials +# Possible values for credentials: +# [USER,ADMIN,DEBUG] +USER_CREDENTIALS = ADMIN + +# Defines the modality in which the portlet is running +# possible values [STANDALONE,PORTAL,NOTDEFINED] +RUNNING_MODE = STANDALONE + +DEFAULT_USER = massimiliano.assante + +# The scope that will be used as default +DEFAULT_SCOPE =/d4science.research-infrastructures.eu +# the target of update notification (if in singleton mode) +# mails MUST be separated by ; +USERMAIL_TO = m.assante@gmail.com + +############################################################################### +# PROPERTIES FOR AUTOMATIC LOADING of GHN LIST AT STARTUP +############################################################################### +# Possible values: +# [YES,NO] +LIST_GHN_STARTUP = YES + + +############################################################################### +# PROPERTIES FOR THE SWEEPER +############################################################################### +# The max number of minutes from last profile update to consider a GHN alive. +# NOT LINKED TO THE SWEEPER ANYMORE +LIVE_GHN_MAX_MINUTES = 40 + diff --git a/src/main/webapp/d4scienceOrg.css b/src/main/webapp/d4scienceOrg.css new file mode 100644 index 0000000..d58ab98 --- /dev/null +++ b/src/main/webapp/d4scienceOrg.css @@ -0,0 +1,10 @@ +#wrapper { + font: 11px/1.5 "Lucida Grande", "Lucida Sans Unicode", Arial, Verdana, sans-serif; + margin: 0 auto; + width: 90% !important; +} + +#bottombar { + margin: 0 auto; + width: 100% !important; +} diff --git a/src/main/webapp/gxt/css/gxt-all.css b/src/main/webapp/gxt/css/gxt-all.css new file mode 100644 index 0000000..c3e9325 --- /dev/null +++ b/src/main/webapp/gxt/css/gxt-all.css @@ -0,0 +1,7129 @@ +/* + * Ext GWT Library 2.1.1 + * Copyright(c) 2006-2009, Ext JS, LLC. + * licensing@extjs.com + * + * http://extjs.com/license + */ +html,body,div,dl,dt,dd,ul,ol,li,h1,h2,h3,h4,h5,h6,pre,form,fieldset,input,p,blockquote,th,td{margin:0;padding:0;}img,body,html{border:0;}address,caption,cite,code,dfn,em,strong,th,var{font-style:normal;font-weight:normal;}ol,ul {list-style:none;}caption,th {text-align:left;}h1,h2,h3,h4,h5,h6{font-size:100%;}q:before,q:after{content:'';} +.ext-el-mask { + z-index: 100; + position: absolute; + top:0; + left:0; + -moz-opacity: 0.5; + opacity: .50; + filter: alpha(opacity=50); + width: 100%; + height: 100%; + zoom: 1; +} +.ext-el-mask-msg { + z-index: 101; + position: absolute; + top: 0; + left: 0; + border:1px solid; + background:repeat-x 0 -16px; + padding:2px; +} +.ext-el-mask-msg div { + padding:5px 10px 5px 10px; + border:1px solid; + cursor:wait; +} +.ext-webkit *:focus{ + outline: none !important; +} +.ext-webkit .x-form-check-wrap input:focus { + outline: auto !important; +} +.ext-shim { + position:absolute; + visibility:hidden; + left:0; + top:0; + overflow:hidden; +} +.ext-ie .ext-shim { + filter: alpha(opacity=0); +} +.ext-ie6 .ext-shim { + margin-left: 5px; + margin-top: 3px; +} +.x-mask-loading div { + padding:5px 10px 5px 25px; + background:no-repeat 5px 5px; + line-height:16px; +} +.x-hidden, .x-hide-offsets { + position:absolute !important; + left:-10000px !important; + top:-10000px !important; + visibility:hidden !important; +} +.x-hide-display { + display:none !important; +} +.x-hide-visibility { + visibility:hidden !important; +} +.x-masked { + overflow: hidden !important; +} +.x-masked-relative { + position: relative !important; +} +.x-masked select, .x-masked object, .x-masked embed { + visibility: hidden; +} +.x-layer { + visibility: hidden; +} +.x-unselectable, .x-unselectable * { + -moz-user-select: none; + -khtml-user-select: none; + -webkit-user-select: ignore; +} +.x-unselectable-single { + -moz-user-select: none; + -khtml-user-select: none; + -webkit-user-select: ignore; +} +.x-selectable, .x-selectable * { + -moz-user-select: text !important; + -webkit-user-select: auto; +} +.x-repaint { + zoom: 1; + background-color: transparent; + -moz-outline: none; +} +.x-item-disabled { + cursor: default; + opacity: .6; + -moz-opacity: .6; + filter: alpha(opacity=60); +} + +.ext-ie .x-item-disabled { + filter: none !important; +} + +.x-item-disabled * { + cursor: default !important; +} +.x-splitbar-proxy { + position: absolute; + visibility: hidden; + z-index: 20001; + zoom: 1; + line-height: 1px; + font-size: 1px; + overflow: hidden; +} +.x-splitbar-h, .x-splitbar-proxy-h { + cursor: e-resize; + cursor: col-resize; +} +.x-splitbar-v, .x-splitbar-proxy-v { + cursor: s-resize; + cursor: row-resize; +} +.x-color-palette { + width: 150px; + height: 92px; + cursor: pointer; +} +.x-color-palette a { + border: 1px solid; + float: left; + padding: 2px; + text-decoration: none; + -moz-outline: 0 none; + outline: 0 none; + cursor: pointer; +} +.x-color-palette a.x-color-palette-hover, .x-color-palette a.x-color-palette-sel { + border: 1px solid; +} +.x-color-palette em { + display: block; + border: 1px solid; +} +.x-color-palette em span { + cursor: pointer; + display: block; + height: 10px; + line-height: 10px; + width: 10px; +} +.x-ie-shadow { + display: none; + position: absolute; + overflow: hidden; + left:0; + top:0; + zoom:1; +} +.x-shadow { + display: none; + position: absolute; + overflow: hidden; + left:0; + top:0; +} +.x-shadow * { + overflow: hidden; +} +.x-shadow * { + padding: 0; + border: 0; + margin: 0; + clear: none; + zoom: 1; +} +.x-shadow .xstc, .x-shadow .xsbc { + height: 6px; + float: left; +} +.x-shadow .xstl, .x-shadow .xstr, .x-shadow .xsbl, .x-shadow .xsbr { + width: 6px; + height: 6px; + float: left; +} +.x-shadow .xsc { + width: 100%; +} +.x-shadow .xsml, .x-shadow .xsmr { + width: 6px; + float: left; + height: 100%; +} +.x-shadow .xsmc { + float: left; + height: 100%; + background: transparent; +} +.x-shadow .xst, .x-shadow .xsb { + height: 6px; + overflow: hidden; + width: 100%; +} +.x-shadow .xsml { + background: transparent repeat-y 0 0; +} +.x-shadow .xsmr { + background: transparent repeat-y -6px 0; +} +.x-shadow .xstl { + background: transparent no-repeat 0 0; +} +.x-shadow .xstc { + background: transparent repeat-x 0 -30px; +} +.x-shadow .xstr { + background: transparent repeat-x 0 -18px; +} +.x-shadow .xsbl { + background: transparent no-repeat 0 -12px; +} +.x-shadow .xsbc { + background: transparent repeat-x 0 -36px; +} +.x-shadow .xsbr { + background: transparent repeat-x 0 -6px; +} +.loading-indicator { + background: no-repeat left; + padding-left: 20px; + line-height: 16px; + margin: 3px; +} +.x-text-resize { + position: absolute; + left: -1000px; + top: -1000px; + visibility: hidden; + zoom: 1; +} +.x-drag-overlay { + width: 100%; + height: 100%; + display: none; + position: absolute; + left: 0; + top: 0; + background-image:url(../images/default/s.gif); + z-index: 20000; +} +.x-clear { + clear:both; + overflow:hidden; + line-height:0; + font-size:0; +} +.x-spotlight { + z-index: 8999; + position: absolute; + top:0; + left:0; + -moz-opacity: 0.5; + opacity: .50; + filter: alpha(opacity=50); + width:0; + height:0; + zoom: 1; +} +#x-history-frame { + position:absolute; + top:-1px; + left:0; + width:1px; + height:1px; + visibility:hidden; +} +#x-history-field { + position:absolute; + top:0; + left:-1px; + width:1px; + height:1px; + visibility:hidden; +} + +.x-portlet { + margin-bottom: 10px; +} + +.x-portlet .x-panel-body { + background-color: white !important; +} + +.ext-ie .x-btn-icon .x-btn-center .x-btn-text { + height: auto; +} + +.x-portal-insert div { + height: 4px; + font-size: 0px; + border: 2px dotted blue; +} + +.icon-wait { + background: url(../images/gxt/icons/wait.gif) no-repeat !important; +} + +.x-panel-icon { + padding-left: 20px !important; +} + +.x-icon-btn { + width: 16px; + height: 16px; + overflow: hidden; + background-repeat: no-repeat; + cursor: pointer; +} + +.x-panel-inline-icon { + margin-top: 0; +} + +.x-modal { + position: absolute; + z-index: 10; + background-color: black; + filter: alpha(opacity = 10); + opacity: .1; + left: 0px; + top: 0px; +} + +.x-progress { + font-family: tahoma, arial, helvetica, sans-serif; +} + +.x-float-right { + float: right; +} + +.x-toolbar .x-float-right { + margin-right: 4px; +} + +.x-border { + border: 1px solid #99BBE8; +} + +.x-border-top { + border-top: 1px solid #99BBE8; +} + +.x-layout-popup { + background-color: #DFE8F6; + border: 1px solid #7CA4D9; +} + +.x-panel-popup-body { + border-top: 1px solid #99BBE8; +} + +.x-layout-collapsed .x-panel-header { + border-left: none; + border-right: none; + border-top: none; +} + +.x-layout-collapsed .x-panel-header .x-tool { + margin: 0 0 0 -4px; + padding: 0px; +} + +.x-layout-collapsed { + position: absolute; + visibility: hidden; + background-color: #d2e0f2; + width: 20px; + height: 20px; + overflow: hidden; + border: 1px solid #98c0f4; + z-index: 20; +} + +.ext-border-box .x-layout-collapsed { + width: 22px; + height: 22px; +} + +.x-layout-collapsed-over { + cursor: pointer; + background-color: #d9e8fb; +} + +.x-layout-collapsed-west .x-layout-collapsed-tools,.x-layout-collapsed-east .x-layout-collapsed-tools { + position: absolute; + top: 0; + left: 0; + width: 20px; + height: 20px; +} + +.x-panel-toolbar { + float: right; +} + +.x-cursor-row-resize { + cursor: n-resize; + cursor: row-resize; +} + +.x-drag-proxy { + border: 1px dashed #3b5a82; + background-color: #EDEDED; + filter: alpha(opacity = 50); + opacity: .5; + background-color: #c3daf9; + z-index: 20000; + overflow: hidden; + position: absolute; + left: 0;; + top: 0; +} + +.x-date-picker,.x-date-picker a { + font-size: 11px; +} + +.x-date-days { + table-layout: fixed; + width: 100%; +} + +.x-date-days td { + width: 25px; + border: none; +} + +.x-date-days td span { + display: block; + padding: 2px 7px 2px 2px; +} + +.x-date-days td { + background: #DFECFB url(../images/default/shared/glass-bg.gif) repeat-x scroll left top; + border-bottom: 1px solid #A3BAD9; + border-collapse: separate; + color: #233D6D; + cursor: default; + font-family: arial, helvetica, tahoma, sans-serif; + font-size: 10px; + font-size-adjust: none; + font-stretch: normal; + font-style: normal; + font-variant: normal; + font-weight: normal; + line-height: normal; + padding: 0pt; + text-align: right !important; +} + +.x-date-picker .x-date-header { + background: url(../images/default/shared/hd-sprite.gif) repeat-x 0 -83px; + height: 22px; + left: 10px; + top: 10px; + width: 157px; +} + +.x-date-header .x-btn .x-btn-text { + color: #fff; +} + +.x-date-picker-footer { + width: 100%; +} + +.x-date-picker-footer td { + text-align: center; +} + +.x-date-left { + background: transparent url(../images/default/shared/hd-sprite.gif) repeat-x scroll 0pt -83px; + color: #FFFFFF; + font-family: "sans serif", tahoma, verdana, helvetica; + font-size: 11px; + font-size-adjust: none; + font-stretch: normal; + font-style: normal; + font-variant: normal; + font-weight: bold; + line-height: normal; + overflow: hidden; +} + +.x-modal { + position: absolute; + z-index: 10; + background-color: black; + filter: alpha(opacity = 10); + opacity: .1; + left: 0px; + top: 0px; +} + +.x-progress { + font-family: tahoma, arial, helvetica, sans-serif; +} + +.x-float-right { + float: right; +} + +.x-layout-popup { + background-color: #DFE8F6; + border: 1px solid #7CA4D9; +} + +.x-layout-collapsed .x-panel-header .x-tool { + margin: 0 0 0 -4px; + padding: 0px; +} + +.ext-border-box .x-layout-collapsed { + width: 22px; + height: 22px; +} + +.x-layout-collapsed-over { + cursor: pointer; + background-color: #d9e8fb; +} + +.x-layout-collapsed-west .x-layout-collapsed-tools,.x-layout-collapsed-east .x-layout-collapsed-tools { + position: absolute; + top: 0; + left: 0; + width: 20px; + height: 20px; +} + +.x-panel-toolbar { + float: right; +} + +.x-cursor-col-resize { + cursor: e-resize; + cursor: col-resize; +} + +.x-cursor-row-resize { + cursor: n-resize; + cursor: row-resize; +} +.x-drag-proxy { + border: 1px dashed #3b5a82; + background-color: #EDEDED; + filter: alpha(opacity=50); + opacity: .5; + background-color: #c3daf9; + z-index: 20000; + overflow: hidden; + position: absolute; + left: 0;; + top: 0; +}.x-tab-panel { + overflow: hidden; + -moz-outline: none; +} + +.x-tab-panel-header,.x-tab-panel-footer { + border: 1px solid; + overflow: hidden; + zoom: 1; +} + +.x-tab-panel-header { + border: 1px solid; + padding-bottom: 2px; +} + +.x-tab-panel-footer { + border: 1px solid; + padding-top: 2px; +} + +.x-tab-strip-wrap { + width: 100%; + overflow: hidden; + position: relative; + zoom: 1; +} + +ul.x-tab-strip { + display: block; + width: 7000px; + zoom: 1; +} + +ul.x-tab-strip-top { + padding-top: 1px; + background: repeat-x bottom; + border-bottom: 1px solid; +} + +ul.x-tab-strip-bottom { + padding-bottom: 1px; + background: repeat-x top; + border-top: 1px solid; + border-bottom: 0 none; +} + +.x-tab-panel-header-plain .x-tab-strip-top { + background: transparent !important; + padding-top: 0 !important; +} + +.x-tab-panel-header-plain { + background: transparent !important; + border-width: 0 !important; + padding-bottom: 0 !important; +} + +.x-tab-panel-header-plain .x-tab-strip-spacer,.x-tab-panel-footer-plain .x-tab-strip-spacer + { + border: 1px solid; + height: 2px; + font-size: 1px; + line-height: 1px; +} + +.x-tab-panel-header-plain .x-tab-strip-spacer { + border-top: 0 none; +} + +.x-tab-panel-footer-plain .x-tab-strip-spacer { + border-bottom: 0 none; +} + +.x-tab-panel-footer-plain .x-tab-strip-bottom { + background: transparent !important; + padding-bottom: 0 !important; +} + +.x-tab-panel-footer-plain { + background: transparent !important; + border-width: 0 !important; + padding-top: 0 !important; +} + +.ext-border-box .x-tab-panel-header-plain .x-tab-strip-spacer,.ext-border-box .x-tab-panel-footer-plain .x-tab-strip-spacer + { + height: 3px; +} + +ul.x-tab-strip li { + float: left; + position: relative; + margin-left: 2px; +} + +ul.x-tab-strip li.x-tab-edge { + float: left; + margin: 0 !important; + padding: 0 !important; + border: 0 none !important; + font-size: 1px !important; + line-height: 1px !important; + overflow: hidden; + zoom: 1; + background: transparent !important; + width: 1px; +} + +.x-tab-strip a,.x-tab-strip span,.x-tab-strip em { + display: block; +} + +.x-tab-strip a { + text-decoration: none !important; + -moz-outline: none; + outline: none; + cursor: pointer; +} + +.x-tab-strip-inner { + overflow: hidden; + text-overflow: ellipsis; +} + +.x-tab-strip span.x-tab-strip-text { + white-space: nowrap; + cursor: pointer; + padding: 4px 0; +} + +.x-tab-strip-top .x-tab-with-icon .x-tab-right { + padding-left: 6px; +} + +.x-tab-strip .x-tab-with-icon span.x-tab-strip-text { + padding-left: 20px; + background-position: 0 3px; + background-repeat: no-repeat; +} + +.x-tab-strip-active,.x-tab-strip-active a.x-tab-right { + cursor: default; +} + +.x-tab-strip-active span.x-tab-strip-text { + cursor: default; +} + +.x-tab-strip-disabled .x-tabs-text { + cursor: default; +} + +.x-tab-panel-body { + overflow: hidden; +} + +.x-tab-panel-bwrap { + overflow: hidden; +} + +.ext-ie .x-tab-strip .x-tab-right { + position: relative; +} + +.x-tab-strip-top .x-tab-strip-active .x-tab-right { + margin-bottom: -1px; +} + +.x-tab-strip-top .x-tab-strip-active .x-tab-right span.x-tab-strip-text + { + padding-bottom: 5px; +} + +.x-tab-strip-bottom .x-tab-strip-active .x-tab-right { + margin-top: -1px; +} + +.x-tab-strip-bottom .x-tab-strip-active .x-tab-right span.x-tab-strip-text + { + padding-top: 5px; +} + +.x-tab-strip-top .x-tab-right { + background: transparent no-repeat 0 -51px; + padding-left: 10px; +} + +.x-tab-strip-top .x-tab-left { + background: transparent no-repeat right -351px; + padding-right: 10px; +} + +.x-tab-strip-top .x-tab-strip-inner { + background: transparent repeat-x 0 -201px; +} + +.x-tab-strip-top .x-tab-strip-over .x-tab-right { + background-position: 0 -101px; +} + +.x-tab-strip-top .x-tab-strip-over .x-tab-left { + background-position: right -401px; +} + +.x-tab-strip-top .x-tab-strip-over .x-tab-strip-inner { + background-position: 0 -251px; +} + +.x-tab-strip-top .x-tab-strip-active .x-tab-right { + background-position: 0 0; +} + +.x-tab-strip-top .x-tab-strip-active .x-tab-left { + background-position: right -301px; +} + +.x-tab-strip-top .x-tab-strip-active .x-tab-strip-inner { + background-position: 0 -151px; +} + +.x-tab-strip-bottom .x-tab-right { + background: no-repeat bottom right; +} + +.x-tab-strip-bottom .x-tab-left { + background: no-repeat bottom left; +} + +.x-tab-strip-bottom .x-tab-strip-active .x-tab-right { + background: no-repeat bottom left; +} + +.x-tab-strip-bottom .x-tab-strip-active .x-tab-left { + background: no-repeat bottom right; +} + +.x-tab-strip-bottom .x-tab-left { + padding: 0 10px; +} + +.x-tab-strip-bottom .x-tab-right { + padding: 0; +} + +.x-tab-strip .x-tab-strip-close { + display: none; +} + +.x-tab-strip-closable { + position: relative; +} + +.x-tab-strip-closable .x-tab-left { + padding-right: 19px; +} + +.x-tab-strip .x-tab-strip-closable a.x-tab-strip-close { + opacity: .6; + -moz-opacity: .6; + background-repeat: no-repeat; + display: block; + width: 11px; + height: 11px; + position: absolute; + top: 3px; + right: 3px; + cursor: pointer; + z-index: 2; +} + +.x-tab-strip .x-tab-strip-active a.x-tab-strip-close { + opacity: .8; + -moz-opacity: .8; +} + +.x-tab-strip .x-tab-strip-closable a.x-tab-strip-close:hover { + opacity: 1; + -moz-opacity: 1; +} + +.x-tab-panel-body { + border: 1px solid; +} + +.x-tab-panel-body-top { + border-top: 0 none; +} + +.x-tab-panel-body-bottom { + border-bottom: 0 none; +} + +.x-tab-scroller-left { + background: transparent no-repeat -18px 0; + border-bottom: 1px solid; + width: 18px; + position: absolute; + left: 0; + top: 0; + z-index: 10; + cursor: pointer; +} + +.x-tab-scroller-left-over { + background-position: 0 0; +} + +.x-tab-scroller-left-disabled { + background-position: -18px 0; + opacity: .5; + -moz-opacity: .5; + filter: alpha(opacity = 50); + cursor: default; +} + +.x-tab-scroller-right { + background: transparent no-repeat 0 0; + border-bottom: 1px solid; + width: 18px; + position: absolute; + right: 0; + top: 0; + z-index: 10; + cursor: pointer; +} + +.x-tab-scroller-right-over { + background-position: -18px 0; +} + +.x-tab-scroller-right-disabled { + background-position: 0 0; + opacity: .5; + -moz-opacity: .5; + filter: alpha(opacity = 50); + cursor: default; +} + +.x-tab-scrolling-bottom .x-tab-scroller-left,.x-tab-scrolling-bottom .x-tab-scroller-right + { + margin-top: 1px; +} + +.x-tab-scrolling .x-tab-strip-wrap { + margin-left: 18px; + margin-right: 18px; +} + +.x-tab-scrolling { + position: relative; +} + +.x-tab-panel-bbar .x-toolbar { + border: 1px solid; + border-top: 0 none; + overflow: hidden; + padding: 2px; +} + +.x-tab-panel-tbar .x-toolbar { + border: 1px solid; + border-top: 0 none; + overflow: hidden; + padding: 2px; +} + +.x-tab-strip li .x-tab-image { + position: absolute; + top: 3px; + left: 5px; +} + +.ext-ie8 .x-tab-strip li .x-tab-image,.ext-ie8-compatibility .x-tab-strip li .x-tab-image { + top: 4px; + left: 6px; +} + +.ext-ie8 .x-tab-strip-top .x-tab-right,.ext-ie8-compatibility .x-tab-strip-top .x-tab-right + { + top: 1px; +} + +.ext-strict .ext-ie8 .x-tab-strip-top .x-tab-right,.ext-ie8 .x-tab-panel-header-plain .x-tab-strip-top .x-tab-right,.ext-ie8-compatibility .x-tab-panel-header-plain .x-tab-strip-top .x-tab-right + { + top: 0; +} +.x-form-field { + margin: 0; +} + +.x-form-text,textarea.x-form-field { + padding: 1px 3px; + background: repeat-x 0 0; + border: 1px solid; +} + +.ext-gecko textarea.x-form-field { + padding: 0; +} + +.x-form-text,.ext-ie .x-form-file { + height: 22px; + line-height: 18px; + vertical-align: middle; +} + +.ext-ie6 .x-form-text,.ext-ie7 .x-form-text { + margin: -1px 0; + height: 22px; /* ie quirks */ + line-height: 18px; +} + +.ext-ie8-compatibility .x-form-text { + margin: 0; + } + +.ext-ie textarea.x-form-field { + margin: -1px 0; /* ie bogus margin bug */ +} + +.ext-strict .ext-ie8 textarea.x-form-field,.ext-strict .ext-ie8-compatibility textarea.x-form-field { + margin: 0; +} +.x-form-field-wrap .x-form-text { + position: relative; +} + +.ext-strict .x-form-text { + height: 18px; +} + +.ext-safari.ext-mac textarea.x-form-field { + margin-bottom: -2px; +} + +.ext-gecko .x-form-text,.ext-ie8 .x-form-text { + padding-top: 2px; + padding-bottom: 0; +} + +textarea { + resize: none; +} + +.x-form-select-one { + height: 20px; + line-height: 18px; + vertical-align: middle; + border: 1px solid; +} + +.x-form-check-wrap { + line-height: 18px; + height: 22px; + white-space: nowrap; +} + +.x-editor .x-form-check-wrap { + border: 1px solid; + padding: 2px; + height: 14px; +} + +.x-editor .x-form-checkbox { + height: 13px; +} + +.x-form-check-group-label { + border-bottom: 1px solid; + margin-bottom: 5px; + padding-left: 3px !important; + float: none !important; +} + +.x-form-field-wrap .x-form-trigger { + width: 17px; + height: 21px; + border: 0; + background: transparent no-repeat 0 0; + cursor: pointer; + border-bottom: 1px solid; + position: absolute; + top: 0; +} + +.ext-safari .x-form-field-wrap .x-form-trigger { + height: 21px; +} + +.x-form-field-wrap .x-form-date-trigger,.x-form-field-wrap .x-form-clear-trigger,.x-form-field-wrap .x-form-search-trigger + { + cursor: pointer; +} + +.ext-safari .x-form-field-wrap .x-form-trigger,.ext-gecko .x-form-field-wrap .x-form-trigger + { + right: 0; +} + +.x-form-field-wrap .x-form-twin-triggers .x-form-trigger { + position: static; + top: auto; + vertical-align: top; +} + +.x-form-field-wrap { + position: relative; + left: 0; + top: 0; + zoom: 1; + white-space: nowrap; + text-align: left; +} + +.x-form-field-wrap .x-form-trigger-over { + background-position: -17px 0; +} + +.x-form-field-wrap .x-form-trigger-click { + background-position: -34px 0; +} + +.x-trigger-wrap-focus .x-form-trigger { + background-position: -51px 0; +} + +.x-trigger-wrap-focus .x-form-trigger-over { + background-position: -68px 0; +} + +.x-trigger-wrap-focus .x-form-trigger-click { + background-position: -85px 0; +} + +.x-trigger-wrap-focus .x-form-trigger { + border-bottom: 1px solid; +} + +.x-item-disabled .x-form-trigger-over { + background-position: 0 0 !important; + border-bottom: 1px solid; +} + +.x-item-disabled .x-form-trigger-click { + background-position: 0 0 !important; + border-bottom: 1px solid; +} + +.x-form-focus,textarea.x-form-focus { + border: 1px solid; +} + +.x-form-invalid,textarea.x-form-invalid { + background: repeat-x bottom; + border: 1px solid; +} + +.ext-safari .x-form-invalid { + border: 1px solid; +} + +.x-form-inner-invalid,textarea.x-form-inner-invalid { + background: repeat-x bottom; +} + +.x-editor { + padding: 0; + margin: 0; +} + +.ext-ie .x-form-check-wrap input { + width: 15px; + height: 15px; +} + +.x-form-grow-sizer { + left: -10000px; + padding: 8px 3px; + position: absolute; + visibility: hidden; + top: -10000px; + white-space: pre-wrap; + white-space: -moz-pre-wrap; + white-space: -pre-wrap; + white-space: -o-pre-wrap; + word-wrap: break-word; + zoom: 1; +} + +.x-form-grow-sizer p { + margin: 0 !important; + border: 0 none !important; + padding: 0 !important; +} + +.x-form-item { + display: block; + margin-bottom: 4px; +} + +.x-form-item .x-form-item-label { + display: block; + float: left; + width: 100px; + padding: 3px; + padding-left: 0; + clear: left; + z-index: 2; + position: relative; +} + +.x-form-element { + padding-left: 105px; + position: relative; +} + +.x-form-invalid-msg { + padding: 2px; + padding-left: 18px; + background: transparent no-repeat 0 2px; + line-height: 16px; + width: 200px; +} + +.x-form-label-left .x-form-item-label { + text-align: left; +} + +.x-form-label-right .x-form-item-label { + text-align: right; +} + +.x-form-label-top .x-form-item .x-form-item-label { + width: auto; + float: none; + clear: none; + display: inline; + margin-bottom: 4px; + position: static; +} + +.x-form-label-top .x-form-element { + padding-left: 0; + padding-top: 4px; +} + +.x-form-label-top .x-form-item { + padding-bottom: 4px; +} + +.x-small-editor .x-form-text { + height: 20px; + line-height: 16px; + vertical-align: middle; +} + +.ext-ie6 .x-small-editor .x-form-text,.ext-ie7 .x-small-editor .x-form-text { + height: 20px !important; + line-height: 16px !important; +} + +.ext-strict .x-small-editor .x-form-text { + height: 16px !important; +} + +.ext-border-box .x-small-editor .x-form-text { + height: 20px; +} + +.x-small-editor .x-form-select-one { + height: 20px; + line-height: 16px; + vertical-align: middle; +} + +.x-small-editor .x-form-num-field { + text-align: right; +} + +.x-small-editor .x-form-field-wrap .x-form-trigger { + height: 19px; +} + +.x-form-clear { + clear: both; + overflow: hidden; + line-height: 0; + font-size: 0; + height: 0; +} + +.x-form-clear-left { + clear: left; + overflow: hidden; + line-height: 0; + font-size: 0; + height: 0; +} + +.x-form-cb-label { + width: auto !important; + float: none !important; + clear: none !important; + display: inline !important; + margin-left: 4px; +} + +.x-form-column { + float: left; + padding: 0; + margin: 0; + width: 48%; + overflow: hidden; + zoom: 1; +} + +.x-form .x-form-btns-ct .x-btn { + float: right; + clear: none; +} + +.x-form .x-form-btns-ct .x-form-btns td { + border: 0; + padding: 0; +} + +.x-form .x-form-btns-ct .x-form-btns-right table { + float: right; + clear: none; +} + +.x-form .x-form-btns-ct .x-form-btns-left table { + float: left; + clear: none; +} + +.x-form .x-form-btns-ct .x-form-btns-center { + text-align: center; +} + +.x-form .x-form-btns-ct .x-form-btns-center table { + margin: 0 auto; +} + +.x-form .x-form-btns-ct table td.x-form-btn-td { + padding: 3px; +} + +.x-form .x-form-btns-ct .x-btn-focus .x-btn-left { + background-position: 0 -147px; +} + +.x-form .x-form-btns-ct .x-btn-focus .x-btn-right { + background-position: 0 -168px; +} + +.x-form .x-form-btns-ct .x-btn-focus .x-btn-center { + background-position: 0 -189px; +} + +.x-form .x-form-btns-ct .x-btn-click .x-btn-center { + background-position: 0 -126px; +} + +.x-form .x-form-btns-ct .x-btn-click .x-btn-right { + background-position: 0 -84px; +} + +.x-form .x-form-btns-ct .x-btn-click .x-btn-left { + background-position: 0 -63px; +} + +.x-form-invalid-icon { + width: 16px; + height: 18px; + position: absolute; + left: 0; + top: 0; + display: block; + background: transparent no-repeat 0 2px; +} + +.x-fieldset { + border: 1px solid; + padding: 10px; + margin-bottom: 10px; + display: block; +} + +.ext-ie .x-fieldset legend { + margin-bottom: 10px; +} + +.ext-ie .x-fieldset { + padding-top: 0; + padding-bottom: 10px; +} + +.x-fieldset legend .x-tool-toggle { + margin-right: 3px; + margin-left: 0; + float: left !important; +} + +.x-fieldset legend input { + margin-right: 3px; + float: left !important; + height: 13px; + width: 13px; +} + +fieldset.x-panel-collapsed { + padding-bottom: 0 !important; + border-width: 1px 1px 0 1px !important; + border-left-color: transparent; + border-right-color: transparent; +} + +.ext-ie6 fieldset.x-panel-collapsed { + padding-bottom: 0 !important; + border-width: 1px 0 0 0 !important; + margin-left: 1px; + margin-right: 1px; +} + +fieldset.x-panel-collapsed .x-fieldset-bwrap { + visibility: hidden; + position: absolute; + left: -1000px; + top: -1000px; +} + +.ext-ie .x-fieldset-bwrap { + zoom: 1; +} + +.x-fieldset-noborder { + border: 0px none transparent; +} + +.x-fieldset-noborder legend { + margin-left: -3px; +} + +.ext-ie .x-fieldset-noborder legend { + position: relative; + margin-bottom: 23px; +} + +.ext-ie .x-fieldset-noborder legend span { + position: absolute; + left: 16px; +} + +.ext-gecko .x-form-item { + -moz-outline: none; +} + +.x-hide-label label.x-form-item-label { + display: none !important; +} + +.x-hide-label .x-form-element { + padding-left: 0 !important; +} + +.x-fieldset { + overflow: hidden; +} + +/* make top of checkbox/tools visible in webkit */ +.ext-webkit .x-fieldset-header { + padding-top: 1px; +} + +.x-fieldset-bwrap { + overflow: hidden; + zoom: 1; +} + +.x-fieldset-body { + overflow: hidden; +} + +.x-combo-list .x-combo-selected { + border-color: #a3bae9 !important; +} + +.x-combo-list { + background-color: white !important; +} + +.ext-gecko .x-form-file { + height: inherit !important; +} + +.x-form-check { + background: none !important +} + +.x-form-radio { + background: none !important +} + +.x-form-label { + padding: 2px 3px 3px 0px; + font-size: 12px; +} + +.x-form-label-top .x-form-item { + padding-bottom: 0px; + margin-bottom: 2px; +} + +.ext-safari .x-form-text { + height: 22px; /* safari always same size */ + padding: 0 3px; + /* remove extra top/bottom padding */ +} + +.ext-safari .x-small-editor .x-form-text { + height: 20px; +} + +.x-form-group-label,.x-form-cb-label { + font: normal 12px tahoma, arial, helvetica, sans-serif; + padding-right: 10px; +} + +.x-form-list { + background: #FFFFFF url(../images/default/form/text-bg.gif) repeat-x scroll 0 0; + border: 1px solid #B5B8C8; +} + +/* + * FileUploadField component styles + */ +.x-form-file-wrap { + height: 22px; +} + +.x-form-file-wrap .x-form-file { + position: absolute; + right: 0; + -moz-opacity: 0; + filter: alpha(opacity : 0); + opacity: 0; + z-index: 2; + height: 22px; + top: 0; +} + +.x-form-file-wrap .x-form-file-btn { + position: absolute; + right: 0; + z-index: 1; + top: 0; +} + +.x-form-file-wrap .x-form-file-text { + z-index: 3; + color: #777; +} + +.x-form-invalid-icon { + background-position: 0 0 !important; +} + +.x-triggerfield-noedit { + cursor: pointer; +} + +.ext-webkit .x-form-checkbox:focus { + outline: auto !important; +}.x-btn{ + cursor:pointer; + white-space: nowrap; +} +.x-btn button{ + border:0 none; + background:transparent; + padding-left:3px; + padding-right:3px; + cursor:pointer; + margin:0; + overflow:hidden; + width:auto; + -moz-outline:0 none; + outline:0 none; +} +* html .ext-ie .x-btn button { + width:1px; +} +.ext-ie .x-item-disabled .x-btn-mc img { + filter: alpha(opacity=60); +} +.ext-gecko .x-btn button,.ext-webkit .x-btn button { + padding-left:0; + padding-right:0; +} +.ext-gecko .x-btn button::-moz-focus-inner { + padding:0; +} +.ext-ie .x-btn button { + padding-top:2px; +} +.x-btn td { + padding:0 !important; +} +.x-btn-text { + cursor:pointer; + white-space: nowrap; + padding:0; +} +.x-btn-noicon .x-btn-small .x-btn-text{ + height: 16px; +} +.x-btn-noicon .x-btn-medium .x-btn-text{ + height: 24px; +} +.x-btn-noicon .x-btn-large .x-btn-text{ + height: 32px; +} +.x-btn-icon .x-btn-text{ + background-position: center; + background-repeat: no-repeat; +} +.x-btn-icon .x-btn-small .x-btn-text{ + height: 16px; + width: 16px; +} +.x-btn-icon .x-btn-medium .x-btn-text{ + height: 24px; + width: 24px; +} +.x-btn-icon .x-btn-large .x-btn-text{ + height: 32px; + width: 32px; +} +.x-btn-text-icon .x-btn-icon-small-left .x-btn-text{ + background-position: 0 center; + background-repeat: no-repeat; + padding-left:18px; + height:16px; +} +.x-btn-text-icon .x-btn-icon-medium-left .x-btn-text{ + background-position: 0 center; + background-repeat: no-repeat; + padding-left:26px; + height:24px; +} +.x-btn-text-icon .x-btn-icon-large-left .x-btn-text{ + background-position: 0 center; + background-repeat: no-repeat; + padding-left:34px; + height:32px; +} +.x-btn-text-icon .x-btn-icon-small-top .x-btn-text{ + background-position: center 0; + background-repeat: no-repeat; + padding-top:18px; +} +.x-btn-text-icon .x-btn-icon-medium-top .x-btn-text{ + background-position: center 0; + background-repeat: no-repeat; + padding-top:26px; +} +.x-btn-text-icon .x-btn-icon-large-top .x-btn-text{ + background-position: center 0; + background-repeat: no-repeat; + padding-top:34px; +} +.x-btn-text-icon .x-btn-icon-small-right .x-btn-text{ + background-position: right center; + background-repeat: no-repeat; + padding-right:18px; + height:16px; +} +.x-btn-text-icon .x-btn-icon-medium-right .x-btn-text{ + background-position: right center; + background-repeat: no-repeat; + padding-right:26px; + height:24px; +} +.x-btn-text-icon .x-btn-icon-large-right .x-btn-text{ + background-position: right center; + background-repeat: no-repeat; + padding-right:34px; + height:32px; +} +.x-btn-text-icon .x-btn-icon-small-bottom .x-btn-text{ + background-position: center bottom; + background-repeat: no-repeat; + padding-bottom:18px; +} +.x-btn-text-icon .x-btn-icon-medium-bottom .x-btn-text{ + background-position: center bottom; + background-repeat: no-repeat; + padding-bottom:26px; +} +.x-btn-text-icon .x-btn-icon-large-bottom .x-btn-text{ + background-position: center bottom; + background-repeat: no-repeat; + padding-bottom:34px; +} +.x-btn-tr i, .x-btn-tl i, .x-btn-mr i, .x-btn-ml i, .x-btn-br i, .x-btn-bl i{ + font-size:1px; + line-height:1px; + width:3px; + display:block; + overflow:hidden; +} +.x-btn-tr i, .x-btn-tl i, .x-btn-br i, .x-btn-bl i{ + height:3px; +} +.x-btn-tl{ + width:3px; + height:3px; + background:no-repeat 0 0; +} +.x-btn-tr{ + width:3px; + height:3px; + background:no-repeat -3px 0; +} +.x-btn-tc{ + height:3px; + background:repeat-x 0 -6px; +} +.x-btn-ml{ + width:3px; + background:no-repeat 0 -24px; +} +.x-btn-mr{ + width:3px; + background:no-repeat -3px -24px; +} +.x-btn-mc{ + background:repeat-x 0 -1096px; + vertical-align: middle; + text-align:center; + padding:0 5px; + cursor:pointer; + white-space:nowrap; +} +.x-btn-bl{ + width:3px; + height:3px; + background:no-repeat 0 -3px; +} +.x-btn-br{ + width:3px; + height:3px; + background:no-repeat -3px -3px; +} +.x-btn-bc{ + height:3px; + background:repeat-x 0 -15px; +} +.x-btn-over .x-btn-tl{ + background-position: -6px 0; +} +.x-btn-over .x-btn-tr{ + background-position: -9px 0; +} +.x-btn-over .x-btn-tc{ + background-position: 0 -9px; +} +.x-btn-over .x-btn-ml{ + background-position: -6px -24px; +} +.x-btn-over .x-btn-mr{ + background-position: -9px -24px; +} +.x-btn-over .x-btn-mc{ + background-position: 0 -2168px; +} +.x-btn-over .x-btn-bl{ + background-position: -6px -3px; +} +.x-btn-over .x-btn-br{ + background-position: -9px -3px; +} +.x-btn-over .x-btn-bc{ + background-position: 0 -18px; +} +.ext-webkit .x-btn-focus .x-btn-tl{ + background-position: -6px 0; +} +.ext-webkit .x-btn-focus .x-btn-tr{ + background-position: -9px 0; +} +.ext-webkit .x-btn-focus .x-btn-tc{ + background-position: 0 -9px; +} +.ext-webkit .x-btn-focus .x-btn-ml{ + background-position: -6px -24px; +} +.ext-webkit .x-btn-focus .x-btn-mr{ + background-position: -9px -24px; +} +.ext-webkit .x-btn-focus .x-btn-mc{ + background-position: 0 -2168px; +} +.ext-webkit .x-btn-focus .x-btn-bl{ + background-position: -6px -3px; +} +.ext-webkit .x-btn-focus .x-btn-br{ + background-position: -9px -3px; +} +.ext-webkit .x-btn-focus .x-btn-bc{ + background-position: 0 -18px; +} +.x-btn-click .x-btn-tl, .x-btn-menu-active .x-btn-tl, .x-btn-pressed .x-btn-tl{ + background-position: -12px 0 !important; +} +.x-btn-click .x-btn-tr, .x-btn-menu-active .x-btn-tr, .x-btn-pressed .x-btn-tr{ + background-position: -15px 0 !important; +} +.x-btn-click .x-btn-tc, .x-btn-menu-active .x-btn-tc, .x-btn-pressed .x-btn-tc{ + background-position: 0 -12px !important; +} +.x-btn-click .x-btn-ml, .x-btn-menu-active .x-btn-ml, .x-btn-pressed .x-btn-ml{ + background-position: -12px -24px !important; +} +.x-btn-click .x-btn-mr, .x-btn-menu-active .x-btn-mr, .x-btn-pressed .x-btn-mr{ + background-position: -15px -24px !important; +} +.x-btn-click .x-btn-mc, .x-btn-menu-active .x-btn-mc, .x-btn-pressed .x-btn-mc{ + background-position: 0 -3240px !important; +} +.x-btn-click .x-btn-bl, .x-btn-menu-active .x-btn-bl, .x-btn-pressed .x-btn-bl{ + background-position: -12px -3px !important; +} +.x-btn-click .x-btn-br, .x-btn-menu-active .x-btn-br, .x-btn-pressed .x-btn-br{ + background-position: -15px -3px !important; +} +.x-btn-click .x-btn-bc, .x-btn-menu-active .x-btn-bc, .x-btn-pressed .x-btn-bc{ + background-position: 0 -21px !important; +} +.x-btn-disabled *{ + cursor:default !important; +} +.x-btn-mc em.x-btn-arrow { + display:block; + background:transparent no-repeat right center; + padding-right:10px; +} +.x-btn-mc em.x-btn-split { + display:block; + background:transparent no-repeat right center; + padding-right:14px; +} +.x-btn-mc em.x-btn-arrow-bottom { + display:block; + background:transparent no-repeat center bottom; + padding-bottom:14px; +} +.x-btn-mc em.x-btn-split-bottom { + display:block; + background:transparent no-repeat center bottom; + padding-bottom:14px; +} +.x-btn-as-arrow .x-btn-mc em { + display:block; + background:transparent; + padding-bottom:14px; +} +.x-btn-group { + padding:1px; +} +.x-btn-group-header { + padding:2px; + text-align:center; +} +.x-btn-group-tc { + background: transparent repeat-x 0 0; + overflow:hidden; +} +.x-btn-group-tl { + background: transparent no-repeat 0 0; + padding-left:3px; + zoom:1; +} +.x-btn-group-tr { + background: transparent no-repeat right 0; + zoom:1; + padding-right:3px; +} +.x-btn-group-bc { + background: transparent repeat-x 0 bottom; + zoom:1; +} +.x-btn-group-bc .x-panel-footer { + zoom:1; +} +.x-btn-group-bl { + background: transparent no-repeat 0 bottom; + padding-left:3px; + zoom:1; +} +.x-btn-group-br { + background: transparent no-repeat right bottom; + padding-right:3px; + zoom:1; +} +.x-btn-group-mc { + border:0 none; + padding:1px 0 0 0; + margin:0; +} +.x-btn-group-mc .x-btn-group-body { + background:transparent; + border: 0 none; +} +.x-btn-group-ml { + background: transparent repeat-y 0 0; + padding-left:3px; + zoom:1; +} +.x-btn-group-mr { + background: transparent repeat-y right 0; + padding-right:3px; + zoom:1; +} +.x-btn-group-bc .x-btn-group-footer { + padding-bottom:6px; +} +.x-panel-nofooter .x-btn-group-bc { + height:3px; + font-size:0; + line-height:0; +} +.x-btn-group-bwrap { + overflow:hidden; + zoom:1; +} +.x-btn-group-body { + overflow:hidden; + zoom:1; +} +.x-btn-group-notitle .x-btn-group-tc { + background: transparent repeat-x 0 0; + overflow:hidden; + height:2px; +} +.x-toolbar{ + border-style:solid; + border-width:0 0 1px 0; + display: block; + padding:2px; + background:repeat-x top left; + position:relative; + left:0; + top:0; + zoom:1; + overflow:hidden; +} +.x-toolbar .x-item-disabled .x-btn-icon { + opacity: .35; + -moz-opacity: .35; + filter: alpha(opacity=35); +} +.x-toolbar td { + vertical-align:middle; +} +.x-toolbar td,.x-toolbar span,.x-toolbar input,.x-toolbar div,.x-toolbar select,.x-toolbar label{ + white-space: nowrap; +} +.x-toolbar .x-item-disabled { + cursor:default; + opacity:.6; + -moz-opacity:.6; + filter:alpha(opacity=60); +} + +.x-toolbar .x-item-disabled *{ + cursor:default; +} + +.x-toolbar .x-toolbar-cell { + vertical-align:middle; +} +.x-toolbar .x-btn-tl, .x-toolbar .x-btn-tr, .x-toolbar .x-btn-tc, .x-toolbar .x-btn-ml, .x-toolbar .x-btn-mr, +.x-toolbar .x-btn-mc, .x-toolbar .x-btn-bl, .x-toolbar .x-btn-br, .x-toolbar .x-btn-bc +{ + background-position: 500px 500px; +} +.x-toolbar .x-btn-over .x-btn-tl{ + background-position: -6px 0; +} +.x-toolbar .x-btn-over .x-btn-tr{ + background-position: -9px 0; +} +.x-toolbar .x-btn-over .x-btn-tc{ + background-position: 0 -9px; +} +.x-toolbar .x-btn-over .x-btn-ml{ + background-position: -6px -24px; +} +.x-toolbar .x-btn-over .x-btn-mr{ + background-position: -9px -24px; +} +.x-toolbar .x-btn-over .x-btn-mc{ + background-position: 0 -2168px; +} +.x-toolbar .x-btn-over .x-btn-bl{ + background-position: -6px -3px; +} +.x-toolbar .x-btn-over .x-btn-br{ + background-position: -9px -3px; +} +.x-toolbar .x-btn-over .x-btn-bc{ + background-position: 0 -18px; +} +.x-toolbar .x-btn-click .x-btn-tl, .x-toolbar .x-btn-menu-active .x-btn-tl, .x-toolbar .x-btn-pressed .x-btn-tl{ + background-position: -12px 0; +} +.x-toolbar .x-btn-click .x-btn-tr, .x-toolbar .x-btn-menu-active .x-btn-tr, .x-toolbar .x-btn-pressed .x-btn-tr{ + background-position: -15px 0; +} +.x-toolbar .x-btn-click .x-btn-tc, .x-toolbar .x-btn-menu-active .x-btn-tc, .x-toolbar .x-btn-pressed .x-btn-tc{ + background-position: 0 -12px; +} +.x-toolbar .x-btn-click .x-btn-ml, .x-toolbar .x-btn-menu-active .x-btn-ml, .x-toolbar .x-btn-pressed .x-btn-ml{ + background-position: -12px -24px; +} +.x-toolbar .x-btn-click .x-btn-mr, .x-toolbar .x-btn-menu-active .x-btn-mr, .x-toolbar .x-btn-pressed .x-btn-mr{ + background-position: -15px -24px; +} +.x-toolbar .x-btn-click .x-btn-mc, .x-toolbar .x-btn-menu-active .x-btn-mc, .x-toolbar .x-btn-pressed .x-btn-mc{ + background-position: 0 -3240px; +} +.x-toolbar .x-btn-click .x-btn-bl, .x-toolbar .x-btn-menu-active .x-btn-bl, .x-toolbar .x-btn-pressed .x-btn-bl{ + background-position: -12px -3px; +} +.x-toolbar .x-btn-click .x-btn-br, .x-toolbar .x-btn-menu-active .x-btn-br, .x-toolbar .x-btn-pressed .x-btn-br{ + background-position: -15px -3px; +} +.x-toolbar .x-btn-click .x-btn-bc, .x-toolbar .x-btn-menu-active .x-btn-bc, .x-toolbar .x-btn-pressed .x-btn-bc{ + background-position: 0 -21px; +} +.x-toolbar div.xtb-text{ + padding:2px 2px 0; + line-height:16px; + display:block; +} +.x-toolbar .xtb-sep { + background-position: center; + background-repeat: no-repeat; + display: block; + font-size: 1px; + height: 16px; + width:4px; + overflow: hidden; + cursor:default; + margin: 0 2px 0; + border:0; +} +.x-toolbar .xtb-spacer { + width:2px; +} +.x-tbar-page-number{ + width:24px; + height:14px; +} +.x-paging-info { + position:absolute; + top:5px; + right: 8px; +} +.x-toolbar-ct { + width:100%; +} +.x-panel-tbar, .x-panel-bbar, .x-window-tbar, .x-window-bbar, .x-tab-panel-tbar, .x-tab-panel-bbar, .x-plain-tbar, .x-plain-bbar { + overflow:hidden; + zoom:1; +} +.x-toolbar-more .x-btn-small .x-btn-text{ + height: 16px; + width: 12px; +} +.x-toolbar-more em.x-btn-arrow { + display:inline; + background:transparent; + padding-right:0; +} +.x-toolbar-more .x-btn-mc em.x-btn-arrow { + background-image: none; +} +div.x-toolbar-no-items { + color:gray !important; + padding:5px 10px !important; +}.x-resizable-handle { + position:absolute; + z-index:100; + font-size:1px; + line-height:6px; + overflow:hidden; + filter:alpha(opacity=0); + opacity:0; + zoom:1; +} +.x-resizable-handle-east{ + width:6px; + cursor:e-resize; + right:0; + top:0; + height:100%; +} +.ext-ie .x-resizable-handle-east { + margin-right:-1px; +} +.x-resizable-handle-south{ + width:100%; + cursor:s-resize; + left:0; + bottom:0; + height:6px; +} +.ext-ie .x-resizable-handle-south { + margin-bottom:-1px; +} +.x-resizable-handle-west{ + width:6px; + cursor:w-resize; + left:0; + top:0; + height:100%; +} +.x-resizable-handle-north{ + width:100%; + cursor:n-resize; + left:0; + top:0; + height:6px; +} +.x-resizable-handle-southeast{ + width:6px; + cursor:se-resize; + right:0; + bottom:0; + height:6px; + z-index:101; +} +.x-resizable-handle-northwest{ + width:6px; + cursor:nw-resize; + left:0; + top:0; + height:6px; + z-index:101; +} +.x-resizable-handle-northeast{ + width:6px; + cursor:ne-resize; + right:0; + top:0; + height:6px; + z-index:101; +} +.x-resizable-handle-southwest{ + width:6px; + cursor:sw-resize; + left:0; + bottom:0; + height:6px; + z-index:101; +} +.x-resizable-over .x-resizable-handle, .x-resizable-pinned .x-resizable-handle{ + filter:alpha(opacity=100); + opacity:1; +} +.x-resizable-over .x-resizable-handle-east, .x-resizable-pinned .x-resizable-handle-east, +.x-resizable-over .x-resizable-handle-west, .x-resizable-pinned .x-resizable-handle-west +{ + background-position: left; +} +.x-resizable-over .x-resizable-handle-south, .x-resizable-pinned .x-resizable-handle-south, +.x-resizable-over .x-resizable-handle-north, .x-resizable-pinned .x-resizable-handle-north +{ + background-position: top; +} +.x-resizable-over .x-resizable-handle-southeast, .x-resizable-pinned .x-resizable-handle-southeast{ + background-position: top left; +} +.x-resizable-over .x-resizable-handle-northwest, .x-resizable-pinned .x-resizable-handle-northwest{ + background-position:bottom right; +} +.x-resizable-over .x-resizable-handle-northeast, .x-resizable-pinned .x-resizable-handle-northeast{ + background-position: bottom left; +} +.x-resizable-over .x-resizable-handle-southwest, .x-resizable-pinned .x-resizable-handle-southwest{ + background-position: top right; +} +.x-resizable-proxy{ + border: 1px dashed; + position:absolute; + overflow:hidden; + display:none; + left:0; + top:0; + z-index:50000; +} +.x-resizable-overlay{ + width:100%; + height:100%; + display:none; + position:absolute; + left:0; + top:0; + z-index:200000; + -moz-opacity: 0; + opacity:0; + filter: alpha(opacity=0); +} +.x-grid3 { + position: relative; + overflow: hidden; +} + +.x-grid-panel .x-panel-body { + overflow: hidden !important; +} + +.x-grid-panel .x-panel-mc .x-panel-body { + border: 1px solid; +} + +.x-grid3 .x-grid3-row-table { + table-layout: fixed; +} + +.x-grid3-viewport { + overflow: hidden; +} + +.x-grid3-hd-row .x-grid3-hd,.x-grid3-row .x-grid3-hd,.x-grid3-summary-row .x-grid3-hd { + -moz-outline: none; + -moz-user-focus: normal; +} + + .x-grid3-summary-row{ + -moz-user-select: none; + -khtml-user-select: none; + -webkit-user-select: ignore; +} + +.x-grid3-row td.x-grid3-cell,.x-grid3-summary-row td.x-grid3-cell { + line-height: 14px; + vertical-align: top; + padding-left: 1px; + padding-right: 1px; + -moz-outline: none; +} + +.x-grid3-hd-row .x-grid3-hd { + line-height: 15px; + vertical-align: middle; + border-left: 1px solid; + border-right: 1px solid; +} + +.x-grid3-hd-row .x-grid3-marker-hd { + padding: 3px; +} + +.x-grid3-row .x-grid3-marker { + padding: 3px; +} + +.x-grid3-cell-inner,.x-grid3-hd-inner { + overflow: hidden; + -o-text-overflow: ellipsis; + text-overflow: ellipsis; + padding: 3px 3px 3px 5px; + white-space: nowrap; +} + +.x-grid3-hd-inner { + position: relative; + cursor: inherit; + padding: 4px 3px 4px 5px; + vertical-align: middle; +} + +.x-grid3-row-body { + white-space: normal; + font-size: 11px; +} + +.x-grid3-body-cell { + -moz-outline: 0 none; + outline: 0 none; +} + +.ext-ie .x-grid3-cell-inner,.ext-ie .x-grid3-hd-inner { + width: 100%; +} + +.ext-strict .x-grid3-cell-inner,.ext-strict .x-grid3-hd-inner { + width: auto; +} + +.x-grid-row-loading { + background: no-repeat center center; +} + +.x-grid-page { + overflow: hidden; +} + +.x-grid3-row { + cursor: default; + border: 1px solid; + width: 100%; +} + +.x-grid3-row-over { + border: 1px solid; + background: repeat-x left top; +} + +.x-grid3-resize-proxy { + width: 1px; + left: 0; + cursor: e-resize; + cursor: col-resize; + position: absolute; + top: 0; + height: 100px; + overflow: hidden; + visibility: hidden; + border: 0 none; + z-index: 7; +} + +.x-grid3-resize-marker { + width: 1px; + left: 0; + position: absolute; + top: 0; + height: 100px; + overflow: hidden; + visibility: hidden; + border: 0 none; + z-index: 7; +} + +.x-grid3-focus { + position: absolute; + left: 0; + top: 0; + width: 1px; + height: 1px; + line-height: 1px; + font-size: 1px; + -moz-outline: 0 none; + outline: 0 none; + -moz-user-select: text; + -khtml-user-select: text; + -webkit-user-select: ignore; +} + +.x-grid3-header { + background: repeat-x 0 bottom; + cursor: default; + zoom: 1; + padding: 0px 0 0 0; +} + +.x-grid3-header-pop { + border-left: 1px solid; + float: right; + clear: none; +} + +.x-grid3-header-pop-inner { + border-left: 1px solid; + width: 14px; + height: 19px; + background: transparent no-repeat center center; +} + +.ext-ie .x-grid3-header-pop-inner { + width: 15px; +} + +.ext-strict .x-grid3-header-pop-inner { + width: 14px; +} + +.x-grid3-header-inner { + overflow: hidden; + zoom: 1; + float: left; +} + +.x-grid3-header-offset { + padding-left: 1px; +} + +td.x-grid3-hd-over,td.sort-desc,td.sort-asc,td.x-grid3-hd-menu-open { + border-left: 1px solid; + border-right: 1px solid; +} + +td.x-grid3-hd-over .x-grid3-hd-inner,td.sort-desc .x-grid3-hd-inner,td.sort-asc .x-grid3-hd-inner,td.x-grid3-hd-menu-open .x-grid3-hd-inner + { + background: repeat-x left bottom; +} + +.x-grid3-sort-icon { + background-repeat: no-repeat; + display: none; + height: 4px; + width: 13px; + margin-left: 3px; + vertical-align: middle; +} + +.sort-asc .x-grid3-sort-icon,.sort-desc .x-grid3-sort-icon { + display: inline; +} + +.ext-strict .ext-ie .x-grid3-header-inner,.ext-strict .ext-ie6 .x-grid3-hd { + position: relative; +} + +.ext-strict .ext-ie6 .x-grid3-hd-inner { + position: static; +} + +.x-grid3-body { + zoom: 1; +} + +.x-grid3-scroller { + overflow: auto; + zoom: 1; + position: relative; +} + +.x-grid3-cell-text,.x-grid3-hd-text { + display: block; + padding: 3px 5px 3px 5px; +} + +.x-grid3-split { + background-position: center; + background-repeat: no-repeat; + cursor: e-resize; + cursor: col-resize; + display: block; + font-size: 1px; + height: 16px; + overflow: hidden; + position: absolute; + top: 2px; + width: 6px; + z-index: 3; +} + +.x-dd-drag-proxy .x-grid3-hd-inner { + background: repeat-x left bottom; + width: 120px; + padding: 3px; + border: 1px solid; + overflow: hidden; +} + +.col-move-top,.col-move-bottom { + width: 9px; + height: 9px; + position: absolute; + top: 0; + line-height: 1px; + font-size: 1px; + overflow: hidden; + visibility: hidden; + z-index: 20000; + background: transparent no-repeat left top; +} + +.x-grid3-row-selected { + border: 1px dotted; +} + +.x-grid3-locked td.x-grid3-row-marker,.x-grid3-locked .x-grid3-row-selected td.x-grid3-row-marker + { + background: repeat-x 0 bottom !important; + vertical-align: middle !important; + padding: 0; + border-top: 1px solid; + border-bottom: none !important; + border-right: 1px solid !important; + text-align: center; +} + +.x-grid3-locked td.x-grid3-row-marker div,.x-grid3-locked .x-grid3-row-selected td.x-grid3-row-marker div + { + padding: 0 4px; + text-align: center; +} + +.x-grid3-dirty-cell { + background: transparent no-repeat 0 0; +} + +.x-grid3-invalid-cell { + background: repeat-x bottom; +} + +.x-grid3-topbar,.x-grid3-bottombar { + overflow: hidden; + display: none; + zoom: 1; + position: relative; +} + +.x-grid3-topbar .x-toolbar { + border-right: 0 none; +} + +.x-grid3-bottombar .x-toolbar { + border-right: 0 none; + border-bottom: 0 none; + border-top: 1px solid; +} + +.x-props-grid .x-grid3-cell { + padding: 1px; +} + +.x-props-grid .x-grid3-td-name .x-grid3-cell-inner { + background: transparent repeat-y -16px !important; + padding-left: 12px; +} + +.x-props-grid .x-grid3-body .x-grid3-td-name { + padding: 1px; + padding-right: 0; + border: 0 none; + border-right: 1px solid; +} + +.x-grid3-col-dd { + border: 0 none; + padding: 0; + background: transparent; +} + +.x-dd-drag-ghost .x-grid3-dd-wrap { + padding: 1px 3px 3px 1px; +} + +.x-grid3-hd { + -moz-user-select: none; + -khtml-user-select: none; + -webkit-user-select: ignore; +} + +.x-grid3-hd-btn { + display: none; + position: absolute; + width: 14px; + background: no-repeat left center; + right: 0; + top: 0; + z-index: 2; + cursor: pointer; +} + +.x-grid3-hd-over .x-grid3-hd-btn,.x-grid3-hd-menu-open .x-grid3-hd-btn { + display: block; +} + +a.x-grid3-hd-btn:hover { + background-position: -14px center; +} + +.x-grid3-body .x-grid3-td-expander { + background: transparent repeat-y right; +} + +.x-grid3-body .x-grid3-td-expander .x-grid3-cell-inner { + padding: 0 !important; + height: 100%; +} + +.x-grid3-row-expander { + width: 100%; + height: 18px; + background-position: 4px 2px; + background-repeat: no-repeat; + background-color: transparent; +} + +.x-grid3-row-collapsed .x-grid3-row-expander { + background-position: 4px 2px; +} + +.x-grid3-row-expanded .x-grid3-row-expander { + background-position: -21px 2px; +} + +.x-grid3-row-collapsed .x-grid3-row-body { + display: none !important; +} + +.x-grid3-row-expanded .x-grid3-row-body { + display: block !important; +} + +.x-grid3-body .x-grid3-td-checker { + background: transparent repeat-y right; +} + +.x-grid3-body .x-grid3-td-checker .x-grid3-cell-inner,.x-grid3-header .x-grid3-td-checker .x-grid3-hd-inner { + padding: 0 !important; + height: 100%; +} + +.x-grid3-group-checker { + float: left; +} + +.x-grid3-row-checker,.x-grid3-hd-checker { + width: 100%; + height: 18px; + background-position: 2px 2px; + background-repeat: no-repeat; + background-color: transparent; +} +.x-grid3-hd-checker { + padding-bottom: 0px !important; +} +.x-grid3-row .x-grid3-row-checker { + background-position: 2px 2px; +} + +.x-grid3-row-selected .x-grid3-row-checker,.x-grid3-hd-checker-on .x-grid3-hd-checker,.x-grid3-row-checked .x-grid3-row-checker + { + background-position: -23px 2px; +} + +.x-grid3-hd-checker { + background-position: 2px 3px; +} + +.x-grid3-hd-checker-on .x-grid3-hd-checker { + background-position: -23px 3px; +} + +.x-grid3-body .x-grid3-td-numberer { + background: transparent repeat-y right; +} + +.x-grid3-body .x-grid3-td-numberer .x-grid3-cell-inner { + padding: 3px 5px 0 0 !important; + text-align: right; +} + +.x-grid3-body .x-grid3-td-row-icon { + background: transparent repeat-y right; + vertical-align: top; + text-align: center; +} + +.x-grid3-body .x-grid3-td-row-icon .x-grid3-cell-inner { + padding: 0 !important; + background-position: center center; + background-repeat: no-repeat; + width: 16px; + height: 16px; + margin-left: 2px; + margin-top: 3px; +} + +.x-grid3-body .x-grid3-row-selected .x-grid3-td-numberer,.x-grid3-body .x-grid3-row-selected .x-grid3-td-checker,.x-grid3-body .x-grid3-row-selected .x-grid3-td-expander + { + background: transparent repeat-y right; +} + +.x-grid3-body .x-grid3-check-col-td .x-grid3-cell-inner { + padding: 1px 0 0 0 !important; +} + +.x-grid3-check-col { + width: 100%; + height: 16px; + background-position: center center; + background-repeat: no-repeat; + background-color: transparent; +} + +.x-grid3-check-col-on { + width: 100%; + height: 16px; + background-position: center center; + background-repeat: no-repeat; + background-color: transparent; +} + +.x-grid-group,.x-grid-group-body,.x-grid-group-hd { + zoom: 1; +} + +.x-grid-group-hd { + border-bottom: 2px solid; + cursor: pointer; + padding-top: 6px; +} + +.x-grid-group-hd .x-grid-group-div { + background: transparent no-repeat 3px -47px; + padding: 4px 4px 4px 17px; +} + +.x-grid-group-collapsed .x-grid-group-hd .x-grid-group-div { + background-position: 3px 3px; +} + +.x-grid-group-collapsed .x-grid-group-body { + display: none; +} + +.x-grid-empty { + padding: 10px; +} + +.ext-ie7 .x-grid-panel .x-panel-bbar { + position: relative; +} + +.x-grid-with-col-lines .x-grid3-row td.x-grid3-cell { + padding-right: 0; + border-right: 1px solid; +} + +.ext-ie6 .x-grid3-header { + position: relative; +} + +.x-grid3-check-col-disabled { + width: 100%; + height: 16px; + background-position: center center; + background-repeat: no-repeat; +} + +.x-row-editor-header { + height: 2px; + overflow: hidden; +} +.x-row-editor-footer { + height: 2px; + overflow: hidden; +} + +.ext-ie .x-row-editor-footer { + margin-top: -1px; +} + +.x-row-editor-body { + overflow: hidden; + zoom: 1; + padding-top: 2px; +} + +.x-row-editor .x-btns { + position: absolute; + top: 28px; + left: 20px; + padding-left: 5px; +} + +.x-row-editor .x-btns .x-plain-bwrap { + padding-right: 5px; +} + +.x-row-editor .x-btns .x-plain-body { + height: 31px; +} + +.x-row-editor .x-btns .x-table-layout-cell { + padding: 3px; +} + +.x-grid3-footer { + background: #f7f7f7 none repeat scroll 0 0; + border-top: 1px solid #DDDDDD; + border-bottom: 1px solid #DDDDDD; + display: block; + overflow: hidden; + position: relative; +} + +.x-grid3-footer-row { + border-top: 1px solid #EEEEEE; + background-color: #f7f7f7; + -moz-user-select: none; + -khtml-user-select: none; + -webkit-user-select: ignore; +} + +.x-grid3-footer-row td { + line-height: 13px; + vertical-align: top; + padding-left: 1px; + padding-right: 1px; + font: normal 11px arial, tahoma, helvetica, sans-serif; +} +.ext-ie6 .x-grid3 .x-editor .x-form-text,.ext-ie7 .x-grid3 .x-editor .x-form-text{ + top:-1px; +} + +.ext-ie8-compatibility .x-grid3 .x-editor .x-form-text{ + top:0; +} + +.x-grid-panel .x-livegrid-scroller { + z-index: 1; + position: absolute; + right: 0px; + width: 18px; + overflow-y: scroll; + overflow-x: hidden; +} + +.x-grid3-group-checker div { + width: 14px; + height: 18px; + background-position: -1 -2px; + background-repeat: no-repeat; + background-color: transparent; +} + +.x-grid-group-hd .x-grid3-group-check { + background-image:url(../images/default/menu/checked.gif); +} + +.x-grid-group-hd .x-grid3-group-uncheck { + background-image:url(../images/default/menu/unchecked.gif); +} +.x-dd-drag-proxy{ + position:absolute; + left:0; + top:0; + visibility:hidden; + z-index:15000; +} +.x-dd-drag-ghost{ + -moz-opacity: 0.85; + opacity:.85; + filter: alpha(opacity=85); + border: 1px solid; + padding:3px; + padding-left:20px; + white-space:nowrap; +} +.x-dd-drag-repair .x-dd-drag-ghost{ + -moz-opacity: 0.4; + opacity:.4; + filter: alpha(opacity=40); + border:0 none; + padding:0; + background-color:transparent; +} +.x-dd-drag-repair .x-dd-drop-icon{ + visibility:hidden; +} +.x-dd-drop-icon{ + position:absolute; + top:3px; + left:3px; + display:block; + width:16px; + height:16px; + background-color:transparent; + background-position: center; + background-repeat: no-repeat; + z-index:1; +} +.x-view-selector { + position:absolute; + left:0; + top:0; + width:0; + border:1px dotted; + opacity: .5; + -moz-opacity: .5; + filter:alpha(opacity=50); + zoom:1; +} + +.x-dd-cursor { + cursor: default !important; +} + +.x-insert-bar { + position: absolute; + + z-index: 99999; +} + +.x-insert-bar td { + line-height: 1px; + font-size: 1px; +} + +.x-insert-left { + background: url(../images/gxt/dd/insert-bg.gif) no-repeat; +} + +.x-insert-mid { + background: url(../images/gxt/dd/insert-bg.gif) repeat-x 0 -12px; +} + +.x-insert-right { + background: url(../images/gxt/dd/insert-bg.gif) no-repeat 0px -6px; +} +.tree-folder { + background: url(../images/gxt/icons/folder-closed.gif) no-repeat center + left !important; +} + +.tree-folder-open { + background: url(../images/gxt/icons/folder.gif) no-repeat center left + !important; +} + +.my-tree { + cursor: default; + font-size: 11px; + -moz-outline: none; + -moz-user-focus: none; +} + +.my-root-item { + padding: 4px; +} + +.my-tree-item,.my-tree-item table,.my-tree-item table td { + -moz-outline: none; + -moz-user-focus: normal; + font-size: 11px; +} + +.my-tree-item td { + height: 19px; +} + +.my-tree-indent { + line-height: 1px; + font-size: 1px; +} + +.my-tree-joint div { + width: 15px; + height: 19px; + line-height: 1px; + font-size: 1px; +} + +.my-tree-left,.my-tree-left div,.my-tree-right { + line-height: 1px; + font-size: 1px; + width: 3px; +} + +.my-tree-left div,.my-tree-right div { + width: 3px; +} + +.my-tree-item,.my-treeitem-wrap { + -moz-outline: none; + -moz-user-focus: normal; +} + +.my-tree-check div { + width: 17px; + height: 17px; + line-height: 1px; + font-size: 1px; +} + +.my-tree-icon div { + width: 16px; + height: 17px; + cursor: pointer; + background-repeat: no-repeat; + background-position: center; +} + +.my-tree-item-text span { + font-family: arial, tahoma, helvetica, sans-serif; + font-size: 12px; + white-space: nowrap; + padding-left: 3px; + padding-right: 3px; + display: block; + height: 15px; + cursor: pointer; +} + +.my-tree-over .my-tree-left { + background: url(../images/gxt/shared/select-19-bg.gif) no-repeat left + -57px; +} + +.my-tree-over .my-tree-right { + background: url(../images/gxt/shared/select-19-bg.gif) no-repeat right + -76px; +} + +.my-tree-over .my-tree-check,.my-tree-over .my-tree-icon,.my-tree-over .my-tree-item-text + { + background: url(../images/gxt/shared/select-19-bg.gif) left -95px; +} + +.my-tree-sel .my-tree-left { + background: url(../images/gxt/shared/select-19-bg.gif) no-repeat left + 0px; +} + +.my-tree-sel .my-tree-right { + background: url(../images/gxt/shared/select-19-bg.gif) no-repeat right + -19px; +} + +.my-tree-sel .my-tree-check,.my-tree-sel .my-tree-icon,.my-tree-sel .my-tree-item-text + { + background: url(../images/gxt/shared/select-19-bg.gif) left -38px; +} + +.my-tree-drop .my-tree-left { + background: url(../images/gxt/shared/select-19-bg.gif) no-repeat left + -115px; +} + +.my-tree-drop .my-tree-right { + background: url(../images/gxt/shared/select-19-bg.gif) no-repeat right + -133px; +} + +.my-tree-drop .my-tree-check,.my-tree-drop .my-tree-icon,.my-tree-drop .my-tree-item-text + { + background: url(../images/gxt/shared/select-19-bg.gif) left -152px; +} + +.my-tree-close { + background: url(../images/gxt/tree/vnode_transparent.gif) no-repeat 0px + 1px; +} + +.my-tree-open { + background: url(../images/gxt/tree/vnode_transparent.gif) no-repeat 0px + -32px; +} + +.my-tree-joint-over .my-tree-open { + background: url(../images/gxt/tree/vnode_transparent.gif) no-repeat 0px + -48px; +} + +.my-tree-joint-over .my-tree-close { + background: url(../images/gxt/tree/vnode_transparent.gif) no-repeat 0px + -15px; +} + +.my-tree-notchecked { + background: url(../images/gxt/tree/notchecked.gif) no-repeat 0px 50%; +} + +.my-tree-checked { + background: url(../images/gxt/tree/checked.gif) no-repeat 0px 50%; +} + +.my-tree-loading .tree-folder { + background: url(../images/gxt/icons/wait.gif) no-repeat 0px -1px + !important; +} + +.my-tree-loading .my-tree-item-text span { + font-style: italic; +} + +.x-ftree-selected .x-ftree-text { + background-color: #d9e8fb; +} + +.x-ftree-node-over .x-ftree-text { + background-color: #eee; +} + +.x-ftree-item { + line-height: 18px; +} + +.x-ftree-joint,.x-ftree-icon { + border: 0 none; + height: 18px; + margin: 0; + padding: 0; + vertical-align: top; + width: 16px; + background-position: center; + background-repeat: no-repeat; +} + +.x-ftree-text { + color: black; + font: normal 11px arial, tahoma, helvetica, sans-serif; + white-space: nowrap; + text-decoration: none; + color: black; + padding-left: 4px; + vertical-align: middle; + line-height: 18px; + padding: 2px 4px 4px 4px; +} + +/* some default icons for leaf/folder */ +.x-ftree-expanded .x-ftree-icon { + background-image: url(../images/default/tree/folder-open.gif); +} + +.x-ftree-leaf .x-ftree-icon { + background-image: url(../images/default/tree/leaf.gif); +} + +.x-ftree-collapsed .x-ftree-icon { + background-image: url(../images/gxt/icons/folder-closed.gif); +} + +/* Arrows */ +.x-ftree-arrows .x-ftree-joint { + background: transparent; +} + +.x-ftree-arrows .x-ftree-joint-plus { + background: transparent url(../images/default/tree/arrows.gif) no-repeat + 0 0; +} + +.x-ftree-arrows .x-ftree-joint-minus { + background: transparent url(../images/default/tree/arrows.gif) no-repeat + -16px 0; +} + +.x-ftree-arrows .x-ftree-ec-over .x-ftree-joint-plus { + background-position: -32px 0; +} + +.x-ftree-arrows .x-ftree-ec-over .x-ftree-joint-minus { + background-position: -48px 0; +} + +.x-ftree2-selected { + background-color: #d9e8fb !important; +} + +.x-ftree2-node-over { + background-color: #eee; +} + +.x-ftree2-node-drop { + background-color: #defadc; +} + +.x-ftree2-joint,.x-ftree2-icon { + border: 0 none; + height: 18px; + margin: 0; + padding: 0; + vertical-align: top; + width: 16px; + background-position: center; + background-repeat: no-repeat; +} + +.x-ftree2-joint div { + width: 16px; +} + +.x-ftree2-el-ct { + display: none; +} + +.x-ftree2-node { + padding-bottom: 1px; +} + +.x-ftree2-text { + vertical-align: middle !important; + white-space: nowrap !important; +} + +.x-ftree2-text span { + color: black; + font: normal 11px arial, tahoma, helvetica, sans-serif; + white-space: nowrap; + text-decoration: none; + color: black; + padding: 2px 4px 2px 1px; + display: block; +} + +.ext-ie .x-ftree2-text span { + padding-left: 3px; +} + +.x-ftree2-check { + width: 17px; +} + +.x-ftree2-check div { + width: 17px; + height: 17px; +} + +/* some default icons for leaf/folder */ +.x-ftree2-expanded .x-ftree2-icon { + background-image: url(../images/default/tree/folder-open.gif); +} + +.x-ftree2-leaf .x-ftree2-icon { + background-image: url(../images/default/tree/leaf.gif); +} + +.x-ftree2-collapsed .x-ftree2-icon { + background-image: url(../images/gxt/icons/folder-closed.gif); +} + +/* Arrows */ +.x-ftree2-arrows .x-ftree2-joint { + background: transparent; +} + +.x-ftree2-arrows .x-ftree2-joint-plus { + background: transparent url(../images/default/tree/arrows.gif) no-repeat + 0 0; +} + +.x-ftree2-arrows .x-ftree2-joint-minus { + background: transparent url(../images/default/tree/arrows.gif) no-repeat + -16px 0; +} + +.x-ftree2-arrows .x-ftree2-ec-over .x-ftree2-joint-plus { + background-position: -32px 0; +} + +.x-ftree2-arrows .x-ftree2-ec-over .x-ftree2-joint-minus { + background-position: -48px 0; +} + +.x-treegrid { + -moz-outline: none; + -moz-user-focus: none; +} + +.x-treegrid .x-treegrid-column .x-grid3-cell-inner { + padding: 0px !important; +} + +.x-tree3 { + cursor: default; + -moz-outline: none; + -moz-user-focus: none; +} + +.x-tree3-node { + cursor: default; +} + +.x-tree3-el { + white-space: nowrap; + height: 21px; + position: relative; +} + +.x-tree3-node-text { + white-space: nowrap; + line-height: 11px; + text-decoration: none; + padding: 0 0 0 3px; + position: relative; + top: -4px; +} + +.x-tree3-node-ct { + display: none; +} + +.x-tree3-node-text-widget { + position: static !important; + padding: 0px !important; +}.x-date-picker { + border: 1px solid; + border-top:0 none; + position:relative; +} +.x-date-picker a { + -moz-outline:0 none; + outline:0 none; +} +.x-date-inner, .x-date-inner td, .x-date-inner th{ + border-collapse:separate; +} +.x-date-middle,.x-date-left,.x-date-right { + background: repeat-x 0 -83px; + overflow:hidden; +} +.x-date-middle .x-btn-tc,.x-date-middle .x-btn-tl,.x-date-middle .x-btn-tr, +.x-date-middle .x-btn-mc,.x-date-middle .x-btn-ml,.x-date-middle .x-btn-mr, +.x-date-middle .x-btn-bc,.x-date-middle .x-btn-bl,.x-date-middle .x-btn-br{ + background:transparent !important; + vertical-align:middle; +} +.x-date-middle .x-btn-mc em.x-btn-arrow { + background:transparent no-repeat right 0; +} +.x-date-right, .x-date-left { + width:18px; +} +.x-date-right{ + text-align:right; +} +.x-date-middle { + padding-top:2px; + padding-bottom:2px; + width:130px; +} +.x-date-right a, .x-date-left a{ + display:block; + width:16px; + height:16px; + background-position: center; + background-repeat: no-repeat; + cursor:pointer; + -moz-opacity: 0.6; + opacity:.6; + filter: alpha(opacity=60); +} +.x-date-right a:hover, .x-date-left a:hover{ + -moz-opacity: 1; + opacity:1; + filter: alpha(opacity=100); +} +.x-date-right a { + margin-right:2px; + text-decoration:none !important; +} +.x-date-left a{ + margin-left:2px; + text-decoration:none !important; +} +table.x-date-inner { + width:100%; + table-layout:fixed; +} +.x-date-inner th { + width:25px; +} +.x-date-inner th { + background: repeat-x left top; + text-align:right !important; + border-bottom: 1px solid; + cursor:default; + padding:0; + border-collapse:separate; +} +.x-date-inner th span { + display:block; + padding:2px; + padding-right:7px; +} +.x-date-inner td { + border: 1px solid; + text-align:right; + padding:0; +} +.x-date-inner a { + padding:2px 5px; + display:block; + text-decoration:none; + text-align:right; + zoom:1; +} +.x-date-inner .x-date-active{ + cursor:pointer; + color:black; +} +.x-date-inner .x-date-selected a{ + background: repeat-x left top; + border:1px solid; + padding:1px 4px; +} +.x-date-inner .x-date-today a{ + border: 1px solid; + padding:1px 4px; +} +.x-date-inner .x-date-prevday a,.x-date-inner .x-date-nextday a { + text-decoration:none !important; +} +.x-date-bottom { + padding:4px; + border-top: 1px solid; + background: repeat-x left top; +} +.x-date-inner a:hover, .x-date-inner .x-date-disabled a:hover{ + text-decoration:none !important; +} +.x-date-inner .x-date-disabled a { + cursor:default; +} +.x-date-mmenu .x-menu-item { + padding:1px 24px 1px 4px; + white-space: nowrap; +} +.x-date-mmenu .x-menu-item .x-menu-item-icon { + width:10px; + height:10px; + margin-right:5px; + background-position:center -4px !important; +} +.x-date-mp { + position:absolute; + left:0; + top:0; + display:none; +} +.x-date-mp td { + padding:2px; + font:normal 11px arial, helvetica,tahoma,sans-serif; +} +td.x-date-mp-month,td.x-date-mp-year,td.x-date-mp-ybtn { + border: 0 none; + text-align:center; + vertical-align: middle; + width:25%; +} +.x-date-mp-ok { + margin-right:3px; +} +.x-date-mp-btns button { + text-decoration:none; + text-align:center; + text-decoration:none !important; + border:1px solid; + padding:1px 3px 1px; + cursor:pointer; +} +.x-date-mp-btns { + background: repeat-x left top; +} +.x-date-mp-btns td { + border-top: 1px solid; + text-align:center; +} +td.x-date-mp-month a,td.x-date-mp-year a { + display:block; + padding:2px 4px; + text-decoration:none; + text-align:center; +} +td.x-date-mp-month a:hover,td.x-date-mp-year a:hover { + text-decoration:none; + cursor:pointer; +} +td.x-date-mp-sel a { + padding:1px 3px; + background: repeat-x left top; + border:1px solid; +} +.x-date-mp-ybtn a { + overflow:hidden; + width:15px; + height:15px; + cursor:pointer; + background:transparent no-repeat; + display:block; + margin:0 auto; +} +.x-date-mp-ybtn a.x-date-mp-next { + background-position:0 -120px; +} +.x-date-mp-ybtn a.x-date-mp-next:hover { + background-position:-15px -120px; +} +.x-date-mp-ybtn a.x-date-mp-prev { + background-position:0 -105px; +} +.x-date-mp-ybtn a.x-date-mp-prev:hover { + background-position:-15px -105px; +} +.x-date-mp-ybtn { + text-align:center; +} +td.x-date-mp-sep { + border-right:1px solid; +} + +.x-date-picker, .x-date-picker a { + font-size: 11px; +} + +.x-date-right-icon { + background-image: url(../images/default/shared/right-btn.gif); + margin-right: 2px; + text-decoration: none !important; +} + +.x-date-left-icon { + background-image: url(../images/default/shared/left-btn.gif); + margin-left: 4px; + text-decoration: none !important; +} + +.x-date-days { + table-layout: fixed; + width: 100%; +} + +.x-date-days td { + width: 25px; + border: none; +} + +.x-date-days td span { + display: block; + padding: 2px 7px 2px 2px; +} + +.x-date-days td { + background: #DFECFB url(../images/default/shared/glass-bg.gif) repeat-x scroll left top; + border-bottom: 1px solid #A3BAD9; + border-collapse: separate; + color: #233D6D; + cursor: default; + font-family: arial, helvetica, tahoma, sans-serif; + font-size: 10px; + font-size-adjust: none; + font-stretch: normal; + font-style: normal; + font-variant: normal; + font-weight: normal; + line-height: normal; + padding: 0pt; + text-align: right !important; +} + +.x-date-picker .x-date-header { + background: url(../images/default/shared/hd-sprite.gif) repeat-x 0 -83px; + height: 22px; + left: 10px; + top: 10px; + width: 157px; +} + +.x-date-header .x-btn .x-btn-text { + color: #fff; +} + +.x-date-picker-footer { + width: 100%; +} + +.x-date-picker-footer td { + text-align: center; +} + +.x-date-left { + background: transparent url(../images/default/shared/hd-sprite.gif) repeat-x scroll 0pt -83px; + color: #FFFFFF; + font-family: "sans serif", tahoma, verdana, helvetica; + font-size: 11px; + font-size-adjust: none; + font-stretch: normal; + font-style: normal; + font-variant: normal; + font-weight: bold; + line-height: normal; + overflow: hidden; +} + +.x-date-inner .x-date-active-hover { + background: #ddecfe !important; +} +.x-tip{ + position: absolute; + top: 0; + left:0; + visibility: hidden; + z-index: 20000; + border:0 none; +} +.x-tip .x-tip-close{ + height: 15px; + float:right; + width: 15px; + margin:0 0 2px 2px; + cursor:pointer; + display:none; +} +.x-tip .x-tip-tc { + background: transparent no-repeat 0 -62px; + padding-top:3px; + overflow:hidden; + zoom:1; +} +.x-tip .x-tip-tl { + background: transparent no-repeat 0 0; + padding-left:6px; + overflow:hidden; + zoom:1; +} +.x-tip .x-tip-tr { + background: transparent no-repeat right 0; + padding-right:6px; + overflow:hidden; + zoom:1; +} +.x-tip .x-tip-bc { + background: transparent no-repeat 0 -121px; + height:3px; + overflow:hidden; +} +.x-tip .x-tip-bl { + background: transparent no-repeat 0 -59px; + padding-left:6px; + zoom:1; +} +.x-tip .x-tip-br { + background: transparent no-repeat right -59px; + padding-right:6px; + zoom:1; +} +.x-tip .x-tip-mc { + border:0 none; +} +.x-tip .x-tip-ml { + background: no-repeat 0 -124px; + padding-left:6px; + zoom:1; +} +.x-tip .x-tip-mr { + background: transparent no-repeat right -124px; + padding-right:6px; + zoom:1; +} +.ext-ie .x-tip .x-tip-header,.ext-ie .x-tip .x-tip-tc { + font-size:0; + line-height:0; +} +.x-tip .x-tip-header-text { + padding:0; + margin:0 0 2px 0; +} +.x-tip .x-tip-body { + margin:0 !important; + line-height:14px; + padding:0; +} +.x-tip .x-tip-body .loading-indicator { + margin:0; +} +.x-tip-draggable .x-tip-header,.x-tip-draggable .x-tip-header-text { + cursor:move; +} +.x-form-invalid-tip .x-tip-tc { + background: repeat-x 0 -12px; + padding-top:6px; +} +.x-form-invalid-tip .x-tip-bc { + background: repeat-x 0 -18px; + height:6px; +} +.x-form-invalid-tip .x-tip-bl { + background: no-repeat 0 -6px; +} +.x-form-invalid-tip .x-tip-br { + background: no-repeat right -6px; +} +.x-form-invalid-tip .x-tip-body { + padding:2px; +} +.x-form-invalid-tip .x-tip-body { + padding-left:24px; + background:transparent no-repeat 2px 2px; +} +.x-tip-anchor { + position: absolute; + width: 9px; + height: 10px; + overflow:hidden; + background: transparent no-repeat 0 0; + zoom:1; +} +.x-tip-anchor-bottom { + background-position: -9px 0; +} +.x-tip-anchor-right { + background-position: -18px 0; + width: 10px; +} +.x-tip-anchor-left { + background-position: -28px 0; + width: 10px; +} +.x-menu { + border: 1px solid; + z-index: 15000; + zoom: 1; + background: repeat-y; + -moz-outline: none; +} + +.x-menu a { + text-decoration: none !important; +} + +.ext-ie .x-menu { + zoom: 1; + overflow: hidden; +} + +.x-menu-list { + padding: 2px; + background: transparent; + border: 0 none; + overflow: hidden; + overflow-y: hidden; +} + +.ext-strict .ext-ie .x-menu-list { + position: relative; +}# + +.x-menu x-menu-sep-li { + font-size: 1px; + line-height: 1px; +} + +.x-menu-list-item { + white-space: nowrap; + display: block; + padding: 1px; +} + +.x-menu-item { + -moz-user-select: none; + -khtml-user-select: none; + -webkit-user-select: ignore +} + +.x-menu-item-arrow { + background: transparent no-repeat right; +} + +.x-menu-sep { + display: block; + font-size: 1px; + line-height: 1px; + margin: 2px 3px; + border-bottom: 1px solid; + overflow: hidden; +} + +.x-menu-focus { + position: absolute; + left: -1px; + top: -1px; + width: 1px; + height: 1px; + line-height: 1px; + font-size: 1px; + -moz-outline: 0 none; + outline: 0 none; + -moz-user-select: none; + -khtml-user-select: none; + -webkit-user-select: ignore + overflow: hidden; + display: block; +} + +a.x-menu-item { + cursor: pointer; + display: block; + line-height: 16px; + outline-color: -moz-use-text-color; + outline-style: none; + outline-width: 0; + padding: 3px 21px 3px 27px; + position: relative; + text-decoration: none; + white-space: nowrap; +} + +.x-menu-item-active { + border-style: solid; + border-width: 1px; + padding: 0; +} + +.x-menu-item-icon { + border: 0 none; + height: 16px; + padding: 0; + vertical-align: top; + width: 16px; + position: absolute; + left: 3px; + top: 3px; + margin: 0; + background-position: center; +} + +.ext-ie .x-menu-item-icon { + left: -24px; +} + +.ext-strict .x-menu-item-icon { + left: 3px; +} + +.ext-ie6 .x-menu-item-icon { + left: -24px; +} + +.ext-ie .x-menu-item-icon { + vertical-align: middle; +} + +.x-date-menu .x-menu-list { + padding: 0; +} + +.x-menu-date-item { + padding: 0; +} + +.x-menu .x-color-palette,.x-menu .x-date-picker { + margin-left: 26px; + margin-right: 4px; +} + +.x-menu .x-date-picker { + border: 1px solid; + margin-top: 2px; + margin-bottom: 2px; +} + +.x-menu-plain .x-color-palette,.x-menu-plain .x-date-picker { + margin: 0; + border: 0 none; +} + +.x-date-menu { + padding: 0 !important; +} + +.x-cycle-menu .x-menu-item-checked { + border: 1px dotted !important; + padding: 0; +} + +.x-menu .x-menu-scroller { + width: 100%; + background-repeat: no-repeat; + background-position: center; + height: 8px; + line-height: 8px; + cursor: pointer; + margin: 0; + padding: 0; +} + +.x-menu .x-menu-scroller-active { + height: 6px; + line-height: 6px; +} + +.x-menu-list-item-indent { + padding-left: 27px; +} + +.x-menu-text { + + border-style: solid; + background: #D6E3F2; + border-color:#DAE6F4 #99bbe8 #99bbe8 #DAE6F4; + border-width: 1px; + margin:-2px -2px 0; + color:#15428b; + font:bold 10px tahoma,arial,verdana,sans-serif; + display:block; + padding:3px; +} + +.x-menubar { + padding: 3px; + border-style: solid; + border-width: 0 0 1px 0; + cursor: default; + border-color: #a9bfd3; + background-color: #d0def0; + padding: 3px; + background-image: url(../images/default/toolbar/bg.gif); +} + +.x-menubar-item { + padding: 1px 8px; + font: 12px arial, verdana, sans-serif; +} + +.x-menubar-item-over { + background-color: #98c5f5; +} + +.x-menubar-item-active { + background-color: #98c5f5; +}.x-box-tl { + background: transparent no-repeat 0 0; + zoom:1; +} +.x-box-tc { + height: 8px; + background: transparent repeat-x 0 0; + overflow: hidden; +} +.x-box-tr { + background: transparent no-repeat right -8px; +} +.x-box-ml { + background: transparent repeat-y 0; + padding-left: 4px; + overflow: hidden; + zoom:1; +} +.x-box-mc { + background: repeat-x 0 -16px; + padding: 4px 10px; +} +.x-box-mc h3 { + margin: 0 0 4px 0; + zoom:1; +} +.x-box-mr { + background: transparent repeat-y right; + padding-right: 4px; + overflow: hidden; +} +.x-box-bl { + background: transparent no-repeat 0 -16px; + zoom:1; +} +.x-box-bc { + background: transparent repeat-x 0 -8px; + height: 8px; + overflow: hidden; +} +.x-box-br { + background: transparent no-repeat right -24px; +} +.x-box-tl, .x-box-bl { + padding-left: 8px; + overflow: hidden; +} +.x-box-tr, .x-box-br { + padding-right: 8px; + overflow: hidden; +} +.x-combo-list { + border:1px solid; + zoom:1; + overflow:hidden; +} +.x-combo-list-inner { + overflow:auto; + position:relative; + zoom:1; + overflow-x:hidden; +} +.x-combo-list-hd { + border-bottom:1px solid; + padding:3px; +} +.x-resizable-pinned .x-combo-list-inner { + border-bottom:1px solid; +} +.x-combo-list-item { + padding:2px; + border:1px solid; + white-space: nowrap; + overflow:hidden; + text-overflow: ellipsis; +} +.x-combo-list .x-combo-selected{ + border:1px dotted !important; + cursor:pointer; +} +.x-combo-list .x-toolbar { + border-top:1px solid; + border-bottom:0 none; +} +.x-panel { + border-style: solid; + border-width:0; +} +.x-panel-header { + overflow:hidden; + zoom:1; + padding:5px 3px 4px 5px; + border:1px solid; + line-height: 15px; + background: transparent repeat-x 0 -1px; +} +.x-panel-body { + border:1px solid; + border-top:0 none; + overflow:hidden; + position: relative; +} +.x-panel-bbar .x-toolbar, .x-panel-tbar .x-toolbar { + border:1px solid; + border-top:0 none; + overflow:hidden; + padding:2px; +} +.x-panel-tbar-noheader .x-toolbar, .x-panel-mc .x-panel-tbar .x-toolbar { + border-top:1px solid; + border-bottom: 0 none; +} +.x-panel-body-noheader, .x-panel-mc .x-panel-body { + border-top:1px solid; +} +.x-panel-header { + overflow:hidden; + zoom:1; +} +.x-panel-tl .x-panel-header { + padding:5px 0 4px 0; + border:0 none; + background:transparent; + line-height: 15px; +} +.x-panel-tl .x-panel-icon, .x-window-tl .x-panel-icon { + padding-left:20px !important; + background-repeat:no-repeat; + background-position:0 4px; + zoom:1; +} +.x-panel-inline-icon { + width:16px; + height:16px; + background-repeat:no-repeat; + background-position:0 0; + vertical-align:middle; + margin-right:4px; + margin-top:-1px; + margin-bottom:-1px; +} +.x-panel-tc { + background: transparent repeat-x 0 0; + overflow:hidden; +} +.ext-strict .ext-ie7 .x-panel-tc { + overflow: visible; +} +.x-panel-tl { + background: transparent no-repeat 0 0; + padding-left:6px; + zoom:1; + border-bottom:1px solid; +} +.x-panel-tr { + background: transparent no-repeat right 0; + zoom:1; + padding-right:6px; +} +.x-panel-bc { + background: transparent repeat-x 0 bottom; + zoom:1; +} +.x-panel-bc .x-panel-footer { + zoom:1; +} +.x-panel-bl { + background: transparent no-repeat 0 bottom; + padding-left:6px; + zoom:1; +} +.x-panel-br { + background: transparent no-repeat right bottom; + padding-right:6px; + zoom:1; +} +.x-panel-mc { + border:0 none; + padding:0; + margin:0; + padding-top:6px; +} +.x-panel-mc .x-panel-body { + background:transparent; + border: 0 none; +} +.x-panel-ml { + background: repeat-y 0 0; + padding-left:6px; + zoom:1; +} +.x-panel-mr { + background: transparent repeat-y right 0; + padding-right:6px; + zoom:1; +} +.x-panel-bc .x-panel-footer { + padding-bottom:6px; +} +.x-panel-nofooter .x-panel-bc, .x-panel-nofooter .x-window-bc { + height:6px; + font-size:0; + line-height:0; +} +.x-panel-bwrap { + overflow:hidden; + zoom:1; + left:0; + top:0; +} +.x-panel-body { + overflow:hidden; + zoom:1; +} +.x-panel-collapsed .x-resizable-handle{ + display:none; +} +.ext-gecko .x-panel-animated * { + overflow:hidden !important; +} +.x-plain-body { + overflow:hidden; +} +.x-plain-bbar .x-toolbar { + overflow:hidden; + padding:2px; +} +.x-plain-tbar .x-toolbar { + overflow:hidden; + padding:2px; +} +.x-plain-bwrap { + overflow:hidden; + zoom:1; +} +.x-plain { + overflow:hidden; +} +.x-tool { + overflow:hidden; + width:15px; + height:15px; + float:right; + cursor:pointer; + background:transparent no-repeat; + margin-left:2px; +} +.x-tool-toggle { + background-position:0 -60px; +} +.x-tool-toggle-over { + background-position:-15px -60px; +} +.x-panel-collapsed .x-tool-toggle { + background-position:0 -75px; +} +.x-panel-collapsed .x-tool-toggle-over { + background-position:-15px -75px; +} +.x-tool-close { + background-position:0 -0; +} +.x-tool-close-over { + background-position:-15px 0; +} +.x-tool-minimize { + background-position:0 -15px; +} +.x-tool-minimize-over { + background-position:-15px -15px; +} +.x-tool-maximize { + background-position:0 -30px; +} +.x-tool-maximize-over { + background-position:-15px -30px; +} +.x-tool-restore { + background-position:0 -45px; +} +.x-tool-restore-over { + background-position:-15px -45px; +} +.x-tool-gear { + background-position:0 -90px; +} +.x-tool-gear-over { + background-position:-15px -90px; +} +.x-tool-pin { + background-position:0 -135px; +} +.x-tool-pin-over { + background-position:-15px -135px; +} +.x-tool-unpin { + background-position:0 -150px; +} +.x-tool-unpin-over { + background-position:-15px -150px; +} +.x-tool-right { + background-position:0 -165px; +} +.x-tool-right-over { + background-position:-15px -165px; +} +.x-tool-left { + background-position:0 -180px; +} +.x-tool-left-over { + background-position:-15px -180px; +} +.x-tool-up { + background-position:0 -210px; +} +.x-tool-up-over { + background-position:-15px -210px; +} +.x-tool-down { + background-position:0 -195px; +} +.x-tool-down-over { + background-position:-15px -195px; +} +.x-tool-refresh { + background-position:0 -225px; +} +.x-tool-refresh-over { + background-position:-15px -225px; +} +.x-tool-minus { + background-position:0 -255px; +} +.x-tool-minus-over { + background-position:-15px -255px; +} +.x-tool-plus { + background-position:0 -240px; +} +.x-tool-plus-over { + background-position:-15px -240px; +} +.x-tool-search { + background-position:0 -270px; +} +.x-tool-search-over { + background-position:-15px -270px; +} +.x-tool-save { + background-position:0 -285px; +} +.x-tool-save-over { + background-position:-15px -285px; +} +.x-tool-help { + background-position:0 -300px; +} +.x-tool-help-over { + background-position:-15px -300px; +} +.x-tool-print { + background-position:0 -315px; +} +.x-tool-print-over { + background-position:-15px -315px; +} +.x-panel-ghost { + z-index:12000; + overflow:hidden; + position:absolute; + left:0;top:0; + opacity:.65; + -moz-opacity:.65; + filter:alpha(opacity=65); +} +.x-panel-ghost ul { + margin:0; + padding:0; + overflow:hidden; + font-size:0; + line-height:0; + border:1px solid; + border-top:0 none; + display:block; +} +.x-panel-ghost * { + cursor:move !important; +} +.x-panel-dd-spacer { + border:2px dashed; +} +.x-panel-btns { + padding:5px; + overflow:hidden; +} +.x-panel-btns-left .x-buttonbar { + clear:none; +} +.x-panel-btns-center{ + text-align:center; +} +.x-panel-btns-center .x-toolbar-ct { + margin:0 auto; + text-align:left; + width:auto; +} +.x-panel-fbar td.x-toolbar-cell{ + padding:0px; +} +.x-panel-fbar { + display: block; + padding:2px; + position:relative; + left:0; + top:0; + zoom:1; + overflow:hidden; +} + +.x-panel-fbar .x-toolbar-cell { + vertical-align:middle; +} + +.x-panel-fbar td { + vertical-align:middle; +} +.x-panel-btns .x-btn-focus .x-btn-left{ + background-position:0 -147px; +} +.x-panel-btns .x-btn-focus .x-btn-right{ + background-position:0 -168px; +} +.x-panel-btns .x-btn-focus .x-btn-center{ + background-position:0 -189px; +} +.x-panel-btns .x-btn-over .x-btn-left{ + background-position:0 -63px; +} +.x-panel-btns .x-btn-over .x-btn-right{ + background-position:0 -84px; +} +.x-panel-btns .x-btn-over .x-btn-center{ + background-position:0 -105px; +} +.x-panel-btns .x-btn-click .x-btn-center{ + background-position:0 -126px; +} +.x-panel-btns .x-btn-click .x-btn-right{ + background-position:0 -84px; +} +.x-panel-btns .x-btn-click .x-btn-left{ + background-position:0 -63px; +} +.x-panel-fbar td,.x-panel-fbar span,.x-panel-fbar input,.x-panel-fbar div,.x-panel-fbar select,.x-panel-fbar label{ + white-space: nowrap; +} +.x-window { + zoom:1; +} +.x-window .x-resizable-handle { + opacity:0; + -moz-opacity:0; + filter:alpha(opacity=0); +} +.x-window-proxy { + border:1px solid; + z-index:12000; + overflow:hidden; + position:absolute; + left:0;top:0; + display:none; + opacity:.5; + -moz-opacity:.5; + filter:alpha(opacity=50); +} +.x-window-header { + overflow:hidden; + zoom:1; +} +.x-window-bwrap { + z-index:1; + position:relative; + zoom:1; + left:0;top:0; +} +.x-window-tl .x-window-header { + padding:5px 0 4px 0; +} +.x-window-header-text { + cursor:pointer; +} +.x-window-tc { + background: transparent repeat-x 0 0; + overflow:hidden; + zoom:1; +} +.x-window-tl { + background: transparent no-repeat 0 0; + padding-left:6px; + zoom:1; + z-index:1; + position:relative; +} +.x-window-tr { + background: transparent no-repeat right 0; + padding-right:6px; +} +.x-window-bc { + background: transparent repeat-x 0 bottom; + zoom:1; +} +.x-window-bc .x-window-footer { + padding-bottom:6px; + zoom:1; + font-size:0; + line-height:0; +} +.x-window-bl { + background: transparent no-repeat 0 bottom; + padding-left:6px; + zoom:1; +} +.x-window-br { + background: transparent no-repeat right bottom; + padding-right:6px; + zoom:1; +} +.x-window-mc { + border:1px solid; + padding:0; + margin:0; +} +.x-window-ml { + background: transparent repeat-y 0 0; + padding-left:6px; + zoom:1; +} +.x-window-mr { + background: transparent repeat-y right 0; + padding-right:6px; + zoom:1; +} +.x-window-body { + overflow:hidden; +} +.x-window-bwrap { + overflow:hidden; +} +.x-window-maximized .x-window-bl, .x-window-maximized .x-window-br, + .x-window-maximized .x-window-ml, .x-window-maximized .x-window-mr, + .x-window-maximized .x-window-tl, .x-window-maximized .x-window-tr { + padding:0; +} +.x-window-maximized .x-window-footer { + padding-bottom:0; +} +.x-window-maximized .x-window-tc { + padding-left:3px; + padding-right:3px; +} +.x-window-maximized .x-window-mc { + border-left:0 none; + border-right:0 none; +} +.x-window-tbar .x-toolbar, .x-window-bbar .x-toolbar { + border-left:0 none; + border-right: 0 none; +} +.x-window-bbar .x-toolbar { + border-top:1px solid; + border-bottom:0 none; +} +.x-window-draggable, .x-window-draggable .x-window-header-text { + cursor:move; +} +.x-window-maximized .x-window-draggable, .x-window-maximized .x-window-draggable .x-window-header-text { + cursor:default; +} +.x-window-body { + background:transparent; +} +.x-panel-ghost .x-window-tl { + border-bottom:1px solid; +} +.x-panel-collapsed .x-window-tl { + border-bottom:1px solid; +} +.x-window-maximized-ct { + overflow:hidden; +} +.x-window-sizing-ghost ul { + border:0 none !important; +} +.x-dlg-focus{ + -moz-outline:0 none; + outline:0 none; + width:0; + height:0; + overflow:hidden; + position:absolute; + top:0; + left:0; +} +.x-dlg-mask{ + z-index:10000; + display:none; + position:absolute; + top:0; + left:0; + -moz-opacity: 0.5; + opacity:.50; + filter: alpha(opacity=50); +} +body.ext-ie6.x-body-masked select { + visibility:hidden; +} +body.ext-ie6.x-body-masked .x-window select { + visibility:visible; +} +.x-window-plain .x-window-mc { + border: 1px solid; +} +.x-window-plain .x-window-body { + border: 1px solid; + background:transparent !important; +} +.x-html-editor-wrap { + border:1px solid; +} + +.x-html-editor-tb .x-btn-text { + background:transparent no-repeat; +} + +.x-html-editor-tip .x-tip-bd .x-tip-bd-inner { + padding:5px; + padding-bottom:1px; +} + +.x-html-editor-tb .x-toolbar { + position:static !important; +}.x-panel-noborder .x-panel-body-noborder { + border-width:0; +} +.x-panel-noborder .x-panel-header-noborder { + border-width:0 0 1px; + border-style:solid; +} +.x-panel-noborder .x-panel-tbar-noborder .x-toolbar { + border-width:0 0 1px; + border-style:solid; +} +.x-panel-noborder .x-panel-bbar-noborder .x-toolbar { + border-width:1px 0 0 0; + border-style:solid; +} +.x-window-noborder .x-window-mc { + border-width:0; +} +.x-window-plain .x-window-body-noborder { + border-width:0; +} +.x-tab-panel-noborder .x-tab-panel-body-noborder { + border-width:0; +} +.x-tab-panel-noborder .x-tab-panel-header-noborder { + border-width: 0 0 1px 0; +} +.x-tab-panel-noborder .x-tab-panel-footer-noborder { + border-width: 1px 0 0 0; +} +.x-tab-panel-bbar-noborder .x-toolbar { + border-width: 1px 0 0 0; + border-style:solid; +} +.x-tab-panel-tbar-noborder .x-toolbar { + border-width:0 0 1px; + border-style:solid; +} +.x-border-panel { + position:absolute !important; + left:0; + top:0; +} +.x-tool-collapse-south { + background-position:0 -195px; +} +.x-tool-collapse-south-over { + background-position:-15px -195px; +} +.x-tool-collapse-north { + background-position:0 -210px; +} +.x-tool-collapse-north-over { + background-position:-15px -210px; +} +.x-tool-collapse-west { + background-position:0 -180px; +} +.x-tool-collapse-west-over { + background-position:-15px -180px; +} +.x-tool-collapse-east { + background-position:0 -165px; +} +.x-tool-collapse-east-over { + background-position:-15px -165px; +} +.x-tool-expand-south { + background-position:0 -210px; +} +.x-tool-expand-south-over { + background-position:-15px -210px; +} +.x-tool-expand-north { + background-position:0 -195px; +} +.x-tool-expand-north-over { + background-position:-15px -195px; +} +.x-tool-expand-west { + background-position:0 -165px; +} +.x-tool-expand-west-over { + background-position:-15px -165px; +} +.x-tool-expand-east { + background-position:0 -180px; +} +.x-tool-expand-east-over { + background-position:-15px -180px; +} +.x-tool-expand-north, .x-tool-expand-south { + float:right; + margin:3px; +} +.x-tool-expand-east, .x-tool-expand-west { + float:none; + margin:3px auto; +} +.x-accordion-hd .x-tool-toggle { + background-position:0 -255px; +} +.x-accordion-hd .x-tool-toggle-over { + background-position:-15px -255px; +} +.x-panel-collapsed .x-accordion-hd .x-tool-toggle { + background-position:0 -240px; +} +.x-panel-collapsed .x-accordion-hd .x-tool-toggle-over { + background-position:-15px -240px; +} +.x-accordion-hd { + padding-top:4px; + padding-bottom:3px; + border-top:0 none; + background: transparent repeat-x 0 -9px; +} +.x-layout-collapsed{ + position:absolute; + left:-10000px; + top:-10000px; + visibility:hidden; + width:20px; + height:20px; + overflow:hidden; + border:1px solid; + z-index:20; +} +.ext-border-box .x-layout-collapsed{ + width:22px; + height:22px; +} +.x-layout-collapsed-over{ + cursor:pointer; +} +.x-layout-collapsed-west .x-layout-collapsed-tools, .x-layout-collapsed-east .x-layout-collapsed-tools{ + position:absolute; + top:0; + left:0; + width:20px; + height:20px; +} +.x-layout-split{ + position:absolute; + height:5px; + width:5px; + line-height:1px; + font-size:1px; + z-index:3; + background-color:transparent; +} +.ext-strict .ext-ie6 .x-layout-split{ + background-color: #fff !important; + filter: alpha(opacity=1); +} +.x-layout-split-h{ + background-image:url(../images/default/s.gif); + background-position: left; +} +.x-layout-split-v{ + background-image:url(../images/default/s.gif); + background-position: top; +} +.x-column-layout-ct { + overflow:hidden; + zoom:1; +} +.x-column { + float:left; + padding:0; + margin:0; + overflow:hidden; + zoom:1; +} +.x-column-inner { + overflow:hidden; + zoom:1; +} +.x-layout-mini { + position:absolute; + top:0; + left:0; + display:block; + width:5px; + height:35px; + cursor:pointer; + opacity:.5; + -moz-opacity:.5; + filter:alpha(opacity=50); +} +.x-layout-mini-over, .x-layout-collapsed-over .x-layout-mini{ + opacity:1; + -moz-opacity:1; + filter:none; +} +.x-layout-split-west .x-layout-mini { + top:48%; +} +.x-layout-split-east .x-layout-mini { + top:48%; +} +.x-layout-split-north .x-layout-mini { + left:48%; + height:5px; + width:35px; +} +.x-layout-split-south .x-layout-mini { + left:48%; + height:5px; + width:35px; +} +.x-layout-cmini-west .x-layout-mini { + top:48%; +} +.x-layout-cmini-east .x-layout-mini { + top:48%; +} +.x-layout-cmini-north .x-layout-mini { + left:48%; + height:5px; + width:35px; +} +.x-layout-cmini-south .x-layout-mini { + left:48%; + height:5px; + width:35px; +} +.x-layout-cmini-west, .x-layout-cmini-east { + border:0 none; + width:5px !important; + padding:0; + background:transparent; +} +.x-layout-cmini-north, .x-layout-cmini-south { + border:0 none; + height:5px !important; + padding:0; + background:transparent; +} +.x-viewport, .x-viewport body { + margin: 0; + padding: 0; + border: 0 none; + overflow: hidden; + height: 100%; +} +.x-abs-layout-item { + position:absolute !important; + left:0; + top:0; +} +.x-abs-layout-container { + position:relative; +} +.ext-ie input.x-abs-layout-item, .ext-ie textarea.x-abs-layout-item { + margin:0; +} +.x-box-layout-ct { + overflow:hidden; + zoom:1; +} +.x-box-inner { + overflow:hidden; + zoom:1; + position:relative; + left:0; + top:0; +} +.x-box-item { + position:absolute !important; + left:0; + top:0; +} +.x-border-layout-ct { + position: relative; +} +.x-progress-wrap { + border:1px solid; + overflow:hidden; +} +.x-progress-inner { + height:18px; + background:repeat-x; + position:relative; +} +.x-progress-bar { + height:18px; + float:left; + width:0; + background: repeat-x left center; + border-top:1px solid; + border-bottom:1px solid; + border-right:1px solid; +} +.x-progress-text { + padding:1px 5px; + overflow:hidden; + position:absolute; + left:0; + text-align:center; +} +.x-progress-text-back { + line-height:16px; +} +.ext-ie .x-progress-text-back { + line-height:15px; +} +.x-slider { + zoom:1; +} +.x-slider-thumb { + line-height: 0px; + font-size: 0px; + position: absolute; + background:transparent no-repeat 0 0; +} +.x-slider-inner { + position:relative; + left:0; + top:0; + overflow:visible; + zoom:1; +} +.x-slider-focus { + position:absolute; + left:0; + top:0; + width:1px; + height:1px; + line-height:1px; + font-size:1px; + -moz-outline:0 none; + outline:0 none; + -moz-user-select: none; + -khtml-user-select: none; + -webkit-user-select: ignore + display:block; + overflow:hidden; +} +.x-slider-horz { + padding-left:7px; + background:transparent no-repeat 0 -22px; +} +.x-slider-horz .x-slider-end { + padding-right:7px; + zoom:1; + background:transparent no-repeat right -44px; +} +.x-slider-horz .x-slider-inner { + background:transparent repeat-x 0 0; + height:22px; +} +.x-slider-horz .x-slider-thumb { + width:14px; + height:15px; + left:0; + top:3px; +} +.x-slider-horz .x-slider-thumb-over { + background-position: -14px -15px; +} +.x-slider-horz .x-slider-thumb-drag { + background-position: -28px -30px; +} +.x-slider-vert { + padding-top:7px; + background:transparent no-repeat -44px 0; + width:22px; +} +.x-slider-vert .x-slider-end { + padding-bottom:7px; + zoom:1; + background:transparent no-repeat -22px bottom; +} +.x-slider-vert .x-slider-inner { + background:transparent repeat-y 0 0; +} +.x-slider-vert .x-slider-thumb { + width:15px; + height:14px; + left:3px; + bottom:0; +} +.x-slider-vert .x-slider-thumb-over { + background-position: -15px -14px; +} +.x-slider-vert .x-slider-thumb-drag { + background-position: -30px -28px; +} +.x-window-dlg .x-window-body { + border:0 none !important; + padding:5px 10px; + overflow:hidden !important; +} +.x-window-dlg .x-window-mc { + border:0 none !important; +} +.x-window-dlg .ext-mb-input { + margin-top:4px; + width:95%; +} +.x-window-dlg .ext-mb-textarea { + margin-top:4px; +} +.x-window-dlg .x-progress-wrap { + margin-top:4px; +} +.ext-ie .x-window-dlg .x-progress-wrap { + margin-top:6px; +} +.x-window-dlg .x-msg-box-wait { + background:transparent no-repeat left; + display:block; + width:300px; + padding-left:18px; + line-height:18px; +} +.x-window-dlg .ext-mb-icon { + float:left; + width:47px; + height:32px; +} +.ext-ie .x-window-dlg .ext-mb-icon { + width:44px; +} +.x-window-dlg .x-dlg-icon .ext-mb-content{ + zoom: 1; margin-left: 47px; +} +.x-window-dlg .ext-mb-info, .x-window-dlg .ext-mb-warning, .x-window-dlg .ext-mb-question, .x-window-dlg .ext-mb-error { + background:transparent no-repeat top left; +} +.ext-gecko2 .ext-mb-fix-cursor { + overflow:auto; +} +.arrow-top { + background: url(../images/gxt/icons/top2.gif) no-repeat center left !important; +} +.arrow-bottom { + background: url(../images/gxt/icons/bottom2.gif) no-repeat center left !important; +} +.arrow-up { + background: url(../images/gxt/icons/up2.gif) no-repeat center left !important; +} +.arrow-down { + background: url(../images/gxt/icons/down2.gif) no-repeat center left !important; +} +.arrow-left { + background: url(../images/gxt/icons/left2.gif) no-repeat center left !important; +} +.arrow-double-left { + background: url(../images/gxt/icons/doubleleft2.gif) no-repeat center left !important; +} +.arrow-right { + background: url(../images/gxt/icons/right2.gif) no-repeat center left !important; +} +.arrow-double-right { + background: url(../images/gxt/icons/doubleright2.gif) no-repeat center left !important; +} +.x-info { + border-style: solid; + border-color: #99bbe8; + border-width: 0; + z-index: 99999999; +} + +.x-info-header { + overflow: hidden; + zoom: 1; + color: black; + font: bold 13px tahoma, arial, verdana, sans-serif; + padding: 5px 3px 4px 5px; + line-height: 15px; + background: transparent url(../images/default/panel/white-top-bottom.gif) repeat-x 0 -1px; +} + +.x-info-body { + border-top: 0 none; + overflow: hidden; + background: white; + position: relative; /* added for item scroll positioning */ +} + +.x-info-header { + overflow: hidden; + zoom: 1; +} + +.x-info-tl .x-info-header { + color: #555555; + font-family: tahoma, arial, sans-serif; + font-size: 13px; + font-size-adjust: none; + font-stretch: normal; + font-style: normal; + font-variant: normal; + font-weight: bold; + line-height: normal; + padding: 5px 0 4px 0; + border: 0 none; + background: transparent; +} + +.x-info-tl .x-info-icon,.x-window-tl .x-info-icon { + padding-left: 20px !important; + background-repeat: no-repeat; + background-position: 0 4px; + zoom: 1; +} + +.x-info-inline-icon { + width: 16px; + height: 16px; + background-repeat: no-repeat; + background-position: 0 0; + vertical-align: middle; + margin-right: 4px; + margin-top: -1px; + margin-bottom: -1px; +} + +.x-info-tc { + background: transparent url(../images/gxt/info/top-bottom.gif) repeat-x 0 0; + overflow: hidden; +} + +/* fix ie7 strict mode bug */ +.ext-ie7 .x-info-tc { + overflow: visible; +} + +.x-info-tl { + background: transparent url(../images/gxt/info/corners-sprite.gif) no-repeat 0 0; + padding-left: 6px; + zoom: 1; +} + +.x-info-tr { + background: transparent url(../images/gxt/info/corners-sprite.gif) no-repeat right 0; + zoom: 1; + padding-right: 6px; +} + +.x-info-bc { + background: transparent url(../images/default/panel/top-bottom.gif) repeat-x 0 bottom; + zoom: 1; + font-size: 0px; +} + +.x-info-bc .x-info-footer { + zoom: 1; +} + +.x-info-bl { + background: transparent url(../images/default/panel/corners-sprite.gif) no-repeat 0 bottom; + padding-left: 6px; + zoom: 1; +} + +.x-info-br { + background: transparent url(../images/default/panel/corners-sprite.gif) no-repeat right bottom; + padding-right: 6px; + zoom: 1; +} + +.x-info-mc { + border: 0 none; + padding: 0; + margin: 0; + font: normal 11px tahoma, arial, helvetica, sans-serif; + background: #dfe8f6; +} + +.x-info-mc .x-info-body { + background: transparent; + border: 0 none; +} + +.x-info-ml { + background: #fff url(../images/default/panel/left-right.gif) repeat-y 0 0; + padding-left: 6px; + zoom: 1; +} + +.x-info-mr { + background: transparent url(../images/default/panel/left-right.gif) repeat-y right 0; + padding-right: 6px; + zoom: 1; +} + +.x-info-bc .x-info-footer { + padding-bottom: 6px; +} + +.x-info-nofooter .x-info-bc,.x-panel-nofooter .x-info-bc { + height: 6px; + font-size: 0; + line-height: 0; +} + +.x-info-bwrap { + overflow: hidden; + zoom: 1; +} + +.x-info-body { + overflow: hidden; + zoom: 1; + color: #555555; + font-family: tahoma, arial, sans-serif; + font-size: 12px; + font-size-adjust: none; + font-style: normal; + font-variant: normal; + font-weight: normal; +}.x-combo-over { + border: 1px dotted #B5B4B4 !important; + background: #F1F1F1; + cursor: pointer; +} + +.my-list { + border: 1px solid #99BBE8; + -moz-outline: none; + -moz-user-focus: normal; + background-color: white; + font-family: "Myriad Pro", "Myriad Web", "Tahoma", "Helvetica", "Arial", sans-serif; +} + +.my-list-notchecked { + background: url(../images/gxt/tree/notchecked.gif) no-repeat 0px 0px !important; + margin: 3px 0pt 0pt 0px; +} + +.my-list-checked { + background: url(../images/gxt/tree/checked.gif) no-repeat 0px 0px !important; + margin: 3px 0pt 0pt 0px; +} + +.ext-ie .my-list-notchecked { + margin: 2px 0pt 0pt 0px; +} + +.ext-ie .my-list-checked { + margin: 2px 0pt 0pt 0px; +} + +.my-list-flat { + border: 1px solid #6593cf; + -moz-outline: none; + -moz-user-focus: normal; + background-color: white; + cursor: default; +} + +.my-list-item { + cursor: pointer; + -moz-outline: none; + -moz-user-focus: normal; +} + +.my-list-flat .my-list-item { + height: 19px; + border: 1px solid white; +} + +.my-list-flat .my-list-item-over { + background-color: #F1F1F1; + border: 1px dotted #B5B4B4; +} + +.my-list-flat .my-list-item-sel { + background-color: #DFE8F6; + border: 1px dotted #9EB8ED; +} + +.my-list-flat .my-list-item-over .my-list-item-l { + background: none; +} + +.my-list-flat .my-list-item-over .my-list-item-icon,.my-list-flat .my-list-item-over .my-list-item-ml,.my-list-flat .my-list-item-over .my-list-item-c + { + background: none; +} + +.my-list-flat .my-list-item-over .my-list-item-r { + background: none; +} + +.my-list-flat .my-list-item-sel .my-list-item-l { + background: none; +} + +.my-list-flat .my-list-item-sel .my-list-item-icon,.my-list-flat .my-list-item-sel .my-list-item-ml,.my-list-flat .my-list-item-sel .my-list-item-c + { + background: none; +} + +.my-list-flat .my-list-item-sel .my-list-item-r { + background: none; +} + +.my-list-item-text { + font-size: 11px; + padding-top: 3px; + padding-left: 2px; + white-space: nowrap; + overflow: hidden; + line-height: 19px; +} + +.my-list-item-l div { + width: 5px; +} + +.my-list-item-ml { + width: 18px; +} + +.my-list-item-c { + width: 100%; +} + +.my-list-item-r div { + width: 3px; +} + +.my-list-item-over .my-list-item-l { + background: url(../images/gxt/shared/select-19-bg.gif) no-repeat left -57px; +} + +.my-list-item-over .my-list-item-icon,.my-list-item-over .my-list-item-check,.my-list-item-over .my-list-item-c + { + background: url(../images/gxt/shared/select-19-bg.gif) repeat-x left -95px; +} + +.my-list-item-over .my-list-item-r { + background: url(../images/gxt/shared/select-19-bg.gif) no-repeat right -76px; +} + +.my-list-item-sel .my-list-item-l { + background: url(../images/gxt/shared/select-19-bg.gif) no-repeat left 0px; +} + +.my-list-item-sel .my-list-item-icon,.my-list-item-sel .my-list-item-check,.my-list-item-sel .my-list-item-c + { + background: url(../images/gxt/shared/select-19-bg.gif) left -38px; +} + +.my-list-item-sel .my-list-item-r { + background: url(../images/gxt/shared/select-19-bg.gif) no-repeat right -19px; +}.x-view { + -moz-outline: none; + -moz-user-focus: normal; + padding: 1px; + background-color: white; + cursor: default; + border: 1px solid #98C0F4; + overflow: hidden; +} + +.x-view-item { + border: 1px solid #FFFFFF; + font-family: tahoma, arial, helvetica, sans-serif; + font-size: 12px; + font-size-adjust: none; + font-stretch: normal; + font-style: normal; + font-variant: normal; + font-weight: normal; + line-height: normal; + overflow: hidden; + padding: 2px; + white-space: nowrap; +} + +.x-view-item-over { + background: #efefef url(../images/default/grid/row-over.gif) repeat-x left top; + border: 1px dotted #dddddd !important; + cursor: pointer; +} + +.x-view-item-sel { + background: #DFE8F6 none repeat scroll 0%; + border: 1px dotted #A3BAE9 !important; + cursor: pointer; +} +.x-view-item-check { + padding: 0px; +} +.x-view-item-check td { + font-family: tahoma, arial, helvetica, sans-serif; + font-size: 12px; + font-size-adjust: none; + font-stretch: normal; + font-style: normal; + font-variant: normal; + font-weight: normal; + line-height: normal; + white-space: nowrap; + vertical-align: middle; + padding-left: 1px; +}.x-splitbar-shim { + filter: alpha(opacity = 1); + opacity: 0; + position: absolute; + width: 100%; + height: 100%; + z-index: 10; + background-color: white; + -moz-user-select: none; + -khtml-user-select: none; + user-select: none; + -moz-outline: none; + -moz-user-focus: normal; +} + +.x-vsplitbar { + background: url(../images/default/s.gif); + position: absolute; + z-index: 3; + cursor: e-resize; + cursor: col-resize; +} + +.x-hsplitbar { + background: url(../images/default/s.gif); + position: absolute; + font-size: 1px; + line-height: 1px; + z-index: 3; + cursor: s-resize; + cursor: row-resize; +} + +.x-splitbar-proxy { + position: absolute; + background-color: #929090; + font-size: 1px; + line-height: 1px; + z-index: 200; +} + +.my-splitbar-shim { + filter: alpha(opacity = 1); + opacity: 0; + position: absolute; + width: 100%; + height: 100%; + z-index: 10; + background-color: white; + -moz-user-select: none; + -khtml-user-select: none; + user-select: none; + -moz-outline: none; + -moz-user-focus: normal; +} + +.my-splitbar-transparent { + background: none; + font-size: 1px; + line-height: 1px; + z-index: 2000; +} + +.my-splitbar-proxy { + position: absolute; + background-color: #929090; + font-size: 1px; + line-height: 1px; + z-index: 200; +}.x-status { + padding: 0 4px; + height: 21px; + line-height: 21px !important; + cursor: default; +} +.x-status .x-status-text{ + padding: 2px; + line-height: 21px !important; +} +.x-status-icon { + padding-left: 25px !important; + background: transparent no-repeat left center; +} +.x-status-busy { + background-image: url(../images/default/grid/loading.gif); +} +.x-status-text-panel { + border: 1px solid; + border-color: #99bbe8 #fff #fff #99bbe8; +} +.my-tbl { + border: 1px solid #99BBE8; + cursor: default; + background-color: white; + overflow: hidden; + -moz-outline: none; + -moz-user-focus: normal; + font-family: arial, tahoma, helvetica, sans-serif; + font-size: 11px; + table-layout: fixed; +} + +.my-tbl-col-overflow { + overflow: hidden; +} + +.ext-ie .my-tbl-col-overflow { + +} + +.my-tbl-col-text { + color: black; + padding: 5px 4px 0 4px; + display: block; + white-space: nowrap; + font-family: arial, tahoma, helvetica, sans-serif; + font-size: 11px; +} + +.my-tbl-col { + border-right: 1px solid #D5D5D5; + background: url(../images/gxt/table/vs-column-bg.gif) repeat-x; +} + +.my-tbl-col-splitter { + position: absolute; + top: 0; + width: 6px; + z-index: 100; + height: 100%; + right: 0px; +} + +.my-tbl-col-over { + background: url(../images/gxt/table/vs-column-bg.gif) repeat-x 0px -24px; +} + +.my-tbl-col-sort { + background-position: 0px -48px; +} + +.my-icon-asc { + background-image: url(../images/gxt/icons/hmenu-asc.gif) !important; +} + +.my-icon-desc { + background-image: url(../images/gxt/icons/hmenu-desc.gif) !important; +} + +.my-tbl-col-asc { + background: url(../images/gxt/table/vsort-asc.gif) no-repeat 50% top; +} + +.my-tbl-col-desc { + background: url(../images/gxt/table/vsort-desc.gif) no-repeat 50% top; +} + +.my-tbl-col-splitter { + background: none; +} + +.my-tbl-data { + background-color: white; + overflow: hidden; + -moz-outline: none; + -moz-user-focus: normal; +} + +.my-tbl-item { + border-top: 1px solid white; + border-bottom: 1px solid white; + border-bottom: 1px solid #EDEDED; + cursor: default; + -moz-outline: none; + -moz-user-focus: normal; +} + +.my-tbl-item table { + -moz-outline: none; + -moz-user-focus: normal; + table-layout: fixed; +} + +.my-tbl-data .my-tbl-item-cell { + -moz-outline: none; + -moz-user-focus: normal; +} + +.my-tbl-item td { + -moz-user-select: none; + -moz-outline: none; + -moz-user-focus: normal; +} + +.my-tbl-vlines .my-tbl-data .my-tbl-item-cell-overflow { + border-right: 1px solid #EDEDED; +} + +.my-tbl-data .my-tbl-item-cell-overflow { + white-space: nowrap; + overflow: hidden; + -moz-outline: none; + -moz-user-focus: normal; +} + +.my-tbl-data .my-tbl-item-cell-text { + padding: 3px 4px; + font-family: arial, tahoma, helvetica, sans-serif; + font-size: 11px; + -moz-outline: none; + -moz-user-focus: normal; +} + +.my-tbl-data .my-tbl-item-cell-widget { + padding: 1px 4px; +} + +.my-tbl-data tr { + overflow: hidden; +} + +.my-tbl-item-over { + border-top: 1px solid #dddddd; + border-bottom: 1px solid #dddddd; + background: #efefef url(../images/default/grid/row-over.gif) repeat-x left top; +} + +.my-tbl-item-sel { + background-image: none !important; + background-color: #D9E1ED !important; + border-top: 1px dotted #9EB8ED !important; + border-bottom: 1px dotted #9EB8ED !important; +} + +.ext-ie .my-tbl TD .x-form-text { + POSITION: static; + TOP: 0px; +}.tree-folder { + background: url(../images/gxt/icons/folder-closed.gif) no-repeat -1px -1px; +} + +.tree-folder-open { + background: url(../images/gxt/icons/folder.gif) no-repeat -1px -1px; +} + +.my-treetbl-tree { + cursor: default; +} + +.my-treetblitem,.my-treetblitem table,.my-treetblitem table td { + -moz-outline: none; + -moz-user-focus: normal; +} + +.my-treetblitem td { + height: 19px; +} + +.my-treetbl-indent { + line-height: 1px; + font-size: 1px; +} + +.my-treetbl-joint div { + width: 15px; + height: 19px; + line-height: 1px; + font-size: 1px; +} + +.my-treetbl-left,.my-treetbl-left div,.my-treetbl-right { + line-height: 1px; + font-size: 1px; + width: 3px; +} + +.my-treetbl-left div,.my-treetbl-right div { + width: 3px; +} + +.my-treetbl-check div { + width: 17px; + height: 19px; + line-height: 1px; + font-size: 1px; + display: block; +} + +.my-treetbl-icon div { + width: 16px; + height: 16px; + margin-top: 1px; + cursor: pointer; + background-repeat: no-repeat; + background-position: center; +} + +.my-ie .my-treetbl-icon { + padding-top: 2px; +} + +.my-ie .my-treetbl-icon div { + position: static; +} + +.my-treetbl-item-text span { + font-family: arial, tahoma, helvetica, sans-serif; + font-size: 12px; + white-space: nowrap; + padding-left: 3px; + padding-right: 3px; + display: block; + height: 15px; + cursor: pointer; +} + +.my-treetbl-over .my-treetbl-left { + background: url(../images/gxt/shared/select-19-bg.gif) no-repeat left -57px; +} + +.my-treetbl-over .my-treetbl-right { + background: url(../images/gxt/shared/select-19-bg.gif) no-repeat right -76px; +} + +.my-treetbl-over .my-treetbl-check,.my-treetbl-over .my-treetbl-icon,.my-treetbl-over .my-treetbl-item-text + { + background: url(../images/gxt/shared/select-19-bg.gif) left -95px; +} + +.my-treetbl-sel .my-treetbl-left { + background: url(../images/gxt/shared/select-19-bg.gif) no-repeat left 0px; +} + +.my-treetbl-sel .my-treetbl-right { + background: url(../images/gxt/shared/select-19-bg.gif) no-repeat right -19px; +} + +.my-treetbl-sel .my-treetbl-check,.my-treetbl-sel .my-treetbl-icon,.my-treetbl-sel .my-treetbl-item-text + { + background: url(../images/gxt/shared/select-19-bg.gif) left -38px; +} + +.my-treetbl-close { + background: url(../images/gxt/tree/vnode_transparent.gif) no-repeat 0px 1px; +} + +.my-treetbl-open { + background: url(../images/gxt/tree/vnode_transparent.gif) no-repeat 0px -32px; +} + +.my-treetbl-joint-over .my-treetbl-open { + background: url(../images/gxt/tree/vnode_transparent.gif) no-repeat 0px -48px; +} + +.my-treetbl-joint-over .my-treetbl-close { + background: url(../images/gxt/tree/vnode_transparent.gif) no-repeat 0px -15px; +} + +.my-treetbl-notchecked { + background: url(../images/gxt/tree/notchecked.gif) no-repeat 0px 50%; +} + +.my-treetbl-checked { + background: url(../images/gxt/tree/checked.gif) no-repeat 0px 50%; +} + +.my-treetbl-loading .tree-folder { + background: url(../images/gxt/icons/wait.gif) no-repeat 0px -1px; +} + +.my-treetbl-loading .my-treetbl-item-text span { + font-style: italic; +} + +.my-treetbl { + border: 1px solid #99BBE8; + cursor: default; + background-color: white; + overflow: hidden; + -moz-outline: none; + -moz-user-focus: normal; +} + +.my-treetbl-col-overflow { + overflow: hidden; + -moz-outline: none; + -moz-user-focus: normal; +} + +.my-treetbl-col-text { + color: black; + padding: 5px 4px 0 4px; + display: block; + white-space: nowrap; + font-family: arial, tahoma, helvetica, sans-serif; + font-size: 12px; +} + +.my-treetbl-col { + border-right: 1px solid #D5D5D5; + background: url(../images/gxt/table/vs-column-bg.gif) repeat-x; +} + +.my-treetbl-col-splitter { + position: absolute; + top: 0; + width: 6px; + z-index: 100; + height: 100%; + right: 0px; +} + +.my-treetbl-col-over { + background: url(../images/gxt/table/vs-column-bg.gif) repeat-x 0px -24px; +} + +.my-treetbl-col-sort { + background-position: 0px -48px; +} + +.my-treetbl-col-asc { + background: url(../images/gxt/table/vsort-asc.gif) no-repeat 50% top; +} + +.my-treetbl-col-desc { + background: url(../images/gxt/table/vsort-desc.gif) no-repeat 50% top; +} + +.my-treetbl-col-splitter { + background: none; +} + +.my-treetbl-data { + background-color: white; + overflow: hidden; +} + +.my-treetbl-data .my-treetbl-cell { + height: 20px; + -moz-outline: none; + -moz-user-focus: normal; +} + +.my-treetbl-data .my-treetbl-cell-overflow { + white-space: nowrap; + overflow: hidden; +} + +.my-treetbl-data .my-treetbl-cell-text { + padding: 0px 0px; + font-family: arial, tahoma, helvetica, sans-serif; + font-size: 12px; +} + +.my-treetbl-data tr { + overflow: hidden; +} + +.my-treetbl-item { + border-top: 1px solid white; + border-bottom: 1px solid white; + border-bottom: 1px solid #EDEDED; + cursor: default; + -moz-outline: none; + -moz-user-focus: normal; +} + +.my-treetbl-item-over { + border-top: 1px solid #dddddd; + border-bottom: 1px solid #dddddd; + background: #efefef url(../images/default/grid/row-over.gif) repeat-x left top; +} + +.my-treetbl-item-sel { + background-image: none; + background-color: #D9E1ED; + border-top: 1px dotted #9EB8ED; + border-bottom: 1px dotted #9EB8ED; +} + +.my-treetbl .x-grid3-td-numberer { + background: transparent url(../images/gxt/tree/tree-table-special-col.gif) repeat-y + scroll left center; + height: 19px; + line-height: normal; + padding-left: 0px; + margin-left: 0px; +} + +.x-grid3-td-numberer div { + font-size: 11px; + font-family: "segoe ui", tahoma, arial, sans-serif; + color: #444444; + padding: 3px 0px 0 5px !important; +} + +.ext-ie .my-treetbl .x-grid3-td-numberer { + height: 20px; +} + +.my-treetbl-item-sel .x-grid3-td-numberer { + background: transparent url(../images/gxt/tree/tree-table-special-col-sel.gif) repeat-y + scroll left center; +}.ext-el-mask { + background-color: #ccc; +} +.ext-el-mask-msg { + border-color:#6593cf; + background-color:#c3daf9; + background-image:url(../images/default/box/tb-blue.gif); +} +.ext-el-mask-msg div { + background-color: white; + border-color:#a3bad9; + color:#222; + font:normal 11px tahoma, arial, helvetica, sans-serif; +} +.x-mask-loading div { + background-color:#fbfbfb; + background-image:url(../images/default/grid/loading.gif); +} +.x-item-disabled { + color: black; +} +.x-item-disabled * { + color: black !important; +} +.x-splitbar-proxy { + background-color: #aaa; +} +.x-color-palette a { + border-color:#fff; +} +.x-color-palette a.x-color-palette-hover, .x-color-palette a.x-color-palette-sel { + border-color:#8bb8f3; + background-color: #deecfd; +} +.x-color-palette em { + border-color:#aca899; +} +.x-ie-shadow { + background-color:#777; +} +.x-shadow .xsmc { + background-image: url(../images/default/shadow-c.png); +} +.x-shadow .xsml, .x-shadow .xsmr { + background-image: url(../images/default/shadow-lr.png); +} +.x-shadow .xstl, .x-shadow .xstc, .x-shadow .xstr, .x-shadow .xsbl, .x-shadow .xsbc, .x-shadow .xsbr{ + background-image: url(../images/default/shadow.png); +} +.loading-indicator { + font-size: 11px; + background-image: url(../images/default/grid/loading.gif); +} +.x-spotlight { + background-color: #ccc; +} +.x-aria-focusframe-side { + background-color: #15428B; + line-height: 2px; + font-size: 2px; +} +.x-tab-panel-header, .x-tab-panel-footer { + background-color: #deecfd; + border-color:#8db2e3; + overflow:hidden; + zoom:1; +} +.x-tab-panel-header, .x-tab-panel-footer { + border-color:#8db2e3; +} +ul.x-tab-strip-top{ + background-color:#cedff5; + background-image: url(../images/default/tabs/tab-strip-bg.gif); + border-bottom-color:#8db2e3; +} +ul.x-tab-strip-bottom{ + background-color:#cedff5; + background-image: url(../images/default/tabs/tab-strip-btm-bg.gif); + border-top-color:#8db2e3; +} +.x-tab-panel-header-plain .x-tab-strip-spacer, +.x-tab-panel-footer-plain .x-tab-strip-spacer { + border-color:#8db2e3; + background-color: #deecfd; +} +.x-tab-strip span.x-tab-strip-text { + font:normal 11px tahoma,arial,helvetica; + color:#416aa3; +} +.x-tab-strip-over span.x-tab-strip-text { + color:#15428b; +} +.x-tab-strip-active span.x-tab-strip-text { + color:#15428b; + font-weight:bold; +} +.x-tab-strip-disabled .x-tabs-text { + color:#aaaaaa; +} +.x-tab-strip-top .x-tab-right, .x-tab-strip-top .x-tab-left, .x-tab-strip-top .x-tab-strip-inner{ + background-image: url(../images/default/tabs/tabs-sprite.gif); +} +.x-tab-strip-bottom .x-tab-right { + background-image: url(../images/default/tabs/tab-btm-inactive-right-bg.gif); +} +.x-tab-strip-bottom .x-tab-left { + background-image: url(../images/default/tabs/tab-btm-inactive-left-bg.gif); +} +.x-tab-strip-bottom .x-tab-strip-active .x-tab-right { + background-image: url(../images/default/tabs/tab-btm-right-bg.gif); +} +.x-tab-strip-bottom .x-tab-strip-active .x-tab-left { + background-image: url(../images/default/tabs/tab-btm-left-bg.gif); +} +.x-tab-strip .x-tab-strip-closable a.x-tab-strip-close { + background-image:url(../images/default/tabs/tab-close.gif); +} +.x-tab-strip .x-tab-strip-closable a.x-tab-strip-close:hover{ + background-image:url(../images/default/tabs/tab-close.gif); +} +.x-tab-panel-body { + border-color:#8db2e3; + background-color:#fff; +} +.x-tab-panel-body-top { + border-top: 0 none; +} +.x-tab-panel-body-bottom { + border-bottom: 0 none; +} +.x-tab-scroller-left { + background-image:url(../images/default/tabs/scroll-left.gif); + border-bottom-color:#8db2e3; +} +.x-tab-scroller-left-over { + background-position: 0 0; +} +.x-tab-scroller-left-disabled { + background-position: -18px 0; + opacity:.5; + -moz-opacity:.5; + filter:alpha(opacity=50); + cursor:default; +} +.x-tab-scroller-right { + background-image:url(../images/default/tabs/scroll-right.gif); + border-bottom-color:#8db2e3; +} +.x-tab-panel-bbar .x-toolbar, .x-tab-panel-tbar .x-toolbar { + border-color:#99bbe8; +} +.x-form-field { + font: normal 12px tahoma, arial, helvetica, sans-serif; +} + +.x-form-text,textarea.x-form-field { + background-color: #fff; + background-image: url(../images/default/form/text-bg.gif); + border-color: #b5b8c8; +} + +.x-form-select-one { + background-color: #fff; + border-color: #b5b8c8; +} + +.x-form-check-group-label { + border-bottom: 1px solid #99bbe8; + color: #15428b; +} + +.x-editor .x-form-check-wrap { + background-color: #fff; +} + +.x-form-field-wrap .x-form-trigger { + background-image: url(../images/default/form/trigger.gif); + border-bottom-color: #b5b8c8; +} + +.x-form-field-wrap .x-form-date-trigger { + background-image: url(../images/default/form/date-trigger.gif); +} + +.x-form-field-wrap .x-form-clear-trigger { + background-image: url(../images/default/form/clear-trigger.gif); +} + +.x-form-field-wrap .x-form-search-trigger { + background-image: url(../images/default/form/search-trigger.gif); +} + +.x-trigger-wrap-focus .x-form-trigger { + border-bottom-color: #7eadd9; +} + +.x-item-disabled .x-form-trigger-over { + border-bottom-color: #b5b8c8; +} + +.x-item-disabled .x-form-trigger-click { + border-bottom-color: #b5b8c8; +} + +.x-form-focus,textarea.x-form-focus { + border-color: #7eadd9; +} + +.x-form-invalid,textarea.x-form-invalid { + background-color: #fff; + background-image: url(../images/default/grid/invalid_line.gif); + border-color: #c30; +} + +.ext-safari .x-form-invalid { + background-color: #fee; + border-color: #ff7870; +} + +.x-form-inner-invalid,textarea.x-form-inner-invalid { + background-color: #fff; + background-image: url(../images/default/grid/invalid_line.gif); +} + +.x-form-grow-sizer { + font: normal 12px tahoma, arial, helvetica, sans-serif; +} + +.x-form-item { + font: normal 12px tahoma, arial, helvetica, sans-serif; +} + +.x-form-invalid-msg { + color: #c0272b; + font: normal 11px tahoma, arial, helvetica, sans-serif; + background-image: url(../images/default/shared/warning.gif); +} + +.x-form-empty-field { + color: gray; +} + +.x-small-editor .x-form-field { + font: normal 11px arial, tahoma, helvetica, sans-serif; +} + +.ext-safari .x-small-editor .x-form-field { + font: normal 12px arial, tahoma, helvetica, sans-serif; +} + +.x-form-invalid-icon { + background-image: url(../images/default/form/exclamation.gif); +} + +.x-fieldset { + border-color: #b5b8c8; +} + +.x-fieldset legend { + font: bold 11px tahoma, arial, helvetica, sans-serif; + color: #15428b; +} + +.x-editor .x-form-check-wrap { + border-color: #7eadd9; +}.x-btn{ + font:normal 11px tahoma, verdana, helvetica; +} +.x-btn button{ + font:normal 11px arial,tahoma,verdana,helvetica; + color:#333; +} +.x-btn em { + font-style:normal; + font-weight:normal; +} +.x-btn-tl, .x-btn-tr, .x-btn-tc, .x-btn-ml, .x-btn-mr, .x-btn-mc, .x-btn-bl, .x-btn-br, .x-btn-bc{ + background-image:url(../images/default/button/btn.gif); +} +.x-btn-click .x-btn-text, .x-btn-menu-active .x-btn-text, .x-btn-pressed .x-btn-text{ + color:#000; +} +.x-btn-disabled *{ + color:gray !important; +} +.x-btn-mc em.x-btn-arrow { + background-image:url(../images/default/button/arrow.gif); +} +.x-btn-mc em.x-btn-split { + background-image:url(../images/default/button/s-arrow.gif); +} +.x-btn-over .x-btn-mc em.x-btn-split, .x-btn-click .x-btn-mc em.x-btn-split, .x-btn-menu-active .x-btn-mc em.x-btn-split, .x-btn-pressed .x-btn-mc em.x-btn-split { + background-image:url(../images/default/button/s-arrow-o.gif); +} +.x-btn-mc em.x-btn-arrow-bottom { + background-image:url(../images/default/button/s-arrow-b-noline.gif); +} +.x-btn-mc em.x-btn-split-bottom { + background-image:url(../images/default/button/s-arrow-b.gif); +} +.x-btn-over .x-btn-mc em.x-btn-split-bottom, .x-btn-click .x-btn-mc em.x-btn-split-bottom, .x-btn-menu-active .x-btn-mc em.x-btn-split-bottom, .x-btn-pressed .x-btn-mc em.x-btn-split-bottom { + background-image:url(../images/default/button/s-arrow-bo.gif); +} +.x-btn-group-header { + color: #3e6aaa; +} +.x-btn-group-tc { + background-image: url(../images/default/button/group-tb.gif); +} +.x-btn-group-tl { + background-image: url(../images/default/button/group-cs.gif); +} +.x-btn-group-tr { + background-image: url(../images/default/button/group-cs.gif); +} +.x-btn-group-bc { + background-image: url(../images/default/button/group-tb.gif); +} +.x-btn-group-bl { + background-image: url(../images/default/button/group-cs.gif); +} +.x-btn-group-br { + background-image: url(../images/default/button/group-cs.gif); +} +.x-btn-group-ml { + background-image: url(../images/default/button/group-lr.gif); +} +.x-btn-group-mr { + background-image: url(../images/default/button/group-lr.gif); +} +.x-btn-group-notitle .x-btn-group-tc { + background-image: url(../images/default/button/group-tb.gif); +} +.x-toolbar{ + border-color:#a9bfd3; + background-color:#d0def0; + background-image:url(../images/default/toolbar/bg.gif); +} +.x-toolbar td,.x-toolbar span,.x-toolbar input,.x-toolbar div,.x-toolbar select,.x-toolbar label{ + font:normal 11px arial,tahoma, helvetica, sans-serif; +} +.x-toolbar .x-item-disabled { + color:gray; +} +.x-toolbar .x-item-disabled * { + color:gray; +} +.x-toolbar .x-btn-mc em.x-btn-split { + background-image:url(../images/default/button/s-arrow-noline.gif); +} +.x-toolbar .x-btn-over .x-btn-mc em.x-btn-split, .x-toolbar .x-btn-click .x-btn-mc em.x-btn-split, +.x-toolbar .x-btn-menu-active .x-btn-mc em.x-btn-split, .x-toolbar .x-btn-pressed .x-btn-mc em.x-btn-split +{ + background-image:url(../images/default/button/s-arrow-o.gif); +} +.x-toolbar .x-btn-mc em.x-btn-split-bottom { + background-image:url(../images/default/button/s-arrow-b-noline.gif); +} +.x-toolbar .x-btn-over .x-btn-mc em.x-btn-split-bottom, .x-toolbar .x-btn-click .x-btn-mc em.x-btn-split-bottom, +.x-toolbar .x-btn-menu-active .x-btn-mc em.x-btn-split-bottom, .x-toolbar .x-btn-pressed .x-btn-mc em.x-btn-split-bottom +{ + background-image:url(../images/default/button/s-arrow-bo.gif); +} +.x-toolbar .xtb-sep { + background-image: url(../images/default/grid/grid-blue-split.gif); +} +.x-tbar-page-first{ + background-image: url(../images/default/grid/page-first.gif) !important; +} +.x-tbar-refresh{ + background-image: url(../images/default/grid/refresh.gif) !important; +} +.x-tbar-page-last{ + background-image: url(../images/default/grid/page-last.gif) !important; +} +.x-tbar-page-next{ + background-image: url(../images/default/grid/page-next.gif) !important; +} +.x-tbar-page-prev{ + background-image: url(../images/default/grid/page-prev.gif) !important; +} +.x-tbar-loading{ + background-image: url(../images/default/grid/loading.gif) !important; +} +.x-item-disabled .x-tbar-page-first{ + background-image: url(../images/default/grid/page-first-disabled.gif) !important; +} +.x-item-disabled .x-tbar-page-last{ + background-image: url(../images/default/grid/page-last-disabled.gif) !important; +} +.x-item-disabled .x-tbar-page-next{ + background-image: url(../images/default/grid/page-next-disabled.gif) !important; +} +.x-item-disabled .x-tbar-page-prev{ + background-image: url(../images/default/grid/page-prev-disabled.gif) !important; +} +.x-paging-info { + color:#444; +} +.x-toolbar-more-icon { + background-image: url(../images/default/toolbar/more.gif) !important; +}.x-resizable-handle { + background-color:#fff; +} +.x-resizable-over .x-resizable-handle-east, .x-resizable-pinned .x-resizable-handle-east, +.x-resizable-over .x-resizable-handle-west, .x-resizable-pinned .x-resizable-handle-west +{ + background-image:url(../images/default/sizer/e-handle.gif); +} +.x-resizable-over .x-resizable-handle-south, .x-resizable-pinned .x-resizable-handle-south, +.x-resizable-over .x-resizable-handle-north, .x-resizable-pinned .x-resizable-handle-north +{ + background-image:url(../images/default/sizer/s-handle.gif); +} +.x-resizable-over .x-resizable-handle-north, .x-resizable-pinned .x-resizable-handle-north{ + background-image:url(../images/default/sizer/s-handle.gif); +} +.x-resizable-over .x-resizable-handle-southeast, .x-resizable-pinned .x-resizable-handle-southeast{ + background-image:url(../images/default/sizer/se-handle.gif); +} +.x-resizable-over .x-resizable-handle-northwest, .x-resizable-pinned .x-resizable-handle-northwest{ + background-image:url(../images/default/sizer/nw-handle.gif); +} +.x-resizable-over .x-resizable-handle-northeast, .x-resizable-pinned .x-resizable-handle-northeast{ + background-image:url(../images/default/sizer/ne-handle.gif); +} +.x-resizable-over .x-resizable-handle-southwest, .x-resizable-pinned .x-resizable-handle-southwest{ + background-image:url(../images/default/sizer/sw-handle.gif); +} +.x-resizable-proxy{ + border-color:#3b5a82; +} +.x-resizable-overlay{ + background-color:#fff; +} +.x-grid3 { + background-color:#fff; +} +.x-grid-panel .x-panel-mc .x-panel-body { + border-color:#99bbe8; +} +.x-grid3-hd-row .x-grid3-hd, .x-grid3-row .x-grid3-cell, .x-grid3-summary-row .x-grid3-cell{ + font:normal 11px arial, tahoma, helvetica, sans-serif; +} +.x-grid3-hd-row .x-grid3-hd { + border-left-color:#eee; + border-right-color:#d0d0d0; +} +.x-grid-row-loading { + background-color: #fff; + background-image:url(../images/default/shared/loading-balls.gif); +} +.x-grid3-row { + border-color:#ededed; + border-top-color:#fff; +} +.x-grid3-row-alt{ + background-color:#fafafa; +} +.x-grid3-row-over { + border-color:#ddd; + background-color:#efefef; + background-image:url(../images/default/grid/row-over.gif); +} +.x-grid3-resize-proxy { + background-color:#777; +} +.x-grid3-resize-marker { + background-color:#777; +} +.x-grid3-header{ + background-color:#f9f9f9; + background-image:url(../images/default/grid/grid3-hrow.gif); +} +.x-grid3-header-pop { + border-left-color:#d0d0d0; +} +.x-grid3-header-pop-inner { + border-left-color:#eee; + background-image:url(../images/default/grid/hd-pop.gif); +} +td.x-grid3-hd-over, td.sort-desc, td.sort-asc, td.x-grid3-hd-menu-open { + border-left-color:#aaccf6; + border-right-color:#aaccf6; +} +td.x-grid3-hd-over .x-grid3-hd-inner, td.sort-desc .x-grid3-hd-inner, td.sort-asc .x-grid3-hd-inner, td.x-grid3-hd-menu-open .x-grid3-hd-inner { + background-color:#ebf3fd; + background-image:url(../images/default/grid/grid3-hrow-over.gif); +} +.sort-asc .x-grid3-sort-icon { + background-image: url(../images/default/grid/sort_asc.gif); +} +.sort-desc .x-grid3-sort-icon { + background-image: url(../images/default/grid/sort_desc.gif); +} +.x-grid3-cell-text, .x-grid3-hd-text { + color:#000; +} +.x-grid3-split { + background-image: url(../images/default/grid/grid-split.gif); +} +.x-grid3-hd-text { + color:#15428b; +} +.x-dd-drag-proxy .x-grid3-hd-inner{ + background-color:#ebf3fd; + background-image:url(../images/default/grid/grid3-hrow-over.gif); + border-color:#aaccf6; +} +.col-move-top{ + background-image:url(../images/default/grid/col-move-top.gif); +} +.col-move-bottom{ + background-image:url(../images/default/grid/col-move-bottom.gif); +} +.x-grid3-row-selected { + background-image: none !important; + background-color: #dfe8f6 !important; + border-color:#a3bae9; +} +.x-grid3-cell-selected{ + background-color: #b8cfee !important; + color:#000; +} +.x-grid3-cell-selected span{ + color:#000 !important; +} +.x-grid3-cell-selected .x-grid3-cell-text{ + color:#000; +} +.x-grid3-locked td.x-grid3-row-marker, .x-grid3-locked .x-grid3-row-selected td.x-grid3-row-marker{ + background-color:#ebeadb !important; + background-image:url(../images/default/grid/grid-hrow.gif) !important; + color:#000; + border-top-color:#fff; + border-right-color:#6fa0df !important; +} +.x-grid3-locked td.x-grid3-row-marker div, .x-grid3-locked .x-grid3-row-selected td.x-grid3-row-marker div{ + color:#15428b !important; +} +.x-grid3-dirty-cell { + background-image:url(../images/default/grid/dirty.gif); +} +.x-grid3-invalid-cell { + background-image:url(../images/default/grid/invalid_line.gif); +} +.x-grid3-topbar, .x-grid3-bottombar{ + font:normal 11px arial, tahoma, helvetica, sans-serif; +} +.x-grid3-bottombar .x-toolbar{ + border-top-color:#a9bfd3; +} +.x-props-grid .x-grid3-td-name .x-grid3-cell-inner{ + background-image:url(../images/default/grid/grid3-special-col-bg.gif) !important; + color:#000 !important; +} +.x-props-grid .x-grid3-body .x-grid3-td-name{ + background-color:#fff !important; + border-right-color:#eee; +} +.xg-hmenu-sort-asc .x-menu-item-icon{ + background-image: url(../images/default/grid/hmenu-asc.gif); +} +.xg-hmenu-sort-desc .x-menu-item-icon{ + background-image: url(../images/default/grid/hmenu-desc.gif); +} +.xg-hmenu-lock .x-menu-item-icon{ + background-image: url(../images/default/grid/hmenu-lock.gif); +} +.xg-hmenu-unlock .x-menu-item-icon{ + background-image: url(../images/default/grid/hmenu-unlock.gif); +} +.x-grid3-hd-btn { + background-color:#c3daf9; + background-image:url(../images/default/grid/grid3-hd-btn.gif); +} +.x-grid3-body .x-grid3-td-expander { + background-image:url(../images/default/grid/grid3-special-col-bg.gif); +} +.x-grid3-row-expander { + background-image:url(../images/default/grid/row-expand-sprite.gif); +} +.x-grid3-body .x-grid3-td-checker { + background-image: url(../images/default/grid/grid3-special-col-bg.gif); +} +.x-grid3-row-checker, .x-grid3-hd-checker { + background-image:url(../images/default/grid/row-check-sprite.gif); +} +.x-grid3-body .x-grid3-td-numberer { + background-image:url(../images/default/grid/grid3-special-col-bg.gif); +} +.x-grid3-body .x-grid3-td-numberer .x-grid3-cell-inner { + color:#444; +} +.x-grid3-body .x-grid3-td-row-icon { + background-image:url(../images/default/grid/grid3-special-col-bg.gif); +} +.x-grid3-body .x-grid3-row-selected .x-grid3-td-numberer, +.x-grid3-body .x-grid3-row-selected .x-grid3-td-checker, +.x-grid3-body .x-grid3-row-selected .x-grid3-td-expander { + background-image:url(../images/default/grid/grid3-special-col-sel-bg.gif); +} +.x-grid3-check-col { + background-image:url(../images/default/menu/unchecked.gif); +} +.x-grid3-check-col-on { + background-image:url(../images/default/menu/checked.gif); +} +.x-grid-group, .x-grid-group-body, .x-grid-group-hd { + zoom:1; +} +.x-grid-group-hd { + border-bottom-color:#99bbe8; +} +.x-grid-group-hd .x-grid-group-div { + background-image:url(../images/default/grid/group-expand-sprite.gif); + color:#3764a0; + font:bold 11px tahoma, arial, helvetica, sans-serif; +} +.x-group-by-icon { + background-image:url(../images/default/grid/group-by.gif); +} +.x-cols-icon { + background-image:url(../images/default/grid/columns.gif); +} +.x-show-groups-icon { + background-image:url(../images/default/grid/group-by.gif); +} +.x-grid-empty { + color:gray; + font:normal 11px tahoma, arial, helvetica, sans-serif; +} +.x-grid-with-col-lines .x-grid3-row td.x-grid3-cell { + border-right-color:#ededed; +} +.x-grid-with-col-lines .x-grid3-row{ + border-top-color:#ededed; +} +.x-grid-with-col-lines .x-grid3-row-selected { + border-top-color:#a3bae9; +} + +.x-grid3-check-col-disabled { + background-color:transparent; + background-image:url(../images/gxt/menu/disabledcheck.gif); +} + +.x-row-editor-header { + background: transparent url(../images/gxt/grid/row-editor-bg.gif) repeat-x 0 0; +} +.x-row-editor-footer { + background: transparent url(../images/gxt/grid/row-editor-bg.gif) repeat-x 0 -2px; +} +.x-row-editor-body { + background: #ebf2fb; +} +.x-row-editor .x-btns { + background: transparent url(../images/gxt/grid/row-editor-btns.gif) no-repeat 0 0; +} +.x-row-editor .x-btns .x-plain-bwrap { + background: transparent url(../images/gxt/grid/row-editor-btns.gif) no-repeat right -31px; +} +.x-row-editor .x-btns .x-plain-body { + background: transparent url(../images/gxt/grid/row-editor-btns.gif) repeat-x 0 -62px; +} +.x-dd-drag-ghost{ + color:#000; + font: normal 11px arial, helvetica, sans-serif; + border-color: #ddd #bbb #bbb #ddd; + background-color:#fff; +} +.x-dd-drop-nodrop .x-dd-drop-icon{ + background-image: url(../images/default/dd/drop-no.gif); +} +.x-dd-drop-ok .x-dd-drop-icon{ + background-image: url(../images/default/dd/drop-yes.gif); +} +.x-dd-drop-ok-add .x-dd-drop-icon{ + background-image: url(../images/default/dd/drop-add.gif); +} +.x-view-selector { + background-color:#c3daf9; + border-color:#3399bb; +} +.x-tree-drop-ok-append .x-dd-drop-icon { + background-image: url(../images/default/tree/drop-add.gif); +} + +.x-tree-drop-ok-above .x-dd-drop-icon { + background-image: url(../images/default/tree/drop-over.gif); +} + +.x-tree-drop-ok-below .x-dd-drop-icon { + background-image: url(../images/default/tree/drop-under.gif); +} + +.x-tree-drop-ok-between .x-dd-drop-icon { + background-image: url(../images/default/tree/drop-between.gif); +} + +.x-tree3-loading { + background-image: url(../images/default/tree/loading.gif); +} + +.x-tree3-node-text { + font: normal 11px arial, tahoma, helvetica, sans-serif; + color: black; +}.x-date-picker { + border-color: #1b376c; + background-color:#fff; +} +.x-date-middle,.x-date-left,.x-date-right { + background-image: url(../images/default/shared/hd-sprite.gif); + color:#fff; + font:bold 11px "sans serif", tahoma, verdana, helvetica; +} +.x-date-middle .x-btn .x-btn-text { + color:#fff; +} +.x-date-middle .x-btn-mc em.x-btn-arrow { + background-image:url(../images/default/toolbar/btn-arrow-light.gif); +} +.x-date-right a { + background-image: url(../images/default/shared/right-btn.gif); +} +.x-date-left a{ + background-image: url(../images/default/shared/left-btn.gif); +} +.x-date-inner th { + background-color:#dfecfb; + background-image:url(../images/default/shared/glass-bg.gif); + border-bottom-color:#a3bad9; + font:normal 10px arial, helvetica,tahoma,sans-serif; + color:#233d6d; +} +.x-date-inner td { + border-color:#fff; +} +.x-date-inner a { + font:normal 11px arial, helvetica,tahoma,sans-serif; + color:#000; +} +.x-date-inner .x-date-active{ + color:#000; +} +.x-date-inner .x-date-selected a{ + background-color:#dfecfb; + background-image:url(../images/default/shared/glass-bg.gif); + border-color:#8db2e3; +} +.x-date-inner .x-date-today a{ + border-color:darkred; +} +.x-date-inner .x-date-selected span{ + font-weight:bold; +} +.x-date-inner .x-date-prevday a,.x-date-inner .x-date-nextday a { + color:#aaa; +} +.x-date-bottom { + border-top-color:#a3bad9; + background-color:#dfecfb; + background-image:url(../images/default/shared/glass-bg.gif); +} +.x-date-inner .x-date-disabled a { + background-color:#eee; + color:#bbb; +} +.x-date-mmenu{ + background-color:#eee !important; +} +.x-date-mmenu .x-menu-item { + font-size:10px; + color:#000; +} +.x-date-mp { + background-color:#fff; +} +.x-date-mp td { + font:normal 11px arial, helvetica,tahoma,sans-serif; +} +.x-date-mp-btns button { + background-color:#083772; + color:#fff; + border-color: #3366cc #000055 #000055 #3366cc; + font:normal 11px arial, helvetica,tahoma,sans-serif; +} +.x-date-mp-btns { + background-color: #dfecfb; + background-image: url(../images/default/shared/glass-bg.gif); +} +.x-date-mp-btns td { + border-top-color: #c5d2df; +} +td.x-date-mp-month a,td.x-date-mp-year a { + color:#15428b; +} +td.x-date-mp-sel a { + background-color: #dfecfb; + background-image: url(../images/default/shared/glass-bg.gif); + border-color:#8db2e3; +} +.x-date-mp-ybtn a { + background-image:url(../images/default/panel/tool-sprites.gif); +} +td.x-date-mp-sep { + border-right-color:#c5d2df; +} +.x-tip .x-tip-close{ + background-image: url(../images/default/qtip/close.gif); +} +.x-tip .x-tip-tc, .x-tip .x-tip-tl, .x-tip .x-tip-tr, .x-tip .x-tip-bc, .x-tip .x-tip-bl, .x-tip .x-tip-br, .x-tip .x-tip-ml, .x-tip .x-tip-mr { + background-image: url(../images/default/qtip/tip-sprite.gif); +} +.x-tip .x-tip-mc { + font: normal 11px tahoma,arial,helvetica,sans-serif; +} +.x-tip .x-tip-ml { + background-color: #fff; +} +.x-tip .x-tip-header-text { + font: bold 11px tahoma,arial,helvetica,sans-serif; + color:#444; +} +.x-tip .x-tip-body { + font: normal 11px tahoma,arial,helvetica,sans-serif; + color:#444; +} +.x-form-invalid-tip .x-tip-tc, .x-form-invalid-tip .x-tip-tl, .x-form-invalid-tip .x-tip-tr, .x-form-invalid-tip .x-tip-bc, +.x-form-invalid-tip .x-tip-bl, .x-form-invalid-tip .x-tip-br, .x-form-invalid-tip .x-tip-ml, .x-form-invalid-tip .x-tip-mr +{ + background-image: url(../images/default/form/error-tip-corners.gif); +} +.x-form-invalid-tip .x-tip-body { + background-image:url(../images/default/form/exclamation.gif); +} +.x-tip-anchor { + background-image:url(../images/default/qtip/tip-anchor-sprite.gif); +} +.x-menu { + border-color:#718bb7; + background-color:#f0f0f0; + background-image:url(../images/default/menu/menu.gif); +} +.x-menu-nosep { + background-image:none; +} +.x-menu-list-item{ + font:normal 11px tahoma,arial, sans-serif; +} +.x-menu-item-arrow{ + background-image:url(../images/default/menu/menu-parent.gif); +} +.x-menu-sep { + background-color:#e0e0e0; + border-bottom-color:#fff; +} +a.x-menu-item { + color:#222; +} +.x-menu-item-active { + background:#ebf3fd url(../images/default/menu/item-over.gif) repeat-x left bottom; + border:1px solid #aaccf6; + padding:0; +} +.x-menu-item-active a.x-menu-item { + color:#233d6d; +} + +.x-menu-plain { + background-color:#fff !important; +} +.x-menu .x-date-picker{ + border-color:#a3bad9; +} +.x-cycle-menu .x-menu-item-checked { + border-color:#a3bae9 !important; + background-color:#def8f6; +} +.x-menu-scroller-top { + background-image:url(../images/default/layout/mini-top.gif); +} +.x-menu-scroller-bottom { + background-image:url(../images/default/layout/mini-bottom.gif); +} + +.x-menu-scroller{ + border-width: 1px 0; +} +.x-box-tl { + background-image: url(../images/default/box/corners.gif); +} +.x-box-tc { + background-image: url(../images/default/box/tb.gif); +} +.x-box-tr { + background-image: url(../images/default/box/corners.gif); +} +.x-box-ml { + background-image: url(../images/default/box/l.gif); +} +.x-box-mc { + background-color: #eee; + background-image: url(../images/default/box/tb.gif); + font-family: "Myriad Pro","Myriad Web","Tahoma","Helvetica","Arial",sans-serif; + color: #393939; + font-size: 12px; +} +.x-box-mc h3 { + font-size: 14px; + font-weight: bold; +} +.x-box-mr { + background-image: url(../images/default/box/r.gif); +} +.x-box-bl { + background-image: url(../images/default/box/corners.gif); +} +.x-box-bc { + background-image: url(../images/default/box/tb.gif); +} +.x-box-br { + background-image: url(../images/default/box/corners.gif); +} +.x-box-blue .x-box-bl, .x-box-blue .x-box-br, .x-box-blue .x-box-tl, .x-box-blue .x-box-tr { + background-image: url(../images/default/box/corners-blue.gif); +} +.x-box-blue .x-box-bc, .x-box-blue .x-box-mc, .x-box-blue .x-box-tc { + background-image: url(../images/default/box/tb-blue.gif); +} +.x-box-blue .x-box-mc { + background-color: #c3daf9; +} +.x-box-blue .x-box-mc h3 { + color: #17385b; +} +.x-box-blue .x-box-ml { + background-image: url(../images/default/box/l-blue.gif); +} +.x-box-blue .x-box-mr { + background-image: url(../images/default/box/r-blue.gif); +} +.x-combo-list { + border-color:#98c0f4; + background-color:#ddecfe; + font:normal 12px tahoma, arial, helvetica, sans-serif; +} +.x-combo-list-inner { + background-color:#fff; +} +.x-combo-list-hd { + font:bold 11px tahoma, arial, helvetica, sans-serif; + color:#15428b; + background-image: url(../images/default/layout/panel-title-light-bg.gif); + border-bottom-color:#98c0f4; +} +.x-resizable-pinned .x-combo-list-inner { + border-bottom-color:#98c0f4; +} +.x-combo-list-item { + border-color:#fff; +} +.x-combo-list .x-combo-selected{ + border-color:#a3bae9 !important; + background-color:#dfe8f6; +} +.x-combo-list .x-toolbar { + border-top-color:#98c0f4; +} +.x-combo-list-small { + font:normal 11px tahoma, arial, helvetica, sans-serif; +} +.x-panel { + border-color: #99bbe8; +} +.x-panel-header { + color:#15428b; + font-weight:bold; + font-size: 11px; + font-family: tahoma,arial,verdana,sans-serif; + border-color:#99bbe8; + background-image: url(../images/default/panel/white-top-bottom.gif); +} +.x-panel-body { + border-color:#99bbe8; + background-color:#fff; +} +.x-panel-bbar .x-toolbar, .x-panel-tbar .x-toolbar { + border-color:#99bbe8; +} +.x-panel-tbar-noheader .x-toolbar, .x-panel-mc .x-panel-tbar .x-toolbar { + border-top-color:#99bbe8; +} +.x-panel-body-noheader, .x-panel-mc .x-panel-body { + border-top-color:#99bbe8; +} +.x-panel-tl .x-panel-header { + color:#15428b; + font-weight:bold; + font-size: 11px; + font-family: tahoma,arial,verdana,sans-serif; +} +.x-panel-tc { + background-image: url(../images/default/panel/top-bottom.gif); +} +.x-panel-tl, .x-panel-tr, .x-panel-bl, .x-panel-br{ + background-image: url(../images/default/panel/corners-sprite.gif); + border-bottom-color:#99bbe8; +} +.x-panel-bc { + background-image: url(../images/default/panel/top-bottom.gif); +} +.x-panel-mc { + font: normal 11px tahoma,arial,helvetica,sans-serif; + background-color:#dfe8f6; +} +.x-panel-ml { + background-color: #fff; + background-image:url(../images/default/panel/left-right.gif); +} +.x-panel-mr { + background-image: url(../images/default/panel/left-right.gif); +} +.x-tool { + background-image:url(../images/default/panel/tool-sprites.gif); +} +.x-panel-ghost { + background-color:#cbddf3; +} +.x-panel-ghost ul { + border-color:#99bbe8; +} +.x-panel-dd-spacer { + border-color:#99bbe8; +} +.x-panel-fbar td,.x-panel-fbar span,.x-panel-fbar input,.x-panel-fbar div,.x-panel-fbar select,.x-panel-fbar label{ + font:normal 11px arial,tahoma, helvetica, sans-serif; +} +.x-window-proxy { + background-color:#c7dffc; + border-color:#99bbe8; +} +.x-window-tl .x-window-header { + color:#15428b; + font:bold 11px tahoma,arial,verdana,sans-serif; +} +.x-window-tc { + background-image: url(../images/default/window/top-bottom.png); +} +.x-window-tl { + background-image: url(../images/default/window/left-corners.png); +} +.x-window-tr { + background-image: url(../images/default/window/right-corners.png); +} +.x-window-bc { + background-image: url(../images/default/window/top-bottom.png); +} +.x-window-bl { + background-image: url(../images/default/window/left-corners.png); +} +.x-window-br { + background-image: url(../images/default/window/right-corners.png); +} +.x-window-mc { + border-color:#99bbe8; + font: normal 11px tahoma,arial,helvetica,sans-serif; + background-color:#dfe8f6; +} +.x-window-ml { + background-image: url(../images/default/window/left-right.png); +} +.x-window-mr { + background-image: url(../images/default/window/left-right.png); +} +.x-window-maximized .x-window-tc { + background-color:#fff; +} +.x-window-bbar .x-toolbar { + border-top-color:#99bbe8; +} +.x-panel-ghost .x-window-tl { + border-bottom-color:#99bbe8; +} +.x-panel-collapsed .x-window-tl { + border-bottom-color:#84a0c4; +} +.x-dlg-mask{ + background-color:#ccc; +} +.x-window-plain .x-window-mc { + background-color: #ccd9e8; + border-color: #a3bae9 #dfe8f6 #dfe8f6 #a3bae9; +} +.x-window-plain .x-window-body { + border-color: #dfe8f6 #a3bae9 #a3bae9 #dfe8f6; +} +body.x-body-masked .x-window-plain .x-window-mc { + background-color: #ccd9e8; +} +.x-html-editor-wrap { + border-color:#a9bfd3; + background-color:#fff; +} + +.x-html-editor-tb .x-edit-bold, .x-menu-item .x-edit-bold { + background-position:0 0; + background-image:url(../images/default/editor/tb-sprite.gif); +} + +.x-html-editor-tb .x-edit-italic, .x-menu-item .x-edit-italic { + background-position:-16px 0; + background-image:url(../images/default/editor/tb-sprite.gif); +} + +.x-html-editor-tb .x-edit-underline, .x-menu-item .x-edit-underline { + background-position:-32px 0; + background-image:url(../images/default/editor/tb-sprite.gif); +} + +.x-html-editor-tb .x-edit-forecolor, .x-menu-item .x-edit-forecolor { + background-position:-160px 0; + background-image:url(../images/default/editor/tb-sprite.gif); +} + +.x-html-editor-tb .x-edit-backcolor, .x-menu-item .x-edit-backcolor { + background-position:-176px 0; + background-image:url(../images/default/editor/tb-sprite.gif); +} + +.x-html-editor-tb .x-edit-justifyleft, .x-menu-item .x-edit-justifyleft { + background-position:-112px 0; + background-image:url(../images/default/editor/tb-sprite.gif); +} + +.x-html-editor-tb .x-edit-justifycenter, .x-menu-item .x-edit-justifycenter { + background-position:-128px 0; + background-image:url(../images/default/editor/tb-sprite.gif); +} + +.x-html-editor-tb .x-edit-justifyright, .x-menu-item .x-edit-justifyright { + background-position:-144px 0; + background-image:url(../images/default/editor/tb-sprite.gif); +} + +.x-html-editor-tb .x-edit-insertorderedlist, .x-menu-item .x-edit-insertorderedlist { + background-position:-80px 0; + background-image:url(../images/default/editor/tb-sprite.gif); +} + +.x-html-editor-tb .x-edit-insertunorderedlist, .x-menu-item .x-edit-insertunorderedlist { + background-position:-96px 0; + background-image:url(../images/default/editor/tb-sprite.gif); +} + +.x-html-editor-tb .x-edit-increasefontsize, .x-menu-item .x-edit-increasefontsize { + background-position:-48px 0; + background-image:url(../images/default/editor/tb-sprite.gif); +} + +.x-html-editor-tb .x-edit-decreasefontsize, .x-menu-item .x-edit-decreasefontsize { + background-position:-64px 0; + background-image:url(../images/default/editor/tb-sprite.gif); +} + +.x-html-editor-tb .x-edit-sourceedit, .x-menu-item .x-edit-sourceedit { + background-position:-192px 0; + background-image:url(../images/default/editor/tb-sprite.gif); +} + +.x-html-editor-tb .x-edit-createlink, .x-menu-item .x-edit-createlink { + background-position:-208px 0; + background-image:url(../images/default/editor/tb-sprite.gif); +}.x-panel-noborder .x-panel-header-noborder { + border-bottom-color:#99bbe8; +} +.x-panel-noborder .x-panel-tbar-noborder .x-toolbar { + border-bottom-color:#99bbe8; +} +.x-panel-noborder .x-panel-bbar-noborder .x-toolbar { + border-top-color:#99bbe8; +} +.x-tab-panel-bbar-noborder .x-toolbar { + border-top-color:#99bbe8; +} +.x-tab-panel-tbar-noborder .x-toolbar { + border-bottom-color:#99bbe8; +} +.x-border-layout-ct { + background-color:#dfe8f6; +} +.x-accordion-hd { + color:#222; + font-weight:normal; + background-image: url(../images/default/panel/light-hd.gif); +} +.x-layout-collapsed{ + background-color:#d2e0f2; + border-color:#98c0f4; +} +.x-layout-collapsed-over{ + background-color:#d9e8fb; +} +.x-layout-split-west .x-layout-mini { + background-image:url(../images/default/layout/mini-left.gif); +} +.x-layout-split-east .x-layout-mini { + background-image:url(../images/default/layout/mini-right.gif); +} +.x-layout-split-north .x-layout-mini { + background-image:url(../images/default/layout/mini-top.gif); +} +.x-layout-split-south .x-layout-mini { + background-image:url(../images/default/layout/mini-bottom.gif); +} +.x-layout-cmini-west .x-layout-mini { + background-image:url(../images/default/layout/mini-right.gif); +} +.x-layout-cmini-east .x-layout-mini { + background-image:url(../images/default/layout/mini-left.gif); +} +.x-layout-cmini-north .x-layout-mini { + background-image:url(../images/default/layout/mini-bottom.gif); +} +.x-layout-cmini-south .x-layout-mini { + background-image:url(../images/default/layout/mini-top.gif); +} +.x-progress-wrap { + border-color:#6593cf; +} +.x-progress-inner { + background-color:#e0e8f3; + background-image:url(../images/default/qtip/bg.gif); +} +.x-progress-bar { + background-color:#9cbfee; + background-image:url(../images/default/progress/progress-bg.gif); + border-top-color:#d1e4fd; + border-bottom-color:#7fa9e4; + border-right-color:#7fa9e4; +} +.x-progress-text { + font-size:11px; + font-weight:bold; + color:#fff; +} +.x-progress-text-back { + color:#396095; +} +.x-slider-horz, .x-slider-horz .x-slider-end, .x-slider-horz .x-slider-inner { + background-image:url(../images/default/slider/slider-bg.png); +} +.x-slider-horz .x-slider-thumb { + background-image:url(../images/default/slider/slider-thumb.png); +} +.x-slider-vert, .x-slider-vert .x-slider-end, .x-slider-vert .x-slider-inner { + background-image:url(../images/default/slider/slider-v-bg.png); +} +.x-slider-vert .x-slider-thumb { + background-image:url(../images/default/slider/slider-v-thumb.png); +} +.x-window-dlg .ext-mb-text, +.x-window-dlg .x-window-header-text { + font-size:12px; +} +.x-window-dlg .ext-mb-textarea { + font:normal 12px tahoma,arial,helvetica,sans-serif; +} +.x-window-dlg .x-msg-box-wait { + background-image:url(../images/default/grid/loading.gif); +} +.x-window-dlg .ext-mb-info { + background-image:url(../images/default/window/icon-info.gif); +} +.x-window-dlg .ext-mb-warning { + background-image:url(../images/default/window/icon-warning.gif); +} +.x-window-dlg .ext-mb-question { + background-image:url(../images/default/window/icon-question.gif); +} +.x-window-dlg .ext-mb-error { + background-image:url(../images/default/window/icon-error.gif); +} diff --git a/src/main/webapp/gxt/css/gxt-gray.css b/src/main/webapp/gxt/css/gxt-gray.css new file mode 100644 index 0000000..505a591 --- /dev/null +++ b/src/main/webapp/gxt/css/gxt-gray.css @@ -0,0 +1,478 @@ +/* + * Ext GWT Library 2.1.1 + * Copyright(c) 2006-2009, Ext JS, LLC. + * licensing@extjs.com + * + * http://extjs.com/license + */ +.x-panel { + border-style: solid; + border-color: #d0d0d0; +} +.x-panel-header { + color:#333; + border:1px solid #d0d0d0; + background-image:url(../images/gray/panel/white-top-bottom.gif); +} + +.x-panel-body { + border-color:#d0d0d0; +} + +.x-panel-bbar .x-toolbar { + border-color:#d0d0d0; +} + +.x-panel-tbar .x-toolbar { + border-color:#d0d0d0; +} + +.x-panel-tbar-noheader .x-toolbar, .x-panel-mc .x-panel-tbar .x-toolbar { + border-color:#d0d0d0; +} +.x-panel-body-noheader, .x-panel-mc .x-panel-body { + border-color:#d0d0d0; +} +.x-panel-tl .x-panel-header { + color:#333; +} +.x-panel-tc { + background-image:url(../images/gray/panel/top-bottom.gif); +} +.x-panel-tl { + background-image:url(../images/gray/panel/corners-sprite.gif); + border-color:#d0d0d0; +} +.x-panel-tr { + background-image:url(../images/gray/panel/corners-sprite.gif); +} +.x-panel-bc { + background-image:url(../images/gray/panel/top-bottom.gif); +} +.x-panel-bl { + background-image:url(../images/gray/panel/corners-sprite.gif); +} +.x-panel-br { + background-image:url(../images/gray/panel/corners-sprite.gif); +} +.x-panel-mc { + background:#f1f1f1; +} +.x-panel-mc .x-panel-body { + background:transparent; + border: 0 none; +} +.x-panel-ml { + background-image:url(../images/gray/panel/left-right.gif); +} +.x-panel-mr { + background-image:url(../images/gray/panel/left-right.gif); +} + +/* Tools */ +.x-tool { + background-image:url(../images/gray/panel/tool-sprites.gif); +} + +/* Ghosting */ +.x-panel-ghost { + background:#e0e0e0; +} + +.x-panel-ghost ul { + border-color:#b0b0b0; +} + +.x-grid-panel .x-panel-mc .x-panel-body { + border:1px solid #d0d0d0; +} + +/* Buttons */ + +.x-btn-left{ + background-image:url(../images/gray/button/btn-sprite.gif); +} +.x-btn-right{ + background-image:url(../images/gray/button/btn-sprite.gif); +} +.x-btn-center{ + background-image:url(../images/gray/button/btn-sprite.gif); +} + +.x-btn-group-header { + color: #333333; +} +.x-btn-group-tc { + background-image: url(../images/gray/button/group-tb.gif); +} +.x-btn-group-tl { + background-image: url(../images/gray/button/group-cs.gif); +} +.x-btn-group-tr { + background-image: url(../images/gray/button/group-cs.gif); +} +.x-btn-group-bc { + background-image: url(../images/gray/button/group-tb.gif); +} +.x-btn-group-bl { + background-image: url(../images/gray/button/group-cs.gif); +} +.x-btn-group-br { + background-image: url(../images/gray/button/group-cs.gif); +} +.x-btn-group-ml { + background-image: url(../images/gray/button/group-lr.gif); +} +.x-btn-group-mr { + background-image: url(../images/gray/button/group-lr.gif); +} +.x-btn-group-notitle .x-btn-group-tc { + background-image: url(../images/gray/button/group-tb.gif); +} + +/* Layout classes */ + +.x-border-layout-ct { + background:#f0f0f0; +} + +.x-accordion-hd { + background-image:url(../images/gray/panel/light-hd.gif); +} + +.x-layout-collapsed{ + background-color:#eee; + border-color:#e0e0e0; +} +.x-layout-collapsed-over{ + background-color:#fbfbfb; +} + + +/* qtips */ +.x-tip .x-tip-top { + background-image:url(../images/gray/qtip/tip-sprite.gif); +} +.x-tip .x-tip-top-left { + background-image:url(../images/gray/qtip/tip-sprite.gif); +} +.x-tip .x-tip-top-right { + background-image:url(../images/gray/qtip/tip-sprite.gif); +} +.x-tip .x-tip-ft { + background-image:url(../images/gray/qtip/tip-sprite.gif); +} +.x-tip .x-tip-ft-left { + background-image:url(../images/gray/qtip/tip-sprite.gif); +} +.x-tip .x-tip-ft-right { + background-image:url(../images/gray/qtip/tip-sprite.gif); +} +.x-tip .x-tip-bd-left { + background-image:url(../images/gray/qtip/tip-sprite.gif); +} +.x-tip .x-tip-bd-right { + background-image:url(../images/gray/qtip/tip-sprite.gif); +} + +/* Toolbars */ + +.x-toolbar{ + border-color:#d0d0d0; + background:#f0f4f5 url(../images/gray/toolbar/bg.gif) repeat-x top left; +} +.x-toolbar button { + color:#444; +} +.x-toolbar .x-btn-menu-arrow-wrap .x-btn-center button { + background-image:url(../images/gray/toolbar/btn-arrow.gif); +} +.x-toolbar .x-btn-text-icon .x-btn-menu-arrow-wrap .x-btn-center button { + background-image:url(../images/gray/toolbar/btn-arrow.gif); +} +.x-toolbar .x-btn-over .x-btn-left{ + background-image:url(../images/gray/toolbar/tb-btn-sprite.gif); +} +.x-toolbar .x-btn-over .x-btn-right{ + background-image:url(../images/gray/toolbar/tb-btn-sprite.gif); +} +.x-toolbar .x-btn-over .x-btn-center{ + background-image:url(../images/gray/toolbar/tb-btn-sprite.gif); +} +.x-toolbar .x-btn-over button { + color:#111; +} +.x-toolbar .x-btn-click .x-btn-left, .x-toolbar .x-btn-pressed .x-btn-left, .x-toolbar .x-btn-menu-active .x-btn-left{ + background-image:url(../images/gray/toolbar/tb-btn-sprite.gif); +} +.x-toolbar .x-btn-click .x-btn-right, .x-toolbar .x-btn-pressed .x-btn-right, .x-toolbar .x-btn-menu-active .x-btn-right{ + background-image:url(../images/gray/toolbar/tb-btn-sprite.gif); +} + +.x-toolbar .x-btn-click .x-btn-center, .x-toolbar .x-btn-pressed .x-btn-center, .x-toolbar .x-btn-menu-active .x-btn-center{ + background-image:url(../images/gray/toolbar/tb-btn-sprite.gif); +} +.x-toolbar .ytb-sep { + background-image: url(../images/default/grid/grid-split.gif); +} + +/* Tabs */ + +.x-tab-panel-header, .x-tab-panel-footer { + background: #EAEAEA; + border-color:#d0d0d0; +} + + +.x-tab-panel-header { + border-color:#d0d0d0; +} + +.x-tab-panel-footer { + border-color:#d0d0d0; +} + +ul.x-tab-strip-top{ + background:#dbdbdb url(../images/gray/tabs/tab-strip-bg.gif) repeat-x left top; + border-color:#d0d0d0; + padding-top: 2px; +} + +ul.x-tab-strip-bottom{ + background-image:url(../images/gray/tabs/tab-strip-btm-bg.gif); + border-color:#d0d0d0; +} + +.x-tab-strip span.x-tab-strip-text { + color:#333; +} +.x-tab-strip-over span.x-tab-strip-text { + color:#111; +} + +.x-tab-strip-active span.x-tab-strip-text { + color:#333; +} + +.x-tab-strip-disabled .x-tabs-text { + color:#aaaaaa; +} + +.x-tab-strip-top .x-tab-right { + background-image:url(../images/gray/tabs/tabs-sprite.gif); +} + +.x-tab-strip-top .x-tab-left { + background-image:url(../images/gray/tabs/tabs-sprite.gif); +} +.x-tab-strip-top .x-tab-strip-inner { + background-image:url(../images/gray/tabs/tabs-sprite.gif); +} + +.x-tab-strip-bottom .x-tab-right { + background-image:url(../images/gray/tabs/tab-btm-inactive-right-bg.gif); +} + +.x-tab-strip-bottom .x-tab-left { + background-image:url(../images/gray/tabs/tab-btm-inactive-left-bg.gif); +} + +.x-tab-strip-bottom .x-tab-strip-active .x-tab-right { + background-image:url(../images/gray/tabs/tab-btm-right-bg.gif); +} + +.x-tab-strip-bottom .x-tab-strip-active .x-tab-left { + background-image:url(../images/gray/tabs/tab-btm-left-bg.gif); +} + +.x-tab-strip .x-tab-strip-closable a.x-tab-strip-close { + background-image:url(../images/gray/tabs/tab-close.gif); +} +.x-tab-strip .x-tab-strip-closable a.x-tab-strip-close:hover{ + background-image:url(../images/gray/tabs/tab-close.gif); +} + +.x-tab-panel-body { + border-color:#d0d0d0; + background:#fff; +} +.x-tab-panel-bbar .x-toolbar { + border-color: #d0d0d0; +} + +.x-tab-panel-tbar .x-toolbar { + border-color: #d0d0d0; +} + +.x-tab-panel-header-plain .x-tab-strip-spacer { + border-color:#d0d0d0; + background: #eaeaea; +} + +.x-tab-scroller-left { + background-image: url(../images/gray/tabs/scroll-left.gif); + border-color:#aeaeae; +} +.x-tab-scroller-right { + background-image: url(../images/gray/tabs/scroll-right.gif); + border-color:#aeaeae; +} + +/* Window */ + +.x-window-proxy { + background:#e0e0e0; + border-color:#b0b0b0; +} + +.x-window-tl .x-window-header { + color:#555; +} +.x-window-tc { + background-image:url(../images/gray/window/top-bottom.png); +} +.x-window-tl { + background-image:url(../images/gray/window/left-corners.png); +} +.x-window-tr { + background-image:url(../images/gray/window/right-corners.png); +} +.x-window-bc { + background-image:url(../images/gray/window/top-bottom.png); +} +.x-window-bl { + background-image:url(../images/gray/window/left-corners.png); +} +.x-window-br { + background-image:url(../images/gray/window/right-corners.png); +} +.x-window-mc { + border:1px solid #d0d0d0; + background:#e8e8e8; +} + +.x-window-ml { + background-image:url(../images/gray/window/left-right.png); +} +.x-window-mr { + background-image:url(../images/gray/window/left-right.png); +} +.x-panel-ghost .x-window-tl { + border-color:#d0d0d0; +} +.x-panel-collapsed .x-window-tl { + border-color:#d0d0d0; +} + +.x-window-plain .x-window-mc { + background: #e8e8e8; + border-right:1px solid #eee; + border-bottom:1px solid #eee; + border-top:1px solid #d0d0d0; + border-left:1px solid #d0d0d0; +} + +.x-window-plain .x-window-body { + border-left:1px solid #eee; + border-top:1px solid #eee; + border-bottom:1px solid #d0d0d0; + border-right:1px solid #d0d0d0; + background:transparent !important; +} + +body.x-body-masked .x-window-mc, body.x-body-masked .x-window-plain .x-window-mc { + background-color: #e4e4e4; +} + + +/* misc */ +.x-html-editor-wrap { + border-color:#d0d0d0; +} + +/* Borders go last for specificity */ +.x-panel-noborder .x-panel-body-noborder { + border-width:0; +} + +.x-panel-noborder .x-panel-header-noborder { + border-width:0; + border-bottom:1px solid #d0d0d0; +} + +.x-panel-noborder .x-panel-tbar-noborder .x-toolbar { + border-width:0; + border-bottom:1px solid #d0d0d0; +} + +.x-panel-noborder .x-panel-bbar-noborder .x-toolbar { + border-width:0; + border-top:1px solid #d0d0d0; +} + +.x-window-noborder .x-window-mc { + border-width:0; +} +.x-window-plain .x-window-body-noborder { + border-width:0; +} + +.x-tab-panel-noborder .x-tab-panel-body-noborder { + border-width:0; +} + +.x-tab-panel-noborder .x-tab-panel-header-noborder { + border-top-width:0; + border-left-width:0; + border-right-width:0; +} + +.x-tab-panel-noborder .x-tab-panel-footer-noborder { + border-bottom-width:0; + border-left-width:0; + border-right-width:0; +} + + +.x-tab-panel-bbar-noborder .x-toolbar { + border-width:0; + border-top:1px solid #d0d0d0; +} + +.x-tab-panel-tbar-noborder .x-toolbar { + border-width:0; + border-bottom:1px solid #d0d0d0; +}.x-accordion-hd { + background-color: #e5e5e5; +}.x-border { + border: 1px solid #D0D0D0; +} + +.x-layout-popup { + background-color: #F0F0F0; + border: 1px solid #D0D0D0; +} + +.my-list { + border: 1px solid #D0D0D0; +} + +.x-view { + border:1px solid #D0D0D0; +}.my-info { + background: url(../images/gray/info/info-bg.gif) no-repeat; +}.x-date-right-icon { + background-image: url(../images/default/shared/right-btn.gif); + margin-right: 2px; + text-decoration: none !important; +} + +.x-date-left-icon { + background-image: url(../images/default/shared/left-btn.gif); + margin-right: 2px; + text-decoration: none !important; +}.my-tbl { + border: 1px solid #C6C5C5; +}.my-treetbl { + border: 1px solid #C6C5C5; +} \ No newline at end of file diff --git a/src/main/webapp/gxt/desktop/css/desktop.css b/src/main/webapp/gxt/desktop/css/desktop.css new file mode 100644 index 0000000..0013ed9 --- /dev/null +++ b/src/main/webapp/gxt/desktop/css/desktop.css @@ -0,0 +1,638 @@ +/* + * Ext JS Library 2.1 + * Copyright(c) 2006-2008, Ext JS, LLC. + * licensing@extjs.com + * + * http://extjs.com/license + */ +html,body { + background: #3d71b8 url(../wallpapers/desktop.jpg) no-repeat left top; + font: normal 12px tahoma, arial, verdana, sans-serif; + margin: 0; + padding: 0; + border: 0 none; + overflow: hidden; + height: 100%; +} + +.start { + background-image: url( ../images/taskbar/black/startbutton-icon.gif ) !important; +} + +.bogus { + background-image: url( ../images/bogus.png ) !important; +} + +.logout { + background-image: url( ../images/logout.gif ) !important; +} + +.settings { + background-image: url( ../images/gears.gif ) !important; +} + +#dpanels { + width: 250px; + float: right; +} + +#dpanels .x-panel { + margin: 15px; +} + +#dpanels .x-date-picker { + border: 0 none; + border-top: 0 none; + background: transparent; +} + +#dpanels .x-date-picker td.x-date-active { + background: #ffffff; +} + +#dpanels .x-date-picker { + width: 100% !important; +} + +#x-desktop { + width: 100%; + height: 100%; + border: 0 none; + position: relative; + overflow: hidden; + zoom: 1; +} + +#ux-taskbar .x-btn { + float: left; + margin: 1px 0 0 1px; + position: relative; +} + +#ux-taskbar-start .x-btn { + float: left; + margin: 0; + position: relative; +} + +#ux-taskbar button { /* width: 150px; + overflow: hidden; */ + text-align: left; + color: #ffffff; +} + +#title-bar-wrapper { + height: 35px; +} + +#title-bar { + color: #225599; + padding: 9px 7px; + font: bold 16px tahoma, arial, verdana, sans-serif; + float: left; +} + +#x-logout { + float: right; + padding: 6px 7px; +} + +.x-btn-text-icon .x-btn-center .logout { + background-position: 0pt 3px; + background-repeat: no-repeat; + padding: 3px 0pt 3px 18px; +} + +#ux-taskbar { + background: transparent none; + height: 30px; + margin: 0; + padding: 0; + position: relative; + z-index: 12001; +} + +.x-btn-icon .ux-taskbutton-center .x-btn-text { + background-position: center; + background-repeat: no-repeat; + height: 16px; + width: 16px; + cursor: pointer; + white-space: nowrap; + padding: 0; +} + +.x-btn-icon .ux-taskbutton-center { + padding: 1px; +} + +.ux-startbutton-center .x-btn-text { + color: #000000 !important; + font-weight: bold; +} + +.ux-taskbutton-left,.ux-taskbutton-right { + font-size: 1px; + line-height: 1px; +} + +.ux-taskbutton-left { + width: 4px; + height: 28px; + background: url( ../images/taskbar/black/taskbutton.gif ) no-repeat 0 0; +} + +.ux-taskbutton-right { + width: 4px; + height: 28px; + background: url( ../images/taskbar/black/taskbutton.gif ) no-repeat 0 -28px; +} + +.ux-taskbutton-left i,.ux-taskbutton-right i { + display: block; + width: 4px; + overflow: hidden; + font-size: 1px; + line-height: 1px; +} + +.ux-taskbutton-center { + background: url( ../images/taskbar/black/taskbutton.gif ) repeat-x 0 -56px; + vertical-align: middle; + text-align: center; + padding: 0 5px; + cursor: pointer; + white-space: nowrap; +} + +#ux-taskbar .ux-taskbutton-left { + background-position: 0 0; +} + +#ux-taskbar .ux-taskbutton-right { + background-position: 0 -28px; +} + +#ux-taskbar .ux-taskbutton-center { + background-position: 0 -56px; +} + +#ux-taskbar .x-btn-over .ux-taskbutton-left { + background-position: 0 -252px; +} + +#ux-taskbar .x-btn-over .ux-taskbutton-right { + background-position: 0 -280px; +} + +#ux-taskbar .x-btn-over .ux-taskbutton-center { + background-position: 0 -308px; +} + +#ux-taskbar .x-btn-click .ux-taskbutton-left { + background-position: 0 -168px; +} + +#ux-taskbar .x-btn-click .ux-taskbutton-right { + background-position: 0 -196px; +} + +#ux-taskbar .x-btn-click .ux-taskbutton-center { + background-position: 0 -224px; +} + +#ux-taskbar .active-win .ux-taskbutton-left { + background-position: 0 -84px; +} + +#ux-taskbar .active-win .ux-taskbutton-right { + background: url( ../images/taskbar/black/taskbutton.gif ) no-repeat 0 -112px; +} + +#ux-taskbar .active-win .ux-taskbutton-center { + background: url( ../images/taskbar/black/taskbutton.gif ) repeat-x 0 -140px; +} + +#ux-taskbar .active-win .ux-taskbutton-center button { + color: #fff; +} + +#spacer { + height: 25px; + float: left; + width: 0; + overflow: hidden; + margin-top: 2px; +} + +.x-window-body p,.x-panel-body p { + padding: 10px; + margin: 0; +} + +.x-window-maximized .x-window-bc { + height: 0; +} + +.add { + background-image: url(../../shared/icons/fam/add.gif) !important; +} + +.option { + background-image: url(../../shared/icons/fam/plugin.gif) !important; +} + +.remove { + background-image: url(../../shared/icons/fam/delete.gif) !important; +} + +.tabs { + background-image: url(../images/tabs.gif) !important; +} + +.ux-start-menu { + background: transparent none; + border: 0px none; + padding: 0; +} + +.ux-start-menu-tl .x-window-header { + color: #f1f1f1; + font: bold 11px tahoma, arial, verdana, sans-serif; + padding: 5px 0 4px 0; +} + +.x-panel-tl .x-panel-icon,.ux-start-menu-tl .x-panel-icon { + background-position: 0pt 4px; + background-repeat: no-repeat; + padding-left: 20px !important; +} + +.ux-start-menu-tl { + background: transparent url( ../images/taskbar/black/start-menu-left-corners.png ) no-repeat 0 0; + padding-left: 6px; + zoom: 1; + z-index: 1; + position: relative; +} + +.ux-start-menu-tr { + background: transparent url( ../images/taskbar/black/start-menu-right-corners.png ) no-repeat right + 0; + padding-right: 6px; +} + +.ux-start-menu-tc { + background: transparent url( ../images/taskbar/black/start-menu-top-bottom.png ) repeat-x 0 0; + overflow: hidden; + zoom: 1; +} + +.ux-start-menu-ml { + background: transparent url( ../images/taskbar/black/start-menu-left-right.png ) repeat-y 0 0; + padding-left: 6px; + zoom: 1; +} + +.ux-start-menu-bc { + background: transparent url( ../images/taskbar/black/start-menu-top-bottom.png ) repeat-x 0 bottom; + zoom: 1; +} + +.ux-start-menu-bc .x-window-footer { + padding-bottom: 6px; + zoom: 1; + font-size: 0; + line-height: 0; +} + +.ux-start-menu-bl { + background: transparent url( ../images/taskbar/black/start-menu-left-corners.png ) no-repeat 0 + bottom; + padding-left: 6px; + zoom: 1; +} + +.ux-start-menu-br { + background: transparent url( ../images/taskbar/black/start-menu-right-corners.png ) no-repeat right + bottom; + padding-right: 6px; + zoom: 1; +} + +.x-panel-nofooter .ux-start-menu-bc { + height: 6px; +} + +.ux-start-menu-splitbar-h { + background-color: #d0d0d0; +} + +.ux-start-menu-bwrap { + background: transparent none; + border: 0px none; +} + +.ux-start-menu-body { + background: transparent none; + border: 0px none; +} + +.ux-start-menu-apps-panel { + background: #ffffff none; + border: 1px solid #1e2124; +} + +.ux-start-menu-tools-panel { + border: 0px none; + background: transparent url( ../images/taskbar/black/start-menu-right.png ) repeat-y scroll right + 0pt; +} + +#ux-taskbar-start { + background: #000000 url( ../images/taskbar/black/taskbar-start-panel-bg.gif ) repeat-x left top; + left: 0px; + padding: 0; + position: absolute; +} + +#ux-taskbar-start .x-toolbar { + background: none; + padding: 0px; + border: 0px none; +} + +#ux-taskbuttons-panel { + background: #000000 url( ../images/taskbar/black/taskbuttons-panel-bg.gif ) repeat-x left top; + padding-top: 0; + position: relative; +} + +.ux-taskbuttons-strip-wrap { /* overflow:hidden; + position:relative; + width:100%; */ + width: 100%; + overflow: hidden; + position: relative; + zoom: 1; +} + +ul.ux-taskbuttons-strip { + display: block; + width: 5000px; + zoom: 1; +} + +ul.ux-taskbuttons-strip li { + float: left; + margin-left: 2px; +} + +ul.ux-taskbuttons-strip li.ux-taskbuttons-edge { + float: left; + margin: 0 !important; + padding: 0 !important; + border: 0 none !important; + font-size: 1px !important; + line-height: 1px !important; + overflow: hidden; + zoom: 1; + background: transparent !important; + width: 1px; +} + +.x-clear { + clear: both; + height: 0; + overflow: hidden; + line-height: 0; + font-size: 0; +} + +.x-taskbuttons-scrolling { + position: relative; +} + +.x-taskbuttons-scrolling .ux-taskbuttons-strip-wrap { + margin-left: 18px; + margin-right: 18px; +} + +td.ux-taskButtons-edge { /*float:left;*/ + margin: 0 !important; + padding: 0 !important; + border: 0 none !important; + font-size: 1px !important; + line-height: 1px !important; + overflow: hidden; + zoom: 1; + background: transparent !important; + width: 1px; +} + +.ux-taskbuttons-scroller-left { + background: transparent url( ../images/taskbar/black/scroll-left.gif ) no-repeat -18px 0; + width: 18px; + position: absolute; + left: 1px; + top: 0px; + z-index: 10; + cursor: pointer; +} + +.ux-taskbuttons-scroller-left-over { + background-position: 0 0; +} + +.ux-taskbuttons-scroller-left-disabled { + background-position: -18px 0; + opacity: .5; + -moz-opacity: .5; + filter: alpha(opacity = 50); + cursor: default; +} + +.ux-taskbuttons-scroller-right { + background: transparent url( ../images/taskbar/black/scroll-right.gif ) no-repeat 0 0; + width: 18px; + position: absolute; + right: 0; + top: 0px; + z-index: 10; + cursor: pointer; +} + +.ux-taskbuttons-scroller-right-over { + background-position: -18px 0; +} + +.ux-taskbuttons-scroller-right-disabled { + background-position: 0 0; + opacity: .5; + -moz-opacity: .5; + filter: alpha(opacity = 50); + cursor: default; +} + +.ux-toolmenu-sep { + background-color: #18191a; + border-bottom: 1px solid #858789; + display: block; + font-size: 1px; + line-height: 1px; + margin: 2px 3px; +} + +.ux-start-menu-tools-panel ul.x-menu-list li.x-menu-list-item a.x-menu-item { + color: #ffffff; +} + +.ux-start-menu-tools-panel ul.x-menu-list li.x-menu-list-item .x-menu-item-active a.x-menu-item { + color: #000000; +} + +.ux-start-menu-tools-panel .x-menu-item-active { + background: #525456 url( ../images/taskbar/black/item-over.gif ) repeat-x left bottom; + border: 1px solid #000000; + padding: 0; +} + +#ux-taskbar .x-splitbar-h { + background: #000000 url( ../images/taskbar/black/taskbar-split-h.gif ) no-repeat 0 0; + width: 8px; +} + +.x-window-header-text { + cursor: default; +} + +/* + * Begin Start button + */ +.ux-startbutton-left,.ux-startbutton-right { + font-size: 1px; + line-height: 1px; +} + +.ux-startbutton-left { + width: 10px; + height: 28px; + background: url( ../images/taskbar/black/startbutton.gif ) no-repeat 0 0; +} + +.ux-startbutton-right { + width: 10px; + height: 30px; + background: url( ../images/taskbar/black/startbutton.gif ) no-repeat 0 -28px; +} + +.ux-startbutton-left i,.ux-startbutton-right i { + display: block; + width: 10px; + overflow: hidden; + font-size: 1px; + line-height: 1px; +} + +.ux-startbutton-center { + background: url( ../images/taskbar/black/startbutton.gif ) repeat-x 0 -56px; + vertical-align: middle; + text-align: center; + padding: 0; + cursor: pointer; + white-space: nowrap; +} + +#ux-taskbar .ux-startbutton-left { + background-position: 0 0; +} + +#ux-taskbar .ux-startbutton-right { + background-position: 0 -30px; +} + +#ux-taskbar .ux-startbutton-center { + background-position: 0 -60px; +} + +#ux-taskbar .x-btn-over .ux-startbutton-left { + background-position: 0 -270px; +} + +#ux-taskbar .x-btn-over .ux-startbutton-right { + background-position: 0 -300px; +} + +#ux-taskbar .x-btn-over .ux-startbutton-center { + background-position: 0 -330px; +} + +#ux-taskbar .x-btn-click .ux-startbutton-left { + background-position: 0 -180px; +} + +#ux-taskbar .x-btn-click .ux-startbutton-right { + background-position: 0 -210px; +} + +#ux-taskbar .x-btn-click .ux-startbutton-center { + background-position: 0 -240px; +} + +#ux-taskbar .active-win .ux-startbutton-left { + background-position: 0 -90px; +} + +#ux-taskbar .active-win .ux-startbutton-right { + background: url( ../images/taskbar/black/startbutton.gif ) no-repeat 0 -120px; +} + +#ux-taskbar .active-win .ux-startbutton-center { + background: url( ../images/taskbar/black/startbutton.gif ) repeat-x 0 -150px; +} + +#ux-taskbar .active-win .ux-startbutton-center button { + color: #fff; +} + +/* + * End Start button + */ +.x-resizable-proxy { + background: #C7DFFC; + opacity: .5; + -moz-opacity: .5; + filter: alpha(opacity = 50); + border: 1px solid #3b5a82; +} + +/* Desktop Shortcuts */ +#x-shortcuts dt { + float: left; + margin: 15px 0 0 15px; + clear: left; + width: 64px; + font: normal 10px tahoma, arial, verdana, sans-serif; + text-align: center; + zoom: 1; + display: block; +} + +#x-shortcuts dt a { + width: 64px; + display: block; + color: white; + text-decoration: none; +} + +#x-shortcuts dt div { + width: 100%; + color: white; + overflow: hidden; + text-overflow: ellipsis; + cursor: pointer; +} + +#x-shortcuts dt a:hover { + text-decoration: underline; +} diff --git a/src/main/webapp/gxt/desktop/images/desktop.gif b/src/main/webapp/gxt/desktop/images/desktop.gif new file mode 100644 index 0000000..f305cb6 Binary files /dev/null and b/src/main/webapp/gxt/desktop/images/desktop.gif differ diff --git a/src/main/webapp/gxt/desktop/images/desktop3.jpg b/src/main/webapp/gxt/desktop/images/desktop3.jpg new file mode 100644 index 0000000..daca8bc Binary files /dev/null and b/src/main/webapp/gxt/desktop/images/desktop3.jpg differ diff --git a/src/main/webapp/gxt/desktop/images/gears.gif b/src/main/webapp/gxt/desktop/images/gears.gif new file mode 100644 index 0000000..2bf6bd7 Binary files /dev/null and b/src/main/webapp/gxt/desktop/images/gears.gif differ diff --git a/src/main/webapp/gxt/desktop/images/gears.png b/src/main/webapp/gxt/desktop/images/gears.png new file mode 100644 index 0000000..6acdc98 Binary files /dev/null and b/src/main/webapp/gxt/desktop/images/gears.png differ diff --git a/src/main/webapp/gxt/desktop/images/grid.png b/src/main/webapp/gxt/desktop/images/grid.png new file mode 100644 index 0000000..c4da495 Binary files /dev/null and b/src/main/webapp/gxt/desktop/images/grid.png differ diff --git a/src/main/webapp/gxt/desktop/images/hatch.gif b/src/main/webapp/gxt/desktop/images/hatch.gif new file mode 100644 index 0000000..6a044a8 Binary files /dev/null and b/src/main/webapp/gxt/desktop/images/hatch.gif differ diff --git a/src/main/webapp/gxt/desktop/images/hd-bg.gif b/src/main/webapp/gxt/desktop/images/hd-bg.gif new file mode 100644 index 0000000..f35a53f Binary files /dev/null and b/src/main/webapp/gxt/desktop/images/hd-bg.gif differ diff --git a/src/main/webapp/gxt/desktop/images/hd-tb-bg.gif b/src/main/webapp/gxt/desktop/images/hd-tb-bg.gif new file mode 100644 index 0000000..f800edb Binary files /dev/null and b/src/main/webapp/gxt/desktop/images/hd-tb-bg.gif differ diff --git a/src/main/webapp/gxt/desktop/images/icon_padlock.png b/src/main/webapp/gxt/desktop/images/icon_padlock.png new file mode 100644 index 0000000..92625ff Binary files /dev/null and b/src/main/webapp/gxt/desktop/images/icon_padlock.png differ diff --git a/src/main/webapp/gxt/desktop/images/icons-bg.png b/src/main/webapp/gxt/desktop/images/icons-bg.png new file mode 100644 index 0000000..6557cbb Binary files /dev/null and b/src/main/webapp/gxt/desktop/images/icons-bg.png differ diff --git a/src/main/webapp/gxt/desktop/images/launcher-bg.gif b/src/main/webapp/gxt/desktop/images/launcher-bg.gif new file mode 100644 index 0000000..c7cfd83 Binary files /dev/null and b/src/main/webapp/gxt/desktop/images/launcher-bg.gif differ diff --git a/src/main/webapp/gxt/desktop/images/launcher-btn.gif b/src/main/webapp/gxt/desktop/images/launcher-btn.gif new file mode 100644 index 0000000..a9a72d7 Binary files /dev/null and b/src/main/webapp/gxt/desktop/images/launcher-btn.gif differ diff --git a/src/main/webapp/gxt/desktop/images/logout.gif b/src/main/webapp/gxt/desktop/images/logout.gif new file mode 100644 index 0000000..a4f3738 Binary files /dev/null and b/src/main/webapp/gxt/desktop/images/logout.gif differ diff --git a/src/main/webapp/gxt/desktop/images/logout.png b/src/main/webapp/gxt/desktop/images/logout.png new file mode 100644 index 0000000..1fcb386 Binary files /dev/null and b/src/main/webapp/gxt/desktop/images/logout.png differ diff --git a/src/main/webapp/gxt/desktop/images/member.gif b/src/main/webapp/gxt/desktop/images/member.gif new file mode 100644 index 0000000..216c839 Binary files /dev/null and b/src/main/webapp/gxt/desktop/images/member.gif differ diff --git a/src/main/webapp/gxt/desktop/images/member.png b/src/main/webapp/gxt/desktop/images/member.png new file mode 100644 index 0000000..0f3657f Binary files /dev/null and b/src/main/webapp/gxt/desktop/images/member.png differ diff --git a/src/main/webapp/gxt/desktop/images/powered.gif b/src/main/webapp/gxt/desktop/images/powered.gif new file mode 100644 index 0000000..8ce74b8 Binary files /dev/null and b/src/main/webapp/gxt/desktop/images/powered.gif differ diff --git a/src/main/webapp/gxt/desktop/images/powered.png b/src/main/webapp/gxt/desktop/images/powered.png new file mode 100644 index 0000000..5b2a0b8 Binary files /dev/null and b/src/main/webapp/gxt/desktop/images/powered.png differ diff --git a/src/main/webapp/gxt/desktop/images/s.gif b/src/main/webapp/gxt/desktop/images/s.gif new file mode 100644 index 0000000..1d11fa9 Binary files /dev/null and b/src/main/webapp/gxt/desktop/images/s.gif differ diff --git a/src/main/webapp/gxt/desktop/images/taskbar/black/item-over.gif b/src/main/webapp/gxt/desktop/images/taskbar/black/item-over.gif new file mode 100644 index 0000000..26c1fc2 Binary files /dev/null and b/src/main/webapp/gxt/desktop/images/taskbar/black/item-over.gif differ diff --git a/src/main/webapp/gxt/desktop/images/taskbar/black/scroll-left.gif b/src/main/webapp/gxt/desktop/images/taskbar/black/scroll-left.gif new file mode 100644 index 0000000..94fea48 Binary files /dev/null and b/src/main/webapp/gxt/desktop/images/taskbar/black/scroll-left.gif differ diff --git a/src/main/webapp/gxt/desktop/images/taskbar/black/scroll-right.gif b/src/main/webapp/gxt/desktop/images/taskbar/black/scroll-right.gif new file mode 100644 index 0000000..94b5669 Binary files /dev/null and b/src/main/webapp/gxt/desktop/images/taskbar/black/scroll-right.gif differ diff --git a/src/main/webapp/gxt/desktop/images/taskbar/black/start-menu-left-corners.png b/src/main/webapp/gxt/desktop/images/taskbar/black/start-menu-left-corners.png new file mode 100644 index 0000000..d6e5196 Binary files /dev/null and b/src/main/webapp/gxt/desktop/images/taskbar/black/start-menu-left-corners.png differ diff --git a/src/main/webapp/gxt/desktop/images/taskbar/black/start-menu-left-right.png b/src/main/webapp/gxt/desktop/images/taskbar/black/start-menu-left-right.png new file mode 100644 index 0000000..a577d1b Binary files /dev/null and b/src/main/webapp/gxt/desktop/images/taskbar/black/start-menu-left-right.png differ diff --git a/src/main/webapp/gxt/desktop/images/taskbar/black/start-menu-right-corners.png b/src/main/webapp/gxt/desktop/images/taskbar/black/start-menu-right-corners.png new file mode 100644 index 0000000..b683301 Binary files /dev/null and b/src/main/webapp/gxt/desktop/images/taskbar/black/start-menu-right-corners.png differ diff --git a/src/main/webapp/gxt/desktop/images/taskbar/black/start-menu-right.png b/src/main/webapp/gxt/desktop/images/taskbar/black/start-menu-right.png new file mode 100644 index 0000000..e5fa2b8 Binary files /dev/null and b/src/main/webapp/gxt/desktop/images/taskbar/black/start-menu-right.png differ diff --git a/src/main/webapp/gxt/desktop/images/taskbar/black/start-menu-top-bottom.png b/src/main/webapp/gxt/desktop/images/taskbar/black/start-menu-top-bottom.png new file mode 100644 index 0000000..fbea3cb Binary files /dev/null and b/src/main/webapp/gxt/desktop/images/taskbar/black/start-menu-top-bottom.png differ diff --git a/src/main/webapp/gxt/desktop/images/taskbar/black/startbutton-icon.gif b/src/main/webapp/gxt/desktop/images/taskbar/black/startbutton-icon.gif new file mode 100644 index 0000000..8dcd2d1 Binary files /dev/null and b/src/main/webapp/gxt/desktop/images/taskbar/black/startbutton-icon.gif differ diff --git a/src/main/webapp/gxt/desktop/images/taskbar/black/startbutton.gif b/src/main/webapp/gxt/desktop/images/taskbar/black/startbutton.gif new file mode 100644 index 0000000..683313e Binary files /dev/null and b/src/main/webapp/gxt/desktop/images/taskbar/black/startbutton.gif differ diff --git a/src/main/webapp/gxt/desktop/images/taskbar/black/taskbar-split-h.gif b/src/main/webapp/gxt/desktop/images/taskbar/black/taskbar-split-h.gif new file mode 100644 index 0000000..13564ad Binary files /dev/null and b/src/main/webapp/gxt/desktop/images/taskbar/black/taskbar-split-h.gif differ diff --git a/src/main/webapp/gxt/desktop/images/taskbar/black/taskbar-start-panel-bg.gif b/src/main/webapp/gxt/desktop/images/taskbar/black/taskbar-start-panel-bg.gif new file mode 100644 index 0000000..9794880 Binary files /dev/null and b/src/main/webapp/gxt/desktop/images/taskbar/black/taskbar-start-panel-bg.gif differ diff --git a/src/main/webapp/gxt/desktop/images/taskbar/black/taskbutton.gif b/src/main/webapp/gxt/desktop/images/taskbar/black/taskbutton.gif new file mode 100644 index 0000000..df13974 Binary files /dev/null and b/src/main/webapp/gxt/desktop/images/taskbar/black/taskbutton.gif differ diff --git a/src/main/webapp/gxt/desktop/images/taskbar/black/taskbuttons-panel-bg.gif b/src/main/webapp/gxt/desktop/images/taskbar/black/taskbuttons-panel-bg.gif new file mode 100644 index 0000000..0865c45 Binary files /dev/null and b/src/main/webapp/gxt/desktop/images/taskbar/black/taskbuttons-panel-bg.gif differ diff --git a/src/main/webapp/gxt/desktop/images/winbar-bg.gif b/src/main/webapp/gxt/desktop/images/winbar-bg.gif new file mode 100644 index 0000000..45295a6 Binary files /dev/null and b/src/main/webapp/gxt/desktop/images/winbar-bg.gif differ diff --git a/src/main/webapp/gxt/desktop/images/winbar-btn.gif b/src/main/webapp/gxt/desktop/images/winbar-btn.gif new file mode 100644 index 0000000..2c8c024 Binary files /dev/null and b/src/main/webapp/gxt/desktop/images/winbar-btn.gif differ diff --git a/src/main/webapp/gxt/desktop/images/windows-bg.gif b/src/main/webapp/gxt/desktop/images/windows-bg.gif new file mode 100644 index 0000000..396471e Binary files /dev/null and b/src/main/webapp/gxt/desktop/images/windows-bg.gif differ diff --git a/src/main/webapp/gxt/desktop/wallpapers/desktop.jpg b/src/main/webapp/gxt/desktop/wallpapers/desktop.jpg new file mode 100644 index 0000000..8e1fcb0 Binary files /dev/null and b/src/main/webapp/gxt/desktop/wallpapers/desktop.jpg differ diff --git a/src/main/webapp/gxt/icons/connect.png b/src/main/webapp/gxt/icons/connect.png new file mode 100644 index 0000000..024138e Binary files /dev/null and b/src/main/webapp/gxt/icons/connect.png differ diff --git a/src/main/webapp/gxt/images/default/box/corners-blue.gif b/src/main/webapp/gxt/images/default/box/corners-blue.gif new file mode 100644 index 0000000..fa419b5 Binary files /dev/null and b/src/main/webapp/gxt/images/default/box/corners-blue.gif differ diff --git a/src/main/webapp/gxt/images/default/box/corners.gif b/src/main/webapp/gxt/images/default/box/corners.gif new file mode 100644 index 0000000..8aa8cae Binary files /dev/null and b/src/main/webapp/gxt/images/default/box/corners.gif differ diff --git a/src/main/webapp/gxt/images/default/box/l-blue.gif b/src/main/webapp/gxt/images/default/box/l-blue.gif new file mode 100644 index 0000000..5ed7f00 Binary files /dev/null and b/src/main/webapp/gxt/images/default/box/l-blue.gif differ diff --git a/src/main/webapp/gxt/images/default/box/l.gif b/src/main/webapp/gxt/images/default/box/l.gif new file mode 100644 index 0000000..0160f97 Binary files /dev/null and b/src/main/webapp/gxt/images/default/box/l.gif differ diff --git a/src/main/webapp/gxt/images/default/box/r-blue.gif b/src/main/webapp/gxt/images/default/box/r-blue.gif new file mode 100644 index 0000000..3ea5cae Binary files /dev/null and b/src/main/webapp/gxt/images/default/box/r-blue.gif differ diff --git a/src/main/webapp/gxt/images/default/box/r.gif b/src/main/webapp/gxt/images/default/box/r.gif new file mode 100644 index 0000000..34237f6 Binary files /dev/null and b/src/main/webapp/gxt/images/default/box/r.gif differ diff --git a/src/main/webapp/gxt/images/default/box/tb-blue.gif b/src/main/webapp/gxt/images/default/box/tb-blue.gif new file mode 100644 index 0000000..562fecc Binary files /dev/null and b/src/main/webapp/gxt/images/default/box/tb-blue.gif differ diff --git a/src/main/webapp/gxt/images/default/box/tb.gif b/src/main/webapp/gxt/images/default/box/tb.gif new file mode 100644 index 0000000..435889b Binary files /dev/null and b/src/main/webapp/gxt/images/default/box/tb.gif differ diff --git a/src/main/webapp/gxt/images/default/button/arrow.gif b/src/main/webapp/gxt/images/default/button/arrow.gif new file mode 100644 index 0000000..3ab4f71 Binary files /dev/null and b/src/main/webapp/gxt/images/default/button/arrow.gif differ diff --git a/src/main/webapp/gxt/images/default/button/btn-arrow.gif b/src/main/webapp/gxt/images/default/button/btn-arrow.gif new file mode 100644 index 0000000..f90d5df Binary files /dev/null and b/src/main/webapp/gxt/images/default/button/btn-arrow.gif differ diff --git a/src/main/webapp/gxt/images/default/button/btn-sprite.gif b/src/main/webapp/gxt/images/default/button/btn-sprite.gif new file mode 100644 index 0000000..b52e0ce Binary files /dev/null and b/src/main/webapp/gxt/images/default/button/btn-sprite.gif differ diff --git a/src/main/webapp/gxt/images/default/button/btn.gif b/src/main/webapp/gxt/images/default/button/btn.gif new file mode 100644 index 0000000..06b404d Binary files /dev/null and b/src/main/webapp/gxt/images/default/button/btn.gif differ diff --git a/src/main/webapp/gxt/images/default/button/group-cs.gif b/src/main/webapp/gxt/images/default/button/group-cs.gif new file mode 100644 index 0000000..3d1dca8 Binary files /dev/null and b/src/main/webapp/gxt/images/default/button/group-cs.gif differ diff --git a/src/main/webapp/gxt/images/default/button/group-lr.gif b/src/main/webapp/gxt/images/default/button/group-lr.gif new file mode 100644 index 0000000..7c549f9 Binary files /dev/null and b/src/main/webapp/gxt/images/default/button/group-lr.gif differ diff --git a/src/main/webapp/gxt/images/default/button/group-tb.gif b/src/main/webapp/gxt/images/default/button/group-tb.gif new file mode 100644 index 0000000..adeb0a4 Binary files /dev/null and b/src/main/webapp/gxt/images/default/button/group-tb.gif differ diff --git a/src/main/webapp/gxt/images/default/button/s-arrow-b-noline.gif b/src/main/webapp/gxt/images/default/button/s-arrow-b-noline.gif new file mode 100644 index 0000000..a4220ee Binary files /dev/null and b/src/main/webapp/gxt/images/default/button/s-arrow-b-noline.gif differ diff --git a/src/main/webapp/gxt/images/default/button/s-arrow-b.gif b/src/main/webapp/gxt/images/default/button/s-arrow-b.gif new file mode 100644 index 0000000..84b6470 Binary files /dev/null and b/src/main/webapp/gxt/images/default/button/s-arrow-b.gif differ diff --git a/src/main/webapp/gxt/images/default/button/s-arrow-bo.gif b/src/main/webapp/gxt/images/default/button/s-arrow-bo.gif new file mode 100644 index 0000000..7410170 Binary files /dev/null and b/src/main/webapp/gxt/images/default/button/s-arrow-bo.gif differ diff --git a/src/main/webapp/gxt/images/default/button/s-arrow-noline.gif b/src/main/webapp/gxt/images/default/button/s-arrow-noline.gif new file mode 100644 index 0000000..0953eab Binary files /dev/null and b/src/main/webapp/gxt/images/default/button/s-arrow-noline.gif differ diff --git a/src/main/webapp/gxt/images/default/button/s-arrow-o.gif b/src/main/webapp/gxt/images/default/button/s-arrow-o.gif new file mode 100644 index 0000000..89c70f3 Binary files /dev/null and b/src/main/webapp/gxt/images/default/button/s-arrow-o.gif differ diff --git a/src/main/webapp/gxt/images/default/button/s-arrow.gif b/src/main/webapp/gxt/images/default/button/s-arrow.gif new file mode 100644 index 0000000..8940774 Binary files /dev/null and b/src/main/webapp/gxt/images/default/button/s-arrow.gif differ diff --git a/src/main/webapp/gxt/images/default/dd/drop-add.gif b/src/main/webapp/gxt/images/default/dd/drop-add.gif new file mode 100644 index 0000000..b22cd14 Binary files /dev/null and b/src/main/webapp/gxt/images/default/dd/drop-add.gif differ diff --git a/src/main/webapp/gxt/images/default/dd/drop-no.gif b/src/main/webapp/gxt/images/default/dd/drop-no.gif new file mode 100644 index 0000000..08d0833 Binary files /dev/null and b/src/main/webapp/gxt/images/default/dd/drop-no.gif differ diff --git a/src/main/webapp/gxt/images/default/dd/drop-yes.gif b/src/main/webapp/gxt/images/default/dd/drop-yes.gif new file mode 100644 index 0000000..8aacb30 Binary files /dev/null and b/src/main/webapp/gxt/images/default/dd/drop-yes.gif differ diff --git a/src/main/webapp/gxt/images/default/editor/tb-sprite.gif b/src/main/webapp/gxt/images/default/editor/tb-sprite.gif new file mode 100644 index 0000000..fb70577 Binary files /dev/null and b/src/main/webapp/gxt/images/default/editor/tb-sprite.gif differ diff --git a/src/main/webapp/gxt/images/default/form/checkbox.gif b/src/main/webapp/gxt/images/default/form/checkbox.gif new file mode 100644 index 0000000..835b346 Binary files /dev/null and b/src/main/webapp/gxt/images/default/form/checkbox.gif differ diff --git a/src/main/webapp/gxt/images/default/form/clear-trigger.gif b/src/main/webapp/gxt/images/default/form/clear-trigger.gif new file mode 100644 index 0000000..da78d45 Binary files /dev/null and b/src/main/webapp/gxt/images/default/form/clear-trigger.gif differ diff --git a/src/main/webapp/gxt/images/default/form/date-trigger.gif b/src/main/webapp/gxt/images/default/form/date-trigger.gif new file mode 100644 index 0000000..25ef7b3 Binary files /dev/null and b/src/main/webapp/gxt/images/default/form/date-trigger.gif differ diff --git a/src/main/webapp/gxt/images/default/form/error-tip-corners.gif b/src/main/webapp/gxt/images/default/form/error-tip-corners.gif new file mode 100644 index 0000000..6ea4c38 Binary files /dev/null and b/src/main/webapp/gxt/images/default/form/error-tip-corners.gif differ diff --git a/src/main/webapp/gxt/images/default/form/exclamation.gif b/src/main/webapp/gxt/images/default/form/exclamation.gif new file mode 100644 index 0000000..ea31a30 Binary files /dev/null and b/src/main/webapp/gxt/images/default/form/exclamation.gif differ diff --git a/src/main/webapp/gxt/images/default/form/radio.gif b/src/main/webapp/gxt/images/default/form/radio.gif new file mode 100644 index 0000000..36bb91d Binary files /dev/null and b/src/main/webapp/gxt/images/default/form/radio.gif differ diff --git a/src/main/webapp/gxt/images/default/form/search-trigger.gif b/src/main/webapp/gxt/images/default/form/search-trigger.gif new file mode 100644 index 0000000..db8802b Binary files /dev/null and b/src/main/webapp/gxt/images/default/form/search-trigger.gif differ diff --git a/src/main/webapp/gxt/images/default/form/text-bg.gif b/src/main/webapp/gxt/images/default/form/text-bg.gif new file mode 100644 index 0000000..4179607 Binary files /dev/null and b/src/main/webapp/gxt/images/default/form/text-bg.gif differ diff --git a/src/main/webapp/gxt/images/default/form/trigger-tpl.gif b/src/main/webapp/gxt/images/default/form/trigger-tpl.gif new file mode 100644 index 0000000..e3701a3 Binary files /dev/null and b/src/main/webapp/gxt/images/default/form/trigger-tpl.gif differ diff --git a/src/main/webapp/gxt/images/default/form/trigger.gif b/src/main/webapp/gxt/images/default/form/trigger.gif new file mode 100644 index 0000000..fa56314 Binary files /dev/null and b/src/main/webapp/gxt/images/default/form/trigger.gif differ diff --git a/src/main/webapp/gxt/images/default/gradient-bg.gif b/src/main/webapp/gxt/images/default/gradient-bg.gif new file mode 100644 index 0000000..8134e49 Binary files /dev/null and b/src/main/webapp/gxt/images/default/gradient-bg.gif differ diff --git a/src/main/webapp/gxt/images/default/grid/arrow-left-white.gif b/src/main/webapp/gxt/images/default/grid/arrow-left-white.gif new file mode 100644 index 0000000..63088f5 Binary files /dev/null and b/src/main/webapp/gxt/images/default/grid/arrow-left-white.gif differ diff --git a/src/main/webapp/gxt/images/default/grid/arrow-right-white.gif b/src/main/webapp/gxt/images/default/grid/arrow-right-white.gif new file mode 100644 index 0000000..e9e0678 Binary files /dev/null and b/src/main/webapp/gxt/images/default/grid/arrow-right-white.gif differ diff --git a/src/main/webapp/gxt/images/default/grid/col-move-bottom.gif b/src/main/webapp/gxt/images/default/grid/col-move-bottom.gif new file mode 100644 index 0000000..cc1e473 Binary files /dev/null and b/src/main/webapp/gxt/images/default/grid/col-move-bottom.gif differ diff --git a/src/main/webapp/gxt/images/default/grid/col-move-top.gif b/src/main/webapp/gxt/images/default/grid/col-move-top.gif new file mode 100644 index 0000000..58ff32c Binary files /dev/null and b/src/main/webapp/gxt/images/default/grid/col-move-top.gif differ diff --git a/src/main/webapp/gxt/images/default/grid/columns.gif b/src/main/webapp/gxt/images/default/grid/columns.gif new file mode 100644 index 0000000..2d3a823 Binary files /dev/null and b/src/main/webapp/gxt/images/default/grid/columns.gif differ diff --git a/src/main/webapp/gxt/images/default/grid/dirty.gif b/src/main/webapp/gxt/images/default/grid/dirty.gif new file mode 100644 index 0000000..4f217a4 Binary files /dev/null and b/src/main/webapp/gxt/images/default/grid/dirty.gif differ diff --git a/src/main/webapp/gxt/images/default/grid/done.gif b/src/main/webapp/gxt/images/default/grid/done.gif new file mode 100644 index 0000000..a937cb2 Binary files /dev/null and b/src/main/webapp/gxt/images/default/grid/done.gif differ diff --git a/src/main/webapp/gxt/images/default/grid/drop-no.gif b/src/main/webapp/gxt/images/default/grid/drop-no.gif new file mode 100644 index 0000000..31a332b Binary files /dev/null and b/src/main/webapp/gxt/images/default/grid/drop-no.gif differ diff --git a/src/main/webapp/gxt/images/default/grid/drop-yes.gif b/src/main/webapp/gxt/images/default/grid/drop-yes.gif new file mode 100644 index 0000000..926010e Binary files /dev/null and b/src/main/webapp/gxt/images/default/grid/drop-yes.gif differ diff --git a/src/main/webapp/gxt/images/default/grid/footer-bg.gif b/src/main/webapp/gxt/images/default/grid/footer-bg.gif new file mode 100644 index 0000000..126120f Binary files /dev/null and b/src/main/webapp/gxt/images/default/grid/footer-bg.gif differ diff --git a/src/main/webapp/gxt/images/default/grid/grid-blue-hd.gif b/src/main/webapp/gxt/images/default/grid/grid-blue-hd.gif new file mode 100644 index 0000000..862094e Binary files /dev/null and b/src/main/webapp/gxt/images/default/grid/grid-blue-hd.gif differ diff --git a/src/main/webapp/gxt/images/default/grid/grid-blue-split.gif b/src/main/webapp/gxt/images/default/grid/grid-blue-split.gif new file mode 100644 index 0000000..5286f58 Binary files /dev/null and b/src/main/webapp/gxt/images/default/grid/grid-blue-split.gif differ diff --git a/src/main/webapp/gxt/images/default/grid/grid-hrow.gif b/src/main/webapp/gxt/images/default/grid/grid-hrow.gif new file mode 100644 index 0000000..6374104 Binary files /dev/null and b/src/main/webapp/gxt/images/default/grid/grid-hrow.gif differ diff --git a/src/main/webapp/gxt/images/default/grid/grid-loading.gif b/src/main/webapp/gxt/images/default/grid/grid-loading.gif new file mode 100644 index 0000000..d112c54 Binary files /dev/null and b/src/main/webapp/gxt/images/default/grid/grid-loading.gif differ diff --git a/src/main/webapp/gxt/images/default/grid/grid-split.gif b/src/main/webapp/gxt/images/default/grid/grid-split.gif new file mode 100644 index 0000000..c76a16e Binary files /dev/null and b/src/main/webapp/gxt/images/default/grid/grid-split.gif differ diff --git a/src/main/webapp/gxt/images/default/grid/grid-vista-hd.gif b/src/main/webapp/gxt/images/default/grid/grid-vista-hd.gif new file mode 100644 index 0000000..d097263 Binary files /dev/null and b/src/main/webapp/gxt/images/default/grid/grid-vista-hd.gif differ diff --git a/src/main/webapp/gxt/images/default/grid/grid3-hd-btn.gif b/src/main/webapp/gxt/images/default/grid/grid3-hd-btn.gif new file mode 100644 index 0000000..7d9ff0d Binary files /dev/null and b/src/main/webapp/gxt/images/default/grid/grid3-hd-btn.gif differ diff --git a/src/main/webapp/gxt/images/default/grid/grid3-hrow-group.gif b/src/main/webapp/gxt/images/default/grid/grid3-hrow-group.gif new file mode 100644 index 0000000..27a395a Binary files /dev/null and b/src/main/webapp/gxt/images/default/grid/grid3-hrow-group.gif differ diff --git a/src/main/webapp/gxt/images/default/grid/grid3-hrow-over.gif b/src/main/webapp/gxt/images/default/grid/grid3-hrow-over.gif new file mode 100644 index 0000000..f9c07af Binary files /dev/null and b/src/main/webapp/gxt/images/default/grid/grid3-hrow-over.gif differ diff --git a/src/main/webapp/gxt/images/default/grid/grid3-hrow.gif b/src/main/webapp/gxt/images/default/grid/grid3-hrow.gif new file mode 100644 index 0000000..8d459a3 Binary files /dev/null and b/src/main/webapp/gxt/images/default/grid/grid3-hrow.gif differ diff --git a/src/main/webapp/gxt/images/default/grid/grid3-special-col-bg.gif b/src/main/webapp/gxt/images/default/grid/grid3-special-col-bg.gif new file mode 100644 index 0000000..0b4d6ca Binary files /dev/null and b/src/main/webapp/gxt/images/default/grid/grid3-special-col-bg.gif differ diff --git a/src/main/webapp/gxt/images/default/grid/grid3-special-col-sel-bg.gif b/src/main/webapp/gxt/images/default/grid/grid3-special-col-sel-bg.gif new file mode 100644 index 0000000..1dfe9a6 Binary files /dev/null and b/src/main/webapp/gxt/images/default/grid/grid3-special-col-sel-bg.gif differ diff --git a/src/main/webapp/gxt/images/default/grid/group-by.gif b/src/main/webapp/gxt/images/default/grid/group-by.gif new file mode 100644 index 0000000..d6075bb Binary files /dev/null and b/src/main/webapp/gxt/images/default/grid/group-by.gif differ diff --git a/src/main/webapp/gxt/images/default/grid/group-expand-sprite.gif b/src/main/webapp/gxt/images/default/grid/group-expand-sprite.gif new file mode 100644 index 0000000..9c1653b Binary files /dev/null and b/src/main/webapp/gxt/images/default/grid/group-expand-sprite.gif differ diff --git a/src/main/webapp/gxt/images/default/grid/hd-pop.gif b/src/main/webapp/gxt/images/default/grid/hd-pop.gif new file mode 100644 index 0000000..eb8ba79 Binary files /dev/null and b/src/main/webapp/gxt/images/default/grid/hd-pop.gif differ diff --git a/src/main/webapp/gxt/images/default/grid/hmenu-asc.gif b/src/main/webapp/gxt/images/default/grid/hmenu-asc.gif new file mode 100644 index 0000000..8917e0e Binary files /dev/null and b/src/main/webapp/gxt/images/default/grid/hmenu-asc.gif differ diff --git a/src/main/webapp/gxt/images/default/grid/hmenu-desc.gif b/src/main/webapp/gxt/images/default/grid/hmenu-desc.gif new file mode 100644 index 0000000..f26b7c2 Binary files /dev/null and b/src/main/webapp/gxt/images/default/grid/hmenu-desc.gif differ diff --git a/src/main/webapp/gxt/images/default/grid/hmenu-lock.gif b/src/main/webapp/gxt/images/default/grid/hmenu-lock.gif new file mode 100644 index 0000000..1596126 Binary files /dev/null and b/src/main/webapp/gxt/images/default/grid/hmenu-lock.gif differ diff --git a/src/main/webapp/gxt/images/default/grid/hmenu-lock.png b/src/main/webapp/gxt/images/default/grid/hmenu-lock.png new file mode 100644 index 0000000..8b81e7f Binary files /dev/null and b/src/main/webapp/gxt/images/default/grid/hmenu-lock.png differ diff --git a/src/main/webapp/gxt/images/default/grid/hmenu-unlock.gif b/src/main/webapp/gxt/images/default/grid/hmenu-unlock.gif new file mode 100644 index 0000000..af59cf9 Binary files /dev/null and b/src/main/webapp/gxt/images/default/grid/hmenu-unlock.gif differ diff --git a/src/main/webapp/gxt/images/default/grid/hmenu-unlock.png b/src/main/webapp/gxt/images/default/grid/hmenu-unlock.png new file mode 100644 index 0000000..9dd5df3 Binary files /dev/null and b/src/main/webapp/gxt/images/default/grid/hmenu-unlock.png differ diff --git a/src/main/webapp/gxt/images/default/grid/invalid_line.gif b/src/main/webapp/gxt/images/default/grid/invalid_line.gif new file mode 100644 index 0000000..fb7e0f3 Binary files /dev/null and b/src/main/webapp/gxt/images/default/grid/invalid_line.gif differ diff --git a/src/main/webapp/gxt/images/default/grid/loading.gif b/src/main/webapp/gxt/images/default/grid/loading.gif new file mode 100644 index 0000000..e846e1d Binary files /dev/null and b/src/main/webapp/gxt/images/default/grid/loading.gif differ diff --git a/src/main/webapp/gxt/images/default/grid/mso-hd.gif b/src/main/webapp/gxt/images/default/grid/mso-hd.gif new file mode 100644 index 0000000..669f3cf Binary files /dev/null and b/src/main/webapp/gxt/images/default/grid/mso-hd.gif differ diff --git a/src/main/webapp/gxt/images/default/grid/nowait.gif b/src/main/webapp/gxt/images/default/grid/nowait.gif new file mode 100644 index 0000000..4c5862c Binary files /dev/null and b/src/main/webapp/gxt/images/default/grid/nowait.gif differ diff --git a/src/main/webapp/gxt/images/default/grid/page-first-disabled.gif b/src/main/webapp/gxt/images/default/grid/page-first-disabled.gif new file mode 100644 index 0000000..1e02c41 Binary files /dev/null and b/src/main/webapp/gxt/images/default/grid/page-first-disabled.gif differ diff --git a/src/main/webapp/gxt/images/default/grid/page-first.gif b/src/main/webapp/gxt/images/default/grid/page-first.gif new file mode 100644 index 0000000..d84f41a Binary files /dev/null and b/src/main/webapp/gxt/images/default/grid/page-first.gif differ diff --git a/src/main/webapp/gxt/images/default/grid/page-last-disabled.gif b/src/main/webapp/gxt/images/default/grid/page-last-disabled.gif new file mode 100644 index 0000000..8697067 Binary files /dev/null and b/src/main/webapp/gxt/images/default/grid/page-last-disabled.gif differ diff --git a/src/main/webapp/gxt/images/default/grid/page-last.gif b/src/main/webapp/gxt/images/default/grid/page-last.gif new file mode 100644 index 0000000..3df5c2b Binary files /dev/null and b/src/main/webapp/gxt/images/default/grid/page-last.gif differ diff --git a/src/main/webapp/gxt/images/default/grid/page-next-disabled.gif b/src/main/webapp/gxt/images/default/grid/page-next-disabled.gif new file mode 100644 index 0000000..90a7756 Binary files /dev/null and b/src/main/webapp/gxt/images/default/grid/page-next-disabled.gif differ diff --git a/src/main/webapp/gxt/images/default/grid/page-next.gif b/src/main/webapp/gxt/images/default/grid/page-next.gif new file mode 100644 index 0000000..9601635 Binary files /dev/null and b/src/main/webapp/gxt/images/default/grid/page-next.gif differ diff --git a/src/main/webapp/gxt/images/default/grid/page-prev-disabled.gif b/src/main/webapp/gxt/images/default/grid/page-prev-disabled.gif new file mode 100644 index 0000000..37154d6 Binary files /dev/null and b/src/main/webapp/gxt/images/default/grid/page-prev-disabled.gif differ diff --git a/src/main/webapp/gxt/images/default/grid/page-prev.gif b/src/main/webapp/gxt/images/default/grid/page-prev.gif new file mode 100644 index 0000000..eb70cf8 Binary files /dev/null and b/src/main/webapp/gxt/images/default/grid/page-prev.gif differ diff --git a/src/main/webapp/gxt/images/default/grid/pick-button.gif b/src/main/webapp/gxt/images/default/grid/pick-button.gif new file mode 100644 index 0000000..6957924 Binary files /dev/null and b/src/main/webapp/gxt/images/default/grid/pick-button.gif differ diff --git a/src/main/webapp/gxt/images/default/grid/refresh.gif b/src/main/webapp/gxt/images/default/grid/refresh.gif new file mode 100644 index 0000000..110f684 Binary files /dev/null and b/src/main/webapp/gxt/images/default/grid/refresh.gif differ diff --git a/src/main/webapp/gxt/images/default/grid/refresh.png b/src/main/webapp/gxt/images/default/grid/refresh.png new file mode 100644 index 0000000..870adb5 Binary files /dev/null and b/src/main/webapp/gxt/images/default/grid/refresh.png differ diff --git a/src/main/webapp/gxt/images/default/grid/row-check-sprite.gif b/src/main/webapp/gxt/images/default/grid/row-check-sprite.gif new file mode 100644 index 0000000..6101164 Binary files /dev/null and b/src/main/webapp/gxt/images/default/grid/row-check-sprite.gif differ diff --git a/src/main/webapp/gxt/images/default/grid/row-expand-sprite.gif b/src/main/webapp/gxt/images/default/grid/row-expand-sprite.gif new file mode 100644 index 0000000..6f4d874 Binary files /dev/null and b/src/main/webapp/gxt/images/default/grid/row-expand-sprite.gif differ diff --git a/src/main/webapp/gxt/images/default/grid/row-over.gif b/src/main/webapp/gxt/images/default/grid/row-over.gif new file mode 100644 index 0000000..b288e38 Binary files /dev/null and b/src/main/webapp/gxt/images/default/grid/row-over.gif differ diff --git a/src/main/webapp/gxt/images/default/grid/row-sel.gif b/src/main/webapp/gxt/images/default/grid/row-sel.gif new file mode 100644 index 0000000..98209e6 Binary files /dev/null and b/src/main/webapp/gxt/images/default/grid/row-sel.gif differ diff --git a/src/main/webapp/gxt/images/default/grid/sort-hd.gif b/src/main/webapp/gxt/images/default/grid/sort-hd.gif new file mode 100644 index 0000000..45e545f Binary files /dev/null and b/src/main/webapp/gxt/images/default/grid/sort-hd.gif differ diff --git a/src/main/webapp/gxt/images/default/grid/sort_asc.gif b/src/main/webapp/gxt/images/default/grid/sort_asc.gif new file mode 100644 index 0000000..67a2a4c Binary files /dev/null and b/src/main/webapp/gxt/images/default/grid/sort_asc.gif differ diff --git a/src/main/webapp/gxt/images/default/grid/sort_desc.gif b/src/main/webapp/gxt/images/default/grid/sort_desc.gif new file mode 100644 index 0000000..34db47c Binary files /dev/null and b/src/main/webapp/gxt/images/default/grid/sort_desc.gif differ diff --git a/src/main/webapp/gxt/images/default/grid/wait.gif b/src/main/webapp/gxt/images/default/grid/wait.gif new file mode 100644 index 0000000..471c1a4 Binary files /dev/null and b/src/main/webapp/gxt/images/default/grid/wait.gif differ diff --git a/src/main/webapp/gxt/images/default/layout/collapse.gif b/src/main/webapp/gxt/images/default/layout/collapse.gif new file mode 100644 index 0000000..d87b0a9 Binary files /dev/null and b/src/main/webapp/gxt/images/default/layout/collapse.gif differ diff --git a/src/main/webapp/gxt/images/default/layout/expand.gif b/src/main/webapp/gxt/images/default/layout/expand.gif new file mode 100644 index 0000000..7b6e1c1 Binary files /dev/null and b/src/main/webapp/gxt/images/default/layout/expand.gif differ diff --git a/src/main/webapp/gxt/images/default/layout/gradient-bg.gif b/src/main/webapp/gxt/images/default/layout/gradient-bg.gif new file mode 100644 index 0000000..8134e49 Binary files /dev/null and b/src/main/webapp/gxt/images/default/layout/gradient-bg.gif differ diff --git a/src/main/webapp/gxt/images/default/layout/mini-bottom.gif b/src/main/webapp/gxt/images/default/layout/mini-bottom.gif new file mode 100644 index 0000000..c18f9e3 Binary files /dev/null and b/src/main/webapp/gxt/images/default/layout/mini-bottom.gif differ diff --git a/src/main/webapp/gxt/images/default/layout/mini-left.gif b/src/main/webapp/gxt/images/default/layout/mini-left.gif new file mode 100644 index 0000000..99f7993 Binary files /dev/null and b/src/main/webapp/gxt/images/default/layout/mini-left.gif differ diff --git a/src/main/webapp/gxt/images/default/layout/mini-right.gif b/src/main/webapp/gxt/images/default/layout/mini-right.gif new file mode 100644 index 0000000..5b13c5a Binary files /dev/null and b/src/main/webapp/gxt/images/default/layout/mini-right.gif differ diff --git a/src/main/webapp/gxt/images/default/layout/mini-top.gif b/src/main/webapp/gxt/images/default/layout/mini-top.gif new file mode 100644 index 0000000..a4ca2bb Binary files /dev/null and b/src/main/webapp/gxt/images/default/layout/mini-top.gif differ diff --git a/src/main/webapp/gxt/images/default/layout/ns-collapse.gif b/src/main/webapp/gxt/images/default/layout/ns-collapse.gif new file mode 100644 index 0000000..df2a77e Binary files /dev/null and b/src/main/webapp/gxt/images/default/layout/ns-collapse.gif differ diff --git a/src/main/webapp/gxt/images/default/layout/ns-expand.gif b/src/main/webapp/gxt/images/default/layout/ns-expand.gif new file mode 100644 index 0000000..77ab9da Binary files /dev/null and b/src/main/webapp/gxt/images/default/layout/ns-expand.gif differ diff --git a/src/main/webapp/gxt/images/default/layout/panel-close.gif b/src/main/webapp/gxt/images/default/layout/panel-close.gif new file mode 100644 index 0000000..2bdd623 Binary files /dev/null and b/src/main/webapp/gxt/images/default/layout/panel-close.gif differ diff --git a/src/main/webapp/gxt/images/default/layout/panel-title-bg.gif b/src/main/webapp/gxt/images/default/layout/panel-title-bg.gif new file mode 100644 index 0000000..d1daef5 Binary files /dev/null and b/src/main/webapp/gxt/images/default/layout/panel-title-bg.gif differ diff --git a/src/main/webapp/gxt/images/default/layout/panel-title-light-bg.gif b/src/main/webapp/gxt/images/default/layout/panel-title-light-bg.gif new file mode 100644 index 0000000..8c2c83d Binary files /dev/null and b/src/main/webapp/gxt/images/default/layout/panel-title-light-bg.gif differ diff --git a/src/main/webapp/gxt/images/default/layout/stick.gif b/src/main/webapp/gxt/images/default/layout/stick.gif new file mode 100644 index 0000000..5a1e8ba Binary files /dev/null and b/src/main/webapp/gxt/images/default/layout/stick.gif differ diff --git a/src/main/webapp/gxt/images/default/layout/stuck.gif b/src/main/webapp/gxt/images/default/layout/stuck.gif new file mode 100644 index 0000000..0a8de4d Binary files /dev/null and b/src/main/webapp/gxt/images/default/layout/stuck.gif differ diff --git a/src/main/webapp/gxt/images/default/layout/tab-close-on.gif b/src/main/webapp/gxt/images/default/layout/tab-close-on.gif new file mode 100644 index 0000000..eacea39 Binary files /dev/null and b/src/main/webapp/gxt/images/default/layout/tab-close-on.gif differ diff --git a/src/main/webapp/gxt/images/default/layout/tab-close.gif b/src/main/webapp/gxt/images/default/layout/tab-close.gif new file mode 100644 index 0000000..45db61e Binary files /dev/null and b/src/main/webapp/gxt/images/default/layout/tab-close.gif differ diff --git a/src/main/webapp/gxt/images/default/menu/checked.gif b/src/main/webapp/gxt/images/default/menu/checked.gif new file mode 100644 index 0000000..fad5893 Binary files /dev/null and b/src/main/webapp/gxt/images/default/menu/checked.gif differ diff --git a/src/main/webapp/gxt/images/default/menu/group-checked.gif b/src/main/webapp/gxt/images/default/menu/group-checked.gif new file mode 100644 index 0000000..d30b3e5 Binary files /dev/null and b/src/main/webapp/gxt/images/default/menu/group-checked.gif differ diff --git a/src/main/webapp/gxt/images/default/menu/item-over.gif b/src/main/webapp/gxt/images/default/menu/item-over.gif new file mode 100644 index 0000000..0167839 Binary files /dev/null and b/src/main/webapp/gxt/images/default/menu/item-over.gif differ diff --git a/src/main/webapp/gxt/images/default/menu/menu-parent.gif b/src/main/webapp/gxt/images/default/menu/menu-parent.gif new file mode 100644 index 0000000..1e37562 Binary files /dev/null and b/src/main/webapp/gxt/images/default/menu/menu-parent.gif differ diff --git a/src/main/webapp/gxt/images/default/menu/menu.gif b/src/main/webapp/gxt/images/default/menu/menu.gif new file mode 100644 index 0000000..30a2c4b Binary files /dev/null and b/src/main/webapp/gxt/images/default/menu/menu.gif differ diff --git a/src/main/webapp/gxt/images/default/menu/unchecked.gif b/src/main/webapp/gxt/images/default/menu/unchecked.gif new file mode 100644 index 0000000..43823e5 Binary files /dev/null and b/src/main/webapp/gxt/images/default/menu/unchecked.gif differ diff --git a/src/main/webapp/gxt/images/default/panel/corners-sprite.gif b/src/main/webapp/gxt/images/default/panel/corners-sprite.gif new file mode 100644 index 0000000..aa0d0ed Binary files /dev/null and b/src/main/webapp/gxt/images/default/panel/corners-sprite.gif differ diff --git a/src/main/webapp/gxt/images/default/panel/left-right.gif b/src/main/webapp/gxt/images/default/panel/left-right.gif new file mode 100644 index 0000000..9fae2d5 Binary files /dev/null and b/src/main/webapp/gxt/images/default/panel/left-right.gif differ diff --git a/src/main/webapp/gxt/images/default/panel/light-hd.gif b/src/main/webapp/gxt/images/default/panel/light-hd.gif new file mode 100644 index 0000000..58d6747 Binary files /dev/null and b/src/main/webapp/gxt/images/default/panel/light-hd.gif differ diff --git a/src/main/webapp/gxt/images/default/panel/tool-sprite-tpl.gif b/src/main/webapp/gxt/images/default/panel/tool-sprite-tpl.gif new file mode 100644 index 0000000..e647867 Binary files /dev/null and b/src/main/webapp/gxt/images/default/panel/tool-sprite-tpl.gif differ diff --git a/src/main/webapp/gxt/images/default/panel/tool-sprites.gif b/src/main/webapp/gxt/images/default/panel/tool-sprites.gif new file mode 100644 index 0000000..9a3c5b9 Binary files /dev/null and b/src/main/webapp/gxt/images/default/panel/tool-sprites.gif differ diff --git a/src/main/webapp/gxt/images/default/panel/tools-sprites-trans.gif b/src/main/webapp/gxt/images/default/panel/tools-sprites-trans.gif new file mode 100644 index 0000000..ead931e Binary files /dev/null and b/src/main/webapp/gxt/images/default/panel/tools-sprites-trans.gif differ diff --git a/src/main/webapp/gxt/images/default/panel/top-bottom.gif b/src/main/webapp/gxt/images/default/panel/top-bottom.gif new file mode 100644 index 0000000..be6c50e Binary files /dev/null and b/src/main/webapp/gxt/images/default/panel/top-bottom.gif differ diff --git a/src/main/webapp/gxt/images/default/panel/top-bottom.png b/src/main/webapp/gxt/images/default/panel/top-bottom.png new file mode 100644 index 0000000..578ffb6 Binary files /dev/null and b/src/main/webapp/gxt/images/default/panel/top-bottom.png differ diff --git a/src/main/webapp/gxt/images/default/panel/white-corners-sprite.gif b/src/main/webapp/gxt/images/default/panel/white-corners-sprite.gif new file mode 100644 index 0000000..22d4bba Binary files /dev/null and b/src/main/webapp/gxt/images/default/panel/white-corners-sprite.gif differ diff --git a/src/main/webapp/gxt/images/default/panel/white-left-right.gif b/src/main/webapp/gxt/images/default/panel/white-left-right.gif new file mode 100644 index 0000000..d82c337 Binary files /dev/null and b/src/main/webapp/gxt/images/default/panel/white-left-right.gif differ diff --git a/src/main/webapp/gxt/images/default/panel/white-top-bottom.gif b/src/main/webapp/gxt/images/default/panel/white-top-bottom.gif new file mode 100644 index 0000000..fe7dd1c Binary files /dev/null and b/src/main/webapp/gxt/images/default/panel/white-top-bottom.gif differ diff --git a/src/main/webapp/gxt/images/default/progress/progress-bg.gif b/src/main/webapp/gxt/images/default/progress/progress-bg.gif new file mode 100644 index 0000000..1c1abeb Binary files /dev/null and b/src/main/webapp/gxt/images/default/progress/progress-bg.gif differ diff --git a/src/main/webapp/gxt/images/default/qtip/bg.gif b/src/main/webapp/gxt/images/default/qtip/bg.gif new file mode 100644 index 0000000..43488af Binary files /dev/null and b/src/main/webapp/gxt/images/default/qtip/bg.gif differ diff --git a/src/main/webapp/gxt/images/default/qtip/close.gif b/src/main/webapp/gxt/images/default/qtip/close.gif new file mode 100644 index 0000000..69ab915 Binary files /dev/null and b/src/main/webapp/gxt/images/default/qtip/close.gif differ diff --git a/src/main/webapp/gxt/images/default/qtip/tip-anchor-sprite.gif b/src/main/webapp/gxt/images/default/qtip/tip-anchor-sprite.gif new file mode 100644 index 0000000..9cf4850 Binary files /dev/null and b/src/main/webapp/gxt/images/default/qtip/tip-anchor-sprite.gif differ diff --git a/src/main/webapp/gxt/images/default/qtip/tip-sprite.gif b/src/main/webapp/gxt/images/default/qtip/tip-sprite.gif new file mode 100644 index 0000000..9810aca Binary files /dev/null and b/src/main/webapp/gxt/images/default/qtip/tip-sprite.gif differ diff --git a/src/main/webapp/gxt/images/default/s.gif b/src/main/webapp/gxt/images/default/s.gif new file mode 100644 index 0000000..1d11fa9 Binary files /dev/null and b/src/main/webapp/gxt/images/default/s.gif differ diff --git a/src/main/webapp/gxt/images/default/shadow-c.png b/src/main/webapp/gxt/images/default/shadow-c.png new file mode 100644 index 0000000..d435f80 Binary files /dev/null and b/src/main/webapp/gxt/images/default/shadow-c.png differ diff --git a/src/main/webapp/gxt/images/default/shadow-lr.png b/src/main/webapp/gxt/images/default/shadow-lr.png new file mode 100644 index 0000000..bb88b6f Binary files /dev/null and b/src/main/webapp/gxt/images/default/shadow-lr.png differ diff --git a/src/main/webapp/gxt/images/default/shadow.png b/src/main/webapp/gxt/images/default/shadow.png new file mode 100644 index 0000000..75c0eba Binary files /dev/null and b/src/main/webapp/gxt/images/default/shadow.png differ diff --git a/src/main/webapp/gxt/images/default/shared/blue-loading.gif b/src/main/webapp/gxt/images/default/shared/blue-loading.gif new file mode 100644 index 0000000..3bbf639 Binary files /dev/null and b/src/main/webapp/gxt/images/default/shared/blue-loading.gif differ diff --git a/src/main/webapp/gxt/images/default/shared/calendar.gif b/src/main/webapp/gxt/images/default/shared/calendar.gif new file mode 100644 index 0000000..133cf23 Binary files /dev/null and b/src/main/webapp/gxt/images/default/shared/calendar.gif differ diff --git a/src/main/webapp/gxt/images/default/shared/clear.gif b/src/main/webapp/gxt/images/default/shared/clear.gif new file mode 100644 index 0000000..35d42e8 Binary files /dev/null and b/src/main/webapp/gxt/images/default/shared/clear.gif differ diff --git a/src/main/webapp/gxt/images/default/shared/glass-bg.gif b/src/main/webapp/gxt/images/default/shared/glass-bg.gif new file mode 100644 index 0000000..26fbbae Binary files /dev/null and b/src/main/webapp/gxt/images/default/shared/glass-bg.gif differ diff --git a/src/main/webapp/gxt/images/default/shared/hd-sprite.gif b/src/main/webapp/gxt/images/default/shared/hd-sprite.gif new file mode 100644 index 0000000..42da1ea Binary files /dev/null and b/src/main/webapp/gxt/images/default/shared/hd-sprite.gif differ diff --git a/src/main/webapp/gxt/images/default/shared/large-loading.gif b/src/main/webapp/gxt/images/default/shared/large-loading.gif new file mode 100644 index 0000000..b36b555 Binary files /dev/null and b/src/main/webapp/gxt/images/default/shared/large-loading.gif differ diff --git a/src/main/webapp/gxt/images/default/shared/left-btn.gif b/src/main/webapp/gxt/images/default/shared/left-btn.gif new file mode 100644 index 0000000..a0ddd9e Binary files /dev/null and b/src/main/webapp/gxt/images/default/shared/left-btn.gif differ diff --git a/src/main/webapp/gxt/images/default/shared/loading-balls.gif b/src/main/webapp/gxt/images/default/shared/loading-balls.gif new file mode 100644 index 0000000..9ce214b Binary files /dev/null and b/src/main/webapp/gxt/images/default/shared/loading-balls.gif differ diff --git a/src/main/webapp/gxt/images/default/shared/right-btn.gif b/src/main/webapp/gxt/images/default/shared/right-btn.gif new file mode 100644 index 0000000..dee63e2 Binary files /dev/null and b/src/main/webapp/gxt/images/default/shared/right-btn.gif differ diff --git a/src/main/webapp/gxt/images/default/shared/warning.gif b/src/main/webapp/gxt/images/default/shared/warning.gif new file mode 100644 index 0000000..806d4bc Binary files /dev/null and b/src/main/webapp/gxt/images/default/shared/warning.gif differ diff --git a/src/main/webapp/gxt/images/default/sizer/e-handle-dark.gif b/src/main/webapp/gxt/images/default/sizer/e-handle-dark.gif new file mode 100644 index 0000000..b5486c1 Binary files /dev/null and b/src/main/webapp/gxt/images/default/sizer/e-handle-dark.gif differ diff --git a/src/main/webapp/gxt/images/default/sizer/e-handle.gif b/src/main/webapp/gxt/images/default/sizer/e-handle.gif new file mode 100644 index 0000000..00ba835 Binary files /dev/null and b/src/main/webapp/gxt/images/default/sizer/e-handle.gif differ diff --git a/src/main/webapp/gxt/images/default/sizer/ne-handle-dark.gif b/src/main/webapp/gxt/images/default/sizer/ne-handle-dark.gif new file mode 100644 index 0000000..04e5ecf Binary files /dev/null and b/src/main/webapp/gxt/images/default/sizer/ne-handle-dark.gif differ diff --git a/src/main/webapp/gxt/images/default/sizer/ne-handle.gif b/src/main/webapp/gxt/images/default/sizer/ne-handle.gif new file mode 100644 index 0000000..09405c7 Binary files /dev/null and b/src/main/webapp/gxt/images/default/sizer/ne-handle.gif differ diff --git a/src/main/webapp/gxt/images/default/sizer/nw-handle-dark.gif b/src/main/webapp/gxt/images/default/sizer/nw-handle-dark.gif new file mode 100644 index 0000000..6e49d69 Binary files /dev/null and b/src/main/webapp/gxt/images/default/sizer/nw-handle-dark.gif differ diff --git a/src/main/webapp/gxt/images/default/sizer/nw-handle.gif b/src/main/webapp/gxt/images/default/sizer/nw-handle.gif new file mode 100644 index 0000000..2fcea8a Binary files /dev/null and b/src/main/webapp/gxt/images/default/sizer/nw-handle.gif differ diff --git a/src/main/webapp/gxt/images/default/sizer/s-handle-dark.gif b/src/main/webapp/gxt/images/default/sizer/s-handle-dark.gif new file mode 100644 index 0000000..4eb5f0f Binary files /dev/null and b/src/main/webapp/gxt/images/default/sizer/s-handle-dark.gif differ diff --git a/src/main/webapp/gxt/images/default/sizer/s-handle.gif b/src/main/webapp/gxt/images/default/sizer/s-handle.gif new file mode 100644 index 0000000..bf069c2 Binary files /dev/null and b/src/main/webapp/gxt/images/default/sizer/s-handle.gif differ diff --git a/src/main/webapp/gxt/images/default/sizer/se-handle-dark.gif b/src/main/webapp/gxt/images/default/sizer/se-handle-dark.gif new file mode 100644 index 0000000..c4c1087 Binary files /dev/null and b/src/main/webapp/gxt/images/default/sizer/se-handle-dark.gif differ diff --git a/src/main/webapp/gxt/images/default/sizer/se-handle.gif b/src/main/webapp/gxt/images/default/sizer/se-handle.gif new file mode 100644 index 0000000..972055e Binary files /dev/null and b/src/main/webapp/gxt/images/default/sizer/se-handle.gif differ diff --git a/src/main/webapp/gxt/images/default/sizer/square.gif b/src/main/webapp/gxt/images/default/sizer/square.gif new file mode 100644 index 0000000..14ce6f7 Binary files /dev/null and b/src/main/webapp/gxt/images/default/sizer/square.gif differ diff --git a/src/main/webapp/gxt/images/default/sizer/sw-handle-dark.gif b/src/main/webapp/gxt/images/default/sizer/sw-handle-dark.gif new file mode 100644 index 0000000..77224b0 Binary files /dev/null and b/src/main/webapp/gxt/images/default/sizer/sw-handle-dark.gif differ diff --git a/src/main/webapp/gxt/images/default/sizer/sw-handle.gif b/src/main/webapp/gxt/images/default/sizer/sw-handle.gif new file mode 100644 index 0000000..3ca0ed9 Binary files /dev/null and b/src/main/webapp/gxt/images/default/sizer/sw-handle.gif differ diff --git a/src/main/webapp/gxt/images/default/slider/slider-bg.png b/src/main/webapp/gxt/images/default/slider/slider-bg.png new file mode 100644 index 0000000..9999194 Binary files /dev/null and b/src/main/webapp/gxt/images/default/slider/slider-bg.png differ diff --git a/src/main/webapp/gxt/images/default/slider/slider-thumb.png b/src/main/webapp/gxt/images/default/slider/slider-thumb.png new file mode 100644 index 0000000..cd654a4 Binary files /dev/null and b/src/main/webapp/gxt/images/default/slider/slider-thumb.png differ diff --git a/src/main/webapp/gxt/images/default/slider/slider-v-bg.png b/src/main/webapp/gxt/images/default/slider/slider-v-bg.png new file mode 100644 index 0000000..121450c Binary files /dev/null and b/src/main/webapp/gxt/images/default/slider/slider-v-bg.png differ diff --git a/src/main/webapp/gxt/images/default/slider/slider-v-thumb.png b/src/main/webapp/gxt/images/default/slider/slider-v-thumb.png new file mode 100644 index 0000000..7b3d725 Binary files /dev/null and b/src/main/webapp/gxt/images/default/slider/slider-v-thumb.png differ diff --git a/src/main/webapp/gxt/images/default/tabs/scroll-left.gif b/src/main/webapp/gxt/images/default/tabs/scroll-left.gif new file mode 100644 index 0000000..9f2f6d1 Binary files /dev/null and b/src/main/webapp/gxt/images/default/tabs/scroll-left.gif differ diff --git a/src/main/webapp/gxt/images/default/tabs/scroll-right.gif b/src/main/webapp/gxt/images/default/tabs/scroll-right.gif new file mode 100644 index 0000000..4c5e7e3 Binary files /dev/null and b/src/main/webapp/gxt/images/default/tabs/scroll-right.gif differ diff --git a/src/main/webapp/gxt/images/default/tabs/scroller-bg.gif b/src/main/webapp/gxt/images/default/tabs/scroller-bg.gif new file mode 100644 index 0000000..099b90d Binary files /dev/null and b/src/main/webapp/gxt/images/default/tabs/scroller-bg.gif differ diff --git a/src/main/webapp/gxt/images/default/tabs/tab-btm-inactive-left-bg.gif b/src/main/webapp/gxt/images/default/tabs/tab-btm-inactive-left-bg.gif new file mode 100644 index 0000000..188bf94 Binary files /dev/null and b/src/main/webapp/gxt/images/default/tabs/tab-btm-inactive-left-bg.gif differ diff --git a/src/main/webapp/gxt/images/default/tabs/tab-btm-inactive-right-bg.gif b/src/main/webapp/gxt/images/default/tabs/tab-btm-inactive-right-bg.gif new file mode 100644 index 0000000..e1f5e3c Binary files /dev/null and b/src/main/webapp/gxt/images/default/tabs/tab-btm-inactive-right-bg.gif differ diff --git a/src/main/webapp/gxt/images/default/tabs/tab-btm-left-bg.gif b/src/main/webapp/gxt/images/default/tabs/tab-btm-left-bg.gif new file mode 100644 index 0000000..e695186 Binary files /dev/null and b/src/main/webapp/gxt/images/default/tabs/tab-btm-left-bg.gif differ diff --git a/src/main/webapp/gxt/images/default/tabs/tab-btm-right-bg.gif b/src/main/webapp/gxt/images/default/tabs/tab-btm-right-bg.gif new file mode 100644 index 0000000..dde7968 Binary files /dev/null and b/src/main/webapp/gxt/images/default/tabs/tab-btm-right-bg.gif differ diff --git a/src/main/webapp/gxt/images/default/tabs/tab-close.gif b/src/main/webapp/gxt/images/default/tabs/tab-close.gif new file mode 100644 index 0000000..e699878 Binary files /dev/null and b/src/main/webapp/gxt/images/default/tabs/tab-close.gif differ diff --git a/src/main/webapp/gxt/images/default/tabs/tab-strip-bg.gif b/src/main/webapp/gxt/images/default/tabs/tab-strip-bg.gif new file mode 100644 index 0000000..34f1333 Binary files /dev/null and b/src/main/webapp/gxt/images/default/tabs/tab-strip-bg.gif differ diff --git a/src/main/webapp/gxt/images/default/tabs/tab-strip-bg.png b/src/main/webapp/gxt/images/default/tabs/tab-strip-bg.png new file mode 100644 index 0000000..fa8ab3f Binary files /dev/null and b/src/main/webapp/gxt/images/default/tabs/tab-strip-bg.png differ diff --git a/src/main/webapp/gxt/images/default/tabs/tab-strip-btm-bg.gif b/src/main/webapp/gxt/images/default/tabs/tab-strip-btm-bg.gif new file mode 100644 index 0000000..5eaba1e Binary files /dev/null and b/src/main/webapp/gxt/images/default/tabs/tab-strip-btm-bg.gif differ diff --git a/src/main/webapp/gxt/images/default/tabs/tabs-sprite.gif b/src/main/webapp/gxt/images/default/tabs/tabs-sprite.gif new file mode 100644 index 0000000..e969fb0 Binary files /dev/null and b/src/main/webapp/gxt/images/default/tabs/tabs-sprite.gif differ diff --git a/src/main/webapp/gxt/images/default/toolbar/bg.gif b/src/main/webapp/gxt/images/default/toolbar/bg.gif new file mode 100644 index 0000000..0b085bf Binary files /dev/null and b/src/main/webapp/gxt/images/default/toolbar/bg.gif differ diff --git a/src/main/webapp/gxt/images/default/toolbar/btn-arrow-light.gif b/src/main/webapp/gxt/images/default/toolbar/btn-arrow-light.gif new file mode 100644 index 0000000..b0e24b5 Binary files /dev/null and b/src/main/webapp/gxt/images/default/toolbar/btn-arrow-light.gif differ diff --git a/src/main/webapp/gxt/images/default/toolbar/btn-arrow.gif b/src/main/webapp/gxt/images/default/toolbar/btn-arrow.gif new file mode 100644 index 0000000..8acb460 Binary files /dev/null and b/src/main/webapp/gxt/images/default/toolbar/btn-arrow.gif differ diff --git a/src/main/webapp/gxt/images/default/toolbar/btn-over-bg.gif b/src/main/webapp/gxt/images/default/toolbar/btn-over-bg.gif new file mode 100644 index 0000000..ee2dd98 Binary files /dev/null and b/src/main/webapp/gxt/images/default/toolbar/btn-over-bg.gif differ diff --git a/src/main/webapp/gxt/images/default/toolbar/gray-bg.gif b/src/main/webapp/gxt/images/default/toolbar/gray-bg.gif new file mode 100644 index 0000000..bd49438 Binary files /dev/null and b/src/main/webapp/gxt/images/default/toolbar/gray-bg.gif differ diff --git a/src/main/webapp/gxt/images/default/toolbar/more.gif b/src/main/webapp/gxt/images/default/toolbar/more.gif new file mode 100644 index 0000000..02c2509 Binary files /dev/null and b/src/main/webapp/gxt/images/default/toolbar/more.gif differ diff --git a/src/main/webapp/gxt/images/default/toolbar/tb-bg.gif b/src/main/webapp/gxt/images/default/toolbar/tb-bg.gif new file mode 100644 index 0000000..4969e4e Binary files /dev/null and b/src/main/webapp/gxt/images/default/toolbar/tb-bg.gif differ diff --git a/src/main/webapp/gxt/images/default/toolbar/tb-btn-sprite.gif b/src/main/webapp/gxt/images/default/toolbar/tb-btn-sprite.gif new file mode 100644 index 0000000..19bbef3 Binary files /dev/null and b/src/main/webapp/gxt/images/default/toolbar/tb-btn-sprite.gif differ diff --git a/src/main/webapp/gxt/images/default/toolbar/tb-xl-btn-sprite.gif b/src/main/webapp/gxt/images/default/toolbar/tb-xl-btn-sprite.gif new file mode 100644 index 0000000..1bc0420 Binary files /dev/null and b/src/main/webapp/gxt/images/default/toolbar/tb-xl-btn-sprite.gif differ diff --git a/src/main/webapp/gxt/images/default/toolbar/tb-xl-sep.gif b/src/main/webapp/gxt/images/default/toolbar/tb-xl-sep.gif new file mode 100644 index 0000000..30555ee Binary files /dev/null and b/src/main/webapp/gxt/images/default/toolbar/tb-xl-sep.gif differ diff --git a/src/main/webapp/gxt/images/default/tree/arrows.gif b/src/main/webapp/gxt/images/default/tree/arrows.gif new file mode 100644 index 0000000..f8ff7b8 Binary files /dev/null and b/src/main/webapp/gxt/images/default/tree/arrows.gif differ diff --git a/src/main/webapp/gxt/images/default/tree/drop-add.gif b/src/main/webapp/gxt/images/default/tree/drop-add.gif new file mode 100644 index 0000000..b22cd14 Binary files /dev/null and b/src/main/webapp/gxt/images/default/tree/drop-add.gif differ diff --git a/src/main/webapp/gxt/images/default/tree/drop-between.gif b/src/main/webapp/gxt/images/default/tree/drop-between.gif new file mode 100644 index 0000000..5c6c09d Binary files /dev/null and b/src/main/webapp/gxt/images/default/tree/drop-between.gif differ diff --git a/src/main/webapp/gxt/images/default/tree/drop-no.gif b/src/main/webapp/gxt/images/default/tree/drop-no.gif new file mode 100644 index 0000000..9d9c6a9 Binary files /dev/null and b/src/main/webapp/gxt/images/default/tree/drop-no.gif differ diff --git a/src/main/webapp/gxt/images/default/tree/drop-over.gif b/src/main/webapp/gxt/images/default/tree/drop-over.gif new file mode 100644 index 0000000..30d1ca7 Binary files /dev/null and b/src/main/webapp/gxt/images/default/tree/drop-over.gif differ diff --git a/src/main/webapp/gxt/images/default/tree/drop-under.gif b/src/main/webapp/gxt/images/default/tree/drop-under.gif new file mode 100644 index 0000000..85f66b1 Binary files /dev/null and b/src/main/webapp/gxt/images/default/tree/drop-under.gif differ diff --git a/src/main/webapp/gxt/images/default/tree/drop-yes.gif b/src/main/webapp/gxt/images/default/tree/drop-yes.gif new file mode 100644 index 0000000..8aacb30 Binary files /dev/null and b/src/main/webapp/gxt/images/default/tree/drop-yes.gif differ diff --git a/src/main/webapp/gxt/images/default/tree/elbow-end-minus-nl.gif b/src/main/webapp/gxt/images/default/tree/elbow-end-minus-nl.gif new file mode 100644 index 0000000..928779e Binary files /dev/null and b/src/main/webapp/gxt/images/default/tree/elbow-end-minus-nl.gif differ diff --git a/src/main/webapp/gxt/images/default/tree/elbow-end-minus.gif b/src/main/webapp/gxt/images/default/tree/elbow-end-minus.gif new file mode 100644 index 0000000..9a8d727 Binary files /dev/null and b/src/main/webapp/gxt/images/default/tree/elbow-end-minus.gif differ diff --git a/src/main/webapp/gxt/images/default/tree/elbow-end-plus-nl.gif b/src/main/webapp/gxt/images/default/tree/elbow-end-plus-nl.gif new file mode 100644 index 0000000..9f7f698 Binary files /dev/null and b/src/main/webapp/gxt/images/default/tree/elbow-end-plus-nl.gif differ diff --git a/src/main/webapp/gxt/images/default/tree/elbow-end-plus.gif b/src/main/webapp/gxt/images/default/tree/elbow-end-plus.gif new file mode 100644 index 0000000..5943a01 Binary files /dev/null and b/src/main/webapp/gxt/images/default/tree/elbow-end-plus.gif differ diff --git a/src/main/webapp/gxt/images/default/tree/elbow-end.gif b/src/main/webapp/gxt/images/default/tree/elbow-end.gif new file mode 100644 index 0000000..f24ddee Binary files /dev/null and b/src/main/webapp/gxt/images/default/tree/elbow-end.gif differ diff --git a/src/main/webapp/gxt/images/default/tree/elbow-line.gif b/src/main/webapp/gxt/images/default/tree/elbow-line.gif new file mode 100644 index 0000000..75e6da4 Binary files /dev/null and b/src/main/webapp/gxt/images/default/tree/elbow-line.gif differ diff --git a/src/main/webapp/gxt/images/default/tree/elbow-minus-nl.gif b/src/main/webapp/gxt/images/default/tree/elbow-minus-nl.gif new file mode 100644 index 0000000..928779e Binary files /dev/null and b/src/main/webapp/gxt/images/default/tree/elbow-minus-nl.gif differ diff --git a/src/main/webapp/gxt/images/default/tree/elbow-minus.gif b/src/main/webapp/gxt/images/default/tree/elbow-minus.gif new file mode 100644 index 0000000..97dcc71 Binary files /dev/null and b/src/main/webapp/gxt/images/default/tree/elbow-minus.gif differ diff --git a/src/main/webapp/gxt/images/default/tree/elbow-plus-nl.gif b/src/main/webapp/gxt/images/default/tree/elbow-plus-nl.gif new file mode 100644 index 0000000..9f7f698 Binary files /dev/null and b/src/main/webapp/gxt/images/default/tree/elbow-plus-nl.gif differ diff --git a/src/main/webapp/gxt/images/default/tree/elbow-plus.gif b/src/main/webapp/gxt/images/default/tree/elbow-plus.gif new file mode 100644 index 0000000..698de47 Binary files /dev/null and b/src/main/webapp/gxt/images/default/tree/elbow-plus.gif differ diff --git a/src/main/webapp/gxt/images/default/tree/elbow.gif b/src/main/webapp/gxt/images/default/tree/elbow.gif new file mode 100644 index 0000000..b8f4208 Binary files /dev/null and b/src/main/webapp/gxt/images/default/tree/elbow.gif differ diff --git a/src/main/webapp/gxt/images/default/tree/folder-open.gif b/src/main/webapp/gxt/images/default/tree/folder-open.gif new file mode 100644 index 0000000..56ba737 Binary files /dev/null and b/src/main/webapp/gxt/images/default/tree/folder-open.gif differ diff --git a/src/main/webapp/gxt/images/default/tree/folder.gif b/src/main/webapp/gxt/images/default/tree/folder.gif new file mode 100644 index 0000000..20412f7 Binary files /dev/null and b/src/main/webapp/gxt/images/default/tree/folder.gif differ diff --git a/src/main/webapp/gxt/images/default/tree/leaf.gif b/src/main/webapp/gxt/images/default/tree/leaf.gif new file mode 100644 index 0000000..445769d Binary files /dev/null and b/src/main/webapp/gxt/images/default/tree/leaf.gif differ diff --git a/src/main/webapp/gxt/images/default/tree/loading.gif b/src/main/webapp/gxt/images/default/tree/loading.gif new file mode 100644 index 0000000..e846e1d Binary files /dev/null and b/src/main/webapp/gxt/images/default/tree/loading.gif differ diff --git a/src/main/webapp/gxt/images/default/tree/s.gif b/src/main/webapp/gxt/images/default/tree/s.gif new file mode 100644 index 0000000..1d11fa9 Binary files /dev/null and b/src/main/webapp/gxt/images/default/tree/s.gif differ diff --git a/src/main/webapp/gxt/images/default/window/icon-error.gif b/src/main/webapp/gxt/images/default/window/icon-error.gif new file mode 100644 index 0000000..397b655 Binary files /dev/null and b/src/main/webapp/gxt/images/default/window/icon-error.gif differ diff --git a/src/main/webapp/gxt/images/default/window/icon-info.gif b/src/main/webapp/gxt/images/default/window/icon-info.gif new file mode 100644 index 0000000..58281c3 Binary files /dev/null and b/src/main/webapp/gxt/images/default/window/icon-info.gif differ diff --git a/src/main/webapp/gxt/images/default/window/icon-question.gif b/src/main/webapp/gxt/images/default/window/icon-question.gif new file mode 100644 index 0000000..08abd82 Binary files /dev/null and b/src/main/webapp/gxt/images/default/window/icon-question.gif differ diff --git a/src/main/webapp/gxt/images/default/window/icon-warning.gif b/src/main/webapp/gxt/images/default/window/icon-warning.gif new file mode 100644 index 0000000..27ff98b Binary files /dev/null and b/src/main/webapp/gxt/images/default/window/icon-warning.gif differ diff --git a/src/main/webapp/gxt/images/default/window/left-corners.png b/src/main/webapp/gxt/images/default/window/left-corners.png new file mode 100644 index 0000000..1a51833 Binary files /dev/null and b/src/main/webapp/gxt/images/default/window/left-corners.png differ diff --git a/src/main/webapp/gxt/images/default/window/left-right.png b/src/main/webapp/gxt/images/default/window/left-right.png new file mode 100644 index 0000000..7586ff3 Binary files /dev/null and b/src/main/webapp/gxt/images/default/window/left-right.png differ diff --git a/src/main/webapp/gxt/images/default/window/right-corners.png b/src/main/webapp/gxt/images/default/window/right-corners.png new file mode 100644 index 0000000..e69a3ff Binary files /dev/null and b/src/main/webapp/gxt/images/default/window/right-corners.png differ diff --git a/src/main/webapp/gxt/images/default/window/top-bottom.png b/src/main/webapp/gxt/images/default/window/top-bottom.png new file mode 100644 index 0000000..33779e7 Binary files /dev/null and b/src/main/webapp/gxt/images/default/window/top-bottom.png differ diff --git a/src/main/webapp/gxt/images/gray/button/btn-arrow.gif b/src/main/webapp/gxt/images/gray/button/btn-arrow.gif new file mode 100644 index 0000000..f90d5df Binary files /dev/null and b/src/main/webapp/gxt/images/gray/button/btn-arrow.gif differ diff --git a/src/main/webapp/gxt/images/gray/button/btn-sprite.gif b/src/main/webapp/gxt/images/gray/button/btn-sprite.gif new file mode 100644 index 0000000..c59d1b1 Binary files /dev/null and b/src/main/webapp/gxt/images/gray/button/btn-sprite.gif differ diff --git a/src/main/webapp/gxt/images/gray/button/btn.gif b/src/main/webapp/gxt/images/gray/button/btn.gif new file mode 100644 index 0000000..96ea61a Binary files /dev/null and b/src/main/webapp/gxt/images/gray/button/btn.gif differ diff --git a/src/main/webapp/gxt/images/gray/button/group-cs.gif b/src/main/webapp/gxt/images/gray/button/group-cs.gif new file mode 100644 index 0000000..46a891d Binary files /dev/null and b/src/main/webapp/gxt/images/gray/button/group-cs.gif differ diff --git a/src/main/webapp/gxt/images/gray/button/group-lr.gif b/src/main/webapp/gxt/images/gray/button/group-lr.gif new file mode 100644 index 0000000..12a81ff Binary files /dev/null and b/src/main/webapp/gxt/images/gray/button/group-lr.gif differ diff --git a/src/main/webapp/gxt/images/gray/button/group-tb.gif b/src/main/webapp/gxt/images/gray/button/group-tb.gif new file mode 100644 index 0000000..c5ea8ca Binary files /dev/null and b/src/main/webapp/gxt/images/gray/button/group-tb.gif differ diff --git a/src/main/webapp/gxt/images/gray/gradient-bg.gif b/src/main/webapp/gxt/images/gray/gradient-bg.gif new file mode 100644 index 0000000..8134e49 Binary files /dev/null and b/src/main/webapp/gxt/images/gray/gradient-bg.gif differ diff --git a/src/main/webapp/gxt/images/gray/panel/corners-sprite.gif b/src/main/webapp/gxt/images/gray/panel/corners-sprite.gif new file mode 100644 index 0000000..5305d73 Binary files /dev/null and b/src/main/webapp/gxt/images/gray/panel/corners-sprite.gif differ diff --git a/src/main/webapp/gxt/images/gray/panel/left-right.gif b/src/main/webapp/gxt/images/gray/panel/left-right.gif new file mode 100644 index 0000000..174c85e Binary files /dev/null and b/src/main/webapp/gxt/images/gray/panel/left-right.gif differ diff --git a/src/main/webapp/gxt/images/gray/panel/light-hd.gif b/src/main/webapp/gxt/images/gray/panel/light-hd.gif new file mode 100644 index 0000000..6eb28ba Binary files /dev/null and b/src/main/webapp/gxt/images/gray/panel/light-hd.gif differ diff --git a/src/main/webapp/gxt/images/gray/panel/tool-sprite-tpl.gif b/src/main/webapp/gxt/images/gray/panel/tool-sprite-tpl.gif new file mode 100644 index 0000000..18277a3 Binary files /dev/null and b/src/main/webapp/gxt/images/gray/panel/tool-sprite-tpl.gif differ diff --git a/src/main/webapp/gxt/images/gray/panel/tool-sprites.gif b/src/main/webapp/gxt/images/gray/panel/tool-sprites.gif new file mode 100644 index 0000000..11845e6 Binary files /dev/null and b/src/main/webapp/gxt/images/gray/panel/tool-sprites.gif differ diff --git a/src/main/webapp/gxt/images/gray/panel/tools-sprites-trans.gif b/src/main/webapp/gxt/images/gray/panel/tools-sprites-trans.gif new file mode 100644 index 0000000..e58bf20 Binary files /dev/null and b/src/main/webapp/gxt/images/gray/panel/tools-sprites-trans.gif differ diff --git a/src/main/webapp/gxt/images/gray/panel/top-bottom.gif b/src/main/webapp/gxt/images/gray/panel/top-bottom.gif new file mode 100644 index 0000000..fad5314 Binary files /dev/null and b/src/main/webapp/gxt/images/gray/panel/top-bottom.gif differ diff --git a/src/main/webapp/gxt/images/gray/panel/top-bottom.png b/src/main/webapp/gxt/images/gray/panel/top-bottom.png new file mode 100644 index 0000000..578ffb6 Binary files /dev/null and b/src/main/webapp/gxt/images/gray/panel/top-bottom.png differ diff --git a/src/main/webapp/gxt/images/gray/panel/white-corners-sprite.gif b/src/main/webapp/gxt/images/gray/panel/white-corners-sprite.gif new file mode 100644 index 0000000..d5b8adf Binary files /dev/null and b/src/main/webapp/gxt/images/gray/panel/white-corners-sprite.gif differ diff --git a/src/main/webapp/gxt/images/gray/panel/white-left-right.gif b/src/main/webapp/gxt/images/gray/panel/white-left-right.gif new file mode 100644 index 0000000..2c9e142 Binary files /dev/null and b/src/main/webapp/gxt/images/gray/panel/white-left-right.gif differ diff --git a/src/main/webapp/gxt/images/gray/panel/white-top-bottom.gif b/src/main/webapp/gxt/images/gray/panel/white-top-bottom.gif new file mode 100644 index 0000000..8046089 Binary files /dev/null and b/src/main/webapp/gxt/images/gray/panel/white-top-bottom.gif differ diff --git a/src/main/webapp/gxt/images/gray/qtip/bg.gif b/src/main/webapp/gxt/images/gray/qtip/bg.gif new file mode 100644 index 0000000..a9055a5 Binary files /dev/null and b/src/main/webapp/gxt/images/gray/qtip/bg.gif differ diff --git a/src/main/webapp/gxt/images/gray/qtip/close.gif b/src/main/webapp/gxt/images/gray/qtip/close.gif new file mode 100644 index 0000000..69ab915 Binary files /dev/null and b/src/main/webapp/gxt/images/gray/qtip/close.gif differ diff --git a/src/main/webapp/gxt/images/gray/qtip/tip-sprite.gif b/src/main/webapp/gxt/images/gray/qtip/tip-sprite.gif new file mode 100644 index 0000000..472c4c2 Binary files /dev/null and b/src/main/webapp/gxt/images/gray/qtip/tip-sprite.gif differ diff --git a/src/main/webapp/gxt/images/gray/s.gif b/src/main/webapp/gxt/images/gray/s.gif new file mode 100644 index 0000000..1d11fa9 Binary files /dev/null and b/src/main/webapp/gxt/images/gray/s.gif differ diff --git a/src/main/webapp/gxt/images/gray/tabs/scroll-left.gif b/src/main/webapp/gxt/images/gray/tabs/scroll-left.gif new file mode 100644 index 0000000..bbb3e3d Binary files /dev/null and b/src/main/webapp/gxt/images/gray/tabs/scroll-left.gif differ diff --git a/src/main/webapp/gxt/images/gray/tabs/scroll-right.gif b/src/main/webapp/gxt/images/gray/tabs/scroll-right.gif new file mode 100644 index 0000000..feb6a76 Binary files /dev/null and b/src/main/webapp/gxt/images/gray/tabs/scroll-right.gif differ diff --git a/src/main/webapp/gxt/images/gray/tabs/scroller-bg.gif b/src/main/webapp/gxt/images/gray/tabs/scroller-bg.gif new file mode 100644 index 0000000..f089c0a Binary files /dev/null and b/src/main/webapp/gxt/images/gray/tabs/scroller-bg.gif differ diff --git a/src/main/webapp/gxt/images/gray/tabs/tab-btm-inactive-left-bg.gif b/src/main/webapp/gxt/images/gray/tabs/tab-btm-inactive-left-bg.gif new file mode 100644 index 0000000..d718173 Binary files /dev/null and b/src/main/webapp/gxt/images/gray/tabs/tab-btm-inactive-left-bg.gif differ diff --git a/src/main/webapp/gxt/images/gray/tabs/tab-btm-inactive-right-bg.gif b/src/main/webapp/gxt/images/gray/tabs/tab-btm-inactive-right-bg.gif new file mode 100644 index 0000000..bf35493 Binary files /dev/null and b/src/main/webapp/gxt/images/gray/tabs/tab-btm-inactive-right-bg.gif differ diff --git a/src/main/webapp/gxt/images/gray/tabs/tab-btm-left-bg.gif b/src/main/webapp/gxt/images/gray/tabs/tab-btm-left-bg.gif new file mode 100644 index 0000000..c41cada Binary files /dev/null and b/src/main/webapp/gxt/images/gray/tabs/tab-btm-left-bg.gif differ diff --git a/src/main/webapp/gxt/images/gray/tabs/tab-btm-right-bg.gif b/src/main/webapp/gxt/images/gray/tabs/tab-btm-right-bg.gif new file mode 100644 index 0000000..96d2e5e Binary files /dev/null and b/src/main/webapp/gxt/images/gray/tabs/tab-btm-right-bg.gif differ diff --git a/src/main/webapp/gxt/images/gray/tabs/tab-close.gif b/src/main/webapp/gxt/images/gray/tabs/tab-close.gif new file mode 100644 index 0000000..98d5da9 Binary files /dev/null and b/src/main/webapp/gxt/images/gray/tabs/tab-close.gif differ diff --git a/src/main/webapp/gxt/images/gray/tabs/tab-strip-bg.gif b/src/main/webapp/gxt/images/gray/tabs/tab-strip-bg.gif new file mode 100644 index 0000000..040b677 Binary files /dev/null and b/src/main/webapp/gxt/images/gray/tabs/tab-strip-bg.gif differ diff --git a/src/main/webapp/gxt/images/gray/tabs/tab-strip-bg.png b/src/main/webapp/gxt/images/gray/tabs/tab-strip-bg.png new file mode 100644 index 0000000..fa8ab3f Binary files /dev/null and b/src/main/webapp/gxt/images/gray/tabs/tab-strip-bg.png differ diff --git a/src/main/webapp/gxt/images/gray/tabs/tab-strip-btm-bg.gif b/src/main/webapp/gxt/images/gray/tabs/tab-strip-btm-bg.gif new file mode 100644 index 0000000..f35087f Binary files /dev/null and b/src/main/webapp/gxt/images/gray/tabs/tab-strip-btm-bg.gif differ diff --git a/src/main/webapp/gxt/images/gray/tabs/tabs-sprite.gif b/src/main/webapp/gxt/images/gray/tabs/tabs-sprite.gif new file mode 100644 index 0000000..1901b23 Binary files /dev/null and b/src/main/webapp/gxt/images/gray/tabs/tabs-sprite.gif differ diff --git a/src/main/webapp/gxt/images/gray/toolbar/bg.gif b/src/main/webapp/gxt/images/gray/toolbar/bg.gif new file mode 100644 index 0000000..6789c88 Binary files /dev/null and b/src/main/webapp/gxt/images/gray/toolbar/bg.gif differ diff --git a/src/main/webapp/gxt/images/gray/toolbar/btn-arrow-light.gif b/src/main/webapp/gxt/images/gray/toolbar/btn-arrow-light.gif new file mode 100644 index 0000000..b0e24b5 Binary files /dev/null and b/src/main/webapp/gxt/images/gray/toolbar/btn-arrow-light.gif differ diff --git a/src/main/webapp/gxt/images/gray/toolbar/btn-arrow.gif b/src/main/webapp/gxt/images/gray/toolbar/btn-arrow.gif new file mode 100644 index 0000000..8acb460 Binary files /dev/null and b/src/main/webapp/gxt/images/gray/toolbar/btn-arrow.gif differ diff --git a/src/main/webapp/gxt/images/gray/toolbar/btn-over-bg.gif b/src/main/webapp/gxt/images/gray/toolbar/btn-over-bg.gif new file mode 100644 index 0000000..ee2dd98 Binary files /dev/null and b/src/main/webapp/gxt/images/gray/toolbar/btn-over-bg.gif differ diff --git a/src/main/webapp/gxt/images/gray/toolbar/gray-bg.gif b/src/main/webapp/gxt/images/gray/toolbar/gray-bg.gif new file mode 100644 index 0000000..5464e21 Binary files /dev/null and b/src/main/webapp/gxt/images/gray/toolbar/gray-bg.gif differ diff --git a/src/main/webapp/gxt/images/gray/toolbar/tb-bg.gif b/src/main/webapp/gxt/images/gray/toolbar/tb-bg.gif new file mode 100644 index 0000000..4969e4e Binary files /dev/null and b/src/main/webapp/gxt/images/gray/toolbar/tb-bg.gif differ diff --git a/src/main/webapp/gxt/images/gray/toolbar/tb-btn-sprite.gif b/src/main/webapp/gxt/images/gray/toolbar/tb-btn-sprite.gif new file mode 100644 index 0000000..894fef2 Binary files /dev/null and b/src/main/webapp/gxt/images/gray/toolbar/tb-btn-sprite.gif differ diff --git a/src/main/webapp/gxt/images/gray/window/icon-error.gif b/src/main/webapp/gxt/images/gray/window/icon-error.gif new file mode 100644 index 0000000..397b655 Binary files /dev/null and b/src/main/webapp/gxt/images/gray/window/icon-error.gif differ diff --git a/src/main/webapp/gxt/images/gray/window/icon-info.gif b/src/main/webapp/gxt/images/gray/window/icon-info.gif new file mode 100644 index 0000000..58281c3 Binary files /dev/null and b/src/main/webapp/gxt/images/gray/window/icon-info.gif differ diff --git a/src/main/webapp/gxt/images/gray/window/icon-question.gif b/src/main/webapp/gxt/images/gray/window/icon-question.gif new file mode 100644 index 0000000..08abd82 Binary files /dev/null and b/src/main/webapp/gxt/images/gray/window/icon-question.gif differ diff --git a/src/main/webapp/gxt/images/gray/window/icon-warning.gif b/src/main/webapp/gxt/images/gray/window/icon-warning.gif new file mode 100644 index 0000000..27ff98b Binary files /dev/null and b/src/main/webapp/gxt/images/gray/window/icon-warning.gif differ diff --git a/src/main/webapp/gxt/images/gray/window/left-corners.png b/src/main/webapp/gxt/images/gray/window/left-corners.png new file mode 100644 index 0000000..28dfc98 Binary files /dev/null and b/src/main/webapp/gxt/images/gray/window/left-corners.png differ diff --git a/src/main/webapp/gxt/images/gray/window/left-corners.pspimage b/src/main/webapp/gxt/images/gray/window/left-corners.pspimage new file mode 100644 index 0000000..f0bb2d4 Binary files /dev/null and b/src/main/webapp/gxt/images/gray/window/left-corners.pspimage differ diff --git a/src/main/webapp/gxt/images/gray/window/left-right.png b/src/main/webapp/gxt/images/gray/window/left-right.png new file mode 100644 index 0000000..d16ac24 Binary files /dev/null and b/src/main/webapp/gxt/images/gray/window/left-right.png differ diff --git a/src/main/webapp/gxt/images/gray/window/right-corners.png b/src/main/webapp/gxt/images/gray/window/right-corners.png new file mode 100644 index 0000000..f84ca07 Binary files /dev/null and b/src/main/webapp/gxt/images/gray/window/right-corners.png differ diff --git a/src/main/webapp/gxt/images/gray/window/top-bottom.png b/src/main/webapp/gxt/images/gray/window/top-bottom.png new file mode 100644 index 0000000..2887f06 Binary files /dev/null and b/src/main/webapp/gxt/images/gray/window/top-bottom.png differ diff --git a/src/main/webapp/gxt/images/gxt/dd/insert-bg.gif b/src/main/webapp/gxt/images/gxt/dd/insert-bg.gif new file mode 100644 index 0000000..2f63b14 Binary files /dev/null and b/src/main/webapp/gxt/images/gxt/dd/insert-bg.gif differ diff --git a/src/main/webapp/gxt/images/gxt/grid/row-editor-bg.gif b/src/main/webapp/gxt/images/gxt/grid/row-editor-bg.gif new file mode 100644 index 0000000..03b3b2c Binary files /dev/null and b/src/main/webapp/gxt/images/gxt/grid/row-editor-bg.gif differ diff --git a/src/main/webapp/gxt/images/gxt/grid/row-editor-btns.gif b/src/main/webapp/gxt/images/gxt/grid/row-editor-btns.gif new file mode 100644 index 0000000..10668ed Binary files /dev/null and b/src/main/webapp/gxt/images/gxt/grid/row-editor-btns.gif differ diff --git a/src/main/webapp/gxt/images/gxt/icons/bottom2.gif b/src/main/webapp/gxt/images/gxt/icons/bottom2.gif new file mode 100644 index 0000000..ec57dbb Binary files /dev/null and b/src/main/webapp/gxt/images/gxt/icons/bottom2.gif differ diff --git a/src/main/webapp/gxt/images/gxt/icons/columns.gif b/src/main/webapp/gxt/images/gxt/icons/columns.gif new file mode 100644 index 0000000..2d3a823 Binary files /dev/null and b/src/main/webapp/gxt/images/gxt/icons/columns.gif differ diff --git a/src/main/webapp/gxt/images/gxt/icons/done.gif b/src/main/webapp/gxt/images/gxt/icons/done.gif new file mode 100644 index 0000000..a937cb2 Binary files /dev/null and b/src/main/webapp/gxt/images/gxt/icons/done.gif differ diff --git a/src/main/webapp/gxt/images/gxt/icons/doubleleft2.gif b/src/main/webapp/gxt/images/gxt/icons/doubleleft2.gif new file mode 100644 index 0000000..9bfa067 Binary files /dev/null and b/src/main/webapp/gxt/images/gxt/icons/doubleleft2.gif differ diff --git a/src/main/webapp/gxt/images/gxt/icons/doubleright2.gif b/src/main/webapp/gxt/images/gxt/icons/doubleright2.gif new file mode 100644 index 0000000..79f8b0b Binary files /dev/null and b/src/main/webapp/gxt/images/gxt/icons/doubleright2.gif differ diff --git a/src/main/webapp/gxt/images/gxt/icons/down2.gif b/src/main/webapp/gxt/images/gxt/icons/down2.gif new file mode 100644 index 0000000..15e9234 Binary files /dev/null and b/src/main/webapp/gxt/images/gxt/icons/down2.gif differ diff --git a/src/main/webapp/gxt/images/gxt/icons/folder-closed.gif b/src/main/webapp/gxt/images/gxt/icons/folder-closed.gif new file mode 100644 index 0000000..f1ce479 Binary files /dev/null and b/src/main/webapp/gxt/images/gxt/icons/folder-closed.gif differ diff --git a/src/main/webapp/gxt/images/gxt/icons/folder-closed.png b/src/main/webapp/gxt/images/gxt/icons/folder-closed.png new file mode 100644 index 0000000..caad126 Binary files /dev/null and b/src/main/webapp/gxt/images/gxt/icons/folder-closed.png differ diff --git a/src/main/webapp/gxt/images/gxt/icons/folder.gif b/src/main/webapp/gxt/images/gxt/icons/folder.gif new file mode 100644 index 0000000..2fc445f Binary files /dev/null and b/src/main/webapp/gxt/images/gxt/icons/folder.gif differ diff --git a/src/main/webapp/gxt/images/gxt/icons/folder.png b/src/main/webapp/gxt/images/gxt/icons/folder.png new file mode 100644 index 0000000..c5df8d8 Binary files /dev/null and b/src/main/webapp/gxt/images/gxt/icons/folder.png differ diff --git a/src/main/webapp/gxt/images/gxt/icons/grid-loading.gif b/src/main/webapp/gxt/images/gxt/icons/grid-loading.gif new file mode 100644 index 0000000..d112c54 Binary files /dev/null and b/src/main/webapp/gxt/images/gxt/icons/grid-loading.gif differ diff --git a/src/main/webapp/gxt/images/gxt/icons/hmenu-asc.gif b/src/main/webapp/gxt/images/gxt/icons/hmenu-asc.gif new file mode 100644 index 0000000..8917e0e Binary files /dev/null and b/src/main/webapp/gxt/images/gxt/icons/hmenu-asc.gif differ diff --git a/src/main/webapp/gxt/images/gxt/icons/hmenu-desc.gif b/src/main/webapp/gxt/images/gxt/icons/hmenu-desc.gif new file mode 100644 index 0000000..f26b7c2 Binary files /dev/null and b/src/main/webapp/gxt/images/gxt/icons/hmenu-desc.gif differ diff --git a/src/main/webapp/gxt/images/gxt/icons/left2.gif b/src/main/webapp/gxt/images/gxt/icons/left2.gif new file mode 100644 index 0000000..e8bbfb0 Binary files /dev/null and b/src/main/webapp/gxt/images/gxt/icons/left2.gif differ diff --git a/src/main/webapp/gxt/images/gxt/icons/loading.gif b/src/main/webapp/gxt/images/gxt/icons/loading.gif new file mode 100644 index 0000000..e846e1d Binary files /dev/null and b/src/main/webapp/gxt/images/gxt/icons/loading.gif differ diff --git a/src/main/webapp/gxt/images/gxt/icons/nowait.gif b/src/main/webapp/gxt/images/gxt/icons/nowait.gif new file mode 100644 index 0000000..4c5862c Binary files /dev/null and b/src/main/webapp/gxt/images/gxt/icons/nowait.gif differ diff --git a/src/main/webapp/gxt/images/gxt/icons/page-first-disabled.gif b/src/main/webapp/gxt/images/gxt/icons/page-first-disabled.gif new file mode 100644 index 0000000..1e02c41 Binary files /dev/null and b/src/main/webapp/gxt/images/gxt/icons/page-first-disabled.gif differ diff --git a/src/main/webapp/gxt/images/gxt/icons/page-first.gif b/src/main/webapp/gxt/images/gxt/icons/page-first.gif new file mode 100644 index 0000000..d84f41a Binary files /dev/null and b/src/main/webapp/gxt/images/gxt/icons/page-first.gif differ diff --git a/src/main/webapp/gxt/images/gxt/icons/page-last-disabled.gif b/src/main/webapp/gxt/images/gxt/icons/page-last-disabled.gif new file mode 100644 index 0000000..8697067 Binary files /dev/null and b/src/main/webapp/gxt/images/gxt/icons/page-last-disabled.gif differ diff --git a/src/main/webapp/gxt/images/gxt/icons/page-last.gif b/src/main/webapp/gxt/images/gxt/icons/page-last.gif new file mode 100644 index 0000000..3df5c2b Binary files /dev/null and b/src/main/webapp/gxt/images/gxt/icons/page-last.gif differ diff --git a/src/main/webapp/gxt/images/gxt/icons/page-next-disabled.gif b/src/main/webapp/gxt/images/gxt/icons/page-next-disabled.gif new file mode 100644 index 0000000..90a7756 Binary files /dev/null and b/src/main/webapp/gxt/images/gxt/icons/page-next-disabled.gif differ diff --git a/src/main/webapp/gxt/images/gxt/icons/page-next.gif b/src/main/webapp/gxt/images/gxt/icons/page-next.gif new file mode 100644 index 0000000..9601635 Binary files /dev/null and b/src/main/webapp/gxt/images/gxt/icons/page-next.gif differ diff --git a/src/main/webapp/gxt/images/gxt/icons/page-prev-disabled.gif b/src/main/webapp/gxt/images/gxt/icons/page-prev-disabled.gif new file mode 100644 index 0000000..37154d6 Binary files /dev/null and b/src/main/webapp/gxt/images/gxt/icons/page-prev-disabled.gif differ diff --git a/src/main/webapp/gxt/images/gxt/icons/page-prev.gif b/src/main/webapp/gxt/images/gxt/icons/page-prev.gif new file mode 100644 index 0000000..eb70cf8 Binary files /dev/null and b/src/main/webapp/gxt/images/gxt/icons/page-prev.gif differ diff --git a/src/main/webapp/gxt/images/gxt/icons/paging.gif b/src/main/webapp/gxt/images/gxt/icons/paging.gif new file mode 100644 index 0000000..29d51d7 Binary files /dev/null and b/src/main/webapp/gxt/images/gxt/icons/paging.gif differ diff --git a/src/main/webapp/gxt/images/gxt/icons/right2.gif b/src/main/webapp/gxt/images/gxt/icons/right2.gif new file mode 100644 index 0000000..9dba8d7 Binary files /dev/null and b/src/main/webapp/gxt/images/gxt/icons/right2.gif differ diff --git a/src/main/webapp/gxt/images/gxt/icons/tabs.gif b/src/main/webapp/gxt/images/gxt/icons/tabs.gif new file mode 100644 index 0000000..759de0f Binary files /dev/null and b/src/main/webapp/gxt/images/gxt/icons/tabs.gif differ diff --git a/src/main/webapp/gxt/images/gxt/icons/top2.gif b/src/main/webapp/gxt/images/gxt/icons/top2.gif new file mode 100644 index 0000000..0493793 Binary files /dev/null and b/src/main/webapp/gxt/images/gxt/icons/top2.gif differ diff --git a/src/main/webapp/gxt/images/gxt/icons/up2.gif b/src/main/webapp/gxt/images/gxt/icons/up2.gif new file mode 100644 index 0000000..431ddd4 Binary files /dev/null and b/src/main/webapp/gxt/images/gxt/icons/up2.gif differ diff --git a/src/main/webapp/gxt/images/gxt/icons/wait.gif b/src/main/webapp/gxt/images/gxt/icons/wait.gif new file mode 100644 index 0000000..471c1a4 Binary files /dev/null and b/src/main/webapp/gxt/images/gxt/icons/wait.gif differ diff --git a/src/main/webapp/gxt/images/gxt/info/corners-sprite.gif b/src/main/webapp/gxt/images/gxt/info/corners-sprite.gif new file mode 100644 index 0000000..a86494e Binary files /dev/null and b/src/main/webapp/gxt/images/gxt/info/corners-sprite.gif differ diff --git a/src/main/webapp/gxt/images/gxt/info/top-bottom.gif b/src/main/webapp/gxt/images/gxt/info/top-bottom.gif new file mode 100644 index 0000000..05bd802 Binary files /dev/null and b/src/main/webapp/gxt/images/gxt/info/top-bottom.gif differ diff --git a/src/main/webapp/gxt/images/gxt/menu/disabledcheck.gif b/src/main/webapp/gxt/images/gxt/menu/disabledcheck.gif new file mode 100644 index 0000000..cdd0333 Binary files /dev/null and b/src/main/webapp/gxt/images/gxt/menu/disabledcheck.gif differ diff --git a/src/main/webapp/gxt/images/gxt/shared/clear.gif b/src/main/webapp/gxt/images/gxt/shared/clear.gif new file mode 100644 index 0000000..35d42e8 Binary files /dev/null and b/src/main/webapp/gxt/images/gxt/shared/clear.gif differ diff --git a/src/main/webapp/gxt/images/gxt/shared/large-loading.gif b/src/main/webapp/gxt/images/gxt/shared/large-loading.gif new file mode 100644 index 0000000..b36b555 Binary files /dev/null and b/src/main/webapp/gxt/images/gxt/shared/large-loading.gif differ diff --git a/src/main/webapp/gxt/images/gxt/shared/select-18-bg.gif b/src/main/webapp/gxt/images/gxt/shared/select-18-bg.gif new file mode 100644 index 0000000..35d90b1 Binary files /dev/null and b/src/main/webapp/gxt/images/gxt/shared/select-18-bg.gif differ diff --git a/src/main/webapp/gxt/images/gxt/shared/select-19-bg-gray.gif b/src/main/webapp/gxt/images/gxt/shared/select-19-bg-gray.gif new file mode 100644 index 0000000..0ab17fb Binary files /dev/null and b/src/main/webapp/gxt/images/gxt/shared/select-19-bg-gray.gif differ diff --git a/src/main/webapp/gxt/images/gxt/shared/select-19-bg.gif b/src/main/webapp/gxt/images/gxt/shared/select-19-bg.gif new file mode 100644 index 0000000..31a3923 Binary files /dev/null and b/src/main/webapp/gxt/images/gxt/shared/select-19-bg.gif differ diff --git a/src/main/webapp/gxt/images/gxt/shared/select-bg.gif b/src/main/webapp/gxt/images/gxt/shared/select-bg.gif new file mode 100644 index 0000000..cbcf7e9 Binary files /dev/null and b/src/main/webapp/gxt/images/gxt/shared/select-bg.gif differ diff --git a/src/main/webapp/gxt/images/gxt/shared/select-light.gif b/src/main/webapp/gxt/images/gxt/shared/select-light.gif new file mode 100644 index 0000000..55b51da Binary files /dev/null and b/src/main/webapp/gxt/images/gxt/shared/select-light.gif differ diff --git a/src/main/webapp/gxt/images/gxt/table/row-over.gif b/src/main/webapp/gxt/images/gxt/table/row-over.gif new file mode 100644 index 0000000..b288e38 Binary files /dev/null and b/src/main/webapp/gxt/images/gxt/table/row-over.gif differ diff --git a/src/main/webapp/gxt/images/gxt/table/vs-column-bg.gif b/src/main/webapp/gxt/images/gxt/table/vs-column-bg.gif new file mode 100644 index 0000000..4025bce Binary files /dev/null and b/src/main/webapp/gxt/images/gxt/table/vs-column-bg.gif differ diff --git a/src/main/webapp/gxt/images/gxt/table/vsort-asc.gif b/src/main/webapp/gxt/images/gxt/table/vsort-asc.gif new file mode 100644 index 0000000..1981f08 Binary files /dev/null and b/src/main/webapp/gxt/images/gxt/table/vsort-asc.gif differ diff --git a/src/main/webapp/gxt/images/gxt/table/vsort-desc.gif b/src/main/webapp/gxt/images/gxt/table/vsort-desc.gif new file mode 100644 index 0000000..c2d7f59 Binary files /dev/null and b/src/main/webapp/gxt/images/gxt/table/vsort-desc.gif differ diff --git a/src/main/webapp/gxt/images/gxt/tree/checked.gif b/src/main/webapp/gxt/images/gxt/tree/checked.gif new file mode 100644 index 0000000..f00ec97 Binary files /dev/null and b/src/main/webapp/gxt/images/gxt/tree/checked.gif differ diff --git a/src/main/webapp/gxt/images/gxt/tree/joint-close.gif b/src/main/webapp/gxt/images/gxt/tree/joint-close.gif new file mode 100644 index 0000000..e34b5e4 Binary files /dev/null and b/src/main/webapp/gxt/images/gxt/tree/joint-close.gif differ diff --git a/src/main/webapp/gxt/images/gxt/tree/joint-open.gif b/src/main/webapp/gxt/images/gxt/tree/joint-open.gif new file mode 100644 index 0000000..87717af Binary files /dev/null and b/src/main/webapp/gxt/images/gxt/tree/joint-open.gif differ diff --git a/src/main/webapp/gxt/images/gxt/tree/notchecked.gif b/src/main/webapp/gxt/images/gxt/tree/notchecked.gif new file mode 100644 index 0000000..2b2ba4e Binary files /dev/null and b/src/main/webapp/gxt/images/gxt/tree/notchecked.gif differ diff --git a/src/main/webapp/gxt/images/gxt/tree/tree-table-special-col-sel.gif b/src/main/webapp/gxt/images/gxt/tree/tree-table-special-col-sel.gif new file mode 100644 index 0000000..ee8399e Binary files /dev/null and b/src/main/webapp/gxt/images/gxt/tree/tree-table-special-col-sel.gif differ diff --git a/src/main/webapp/gxt/images/gxt/tree/tree-table-special-col.gif b/src/main/webapp/gxt/images/gxt/tree/tree-table-special-col.gif new file mode 100644 index 0000000..fcc7f9e Binary files /dev/null and b/src/main/webapp/gxt/images/gxt/tree/tree-table-special-col.gif differ diff --git a/src/main/webapp/gxt/images/gxt/tree/vnode.gif b/src/main/webapp/gxt/images/gxt/tree/vnode.gif new file mode 100644 index 0000000..0f031bd Binary files /dev/null and b/src/main/webapp/gxt/images/gxt/tree/vnode.gif differ diff --git a/src/main/webapp/gxt/images/gxt/tree/vnode_transparent.gif b/src/main/webapp/gxt/images/gxt/tree/vnode_transparent.gif new file mode 100644 index 0000000..504e940 Binary files /dev/null and b/src/main/webapp/gxt/images/gxt/tree/vnode_transparent.gif differ diff --git a/src/main/webapp/gxt/themes/slate/css/xtheme-slate.css b/src/main/webapp/gxt/themes/slate/css/xtheme-slate.css new file mode 100644 index 0000000..1993b29 --- /dev/null +++ b/src/main/webapp/gxt/themes/slate/css/xtheme-slate.css @@ -0,0 +1,1008 @@ +/* + * Ext GWT Library 2.0 + * Copyright(c) 2006-2009, Ext JS, LLC. + * licensing@extjs.com + * + * http://extjs.com/license + */ +.x-panel { + border-style: solid; + border-color: #abc; +} + +.x-panel-header { + color: #fafafa; + border: 1px solid #abc; + background-image: url(../images/slate/panel/white-top-bottom.gif); +} + +.x-panel-body { + border-color: #abc; +} + +.x-panel-bbar .x-toolbar { + border-color: #abc; +} + +.x-panel-tbar .x-toolbar { + border-color: #abc; +} + +.x-panel-tbar-noheader .x-toolbar,.x-panel-mc .x-panel-tbar .x-toolbar { + border-color: #abc; +} + +.x-panel-body-noheader,.x-panel-mc .x-panel-body { + border-color: #abc; +} + +.x-panel-tl .x-panel-header { + color: #f4f4f4; +} + +.x-panel-tc { + background-image: url(../images/slate/panel/top-bottom.gif); +} + +.x-panel-tl { + background-image: url(../images/slate/panel/corners-sprite.gif); + border-color: #abc; +} + +.x-panel-tr { + background-image: url(../images/slate/panel/corners-sprite.gif); +} + +.x-panel-bc { + background-image: url(../images/slate/panel/top-bottom.gif); +} + +.x-panel-bl { + background-image: url(../images/slate/panel/corners-sprite.gif); +} + +.x-panel-br { + background-image: url(../images/slate/panel/corners-sprite.gif); +} + +.x-panel-mc { + background: #dde5e9; +} + +.x-panel-mc .x-panel-body { + background: transparent; + border: 0 none; +} + +.x-panel-ml { + background-image: url(../images/slate/panel/left-right.gif); +} + +.x-panel-mr { + background-image: url(../images/slate/panel/left-right.gif); +} + +.x-panel-dd-spacer { + border: 2px dashed #89a; +} + +.x-tool { + background-image: url(../images/slate/panel/tool-sprites.gif); +} + +.x-panel-ghost { + background: #e0e0e0; +} + +.x-panel-ghost ul { + border-color: #b0b0b0; +} + +.x-grid-panel .x-panel-mc .x-panel-body { + border: 1px solid #abc; +} + +.x-btn button { + color: #fff; +} + +.x-btn-over button { + color: #fff; +} + +.x-btn-focus button { + color: #fff8da; +} + +.x-btn-mc em.x-btn-arrow { + background-image: url(../images/slate/button/arrow.gif); +} + +.x-btn-mc em.x-btn-split { + background-image: url(../images/slate/button/s-arrow-b-noline.gif); +} + +.x-btn-over .x-btn-mc em.x-btn-split,.x-btn-click .x-btn-mc em.x-btn-split,.x-btn-menu-active .x-btn-mc em.x-btn-split,.x-btn-pressed .x-btn-mc em.x-btn-split { + background-image: url(../images/slate/button/s-arrow-o.gif); +} + +.x-btn-over .x-btn-mc em.x-btn-split,.x-btn-click .x-btn-mc em.x-btn-split,.x-btn-menu-active .x-btn-mc em.x-btn-split,.x-btn-pressed .x-btn-mc em.x-btn-split,.x-toolbar .x-btn-over .x-btn-mc em.x-btn-split,.x-toolbar .x-btn-click .x-btn-mc em.x-btn-split,.x-toolbar .x-btn-menu-active .x-btn-mc em.x-btn-split,.x-toolbar .x-btn-pressed .x-btn-mc em.x-btn-split + { + background-image: url(../images/slate/button/s-arrow-o.gif); +} + +.x-btn-mc em.x-btn-split-bottom { + background-image: url(../images/slate/button/s-arrow-b.gif); +} + +.x-btn-over .x-btn-mc em.x-btn-split-bottom,.x-btn-click .x-btn-mc em.x-btn-split-bottom,.x-btn-menu-active .x-btn-mc em.x-btn-split-bottom,.x-btn-pressed .x-btn-mc em.x-btn-split-bottom + { + background-image: url(../images/slate/button/s-arrow-bo.gif); +} + +.x-btn-group-header { + color: white !important; +} + +.x-btn-group-tc { + background-image: url(../images/slate/button/group-tb.gif); +} + +.x-btn-group-tl { + background-image: url(../images/slate/button/group-cs.gif); +} + +.x-btn-group-tr { + background-image: url(../images/slate/button/group-cs.gif); +} + +.x-btn-group-bc { + background-image: url(../images/slate/button/group-tb.gif); +} + +.x-btn-group-bl { + background-image: url(../images/slate/button/group-cs.gif); +} + +.x-btn-group-br { + background-image: url(../images/slate/button/group-cs.gif); +} + +.x-btn-group-ml { + background-image: url(../images/slate/button/group-lr.gif); +} + +.x-btn-group-mr { + background-image: url(../images/slate/button/group-lr.gif); +} + +.x-btn-group-notitle .x-btn-group-tc { + background-image: url(../images/slate/button/group-tb.gif); +} + +.x-border-layout-ct { + background: #f0f0f0; +} + +.x-accordion-hd { + background-image: url(../images/slate/panel/light-hd.gif); +} + +.x-layout-collapsed { + background-color: #567; + border-color: #e0e0e0; +} + +.x-layout-collapsed-over { + background-color: #789; +} + +.x-toolbar { + border-color: #abc; + background: #f0f4f5 url(../images/slate/toolbar/bg.gif) repeat-x top left; +} + +.x-toolbar button { + color: #f4f4f4; +} + +.x-toolbar .ytb-text { + color: #f4f4f4; +} + +.x-btn-tl,.x-btn-tr,.x-btn-tc,.x-btn-ml,.x-btn-mr,.x-btn-mc,.x-btn-bl,.x-btn-br,.x-btn-bc { + background-image: url(../images/slate/button/btn.gif); +} + +.x-btn-click .x-btn-text,.x-btn-menu-active .x-btn-text,.x-btn-pressed .x-btn-text { + color: white; +} + +.x-toolbar .x-btn-menu-arrow-wrap .x-btn-center button { + background-image: url(../images/slate/toolbar/btn-arrow.gif); +} + +.x-toolbar .x-btn-text-icon .x-btn-menu-arrow-wrap .x-btn-center button { + background-image: url(../images/slate/toolbar/btn-arrow.gif); +} + +.x-toolbar .x-btn-over .x-btn-left { + background-image: url(../images/slate/toolbar/tb-btn-sprite.gif); +} + +.x-toolbar .x-btn-over .x-btn-right { + background-image: url(../images/slate/toolbar/tb-btn-sprite.gif); +} + +.x-toolbar .x-btn-over .x-btn-center { + background-image: url(../images/slate/toolbar/tb-btn-sprite.gif); +} + +.x-toolbar .x-btn-over button { + color: #fff; +} + +.x-toolbar .x-btn-click .x-btn-left,.x-toolbar .x-btn-pressed .x-btn-left,.x-toolbar .x-btn-menu-active .x-btn-left { + background-image: url(../images/slate/toolbar/tb-btn-sprite.gif); +} + +.x-toolbar .x-btn-click .x-btn-right,.x-toolbar .x-btn-pressed .x-btn-right,.x-toolbar .x-btn-menu-active .x-btn-right { + background-image: url(../images/slate/toolbar/tb-btn-sprite.gif); +} + +.x-toolbar .x-btn-click .x-btn-center,.x-toolbar .x-btn-pressed .x-btn-center,.x-toolbar .x-btn-menu-active .x-btn-center + { + background-image: url(../images/slate/toolbar/tb-btn-sprite.gif); +} + +.x-toolbar .xtb-sep { + background-image: url(../images/slate/toolbar/sep.gif) !important; +} + +.x-statusbar .x-status-text-panel { + border-color: #9ab #9ab #9ab #9ab; +} + +.x-statusbar .x-status-text { + color: #ddc; +} + +.x-menu { + border: 1px solid #aaa; + background: #f0f0f0 url(../images/slate/menu/menu.gif) repeat-y; +} + +.x-menu-item-active { + background: #ebf3fd url(../images/slate/menu/item-over.gif) repeat-x left bottom; + border: 1px solid #c2cbd2; +} + +.x-menu-item-arrow { + background: transparent url(../images/slate/menu/menu-parent.gif) no-repeat right; +} + +.x-menu-check-item .x-menu-item-icon { + background: transparent url(../images/slate/menu/unchecked.gif) no-repeat center; +} + +.x-menu-item-checked .x-menu-item-icon { + background-image: url(../images/slate/menu/checked.gif); +} + +.x-menu-item-checked .x-menu-group-item .x-menu-item-icon { + background: transparent url(../images/slate/menu/group-checked.gif) +} + +.x-menu-group-item .x-menu-item-icon { + background: transparent none repeat scroll 0 0; +} + +.x-tab-panel-header,.x-tab-panel-footer { + background: #6b869f; + border-color: #4f657b; +} + +.x-tab-panel-header { + border-color: #abc; +} + +.x-tab-panel-footer { + border-color: #abc; +} + +ul.x-tab-strip-top { + background: #dbdbdb url(../images/slate/tabs/tab-strip-bg.gif) repeat-x left top; + border-color: #4c647e; + padding-top: 2px; +} + +ul.x-tab-strip-bottom { + background-image: url(../images/slate/tabs/tab-strip-btm-bg.gif); + border-color: #566c82; +} + +.x-tab-strip span.x-tab-strip-text { + color: #333; +} + +.x-tab-strip-over span.x-tab-strip-text { + color: #111; +} + +.x-tab-strip-active span.x-tab-strip-text { + color: #fff; +} + +.x-tab-strip-disabled .x-tabs-text { + color: #aaaaaa; +} + +.x-tab-strip-top .x-tab-right { + background-image: url(../images/slate/tabs/tabs-sprite.gif); +} + +.x-tab-strip-top .x-tab-left { + background-image: url(../images/slate/tabs/tabs-sprite.gif); +} + +.x-tab-strip-top .x-tab-strip-inner { + background-image: url(../images/slate/tabs/tabs-sprite.gif); +} + +.x-tab-strip-bottom .x-tab-right { + background-image: url(../images/slate/tabs/tab-btm-inactive-right-bg.gif); +} + +.x-tab-strip-bottom .x-tab-left { + background-image: url(../images/slate/tabs/tab-btm-inactive-left-bg.gif); +} + +.x-tab-strip-bottom .x-tab-strip-active .x-tab-right { + background-image: url(../images/slate/tabs/tab-btm-right-bg.gif); +} + +.x-tab-strip-bottom .x-tab-strip-active .x-tab-left { + background-image: url(../images/slate/tabs/tab-btm-left-bg.gif); +} + +.x-tab-strip .x-tab-strip-closable a.x-tab-strip-close { + background-image: url(../images/slate/tabs/tab-close.gif); +} + +.x-tab-strip .x-tab-strip-closable a.x-tab-strip-close:hover { + background-image: url(../images/slate/tabs/tab-close.gif); +} + +.x-tab-panel-body { + border-color: #abc; + background: #fff; +} + +.x-tab-panel-bbar .x-toolbar { + border-color: #abc; +} + +.x-tab-panel-tbar .x-toolbar { + border-color: #abc; +} + +.x-tab-panel-header-plain .x-tab-strip-spacer,.x-tab-panel-footer-plain .x-tab-strip-spacer { + border-color: #abc; + background: #6b869f; +} + +.x-tab-scroller-left { + background-image: url(../images/slate/tabs/scroll-left.gif); + border-color: #aeaeae; +} + +.x-tab-scroller-right { + background-image: url(../images/slate/tabs/scroll-right.gif); + border-color: #aeaeae; +} + +.x-window-proxy { + background: #e4e8ec; + border-color: #abc; +} + +.x-window-tl .x-window-header { + color: #fafafa; +} + +.x-window-tc { + background-image: url(../images/slate/window/top-bottom.png); +} + +.x-window-tl { + background-image: url(../images/slate/window/left-corners.png); +} + +.x-window-tr { + background-image: url(../images/slate/window/right-corners.png); +} + +.x-window-bc { + background-image: url(../images/slate/window/top-bottom.png); +} + +.x-window-bl { + background-image: url(../images/slate/window/left-corners.png); +} + +.x-window-br { + background-image: url(../images/slate/window/right-corners.png); +} + +.x-window-mc { + border: 1px solid #abc; + background: #e8e8e8; +} + +.x-window-ml { + background-image: url(../images/slate/window/left-right.png); +} + +.x-window-mr { + background-image: url(../images/slate/window/left-right.png); +} + +.x-panel-ghost .x-window-tl { + border-color: #abc; +} + +.x-panel-collapsed .x-window-tl { + border-color: #abc; +} + +.x-window-plain .x-window-mc { + background: #e8e8e8; + border-right: 1px solid #eee; + border-bottom: 1px solid #eee; + border-top: 1px solid #abc; + border-left: 1px solid #abc; +} + +.x-window-plain .x-window-body { + border-left: 1px solid #ddd; + border-top: 1px solid #ddd; + border-bottom: 1px solid #abc; + border-right: 1px solid #abc; + background: transparent !important; +} + +body.x-body-masked .x-window-mc,body.x-body-masked .x-window-plain .x-window-mc { + background-color: #eceef0; +} + +/* HTML Editors */ +.x-html-editor-wrap { + border-color: #abc; +} + +/* Borders go last for specificity */ +.x-panel-noborder .x-panel-body-noborder { + border-width: 0; +} + +.x-panel-noborder .x-panel-header-noborder { + border-width: 0; + border-bottom: 1px solid #abc; +} + +.x-panel-noborder .x-panel-tbar-noborder .x-toolbar { + border-width: 0; + border-bottom: 1px solid #abc; +} + +.x-panel-noborder .x-panel-bbar-noborder .x-toolbar { + border-width: 0; + border-top: 1px solid #abc; +} + +.x-window-noborder .x-window-mc { + border-width: 0; +} + +.x-window-plain .x-window-body-noborder { + border-width: 0; +} + +.x-tab-panel-noborder .x-tab-panel-body-noborder { + border-width: 0; +} + +.x-tab-panel-noborder .x-tab-panel-header-noborder { + border-top-width: 0; + border-left-width: 0; + border-right-width: 0; +} + +.x-tab-panel-noborder .x-tab-panel-footer-noborder { + border-bottom-width: 0; + border-left-width: 0; + border-right-width: 0; +} + +.x-tab-panel-bbar-noborder .x-toolbar { + border-width: 0; + border-top: 1px solid #abc; +} + +.x-tab-panel-tbar-noborder .x-toolbar { + border-width: 0; + border-bottom: 1px solid #abc; +} + +/* Forms */ +.x-form-text,textarea.x-form-field { + border: 1px solid #9ab; +} + +.x-trigger-wrap-focus .x-form-trigger { + border-bottom: 1px solid #4a7192; +} + +.x-form-focus,textarea.x-form-focus { + border: 1px solid #4a7192; +} + +.x-form-field-wrap .x-form-trigger { + background: transparent url(../images/slate/form/trigger.gif) no-repeat 0 0; +} + +.x-form-field-wrap .x-form-date-trigger { + background-image: url(../images/slate/form/date-trigger.gif); +} + +.x-form-field-wrap .x-form-clear-trigger { + background-image: url(../images/slate/form/clear-trigger.gif); +} + +.x-form-field-wrap .x-form-search-trigger { + background-image: url(../images/slate/form/search-trigger.gif); +} + +.x-form-field-wrap .x-form-trigger { + border-bottom: 1px solid #778899; +} + +.x-form-field-wrap .x-form-trigger-over { + background-position: -17px 0; +} + +.x-form-field-wrap .x-form-trigger-click { + background-position: -34px 0; +} + +.x-trigger-wrap-focus .x-form-trigger { + background-position: -51px 0; +} + +.x-trigger-wrap-focus .x-form-trigger-over { + background-position: -68px 0; +} + +.x-trigger-wrap-focus .x-form-trigger-click { + background-position: -85px 0; +} + +.x-form fieldset legend { + color: #333; +} + +/* Checkboxes & Radio Buttons */ +.x-form-check { + background: url('../images/slate/form/checkbox.gif') no-repeat 0 0; +} + +.x-form-radio { + background: url('../images/slate/form/radio.gif') no-repeat 0 0; +} + +.x-form-check-group-label { + border-bottom: 1px solid #99BBE8; + color: #15428B; + margin-bottom: 5px; + padding-left: 3px !important; + float: none !important; +} + +/* Grid */ +.x-grid3-row-selected { + background: #fbf0d2 !important; + border: 1px dotted #ccc; +} + +.x-grid3-hd-btn { + background: #f2daa9 url(../images/slate/grid/grid3-hd-btn.gif) no-repeat left center; +} + +.x-grid3-header { + background: #f9f9f9 url(../images/slate/grid/grid3-hrow.gif) repeat-x 0 bottom; +} + +td.x-grid3-hd-over .x-grid3-hd-inner,td.sort-desc .x-grid3-hd-inner,td.sort-asc .x-grid3-hd-inner,td.x-grid3-hd-menu-open .x-grid3-hd-inner + { + background: #ebf3fd url(../images/slate/grid/grid3-hrow-over.gif) repeat-x left bottom; +} + +.sort-asc .x-grid3-sort-icon { + background-image: url(../images/slate/grid/sort_asc.gif); +} + +.sort-desc .x-grid3-sort-icon { + background-image: url(../images/slate/grid/sort_desc.gif); +} + +td.x-grid3-hd-over,td.sort-desc,td.sort-asc,td.x-grid3-hd-menu-open { + border-left: 1px solid #fff; + border-right: 1px solid #ccc; +} + +.x-grid3-check-col { + background-image: url(../images/slate/menu/unchecked.gif); +} + +.x-grid3-check-col-on { + background-image: url(../images/slate/menu/checked.gif); +} + +.x-grid3-cell-selected { + background-color: #e0eaee !important; +} + +.x-grid3-body .x-grid3-td-expander { + background: transparent url(../images/slate/grid/grid3-special-col-bg.gif) repeat-y right; +} + +.x-grid3-body .x-grid3-td-checker { + background: transparent url(../images/slate/grid/grid3-special-col-bg.gif) repeat-y right; +} + +.x-grid3-body .x-grid3-td-numberer { + background: transparent url(../images/slate/grid/grid3-special-col-bg.gif) repeat-y right; +} + +.x-grid3-body .x-grid3-row-selected .x-grid3-td-numberer,.x-grid3-body .x-grid3-row-selected .x-grid3-td-checker,.x-grid3-body .x-grid3-row-selected .x-grid3-td-expander + { + background: transparent url(../images/slate/grid/grid3-special-col-sel-bg.gif) repeat-y right; +} + +.x-grid-group-hd { + border-bottom: 2px solid #abb; +} + +.x-grid-group-hd div { + color: #456; +} + +.x-dd-drag-proxy .x-grid3-hd-inner { + background: #ebf3fd url(../images/slate/grid/grid3-hrow-over.gif) repeat-x left bottom; + border: 1px solid #abc; +} + +.x-tbar-page-first { + background-image: url(../images/slate/grid/page-first.gif) !important; +} + +.x-tbar-page-last { + background-image: url(../images/slate/grid/page-last.gif) !important; +} + +.x-tbar-page-next { + background-image: url(../images/slate/grid/page-next.gif) !important; +} + +.x-tbar-page-prev { + background-image: url(../images/slate/grid/page-prev.gif) !important; +} + +.x-paging-info { + color: #FFFFFF; +} + +/* Progress Bars */ +.x-progress-bar { + background: #9CBFEE url(../images/slate/progress/progress-bg.gif) repeat-x left center; + border-top: 1px solid #ddd; + border-bottom: 1px solid #ddd; +} + +.x-progress-inner { + background: #E0E8F3 url(../images/slate/qtip/bg.gif) repeat-x scroll 0 0; +} + +.x-progress-text { + color: #789; +} + +.x-progress-text-back { + color: #789; +} + +.x-progress-wrap { + border: 1px solid #b0b8c4; +} + +/* Combos */ +.x-combo-list { + border: 1px solid #89a; +} + +.x-combo-list .x-combo-selected { + border: 1px dotted #ccc !important; + background: #fbf0d2; +} + +/* Calendars */ +.x-date-middle,.x-date-left,.x-date-right { + background: url(../images/slate/shared/hd-sprite.gif) repeat-x 0 -83px; +} + +.x-date-right a { + background-image: url(../images/slate/shared/right-btn.gif); +} + +.x-date-left a { + background-image: url(../images/slate/shared/left-btn.gif); +} + +.x-date-bottom { + background: #DFECFB url(../images/slate/shared/glass-bg.gif) repeat-x scroll left top; + border-top: 1px solid #abc; +} + +.x-date-right-icon { + background-image: url(../images/slate/shared/right-btn.gif); +} + +.x-date-left-icon { + background-image: url(../images/slate/shared/left-btn.gif); +} + +.x-date-inner th { + background: #dfecfb url(../images/slate/shared/glass-bg.gif) repeat-x left top; + border-bottom: 1px solid #abc; + color: #345; +} + +.x-date-inner .x-date-selected a { + background: #dfecfb url(../images/slate/shared/glass-bg.gif) repeat-x scroll left top; + border: 1px solid #89a; +} + +.x-date-inner a:hover,.x-date-inner .x-date-disabled a:hover { + background: #faedc0; +} + +td.x-date-mp-month a:hover,td.x-date-mp-year a:hover { + color: #123; + background: #faedc0; +} + +.x-date-mp-ybtn a { + background: transparent url(../images/slate/panel/tool-sprites.gif) no-repeat; +} + +.x-date-mp-btns { + background: #dfecfb url(../images/slate/shared/glass-bg.gif) repeat-x scroll left top; +} + +td.x-date-mp-sel a { + background: #dfecfb url(../images/slate/shared/glass-bg.gif) repeat-x left top; + border: 1px solid #abc; +} + +.x-date-mp-btns button { + background: #405574; + border: 1px solid; + border-color: #abc #055 #055 #abc; +} + +.x-resizable-over .x-resizable-handle-east,.x-resizable-pinned .x-resizable-handle-east { + background: url(../images/slate/sizer/e-handle.gif); + background-position: left; +} + +.x-resizable-over .x-resizable-handle-west,.x-resizable-pinned .x-resizable-handle-west { + background: url(../images/slate/sizer/e-handle.gif); + background-position: left; +} + +.x-resizable-over .x-resizable-handle-south,.x-resizable-pinned .x-resizable-handle-south { + background: url(../images/slate/sizer/s-handle.gif); + background-position: top; +} + +.x-resizable-over .x-resizable-handle-north,.x-resizable-pinned .x-resizable-handle-north { + background: url(../images/slate/sizer/s-handle.gif); + background-position: top; +} + +.x-resizable-over .x-resizable-handle-southeast,.x-resizable-pinned .x-resizable-handle-southeast { + background: url(../images/slate/sizer/se-handle.gif); + background-position: top left; +} + +.x-resizable-over .x-resizable-handle-northwest,.x-resizable-pinned .x-resizable-handle-northwest { + background: url(../images/slate/sizer/nw-handle.gif); + background-position: bottom right; +} + +.x-resizable-over .x-resizable-handle-northeast,.x-resizable-pinned .x-resizable-handle-northeast { + background: url(../images/slate/sizer/ne-handle.gif); + background-position: bottom left; +} + +.x-resizable-over .x-resizable-handle-southwest,.x-resizable-pinned .x-resizable-handle-southwest { + background: url(../images/slate/sizer/sw-handle.gif); + background-position: top right; +} + +.x-tip .x-tip-close { + background-image: url(../images/slate/qtip/close.gif); +} + +.x-tip .x-tip-tc { + background: transparent url(../images/slate/qtip/tip-sprite.gif) no-repeat 0 -62px; +} + +.x-tip .x-tip-tl { + background: transparent url(../images/slate/qtip/tip-sprite.gif) no-repeat 0 0; +} + +.x-tip .x-tip-tr { + background: transparent url(../images/slate/qtip/tip-sprite.gif) no-repeat right 0; +} + +.x-tip .x-tip-bc { + background: transparent url(../images/slate/qtip/tip-sprite.gif) no-repeat 0 -121px; +} + +.x-tip .x-tip-bl { + background: transparent url(../images/slate/qtip/tip-sprite.gif) no-repeat 0 -59px; +} + +.x-tip .x-tip-br { + background: transparent url(../images/slate/qtip/tip-sprite.gif) no-repeat right -59px; +} + +.x-tip .x-tip-ml { + background: #fff url(../images/slate/qtip/tip-sprite.gif) no-repeat 0 -124px; +} + +.x-tip .x-tip-mr { + background: transparent url(../images/slate/qtip/tip-sprite.gif) no-repeat right -124px; +} + +.x-form-invalid-tip .x-tip-tc { + background: url(../images/default/form/error-tip-corners.gif) repeat-x 0 -12px; + padding-top: 6px; +} + +.x-form-invalid-tip .x-tip-tl { + background-image: url(../images/default/form/error-tip-corners.gif); +} + +.x-form-invalid-tip .x-tip-tr { + background-image: url(../images/default/form/error-tip-corners.gif); +} + +.x-form-invalid-tip .x-tip-bc { + background: url(../images/default/form/error-tip-corners.gif) repeat-x 0 -18px; + height: 6px; +} + +.x-form-invalid-tip .x-tip-bl { + background: url(../images/default/form/error-tip-corners.gif) no-repeat 0 -6px; +} + +.x-form-invalid-tip .x-tip-br { + background: url(../images/default/form/error-tip-corners.gif) no-repeat right -6px; +} + +.x-form-invalid-tip .x-tip-ml { + background-image: url(../images/default/form/error-tip-corners.gif); +} + +.x-form-invalid-tip .x-tip-mr { + background-image: url(../images/default/form/error-tip-corners.gif); +} + +.x-tree-node .x-tree-selected { + background-color: #f2daa9; +} + +.x-tree-node .x-tree-selected a span { + background-color: #f2daa9; + color: black; +} + +.x-ftree2-selected { + background-color: #FBF0D2 !important; +} + +.x-tree-arrows .x-tree-elbow-plus { + background: transparent url(../images/slate/tree/arrows.gif) no-repeat 0 0; +} + +.x-tree-arrows .x-tree-elbow-minus { + background: transparent url(../images/slate/tree/arrows.gif) no-repeat -16px 0; +} + +.x-tree-arrows .x-tree-elbow-end-plus { + background: transparent url(../images/slate/tree/arrows.gif) no-repeat 0 0; +} + +.x-tree-arrows .x-tree-elbow-end-minus { + background: transparent url(../images/slate/tree/arrows.gif) no-repeat -16px 0; +} + +.x-slider-horz .x-slider-thumb { + background: transparent url(../images/slate/slider/slider-thumb.png) no-repeat 0 0; +} + +.x-slider-vert .x-slider-thumb { + background: transparent url(../images/slate/slider/slider-v-thumb.png) no-repeat 0 0; +} + +.x-slider-horz .x-slider-thumb-over { + background-position: -14px -15px; +} + +.x-slider-horz .x-slider-thumb-drag { + background-position: -28px -30px; +} + +.x-slider-vert .x-slider-thumb-over { + background-position: -15px -14px; +} + +.x-slider-vert .x-slider-thumb-drag { + background-position: -30px -28px; +} + +.x-slider-horz { + background: transparent url(../images/slate/slider/slider-bg.png) no-repeat 0 -22px; +} + +.x-slider-horz .x-slider-end { + background: transparent url(../images/slate/slider/slider-bg.png) no-repeat right -44px; +} + +.x-slider-horz .x-slider-inner { + background: transparent url(../images/slate/slider/slider-bg.png) repeat-x 0 0; +} + +.x-slider-vert { + background: transparent url(../images/slate/slider/slider-v-bg.png) no-repeat -44px 0; +} + +.x-slider-vert .x-slider-end { + background: transparent url(../images/slate/slider/slider-v-bg.png) no-repeat -22px bottom; +} + +.x-slider-vert .x-slider-inner { + background: transparent url(../images/slate/slider/slider-v-bg.png) repeat-y 0 0; +} + +.x-item-disabled * { + color: #333 !important; +} + +.x-form-check { + background: none; + ! + important +} + +.x-form-radio { + background: none; + ! + important +} + +.x-border { + border: 1px solid #AABBCC; +} \ No newline at end of file diff --git a/src/main/webapp/gxt/themes/slate/images/slate/button/arrow.gif b/src/main/webapp/gxt/themes/slate/images/slate/button/arrow.gif new file mode 100644 index 0000000..1052a42 Binary files /dev/null and b/src/main/webapp/gxt/themes/slate/images/slate/button/arrow.gif differ diff --git a/src/main/webapp/gxt/themes/slate/images/slate/button/btn-arrow.gif b/src/main/webapp/gxt/themes/slate/images/slate/button/btn-arrow.gif new file mode 100644 index 0000000..eb2ef99 Binary files /dev/null and b/src/main/webapp/gxt/themes/slate/images/slate/button/btn-arrow.gif differ diff --git a/src/main/webapp/gxt/themes/slate/images/slate/button/btn-sprite.gif b/src/main/webapp/gxt/themes/slate/images/slate/button/btn-sprite.gif new file mode 100644 index 0000000..7247b55 Binary files /dev/null and b/src/main/webapp/gxt/themes/slate/images/slate/button/btn-sprite.gif differ diff --git a/src/main/webapp/gxt/themes/slate/images/slate/button/btn.gif b/src/main/webapp/gxt/themes/slate/images/slate/button/btn.gif new file mode 100644 index 0000000..cc581a9 Binary files /dev/null and b/src/main/webapp/gxt/themes/slate/images/slate/button/btn.gif differ diff --git a/src/main/webapp/gxt/themes/slate/images/slate/button/group-cs.gif b/src/main/webapp/gxt/themes/slate/images/slate/button/group-cs.gif new file mode 100644 index 0000000..9638066 Binary files /dev/null and b/src/main/webapp/gxt/themes/slate/images/slate/button/group-cs.gif differ diff --git a/src/main/webapp/gxt/themes/slate/images/slate/button/group-lr.gif b/src/main/webapp/gxt/themes/slate/images/slate/button/group-lr.gif new file mode 100644 index 0000000..4c5c5b9 Binary files /dev/null and b/src/main/webapp/gxt/themes/slate/images/slate/button/group-lr.gif differ diff --git a/src/main/webapp/gxt/themes/slate/images/slate/button/group-tb.gif b/src/main/webapp/gxt/themes/slate/images/slate/button/group-tb.gif new file mode 100644 index 0000000..be9d5a0 Binary files /dev/null and b/src/main/webapp/gxt/themes/slate/images/slate/button/group-tb.gif differ diff --git a/src/main/webapp/gxt/themes/slate/images/slate/button/s-arrow-b.gif b/src/main/webapp/gxt/themes/slate/images/slate/button/s-arrow-b.gif new file mode 100644 index 0000000..f168b58 Binary files /dev/null and b/src/main/webapp/gxt/themes/slate/images/slate/button/s-arrow-b.gif differ diff --git a/src/main/webapp/gxt/themes/slate/images/slate/button/s-arrow-bo.gif b/src/main/webapp/gxt/themes/slate/images/slate/button/s-arrow-bo.gif new file mode 100644 index 0000000..f168b58 Binary files /dev/null and b/src/main/webapp/gxt/themes/slate/images/slate/button/s-arrow-bo.gif differ diff --git a/src/main/webapp/gxt/themes/slate/images/slate/button/s-arrow-noline.gif b/src/main/webapp/gxt/themes/slate/images/slate/button/s-arrow-noline.gif new file mode 100644 index 0000000..24b0108 Binary files /dev/null and b/src/main/webapp/gxt/themes/slate/images/slate/button/s-arrow-noline.gif differ diff --git a/src/main/webapp/gxt/themes/slate/images/slate/button/s-arrow-o.gif b/src/main/webapp/gxt/themes/slate/images/slate/button/s-arrow-o.gif new file mode 100644 index 0000000..546f5cc Binary files /dev/null and b/src/main/webapp/gxt/themes/slate/images/slate/button/s-arrow-o.gif differ diff --git a/src/main/webapp/gxt/themes/slate/images/slate/button/s-arrow.gif b/src/main/webapp/gxt/themes/slate/images/slate/button/s-arrow.gif new file mode 100644 index 0000000..546f5cc Binary files /dev/null and b/src/main/webapp/gxt/themes/slate/images/slate/button/s-arrow.gif differ diff --git a/src/main/webapp/gxt/themes/slate/images/slate/editor/tb-sprite.gif b/src/main/webapp/gxt/themes/slate/images/slate/editor/tb-sprite.gif new file mode 100644 index 0000000..bd4011d Binary files /dev/null and b/src/main/webapp/gxt/themes/slate/images/slate/editor/tb-sprite.gif differ diff --git a/src/main/webapp/gxt/themes/slate/images/slate/form/checkbox.gif b/src/main/webapp/gxt/themes/slate/images/slate/form/checkbox.gif new file mode 100644 index 0000000..ac8bc51 Binary files /dev/null and b/src/main/webapp/gxt/themes/slate/images/slate/form/checkbox.gif differ diff --git a/src/main/webapp/gxt/themes/slate/images/slate/form/clear-trigger.gif b/src/main/webapp/gxt/themes/slate/images/slate/form/clear-trigger.gif new file mode 100644 index 0000000..0ae9d06 Binary files /dev/null and b/src/main/webapp/gxt/themes/slate/images/slate/form/clear-trigger.gif differ diff --git a/src/main/webapp/gxt/themes/slate/images/slate/form/date-trigger.gif b/src/main/webapp/gxt/themes/slate/images/slate/form/date-trigger.gif new file mode 100644 index 0000000..5da5850 Binary files /dev/null and b/src/main/webapp/gxt/themes/slate/images/slate/form/date-trigger.gif differ diff --git a/src/main/webapp/gxt/themes/slate/images/slate/form/radio.gif b/src/main/webapp/gxt/themes/slate/images/slate/form/radio.gif new file mode 100644 index 0000000..11a90f2 Binary files /dev/null and b/src/main/webapp/gxt/themes/slate/images/slate/form/radio.gif differ diff --git a/src/main/webapp/gxt/themes/slate/images/slate/form/search-trigger.gif b/src/main/webapp/gxt/themes/slate/images/slate/form/search-trigger.gif new file mode 100644 index 0000000..61e7d98 Binary files /dev/null and b/src/main/webapp/gxt/themes/slate/images/slate/form/search-trigger.gif differ diff --git a/src/main/webapp/gxt/themes/slate/images/slate/form/trigger-tpl.gif b/src/main/webapp/gxt/themes/slate/images/slate/form/trigger-tpl.gif new file mode 100644 index 0000000..df1ea98 Binary files /dev/null and b/src/main/webapp/gxt/themes/slate/images/slate/form/trigger-tpl.gif differ diff --git a/src/main/webapp/gxt/themes/slate/images/slate/form/trigger.gif b/src/main/webapp/gxt/themes/slate/images/slate/form/trigger.gif new file mode 100644 index 0000000..d2db1bd Binary files /dev/null and b/src/main/webapp/gxt/themes/slate/images/slate/form/trigger.gif differ diff --git a/src/main/webapp/gxt/themes/slate/images/slate/gradient-bg.gif b/src/main/webapp/gxt/themes/slate/images/slate/gradient-bg.gif new file mode 100644 index 0000000..8134e49 Binary files /dev/null and b/src/main/webapp/gxt/themes/slate/images/slate/gradient-bg.gif differ diff --git a/src/main/webapp/gxt/themes/slate/images/slate/grid/arrow-left-white.gif b/src/main/webapp/gxt/themes/slate/images/slate/grid/arrow-left-white.gif new file mode 100644 index 0000000..63088f5 Binary files /dev/null and b/src/main/webapp/gxt/themes/slate/images/slate/grid/arrow-left-white.gif differ diff --git a/src/main/webapp/gxt/themes/slate/images/slate/grid/arrow-right-white.gif b/src/main/webapp/gxt/themes/slate/images/slate/grid/arrow-right-white.gif new file mode 100644 index 0000000..e9e0678 Binary files /dev/null and b/src/main/webapp/gxt/themes/slate/images/slate/grid/arrow-right-white.gif differ diff --git a/src/main/webapp/gxt/themes/slate/images/slate/grid/col-move-bottom.gif b/src/main/webapp/gxt/themes/slate/images/slate/grid/col-move-bottom.gif new file mode 100644 index 0000000..cc1e473 Binary files /dev/null and b/src/main/webapp/gxt/themes/slate/images/slate/grid/col-move-bottom.gif differ diff --git a/src/main/webapp/gxt/themes/slate/images/slate/grid/col-move-top.gif b/src/main/webapp/gxt/themes/slate/images/slate/grid/col-move-top.gif new file mode 100644 index 0000000..58ff32c Binary files /dev/null and b/src/main/webapp/gxt/themes/slate/images/slate/grid/col-move-top.gif differ diff --git a/src/main/webapp/gxt/themes/slate/images/slate/grid/footer-bg.gif b/src/main/webapp/gxt/themes/slate/images/slate/grid/footer-bg.gif new file mode 100644 index 0000000..126120f Binary files /dev/null and b/src/main/webapp/gxt/themes/slate/images/slate/grid/footer-bg.gif differ diff --git a/src/main/webapp/gxt/themes/slate/images/slate/grid/grid-blue-hd.gif b/src/main/webapp/gxt/themes/slate/images/slate/grid/grid-blue-hd.gif new file mode 100644 index 0000000..862094e Binary files /dev/null and b/src/main/webapp/gxt/themes/slate/images/slate/grid/grid-blue-hd.gif differ diff --git a/src/main/webapp/gxt/themes/slate/images/slate/grid/grid-blue-split.gif b/src/main/webapp/gxt/themes/slate/images/slate/grid/grid-blue-split.gif new file mode 100644 index 0000000..5286f58 Binary files /dev/null and b/src/main/webapp/gxt/themes/slate/images/slate/grid/grid-blue-split.gif differ diff --git a/src/main/webapp/gxt/themes/slate/images/slate/grid/grid-hrow.gif b/src/main/webapp/gxt/themes/slate/images/slate/grid/grid-hrow.gif new file mode 100644 index 0000000..6374104 Binary files /dev/null and b/src/main/webapp/gxt/themes/slate/images/slate/grid/grid-hrow.gif differ diff --git a/src/main/webapp/gxt/themes/slate/images/slate/grid/grid-split.gif b/src/main/webapp/gxt/themes/slate/images/slate/grid/grid-split.gif new file mode 100644 index 0000000..2d27001 Binary files /dev/null and b/src/main/webapp/gxt/themes/slate/images/slate/grid/grid-split.gif differ diff --git a/src/main/webapp/gxt/themes/slate/images/slate/grid/grid-vista-hd.gif b/src/main/webapp/gxt/themes/slate/images/slate/grid/grid-vista-hd.gif new file mode 100644 index 0000000..d097263 Binary files /dev/null and b/src/main/webapp/gxt/themes/slate/images/slate/grid/grid-vista-hd.gif differ diff --git a/src/main/webapp/gxt/themes/slate/images/slate/grid/grid3-hd-btn.gif b/src/main/webapp/gxt/themes/slate/images/slate/grid/grid3-hd-btn.gif new file mode 100644 index 0000000..fb1e5fb Binary files /dev/null and b/src/main/webapp/gxt/themes/slate/images/slate/grid/grid3-hd-btn.gif differ diff --git a/src/main/webapp/gxt/themes/slate/images/slate/grid/grid3-hrow-over.gif b/src/main/webapp/gxt/themes/slate/images/slate/grid/grid3-hrow-over.gif new file mode 100644 index 0000000..bdb4095 Binary files /dev/null and b/src/main/webapp/gxt/themes/slate/images/slate/grid/grid3-hrow-over.gif differ diff --git a/src/main/webapp/gxt/themes/slate/images/slate/grid/grid3-hrow.gif b/src/main/webapp/gxt/themes/slate/images/slate/grid/grid3-hrow.gif new file mode 100644 index 0000000..e72e221 Binary files /dev/null and b/src/main/webapp/gxt/themes/slate/images/slate/grid/grid3-hrow.gif differ diff --git a/src/main/webapp/gxt/themes/slate/images/slate/grid/grid3-special-col-bg.gif b/src/main/webapp/gxt/themes/slate/images/slate/grid/grid3-special-col-bg.gif new file mode 100644 index 0000000..a1481dc Binary files /dev/null and b/src/main/webapp/gxt/themes/slate/images/slate/grid/grid3-special-col-bg.gif differ diff --git a/src/main/webapp/gxt/themes/slate/images/slate/grid/grid3-special-col-sel-bg.gif b/src/main/webapp/gxt/themes/slate/images/slate/grid/grid3-special-col-sel-bg.gif new file mode 100644 index 0000000..34b242d Binary files /dev/null and b/src/main/webapp/gxt/themes/slate/images/slate/grid/grid3-special-col-sel-bg.gif differ diff --git a/src/main/webapp/gxt/themes/slate/images/slate/grid/group-expand-sprite.gif b/src/main/webapp/gxt/themes/slate/images/slate/grid/group-expand-sprite.gif new file mode 100644 index 0000000..9c1653b Binary files /dev/null and b/src/main/webapp/gxt/themes/slate/images/slate/grid/group-expand-sprite.gif differ diff --git a/src/main/webapp/gxt/themes/slate/images/slate/grid/mso-hd.gif b/src/main/webapp/gxt/themes/slate/images/slate/grid/mso-hd.gif new file mode 100644 index 0000000..669f3cf Binary files /dev/null and b/src/main/webapp/gxt/themes/slate/images/slate/grid/mso-hd.gif differ diff --git a/src/main/webapp/gxt/themes/slate/images/slate/grid/page-first-disabled.gif b/src/main/webapp/gxt/themes/slate/images/slate/grid/page-first-disabled.gif new file mode 100644 index 0000000..1eddc0b Binary files /dev/null and b/src/main/webapp/gxt/themes/slate/images/slate/grid/page-first-disabled.gif differ diff --git a/src/main/webapp/gxt/themes/slate/images/slate/grid/page-first.gif b/src/main/webapp/gxt/themes/slate/images/slate/grid/page-first.gif new file mode 100644 index 0000000..0cfc2f3 Binary files /dev/null and b/src/main/webapp/gxt/themes/slate/images/slate/grid/page-first.gif differ diff --git a/src/main/webapp/gxt/themes/slate/images/slate/grid/page-last-disabled.gif b/src/main/webapp/gxt/themes/slate/images/slate/grid/page-last-disabled.gif new file mode 100644 index 0000000..29881be Binary files /dev/null and b/src/main/webapp/gxt/themes/slate/images/slate/grid/page-last-disabled.gif differ diff --git a/src/main/webapp/gxt/themes/slate/images/slate/grid/page-last.gif b/src/main/webapp/gxt/themes/slate/images/slate/grid/page-last.gif new file mode 100644 index 0000000..de01053 Binary files /dev/null and b/src/main/webapp/gxt/themes/slate/images/slate/grid/page-last.gif differ diff --git a/src/main/webapp/gxt/themes/slate/images/slate/grid/page-next-disabled.gif b/src/main/webapp/gxt/themes/slate/images/slate/grid/page-next-disabled.gif new file mode 100644 index 0000000..90a7756 Binary files /dev/null and b/src/main/webapp/gxt/themes/slate/images/slate/grid/page-next-disabled.gif differ diff --git a/src/main/webapp/gxt/themes/slate/images/slate/grid/page-next.gif b/src/main/webapp/gxt/themes/slate/images/slate/grid/page-next.gif new file mode 100644 index 0000000..39986b7 Binary files /dev/null and b/src/main/webapp/gxt/themes/slate/images/slate/grid/page-next.gif differ diff --git a/src/main/webapp/gxt/themes/slate/images/slate/grid/page-prev-disabled.gif b/src/main/webapp/gxt/themes/slate/images/slate/grid/page-prev-disabled.gif new file mode 100644 index 0000000..37154d6 Binary files /dev/null and b/src/main/webapp/gxt/themes/slate/images/slate/grid/page-prev-disabled.gif differ diff --git a/src/main/webapp/gxt/themes/slate/images/slate/grid/page-prev.gif b/src/main/webapp/gxt/themes/slate/images/slate/grid/page-prev.gif new file mode 100644 index 0000000..02f24a8 Binary files /dev/null and b/src/main/webapp/gxt/themes/slate/images/slate/grid/page-prev.gif differ diff --git a/src/main/webapp/gxt/themes/slate/images/slate/grid/refresh.gif b/src/main/webapp/gxt/themes/slate/images/slate/grid/refresh.gif new file mode 100644 index 0000000..c622b5d Binary files /dev/null and b/src/main/webapp/gxt/themes/slate/images/slate/grid/refresh.gif differ diff --git a/src/main/webapp/gxt/themes/slate/images/slate/grid/row-over.gif b/src/main/webapp/gxt/themes/slate/images/slate/grid/row-over.gif new file mode 100644 index 0000000..b288e38 Binary files /dev/null and b/src/main/webapp/gxt/themes/slate/images/slate/grid/row-over.gif differ diff --git a/src/main/webapp/gxt/themes/slate/images/slate/grid/row-sel.gif b/src/main/webapp/gxt/themes/slate/images/slate/grid/row-sel.gif new file mode 100644 index 0000000..98209e6 Binary files /dev/null and b/src/main/webapp/gxt/themes/slate/images/slate/grid/row-sel.gif differ diff --git a/src/main/webapp/gxt/themes/slate/images/slate/grid/sort_asc.gif b/src/main/webapp/gxt/themes/slate/images/slate/grid/sort_asc.gif new file mode 100644 index 0000000..c4c6adb Binary files /dev/null and b/src/main/webapp/gxt/themes/slate/images/slate/grid/sort_asc.gif differ diff --git a/src/main/webapp/gxt/themes/slate/images/slate/grid/sort_desc.gif b/src/main/webapp/gxt/themes/slate/images/slate/grid/sort_desc.gif new file mode 100644 index 0000000..941d88d Binary files /dev/null and b/src/main/webapp/gxt/themes/slate/images/slate/grid/sort_desc.gif differ diff --git a/src/main/webapp/gxt/themes/slate/images/slate/menu/checked.gif b/src/main/webapp/gxt/themes/slate/images/slate/menu/checked.gif new file mode 100644 index 0000000..e80732f Binary files /dev/null and b/src/main/webapp/gxt/themes/slate/images/slate/menu/checked.gif differ diff --git a/src/main/webapp/gxt/themes/slate/images/slate/menu/group-checked.gif b/src/main/webapp/gxt/themes/slate/images/slate/menu/group-checked.gif new file mode 100644 index 0000000..52d7ca7 Binary files /dev/null and b/src/main/webapp/gxt/themes/slate/images/slate/menu/group-checked.gif differ diff --git a/src/main/webapp/gxt/themes/slate/images/slate/menu/item-over - Copy.gif b/src/main/webapp/gxt/themes/slate/images/slate/menu/item-over - Copy.gif new file mode 100644 index 0000000..6d44e43 Binary files /dev/null and b/src/main/webapp/gxt/themes/slate/images/slate/menu/item-over - Copy.gif differ diff --git a/src/main/webapp/gxt/themes/slate/images/slate/menu/item-over.gif b/src/main/webapp/gxt/themes/slate/images/slate/menu/item-over.gif new file mode 100644 index 0000000..238a77d Binary files /dev/null and b/src/main/webapp/gxt/themes/slate/images/slate/menu/item-over.gif differ diff --git a/src/main/webapp/gxt/themes/slate/images/slate/menu/menu-parent.gif b/src/main/webapp/gxt/themes/slate/images/slate/menu/menu-parent.gif new file mode 100644 index 0000000..2bdb679 Binary files /dev/null and b/src/main/webapp/gxt/themes/slate/images/slate/menu/menu-parent.gif differ diff --git a/src/main/webapp/gxt/themes/slate/images/slate/menu/menu.gif b/src/main/webapp/gxt/themes/slate/images/slate/menu/menu.gif new file mode 100644 index 0000000..7952233 Binary files /dev/null and b/src/main/webapp/gxt/themes/slate/images/slate/menu/menu.gif differ diff --git a/src/main/webapp/gxt/themes/slate/images/slate/menu/unchecked.gif b/src/main/webapp/gxt/themes/slate/images/slate/menu/unchecked.gif new file mode 100644 index 0000000..00e2c0c Binary files /dev/null and b/src/main/webapp/gxt/themes/slate/images/slate/menu/unchecked.gif differ diff --git a/src/main/webapp/gxt/themes/slate/images/slate/panel/corners-sprite.gif b/src/main/webapp/gxt/themes/slate/images/slate/panel/corners-sprite.gif new file mode 100644 index 0000000..d02c9bb Binary files /dev/null and b/src/main/webapp/gxt/themes/slate/images/slate/panel/corners-sprite.gif differ diff --git a/src/main/webapp/gxt/themes/slate/images/slate/panel/left-right.gif b/src/main/webapp/gxt/themes/slate/images/slate/panel/left-right.gif new file mode 100644 index 0000000..1c5d568 Binary files /dev/null and b/src/main/webapp/gxt/themes/slate/images/slate/panel/left-right.gif differ diff --git a/src/main/webapp/gxt/themes/slate/images/slate/panel/light-hd.gif b/src/main/webapp/gxt/themes/slate/images/slate/panel/light-hd.gif new file mode 100644 index 0000000..d9432a0 Binary files /dev/null and b/src/main/webapp/gxt/themes/slate/images/slate/panel/light-hd.gif differ diff --git a/src/main/webapp/gxt/themes/slate/images/slate/panel/tool-sprite-tpl.gif b/src/main/webapp/gxt/themes/slate/images/slate/panel/tool-sprite-tpl.gif new file mode 100644 index 0000000..a195055 Binary files /dev/null and b/src/main/webapp/gxt/themes/slate/images/slate/panel/tool-sprite-tpl.gif differ diff --git a/src/main/webapp/gxt/themes/slate/images/slate/panel/tool-sprites.gif b/src/main/webapp/gxt/themes/slate/images/slate/panel/tool-sprites.gif new file mode 100644 index 0000000..e91fb9c Binary files /dev/null and b/src/main/webapp/gxt/themes/slate/images/slate/panel/tool-sprites.gif differ diff --git a/src/main/webapp/gxt/themes/slate/images/slate/panel/tools-sprites-trans.gif b/src/main/webapp/gxt/themes/slate/images/slate/panel/tools-sprites-trans.gif new file mode 100644 index 0000000..e58bf20 Binary files /dev/null and b/src/main/webapp/gxt/themes/slate/images/slate/panel/tools-sprites-trans.gif differ diff --git a/src/main/webapp/gxt/themes/slate/images/slate/panel/top-bottom.gif b/src/main/webapp/gxt/themes/slate/images/slate/panel/top-bottom.gif new file mode 100644 index 0000000..76af965 Binary files /dev/null and b/src/main/webapp/gxt/themes/slate/images/slate/panel/top-bottom.gif differ diff --git a/src/main/webapp/gxt/themes/slate/images/slate/panel/top-bottom.png b/src/main/webapp/gxt/themes/slate/images/slate/panel/top-bottom.png new file mode 100644 index 0000000..f0c7ff4 Binary files /dev/null and b/src/main/webapp/gxt/themes/slate/images/slate/panel/top-bottom.png differ diff --git a/src/main/webapp/gxt/themes/slate/images/slate/panel/white-corners-sprite.gif b/src/main/webapp/gxt/themes/slate/images/slate/panel/white-corners-sprite.gif new file mode 100644 index 0000000..d5b8adf Binary files /dev/null and b/src/main/webapp/gxt/themes/slate/images/slate/panel/white-corners-sprite.gif differ diff --git a/src/main/webapp/gxt/themes/slate/images/slate/panel/white-left-right.gif b/src/main/webapp/gxt/themes/slate/images/slate/panel/white-left-right.gif new file mode 100644 index 0000000..5b07a06 Binary files /dev/null and b/src/main/webapp/gxt/themes/slate/images/slate/panel/white-left-right.gif differ diff --git a/src/main/webapp/gxt/themes/slate/images/slate/panel/white-top-bottom.gif b/src/main/webapp/gxt/themes/slate/images/slate/panel/white-top-bottom.gif new file mode 100644 index 0000000..8f4ded4 Binary files /dev/null and b/src/main/webapp/gxt/themes/slate/images/slate/panel/white-top-bottom.gif differ diff --git a/src/main/webapp/gxt/themes/slate/images/slate/progress/progress-bg.gif b/src/main/webapp/gxt/themes/slate/images/slate/progress/progress-bg.gif new file mode 100644 index 0000000..5671eed Binary files /dev/null and b/src/main/webapp/gxt/themes/slate/images/slate/progress/progress-bg.gif differ diff --git a/src/main/webapp/gxt/themes/slate/images/slate/qtip/bg.gif b/src/main/webapp/gxt/themes/slate/images/slate/qtip/bg.gif new file mode 100644 index 0000000..32ebaaa Binary files /dev/null and b/src/main/webapp/gxt/themes/slate/images/slate/qtip/bg.gif differ diff --git a/src/main/webapp/gxt/themes/slate/images/slate/qtip/close.gif b/src/main/webapp/gxt/themes/slate/images/slate/qtip/close.gif new file mode 100644 index 0000000..69ab915 Binary files /dev/null and b/src/main/webapp/gxt/themes/slate/images/slate/qtip/close.gif differ diff --git a/src/main/webapp/gxt/themes/slate/images/slate/qtip/tip-sprite.gif b/src/main/webapp/gxt/themes/slate/images/slate/qtip/tip-sprite.gif new file mode 100644 index 0000000..fcd6ffe Binary files /dev/null and b/src/main/webapp/gxt/themes/slate/images/slate/qtip/tip-sprite.gif differ diff --git a/src/main/webapp/gxt/themes/slate/images/slate/s.gif b/src/main/webapp/gxt/themes/slate/images/slate/s.gif new file mode 100644 index 0000000..1d11fa9 Binary files /dev/null and b/src/main/webapp/gxt/themes/slate/images/slate/s.gif differ diff --git a/src/main/webapp/gxt/themes/slate/images/slate/shared/glass-bg.gif b/src/main/webapp/gxt/themes/slate/images/slate/shared/glass-bg.gif new file mode 100644 index 0000000..4950a85 Binary files /dev/null and b/src/main/webapp/gxt/themes/slate/images/slate/shared/glass-bg.gif differ diff --git a/src/main/webapp/gxt/themes/slate/images/slate/shared/hd-sprite.gif b/src/main/webapp/gxt/themes/slate/images/slate/shared/hd-sprite.gif new file mode 100644 index 0000000..3b47087 Binary files /dev/null and b/src/main/webapp/gxt/themes/slate/images/slate/shared/hd-sprite.gif differ diff --git a/src/main/webapp/gxt/themes/slate/images/slate/shared/left-btn.gif b/src/main/webapp/gxt/themes/slate/images/slate/shared/left-btn.gif new file mode 100644 index 0000000..3239360 Binary files /dev/null and b/src/main/webapp/gxt/themes/slate/images/slate/shared/left-btn.gif differ diff --git a/src/main/webapp/gxt/themes/slate/images/slate/shared/right-btn.gif b/src/main/webapp/gxt/themes/slate/images/slate/shared/right-btn.gif new file mode 100644 index 0000000..e45c695 Binary files /dev/null and b/src/main/webapp/gxt/themes/slate/images/slate/shared/right-btn.gif differ diff --git a/src/main/webapp/gxt/themes/slate/images/slate/sizer/e-handle-dark.gif b/src/main/webapp/gxt/themes/slate/images/slate/sizer/e-handle-dark.gif new file mode 100644 index 0000000..2a4b30a Binary files /dev/null and b/src/main/webapp/gxt/themes/slate/images/slate/sizer/e-handle-dark.gif differ diff --git a/src/main/webapp/gxt/themes/slate/images/slate/sizer/e-handle.gif b/src/main/webapp/gxt/themes/slate/images/slate/sizer/e-handle.gif new file mode 100644 index 0000000..7819f0f Binary files /dev/null and b/src/main/webapp/gxt/themes/slate/images/slate/sizer/e-handle.gif differ diff --git a/src/main/webapp/gxt/themes/slate/images/slate/sizer/ne-handle-dark.gif b/src/main/webapp/gxt/themes/slate/images/slate/sizer/ne-handle-dark.gif new file mode 100644 index 0000000..817036d Binary files /dev/null and b/src/main/webapp/gxt/themes/slate/images/slate/sizer/ne-handle-dark.gif differ diff --git a/src/main/webapp/gxt/themes/slate/images/slate/sizer/ne-handle.gif b/src/main/webapp/gxt/themes/slate/images/slate/sizer/ne-handle.gif new file mode 100644 index 0000000..6518a21 Binary files /dev/null and b/src/main/webapp/gxt/themes/slate/images/slate/sizer/ne-handle.gif differ diff --git a/src/main/webapp/gxt/themes/slate/images/slate/sizer/nw-handle-dark.gif b/src/main/webapp/gxt/themes/slate/images/slate/sizer/nw-handle-dark.gif new file mode 100644 index 0000000..fdfb7dc Binary files /dev/null and b/src/main/webapp/gxt/themes/slate/images/slate/sizer/nw-handle-dark.gif differ diff --git a/src/main/webapp/gxt/themes/slate/images/slate/sizer/nw-handle.gif b/src/main/webapp/gxt/themes/slate/images/slate/sizer/nw-handle.gif new file mode 100644 index 0000000..7655a81 Binary files /dev/null and b/src/main/webapp/gxt/themes/slate/images/slate/sizer/nw-handle.gif differ diff --git a/src/main/webapp/gxt/themes/slate/images/slate/sizer/s-handle-dark.gif b/src/main/webapp/gxt/themes/slate/images/slate/sizer/s-handle-dark.gif new file mode 100644 index 0000000..aeafee2 Binary files /dev/null and b/src/main/webapp/gxt/themes/slate/images/slate/sizer/s-handle-dark.gif differ diff --git a/src/main/webapp/gxt/themes/slate/images/slate/sizer/s-handle.gif b/src/main/webapp/gxt/themes/slate/images/slate/sizer/s-handle.gif new file mode 100644 index 0000000..a1abc4a Binary files /dev/null and b/src/main/webapp/gxt/themes/slate/images/slate/sizer/s-handle.gif differ diff --git a/src/main/webapp/gxt/themes/slate/images/slate/sizer/se-handle-dark.gif b/src/main/webapp/gxt/themes/slate/images/slate/sizer/se-handle-dark.gif new file mode 100644 index 0000000..362921c Binary files /dev/null and b/src/main/webapp/gxt/themes/slate/images/slate/sizer/se-handle-dark.gif differ diff --git a/src/main/webapp/gxt/themes/slate/images/slate/sizer/se-handle.gif b/src/main/webapp/gxt/themes/slate/images/slate/sizer/se-handle.gif new file mode 100644 index 0000000..c6684f9 Binary files /dev/null and b/src/main/webapp/gxt/themes/slate/images/slate/sizer/se-handle.gif differ diff --git a/src/main/webapp/gxt/themes/slate/images/slate/sizer/square.gif b/src/main/webapp/gxt/themes/slate/images/slate/sizer/square.gif new file mode 100644 index 0000000..0c0e6b4 Binary files /dev/null and b/src/main/webapp/gxt/themes/slate/images/slate/sizer/square.gif differ diff --git a/src/main/webapp/gxt/themes/slate/images/slate/sizer/sw-handle-dark.gif b/src/main/webapp/gxt/themes/slate/images/slate/sizer/sw-handle-dark.gif new file mode 100644 index 0000000..698122f Binary files /dev/null and b/src/main/webapp/gxt/themes/slate/images/slate/sizer/sw-handle-dark.gif differ diff --git a/src/main/webapp/gxt/themes/slate/images/slate/sizer/sw-handle.gif b/src/main/webapp/gxt/themes/slate/images/slate/sizer/sw-handle.gif new file mode 100644 index 0000000..920621e Binary files /dev/null and b/src/main/webapp/gxt/themes/slate/images/slate/sizer/sw-handle.gif differ diff --git a/src/main/webapp/gxt/themes/slate/images/slate/slider/slider-bg.png b/src/main/webapp/gxt/themes/slate/images/slate/slider/slider-bg.png new file mode 100644 index 0000000..d2e3af6 Binary files /dev/null and b/src/main/webapp/gxt/themes/slate/images/slate/slider/slider-bg.png differ diff --git a/src/main/webapp/gxt/themes/slate/images/slate/slider/slider-thumb.png b/src/main/webapp/gxt/themes/slate/images/slate/slider/slider-thumb.png new file mode 100644 index 0000000..3a9423a Binary files /dev/null and b/src/main/webapp/gxt/themes/slate/images/slate/slider/slider-thumb.png differ diff --git a/src/main/webapp/gxt/themes/slate/images/slate/slider/slider-v-bg.png b/src/main/webapp/gxt/themes/slate/images/slate/slider/slider-v-bg.png new file mode 100644 index 0000000..cf6ab9f Binary files /dev/null and b/src/main/webapp/gxt/themes/slate/images/slate/slider/slider-v-bg.png differ diff --git a/src/main/webapp/gxt/themes/slate/images/slate/slider/slider-v-thumb.png b/src/main/webapp/gxt/themes/slate/images/slate/slider/slider-v-thumb.png new file mode 100644 index 0000000..3caf7a0 Binary files /dev/null and b/src/main/webapp/gxt/themes/slate/images/slate/slider/slider-v-thumb.png differ diff --git a/src/main/webapp/gxt/themes/slate/images/slate/tabs/scroll-left.gif b/src/main/webapp/gxt/themes/slate/images/slate/tabs/scroll-left.gif new file mode 100644 index 0000000..bbb3e3d Binary files /dev/null and b/src/main/webapp/gxt/themes/slate/images/slate/tabs/scroll-left.gif differ diff --git a/src/main/webapp/gxt/themes/slate/images/slate/tabs/scroll-right.gif b/src/main/webapp/gxt/themes/slate/images/slate/tabs/scroll-right.gif new file mode 100644 index 0000000..feb6a76 Binary files /dev/null and b/src/main/webapp/gxt/themes/slate/images/slate/tabs/scroll-right.gif differ diff --git a/src/main/webapp/gxt/themes/slate/images/slate/tabs/scroller-bg.gif b/src/main/webapp/gxt/themes/slate/images/slate/tabs/scroller-bg.gif new file mode 100644 index 0000000..f089c0a Binary files /dev/null and b/src/main/webapp/gxt/themes/slate/images/slate/tabs/scroller-bg.gif differ diff --git a/src/main/webapp/gxt/themes/slate/images/slate/tabs/tab-btm-inactive-left-bg.gif b/src/main/webapp/gxt/themes/slate/images/slate/tabs/tab-btm-inactive-left-bg.gif new file mode 100644 index 0000000..777ecd8 Binary files /dev/null and b/src/main/webapp/gxt/themes/slate/images/slate/tabs/tab-btm-inactive-left-bg.gif differ diff --git a/src/main/webapp/gxt/themes/slate/images/slate/tabs/tab-btm-inactive-right-bg.gif b/src/main/webapp/gxt/themes/slate/images/slate/tabs/tab-btm-inactive-right-bg.gif new file mode 100644 index 0000000..7c378ab Binary files /dev/null and b/src/main/webapp/gxt/themes/slate/images/slate/tabs/tab-btm-inactive-right-bg.gif differ diff --git a/src/main/webapp/gxt/themes/slate/images/slate/tabs/tab-btm-left-bg.gif b/src/main/webapp/gxt/themes/slate/images/slate/tabs/tab-btm-left-bg.gif new file mode 100644 index 0000000..9f578f1 Binary files /dev/null and b/src/main/webapp/gxt/themes/slate/images/slate/tabs/tab-btm-left-bg.gif differ diff --git a/src/main/webapp/gxt/themes/slate/images/slate/tabs/tab-btm-right-bg.gif b/src/main/webapp/gxt/themes/slate/images/slate/tabs/tab-btm-right-bg.gif new file mode 100644 index 0000000..84e20cf Binary files /dev/null and b/src/main/webapp/gxt/themes/slate/images/slate/tabs/tab-btm-right-bg.gif differ diff --git a/src/main/webapp/gxt/themes/slate/images/slate/tabs/tab-close.gif b/src/main/webapp/gxt/themes/slate/images/slate/tabs/tab-close.gif new file mode 100644 index 0000000..3bdff41 Binary files /dev/null and b/src/main/webapp/gxt/themes/slate/images/slate/tabs/tab-close.gif differ diff --git a/src/main/webapp/gxt/themes/slate/images/slate/tabs/tab-strip-bg.gif b/src/main/webapp/gxt/themes/slate/images/slate/tabs/tab-strip-bg.gif new file mode 100644 index 0000000..03e7574 Binary files /dev/null and b/src/main/webapp/gxt/themes/slate/images/slate/tabs/tab-strip-bg.gif differ diff --git a/src/main/webapp/gxt/themes/slate/images/slate/tabs/tab-strip-bg.png b/src/main/webapp/gxt/themes/slate/images/slate/tabs/tab-strip-bg.png new file mode 100644 index 0000000..fa8ab3f Binary files /dev/null and b/src/main/webapp/gxt/themes/slate/images/slate/tabs/tab-strip-bg.png differ diff --git a/src/main/webapp/gxt/themes/slate/images/slate/tabs/tab-strip-btm-bg.gif b/src/main/webapp/gxt/themes/slate/images/slate/tabs/tab-strip-btm-bg.gif new file mode 100644 index 0000000..f35087f Binary files /dev/null and b/src/main/webapp/gxt/themes/slate/images/slate/tabs/tab-strip-btm-bg.gif differ diff --git a/src/main/webapp/gxt/themes/slate/images/slate/tabs/tabs-sprite.gif b/src/main/webapp/gxt/themes/slate/images/slate/tabs/tabs-sprite.gif new file mode 100644 index 0000000..d7f1f32 Binary files /dev/null and b/src/main/webapp/gxt/themes/slate/images/slate/tabs/tabs-sprite.gif differ diff --git a/src/main/webapp/gxt/themes/slate/images/slate/toolbar/bg.gif b/src/main/webapp/gxt/themes/slate/images/slate/toolbar/bg.gif new file mode 100644 index 0000000..2745bae Binary files /dev/null and b/src/main/webapp/gxt/themes/slate/images/slate/toolbar/bg.gif differ diff --git a/src/main/webapp/gxt/themes/slate/images/slate/toolbar/btn-arrow-light.gif b/src/main/webapp/gxt/themes/slate/images/slate/toolbar/btn-arrow-light.gif new file mode 100644 index 0000000..b0e24b5 Binary files /dev/null and b/src/main/webapp/gxt/themes/slate/images/slate/toolbar/btn-arrow-light.gif differ diff --git a/src/main/webapp/gxt/themes/slate/images/slate/toolbar/btn-arrow.gif b/src/main/webapp/gxt/themes/slate/images/slate/toolbar/btn-arrow.gif new file mode 100644 index 0000000..9fad756 Binary files /dev/null and b/src/main/webapp/gxt/themes/slate/images/slate/toolbar/btn-arrow.gif differ diff --git a/src/main/webapp/gxt/themes/slate/images/slate/toolbar/btn-over-bg.gif b/src/main/webapp/gxt/themes/slate/images/slate/toolbar/btn-over-bg.gif new file mode 100644 index 0000000..62464c0 Binary files /dev/null and b/src/main/webapp/gxt/themes/slate/images/slate/toolbar/btn-over-bg.gif differ diff --git a/src/main/webapp/gxt/themes/slate/images/slate/toolbar/gray-bg.gif b/src/main/webapp/gxt/themes/slate/images/slate/toolbar/gray-bg.gif new file mode 100644 index 0000000..bd49438 Binary files /dev/null and b/src/main/webapp/gxt/themes/slate/images/slate/toolbar/gray-bg.gif differ diff --git a/src/main/webapp/gxt/themes/slate/images/slate/toolbar/sep.gif b/src/main/webapp/gxt/themes/slate/images/slate/toolbar/sep.gif new file mode 100644 index 0000000..1ed6709 Binary files /dev/null and b/src/main/webapp/gxt/themes/slate/images/slate/toolbar/sep.gif differ diff --git a/src/main/webapp/gxt/themes/slate/images/slate/toolbar/tb-bg.gif b/src/main/webapp/gxt/themes/slate/images/slate/toolbar/tb-bg.gif new file mode 100644 index 0000000..4969e4e Binary files /dev/null and b/src/main/webapp/gxt/themes/slate/images/slate/toolbar/tb-bg.gif differ diff --git a/src/main/webapp/gxt/themes/slate/images/slate/toolbar/tb-btn-sprite.gif b/src/main/webapp/gxt/themes/slate/images/slate/toolbar/tb-btn-sprite.gif new file mode 100644 index 0000000..483d51f Binary files /dev/null and b/src/main/webapp/gxt/themes/slate/images/slate/toolbar/tb-btn-sprite.gif differ diff --git a/src/main/webapp/gxt/themes/slate/images/slate/tree/arrows.gif b/src/main/webapp/gxt/themes/slate/images/slate/tree/arrows.gif new file mode 100644 index 0000000..943f7f8 Binary files /dev/null and b/src/main/webapp/gxt/themes/slate/images/slate/tree/arrows.gif differ diff --git a/src/main/webapp/gxt/themes/slate/images/slate/window/icon-error.gif b/src/main/webapp/gxt/themes/slate/images/slate/window/icon-error.gif new file mode 100644 index 0000000..397b655 Binary files /dev/null and b/src/main/webapp/gxt/themes/slate/images/slate/window/icon-error.gif differ diff --git a/src/main/webapp/gxt/themes/slate/images/slate/window/icon-info.gif b/src/main/webapp/gxt/themes/slate/images/slate/window/icon-info.gif new file mode 100644 index 0000000..58281c3 Binary files /dev/null and b/src/main/webapp/gxt/themes/slate/images/slate/window/icon-info.gif differ diff --git a/src/main/webapp/gxt/themes/slate/images/slate/window/icon-question.gif b/src/main/webapp/gxt/themes/slate/images/slate/window/icon-question.gif new file mode 100644 index 0000000..08abd82 Binary files /dev/null and b/src/main/webapp/gxt/themes/slate/images/slate/window/icon-question.gif differ diff --git a/src/main/webapp/gxt/themes/slate/images/slate/window/icon-warning.gif b/src/main/webapp/gxt/themes/slate/images/slate/window/icon-warning.gif new file mode 100644 index 0000000..27ff98b Binary files /dev/null and b/src/main/webapp/gxt/themes/slate/images/slate/window/icon-warning.gif differ diff --git a/src/main/webapp/gxt/themes/slate/images/slate/window/left-corners.png b/src/main/webapp/gxt/themes/slate/images/slate/window/left-corners.png new file mode 100644 index 0000000..29fcd3b Binary files /dev/null and b/src/main/webapp/gxt/themes/slate/images/slate/window/left-corners.png differ diff --git a/src/main/webapp/gxt/themes/slate/images/slate/window/left-right.png b/src/main/webapp/gxt/themes/slate/images/slate/window/left-right.png new file mode 100644 index 0000000..797c0eb Binary files /dev/null and b/src/main/webapp/gxt/themes/slate/images/slate/window/left-right.png differ diff --git a/src/main/webapp/gxt/themes/slate/images/slate/window/right-corners.png b/src/main/webapp/gxt/themes/slate/images/slate/window/right-corners.png new file mode 100644 index 0000000..314da07 Binary files /dev/null and b/src/main/webapp/gxt/themes/slate/images/slate/window/right-corners.png differ diff --git a/src/main/webapp/gxt/themes/slate/images/slate/window/top-bottom.png b/src/main/webapp/gxt/themes/slate/images/slate/window/top-bottom.png new file mode 100644 index 0000000..e1dab98 Binary files /dev/null and b/src/main/webapp/gxt/themes/slate/images/slate/window/top-bottom.png differ diff --git a/src/main/webapp/images/bg_custom.png b/src/main/webapp/images/bg_custom.png new file mode 100644 index 0000000..ec909f3 Binary files /dev/null and b/src/main/webapp/images/bg_custom.png differ diff --git a/src/main/webapp/images/d4infra.gif b/src/main/webapp/images/d4infra.gif new file mode 100644 index 0000000..910f0a0 Binary files /dev/null and b/src/main/webapp/images/d4infra.gif differ diff --git a/src/main/webapp/images/icons/about.png b/src/main/webapp/images/icons/about.png new file mode 100644 index 0000000..25f3b40 Binary files /dev/null and b/src/main/webapp/images/icons/about.png differ diff --git a/src/main/webapp/images/icons/add.png b/src/main/webapp/images/icons/add.png new file mode 100644 index 0000000..6332fef Binary files /dev/null and b/src/main/webapp/images/icons/add.png differ diff --git a/src/main/webapp/images/icons/application_cascade.png b/src/main/webapp/images/icons/application_cascade.png new file mode 100755 index 0000000..da5c622 Binary files /dev/null and b/src/main/webapp/images/icons/application_cascade.png differ diff --git a/src/main/webapp/images/icons/bgTree.gif b/src/main/webapp/images/icons/bgTree.gif new file mode 100644 index 0000000..0c6ae54 Binary files /dev/null and b/src/main/webapp/images/icons/bgTree.gif differ diff --git a/src/main/webapp/images/icons/bigcube.gif b/src/main/webapp/images/icons/bigcube.gif new file mode 100644 index 0000000..5c47462 Binary files /dev/null and b/src/main/webapp/images/icons/bigcube.gif differ diff --git a/src/main/webapp/images/icons/brick_add.png b/src/main/webapp/images/icons/brick_add.png new file mode 100644 index 0000000..fac186b Binary files /dev/null and b/src/main/webapp/images/icons/brick_add.png differ diff --git a/src/main/webapp/images/icons/brick_delete.png b/src/main/webapp/images/icons/brick_delete.png new file mode 100644 index 0000000..3a8c373 Binary files /dev/null and b/src/main/webapp/images/icons/brick_delete.png differ diff --git a/src/main/webapp/images/icons/clean-restart.png b/src/main/webapp/images/icons/clean-restart.png new file mode 100644 index 0000000..8f4eabb Binary files /dev/null and b/src/main/webapp/images/icons/clean-restart.png differ diff --git a/src/main/webapp/images/icons/close.png b/src/main/webapp/images/icons/close.png new file mode 100644 index 0000000..afaa27f Binary files /dev/null and b/src/main/webapp/images/icons/close.png differ diff --git a/src/main/webapp/images/icons/closeall.png b/src/main/webapp/images/icons/closeall.png new file mode 100644 index 0000000..62c6d1b Binary files /dev/null and b/src/main/webapp/images/icons/closeall.png differ diff --git a/src/main/webapp/images/icons/cog.png b/src/main/webapp/images/icons/cog.png new file mode 100644 index 0000000..67de2c6 Binary files /dev/null and b/src/main/webapp/images/icons/cog.png differ diff --git a/src/main/webapp/images/icons/cog_add.png b/src/main/webapp/images/icons/cog_add.png new file mode 100644 index 0000000..04f22ba Binary files /dev/null and b/src/main/webapp/images/icons/cog_add.png differ diff --git a/src/main/webapp/images/icons/cog_go.png b/src/main/webapp/images/icons/cog_go.png new file mode 100644 index 0000000..3262767 Binary files /dev/null and b/src/main/webapp/images/icons/cog_go.png differ diff --git a/src/main/webapp/images/icons/console.png b/src/main/webapp/images/icons/console.png new file mode 100644 index 0000000..e24f283 Binary files /dev/null and b/src/main/webapp/images/icons/console.png differ diff --git a/src/main/webapp/images/icons/cube.gif b/src/main/webapp/images/icons/cube.gif new file mode 100644 index 0000000..080baf4 Binary files /dev/null and b/src/main/webapp/images/icons/cube.gif differ diff --git a/src/main/webapp/images/icons/delete.png b/src/main/webapp/images/icons/delete.png new file mode 100644 index 0000000..5cadb53 Binary files /dev/null and b/src/main/webapp/images/icons/delete.png differ diff --git a/src/main/webapp/images/icons/deploy.png b/src/main/webapp/images/icons/deploy.png new file mode 100644 index 0000000..bc67d6e Binary files /dev/null and b/src/main/webapp/images/icons/deploy.png differ diff --git a/src/main/webapp/images/icons/detach.png b/src/main/webapp/images/icons/detach.png new file mode 100644 index 0000000..ea897cc Binary files /dev/null and b/src/main/webapp/images/icons/detach.png differ diff --git a/src/main/webapp/images/icons/error.png b/src/main/webapp/images/icons/error.png new file mode 100644 index 0000000..3ca0133 Binary files /dev/null and b/src/main/webapp/images/icons/error.png differ diff --git a/src/main/webapp/images/icons/eye.png b/src/main/webapp/images/icons/eye.png new file mode 100644 index 0000000..2bcc44f Binary files /dev/null and b/src/main/webapp/images/icons/eye.png differ diff --git a/src/main/webapp/images/icons/folder.png b/src/main/webapp/images/icons/folder.png new file mode 100644 index 0000000..8213bea Binary files /dev/null and b/src/main/webapp/images/icons/folder.png differ diff --git a/src/main/webapp/images/icons/folder_database.png b/src/main/webapp/images/icons/folder_database.png new file mode 100644 index 0000000..5193e2e Binary files /dev/null and b/src/main/webapp/images/icons/folder_database.png differ diff --git a/src/main/webapp/images/icons/forcedelete.png b/src/main/webapp/images/icons/forcedelete.png new file mode 100644 index 0000000..0069e84 Binary files /dev/null and b/src/main/webapp/images/icons/forcedelete.png differ diff --git a/src/main/webapp/images/icons/grid.png b/src/main/webapp/images/icons/grid.png new file mode 100644 index 0000000..c4da495 Binary files /dev/null and b/src/main/webapp/images/icons/grid.png differ diff --git a/src/main/webapp/images/icons/install.png b/src/main/webapp/images/icons/install.png new file mode 100644 index 0000000..1238368 Binary files /dev/null and b/src/main/webapp/images/icons/install.png differ diff --git a/src/main/webapp/images/icons/is.png b/src/main/webapp/images/icons/is.png new file mode 100644 index 0000000..29a8f2f Binary files /dev/null and b/src/main/webapp/images/icons/is.png differ diff --git a/src/main/webapp/images/icons/link.png b/src/main/webapp/images/icons/link.png new file mode 100644 index 0000000..15a2020 Binary files /dev/null and b/src/main/webapp/images/icons/link.png differ diff --git a/src/main/webapp/images/icons/log.png b/src/main/webapp/images/icons/log.png new file mode 100644 index 0000000..67de2c6 Binary files /dev/null and b/src/main/webapp/images/icons/log.png differ diff --git a/src/main/webapp/images/icons/new.png b/src/main/webapp/images/icons/new.png new file mode 100644 index 0000000..dddb741 Binary files /dev/null and b/src/main/webapp/images/icons/new.png differ diff --git a/src/main/webapp/images/icons/page_white_world.png b/src/main/webapp/images/icons/page_white_world.png new file mode 100644 index 0000000..6ed2490 Binary files /dev/null and b/src/main/webapp/images/icons/page_white_world.png differ diff --git a/src/main/webapp/images/icons/plugin.png b/src/main/webapp/images/icons/plugin.png new file mode 100644 index 0000000..6187b15 Binary files /dev/null and b/src/main/webapp/images/icons/plugin.png differ diff --git a/src/main/webapp/images/icons/pluginCM.png b/src/main/webapp/images/icons/pluginCM.png new file mode 100644 index 0000000..161000b Binary files /dev/null and b/src/main/webapp/images/icons/pluginCM.png differ diff --git a/src/main/webapp/images/icons/profile-big.gif b/src/main/webapp/images/icons/profile-big.gif new file mode 100644 index 0000000..5ce802c Binary files /dev/null and b/src/main/webapp/images/icons/profile-big.gif differ diff --git a/src/main/webapp/images/icons/profile.gif b/src/main/webapp/images/icons/profile.gif new file mode 100644 index 0000000..5ea3fa8 Binary files /dev/null and b/src/main/webapp/images/icons/profile.gif differ diff --git a/src/main/webapp/images/icons/refresh.png b/src/main/webapp/images/icons/refresh.png new file mode 100644 index 0000000..328c1fd Binary files /dev/null and b/src/main/webapp/images/icons/refresh.png differ diff --git a/src/main/webapp/images/icons/report-big.png b/src/main/webapp/images/icons/report-big.png new file mode 100644 index 0000000..d85c8bb Binary files /dev/null and b/src/main/webapp/images/icons/report-big.png differ diff --git a/src/main/webapp/images/icons/report.png b/src/main/webapp/images/icons/report.png new file mode 100644 index 0000000..87be27d Binary files /dev/null and b/src/main/webapp/images/icons/report.png differ diff --git a/src/main/webapp/images/icons/restart.png b/src/main/webapp/images/icons/restart.png new file mode 100644 index 0000000..c5d417f Binary files /dev/null and b/src/main/webapp/images/icons/restart.png differ diff --git a/src/main/webapp/images/icons/server.png b/src/main/webapp/images/icons/server.png new file mode 100644 index 0000000..720a237 Binary files /dev/null and b/src/main/webapp/images/icons/server.png differ diff --git a/src/main/webapp/images/icons/shutdown.png b/src/main/webapp/images/icons/shutdown.png new file mode 100644 index 0000000..76eb6e0 Binary files /dev/null and b/src/main/webapp/images/icons/shutdown.png differ diff --git a/src/main/webapp/images/icons/sweeper.png b/src/main/webapp/images/icons/sweeper.png new file mode 100644 index 0000000..dba10ce Binary files /dev/null and b/src/main/webapp/images/icons/sweeper.png differ diff --git a/src/main/webapp/images/icons/sweeper2.png b/src/main/webapp/images/icons/sweeper2.png new file mode 100644 index 0000000..e6c8e8b Binary files /dev/null and b/src/main/webapp/images/icons/sweeper2.png differ diff --git a/src/main/webapp/images/icons/table_multiple.png b/src/main/webapp/images/icons/table_multiple.png new file mode 100644 index 0000000..d76448e Binary files /dev/null and b/src/main/webapp/images/icons/table_multiple.png differ diff --git a/src/main/webapp/images/icons/trash.png b/src/main/webapp/images/icons/trash.png new file mode 100644 index 0000000..1ecf2c3 Binary files /dev/null and b/src/main/webapp/images/icons/trash.png differ diff --git a/src/main/webapp/images/icons/upgrade.png b/src/main/webapp/images/icons/upgrade.png new file mode 100644 index 0000000..74d20bc Binary files /dev/null and b/src/main/webapp/images/icons/upgrade.png differ diff --git a/src/main/webapp/images/icons/validate.gif b/src/main/webapp/images/icons/validate.gif new file mode 100644 index 0000000..08a9805 Binary files /dev/null and b/src/main/webapp/images/icons/validate.gif differ diff --git a/src/main/webapp/images/icons/wand.png b/src/main/webapp/images/icons/wand.png new file mode 100644 index 0000000..44ccbf8 Binary files /dev/null and b/src/main/webapp/images/icons/wand.png differ diff --git a/src/main/webapp/images/icons/warning.png b/src/main/webapp/images/icons/warning.png new file mode 100644 index 0000000..4766743 Binary files /dev/null and b/src/main/webapp/images/icons/warning.png differ diff --git a/src/main/webapp/images/icons/world.png b/src/main/webapp/images/icons/world.png new file mode 100644 index 0000000..68f21d3 Binary files /dev/null and b/src/main/webapp/images/icons/world.png differ diff --git a/src/main/webapp/images/pattern.gif b/src/main/webapp/images/pattern.gif new file mode 100644 index 0000000..1d80567 Binary files /dev/null and b/src/main/webapp/images/pattern.gif differ diff --git a/src/main/webapp/images/sourceD4infra.psd b/src/main/webapp/images/sourceD4infra.psd new file mode 100644 index 0000000..98ef010 Binary files /dev/null and b/src/main/webapp/images/sourceD4infra.psd differ diff --git a/src/main/webapp/images/tree_diag.png b/src/main/webapp/images/tree_diag.png new file mode 100644 index 0000000..b9c024e Binary files /dev/null and b/src/main/webapp/images/tree_diag.png differ diff --git a/src/main/webapp/mask_images/7_capacities.gif b/src/main/webapp/mask_images/7_capacities.gif new file mode 100644 index 0000000..3d1870a Binary files /dev/null and b/src/main/webapp/mask_images/7_capacities.gif differ diff --git a/src/main/webapp/mask_images/D4S-II.jpg b/src/main/webapp/mask_images/D4S-II.jpg new file mode 100644 index 0000000..cd2e122 Binary files /dev/null and b/src/main/webapp/mask_images/D4S-II.jpg differ diff --git a/src/main/webapp/mask_images/D4ScienceInfrastructure.png b/src/main/webapp/mask_images/D4ScienceInfrastructure.png new file mode 100644 index 0000000..04f0318 Binary files /dev/null and b/src/main/webapp/mask_images/D4ScienceInfrastructure.png differ diff --git a/src/main/webapp/mask_images/banner.jpg b/src/main/webapp/mask_images/banner.jpg new file mode 100644 index 0000000..7d46f32 Binary files /dev/null and b/src/main/webapp/mask_images/banner.jpg differ diff --git a/src/main/webapp/mask_images/e_infrastructure.gif b/src/main/webapp/mask_images/e_infrastructure.gif new file mode 100644 index 0000000..2dbcb85 Binary files /dev/null and b/src/main/webapp/mask_images/e_infrastructure.gif differ diff --git a/src/main/webapp/mask_images/eu.jpg b/src/main/webapp/mask_images/eu.jpg new file mode 100644 index 0000000..93aaacb Binary files /dev/null and b/src/main/webapp/mask_images/eu.jpg differ diff --git a/src/main/webapp/mask_images/favicon.gif b/src/main/webapp/mask_images/favicon.gif new file mode 100644 index 0000000..87e2a68 Binary files /dev/null and b/src/main/webapp/mask_images/favicon.gif differ diff --git a/src/main/webapp/mask_images/gCube.png b/src/main/webapp/mask_images/gCube.png new file mode 100644 index 0000000..cb43944 Binary files /dev/null and b/src/main/webapp/mask_images/gCube.png differ diff --git a/src/main/webapp/mask_images/loader.gif b/src/main/webapp/mask_images/loader.gif new file mode 100644 index 0000000..cc70a7a Binary files /dev/null and b/src/main/webapp/mask_images/loader.gif differ diff --git a/src/main/webapp/mask_images/mask.gif b/src/main/webapp/mask_images/mask.gif new file mode 100644 index 0000000..cbb3d28 Binary files /dev/null and b/src/main/webapp/mask_images/mask.gif differ diff --git a/src/main/webapp/mask_images/mask1.gif b/src/main/webapp/mask_images/mask1.gif new file mode 100644 index 0000000..2178b81 Binary files /dev/null and b/src/main/webapp/mask_images/mask1.gif differ diff --git a/src/main/webapp/mask_images/mask2.gif b/src/main/webapp/mask_images/mask2.gif new file mode 100644 index 0000000..391a435 Binary files /dev/null and b/src/main/webapp/mask_images/mask2.gif differ diff --git a/src/main/webapp/mask_images/mask3.gif b/src/main/webapp/mask_images/mask3.gif new file mode 100644 index 0000000..01e2372 Binary files /dev/null and b/src/main/webapp/mask_images/mask3.gif differ diff --git a/src/main/webapp/mask_images/mask4.gif b/src/main/webapp/mask_images/mask4.gif new file mode 100644 index 0000000..7b8e8bf Binary files /dev/null and b/src/main/webapp/mask_images/mask4.gif differ diff --git a/src/main/webapp/openbio.css b/src/main/webapp/openbio.css new file mode 100644 index 0000000..1066395 --- /dev/null +++ b/src/main/webapp/openbio.css @@ -0,0 +1,53 @@ +#wrapper { + font: 11px/1.5 "Lucida Grande", "Lucida Sans Unicode", Arial, Verdana, sans-serif; + margin: 0 auto; + width: 92% !important; +} + + +.x-menubar { + + background-color: #3a6472; + background-image: -webkit-gradient(linear, left top, left bottom, from(rgb(58, 100, 114)), to(rgb(118, 152, 153))); + background-image: -webkit-linear-gradient(top, rgb(58, 100, 114), rgb(118, 152, 153)); + background-image: -moz-linear-gradient(top, rgb(58, 100, 114), rgb(118, 152, 153)); + background-image: -o-linear-gradient(top, rgb(58, 100, 114), rgb(118, 152, 153)); + background-image: -ms-linear-gradient(top, rgb(58, 100, 114), rgb(118, 152, 153)); + background-image: linear-gradient(top, rgb(58, 100, 114), rgb(118, 152, 153)); + filter: progid:DXImageTransform.Microsoft.gradient(GradientType=0,StartColorStr='#3a6472', EndColorStr='#769899'); + + + } + +.x-border-layout-ct { + background-color: #3a6472; +} +.x-toolbar { + border-color: #688486; + background: #688486; +} +.x-panel-header { + border-color: #688486; + background-color: #3a6472; + background-image: -webkit-gradient(linear, left top, left bottom, from(rgb(58, 100, 114)), to(rgb(118, 152, 153))); + background-image: -webkit-linear-gradient(top, rgb(58, 100, 114), rgb(118, 152, 153)); + background-image: -moz-linear-gradient(top, rgb(58, 100, 114), rgb(118, 152, 153)); + background-image: -o-linear-gradient(top, rgb(58, 100, 114), rgb(118, 152, 153)); + background-image: -ms-linear-gradient(top, rgb(58, 100, 114), rgb(118, 152, 153)); + background-image: linear-gradient(top, rgb(58, 100, 114), rgb(118, 152, 153)); + filter: progid:DXImageTransform.Microsoft.gradient(GradientType=0,StartColorStr='#3a6472', EndColorStr='#769899'); + +} +.x-accordion-hd { + background-position: 0 0px; +} + .x-status-text { + color:#e9b746; + font-weight: bold !important; + } + + + + .x-component { + color:#283891; + } \ No newline at end of file diff --git a/src/main/webapp/xmlverbatim.css b/src/main/webapp/xmlverbatim.css new file mode 100644 index 0000000..efa9b35 --- /dev/null +++ b/src/main/webapp/xmlverbatim.css @@ -0,0 +1,13 @@ +.xmlverb-default { color: #333333; background-color: #ffffff; + font-family: monospace } +.xmlverb-element-name { color: #660000 } +.xmlverb-element-nsprefix { color: #666600 } +.xmlverb-attr-name { color: #663333 } +.xmlverb-attr-content { color: #444444; font-weight: bold } +.xmlverb-ns-name { color: #666600 } +.xmlverb-ns-uri { color: #330099 } +.xmlverb-text { color: #000000; font-weight: bold } +.xmlverb-comment { color: #006600; font-style: italic } +.xmlverb-pi-name { color: #006600; font-style: italic } +.xmlverb-pi-content { color: #006666; font-style: italic } + diff --git a/src/test/java/org/gcube/portlets/admin/resourcemanagement/client/GwtTestResourceManagementPortlet.java b/src/test/java/org/gcube/portlets/admin/resourcemanagement/client/GwtTestResourceManagementPortlet.java new file mode 100644 index 0000000..4a25839 --- /dev/null +++ b/src/test/java/org/gcube/portlets/admin/resourcemanagement/client/GwtTestResourceManagementPortlet.java @@ -0,0 +1,45 @@ +package org.gcube.portlets.admin.resourcemanagement.client; + +import com.google.gwt.junit.client.GWTTestCase; + +/** + * GWT JUnit integration tests must extend GWTTestCase. + * Using "GwtTest*" naming pattern exclude them from running with + * surefire during the test phase. + * + * If you run the tests using the Maven command line, you will have to + * navigate with your browser to a specific url given by Maven. + * See http://mojo.codehaus.org/gwt-maven-plugin/user-guide/testing.html + * for details. + */ +public class GwtTestResourceManagementPortlet extends GWTTestCase { + + /** + * Must refer to a valid module that sources this class. + */ + public String getModuleName() { + return "org.gcube.portlets.admin.resourcemanagement.ResourceManagementPortletJUnit"; + } + + /** + * Tests the FieldVerifier. + */ + public void testFieldVerifier() { +// assertFalse(FieldVerifier.isValidName(null)); +// assertFalse(FieldVerifier.isValidName("")); +// assertFalse(FieldVerifier.isValidName("a")); +// assertFalse(FieldVerifier.isValidName("ab")); +// assertFalse(FieldVerifier.isValidName("abc")); +// assertTrue(FieldVerifier.isValidName("abcd")); + } + + /** + * This test will send a request to the server using the greetServer method in + * GreetingService and verify the response. + */ + public void testGreetingService() { + + } + + +} diff --git a/src/test/resources/org/gcube/portlets/admin/resourcemanagement/ResourceManagementPortletJUnit.gwt.xml b/src/test/resources/org/gcube/portlets/admin/resourcemanagement/ResourceManagementPortletJUnit.gwt.xml new file mode 100644 index 0000000..ef3b0f5 --- /dev/null +++ b/src/test/resources/org/gcube/portlets/admin/resourcemanagement/ResourceManagementPortletJUnit.gwt.xml @@ -0,0 +1,9 @@ + + + + + + + + +