diff --git a/.classpath b/.classpath new file mode 100644 index 0000000..15fcc7d --- /dev/null +++ b/.classpath @@ -0,0 +1,38 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/.project b/.project new file mode 100644 index 0000000..adb7cef --- /dev/null +++ b/.project @@ -0,0 +1,64 @@ + + + data-miner-executor + + + + + + org.eclipse.wst.jsdt.core.javascriptValidator + + + + + org.eclipse.jdt.core.javabuilder + + + + + org.eclipse.wst.common.project.facet.core.builder + + + + + org.eclipse.wst.validation.validationbuilder + + + + + com.google.gdt.eclipse.core.webAppProjectValidator + + + + + com.google.gwt.eclipse.core.gwtProjectValidator + + + + + org.eclipse.pde.ManifestBuilder + + + + + org.eclipse.pde.SchemaBuilder + + + + + org.eclipse.m2e.core.maven2Builder + + + + + + org.eclipse.m2e.core.maven2Nature + org.eclipse.jem.workbench.JavaEMFNature + org.eclipse.wst.common.modulecore.ModuleCoreNature + org.eclipse.jdt.core.javanature + org.eclipse.wst.common.project.facet.core.nature + com.google.gwt.eclipse.core.gwtNature + org.eclipse.wst.jsdt.core.jsNature + org.eclipse.pde.PluginNature + + diff --git a/.settings/org.eclipse.core.resources.prefs b/.settings/org.eclipse.core.resources.prefs new file mode 100644 index 0000000..29abf99 --- /dev/null +++ b/.settings/org.eclipse.core.resources.prefs @@ -0,0 +1,6 @@ +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..b257af7 --- /dev/null +++ b/.settings/org.eclipse.jdt.core.prefs @@ -0,0 +1,8 @@ +eclipse.preferences.version=1 +org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled +org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.8 +org.eclipse.jdt.core.compiler.compliance=1.7 +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.7 diff --git a/.settings/org.eclipse.m2e.core.prefs b/.settings/org.eclipse.m2e.core.prefs new file mode 100644 index 0000000..f897a7f --- /dev/null +++ b/.settings/org.eclipse.m2e.core.prefs @@ -0,0 +1,4 @@ +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..08bc278 --- /dev/null +++ b/.settings/org.eclipse.wst.common.component @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/.settings/org.eclipse.wst.common.project.facet.core.prefs.xml b/.settings/org.eclipse.wst.common.project.facet.core.prefs.xml new file mode 100644 index 0000000..cc81385 --- /dev/null +++ b/.settings/org.eclipse.wst.common.project.facet.core.prefs.xml @@ -0,0 +1,7 @@ + + + + + + + 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..f7f0893 --- /dev/null +++ b/.settings/org.eclipse.wst.common.project.facet.core.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/.settings/org.eclipse.wst.validation.prefs b/.settings/org.eclipse.wst.validation.prefs new file mode 100644 index 0000000..04cad8c --- /dev/null +++ b/.settings/org.eclipse.wst.validation.prefs @@ -0,0 +1,2 @@ +disabled=06target +eclipse.preferences.version=1 diff --git a/distro/LICENSE b/distro/LICENSE new file mode 100644 index 0000000..2d9616a --- /dev/null +++ b/distro/LICENSE @@ -0,0 +1 @@ +${gcube.license} \ No newline at end of file diff --git a/distro/README b/distro/README new file mode 100644 index 0000000..21a6f3b --- /dev/null +++ b/distro/README @@ -0,0 +1,68 @@ +The gCube System - ${name} +-------------------------------------------------- + +${description} + + +${gcube.description} + +${gcube.funding} + + +Version +-------------------------------------------------- + +${version} (${buildDate}) + +Please see the file named "changelog.xml" in this directory for the release notes. + + +Authors +-------------------------------------------------- + +* Giancarlo Panichi (giancarlo.panichi-AT-isti.cnr.it), + Istituto di Scienza e Tecnologie dell'Informazione "A. Faedo" CNR, Pisa IT + + +Maintainers +----------- + +* Giancarlo Panichi (giancarlo.panichi-AT-isti.cnr.it), + Istituto di Scienza e Tecnologie dell'Informazione "A. Faedo" CNR, Pisa IT + + +Download information +-------------------------------------------------- + +Source code is available from SVN: + ${scm.url} + +Binaries can be downloaded from the gCube website: + ${gcube.website} + + +Installation +-------------------------------------------------- + +Installation documentation is available on-line in the gCube Wiki: + https://gcube.wiki.gcube-system.org/gcube/Data_Miner_Manager + + +Documentation +-------------------------------------------------- + +Documentation is available on-line in the gCube Wiki: + https://gcube.wiki.gcube-system.org/gcube/Data_Miner_Manager + + +Support +-------------------------------------------------- + +Bugs and support requests can be reported in the gCube issue tracking tool: + ${gcube.issueTracking} + + +Licensing +-------------------------------------------------- + +This software is licensed under the terms you may find in the file named "LICENSE" in this directory. diff --git a/distro/changelog.xml b/distro/changelog.xml new file mode 100644 index 0000000..d6224c6 --- /dev/null +++ b/distro/changelog.xml @@ -0,0 +1,5 @@ + + + First release + + \ No newline at end of file diff --git a/distro/descriptor.xml b/distro/descriptor.xml new file mode 100644 index 0000000..b468e51 --- /dev/null +++ b/distro/descriptor.xml @@ -0,0 +1,32 @@ + + servicearchive + + tar.gz + + / + + + ${distroDirectory} + / + true + + README + LICENSE + changelog.xml + profile.xml + + 755 + true + + + + + target/${build.finalName}.${project.packaging} + /${artifactId} + + + + \ No newline at end of file diff --git a/distro/profile.xml b/distro/profile.xml new file mode 100644 index 0000000..6a7af9b --- /dev/null +++ b/distro/profile.xml @@ -0,0 +1,29 @@ + + + + Service + + ${project.description} + PortletsUser + ${project.artifactId} + 1.0.0 + + + ${project.description} + ${project.artifactId} + ${version} + + ${project.groupId} + ${project.artifactId} + ${project.version} + + webapplication + + ${project.build.finalName}.${project.packaging} + + + + + + + diff --git a/pom.xml b/pom.xml new file mode 100644 index 0000000..e447f83 --- /dev/null +++ b/pom.xml @@ -0,0 +1,385 @@ + + 4.0.0 + + + + maven-parent + org.gcube.tools + 1.0.0 + + + + org.gcube.portlets.user + data-miner-executor + 1.0.0-SNAPSHOT + war + + data-miner-executor + data-miner-executor allows the execution of an algorithm. + + + https://svn.d4science.research-infrastructures.eu/gcube/trunk/portlets/user/data-miner-executor + + + + + + Giancarlo Panichi + g.panichi@isti.cnr.it + CNR Pisa, Istituto di Scienza e Tecnologie dell'Informazione "A. Faedo" + + architect + developer + + + + + + ${project.build.directory}/${project.build.finalName} + distro + config + + + + 1.7 + 1.8 + + + + 2.6.1 + 3.3.2 + 3.1.1 + 2.6.1 + + ${env.KEYS} + + UTF-8 + UTF-8 + + + + + localRun + + + + org.slf4j + slf4j-api + compile + + + org.slf4j + slf4j-log4j12 + runtime + + + + xerces + xerces + 2.4.0 + + + + + + org.gcube.common + storagehub-client-library + runtime + + + + + org.gcube.common + common-authorization + runtime + + + + org.gcube.common + authorization-client + runtime + + + + + + + + + + + com.google.gwt + gwt-user + ${gwtVersion} + provided + + + + com.google.gwt + gwt-servlet + ${gwtVersion} + + + + + + com.sencha.gxt + gxt + ${gxtVersion} + + + + + + javax.portlet + portlet-api + + + + + + org.gcube.core + common-scope-maps + compile + + + + org.gcube.common.portal + portal-manager + provided + + + + org.gcube.dvos + usermanagement-core + provided + + + + org.gcube.portal + client-context-library + [1.0.0-SNAPSHOT,) + compile + + + + + + + org.gcube.common + common-authorization + provided + + + + org.gcube.common + authorization-client + provided + + + + + org.gcube.common + storagehub-client-library + compile + + + + + org.gcube.resources.discovery + ic-client + + + + + org.gcube.data.analysis + data-miner-manager-cl + [1.4.0-SNAPSHOT, 2.0.0-SNAPSHOT) + + + + + + org.gcube.common + csv4j + [1.2.0-SNAPSHOT, 2.0.0-SNAPSHOT) + + + + + + + org.gcube.portlets.widgets + workspace-explorer + [2.0.0-SNAPSHOT,3.0.0-SNAPSHOT) + + + + + org.gcube.portlets.widgets + workspace-uploader + [1.0.0-SNAPSHOT,3.0.0-SNAPSHOT) + + + + + org.gcube.portlets.widgets + openlayer-basic-widgets + [1.0.0-SNAPSHOT,2.0.0-SNAPSHOT) + + + + + org.gcube.portlets.widgets + netcdf-basic-widgets + [1.0.0-SNAPSHOT,2.0.0-SNAPSHOT) + + + + + org.gcube.data.analysis + dataminer-invocation-model + [0.1.0-SNAPSHOT,2.0.0-SNAPSHOT) + + + + + org.projectlombok + lombok + 1.14.4 + + + + + com.allen-sauer.gwt.log + gwt-log + ${gwtLogVersion} + + + + org.slf4j + slf4j-api + provided + + + org.slf4j + slf4j-log4j12 + provided + + + + junit + junit + [3.0.0,4.0.0) + test + + + + + + + + + org.gcube.distribution + maven-portal-bom + LATEST + pom + import + + + + + + + ${webappDirectory}/WEB-INF/classes + + + src/main/resources + + **/*.* + + + + + + + + + + + org.codehaus.mojo + gwt-maven-plugin + ${gwtVersion} + + + + + + + compile + test + + + + + DataMinerExecutor.html + ${webappDirectory} + org.gcube.portlets.user.dataminerexecutor.dataminerexecutor + + + + + + + + org.apache.maven.plugins + maven-war-plugin + 2.1.1 + + + compile + + + + ${webappDirectory} + ${project.build.finalName} + + + + + + + org.apache.maven.plugins + maven-compiler-plugin + 2.3.2 + + ${maven.compiler.source} + ${maven.compiler.target} + + + + + org.apache.maven.plugins + maven-assembly-plugin + + + ${distroDirectory}/descriptor.xml + + + + + servicearchive + install + + single + + + + + + + + + + \ No newline at end of file diff --git a/src/main/java/org/gcube/portlets/user/dataminerexecutor/client/DataMinerExecutor.java b/src/main/java/org/gcube/portlets/user/dataminerexecutor/client/DataMinerExecutor.java new file mode 100644 index 0000000..259ae89 --- /dev/null +++ b/src/main/java/org/gcube/portlets/user/dataminerexecutor/client/DataMinerExecutor.java @@ -0,0 +1,209 @@ +package org.gcube.portlets.user.dataminerexecutor.client; + +import org.gcube.portlets.user.dataminerexecutor.client.common.EventBusProvider; +import org.gcube.portlets.user.dataminerexecutor.client.events.InvocationModelRequestEvent; +import org.gcube.portlets.user.dataminerexecutor.client.events.MenuSwitchEvent; +import org.gcube.portlets.user.dataminerexecutor.client.experiments.ExperimentPanel; +import org.gcube.portlets.user.dataminerexecutor.client.resources.Resources; + +import com.allen_sauer.gwt.log.client.Log; +import com.google.gwt.core.client.EntryPoint; +import com.google.gwt.core.client.GWT; +import com.google.gwt.core.client.Scheduler; +import com.google.gwt.core.client.Scheduler.ScheduledCommand; +import com.google.gwt.user.client.Command; +import com.google.gwt.user.client.ui.RootPanel; +import com.sencha.gxt.core.client.util.Margins; +import com.sencha.gxt.widget.core.client.container.BorderLayoutContainer; +import com.sencha.gxt.widget.core.client.container.BorderLayoutContainer.BorderLayoutData; +import com.sencha.gxt.widget.core.client.container.MarginData; +import com.sencha.gxt.widget.core.client.container.SimpleContainer; +import com.sencha.gxt.widget.core.client.container.Viewport; + +/** + * Entry point classes define onModuleLoad(). + */ +public class DataMinerExecutor implements EntryPoint { + public static final Resources resources = GWT.create(Resources.class); + + private static final String SM_DIV = "contentDiv"; + private DataMinerExecutorController dataMinerExecutorController; + + private Header header; + //private HomePanel homePanel; + private ExperimentPanel experimentPanel; + + //private SimpleContainer previousPanel; + private SimpleContainer centerPanel; + + /** + * {@inheritDoc} + */ + public void onModuleLoad() { + + /* + * Install an UncaughtExceptionHandler which will produce + * FATAL log messages + */ + Log.setUncaughtExceptionHandler(); + + // use deferred command to catch initialization exceptions in + // onModuleLoad2 + Scheduler.get().scheduleDeferred(new ScheduledCommand() { + public void execute() { + // loadScope(); + loadMainPanel(); + } + }); + + } + + /* + * private void loadScope() { + * ClientScopeHelper.getService().setScope(Location.getHref(), new + * AsyncCallback() { + * + * @Override public void onSuccess(Boolean result) { if (result) { + * loadMainPanel(); } else { UtilsGXT3 .info("Attention", + * "ClientScopeHelper has returned a false value!"); } } + * + * @Override public void onFailure(Throwable caught) { + * UtilsGXT3.alert("Error", "Error setting scope: " + + * caught.getLocalizedMessage()); caught.printStackTrace(); } }); + * + * } + */ + + private void loadMainPanel() { + Log.info("DataMinerExecutor"); + + dataMinerExecutorController = new DataMinerExecutorController(); + //homePanel = new HomePanel(); + experimentPanel = new ExperimentPanel(); + + bind(); + + // Layout + final BorderLayoutContainer mainPanelLayout = new BorderLayoutContainer(); + mainPanelLayout.setId("mainPanelLayout"); + mainPanelLayout.setBorders(false); + mainPanelLayout.setResize(true); + mainPanelLayout.getElement().getStyle().setBackgroundColor("#FFFFFF"); + + // Center + centerPanel = new SimpleContainer(); + MarginData mainData = new MarginData(new Margins(0)); + mainPanelLayout.setCenterWidget(centerPanel, mainData); + + // Menu + header = new Header(); + + BorderLayoutData menuData = new BorderLayoutData(40); + menuData.setMargins(new Margins(5)); + menuData.setCollapsible(false); + menuData.setSplit(false); + + mainPanelLayout.setNorthWidget(header, menuData); + + // + + if (dataMinerExecutorController.getDataMinerInvocationModelFileUrl() != null + && !dataMinerExecutorController.getDataMinerInvocationModelFileUrl().isEmpty()) { + centerPanel.add(experimentPanel); + } + + + bindWindow(mainPanelLayout); + + + Scheduler.get().scheduleDeferred(new Command() { + + public void execute() { + mainPanelLayout.forceLayout(); + EventBusProvider.INSTANCE.fireEvent(new InvocationModelRequestEvent()); + } + }); + + + } + + private void bind() { + EventBusProvider.INSTANCE.addHandler(MenuSwitchEvent.TYPE, + new MenuSwitchEvent.MenuSwitchEventHandler() { + + @Override + public void onSelect(MenuSwitchEvent event) { + Log.debug("Catch MenuSwitchEvent"); + menuSwitch(event); + + } + }); + } + + /** + * + * @param mainWidget + */ + private void bindWindow(BorderLayoutContainer mainWidget) { + try { + RootPanel root = RootPanel.get(SM_DIV); + Log.info("Root Panel: " + root); + if (root == null) { + Log.info("Div with id " + SM_DIV + + " not found, starting in dev mode"); + Viewport viewport = new Viewport(); + viewport.setWidget(mainWidget); + viewport.onResize(); + RootPanel.get().add(viewport); + } else { + Log.info("Application div with id " + SM_DIV + + " found, starting in portal mode"); + PortalViewport viewport = new PortalViewport(); + Log.info("Created Viewport"); + viewport.setEnableScroll(false); + viewport.setWidget(mainWidget); + Log.info("Set Widget"); + Log.info("getOffsetWidth(): " + viewport.getOffsetWidth()); + Log.info("getOffsetHeight(): " + viewport.getOffsetHeight()); + viewport.onResize(); + root.add(viewport); + Log.info("Added viewport to root"); + } + } catch (Exception e) { + e.printStackTrace(); + Log.error("Error in attach viewport:" + e.getLocalizedMessage()); + } + } + + /** + * + * @param event + */ + private void menuSwitch(MenuSwitchEvent event) { + if (event == null || event.getMenuType() == null) { + return; + } + + switch (event.getMenuType()) { + case EXPERIMENT: + switchPanel(experimentPanel); + break; + default: + break; + + } + + } + + /** + * + * @param panel + */ + private void switchPanel(SimpleContainer panel) { + /*centerPanel.remove(previousPanel); + centerPanel.add(panel); + centerPanel.forceLayout(); + previousPanel = panel;*/ + } + +} diff --git a/src/main/java/org/gcube/portlets/user/dataminerexecutor/client/DataMinerExecutorController.java b/src/main/java/org/gcube/portlets/user/dataminerexecutor/client/DataMinerExecutorController.java new file mode 100644 index 0000000..9258eee --- /dev/null +++ b/src/main/java/org/gcube/portlets/user/dataminerexecutor/client/DataMinerExecutorController.java @@ -0,0 +1,490 @@ +package org.gcube.portlets.user.dataminerexecutor.client; + +import org.gcube.data.analysis.dataminermanagercl.shared.data.OutputData; +import org.gcube.data.analysis.dataminermanagercl.shared.data.computations.ComputationData; +import org.gcube.data.analysis.dataminermanagercl.shared.data.computations.ComputationId; +import org.gcube.data.analysis.dataminermanagercl.shared.process.Operator; +import org.gcube.data.analysis.dataminermanagercl.shared.workspace.ItemDescription; +import org.gcube.portlets.user.dataminerexecutor.client.common.EventBusProvider; +import org.gcube.portlets.user.dataminerexecutor.client.events.CancelComputationExecutionRequestEvent; +import org.gcube.portlets.user.dataminerexecutor.client.events.CancelExecutionFromComputationsRequestEvent; +import org.gcube.portlets.user.dataminerexecutor.client.events.ComputationDataEvent; +import org.gcube.portlets.user.dataminerexecutor.client.events.ComputationDataRequestEvent; +import org.gcube.portlets.user.dataminerexecutor.client.events.DeleteItemRequestEvent; +import org.gcube.portlets.user.dataminerexecutor.client.events.InvocationModelEvent; +import org.gcube.portlets.user.dataminerexecutor.client.events.InvocationModelRequestEvent; +import org.gcube.portlets.user.dataminerexecutor.client.events.MenuEvent; +import org.gcube.portlets.user.dataminerexecutor.client.events.MenuSwitchEvent; +import org.gcube.portlets.user.dataminerexecutor.client.events.OutputDataEvent; +import org.gcube.portlets.user.dataminerexecutor.client.events.OutputDataRequestEvent; +import org.gcube.portlets.user.dataminerexecutor.client.events.ResubmitComputationExecutionEvent; +import org.gcube.portlets.user.dataminerexecutor.client.events.ResubmitComputationExecutionRequestEvent; +import org.gcube.portlets.user.dataminerexecutor.client.events.SessionExpiredEvent; +import org.gcube.portlets.user.dataminerexecutor.client.events.StartComputationExecutionEvent; +import org.gcube.portlets.user.dataminerexecutor.client.events.StartComputationExecutionRequestEvent; +import org.gcube.portlets.user.dataminerexecutor.client.monitor.StatusMonitor; +import org.gcube.portlets.user.dataminerexecutor.client.rpc.DataMinerExecutorServiceAsync; +import org.gcube.portlets.user.dataminerexecutor.client.type.MenuType; +import org.gcube.portlets.user.dataminerexecutor.client.util.InfoMessageBox; +import org.gcube.portlets.user.dataminerexecutor.client.util.UtilsGXT3; +import org.gcube.portlets.user.dataminerexecutor.shared.Constants; +import org.gcube.portlets.user.dataminerexecutor.shared.exception.SessionExpiredServiceException; +import org.gcube.portlets.user.dataminerexecutor.shared.session.UserInfo; + +import com.allen_sauer.gwt.log.client.Log; +import com.google.gwt.user.client.rpc.AsyncCallback; +import com.sencha.gxt.widget.core.client.box.AutoProgressMessageBox; +import com.sencha.gxt.widget.core.client.event.HideEvent; +import com.sencha.gxt.widget.core.client.event.HideEvent.HideHandler; + +/** + * + * @author Giancarlo Panichi + * + * + */ +public class DataMinerExecutorController { + private UserInfo userInfo; + private String invocationModelFileUrl; + + public DataMinerExecutorController() { + restoreUISession(); + bind(); + callHello(); + checkSession(); + } + + public UserInfo getUserInfo() { + return userInfo; + } + + public String getDataMinerInvocationModelFileUrl() { + return invocationModelFileUrl; + } + + private void checkSession() { + // if you do not need to something when the session expire + // CheckSession.getInstance().startPolling(); + } + + private void sessionExpiredShow() { + // CheckSession.showLogoutDialog(); + } + + /* + * private void sessionExpiredShowDelayed() { Timer timeoutTimer = new + * Timer() { public void run() { sessionExpiredShow(); + * + * } }; int TIMEOUT = 3; // 3 second timeout + * + * timeoutTimer.schedule(TIMEOUT * 1000); // timeout is in milliseconds + * + * } + */ + + private void bind() { + + EventBusProvider.INSTANCE.addHandler(SessionExpiredEvent.TYPE, + new SessionExpiredEvent.SessionExpiredEventHandler() { + + @Override + public void onChange(SessionExpiredEvent event) { + Log.debug("Catch SessionExpiredEvent"); + sessionExpiredShow(); + + } + }); + + EventBusProvider.INSTANCE.addHandler(MenuEvent.TYPE, new MenuEvent.MenuEventHandler() { + + @Override + public void onSelect(MenuEvent event) { + Log.debug("Catch MenuEvent:" + event); + // manageMenuEvent(event); + + } + }); + + EventBusProvider.INSTANCE.addHandler(StartComputationExecutionRequestEvent.TYPE, + new StartComputationExecutionRequestEvent.StartComputationExecutionRequestEventHandler() { + + @Override + public void onStart(StartComputationExecutionRequestEvent event) { + Log.debug("Catch StartComputationExecutionRequestEvent: " + event); + startComputationRequest(event); + + } + }); + + EventBusProvider.INSTANCE.addHandler(CancelComputationExecutionRequestEvent.TYPE, + new CancelComputationExecutionRequestEvent.CancelComputationExecutionRequestEventHandler() { + + @Override + public void onCancel(CancelComputationExecutionRequestEvent event) { + Log.debug("Catch CancelComputationRequestEvent: " + event); + cancelComputationRequest(event); + + } + }); + + EventBusProvider.INSTANCE.addHandler(CancelExecutionFromComputationsRequestEvent.TYPE, + new CancelExecutionFromComputationsRequestEvent.CancelExecutionFromComputationsRequestEventHandler() { + + @Override + public void onCancel(CancelExecutionFromComputationsRequestEvent event) { + Log.debug("Catch CancelExecutionFromComputationsRequestEvent: " + event); + cancelExecutionFromComputationsRequest(event); + + } + + }); + + EventBusProvider.INSTANCE.addHandler(ResubmitComputationExecutionRequestEvent.TYPE, + new ResubmitComputationExecutionRequestEvent.ResubmitComputationExecutionRequestEventHandler() { + + @Override + public void onResubmit(ResubmitComputationExecutionRequestEvent event) { + Log.debug("Catch ResubmitComputationExecutionRequestEvent: " + event); + resubmitComputationRequest(event); + + } + + }); + + EventBusProvider.INSTANCE.addHandler(OutputDataRequestEvent.TYPE, + new OutputDataRequestEvent.OutputDataRequestEventHandler() { + + @Override + public void onOutputRequest(OutputDataRequestEvent event) { + Log.debug("Catch OutputDataRequestEvent: " + event); + manageOutputDataRequestEvent(event); + + } + + }); + + EventBusProvider.INSTANCE.addHandler(ComputationDataRequestEvent.TYPE, + new ComputationDataRequestEvent.ComputationDataRequestEventHandler() { + + @Override + public void onComputationDataRequest(ComputationDataRequestEvent event) { + Log.debug("Catch ComputationDataRequestEvent: " + event); + manageComputationDataRequestEvent(event); + + } + + }); + + EventBusProvider.INSTANCE.addHandler(InvocationModelRequestEvent.TYPE, + new InvocationModelRequestEvent.InvocationModelRequestEventHandler() { + + @Override + public void onInvocationRequest(InvocationModelRequestEvent event) { + Log.debug("Catch InvocationModelRequestEvent: " + event); + getDataMinerInvocationModelRequest(); + + } + }); + + EventBusProvider.INSTANCE.addHandler(DeleteItemRequestEvent.TYPE, + new DeleteItemRequestEvent.DeleteItemRequestEventHandler() { + + @Override + public void onDeleteRequest(DeleteItemRequestEvent event) { + Log.debug("Catch DeleteItemRequestEvent: " + event); + // deleteItemRequest(event); + + } + + }); + + } + + private void restoreUISession() { + // checkLocale(); + invocationModelFileUrl = com.google.gwt.user.client.Window.Location + .getParameter(Constants.DATA_MINER_EXECUTOR_INVOCATION_MODEL); + } + + private void callHello() { + + DataMinerExecutorServiceAsync.INSTANCE.hello(new AsyncCallback() { + + @Override + public void onFailure(Throwable caught) { + if (caught instanceof SessionExpiredServiceException) { + UtilsGXT3.alert("Error", "Expired Session!"); + EventBusProvider.INSTANCE.fireEvent(new SessionExpiredEvent()); + } else { + UtilsGXT3.alert("Error", "No user found: " + caught.getLocalizedMessage()); + } + } + + @Override + public void onSuccess(UserInfo result) { + userInfo = result; + Log.info("Hello: " + userInfo.getUsername()); + } + + }); + + } + + /* + * private void manageMenuEvent(MenuEvent event) { + * Log.debug("CurrentVisualization=" + currentVisualization); if (event == + * null || event.getMenuType() == null || (currentVisualization == null && + * event.getMenuType().compareTo(MenuType.HOME) == 0) || + * (currentVisualization != null && + * event.getMenuType().compareTo(currentVisualization) == 0)) { + * + * return; } currentVisualization = event.getMenuType(); MenuSwitchEvent + * menuSwitchEvent = new MenuSwitchEvent(event.getMenuType()); + * EventBusProvider.INSTANCE.fireEvent(menuSwitchEvent); } + */ + + private void startComputationRequest(final StartComputationExecutionRequestEvent event) { + DataMinerExecutorServiceAsync.INSTANCE.startComputation(event.getOp(), new AsyncCallback() { + + @Override + public void onFailure(Throwable caught) { + if (caught instanceof SessionExpiredServiceException) { + UtilsGXT3.alert("Error", "Expired Session!"); + EventBusProvider.INSTANCE.fireEvent(new SessionExpiredEvent()); + } else { + UtilsGXT3.alert("Error", "Failed start computation " + event.getOp().getName() + "! " + + caught.getLocalizedMessage()); + caught.printStackTrace(); + } + } + + @Override + public void onSuccess(ComputationId computationId) { + if (computationId == null) + UtilsGXT3.alert("Error", + "Failed start computation " + event.getOp().getName() + ", the computation id is null!"); + else { + startComputation(computationId, event.getComputationStatusPanelIndex()); + } + } + }); + + } + + private void startComputation(ComputationId computationId, int computationStatusPanelIndex) { + StartComputationExecutionEvent event = new StartComputationExecutionEvent(computationId, + computationStatusPanelIndex); + EventBusProvider.INSTANCE.fireEvent(event); + } + + private void cancelExecutionFromComputationsRequest(CancelExecutionFromComputationsRequestEvent event) { + final ItemDescription itemDescription = event.getItemDescription(); + DataMinerExecutorServiceAsync.INSTANCE.cancelComputation(itemDescription, new AsyncCallback() { + + @Override + public void onFailure(Throwable caught) { + if (caught instanceof SessionExpiredServiceException) { + UtilsGXT3.alert("Error", "Expired Session!"); + EventBusProvider.INSTANCE.fireEvent(new SessionExpiredEvent()); + } else { + Log.error("Error in cancenExecutionFromComputations:" + caught.getLocalizedMessage()); + UtilsGXT3.alert("Error", "Error in cancel computation " + itemDescription.getName() + ": " + + caught.getLocalizedMessage()); + } + + } + + @Override + public void onSuccess(String result) { + Log.debug("Computation Cancelled!"); + final InfoMessageBox d = new InfoMessageBox("Info", + "Computation cancellation request has been accepted!"); + d.addHideHandler(new HideHandler() { + + public void onHide(HideEvent event) { + // fireRefreshDataMinerWorkAreaEvent(DataMinerWorkAreaElementType.Computations); + } + }); + d.show(); + + } + }); + + } + + private void cancelComputationRequest(CancelComputationExecutionRequestEvent event) { + final ComputationId computationId = event.getComputationId(); + DataMinerExecutorServiceAsync.INSTANCE.cancelComputation(computationId, new AsyncCallback() { + + @Override + public void onFailure(Throwable caught) { + if (caught instanceof SessionExpiredServiceException) { + UtilsGXT3.alert("Error", "Expired Session!"); + EventBusProvider.INSTANCE.fireEvent(new SessionExpiredEvent()); + } else { + UtilsGXT3.alert("Error", "Error in cancel computation " + computationId.getId() + ": " + + caught.getLocalizedMessage()); + } + + } + + @Override + public void onSuccess(String result) { + Log.debug("Computation Cancelled!"); + + } + }); + } + + private void resubmitComputationRequest(final ResubmitComputationExecutionRequestEvent event) { + MenuSwitchEvent menuSwitchEvent = new MenuSwitchEvent(MenuType.EXPERIMENT); + EventBusProvider.INSTANCE.fireEvent(menuSwitchEvent); + + DataMinerExecutorServiceAsync.INSTANCE.resubmit(event.getItemDescription(), new AsyncCallback() { + + @Override + public void onFailure(Throwable caught) { + if (caught instanceof SessionExpiredServiceException) { + UtilsGXT3.alert("Error", "Expired Session!"); + EventBusProvider.INSTANCE.fireEvent(new SessionExpiredEvent()); + } else { + UtilsGXT3.alert("Error", "Failed to resubmit computation: " + caught.getMessage()); + } + } + + @Override + public void onSuccess(ComputationId result) { + if (result == null) + UtilsGXT3.alert("Error", "Failed to resubmit computation, the computation id is null!"); + else { + resubmitComputation(result); + } + + } + }); + } + + private void resubmitComputation(ComputationId computationId) { + ResubmitComputationExecutionEvent event = new ResubmitComputationExecutionEvent(computationId); + EventBusProvider.INSTANCE.fireEvent(event); + } + + private void getDataMinerInvocationModelRequest() { + if (invocationModelFileUrl == null || invocationModelFileUrl.isEmpty()) { + Log.error("Invalid request, the invocation model has not been specified correctly: " + invocationModelFileUrl); + UtilsGXT3.alert("Error", "Invalid request, the invocation model has not been specified correctly!"); + } else { + final AutoProgressMessageBox messageBox = new AutoProgressMessageBox("Retrieve Info", + "Retrieving information, please wait..."); + messageBox.setProgressText("Loading..."); + messageBox.auto(); + messageBox.show(); + + DataMinerExecutorServiceAsync.INSTANCE.getInvocationModel(invocationModelFileUrl, + new AsyncCallback() { + + @Override + public void onFailure(Throwable caught) { + messageBox.hide(); + if (caught instanceof SessionExpiredServiceException) { + UtilsGXT3.alert("Error", "Expired Session"); + EventBusProvider.INSTANCE.fireEvent(new SessionExpiredEvent()); + } else { + UtilsGXT3.alert("Error", + "The VRE currently has problems loading the required operator using the invocation model specified!"); + Log.error( + "The VRE currently has problems loading the required operator using the invocation model specified: " + + caught.getLocalizedMessage(),caught); + + } + + } + + @Override + public void onSuccess(Operator operator) { + messageBox.hide(); + Log.debug("Invocation Retrieved: " + operator); + InvocationModelEvent event = new InvocationModelEvent(operator); + Log.debug("Fire: " + event); + EventBusProvider.INSTANCE.fireEvent(event); + } + + }); + } + } + + private void manageOutputDataRequestEvent(OutputDataRequestEvent event) { + if (event == null) { + UtilsGXT3.alert("Error", "Invalid output request!"); + } else { + if (event.getComputationId() == null || event.getComputationId().getId() == null + || event.getComputationId().getId().isEmpty()) { + UtilsGXT3.alert("Error", "Invalid output request, computation id: " + event.getComputationId()); + } else { + final StatusMonitor monitor = new StatusMonitor(); + DataMinerExecutorServiceAsync.INSTANCE.getOutputDataByComputationId(event.getComputationId(), + new AsyncCallback() { + @Override + public void onSuccess(OutputData outputData) { + monitor.hide(); + fireOutputDataEvent(outputData); + } + + @Override + public void onFailure(Throwable caught) { + monitor.hide(); + Log.error("Error in getResourceByComputationId: " + caught.getLocalizedMessage()); + UtilsGXT3.alert("Error", + "Impossible to retrieve output info. " + caught.getLocalizedMessage()); + + } + }); + } + } + } + + private void fireOutputDataEvent(OutputData outputData) { + OutputDataEvent event = new OutputDataEvent(outputData); + EventBusProvider.INSTANCE.fireEvent(event); + + } + + private void manageComputationDataRequestEvent(ComputationDataRequestEvent event) { + if (event == null) { + UtilsGXT3.alert("Error", "Invalid computation info request!"); + } else { + if (event.getItemDescription() == null || event.getItemDescription().getId() == null + || event.getItemDescription().getId().isEmpty()) { + UtilsGXT3.alert("Error", + "Invalid computation info request, item description: " + event.getItemDescription()); + } else { + final StatusMonitor monitor = new StatusMonitor(); + DataMinerExecutorServiceAsync.INSTANCE.getComputationData(event.getItemDescription(), + new AsyncCallback() { + @Override + public void onSuccess(ComputationData computationData) { + monitor.hide(); + fireComputationDataEvent(computationData); + } + + @Override + public void onFailure(Throwable caught) { + monitor.hide(); + Log.error("Error in getComputationData: " + caught.getLocalizedMessage()); + caught.printStackTrace(); + UtilsGXT3.alert("Error", + "Impossible to retrieve computation info. " + caught.getLocalizedMessage()); + + } + }); + } + } + } + + private void fireComputationDataEvent(ComputationData computationData) { + ComputationDataEvent event = new ComputationDataEvent(computationData); + EventBusProvider.INSTANCE.fireEvent(event); + + } + +} \ No newline at end of file diff --git a/src/main/java/org/gcube/portlets/user/dataminerexecutor/client/Header.java b/src/main/java/org/gcube/portlets/user/dataminerexecutor/client/Header.java new file mode 100644 index 0000000..0267e6b --- /dev/null +++ b/src/main/java/org/gcube/portlets/user/dataminerexecutor/client/Header.java @@ -0,0 +1,181 @@ +/** + * + */ +package org.gcube.portlets.user.dataminerexecutor.client; + +import org.gcube.portlets.user.dataminerexecutor.client.common.EventBusProvider; +import org.gcube.portlets.user.dataminerexecutor.client.events.MenuSwitchEvent; +import org.gcube.portlets.user.dataminerexecutor.client.type.MenuType; +import org.gcube.portlets.user.dataminerexecutor.client.util.UtilsGXT3; + +import com.allen_sauer.gwt.log.client.Log; +import com.google.gwt.event.dom.client.ClickEvent; +import com.google.gwt.event.dom.client.ClickHandler; +import com.google.gwt.resources.client.ResourceCallback; +import com.google.gwt.resources.client.ResourceException; +import com.google.gwt.resources.client.TextResource; +import com.google.gwt.user.client.Window; +import com.google.gwt.user.client.ui.HorizontalPanel; +import com.google.gwt.user.client.ui.Image; + +/** + * + * @author Giancarlo Panichi + * + * + */ +public class Header extends HorizontalPanel { + + // private Image menuGoBack; + //private Image menuExperiment; + private Image menuHelp; + //private Enum currentSelection; + + public Header() { + super(); + create(); + bind(); + } + + private void bind() { + EventBusProvider.INSTANCE.addHandler(MenuSwitchEvent.TYPE, new MenuSwitchEvent.MenuSwitchEventHandler() { + + @Override + public void onSelect(MenuSwitchEvent event) { + Log.debug("Catch MenuSwitchEvent"); + + + } + }); + } + + private void create() { + // this.setStyleAttribute("background-color", "#FFFFFF"); + Image logo = new Image(DataMinerExecutor.resources.logoLittle()); + logo.setAltText("Data Miner Executor"); + logo.setTitle("Data Miner Executor"); + logo.addStyleName("menuImgLogo"); + + /* + * menuGoBack = new Image(DataMinerExecutor.resources.goBack()); + * menuGoBack.addStyleName("menuItemImage"); + * menuGoBack.addClickHandler(new ClickHandler() { + * + * @Override public void onClick(ClickEvent event) { MenuEvent menuEvent + * = new MenuEvent(MenuType.HOME); + * EventBusProvider.INSTANCE.fireEvent(menuEvent); + * + * } }); + */ + + /*menuExperiment = new Image(DataMinerExecutor.resources.menuItemExperiment()); + menuExperiment.addStyleName("menuItemImage"); + menuExperiment.addClickHandler(new ClickHandler() { + @Override + public void onClick(ClickEvent event) { + Log.debug("Click Menu Experiment"); + MenuEvent menuEvent = new MenuEvent(MenuType.EXPERIMENT); + EventBusProvider.INSTANCE.fireEvent(menuEvent); + } + });*/ + + menuHelp = new Image(DataMinerExecutor.resources.menuItemHelp()); + menuHelp.addStyleName("menuItemImage"); + menuHelp.addClickHandler(new ClickHandler() { + + @Override + public void onClick(ClickEvent event) { + Log.debug("Click Menu Help"); + showHelp(); + } + }); + + add(logo); + // add(menuGoBack); + //add(menuExperiment); + add(menuHelp); + + this.setCellWidth(logo, "100px"); + // this.setCellWidth(menuGoBack, "100px"); + //this.setCellWidth(menuExperiment, "80px"); // + this.setCellWidth(menuHelp, "80px"); + + // menuGoBack.setVisible(false); + //menuExperiment.setVisible(true); + menuHelp.setVisible(true); + } + + public void setMenu(MenuType menuType) { + Log.debug("SetMenu: " + menuType); + menuHelp.setVisible(true); + + /*if (currentSelection == null) { + // menuGoBack.setVisible(true); + //menuExperiment.setVisible(true); + } + + if (currentSelection != null && currentSelection.compareTo(MenuType.EXPERIMENT) == 0) + menuExperiment.removeStyleName("menuItemImage-selected"); + + Image imgNew = menuExperiment; + + imgNew.addStyleName("menuItemImage-selected"); + */ + //currentSelection = menuType; + return; + } + + /* + private void menuSwitch(MenuSwitchEvent event) { + Log.debug("MenuSwitch: " + event); + + if (event.getMenuType().compareTo(MenuType.HOME) == 0) { + // menuGoBack.setVisible(false); + menuExperiment.setVisible(false); + menuHelp.setVisible(false); + + if (currentSelection != null && currentSelection.compareTo(MenuType.EXPERIMENT) == 0) + menuExperiment.removeStyleName("menuItemImage-selected"); + } else { + if (currentSelection == null + || (currentSelection != null && currentSelection.compareTo(MenuType.HOME) == 0)) { + // menuGoBack.setVisible(true); + menuExperiment.setVisible(true); + menuHelp.setVisible(true); + } + + if (currentSelection != null && currentSelection.compareTo(MenuType.EXPERIMENT) == 0) + menuExperiment.removeStyleName("menuItemImage-selected"); + + Image imgNew = menuExperiment; + + imgNew.addStyleName("menuItemImage-selected"); + } + + currentSelection = event.getMenuType(); + return; + }*/ + + private void showHelp() { + try { + DataMinerExecutor.resources.wikiLink().getText(new ResourceCallback() { + public void onError(ResourceException e) { + Log.error("Error retrieving wiki link!: " + e.getLocalizedMessage()); + UtilsGXT3.alert("Error", "Error retrieving wiki link!"); + } + + public void onSuccess(TextResource r) { + String s = r.getText(); + Window.open(s, "DMExecutor Wiki", ""); + } + }); + } catch (ResourceException e) { + Log.error("Error retrieving wiki link!: " + e.getLocalizedMessage()); + UtilsGXT3.alert("Error", "Error retrieving wiki link!"); + e.printStackTrace(); + + } + + } + +} diff --git a/src/main/java/org/gcube/portlets/user/dataminerexecutor/client/HomePanel.java b/src/main/java/org/gcube/portlets/user/dataminerexecutor/client/HomePanel.java new file mode 100644 index 0000000..43194bf --- /dev/null +++ b/src/main/java/org/gcube/portlets/user/dataminerexecutor/client/HomePanel.java @@ -0,0 +1,124 @@ +package org.gcube.portlets.user.dataminerexecutor.client; + +import org.gcube.portlets.user.dataminerexecutor.client.common.EventBusProvider; +import org.gcube.portlets.user.dataminerexecutor.client.events.MenuEvent; +import org.gcube.portlets.user.dataminerexecutor.client.type.MenuType; + +import com.google.gwt.event.dom.client.MouseDownEvent; +import com.google.gwt.event.dom.client.MouseDownHandler; +import com.google.gwt.resources.client.ImageResource; +import com.google.gwt.user.client.ui.HTML; +import com.google.gwt.user.client.ui.Image; +import com.sencha.gxt.core.client.dom.ScrollSupport.ScrollMode; +import com.sencha.gxt.core.client.util.Margins; +import com.sencha.gxt.widget.core.client.container.BoxLayoutContainer.BoxLayoutData; +import com.sencha.gxt.widget.core.client.container.BoxLayoutContainer.BoxLayoutPack; +import com.sencha.gxt.widget.core.client.container.HBoxLayoutContainer; +import com.sencha.gxt.widget.core.client.container.HBoxLayoutContainer.HBoxLayoutAlign; +//import com.sencha.gxt.widget.core.client.container.HorizontalLayoutContainer.HorizontalLayoutData; +import com.sencha.gxt.widget.core.client.container.SimpleContainer; +import com.sencha.gxt.widget.core.client.container.VerticalLayoutContainer; +import com.sencha.gxt.widget.core.client.container.VerticalLayoutContainer.VerticalLayoutData; + +/** + * + * @author Giancarlo Panichi + * + * + */ +public class HomePanel extends SimpleContainer { + + public HomePanel() { + super(); + init(); + create(); + } + + private void init() { + setItemId("HomePanel"); + setStylePrimaryName("smMenu"); + //setBodyStyle("backgroundColor:white;"); + //addStyleName("smLayoutContainer"); + //setHeaderVisible(false); + setBorders(false); + //setBodyBorder(false); + + } + + private void create() { + VerticalLayoutContainer lc = new VerticalLayoutContainer(); + lc.setScrollMode(ScrollMode.AUTO); + + VerticalLayoutData layoutTop = new VerticalLayoutData(1, -1, + new Margins(20,0,10,0)); + //VerticalLayoutData layoutNext = new VerticalLayoutData(1, -1, + // new Margins(10,0,10,0)); + + SimpleContainer itemExperiment = createMenuItem( + "Execute an Experiment", + "This section allows to execute or prepare an online experiment or method. The section is endowed with a list of algorithms for executing models for various application domains.", + DataMinerExecutor.resources.executionIcon(), new MouseDownHandler() { + + @Override + public void onMouseDown(MouseDownEvent event) { + MenuEvent menuEvent=new MenuEvent(MenuType.EXPERIMENT); + EventBusProvider.INSTANCE.fireEvent(menuEvent); + + + + } + }); + + lc.add(itemExperiment, layoutTop); + + add(lc); + + } + + private SimpleContainer createMenuItem(String title, String description, + ImageResource imgResource, MouseDownHandler handle) { + HBoxLayoutContainer horiz=new HBoxLayoutContainer(HBoxLayoutAlign.MIDDLE); + horiz.setPack(BoxLayoutPack.CENTER); + horiz.setEnableOverflow(false); + + //HorizontalLayoutContainer horiz = new HorizontalLayoutContainer(); + + Image img = new Image(imgResource); + + HTML text = new HTML("" + title + "
" + description); + text.addStyleName("smMenuItemText"); + text.setWidth("400px"); + /*HorizontalLayoutData textLayoutData = new HorizontalLayoutData(400, + 140, new Margins(10, 5, 10, 10)); + HorizontalLayoutData imgLayoutData = new HorizontalLayoutData(140, 140, + new Margins(10, 10, 10, 5));*/ + + //horiz.add(text, textLayoutData); + //horiz.add(img, imgLayoutData); + + horiz.add(text, new BoxLayoutData(new Margins(0))); + horiz.add(img,new BoxLayoutData(new Margins(0))); + + + SimpleContainer container = new SimpleContainer(); + container.addDomHandler(handle, MouseDownEvent.getType()); + + container.setWidth(540); + container.setHeight(160); + container.addStyleName("smMenuItem"); + container.addStyleOnOver(container.getElement(), "smMenuItem:HOVER"); + container.add(horiz); + + SimpleContainer container2 = new SimpleContainer(); + HBoxLayoutContainer hbox=new HBoxLayoutContainer(HBoxLayoutAlign.MIDDLE); + hbox.setPack(BoxLayoutPack.CENTER); + hbox.setEnableOverflow(false); + hbox.add(container, new BoxLayoutData(new Margins(0))); + container2.add(hbox); + return container2; + } + + + + +} diff --git a/src/main/java/org/gcube/portlets/user/dataminerexecutor/client/PortalViewport.java b/src/main/java/org/gcube/portlets/user/dataminerexecutor/client/PortalViewport.java new file mode 100644 index 0000000..eef1833 --- /dev/null +++ b/src/main/java/org/gcube/portlets/user/dataminerexecutor/client/PortalViewport.java @@ -0,0 +1,153 @@ +/** + * + */ +package org.gcube.portlets.user.dataminerexecutor.client; + +import com.allen_sauer.gwt.log.client.Log; +import com.google.gwt.core.client.GWT; +import com.google.gwt.dom.client.Element; +import com.google.gwt.safehtml.shared.SafeHtmlBuilder; +import com.google.gwt.user.client.Window; +import com.sencha.gxt.core.client.dom.XDOM; +import com.sencha.gxt.core.client.dom.XElement; +import com.sencha.gxt.widget.core.client.container.SimpleContainer; +import com.sencha.gxt.widget.core.client.container.Viewport.ViewportAppearance; + +/** + * + * @author Giancarlo Panichi + * + * + */ +public class PortalViewport extends SimpleContainer { + + protected int rightScrollBarSize = 17; + + protected boolean enableScroll; + + + /** + * Creates a viewport layout container with the default appearance. + */ + public PortalViewport() { + this(GWT. create(ViewportAppearance.class)); + } + + /** + * Creates a viewport layout container with the specified appearance. + * + * @param appearance + * the appearance of the viewport layout container + */ + public PortalViewport(ViewportAppearance appearance) { + super(true); + try { + + SafeHtmlBuilder sb = new SafeHtmlBuilder(); + appearance.render(sb); + XElement element=XDOM.create(sb.toSafeHtml()); + setElement((Element)element); + monitorWindowResize = true; + forceLayoutOnResize = true; + getFocusSupport().setIgnore(false); + resize(); + } catch (Exception e) { + Log.error("PortalViewport: constructor error " + + e.getLocalizedMessage()); + } + } + + /** + * Returns true if window scrolling is enabled. + * + * @return true if window scrolling is enabled + */ + public boolean isEnableScroll() { + return enableScroll; + } + + /** + * Sets whether window scrolling is enabled. + * + * @param enableScroll + * true to enable window scrolling + */ + public void setEnableScroll(boolean enableScroll) { + this.enableScroll = enableScroll; + Window.enableScrolling(enableScroll); + } + + /** + * @return the rightScrollBarSize + */ + public int getRightScrollBarSize() { + return rightScrollBarSize; + } + + /** + * @param rightScrollBarSize + * the rightScrollBarSize to set + */ + public void setRightScrollBarSize(int rightScrollBarSize) { + this.rightScrollBarSize = rightScrollBarSize; + } + + @Override + protected void onAttach() { + super.onAttach(); + setEnableScroll(enableScroll); + resize(); + + } + + protected void resize() { + int viewWidth; + if(enableScroll){ + viewWidth= calculateWidth() - rightScrollBarSize; + } else { + viewWidth = calculateWidth(); + } + + int viewHeight = calculateHeight(); + Log.info("DataMiner resize viewWidth: " + viewWidth + " viewHeight: " + + viewHeight + " clientWidth: " + Window.getClientWidth() + + " clientHeight: " + Window.getClientHeight()); + try { + setPixelSize(viewWidth, viewHeight); + } catch (Exception e) { + Log.error("PortalViewport: error in resize() at setPixelSize " + + e.getLocalizedMessage()); + } + } + + /** + * {@inheritDoc} + */ + @Override + protected void onWindowResize(int width, int height) { + int viewWidth = calculateWidth(); + int viewHeight = calculateHeight(); + Log.trace("DataMiner onWindowResize viewWidth: " + viewWidth + + " viewHeight: " + viewHeight + " clientWidth: " + + Window.getClientWidth() + " clientHeight: " + + Window.getClientHeight()); + setPixelSize(viewWidth, viewHeight); + } + + + + protected int calculateWidth() { + int leftBorder = getAbsoluteLeft(); + Log.info("DataMiner width: " + + String.valueOf(Window.getClientWidth() - 2 * leftBorder)); + return Window.getClientWidth() - 2 * leftBorder; + } + + protected int calculateHeight() { + int topBorder = getAbsoluteTop(); + Log.info("DataMiner height: " + + String.valueOf(Window.getClientHeight() - topBorder - 34)); + return Window.getClientHeight() - topBorder - 34; + } + +} diff --git a/src/main/java/org/gcube/portlets/user/dataminerexecutor/client/common/EventBusProvider.java b/src/main/java/org/gcube/portlets/user/dataminerexecutor/client/common/EventBusProvider.java new file mode 100644 index 0000000..ab4bdae --- /dev/null +++ b/src/main/java/org/gcube/portlets/user/dataminerexecutor/client/common/EventBusProvider.java @@ -0,0 +1,19 @@ +/** + * + */ +package org.gcube.portlets.user.dataminerexecutor.client.common; + +import com.google.gwt.event.shared.EventBus; +import com.google.gwt.event.shared.SimpleEventBus; + +/** + * + * @author Giancarlo Panichi + * + * + */ +public class EventBusProvider { + + public static final EventBus INSTANCE = new SimpleEventBus(); + +} diff --git a/src/main/java/org/gcube/portlets/user/dataminerexecutor/client/custom/Gxt2ZIndexXDOM.java b/src/main/java/org/gcube/portlets/user/dataminerexecutor/client/custom/Gxt2ZIndexXDOM.java new file mode 100644 index 0000000..a969a9e --- /dev/null +++ b/src/main/java/org/gcube/portlets/user/dataminerexecutor/client/custom/Gxt2ZIndexXDOM.java @@ -0,0 +1,21 @@ +package org.gcube.portlets.user.dataminerexecutor.client.custom; + +/** + * Fix for z-index bug between GXT3 and GXT2 + * + * @author Giancarlo Panichi + * + * + */ +public class Gxt2ZIndexXDOM extends + com.sencha.gxt.core.client.dom.XDOM.XDOMImpl { + + /* + public int getTopZIndex() { + return com.extjs.gxt.ui.client.core.XDOM.getTopZIndex(); + } + + public int getTopZIndex(int i) { + return com.extjs.gxt.ui.client.core.XDOM.getTopZIndex(i); + }*/ +} \ No newline at end of file diff --git a/src/main/java/org/gcube/portlets/user/dataminerexecutor/client/custom/progress/GreenProgressBar.css b/src/main/java/org/gcube/portlets/user/dataminerexecutor/client/custom/progress/GreenProgressBar.css new file mode 100644 index 0000000..1e27d40 --- /dev/null +++ b/src/main/java/org/gcube/portlets/user/dataminerexecutor/client/custom/progress/GreenProgressBar.css @@ -0,0 +1,50 @@ +/** +* +*/ +.progressWrapGreen { + border: 1px solid #65cf81; + overflow: hidden; +} + +@sprite .progressInnerGreen { + background-color: #e0f3e5; + gwt-image: 'innerBarGreen'; + height: auto; + position: relative; +} + +@sprite .progressBarGreen { + background-color: #9ceeb0; + gwt-image: 'barGreen'; + background-repeat: repeat-x; + background-position: left center; + height: 18px; + border-top-color: #d1fdd9; + border-bottom-color: #7fe498; + border-right-color: #7fe498; +} + +.progressTextGreen { + color: #fff; + text-align: center; + font-size: 11px; + font-weight: bold; + font-family: sans-serif; + padding: 1px 5px; + overflow: hidden; + position: absolute; + z-index: 99; +} + +.progressTextBackGreen { + color: #399544 !important; + z-index: 9 !important; +} + +@if user.agent ie6 ie8 ie9 { + .progressTextBackGreen { + line-height: 15px; + color: #953941 !important; + z-index: 9 !important; + } +} \ No newline at end of file diff --git a/src/main/java/org/gcube/portlets/user/dataminerexecutor/client/custom/progress/GreenProgressBar.html b/src/main/java/org/gcube/portlets/user/dataminerexecutor/client/custom/progress/GreenProgressBar.html new file mode 100644 index 0000000..84e6165 --- /dev/null +++ b/src/main/java/org/gcube/portlets/user/dataminerexecutor/client/custom/progress/GreenProgressBar.html @@ -0,0 +1,12 @@ +
+
+
+
+
{text}
+
+
+
{text}
+
+
+
+
diff --git a/src/main/java/org/gcube/portlets/user/dataminerexecutor/client/custom/progress/GreenProgressBar.java b/src/main/java/org/gcube/portlets/user/dataminerexecutor/client/custom/progress/GreenProgressBar.java new file mode 100644 index 0000000..7dc2a2c --- /dev/null +++ b/src/main/java/org/gcube/portlets/user/dataminerexecutor/client/custom/progress/GreenProgressBar.java @@ -0,0 +1,18 @@ +package org.gcube.portlets.user.dataminerexecutor.client.custom.progress; + +import com.sencha.gxt.cell.core.client.ProgressBarCell; +import com.sencha.gxt.widget.core.client.ProgressBar; + +/** + * + * @author Giancarlo Panichi + * + * + */ +public class GreenProgressBar extends ProgressBar { + + public GreenProgressBar() { + super(new ProgressBarCell(new GreenProgressBarAppearance())); + } + +} diff --git a/src/main/java/org/gcube/portlets/user/dataminerexecutor/client/custom/progress/GreenProgressBarAppearance.java b/src/main/java/org/gcube/portlets/user/dataminerexecutor/client/custom/progress/GreenProgressBarAppearance.java new file mode 100644 index 0000000..1a75e41 --- /dev/null +++ b/src/main/java/org/gcube/portlets/user/dataminerexecutor/client/custom/progress/GreenProgressBarAppearance.java @@ -0,0 +1,132 @@ +package org.gcube.portlets.user.dataminerexecutor.client.custom.progress; + +import com.google.gwt.core.client.GWT; +import com.google.gwt.resources.client.ClientBundle; +import com.google.gwt.resources.client.CssResource; +import com.google.gwt.resources.client.ImageResource; +import com.google.gwt.resources.client.ImageResource.ImageOptions; +import com.google.gwt.resources.client.ImageResource.RepeatStyle; +import com.google.gwt.safecss.shared.SafeStyles; +import com.google.gwt.safecss.shared.SafeStylesUtils; +import com.google.gwt.safehtml.shared.SafeHtml; +import com.google.gwt.safehtml.shared.SafeHtmlBuilder; +import com.google.gwt.safehtml.shared.SafeHtmlUtils; +import com.sencha.gxt.cell.core.client.ProgressBarCell.ProgressBarAppearance; +import com.sencha.gxt.cell.core.client.ProgressBarCell.ProgressBarAppearanceOptions; +import com.sencha.gxt.core.client.GXT; +import com.sencha.gxt.core.client.XTemplates; +import com.sencha.gxt.core.client.util.Format; + +/** + * + * @author Giancarlo Panichi + * + * + */ +public class GreenProgressBarAppearance implements ProgressBarAppearance { + + public interface GreenProgressBarResources { + + ImageResource barGreen(); + + ImageResource innerBarGreen(); + + GreenProgressBarStyle style(); + + } + + public interface GreenProgressBarStyle extends CssResource { + + String progressBarGreen(); + + String progressInnerGreen(); + + String progressTextGreen(); + + String progressTextBackGreen(); + + String progressWrapGreen(); + + } + + public interface GreenProgressBarTemplate extends XTemplates { + + @XTemplate(source = "GreenProgressBar.html") + SafeHtml render(SafeHtml text, GreenProgressBarStyle style, + SafeStyles wrapStyles, SafeStyles progressBarStyles, + SafeStyles progressTextStyles, SafeStyles widthStyles); + + } + + public interface GreenProgressBarDefaultResources extends + GreenProgressBarResources, ClientBundle { + + @Source({ "GreenProgressBar.css" }) + @Override + GreenProgressBarStyle style(); + + @Source("green-progress-bg.gif") + @ImageOptions(repeatStyle = RepeatStyle.Horizontal) + @Override + ImageResource barGreen(); + + @Source("green-bg.gif") + @ImageOptions(repeatStyle = RepeatStyle.Horizontal) + @Override + ImageResource innerBarGreen(); + } + + private final GreenProgressBarStyle style; + private GreenProgressBarTemplate template; + + + public GreenProgressBarAppearance() { + this( + GWT. create(GreenProgressBarDefaultResources.class), + GWT. create(GreenProgressBarTemplate.class)); + } + + public GreenProgressBarAppearance(GreenProgressBarResources resources, + GreenProgressBarTemplate template) { + this.style = resources.style(); + this.style.ensureInjected(); + this.template = template; + } + + @Override + public void render(SafeHtmlBuilder sb, Double value, + ProgressBarAppearanceOptions options) { + value = value == null ? 0 : value; + double valueWidth = value * options.getWidth(); + + int vw = new Double(valueWidth).intValue(); + + String text = options.getProgressText(); + + if (text != null) { + int v = (int) Math.round(value * 100); + text = Format.substitute(text, v); + } + + SafeHtml txt; + if (text == null) { + txt = SafeHtmlUtils.fromSafeConstant(" "); + } else { + txt = SafeHtmlUtils.fromString(text); + } + + int adj = GXT.isIE() ? 4 : 2; + + SafeStyles wrapStyles = SafeStylesUtils.fromTrustedString("width:" + + (options.getWidth() - adj) + "px;"); + SafeStyles progressBarStyles = SafeStylesUtils + .fromTrustedString("width:" + vw + "px;"); + SafeStyles progressTextStyles = SafeStylesUtils + .fromTrustedString("width:" + Math.max(vw - 8, 0) + "px;"); + SafeStyles widthStyles = SafeStylesUtils.fromTrustedString("width:" + + (Math.max(0, options.getWidth() - adj)) + "px;"); + sb.append(template.render(txt, style, wrapStyles, progressBarStyles, + progressTextStyles, widthStyles)); + } + +} diff --git a/src/main/java/org/gcube/portlets/user/dataminerexecutor/client/custom/progress/OrangeProgressBar.css b/src/main/java/org/gcube/portlets/user/dataminerexecutor/client/custom/progress/OrangeProgressBar.css new file mode 100644 index 0000000..f98a880 --- /dev/null +++ b/src/main/java/org/gcube/portlets/user/dataminerexecutor/client/custom/progress/OrangeProgressBar.css @@ -0,0 +1,50 @@ +/** +* +*/ +.progressWrapOrange { + border: 1px solid #ffd075; + overflow: hidden; +} + +@sprite .progressInnerOrange { + background-color: #f3ede0; + gwt-image: 'innerBarOrange'; + height: auto; + position: relative; +} + +@sprite .progressBarOrange { + background-color: #ffdf9f; + gwt-image: 'barOrange'; + background-repeat: repeat-x; + background-position: left center; + height: 18px; + border-top-color: #fdefd1; + border-bottom-color: #f9d793; + border-right-color: #ffdd97; +} + +.progressTextOrange { + color: #fff; + text-align: center; + font-size: 11px; + font-weight: bold; + font-family: sans-serif; + padding: 1px 5px; + overflow: hidden; + position: absolute; + z-index: 99; +} + +.progressTextBackOrange { + color: #ffaf0d!important; + z-index: 9 !important; +} + +@if user.agent ie6 ie8 ie9 { + .progressTextBackOrange { + line-height: 15px; + color: #ffaa00!important; + z-index: 9 !important; + } +} \ No newline at end of file diff --git a/src/main/java/org/gcube/portlets/user/dataminerexecutor/client/custom/progress/OrangeProgressBar.html b/src/main/java/org/gcube/portlets/user/dataminerexecutor/client/custom/progress/OrangeProgressBar.html new file mode 100644 index 0000000..cfefcb6 --- /dev/null +++ b/src/main/java/org/gcube/portlets/user/dataminerexecutor/client/custom/progress/OrangeProgressBar.html @@ -0,0 +1,12 @@ +
+
+
+
+
{text}
+
+
+
{text}
+
+
+
+
diff --git a/src/main/java/org/gcube/portlets/user/dataminerexecutor/client/custom/progress/OrangeProgressBar.java b/src/main/java/org/gcube/portlets/user/dataminerexecutor/client/custom/progress/OrangeProgressBar.java new file mode 100644 index 0000000..88c7d1b --- /dev/null +++ b/src/main/java/org/gcube/portlets/user/dataminerexecutor/client/custom/progress/OrangeProgressBar.java @@ -0,0 +1,18 @@ +package org.gcube.portlets.user.dataminerexecutor.client.custom.progress; + +import com.sencha.gxt.cell.core.client.ProgressBarCell; +import com.sencha.gxt.widget.core.client.ProgressBar; + +/** + * + * @author Giancarlo Panichi + * + * + */ +public class OrangeProgressBar extends ProgressBar { + + public OrangeProgressBar() { + super(new ProgressBarCell(new OrangeProgressBarAppearance())); + } + +} diff --git a/src/main/java/org/gcube/portlets/user/dataminerexecutor/client/custom/progress/OrangeProgressBarAppearance.java b/src/main/java/org/gcube/portlets/user/dataminerexecutor/client/custom/progress/OrangeProgressBarAppearance.java new file mode 100644 index 0000000..26f659f --- /dev/null +++ b/src/main/java/org/gcube/portlets/user/dataminerexecutor/client/custom/progress/OrangeProgressBarAppearance.java @@ -0,0 +1,132 @@ +package org.gcube.portlets.user.dataminerexecutor.client.custom.progress; + +import com.google.gwt.core.client.GWT; +import com.google.gwt.resources.client.ClientBundle; +import com.google.gwt.resources.client.CssResource; +import com.google.gwt.resources.client.ImageResource; +import com.google.gwt.resources.client.ImageResource.ImageOptions; +import com.google.gwt.resources.client.ImageResource.RepeatStyle; +import com.google.gwt.safecss.shared.SafeStyles; +import com.google.gwt.safecss.shared.SafeStylesUtils; +import com.google.gwt.safehtml.shared.SafeHtml; +import com.google.gwt.safehtml.shared.SafeHtmlBuilder; +import com.google.gwt.safehtml.shared.SafeHtmlUtils; +import com.sencha.gxt.cell.core.client.ProgressBarCell.ProgressBarAppearance; +import com.sencha.gxt.cell.core.client.ProgressBarCell.ProgressBarAppearanceOptions; +import com.sencha.gxt.core.client.GXT; +import com.sencha.gxt.core.client.XTemplates; +import com.sencha.gxt.core.client.util.Format; + +/** + * + * @author Giancarlo Panichi + * + * + */ +public class OrangeProgressBarAppearance implements ProgressBarAppearance { + + public interface OrangeProgressBarResources { + + ImageResource barOrange(); + + ImageResource innerBarOrange(); + + OrangeProgressBarStyle style(); + + } + + public interface OrangeProgressBarStyle extends CssResource { + + String progressBarOrange(); + + String progressInnerOrange(); + + String progressTextOrange(); + + String progressTextBackOrange(); + + String progressWrapOrange(); + + } + + public interface OrangeProgressBarTemplate extends XTemplates { + + @XTemplate(source = "OrangeProgressBar.html") + SafeHtml render(SafeHtml text, OrangeProgressBarStyle style, + SafeStyles wrapStyles, SafeStyles progressBarStyles, + SafeStyles progressTextStyles, SafeStyles widthStyles); + + } + + public interface OrangeProgressBarDefaultResources extends + OrangeProgressBarResources, ClientBundle { + + @Source({ "OrangeProgressBar.css" }) + @Override + OrangeProgressBarStyle style(); + + @Source("orange-progress-bg.gif") + @ImageOptions(repeatStyle = RepeatStyle.Horizontal) + @Override + ImageResource barOrange(); + + @Source("orange-bg.gif") + @ImageOptions(repeatStyle = RepeatStyle.Horizontal) + @Override + ImageResource innerBarOrange(); + } + + private final OrangeProgressBarStyle style; + private OrangeProgressBarTemplate template; + + + public OrangeProgressBarAppearance() { + this( + GWT. create(OrangeProgressBarDefaultResources.class), + GWT. create(OrangeProgressBarTemplate.class)); + } + + public OrangeProgressBarAppearance(OrangeProgressBarResources resources, + OrangeProgressBarTemplate template) { + this.style = resources.style(); + this.style.ensureInjected(); + this.template = template; + } + + @Override + public void render(SafeHtmlBuilder sb, Double value, + ProgressBarAppearanceOptions options) { + value = value == null ? 0 : value; + double valueWidth = value * options.getWidth(); + + int vw = new Double(valueWidth).intValue(); + + String text = options.getProgressText(); + + if (text != null) { + int v = (int) Math.round(value * 100); + text = Format.substitute(text, v); + } + + SafeHtml txt; + if (text == null) { + txt = SafeHtmlUtils.fromSafeConstant(" "); + } else { + txt = SafeHtmlUtils.fromString(text); + } + + int adj = GXT.isIE() ? 4 : 2; + + SafeStyles wrapStyles = SafeStylesUtils.fromTrustedString("width:" + + (options.getWidth() - adj) + "px;"); + SafeStyles progressBarStyles = SafeStylesUtils + .fromTrustedString("width:" + vw + "px;"); + SafeStyles progressTextStyles = SafeStylesUtils + .fromTrustedString("width:" + Math.max(vw - 8, 0) + "px;"); + SafeStyles widthStyles = SafeStylesUtils.fromTrustedString("width:" + + (Math.max(0, options.getWidth() - adj)) + "px;"); + sb.append(template.render(txt, style, wrapStyles, progressBarStyles, + progressTextStyles, widthStyles)); + } + +} diff --git a/src/main/java/org/gcube/portlets/user/dataminerexecutor/client/custom/progress/RedProgressBar.css b/src/main/java/org/gcube/portlets/user/dataminerexecutor/client/custom/progress/RedProgressBar.css new file mode 100644 index 0000000..306668e --- /dev/null +++ b/src/main/java/org/gcube/portlets/user/dataminerexecutor/client/custom/progress/RedProgressBar.css @@ -0,0 +1,50 @@ +/** +* +*/ +.progressWrapRed { + border: 1px solid #cf656f; + overflow: hidden; +} + +@sprite .progressInnerRed { + background-color: #f3e0e2; + gwt-image: 'innerBarRed'; + height: auto; + position: relative; +} + +@sprite .progressBarRed { + background-color: #ee9ca4; + gwt-image: 'barRed'; + background-repeat: repeat-x; + background-position: left center; + height: 18px; + border-top-color: #fdd1d5; + border-bottom-color: #e47f88; + border-right-color: #e47f88; +} + +.progressTextRed { + color: #fff; + text-align: center; + font-size: 11px; + font-weight: bold; + font-family: sans-serif; + padding: 1px 5px; + overflow: hidden; + position: absolute; + z-index: 99; +} + +.progressTextBackRed { + color: #953941 !important; + z-index: 9 !important; +} + +@if user.agent ie6 ie8 ie9 { + .progressTextBackRed { + line-height: 15px; + color: #953941 !important; + z-index: 9 !important; + } +} \ No newline at end of file diff --git a/src/main/java/org/gcube/portlets/user/dataminerexecutor/client/custom/progress/RedProgressBar.html b/src/main/java/org/gcube/portlets/user/dataminerexecutor/client/custom/progress/RedProgressBar.html new file mode 100644 index 0000000..918b724 --- /dev/null +++ b/src/main/java/org/gcube/portlets/user/dataminerexecutor/client/custom/progress/RedProgressBar.html @@ -0,0 +1,12 @@ +
+
+
+
+
{text}
+
+
+
{text}
+
+
+
+
diff --git a/src/main/java/org/gcube/portlets/user/dataminerexecutor/client/custom/progress/RedProgressBar.java b/src/main/java/org/gcube/portlets/user/dataminerexecutor/client/custom/progress/RedProgressBar.java new file mode 100644 index 0000000..5da929c --- /dev/null +++ b/src/main/java/org/gcube/portlets/user/dataminerexecutor/client/custom/progress/RedProgressBar.java @@ -0,0 +1,18 @@ +package org.gcube.portlets.user.dataminerexecutor.client.custom.progress; + +import com.sencha.gxt.cell.core.client.ProgressBarCell; +import com.sencha.gxt.widget.core.client.ProgressBar; + +/** + * + * @author Giancarlo Panichi + * + * + */ +public class RedProgressBar extends ProgressBar { + + public RedProgressBar() { + super(new ProgressBarCell(new RedProgressBarAppearance())); + } + +} diff --git a/src/main/java/org/gcube/portlets/user/dataminerexecutor/client/custom/progress/RedProgressBarAppearance.java b/src/main/java/org/gcube/portlets/user/dataminerexecutor/client/custom/progress/RedProgressBarAppearance.java new file mode 100644 index 0000000..8525920 --- /dev/null +++ b/src/main/java/org/gcube/portlets/user/dataminerexecutor/client/custom/progress/RedProgressBarAppearance.java @@ -0,0 +1,132 @@ +package org.gcube.portlets.user.dataminerexecutor.client.custom.progress; + +import com.google.gwt.core.client.GWT; +import com.google.gwt.resources.client.ClientBundle; +import com.google.gwt.resources.client.CssResource; +import com.google.gwt.resources.client.ImageResource; +import com.google.gwt.resources.client.ImageResource.ImageOptions; +import com.google.gwt.resources.client.ImageResource.RepeatStyle; +import com.google.gwt.safecss.shared.SafeStyles; +import com.google.gwt.safecss.shared.SafeStylesUtils; +import com.google.gwt.safehtml.shared.SafeHtml; +import com.google.gwt.safehtml.shared.SafeHtmlBuilder; +import com.google.gwt.safehtml.shared.SafeHtmlUtils; +import com.sencha.gxt.cell.core.client.ProgressBarCell.ProgressBarAppearance; +import com.sencha.gxt.cell.core.client.ProgressBarCell.ProgressBarAppearanceOptions; +import com.sencha.gxt.core.client.GXT; +import com.sencha.gxt.core.client.XTemplates; +import com.sencha.gxt.core.client.util.Format; + +/** + * + * @author Giancarlo Panichi + * + * + */ +public class RedProgressBarAppearance implements ProgressBarAppearance { + + public interface RedProgressBarResources { + + ImageResource barRed(); + + ImageResource innerBarRed(); + + RedProgressBarStyle style(); + + } + + public interface RedProgressBarStyle extends CssResource { + + String progressBarRed(); + + String progressInnerRed(); + + String progressTextRed(); + + String progressTextBackRed(); + + String progressWrapRed(); + + } + + public interface RedProgressBarTemplate extends XTemplates { + + @XTemplate(source = "RedProgressBar.html") + SafeHtml render(SafeHtml text, RedProgressBarStyle style, + SafeStyles wrapStyles, SafeStyles progressBarStyles, + SafeStyles progressTextStyles, SafeStyles widthStyles); + + } + + public interface RedProgressBarDefaultResources extends + RedProgressBarResources, ClientBundle { + + @Source({ "RedProgressBar.css" }) + @Override + RedProgressBarStyle style(); + + @Source("red-progress-bg.gif") + @ImageOptions(repeatStyle = RepeatStyle.Horizontal) + @Override + ImageResource barRed(); + + @Source("red-bg.gif") + @ImageOptions(repeatStyle = RepeatStyle.Horizontal) + @Override + ImageResource innerBarRed(); + } + + private final RedProgressBarStyle style; + private RedProgressBarTemplate template; + + + public RedProgressBarAppearance() { + this( + GWT. create(RedProgressBarDefaultResources.class), + GWT. create(RedProgressBarTemplate.class)); + } + + public RedProgressBarAppearance(RedProgressBarResources resources, + RedProgressBarTemplate template) { + this.style = resources.style(); + this.style.ensureInjected(); + this.template = template; + } + + @Override + public void render(SafeHtmlBuilder sb, Double value, + ProgressBarAppearanceOptions options) { + value = value == null ? 0 : value; + double valueWidth = value * options.getWidth(); + + int vw = new Double(valueWidth).intValue(); + + String text = options.getProgressText(); + + if (text != null) { + int v = (int) Math.round(value * 100); + text = Format.substitute(text, v); + } + + SafeHtml txt; + if (text == null) { + txt = SafeHtmlUtils.fromSafeConstant(" "); + } else { + txt = SafeHtmlUtils.fromString(text); + } + + int adj = GXT.isIE() ? 4 : 2; + + SafeStyles wrapStyles = SafeStylesUtils.fromTrustedString("width:" + + (options.getWidth() - adj) + "px;"); + SafeStyles progressBarStyles = SafeStylesUtils + .fromTrustedString("width:" + vw + "px;"); + SafeStyles progressTextStyles = SafeStylesUtils + .fromTrustedString("width:" + Math.max(vw - 8, 0) + "px;"); + SafeStyles widthStyles = SafeStylesUtils.fromTrustedString("width:" + + (Math.max(0, options.getWidth() - adj)) + "px;"); + sb.append(template.render(txt, style, wrapStyles, progressBarStyles, + progressTextStyles, widthStyles)); + } + +} diff --git a/src/main/java/org/gcube/portlets/user/dataminerexecutor/client/custom/progress/green-bg.gif b/src/main/java/org/gcube/portlets/user/dataminerexecutor/client/custom/progress/green-bg.gif new file mode 100644 index 0000000..ece6da8 Binary files /dev/null and b/src/main/java/org/gcube/portlets/user/dataminerexecutor/client/custom/progress/green-bg.gif differ diff --git a/src/main/java/org/gcube/portlets/user/dataminerexecutor/client/custom/progress/green-progress-bg.gif b/src/main/java/org/gcube/portlets/user/dataminerexecutor/client/custom/progress/green-progress-bg.gif new file mode 100644 index 0000000..34cf4bc Binary files /dev/null and b/src/main/java/org/gcube/portlets/user/dataminerexecutor/client/custom/progress/green-progress-bg.gif differ diff --git a/src/main/java/org/gcube/portlets/user/dataminerexecutor/client/custom/progress/orange-bg.gif b/src/main/java/org/gcube/portlets/user/dataminerexecutor/client/custom/progress/orange-bg.gif new file mode 100644 index 0000000..9bc56ad Binary files /dev/null and b/src/main/java/org/gcube/portlets/user/dataminerexecutor/client/custom/progress/orange-bg.gif differ diff --git a/src/main/java/org/gcube/portlets/user/dataminerexecutor/client/custom/progress/orange-progress-bg.gif b/src/main/java/org/gcube/portlets/user/dataminerexecutor/client/custom/progress/orange-progress-bg.gif new file mode 100644 index 0000000..8806af1 Binary files /dev/null and b/src/main/java/org/gcube/portlets/user/dataminerexecutor/client/custom/progress/orange-progress-bg.gif differ diff --git a/src/main/java/org/gcube/portlets/user/dataminerexecutor/client/custom/progress/red-bg.gif b/src/main/java/org/gcube/portlets/user/dataminerexecutor/client/custom/progress/red-bg.gif new file mode 100644 index 0000000..1bb4201 Binary files /dev/null and b/src/main/java/org/gcube/portlets/user/dataminerexecutor/client/custom/progress/red-bg.gif differ diff --git a/src/main/java/org/gcube/portlets/user/dataminerexecutor/client/custom/progress/red-progress-bg.gif b/src/main/java/org/gcube/portlets/user/dataminerexecutor/client/custom/progress/red-progress-bg.gif new file mode 100644 index 0000000..5575481 Binary files /dev/null and b/src/main/java/org/gcube/portlets/user/dataminerexecutor/client/custom/progress/red-progress-bg.gif differ diff --git a/src/main/java/org/gcube/portlets/user/dataminerexecutor/client/events/CancelComputationExecutionRequestEvent.java b/src/main/java/org/gcube/portlets/user/dataminerexecutor/client/events/CancelComputationExecutionRequestEvent.java new file mode 100644 index 0000000..caa8c7e --- /dev/null +++ b/src/main/java/org/gcube/portlets/user/dataminerexecutor/client/events/CancelComputationExecutionRequestEvent.java @@ -0,0 +1,70 @@ +package org.gcube.portlets.user.dataminerexecutor.client.events; + +import org.gcube.data.analysis.dataminermanagercl.shared.data.computations.ComputationId; + +import com.google.gwt.event.shared.EventHandler; +import com.google.gwt.event.shared.GwtEvent; +import com.google.gwt.event.shared.HandlerRegistration; +import com.google.gwt.event.shared.HasHandlers; + +/** + * Cancel Computation Request Event + * + * + * @author Giancarlo Panichi + * + * + */ +public class CancelComputationExecutionRequestEvent + extends + GwtEvent { + + public static Type TYPE = new Type(); + private ComputationId computationId; + + public interface CancelComputationExecutionRequestEventHandler extends + EventHandler { + void onCancel(CancelComputationExecutionRequestEvent event); + } + + public interface HasCancelComputationExecutionRequestEventHandler extends + HasHandlers { + public HandlerRegistration addCancelComputationExecutionRequestEventHandler( + CancelComputationExecutionRequestEventHandler handler); + } + + public CancelComputationExecutionRequestEvent(ComputationId computationId) { + this.computationId = computationId; + } + + @Override + protected void dispatch( + CancelComputationExecutionRequestEventHandler handler) { + handler.onCancel(this); + } + + @Override + public Type getAssociatedType() { + return TYPE; + } + + public static Type getType() { + return TYPE; + } + + public static void fire(HasHandlers source, + CancelComputationExecutionRequestEvent event) { + source.fireEvent(event); + } + + public ComputationId getComputationId() { + return computationId; + } + + @Override + public String toString() { + return "CancelComputationExecutionRequestEvent [computationId=" + + computationId + "]"; + } + +} diff --git a/src/main/java/org/gcube/portlets/user/dataminerexecutor/client/events/CancelExecutionFromComputationsRequestEvent.java b/src/main/java/org/gcube/portlets/user/dataminerexecutor/client/events/CancelExecutionFromComputationsRequestEvent.java new file mode 100644 index 0000000..61dc8a9 --- /dev/null +++ b/src/main/java/org/gcube/portlets/user/dataminerexecutor/client/events/CancelExecutionFromComputationsRequestEvent.java @@ -0,0 +1,71 @@ +package org.gcube.portlets.user.dataminerexecutor.client.events; + +import org.gcube.data.analysis.dataminermanagercl.shared.workspace.ItemDescription; + +import com.google.gwt.event.shared.EventHandler; +import com.google.gwt.event.shared.GwtEvent; +import com.google.gwt.event.shared.HandlerRegistration; +import com.google.gwt.event.shared.HasHandlers; + +/** + * Cancel Execution From Computations Request Event + * + * + * @author Giancarlo Panichi + * + * + */ +public class CancelExecutionFromComputationsRequestEvent + extends + GwtEvent { + + public static Type TYPE = new Type(); + private ItemDescription itemDescription; + + public interface CancelExecutionFromComputationsRequestEventHandler extends + EventHandler { + void onCancel(CancelExecutionFromComputationsRequestEvent event); + } + + public interface HasCancelExecutionFromComputationsRequestEventHandler + extends HasHandlers { + public HandlerRegistration addCancelExecutionFromComputationsRequestEventHandler( + CancelExecutionFromComputationsRequestEventHandler handler); + } + + public CancelExecutionFromComputationsRequestEvent( + ItemDescription itemDescription) { + this.itemDescription = itemDescription; + } + + @Override + protected void dispatch( + CancelExecutionFromComputationsRequestEventHandler handler) { + handler.onCancel(this); + } + + @Override + public Type getAssociatedType() { + return TYPE; + } + + public static Type getType() { + return TYPE; + } + + public static void fire(HasHandlers source, + CancelExecutionFromComputationsRequestEvent event) { + source.fireEvent(event); + } + + public ItemDescription getItemDescription() { + return itemDescription; + } + + @Override + public String toString() { + return "CancelExecutionFromComputationsRequestEvent [itemDescription=" + + itemDescription + "]"; + } + +} diff --git a/src/main/java/org/gcube/portlets/user/dataminerexecutor/client/events/ComputationDataEvent.java b/src/main/java/org/gcube/portlets/user/dataminerexecutor/client/events/ComputationDataEvent.java new file mode 100644 index 0000000..edc55c7 --- /dev/null +++ b/src/main/java/org/gcube/portlets/user/dataminerexecutor/client/events/ComputationDataEvent.java @@ -0,0 +1,64 @@ +package org.gcube.portlets.user.dataminerexecutor.client.events; + +import org.gcube.data.analysis.dataminermanagercl.shared.data.computations.ComputationData; + +import com.google.gwt.event.shared.EventHandler; +import com.google.gwt.event.shared.GwtEvent; +import com.google.gwt.event.shared.HandlerRegistration; +import com.google.gwt.event.shared.HasHandlers; + +/** + * Computation Data Event + * + * + * @author Giancarlo Panichi + * + * + */ +public class ComputationDataEvent extends + GwtEvent { + + public static Type TYPE = new Type(); + private ComputationData computationData; + + public interface ComputationDataEventHandler extends EventHandler { + void onComputationData(ComputationDataEvent event); + } + + public interface HasOutputShowResourceEventHandler extends HasHandlers { + public HandlerRegistration addOutputShowResourceEventHandler( + ComputationDataEventHandler handler); + } + + public ComputationDataEvent(ComputationData computationData) { + this.computationData = computationData; + } + + @Override + protected void dispatch(ComputationDataEventHandler handler) { + handler.onComputationData(this); + } + + @Override + public Type getAssociatedType() { + return TYPE; + } + + public static Type getType() { + return TYPE; + } + + public static void fire(HasHandlers source, ComputationDataEvent event) { + source.fireEvent(event); + } + + public ComputationData getComputationData() { + return computationData; + } + + @Override + public String toString() { + return "ComputationDataEvent [computationData=" + computationData + "]"; + } + +} diff --git a/src/main/java/org/gcube/portlets/user/dataminerexecutor/client/events/ComputationDataRequestEvent.java b/src/main/java/org/gcube/portlets/user/dataminerexecutor/client/events/ComputationDataRequestEvent.java new file mode 100644 index 0000000..d769b78 --- /dev/null +++ b/src/main/java/org/gcube/portlets/user/dataminerexecutor/client/events/ComputationDataRequestEvent.java @@ -0,0 +1,67 @@ +package org.gcube.portlets.user.dataminerexecutor.client.events; + +import org.gcube.data.analysis.dataminermanagercl.shared.workspace.ItemDescription; + +import com.google.gwt.event.shared.EventHandler; +import com.google.gwt.event.shared.GwtEvent; +import com.google.gwt.event.shared.HandlerRegistration; +import com.google.gwt.event.shared.HasHandlers; + +/** + * Output Show Request Event + * + * + * @author Giancarlo Panichi + * + * + */ +public class ComputationDataRequestEvent + extends + GwtEvent { + + public static Type TYPE = new Type(); + private ItemDescription itemDescription; + + public interface ComputationDataRequestEventHandler extends EventHandler { + void onComputationDataRequest(ComputationDataRequestEvent event); + } + + public interface HasComputationDataRequestEventHandler extends HasHandlers { + public HandlerRegistration addComputationDataRequestEventHandler( + ComputationDataRequestEventHandler handler); + } + + public ComputationDataRequestEvent(ItemDescription itemDescription) { + this.itemDescription = itemDescription; + } + + @Override + protected void dispatch(ComputationDataRequestEventHandler handler) { + handler.onComputationDataRequest(this); + } + + @Override + public Type getAssociatedType() { + return TYPE; + } + + public static Type getType() { + return TYPE; + } + + public static void fire(HasHandlers source, + ComputationDataRequestEvent event) { + source.fireEvent(event); + } + + public ItemDescription getItemDescription() { + return itemDescription; + } + + @Override + public String toString() { + return "ComputationDataRequestEvent [itemDescription=" + + itemDescription + "]"; + } + +} diff --git a/src/main/java/org/gcube/portlets/user/dataminerexecutor/client/events/ComputationReadyEvent.java b/src/main/java/org/gcube/portlets/user/dataminerexecutor/client/events/ComputationReadyEvent.java new file mode 100644 index 0000000..35a418e --- /dev/null +++ b/src/main/java/org/gcube/portlets/user/dataminerexecutor/client/events/ComputationReadyEvent.java @@ -0,0 +1,70 @@ +package org.gcube.portlets.user.dataminerexecutor.client.events; + +import org.gcube.data.analysis.dataminermanagercl.shared.process.Operator; + +import com.google.gwt.event.shared.EventHandler; +import com.google.gwt.event.shared.GwtEvent; +import com.google.gwt.event.shared.HandlerRegistration; +import com.google.gwt.event.shared.HasHandlers; + +/** + * Computation Ready Event + * + * + * @author Giancarlo Panichi + * + * + */ +public class ComputationReadyEvent extends + GwtEvent { + + public static Type TYPE = new Type(); + private Operator operator; + + public interface ComputationReadyEventHandler extends EventHandler { + void onReady(ComputationReadyEvent event); + } + + public interface HasComputationReadyEventHandler extends HasHandlers { + public HandlerRegistration addComputationReadyEventHandler( + ComputationReadyEventHandler handler); + } + + public ComputationReadyEvent(Operator operator) { + super(); + this.operator = operator; + } + + @Override + protected void dispatch(ComputationReadyEventHandler handler) { + handler.onReady(this); + } + + @Override + public Type getAssociatedType() { + return TYPE; + } + + public static Type getType() { + return TYPE; + } + + public static void fire(HasHandlers source, ComputationReadyEvent event) { + source.fireEvent(event); + } + + public static Type getTYPE() { + return TYPE; + } + + public Operator getOperator() { + return operator; + } + + + @Override + public String toString() { + return "ComputationReadyEvent [operator=" + operator + "]"; + } + +} diff --git a/src/main/java/org/gcube/portlets/user/dataminerexecutor/client/events/DeleteItemRequestEvent.java b/src/main/java/org/gcube/portlets/user/dataminerexecutor/client/events/DeleteItemRequestEvent.java new file mode 100644 index 0000000..73e3c6c --- /dev/null +++ b/src/main/java/org/gcube/portlets/user/dataminerexecutor/client/events/DeleteItemRequestEvent.java @@ -0,0 +1,76 @@ +package org.gcube.portlets.user.dataminerexecutor.client.events; + +import org.gcube.data.analysis.dataminermanagercl.shared.workspace.ItemDescription; +import org.gcube.portlets.user.dataminerexecutor.client.type.DataMinerWorkAreaElementType; + +import com.google.gwt.event.shared.EventHandler; +import com.google.gwt.event.shared.GwtEvent; +import com.google.gwt.event.shared.HandlerRegistration; +import com.google.gwt.event.shared.HasHandlers; + +/** + * Delete Item Request Event + * + * + * @author Giancarlo Panichi + * + * + */ +public class DeleteItemRequestEvent extends + GwtEvent { + + public static Type TYPE = new Type(); + private DataMinerWorkAreaElementType dataMinerWorkAreaElementType; + private ItemDescription itemDescription; + + public interface DeleteItemRequestEventHandler extends EventHandler { + void onDeleteRequest(DeleteItemRequestEvent event); + } + + public interface HasDeleteItemRequestEventHandler extends HasHandlers { + public HandlerRegistration addDeleteItemRequestEventHandler( + DeleteItemRequestEventHandler handler); + } + + public DeleteItemRequestEvent( + DataMinerWorkAreaElementType dataMinerWorkAreaElementType, + ItemDescription itemDescription) { + this.itemDescription = itemDescription; + this.dataMinerWorkAreaElementType = dataMinerWorkAreaElementType; + } + + @Override + protected void dispatch(DeleteItemRequestEventHandler handler) { + handler.onDeleteRequest(this); + } + + @Override + public Type getAssociatedType() { + return TYPE; + } + + public static Type getType() { + return TYPE; + } + + public static void fire(HasHandlers source, + DeleteItemRequestEvent deleteItemEvent) { + source.fireEvent(deleteItemEvent); + } + + public ItemDescription getItemDescription() { + return itemDescription; + } + + public DataMinerWorkAreaElementType getDataMinerWorkAreaElementType() { + return dataMinerWorkAreaElementType; + } + + @Override + public String toString() { + return "DeleteItemRequestEvent [dataMinerWorkAreaElementType=" + + dataMinerWorkAreaElementType + ", itemDescription=" + + itemDescription + "]"; + } + +} diff --git a/src/main/java/org/gcube/portlets/user/dataminerexecutor/client/events/InvocationModelEvent.java b/src/main/java/org/gcube/portlets/user/dataminerexecutor/client/events/InvocationModelEvent.java new file mode 100644 index 0000000..7aae0a4 --- /dev/null +++ b/src/main/java/org/gcube/portlets/user/dataminerexecutor/client/events/InvocationModelEvent.java @@ -0,0 +1,66 @@ +package org.gcube.portlets.user.dataminerexecutor.client.events; + +import org.gcube.data.analysis.dataminermanagercl.shared.process.Operator; + +import com.google.gwt.event.shared.EventHandler; +import com.google.gwt.event.shared.GwtEvent; +import com.google.gwt.event.shared.HandlerRegistration; +import com.google.gwt.event.shared.HasHandlers; + +/** + * Operators Classification Request Event + * + * + * @author Giancarlo Panichi + * + * + */ +public class InvocationModelEvent + extends GwtEvent { + + public static Type TYPE = new Type(); + private Operator operator; + + public interface InvocationModelEventHandler extends EventHandler { + void onInvocation(InvocationModelEvent event); + } + + public interface HasInvocationModelEventHandler extends HasHandlers { + public HandlerRegistration addInvocationModelEventHandler( + InvocationModelEventHandler handler); + } + + + public InvocationModelEvent(Operator operator) { + this.operator=operator; + } + + @Override + protected void dispatch(InvocationModelEventHandler handler) { + handler.onInvocation(this); + } + + @Override + public Type getAssociatedType() { + return TYPE; + } + + public static Type getType() { + return TYPE; + } + + public static void fire(HasHandlers source, InvocationModelEvent event) { + source.fireEvent(event); + } + + public Operator getOperator() { + return operator; + } + + @Override + public String toString() { + return "InvocationModelEvent [operator=" + operator + "]"; + } + + +} diff --git a/src/main/java/org/gcube/portlets/user/dataminerexecutor/client/events/InvocationModelRequestEvent.java b/src/main/java/org/gcube/portlets/user/dataminerexecutor/client/events/InvocationModelRequestEvent.java new file mode 100644 index 0000000..7c48cc7 --- /dev/null +++ b/src/main/java/org/gcube/portlets/user/dataminerexecutor/client/events/InvocationModelRequestEvent.java @@ -0,0 +1,55 @@ +package org.gcube.portlets.user.dataminerexecutor.client.events; + +import com.google.gwt.event.shared.EventHandler; +import com.google.gwt.event.shared.GwtEvent; +import com.google.gwt.event.shared.HandlerRegistration; +import com.google.gwt.event.shared.HasHandlers; + +/** + * Operators Classification Request Event + * + * + * @author Giancarlo Panichi + * + * + */ +public class InvocationModelRequestEvent + extends GwtEvent { + + public static Type TYPE = new Type(); + + public interface InvocationModelRequestEventHandler extends EventHandler { + void onInvocationRequest(InvocationModelRequestEvent event); + } + + public interface HasInvocationModelEventHandler extends HasHandlers { + public HandlerRegistration addInvocationModelEventHandler(InvocationModelRequestEventHandler handler); + } + + public InvocationModelRequestEvent() { + } + + @Override + protected void dispatch(InvocationModelRequestEventHandler handler) { + handler.onInvocationRequest(this); + } + + @Override + public Type getAssociatedType() { + return TYPE; + } + + public static Type getType() { + return TYPE; + } + + public static void fire(HasHandlers source, InvocationModelRequestEvent event) { + source.fireEvent(event); + } + + @Override + public String toString() { + return "InvocationModelRequestEvent []"; + } + +} diff --git a/src/main/java/org/gcube/portlets/user/dataminerexecutor/client/events/MenuEvent.java b/src/main/java/org/gcube/portlets/user/dataminerexecutor/client/events/MenuEvent.java new file mode 100644 index 0000000..f6d4bf8 --- /dev/null +++ b/src/main/java/org/gcube/portlets/user/dataminerexecutor/client/events/MenuEvent.java @@ -0,0 +1,68 @@ +package org.gcube.portlets.user.dataminerexecutor.client.events; + +import org.gcube.portlets.user.dataminerexecutor.client.type.MenuType; + +import com.google.gwt.event.shared.EventHandler; +import com.google.gwt.event.shared.GwtEvent; +import com.google.gwt.event.shared.HandlerRegistration; +import com.google.gwt.event.shared.HasHandlers; + +/** + * Menu Event + * + * + * @author Giancarlo Panichi + * + * + */ +public class MenuEvent extends + GwtEvent { + + public static Type TYPE = new Type(); + private MenuType menuType; + + public interface MenuEventHandler extends EventHandler { + void onSelect(MenuEvent event); + } + + public interface HasMenuEventHandler extends HasHandlers { + public HandlerRegistration addMenuEventHandler( + MenuEventHandler handler); + } + + public MenuEvent( + MenuType menuType) { + this.menuType = menuType; + } + + @Override + protected void dispatch(MenuEventHandler handler) { + handler.onSelect(this); + } + + @Override + public Type getAssociatedType() { + return TYPE; + } + + public static Type getType() { + return TYPE; + } + + public static void fire(HasHandlers source, MenuEvent event) { + source.fireEvent(event); + } + + public MenuType getMenuType() { + return menuType; + } + + @Override + public String toString() { + return "MenuEvent [menuType=" + menuType + "]"; + } + + + + +} diff --git a/src/main/java/org/gcube/portlets/user/dataminerexecutor/client/events/MenuSwitchEvent.java b/src/main/java/org/gcube/portlets/user/dataminerexecutor/client/events/MenuSwitchEvent.java new file mode 100644 index 0000000..ff1e524 --- /dev/null +++ b/src/main/java/org/gcube/portlets/user/dataminerexecutor/client/events/MenuSwitchEvent.java @@ -0,0 +1,64 @@ +package org.gcube.portlets.user.dataminerexecutor.client.events; + +import org.gcube.portlets.user.dataminerexecutor.client.type.MenuType; + +import com.google.gwt.event.shared.EventHandler; +import com.google.gwt.event.shared.GwtEvent; +import com.google.gwt.event.shared.HandlerRegistration; +import com.google.gwt.event.shared.HasHandlers; + +/** + * Menu Event + * + * + * @author Giancarlo Panichi + * + * + */ +public class MenuSwitchEvent extends + GwtEvent { + + public static Type TYPE = new Type(); + private MenuType menuType; + + public interface MenuSwitchEventHandler extends EventHandler { + void onSelect(MenuSwitchEvent event); + } + + public interface HasMenuSwitchEventHandler extends HasHandlers { + public HandlerRegistration addMenuSwitchEventHandler( + MenuSwitchEventHandler handler); + } + + public MenuSwitchEvent(MenuType menuType) { + this.menuType = menuType; + } + + @Override + protected void dispatch(MenuSwitchEventHandler handler) { + handler.onSelect(this); + } + + @Override + public Type getAssociatedType() { + return TYPE; + } + + public static Type getType() { + return TYPE; + } + + public static void fire(HasHandlers source, MenuSwitchEvent event) { + source.fireEvent(event); + } + + public MenuType getMenuType() { + return menuType; + } + + @Override + public String toString() { + return "MenuSwitchEvent [menuType=" + menuType + "]"; + } + +} diff --git a/src/main/java/org/gcube/portlets/user/dataminerexecutor/client/events/OutputDataEvent.java b/src/main/java/org/gcube/portlets/user/dataminerexecutor/client/events/OutputDataEvent.java new file mode 100644 index 0000000..b1526a3 --- /dev/null +++ b/src/main/java/org/gcube/portlets/user/dataminerexecutor/client/events/OutputDataEvent.java @@ -0,0 +1,63 @@ +package org.gcube.portlets.user.dataminerexecutor.client.events; + +import org.gcube.data.analysis.dataminermanagercl.shared.data.OutputData; + +import com.google.gwt.event.shared.EventHandler; +import com.google.gwt.event.shared.GwtEvent; +import com.google.gwt.event.shared.HandlerRegistration; +import com.google.gwt.event.shared.HasHandlers; + +/** + * Output Data Event + * + * + * @author Giancarlo Panichi + * + * + */ +public class OutputDataEvent extends + GwtEvent { + public static Type TYPE = new Type(); + public OutputData outputData; + + public interface OutputDataEventHandler extends EventHandler { + void onOutput(OutputDataEvent event); + } + + public interface HasOutputDataEventHandler extends HasHandlers { + public HandlerRegistration addOutputDataEventHandler( + OutputDataEventHandler handler); + } + + public OutputDataEvent(OutputData outputData) { + this.outputData = outputData; + } + + @Override + protected void dispatch(OutputDataEventHandler handler) { + handler.onOutput(this); + } + + @Override + public Type getAssociatedType() { + return TYPE; + } + + public static Type getType() { + return TYPE; + } + + public static void fire(HasHandlers source, OutputDataEvent event) { + source.fireEvent(event); + } + + public OutputData getOutputData() { + return outputData; + } + + @Override + public String toString() { + return "OutputDataEvent [outputData=" + outputData + "]"; + } + +} diff --git a/src/main/java/org/gcube/portlets/user/dataminerexecutor/client/events/OutputDataRequestEvent.java b/src/main/java/org/gcube/portlets/user/dataminerexecutor/client/events/OutputDataRequestEvent.java new file mode 100644 index 0000000..6feb5dd --- /dev/null +++ b/src/main/java/org/gcube/portlets/user/dataminerexecutor/client/events/OutputDataRequestEvent.java @@ -0,0 +1,66 @@ +package org.gcube.portlets.user.dataminerexecutor.client.events; + +import org.gcube.data.analysis.dataminermanagercl.shared.data.computations.ComputationId; + +import com.google.gwt.event.shared.EventHandler; +import com.google.gwt.event.shared.GwtEvent; +import com.google.gwt.event.shared.HandlerRegistration; +import com.google.gwt.event.shared.HasHandlers; + +/** + * Output Data Request Event + * + * + * @author Giancarlo Panichi + * + * + */ +public class OutputDataRequestEvent extends + GwtEvent { + + public static Type TYPE = new Type(); + private ComputationId computationId; + + public interface OutputDataRequestEventHandler extends EventHandler { + void onOutputRequest(OutputDataRequestEvent event); + } + + public interface HasOutputDataRequestEventHandler extends HasHandlers { + public HandlerRegistration addOutputDataRequestEventHandler( + OutputDataRequestEventHandler handler); + } + + public OutputDataRequestEvent(ComputationId computationId) { + this.computationId = computationId; + } + + @Override + protected void dispatch(OutputDataRequestEventHandler handler) { + handler.onOutputRequest(this); + } + + @Override + public Type getAssociatedType() { + return TYPE; + } + + public static Type getType() { + return TYPE; + } + + public static void fire(HasHandlers source, OutputDataRequestEvent event) { + source.fireEvent(event); + } + + public ComputationId getComputationId() { + return computationId; + } + + @Override + public String toString() { + return "OutputDataRequestEvent [computationId=" + computationId + "]"; + } + + + +} diff --git a/src/main/java/org/gcube/portlets/user/dataminerexecutor/client/events/RemoveSelectedOperatorEvent.java b/src/main/java/org/gcube/portlets/user/dataminerexecutor/client/events/RemoveSelectedOperatorEvent.java new file mode 100644 index 0000000..df617a7 --- /dev/null +++ b/src/main/java/org/gcube/portlets/user/dataminerexecutor/client/events/RemoveSelectedOperatorEvent.java @@ -0,0 +1,48 @@ +package org.gcube.portlets.user.dataminerexecutor.client.events; + +import com.google.gwt.event.shared.EventHandler; +import com.google.gwt.event.shared.GwtEvent; +import com.google.gwt.event.shared.HandlerRegistration; +import com.google.gwt.event.shared.HasHandlers; + +public class RemoveSelectedOperatorEvent + extends GwtEvent { + + public static Type TYPE = new Type(); + + public interface RemoveSelectedOperatorEventHandler extends EventHandler { + void onSelect(RemoveSelectedOperatorEvent event); + } + + public interface HasRemoveSelectedOperatorEventHandler extends HasHandlers { + public HandlerRegistration removeSelectedOperatorEventHandler(RemoveSelectedOperatorEventHandler handler); + } + + public RemoveSelectedOperatorEvent() { + + } + + @Override + protected void dispatch(RemoveSelectedOperatorEventHandler handler) { + handler.onSelect(this); + } + + @Override + public Type getAssociatedType() { + return TYPE; + } + + public static Type getType() { + return TYPE; + } + + public static void fire(HasHandlers source, MenuEvent event) { + source.fireEvent(event); + } + + @Override + public String toString() { + return "RemoveSelectedOperatorEvent []"; + } + +} diff --git a/src/main/java/org/gcube/portlets/user/dataminerexecutor/client/events/ResubmitComputationExecutionEvent.java b/src/main/java/org/gcube/portlets/user/dataminerexecutor/client/events/ResubmitComputationExecutionEvent.java new file mode 100644 index 0000000..1645a3d --- /dev/null +++ b/src/main/java/org/gcube/portlets/user/dataminerexecutor/client/events/ResubmitComputationExecutionEvent.java @@ -0,0 +1,71 @@ +package org.gcube.portlets.user.dataminerexecutor.client.events; + +import org.gcube.data.analysis.dataminermanagercl.shared.data.computations.ComputationId; + +import com.google.gwt.event.shared.EventHandler; +import com.google.gwt.event.shared.GwtEvent; +import com.google.gwt.event.shared.HandlerRegistration; +import com.google.gwt.event.shared.HasHandlers; + +/** + * Resubmit Computation Execution Event + * + * + * @author Giancarlo Panichi + * + * + */ +public class ResubmitComputationExecutionEvent + extends + GwtEvent { + + public static Type TYPE = new Type(); + private ComputationId computationId; + + public interface ResubmitComputationExecutionEventHandler extends + EventHandler { + void onResubmit(ResubmitComputationExecutionEvent event); + } + + public interface HasResubmitComputationExecutionEventHandler extends + HasHandlers { + public HandlerRegistration addResubmitComputationExecutionEventHandler( + ResubmitComputationExecutionEventHandler handler); + } + + public ResubmitComputationExecutionEvent(ComputationId computationId) { + this.computationId = computationId; + } + + @Override + protected void dispatch(ResubmitComputationExecutionEventHandler handler) { + handler.onResubmit(this); + } + + @Override + public Type getAssociatedType() { + return TYPE; + } + + public static Type getType() { + return TYPE; + } + + public static void fire(HasHandlers source, + ResubmitComputationExecutionEvent event) { + source.fireEvent(event); + } + + public ComputationId getComputationId() { + return computationId; + } + + @Override + public String toString() { + return "ResubmitComputationExecutionEvent [computationId=" + + computationId + "]"; + } + + + +} diff --git a/src/main/java/org/gcube/portlets/user/dataminerexecutor/client/events/ResubmitComputationExecutionRequestEvent.java b/src/main/java/org/gcube/portlets/user/dataminerexecutor/client/events/ResubmitComputationExecutionRequestEvent.java new file mode 100644 index 0000000..f75bf2c --- /dev/null +++ b/src/main/java/org/gcube/portlets/user/dataminerexecutor/client/events/ResubmitComputationExecutionRequestEvent.java @@ -0,0 +1,71 @@ +package org.gcube.portlets.user.dataminerexecutor.client.events; + +import org.gcube.data.analysis.dataminermanagercl.shared.workspace.ItemDescription; + +import com.google.gwt.event.shared.EventHandler; +import com.google.gwt.event.shared.GwtEvent; +import com.google.gwt.event.shared.HandlerRegistration; +import com.google.gwt.event.shared.HasHandlers; + +/** + * Resubmit Computation Execution Request Event + * + * + * @author Giancarlo Panichi + * + * + */ +public class ResubmitComputationExecutionRequestEvent + extends + GwtEvent { + + public static Type TYPE = new Type(); + private ItemDescription itemDescription; + + public interface ResubmitComputationExecutionRequestEventHandler extends + EventHandler { + void onResubmit(ResubmitComputationExecutionRequestEvent event); + } + + public interface HasResubmitComputationExecutionRequestEventHandler extends + HasHandlers { + public HandlerRegistration addResubmitComputationExecutionRequestEventHandler( + ResubmitComputationExecutionRequestEventHandler handler); + } + + public ResubmitComputationExecutionRequestEvent( + ItemDescription itemDescription) { + this.itemDescription = itemDescription; + } + + @Override + protected void dispatch( + ResubmitComputationExecutionRequestEventHandler handler) { + handler.onResubmit(this); + } + + @Override + public Type getAssociatedType() { + return TYPE; + } + + public static Type getType() { + return TYPE; + } + + public static void fire(HasHandlers source, + ResubmitComputationExecutionRequestEvent event) { + source.fireEvent(event); + } + + public ItemDescription getItemDescription() { + return itemDescription; + } + + @Override + public String toString() { + return "ResubmitComputationExecutionRequestEvent [itemDescription=" + + itemDescription + "]"; + } + +} diff --git a/src/main/java/org/gcube/portlets/user/dataminerexecutor/client/events/SessionExpiredEvent.java b/src/main/java/org/gcube/portlets/user/dataminerexecutor/client/events/SessionExpiredEvent.java new file mode 100644 index 0000000..5a44517 --- /dev/null +++ b/src/main/java/org/gcube/portlets/user/dataminerexecutor/client/events/SessionExpiredEvent.java @@ -0,0 +1,70 @@ +package org.gcube.portlets.user.dataminerexecutor.client.events; + +import org.gcube.portlets.user.dataminerexecutor.client.type.SessionExpiredEventType; + +import com.google.gwt.event.shared.EventHandler; +import com.google.gwt.event.shared.GwtEvent; +import com.google.gwt.event.shared.HandlerRegistration; +import com.google.gwt.event.shared.HasHandlers; + +/** + * Session Expired Event + * + * + * @author Giancarlo Panichi + * + * + */ +public class SessionExpiredEvent extends GwtEvent { + + public static Type TYPE = new Type(); + private SessionExpiredEventType sessionExpiredEventType; + + public interface SessionExpiredEventHandler extends EventHandler { + void onChange(SessionExpiredEvent event); + } + + public interface HasSessionExpiredEventHandler extends HasHandlers { + public HandlerRegistration addSessionExpiredEventHandler( + SessionExpiredEventHandler handler); + } + + public SessionExpiredEvent() { + this.sessionExpiredEventType = SessionExpiredEventType.EXPIREDONSERVER; + } + + public SessionExpiredEvent(SessionExpiredEventType sessionExpiredEventType) { + this.sessionExpiredEventType = sessionExpiredEventType; + } + + @Override + protected void dispatch(SessionExpiredEventHandler handler) { + handler.onChange(this); + } + + @Override + public Type getAssociatedType() { + return TYPE; + } + + public static Type getType() { + return TYPE; + } + + public static void fire(HasHandlers source, SessionExpiredEvent sessionExpieredEvent) { + source.fireEvent(sessionExpieredEvent); + } + + public SessionExpiredEventType getSessionExpiredEventType() { + return sessionExpiredEventType; + } + + @Override + public String toString() { + return "SessionExpiredEvent [sessionExpiredEventType=" + + sessionExpiredEventType + "]"; + } + + + +} diff --git a/src/main/java/org/gcube/portlets/user/dataminerexecutor/client/events/StartComputationExecutionEvent.java b/src/main/java/org/gcube/portlets/user/dataminerexecutor/client/events/StartComputationExecutionEvent.java new file mode 100644 index 0000000..a408a03 --- /dev/null +++ b/src/main/java/org/gcube/portlets/user/dataminerexecutor/client/events/StartComputationExecutionEvent.java @@ -0,0 +1,76 @@ +package org.gcube.portlets.user.dataminerexecutor.client.events; + +import org.gcube.data.analysis.dataminermanagercl.shared.data.computations.ComputationId; + +import com.google.gwt.event.shared.EventHandler; +import com.google.gwt.event.shared.GwtEvent; +import com.google.gwt.event.shared.HandlerRegistration; +import com.google.gwt.event.shared.HasHandlers; + +/** + * Start Computation Execution Event + * + * + * @author Giancarlo Panichi + * + * + */ +public class StartComputationExecutionEvent + extends + GwtEvent { + + public static Type TYPE = new Type(); + private ComputationId computationId; + private int computationStatusPanelIndex; + + public interface StartComputationExecutionEventHandler extends EventHandler { + void onStart(StartComputationExecutionEvent event); + } + + public interface HasStartComputationExecutionEventHandler extends + HasHandlers { + public HandlerRegistration addStartComputationExecutionEventHandler( + StartComputationExecutionEventHandler handler); + } + + public StartComputationExecutionEvent(ComputationId computationId, + int computationStatusPanelIndex) { + this.computationId = computationId; + this.computationStatusPanelIndex = computationStatusPanelIndex; + } + + @Override + protected void dispatch(StartComputationExecutionEventHandler handler) { + handler.onStart(this); + } + + @Override + public Type getAssociatedType() { + return TYPE; + } + + public static Type getType() { + return TYPE; + } + + public static void fire(HasHandlers source, + StartComputationExecutionEvent event) { + source.fireEvent(event); + } + + public ComputationId getComputationId() { + return computationId; + } + + public int getComputationStatusPanelIndex() { + return computationStatusPanelIndex; + } + + @Override + public String toString() { + return "StartComputationExecutionEvent [computationId=" + computationId + + ", computationStatusPanelIndex=" + + computationStatusPanelIndex + "]"; + } + +} diff --git a/src/main/java/org/gcube/portlets/user/dataminerexecutor/client/events/StartComputationExecutionRequestEvent.java b/src/main/java/org/gcube/portlets/user/dataminerexecutor/client/events/StartComputationExecutionRequestEvent.java new file mode 100644 index 0000000..1c18ca0 --- /dev/null +++ b/src/main/java/org/gcube/portlets/user/dataminerexecutor/client/events/StartComputationExecutionRequestEvent.java @@ -0,0 +1,78 @@ +package org.gcube.portlets.user.dataminerexecutor.client.events; + +import org.gcube.data.analysis.dataminermanagercl.shared.process.Operator; + +import com.google.gwt.event.shared.EventHandler; +import com.google.gwt.event.shared.GwtEvent; +import com.google.gwt.event.shared.HandlerRegistration; +import com.google.gwt.event.shared.HasHandlers; + +/** + * Start Computation Execution Request Event + * + * + * @author Giancarlo Panichi + * + * + */ +public class StartComputationExecutionRequestEvent + extends + GwtEvent { + + public static Type TYPE = new Type(); + private Operator op; + private int computationStatusPanelIndex; + + public interface StartComputationExecutionRequestEventHandler extends + EventHandler { + void onStart(StartComputationExecutionRequestEvent event); + } + + public interface HasStartComputationExecutionRequestEventHandler extends + HasHandlers { + public HandlerRegistration addStartComputationExecutionRequestEventHandler( + StartComputationExecutionRequestEventHandler handler); + } + + public StartComputationExecutionRequestEvent(Operator op, + int computationStatusPanelIndex) { + this.op = op; + this.computationStatusPanelIndex = computationStatusPanelIndex; + + } + + @Override + protected void dispatch(StartComputationExecutionRequestEventHandler handler) { + handler.onStart(this); + } + + @Override + public Type getAssociatedType() { + return TYPE; + } + + public static Type getType() { + return TYPE; + } + + public static void fire(HasHandlers source, + StartComputationExecutionRequestEvent event) { + source.fireEvent(event); + } + + public Operator getOp() { + return op; + } + + public int getComputationStatusPanelIndex() { + return computationStatusPanelIndex; + } + + @Override + public String toString() { + return "StartComputationExecutionRequestEvent [op=" + op + + ", computationStatusPanelIndex=" + + computationStatusPanelIndex + "]"; + } + +} diff --git a/src/main/java/org/gcube/portlets/user/dataminerexecutor/client/events/SyncRefreshUploadDataSpaceEvent.java b/src/main/java/org/gcube/portlets/user/dataminerexecutor/client/events/SyncRefreshUploadDataSpaceEvent.java new file mode 100644 index 0000000..dade895 --- /dev/null +++ b/src/main/java/org/gcube/portlets/user/dataminerexecutor/client/events/SyncRefreshUploadDataSpaceEvent.java @@ -0,0 +1,57 @@ +package org.gcube.portlets.user.dataminerexecutor.client.events; + +import com.google.gwt.event.shared.EventHandler; +import com.google.gwt.event.shared.GwtEvent; +import com.google.gwt.event.shared.HandlerRegistration; +import com.google.gwt.event.shared.HasHandlers; + +/** + * SyncRefreshUpload + * + * + * @author Giancarlo Panichi + * + * + */ +public class SyncRefreshUploadDataSpaceEvent + extends GwtEvent { + + public static Type TYPE = new Type(); + + public interface SyncRefreshUploadDataSpaceEventHandler extends EventHandler { + void onRefresh(SyncRefreshUploadDataSpaceEvent event); + } + + public interface HasSyncRefreshUploadDataSpaceEventHandler extends HasHandlers { + public HandlerRegistration addSyncRefreshUploadDataSpaceEventHandler( + SyncRefreshUploadDataSpaceEventHandler handler); + } + + public SyncRefreshUploadDataSpaceEvent() { + + } + + @Override + protected void dispatch(SyncRefreshUploadDataSpaceEventHandler handler) { + handler.onRefresh(this); + } + + @Override + public Type getAssociatedType() { + return TYPE; + } + + public static Type getType() { + return TYPE; + } + + public static void fire(HasHandlers source, SyncRefreshUploadDataSpaceEvent deleteItemEvent) { + source.fireEvent(deleteItemEvent); + } + + @Override + public String toString() { + return "SyncRefreshUploadDataSpaceEvent []"; + } + +} diff --git a/src/main/java/org/gcube/portlets/user/dataminerexecutor/client/events/TabularFldChangeEvent.java b/src/main/java/org/gcube/portlets/user/dataminerexecutor/client/events/TabularFldChangeEvent.java new file mode 100644 index 0000000..9d6be58 --- /dev/null +++ b/src/main/java/org/gcube/portlets/user/dataminerexecutor/client/events/TabularFldChangeEvent.java @@ -0,0 +1,66 @@ +package org.gcube.portlets.user.dataminerexecutor.client.events; + +import org.gcube.data.analysis.dataminermanagercl.shared.data.TableItemSimple; + +import com.google.gwt.event.shared.EventHandler; +import com.google.gwt.event.shared.GwtEvent; +import com.google.gwt.event.shared.HandlerRegistration; +import com.google.gwt.event.shared.HasHandlers; + +/** + * Start Computation Event + * + * + * @author Giancarlo Panichi + * + * + */ +public class TabularFldChangeEvent extends + GwtEvent { + + public static Type TYPE = new Type(); + private TableItemSimple tableItemSimple; + + public interface TabularFldChangeEventHandler extends EventHandler { + void onChange(TabularFldChangeEvent event); + } + + public interface HasTabularFldChangeEventHandler extends HasHandlers { + public HandlerRegistration addTabularFldChangeEventHandler( + TabularFldChangeEventHandler handler); + } + + public TabularFldChangeEvent(TableItemSimple tableItemSimple) { + this.tableItemSimple = tableItemSimple; + + } + + @Override + protected void dispatch(TabularFldChangeEventHandler handler) { + handler.onChange(this); + } + + @Override + public Type getAssociatedType() { + return TYPE; + } + + public static Type getType() { + return TYPE; + } + + public static void fire(HasHandlers source, TabularFldChangeEvent event) { + source.fireEvent(event); + } + + public TableItemSimple getTableItemSimple() { + return tableItemSimple; + } + + @Override + public String toString() { + return "TabularFldChangeEvent [tableItemSimple=" + tableItemSimple + + "]"; + } + +} diff --git a/src/main/java/org/gcube/portlets/user/dataminerexecutor/client/events/UIStateEvent.java b/src/main/java/org/gcube/portlets/user/dataminerexecutor/client/events/UIStateEvent.java new file mode 100644 index 0000000..f7eb1e6 --- /dev/null +++ b/src/main/java/org/gcube/portlets/user/dataminerexecutor/client/events/UIStateEvent.java @@ -0,0 +1,67 @@ +package org.gcube.portlets.user.dataminerexecutor.client.events; + +import org.gcube.portlets.user.dataminerexecutor.client.type.UIStateEventType; + +import com.google.gwt.event.shared.EventHandler; +import com.google.gwt.event.shared.GwtEvent; +import com.google.gwt.event.shared.HandlerRegistration; +import com.google.gwt.event.shared.HasHandlers; + +/** + * User Interface State Event + * + * + * @author Giancarlo Panichi + * + * + */ +public class UIStateEvent extends GwtEvent { + + public static Type TYPE = new Type(); + private UIStateEventType uiStateType; + + public interface UIStateEventHandler extends EventHandler { + void onChange(UIStateEvent event); + } + + public interface HasUIStateEventHandler extends HasHandlers { + public HandlerRegistration addUIStateEventHandler( + UIStateEventHandler handler); + } + + public UIStateEvent() { + this.uiStateType = UIStateEventType.START; + } + + public UIStateEvent(UIStateEventType uiStateType) { + this.uiStateType = uiStateType; + } + + @Override + protected void dispatch(UIStateEventHandler handler) { + handler.onChange(this); + } + + @Override + public Type getAssociatedType() { + return TYPE; + } + + public static Type getType() { + return TYPE; + } + + public static void fire(HasHandlers source, UIStateEvent uiStateEvent) { + source.fireEvent(uiStateEvent); + } + + public UIStateEventType getUiStateType() { + return uiStateType; + } + + @Override + public String toString() { + return "UIStatusEvent [uiStateType=" + uiStateType + "]"; + } + +} diff --git a/src/main/java/org/gcube/portlets/user/dataminerexecutor/client/events/WPSMenuEvent.java b/src/main/java/org/gcube/portlets/user/dataminerexecutor/client/events/WPSMenuEvent.java new file mode 100644 index 0000000..324523f --- /dev/null +++ b/src/main/java/org/gcube/portlets/user/dataminerexecutor/client/events/WPSMenuEvent.java @@ -0,0 +1,68 @@ +package org.gcube.portlets.user.dataminerexecutor.client.events; + + +import org.gcube.portlets.user.dataminerexecutor.client.type.WPSMenuType; + +import com.google.gwt.event.shared.EventHandler; +import com.google.gwt.event.shared.GwtEvent; +import com.google.gwt.event.shared.HandlerRegistration; +import com.google.gwt.event.shared.HasHandlers; + +/** + * WPS Menu Event + * + * + * @author Giancarlo Panichi + * + * + */ +public class WPSMenuEvent extends + GwtEvent { + + public static Type TYPE = new Type(); + private WPSMenuType menuType; + + public interface WPSMenuEventHandler extends EventHandler { + void onMenu(WPSMenuEvent event); + } + + public interface HasWPSMenuEventHandler extends HasHandlers { + public HandlerRegistration addWPSMenuEventHandler( + WPSMenuEventHandler handler); + } + + public WPSMenuEvent(WPSMenuType menuType) { + this.menuType = menuType; + } + + @Override + protected void dispatch(WPSMenuEventHandler handler) { + handler.onMenu(this); + } + + @Override + public Type getAssociatedType() { + return TYPE; + } + + public static Type getType() { + return TYPE; + } + + public static void fire(HasHandlers source, WPSMenuEvent wpsMenuEvent) { + source.fireEvent(wpsMenuEvent); + } + + public WPSMenuType getMenuType() { + return menuType; + } + + @Override + public String toString() { + return "WPSMenuEvent [menuType=" + menuType + "]"; + } + + + + +} diff --git a/src/main/java/org/gcube/portlets/user/dataminerexecutor/client/experiments/ComputationExecutionPanel.java b/src/main/java/org/gcube/portlets/user/dataminerexecutor/client/experiments/ComputationExecutionPanel.java new file mode 100644 index 0000000..9f1522e --- /dev/null +++ b/src/main/java/org/gcube/portlets/user/dataminerexecutor/client/experiments/ComputationExecutionPanel.java @@ -0,0 +1,209 @@ +package org.gcube.portlets.user.dataminerexecutor.client.experiments; + +import java.util.ArrayList; +import java.util.List; + +import org.gcube.data.analysis.dataminermanagercl.shared.process.Operator; +import org.gcube.portlets.user.dataminerexecutor.client.DataMinerExecutor; +import org.gcube.portlets.user.dataminerexecutor.client.common.EventBusProvider; +import org.gcube.portlets.user.dataminerexecutor.client.events.ResubmitComputationExecutionEvent; +import org.gcube.portlets.user.dataminerexecutor.client.events.StartComputationExecutionEvent; +import org.gcube.portlets.user.dataminerexecutor.client.events.StartComputationExecutionRequestEvent; + +import com.allen_sauer.gwt.log.client.Log; +import com.sencha.gxt.core.client.dom.ScrollSupport.ScrollMode; +import com.sencha.gxt.core.client.util.Margins; +import com.sencha.gxt.widget.core.client.FramedPanel; +import com.sencha.gxt.widget.core.client.button.TextButton; +import com.sencha.gxt.widget.core.client.container.SimpleContainer; +import com.sencha.gxt.widget.core.client.container.VerticalLayoutContainer; +import com.sencha.gxt.widget.core.client.container.VerticalLayoutContainer.VerticalLayoutData; +import com.sencha.gxt.widget.core.client.event.SelectEvent; +import com.sencha.gxt.widget.core.client.event.SelectEvent.SelectHandler; +import com.sencha.gxt.widget.core.client.toolbar.LabelToolItem; +import com.sencha.gxt.widget.core.client.toolbar.ToolBar; + +/** + * + * @author Giancarlo Panichi + * + * + */ +public class ComputationExecutionPanel extends FramedPanel { + + private List computationStatusPanels = new ArrayList(); + + private static final String DELETE_ALL_BUTTON_TOOLTIP = "Remove Computations Log"; + private TextButton removeAllButton; + + private VerticalLayoutContainer v; + + private ToolBar toolBar; + + private VerticalLayoutContainer topV; + + /** + * + */ + public ComputationExecutionPanel() { + super(); + Log.debug("Computation Execution Panel"); + init(); + create(); + bind(); + } + + private void init() { + setHeaderVisible(false); + addStyleName("computationExcecutionPanel"); + setBodyStyle("backgroundColor:white;"); + } + + private void create() { + topV = new VerticalLayoutContainer(); + setToolBar(); + topV.add(toolBar, new VerticalLayoutData(1, -1, new Margins(0))); + SimpleContainer computations = new SimpleContainer(); + v = new VerticalLayoutContainer(); + v.setScrollMode(ScrollMode.AUTO); + computations.add(v); + topV.add(computations, new VerticalLayoutData(1, 1, new Margins(0))); + add(topV); + } + + private void bind() { + EventBusProvider.INSTANCE + .addHandler( + ResubmitComputationExecutionEvent.getType(), + new ResubmitComputationExecutionEvent.ResubmitComputationExecutionEventHandler() { + @Override + public void onResubmit( + ResubmitComputationExecutionEvent event) { + Log.debug("ResubmitComputationExecutionEvent: " + + event); + resubmitComputation(event); + } + }); + + EventBusProvider.INSTANCE + .addHandler( + StartComputationExecutionEvent.getType(), + new StartComputationExecutionEvent.StartComputationExecutionEventHandler() { + + @Override + public void onStart( + StartComputationExecutionEvent event) { + Log.debug("Catch StartComputationExecutionEvent: " + + event); + startComputation(event); + + } + + }); + + + + } + + public void startNewComputation(final Operator operator) { + Log.debug("Computation Panel: start new computation "); + ComputationStatusPanel statusPanel = new ComputationStatusPanel( + operator.getName()); + computationStatusPanels.add(statusPanel); + int index = computationStatusPanels.indexOf(statusPanel); + statusPanel.setItemId("ComputationStatusPanel" + String.valueOf(index)); + + Log.debug("Added status bar"); + v.insert(statusPanel, 0, new VerticalLayoutData(1, -1, new Margins(20))); + removeAllButton.setEnabled(true); + forceLayout(); + + StartComputationExecutionRequestEvent event = new StartComputationExecutionRequestEvent( + operator, index); + EventBusProvider.INSTANCE.fireEvent(event); + + } + + private void startComputation(StartComputationExecutionEvent event) { + try { + ComputationStatusPanel statusPanel = null; + try { + statusPanel = computationStatusPanels.get(event + .getComputationStatusPanelIndex()); + } catch (IndexOutOfBoundsException e) { + Log.debug("No ComputationStatusPanel retrieved!"); + Log.debug(e.getLocalizedMessage()); + } + + if (statusPanel == null) { + + } else { + statusPanel.computationStarted(event.getComputationId()); + forceLayout(); + } + + } catch (Throwable e) { + Log.error(e.getLocalizedMessage()); + e.printStackTrace(); + } + } + + private void resubmitComputation(ResubmitComputationExecutionEvent event) { + final ComputationStatusPanel statusPanel = new ComputationStatusPanel( + event.getComputationId().getOperatorName()); + computationStatusPanels.add(statusPanel); + if (v.getWidgetCount() == 0) { + v.add(statusPanel, new VerticalLayoutData(1, -1, new Margins(20))); + } else { + v.insert(statusPanel, 0, new VerticalLayoutData(1, -1, new Margins( + 20))); + } + removeAllButton.setEnabled(true); + + statusPanel.computationStarted(event.getComputationId()); + + forceLayout(); + + } + + + + /** + * + */ + private void emptyPanel() { + // stop timers + for (ComputationStatusPanel statusPanel : computationStatusPanels) + statusPanel.stopTimer(); + + removeAllButton.setEnabled(false); + v.clear(); + computationStatusPanels.clear(); + forceLayout(); + } + + private void setToolBar() { + toolBar = new ToolBar(); + + removeAllButton = new TextButton("Remove All"); + + removeAllButton.addSelectHandler(new SelectHandler() { + + @Override + public void onSelect(SelectEvent event) { + emptyPanel(); + + } + }); + + removeAllButton.setIcon(DataMinerExecutor.resources.removeAll()); + + removeAllButton.setToolTip(DELETE_ALL_BUTTON_TOOLTIP); + // removeAllButton.setScale(ButtonScale.MEDIUM); + removeAllButton.setEnabled(false); + + toolBar.add(new LabelToolItem("Tools:")); + toolBar.add(removeAllButton); + + } +} diff --git a/src/main/java/org/gcube/portlets/user/dataminerexecutor/client/experiments/ComputationOutputPanel.java b/src/main/java/org/gcube/portlets/user/dataminerexecutor/client/experiments/ComputationOutputPanel.java new file mode 100644 index 0000000..bc45765 --- /dev/null +++ b/src/main/java/org/gcube/portlets/user/dataminerexecutor/client/experiments/ComputationOutputPanel.java @@ -0,0 +1,295 @@ +/** + * + */ +package org.gcube.portlets.user.dataminerexecutor.client.experiments; + +import java.util.LinkedHashMap; +import java.util.Map; + +import org.gcube.data.analysis.dataminermanagercl.shared.data.computations.ComputationId; +import org.gcube.data.analysis.dataminermanagercl.shared.data.output.FileResource; +import org.gcube.data.analysis.dataminermanagercl.shared.data.output.ImageResource; +import org.gcube.data.analysis.dataminermanagercl.shared.data.output.MapResource; +import org.gcube.data.analysis.dataminermanagercl.shared.data.output.ObjectResource; +import org.gcube.data.analysis.dataminermanagercl.shared.data.output.Resource; +import org.gcube.data.analysis.dataminermanagercl.shared.data.output.Resource.ResourceType; +import org.gcube.portlets.user.dataminerexecutor.client.common.EventBusProvider; +import org.gcube.portlets.user.dataminerexecutor.client.events.OutputDataEvent; +import org.gcube.portlets.user.dataminerexecutor.client.events.OutputDataRequestEvent; +import org.gcube.portlets.user.dataminerexecutor.client.util.UtilsGXT3; +import org.gcube.portlets.user.dataminerexecutor.client.widgets.FileViewer; +import org.gcube.portlets.user.dataminerexecutor.client.widgets.ImageViewer; +import org.gcube.portlets.user.dataminerexecutor.client.widgets.ResourceViewer; +import org.gcube.data.analysis.dataminermanagercl.shared.data.output.TableResource; + +import com.allen_sauer.gwt.log.client.Log; +import com.google.gwt.core.client.GWT; +import com.google.gwt.safehtml.shared.SafeHtml; +import com.sencha.gxt.core.client.XTemplates; +import com.sencha.gxt.core.client.util.Margins; +import com.sencha.gxt.widget.core.client.container.HtmlLayoutContainer; +import com.sencha.gxt.widget.core.client.container.SimpleContainer; +import com.sencha.gxt.widget.core.client.container.VerticalLayoutContainer; +import com.sencha.gxt.widget.core.client.container.VerticalLayoutContainer.VerticalLayoutData; + +/** + * + * @author Giancarlo Panichi + * + * + */ +public class ComputationOutputPanel extends SimpleContainer { + + private ComputationId computationId; + private VerticalLayoutContainer v; + + public ComputationOutputPanel(ComputationId computationId) { + super(); + this.computationId = computationId; + Log.debug("ComputationOutputPanel: " + computationId); + bind(); + init(); + OutputDataRequestEvent event = new OutputDataRequestEvent(computationId); + EventBusProvider.INSTANCE.fireEvent(event); + + } + + private void init() { + v = new VerticalLayoutContainer(); + add(v); + } + + private void bind() { + EventBusProvider.INSTANCE.addHandler(OutputDataEvent.TYPE, + new OutputDataEvent.OutputDataEventHandler() { + + @Override + public void onOutput(OutputDataEvent event) { + Log.debug("Catch OutputDataEvent: " + event); + if (event!=null&& event.getOutputData()!=null&& + event.getOutputData().getComputationId()!=null&& + event.getOutputData().getComputationId().getId() + .compareTo(computationId.getId()) == 0) { + manageOutputDataEvent(event); + } + + } + }); + + } + + /** + * + * @param resource + */ + private void manageOutputDataEvent(OutputDataEvent event) { + try { + if (event == null || event.getOutputData() == null) { + Log.error("OutputDataEvent is null"); + UtilsGXT3.alert("Error", "Invalid output data!"); + return; + } + Resource resource = event.getOutputData().getResource(); + showResource(resource); + } catch (Throwable e) { + Log.error("Error in show output info: " + e.getLocalizedMessage()); + e.printStackTrace(); + } + } + + private void showResource(Resource resource) { + try { + Log.info("Show Output Info on: " + resource); + if (resource == null) { + Log.debug("Output Data hasn't resource!"); + return; + } + + ResourceType resourceType = resource.getResourceType(); + + switch (resourceType) { + + case FILE: + FileResource fileResource = (FileResource) resource; + v.add(getHtmlTitle("The algorithm produced a", "File"), + new VerticalLayoutData(1, -1, new Margins(0))); + v.add(getFileResourceOutput(fileResource), + new VerticalLayoutData(1, -1, new Margins(0))); + break; + + case TABULAR: + //TableResource tabResource = (TableResource) resource; + v.add(getHtmlTitle("The algorithm produced a", "Table"), + new VerticalLayoutData(1, -1, new Margins(0))); + // v.add(getTabResourceOutput(tabResource), + // new VerticalLayoutData(1, -1, new Margins(0))); + break; + + case IMAGE: + v.add(getHtmlTitle("The algorithm produced an", "Set of Images"), + new VerticalLayoutData(1, -1, new Margins(0))); + final ImageResource imagesResource = (ImageResource) resource; + v.add(getImagesResourceOutput(imagesResource), + new VerticalLayoutData(1, -1, new Margins(0))); + break; + + case MAP: + v.add(getHtmlTitle("The algorithm produced ", + "Multiple Results"), new VerticalLayoutData(1, -1, + new Margins(0))); + + final MapResource mapResource = (MapResource) resource; + + v.add(getMultipleOutput(mapResource), new VerticalLayoutData(1, + -1, new Margins(0))); + break; + case OBJECT: + break; + default: + break; + + } + + forceLayout(); + } catch (Throwable e) { + Log.error("Error in show resource: " + e.getLocalizedMessage()); + e.printStackTrace(); + } + } + + public interface TitleTemplate extends XTemplates { + @XTemplate("

{intro} {produced}.

") + SafeHtml getTemplate(String intro, String produced); + } + + /** + * @param string + * @return + */ + private HtmlLayoutContainer getHtmlTitle(String intro, String produced) { + TitleTemplate templates = GWT.create(TitleTemplate.class); + HtmlLayoutContainer c = new HtmlLayoutContainer(templates.getTemplate( + intro, produced)); + + return c; + } + + /** + * @param imagesResource + * @return + */ + private SimpleContainer getImagesResourceOutput( + ImageResource imagesResource) { + return new ImageViewer(computationId, imagesResource); + } + + /** + * + * @param fileResource + * @return + */ + private SimpleContainer getFileResourceOutput(FileResource fileResource) { + return new FileViewer(computationId, fileResource); + } + + /** + * @param map + * @return + */ + private SimpleContainer getMultipleOutput(MapResource mapResource) { + Map map = mapResource.getMap(); + VerticalLayoutContainer vp = new VerticalLayoutContainer(); + SimpleContainer container = new SimpleContainer(); + + Map mapValues = new LinkedHashMap<>(); + Map mapFiles = new LinkedHashMap<>(); + Map mapTabs = new LinkedHashMap<>(); + Map mapImages = new LinkedHashMap<>(); + + for (String key : map.keySet()) { + Resource resource = map.get(key); + ResourceType resourceType = resource.getResourceType(); + + switch (resourceType) { + case OBJECT: + mapValues.put(key, (ObjectResource) resource); + break; + case FILE: + mapFiles.put(key, (FileResource) resource); + break; + case TABULAR: + mapTabs.put(key, (TableResource) resource); + break; + case IMAGE: + mapImages.put(key, (ImageResource) resource); + break; + case MAP: + break; + default: + break; + } + } + + if (mapValues.size() > 0) { + HtmlLayoutContainer html = new HtmlLayoutContainer("Output Values"); + html.setStyleName("computation-output-groupTitle"); + vp.add(html, new VerticalLayoutData(-1, -1, new Margins(0))); + + vp.add((new ResourceViewer(mapValues)).getHtml(), + new VerticalLayoutData(1, -1, new Margins(0))); + + html = new HtmlLayoutContainer( + "
"); + vp.add(html, new VerticalLayoutData(-1, -1, new Margins(0))); + } + + if (mapFiles.size() > 0) { + HtmlLayoutContainer html = new HtmlLayoutContainer("Files"); + html.setStyleName("computation-output-groupTitle"); + vp.add(html, new VerticalLayoutData(-1, -1, new Margins(0))); + + for (String fileKey : mapFiles.keySet()) { + // vp.add(new Html(""+fileKey+"")); + vp.add(getFileResourceOutput(mapFiles.get(fileKey)), + new VerticalLayoutData(1, -1, new Margins(0))); + } + + html = new HtmlLayoutContainer( + "
"); + vp.add(html, new VerticalLayoutData(-1, -1, new Margins(0))); + } + + if (mapTabs.size() > 0) { + HtmlLayoutContainer html = new HtmlLayoutContainer("Tables"); + html.setStyleName("computation-output-groupTitle"); + vp.add(html, new VerticalLayoutData(-1, -1, new Margins(0))); + + //for (String tabKey : mapTabs.keySet()) { + // vp.add(new Html(""+tabKey+"")); + // vp.add(getTabResourceOutput(mapTabs.get(tabKey))); + //} + + html = new HtmlLayoutContainer( + "
"); + vp.add(html, new VerticalLayoutData(-1, -1, new Margins(0))); + } + + if (mapImages.size() > 0) { + HtmlLayoutContainer html = new HtmlLayoutContainer("Images"); + html.setStyleName("computation-output-groupTitle"); + vp.add(html, new VerticalLayoutData(-1, -1, new Margins(0))); + + for (String imagesKey : mapImages.keySet()) { + vp.add(getImagesResourceOutput(mapImages.get(imagesKey)), + new VerticalLayoutData(1, -1, new Margins(0))); + } + + html = new HtmlLayoutContainer( + "
"); + vp.add(html, new VerticalLayoutData(-1, -1, new Margins(0))); + } + + container.add(vp); + return container; + } +} diff --git a/src/main/java/org/gcube/portlets/user/dataminerexecutor/client/experiments/ComputationPanel.java b/src/main/java/org/gcube/portlets/user/dataminerexecutor/client/experiments/ComputationPanel.java new file mode 100644 index 0000000..816fb00 --- /dev/null +++ b/src/main/java/org/gcube/portlets/user/dataminerexecutor/client/experiments/ComputationPanel.java @@ -0,0 +1,155 @@ +package org.gcube.portlets.user.dataminerexecutor.client.experiments; + +import org.gcube.data.analysis.dataminermanagercl.shared.process.Operator; +import org.gcube.portlets.user.dataminerexecutor.client.DataMinerExecutor; +import org.gcube.portlets.user.dataminerexecutor.client.events.ComputationReadyEvent; +import org.gcube.portlets.user.dataminerexecutor.client.events.ComputationReadyEvent.ComputationReadyEventHandler; +import org.gcube.portlets.user.dataminerexecutor.client.events.ComputationReadyEvent.HasComputationReadyEventHandler; +import org.gcube.portlets.user.dataminerexecutor.client.experiments.ComputationParametersPanel.ComputationParametersPanelHandler; + +import com.google.gwt.event.shared.HandlerRegistration; +import com.google.gwt.user.client.ui.Image; +import com.sencha.gxt.core.client.dom.ScrollSupport.ScrollMode; +import com.sencha.gxt.core.client.util.Margins; +import com.sencha.gxt.widget.core.client.FramedPanel; +import com.sencha.gxt.widget.core.client.container.BoxLayoutContainer.BoxLayoutData; +import com.sencha.gxt.widget.core.client.container.BoxLayoutContainer.BoxLayoutPack; +import com.sencha.gxt.widget.core.client.container.HBoxLayoutContainer; +import com.sencha.gxt.widget.core.client.container.SimpleContainer; +import com.sencha.gxt.widget.core.client.container.VerticalLayoutContainer; +import com.sencha.gxt.widget.core.client.container.VerticalLayoutContainer.VerticalLayoutData; + +/** + * + * @author Giancarlo Panichi + * + * + */ +public class ComputationPanel extends FramedPanel implements HasComputationReadyEventHandler + { + //private static final String DELETE_ALL_BUTTON_TOOLTIP = "Remove All Operators"; + //private TextButton removeAllButton; + //private ToolBar toolBar; + private VerticalLayoutContainer topV; + private VerticalLayoutContainer v; + private ComputationParametersPanel computationParametersPanel; + + public ComputationPanel() { + super(); + init(); + create(); + bind(); + } + + + private void init() { + setHeaderVisible(false); + setBodyStyle("backgroundColor:white;"); + } + + private void create() { + computationParametersPanel=null; + topV = new VerticalLayoutContainer(); + topV.setScrollMode(ScrollMode.NONE); + //setToolBar(); + //topV.add(toolBar, new VerticalLayoutData(1, -1, new Margins(0))); + SimpleContainer operator = new SimpleContainer(); + v = new VerticalLayoutContainer(); + v.setScrollMode(ScrollMode.AUTO); + operator.add(v); + topV.add(operator, new VerticalLayoutData(1, 1, new Margins(0))); + add(topV); + //emptyPanel(); + } + + private void bind() { + + /*EventBusProvider.INSTANCE.addHandler(RemoveSelectedOperatorEvent.TYPE, + new RemoveSelectedOperatorEvent.RemoveSelectedOperatorEventHandler() { + + @Override + public void onSelect(RemoveSelectedOperatorEvent event) { + Log.debug("Catch RemoveSelectedOperatorEvent"); + emptyPanel(); + computationParametersPanel = null; + + } + });*/ + } + + + /*private void setToolBar() { + toolBar = new ToolBar(); + toolBar.add(new LabelToolItem("Tools:")); + + removeAllButton = new TextButton(DELETE_ALL_BUTTON_TOOLTIP); + removeAllButton.setToolTip(DELETE_ALL_BUTTON_TOOLTIP); + removeAllButton.setIcon(DataMinerExecutor.resources.removeAll()); + removeAllButton.setEnabled(false); + removeAllButton.addSelectHandler(new SelectHandler() { + + @Override + public void onSelect(SelectEvent event) { + emptyPanel(); + computationParametersPanel = null; + } + }); + + toolBar.add(removeAllButton); + } + + private void emptyPanel() { + removeAllButton.setEnabled(false); + v.clear(); + CenterLayoutContainer centerContainer = new CenterLayoutContainer(); + centerContainer.add(new HTML( + "Select an operator.")); + v.add(centerContainer, new VerticalLayoutData(1, 1, new Margins(0))); + forceLayout(); + + }*/ + + + private void addComputationParametersPanel( + ComputationParametersPanel computationParametersPanel) { + v.clear(); + HBoxLayoutContainer hBox = new HBoxLayoutContainer(); + hBox.setPack(BoxLayoutPack.CENTER); + hBox.add(new Image(DataMinerExecutor.resources.workflowConnector1()), + new BoxLayoutData(new Margins(0))); + v.add(hBox, new VerticalLayoutData(1, -1, new Margins(10,0,0,0))); + v.add(computationParametersPanel, new VerticalLayoutData(1, -1, + new Margins(0))); + //removeAllButton.setEnabled(true); + forceLayout(); + } + + @Override + public HandlerRegistration addComputationReadyEventHandler( + ComputationReadyEventHandler handler) { + return addHandler(handler, ComputationReadyEvent.getType()); + + } + + public void addOperator(Operator operator) { + computationParametersPanel = new ComputationParametersPanel(operator); + computationParametersPanel.setHandler(new ComputationParametersPanelHandler() { + @Override + public void startComputation() { + if (computationParametersPanel != null) { + forceLayout(); + Operator op = computationParametersPanel.getOperator(); + ComputationReadyEvent event = new ComputationReadyEvent(op); + fireEvent(event); + } + + } + }); + + addComputationParametersPanel(computationParametersPanel); + + } + + + +} diff --git a/src/main/java/org/gcube/portlets/user/dataminerexecutor/client/experiments/ComputationParametersPanel.java b/src/main/java/org/gcube/portlets/user/dataminerexecutor/client/experiments/ComputationParametersPanel.java new file mode 100644 index 0000000..b3baf57 --- /dev/null +++ b/src/main/java/org/gcube/portlets/user/dataminerexecutor/client/experiments/ComputationParametersPanel.java @@ -0,0 +1,233 @@ +/** + * + */ +package org.gcube.portlets.user.dataminerexecutor.client.experiments; + +import java.util.Arrays; +import java.util.HashMap; +import java.util.Map; + +import org.gcube.data.analysis.dataminermanagercl.shared.parameters.Parameter; +import org.gcube.data.analysis.dataminermanagercl.shared.process.Operator; +import org.gcube.portlets.user.dataminerexecutor.client.DataMinerExecutor; +import org.gcube.portlets.user.dataminerexecutor.client.parametersfield.OperatorFieldWidget; +import org.gcube.portlets.user.dataminerexecutor.shared.Constants; + +import com.allen_sauer.gwt.log.client.Log; +import com.google.gwt.core.client.GWT; +import com.google.gwt.dom.client.Style.Unit; +import com.google.gwt.resources.client.ImageResource; +import com.google.gwt.user.client.Window.Location; +import com.google.gwt.user.client.ui.Image; +import com.sencha.gxt.core.client.util.Margins; +import com.sencha.gxt.widget.core.client.button.TextButton; +import com.sencha.gxt.widget.core.client.container.HtmlLayoutContainer; +import com.sencha.gxt.widget.core.client.container.MarginData; +import com.sencha.gxt.widget.core.client.container.SimpleContainer; +import com.sencha.gxt.widget.core.client.container.VerticalLayoutContainer; +import com.sencha.gxt.widget.core.client.container.VerticalLayoutContainer.VerticalLayoutData; +import com.sencha.gxt.widget.core.client.event.SelectEvent; +import com.sencha.gxt.widget.core.client.event.SelectEvent.SelectHandler; +import com.sencha.gxt.widget.core.client.form.FieldSet; +import com.sencha.gxt.widget.core.client.form.FormPanel; + +/** + * + * @author Giancarlo Panichi + * + * + */ +public class ComputationParametersPanel extends SimpleContainer { + + public interface ComputationParametersPanelHandler { + public void startComputation(); + } + + private static final String START_BUTTON_TOOLTIP = "Start Computation"; + + private static final ImageResource PRELOAD_IMAGE = DataMinerExecutor.resources + .loaderBig(); + + private VerticalLayoutContainer v; + private Operator operator; + private FormPanel parametersPanel; + private FieldSet parametersFieldSet; + private VerticalLayoutContainer vParameters; + private Map fieldWidgetsMap; + private ComputationParametersPanelHandler handler = null; + + private TextButton submit; + + public ComputationParametersPanel(Operator operator) { + super(); + this.operator = operator; + fieldWidgetsMap = new HashMap<>(); + try { + init(); + create(); + } catch (Throwable e) { + Log.error("ComputationParametersPanel" + e.getLocalizedMessage()); + e.printStackTrace(); + } + } + + private void init() { + setStylePrimaryName("workflow"); + setResize(true); + + } + + private void create() { + v = new VerticalLayoutContainer(); + add(v); + + Image img = new Image(GWT.getModuleBaseURL() + "../images/operators/" + + (operator.hasImage() ? operator.getId() : "DEFAULT_IMAGE") + + ".png"); + img.setStylePrimaryName("workflow-icon");// -15 + v.add(img, new VerticalLayoutData(-1, -1, new Margins(-15, 0, 0, 5))); + + String locationRef = ""; + try { + String location = Location.getHref(); + String[] locationData = location.split("\\?"); + locationRef = locationData[0]; + } catch (Throwable e) { + Log.error("Error retrieving location: " + e.getLocalizedMessage()); + } + + HtmlLayoutContainer title = new HtmlLayoutContainer("" + operator.getName() + ""); + title.addStyleName("workflow-title"); + v.add(title, new VerticalLayoutData(-1, -1, new Margins(20, 0, 0, -25))); + + String descr = operator.getDescription(); + descr = (descr == null || descr.contentEquals("")) ? "no-description" + : operator.getDescription();// display:block;clear:both;' + HtmlLayoutContainer description = new HtmlLayoutContainer( + "" + + descr + ""); + description.addStyleName("workflow-description"); + v.add(description, new VerticalLayoutData(-1, -1, new Margins(0))); + + // addTitleField(); + + parametersPanel = new FormPanel() { + @Override + public boolean isValid(boolean preventMark) { + boolean flag = super.isValid(preventMark); + + if (flag) { + for (Map.Entry entry : fieldWidgetsMap + .entrySet()) { + OperatorFieldWidget fieldWidget = entry.getValue(); + flag = flag && fieldWidget.isValid(); + } + } + return flag; + } + + }; + // parametersPanel = new FramedPanel(); + parametersPanel.setBorders(false); + parametersPanel.getElement().getStyle().setPaddingBottom(20, Unit.PX); + + parametersFieldSet = new FieldSet(); + parametersFieldSet.setHeadingText("Parameters"); + + vParameters = new VerticalLayoutContainer(); + + Image imgLoading = new Image(PRELOAD_IMAGE); + vParameters.add(imgLoading, new VerticalLayoutData(1, -1, + new Margins(0))); + + parametersFieldSet.add(vParameters, new MarginData(new Margins(0))); + parametersFieldSet.setCollapsible(false); + parametersPanel.add(parametersFieldSet); + + v.add(parametersPanel, new VerticalLayoutData(1, -1, new Margins(5))); + + submit = new TextButton("Start Computation"); + submit.setToolTip(START_BUTTON_TOOLTIP); + submit.setIcon(DataMinerExecutor.resources.startComputation()); + + submit.getElement().getStyle().setMarginLeft(20, Unit.PX); + submit.getElement().getStyle().setMarginBottom(20, Unit.PX); + + submit.addSelectHandler(new SelectHandler() { + + @Override + public void onSelect(SelectEvent event) { + if (handler != null && parametersPanel.isValid()) { + handler.startComputation(); // TODO insert + // description + } + + } + }); + + v.add(submit); + // , new VerticalLayoutData(-1, -1, new Margins(0, 0, 20, 20))); + submit.setVisible(false); + + forceLayout(); + loadOperatorParameters(); + + } + + /* + * private void addTitleField() { titleField = new TextField(); + * titleField.setWidth(250); titleField.setValue(defaultComputationTitle); + * FieldLabel titleLabel = new FieldLabel(titleField, "Computation Title"); + * titleLabel.addStyleName("workflow-computation-title"); v.add(titleLabel, + * new VerticalLayoutData(-1, -1, new Margins(0))); } + */ + + /** + * @param parameter parametersPanel + */ + private void loadOperatorParameters() { + vParameters.clear(); + showForm(); + } + + /** + * + */ + protected void showForm() { + try { + + // field widgets creation + for (Parameter p : operator.getOperatorParameters()) { + OperatorFieldWidget fieldWidget = new OperatorFieldWidget(p); + fieldWidgetsMap.put(p.getName(), fieldWidget); + vParameters.add(fieldWidget.getParameterLabel(), + new VerticalLayoutData(1, -1, new Margins(0))); + } + + parametersPanel.getElement().getStyle() + .setPaddingBottom(0, Unit.PX); + submit.setVisible(true); + parametersPanel.forceLayout(); + forceLayout(); + + } catch (Throwable e) { + Log.error("Error in show form:" + e.getLocalizedMessage()); + Log.error("Error: " + Arrays.asList(e.getStackTrace()).toString(),e); + } + } + + + /** + * @return the operator + */ + public Operator getOperator() { + return operator; + } + + public void setHandler(ComputationParametersPanelHandler handler) { + this.handler = handler; + } + +} diff --git a/src/main/java/org/gcube/portlets/user/dataminerexecutor/client/experiments/ComputationStatusPanel.java b/src/main/java/org/gcube/portlets/user/dataminerexecutor/client/experiments/ComputationStatusPanel.java new file mode 100644 index 0000000..7f90611 --- /dev/null +++ b/src/main/java/org/gcube/portlets/user/dataminerexecutor/client/experiments/ComputationStatusPanel.java @@ -0,0 +1,320 @@ +/** + * + */ +package org.gcube.portlets.user.dataminerexecutor.client.experiments; + +import org.gcube.data.analysis.dataminermanagercl.shared.data.computations.ComputationId; +import org.gcube.data.analysis.dataminermanagercl.shared.process.ComputationStatus; +import org.gcube.data.analysis.dataminermanagercl.shared.process.ComputationStatus.Status; +import org.gcube.portlets.user.dataminerexecutor.client.common.EventBusProvider; +import org.gcube.portlets.user.dataminerexecutor.client.custom.progress.GreenProgressBar; +import org.gcube.portlets.user.dataminerexecutor.client.custom.progress.OrangeProgressBar; +import org.gcube.portlets.user.dataminerexecutor.client.custom.progress.RedProgressBar; +import org.gcube.portlets.user.dataminerexecutor.client.events.CancelComputationExecutionRequestEvent; +import org.gcube.portlets.user.dataminerexecutor.client.rpc.DataMinerExecutorServiceAsync; +import org.gcube.portlets.user.dataminerexecutor.client.util.ElementsHighlights; +import org.gcube.portlets.user.dataminerexecutor.client.util.UtilsGXT3; +import org.gcube.portlets.user.dataminerexecutor.shared.Constants; + +import com.allen_sauer.gwt.log.client.Log; +import com.google.gwt.dom.client.Style.Unit; +import com.google.gwt.user.client.Timer; +import com.google.gwt.user.client.rpc.AsyncCallback; +import com.sencha.gxt.core.client.util.Margins; +import com.sencha.gxt.widget.core.client.ProgressBar; +import com.sencha.gxt.widget.core.client.button.TextButton; +import com.sencha.gxt.widget.core.client.container.HtmlLayoutContainer; +import com.sencha.gxt.widget.core.client.container.SimpleContainer; +import com.sencha.gxt.widget.core.client.container.VerticalLayoutContainer; +import com.sencha.gxt.widget.core.client.container.VerticalLayoutContainer.VerticalLayoutData; +import com.sencha.gxt.widget.core.client.event.SelectEvent; +import com.sencha.gxt.widget.core.client.event.SelectEvent.SelectHandler; +import com.sencha.gxt.widget.core.client.form.FieldLabel; +import com.sencha.gxt.widget.core.client.info.Info; + +/** + * + * @author Giancarlo Panichi + * + * + */ +public class ComputationStatusPanel extends SimpleContainer { + + private ProgressBar progressBar; + private ComputationId computationId; + private String operatorName; + private boolean terminated = false; + private ComputationTimer timer = new ComputationTimer(); + private TextButton cancelComputationBtn; + private VerticalLayoutContainer vert; + + /** + * + * @param operatorName operator name + */ + public ComputationStatusPanel(String operatorName) { + super(); + this.operatorName = operatorName; + init(); + create(); + } + + private void init() { + setStylePrimaryName("computationStatusPanel"); + } + + private void create() { + vert = new VerticalLayoutContainer(); + HtmlLayoutContainer title = new HtmlLayoutContainer( + "

Computation of " + + operatorName + "

"); + vert.add(title, new VerticalLayoutData(-1, -1, new Margins(0))); + add(vert); + forceLayout(); + } + + /** + * @param computationId + * the computationId to set + */ + public void computationStarted(ComputationId computationId) { + this.computationId = computationId; + /* + * HtmlLayoutContainer date = new HtmlLayoutContainer( + * "

" + new Date().toString() + + * "

"); + */ + // vert.add(date, new VerticalLayoutData(-1, -1, new Margins(0))); + + vert.add(new HtmlLayoutContainer("

Created, the id is " + + computationId.getId() + "

")); + + TextButton equivalentRequestBtn = new TextButton(); + equivalentRequestBtn.setText("Show"); + equivalentRequestBtn.addSelectHandler(new SelectHandler() { + + @Override + public void onSelect(SelectEvent event) { + showEquivalentRequestDialog(); + + } + + }); + + FieldLabel equivalentRequestLabel = new FieldLabel( + equivalentRequestBtn, "Equivalent Get Request"); + equivalentRequestLabel.setLabelWidth(140); + //vert.add(equivalentRequestLabel, new VerticalLayoutData(-1, -1, + // new Margins(0))); + + progressBar = new ProgressBar(); + progressBar.updateProgress(0, "Starting..."); + vert.add(progressBar, new VerticalLayoutData(1, -1, new Margins(20))); + + cancelComputationBtn = new TextButton("Cancel"); + + cancelComputationBtn.addSelectHandler(new SelectHandler() { + + @Override + public void onSelect(SelectEvent event) { + cancelComputationBtn.disable(); + cancelComputation(); + + } + }); + + cancelComputationBtn.getElement().getStyle() + .setMarginBottom(36, Unit.PX); + + vert.add(cancelComputationBtn, new VerticalLayoutData(-1, -1, + new Margins(0))); + forceLayout(); + timer.scheduleRepeating(Constants.TIME_UPDATE_COMPUTATION_STATUS_PANEL); + } + + private void showEquivalentRequestDialog() { + EquivalentRequestDialog equivalentRequestDialog = new EquivalentRequestDialog( + computationId); + equivalentRequestDialog.show(); + } + + private void cancelComputation() { + CancelComputationExecutionRequestEvent event = new CancelComputationExecutionRequestEvent( + computationId); + EventBusProvider.INSTANCE.fireEvent(event); + } + + /** + * @param computationId + * @param operator + * + */ + private void computationTerminated(ComputationId computationId, + ComputationStatus computationStatus) { + Log.debug("Computation Terminated"); + Log.debug("Computation Status:" + computationStatus); + if (terminated == false) { + terminated = true; + cancelComputationBtn.setVisible(false); + if (computationStatus.isComplete()) { + Log.debug("Computation is Complete"); + Info.display("Terminated", + "The computation " + computationId.getId() + " of " + + computationId.getOperatorName() + + " is terminated correctly."); + int index = vert.getWidgetIndex(progressBar); + vert.remove(index); + // TODO + progressBar = new GreenProgressBar(); + progressBar.updateProgress(1, "Computation Complete"); + vert.insert(progressBar, index, new VerticalLayoutData(1, -1, + new Margins(20))); + showComputationCompletedOutput(); + } else if (computationStatus.isFailed()) { + Log.debug("Computation is Failed"); + String errorMessage; + if (computationStatus.getError() == null) { + errorMessage = new String("Computation Failed!"); + } else { + errorMessage = computationStatus.getError() + .getLocalizedMessage(); + ElementsHighlights el=new ElementsHighlights(); + errorMessage=el.createLinkFromText(errorMessage); + + } + Info.display("Failed", + "The computation " + computationId.getId() + " of " + + computationId.getOperatorName() + + " is failed."); + UtilsGXT3.alert("Failed", + "The computation " + computationId.getId() + " of " + + computationId.getOperatorName() + + " has failed.
" + errorMessage); + int index = vert.getWidgetIndex(progressBar); + vert.remove(index); + // TODO + progressBar = new RedProgressBar(); + progressBar.updateProgress(1, "Computation Fail"); + progressBar.getElement().getStyle() + .setMarginBottom(36, Unit.PX); + vert.insert(progressBar, index, new VerticalLayoutData(1, -1, + new Margins(20))); + } else if (computationStatus.isCancelled()) { + Log.debug("Computation Cancelled"); + String errorMessage; + errorMessage = new String("Computation Cancelled!"); + Info.display("Info", "The computation " + computationId.getId() + + " of " + computationId.getOperatorName() + + " has been cancelled."); + UtilsGXT3.info("Info", + "The computation " + computationId.getId() + " of " + + computationId.getOperatorName() + + " has been cancelled.
" + errorMessage); + int index = vert.getWidgetIndex(progressBar); + vert.remove(index); + // TODO + progressBar = new OrangeProgressBar(); + progressBar.updateProgress(1, "Computation Cancelled"); + progressBar.getElement().getStyle() + .setMarginBottom(36, Unit.PX); + vert.insert(progressBar, index, new VerticalLayoutData(1, -1, + new Margins(20))); + } + + } + + forceLayout(); + } + + /** + * + */ + private void showComputationCompletedOutput() { + HtmlLayoutContainer computationEndMessage = new HtmlLayoutContainer( + "

The computation " + computationId.getOperatorName() + + " finished.

"); + vert.add(computationEndMessage, new VerticalLayoutData(-1, -1, + new Margins(0))); + ComputationOutputPanel computationOutputPanel = new ComputationOutputPanel( + computationId); + computationOutputPanel.getElement().getStyle() + .setMarginBottom(36, Unit.PX); + vert.add(computationOutputPanel, new VerticalLayoutData(1, -1, + new Margins(0))); + + } + + /** + * @param computationStatus + */ + private void updateStatus(ComputationStatus computationStatus) { + Log.debug("Conputation Status Panel ::Update Status " + + computationStatus); + if (computationStatus.getStatus().compareTo(Status.ACCEPTED) == 0) + progressBar.updateText("Accepted..."); + else { + double percentage = computationStatus.getPercentage(); + if (percentage == 0) { + progressBar.updateText("Running, 0% Complete"); + } else { + progressBar.updateProgress(percentage / 100, "Running, " + + percentage + "% Complete"); + } + } + forceLayout(); + } + + private class ComputationTimer extends Timer { + + @Override + public void run() { + Log.debug("Timer run ....."); + DataMinerExecutorServiceAsync.INSTANCE.getComputationStatus( + computationId, new AsyncCallback() { + + @Override + public void onFailure(Throwable caught) { + int index = vert.getWidgetIndex(progressBar); + vert.remove(index); + // TODO + progressBar = new RedProgressBar(); + progressBar.updateProgress(1, + "Failed to get the status"); + progressBar.getElement().getStyle() + .setMarginBottom(36, Unit.PX); + vert.insert(progressBar, index, + new VerticalLayoutData(1, -1, new Margins( + 20))); + + } + + @Override + public void onSuccess( + ComputationStatus computationStatus) { + Log.debug("ComputationStatus: "+computationStatus); + if (computationStatus != null) { + if (computationStatus.isTerminated()) { + ComputationTimer.this.cancel(); + computationTerminated(computationId, + computationStatus); + } else + updateStatus(computationStatus); + } + } + }); + } + + } + + /** + * + */ + public void stopTimer() { + try { + timer.cancel(); + } catch (Exception e) { + } + vert.clear(); + + } +} diff --git a/src/main/java/org/gcube/portlets/user/dataminerexecutor/client/experiments/EquivalentRequestDialog.java b/src/main/java/org/gcube/portlets/user/dataminerexecutor/client/experiments/EquivalentRequestDialog.java new file mode 100644 index 0000000..d1ffa72 --- /dev/null +++ b/src/main/java/org/gcube/portlets/user/dataminerexecutor/client/experiments/EquivalentRequestDialog.java @@ -0,0 +1,46 @@ +package org.gcube.portlets.user.dataminerexecutor.client.experiments; + +import org.gcube.data.analysis.dataminermanagercl.shared.data.computations.ComputationId; + +import com.allen_sauer.gwt.log.client.Log; +import com.sencha.gxt.widget.core.client.Dialog; +import com.sencha.gxt.widget.core.client.container.BoxLayoutContainer.BoxLayoutPack; +import com.sencha.gxt.widget.core.client.form.TextArea; + +/** + * + * @author Giancarlo Panichi + * + * + */ +public class EquivalentRequestDialog extends Dialog { + private ComputationId computationId; + + public EquivalentRequestDialog(ComputationId computationId) { + super(); + Log.debug("EquivalentRequestDialog: " + computationId); + this.computationId = computationId; + init(); + create(); + } + + private void init() { + setModal(true); + setClosable(true); + setHeadingText("Equivalent Get Request"); + setBodyBorder(true); + setHideOnButtonClick(true); + setPredefinedButtons(PredefinedButton.CLOSE); + getButtonBar().setPack(BoxLayoutPack.CENTER); + } + + private void create() { + TextArea equivalentRequestArea = new TextArea(); + equivalentRequestArea.setHeight(200); + equivalentRequestArea.setWidth(640); + equivalentRequestArea.setValue(computationId.getEquivalentRequest()); + equivalentRequestArea.setReadOnly(true); + add(equivalentRequestArea); + } + +} diff --git a/src/main/java/org/gcube/portlets/user/dataminerexecutor/client/experiments/ExperimentPanel.java b/src/main/java/org/gcube/portlets/user/dataminerexecutor/client/experiments/ExperimentPanel.java new file mode 100644 index 0000000..c296f04 --- /dev/null +++ b/src/main/java/org/gcube/portlets/user/dataminerexecutor/client/experiments/ExperimentPanel.java @@ -0,0 +1,88 @@ +package org.gcube.portlets.user.dataminerexecutor.client.experiments; + +import org.gcube.data.analysis.dataminermanagercl.shared.process.Operator; +import org.gcube.portlets.user.dataminerexecutor.client.common.EventBusProvider; +import org.gcube.portlets.user.dataminerexecutor.client.events.InvocationModelEvent; +//import org.gcube.portlets.user.dataminerexecutor.client.events.InvocationModelRequestEvent; + +import com.allen_sauer.gwt.log.client.Log; +import com.sencha.gxt.core.client.util.Margins; +import com.sencha.gxt.widget.core.client.container.BorderLayoutContainer; +import com.sencha.gxt.widget.core.client.container.MarginData; +import com.sencha.gxt.widget.core.client.container.SimpleContainer; + +/** + * + * @author Giancarlo Panichi + * + * + */ +public class ExperimentPanel extends SimpleContainer { + + private WorkflowPanel workflowPanel; + //private OperatorsPanel operatorsPanel; + //private OperatorPanel lastOperatorSelected = null; + + /** + * + */ + public ExperimentPanel() { + super(); + init(); + create(); + bind(); + + } + + private void init() { + } + + + private void bind(){ + EventBusProvider.INSTANCE.addHandler(InvocationModelEvent.TYPE, + new InvocationModelEvent.InvocationModelEventHandler() { + + @Override + public void onInvocation(InvocationModelEvent event) { + Log.debug("Catch InvocationModelEvent: " + event); + addOperator(event.getOperator()); + + } + + }); + } + + + private void create() { + //operatorsPanel = new OperatorsPanel(this); + workflowPanel = new WorkflowPanel(); + + // + BorderLayoutContainer experimentPanelLayout = new BorderLayoutContainer(); + + experimentPanelLayout.setBorders(false); + experimentPanelLayout.setResize(true); + experimentPanelLayout.getElement().getStyle() + .setBackgroundColor("white"); + + // Center + MarginData mainData = new MarginData(new Margins(0)); + experimentPanelLayout.setCenterWidget(workflowPanel, mainData); + add(experimentPanelLayout, new MarginData(0)); + + } + + /** + * + */ + + private void addOperator(Operator operator) { + //if (lastOperatorSelected != null + // && lastOperatorSelected != operatorPanel) + // lastOperatorSelected.toggleSelected(false); + //if (lastOperatorSelected != operatorPanel) + // operatorPanel.toggleSelected(true); + //lastOperatorSelected = operatorPanel; + workflowPanel.addOperator(operator); + } +} diff --git a/src/main/java/org/gcube/portlets/user/dataminerexecutor/client/experiments/WorkflowPanel.java b/src/main/java/org/gcube/portlets/user/dataminerexecutor/client/experiments/WorkflowPanel.java new file mode 100644 index 0000000..5632f1a --- /dev/null +++ b/src/main/java/org/gcube/portlets/user/dataminerexecutor/client/experiments/WorkflowPanel.java @@ -0,0 +1,113 @@ +/** + * + */ +package org.gcube.portlets.user.dataminerexecutor.client.experiments; + +import org.gcube.data.analysis.dataminermanagercl.shared.process.Operator; +import org.gcube.portlets.user.dataminerexecutor.client.DataMinerExecutor; +import org.gcube.portlets.user.dataminerexecutor.client.common.EventBusProvider; +import org.gcube.portlets.user.dataminerexecutor.client.events.ComputationReadyEvent; +import org.gcube.portlets.user.dataminerexecutor.client.events.ResubmitComputationExecutionEvent; + +import com.allen_sauer.gwt.log.client.Log; +import com.sencha.gxt.widget.core.client.TabItemConfig; +import com.sencha.gxt.widget.core.client.TabPanel; + +/** + * + * @author Giancarlo Panichi + * + * + */ +public class WorkflowPanel extends TabPanel { + + public static final String DEFAULT_OPERATOR = "AQUAMAPS_SUITABLE"; + + private ComputationExecutionPanel computationExecutionPanel; + private ComputationPanel computationPanel; + + /** + * + */ + public WorkflowPanel() { + super(); + init(); + create(); + bind(); + + } + + private void init() { + setBodyBorder(false); + } + + private void create() { + + TabItemConfig tabWorkFlowLcItemConf = new TabItemConfig("Operator", + false); + tabWorkFlowLcItemConf.setIcon(DataMinerExecutor.resources + .folderExplore()); + computationPanel = new ComputationPanel(); + computationPanel + .addComputationReadyEventHandler(new ComputationReadyEvent.ComputationReadyEventHandler() { + + @Override + public void onReady(ComputationReadyEvent event) { + Log.debug("StartComputationEvent Received:" + event); + startComputation(event.getOperator()); + + } + }); + add(computationPanel, tabWorkFlowLcItemConf); + + TabItemConfig tabComputationPanelItemConf = new TabItemConfig( + "Computations Execution", false); + tabComputationPanelItemConf.setIcon(DataMinerExecutor.resources + .folderExplore()); + computationExecutionPanel = new ComputationExecutionPanel(); + add(computationExecutionPanel, tabComputationPanelItemConf); + + setActiveWidget(computationPanel); + } + + /** + * + */ + private void bind() { + EventBusProvider.INSTANCE + .addHandler( + ResubmitComputationExecutionEvent.getType(), + new ResubmitComputationExecutionEvent.ResubmitComputationExecutionEventHandler() { + @Override + public void onResubmit( + ResubmitComputationExecutionEvent event) { + resubmitComputation(); + } + }); + } + + /** + * + */ + private void resubmitComputation() { + setActiveWidget(computationExecutionPanel); + } + + /** + * @param computationTitle + * @param operator + * + */ + private void startComputation(Operator op) { + setActiveWidget(computationExecutionPanel); + computationExecutionPanel.startNewComputation(op); + + } + + public void addOperator(Operator op) { + setActiveWidget(computationPanel); + computationPanel.addOperator(op); + + } + +} diff --git a/src/main/java/org/gcube/portlets/user/dataminerexecutor/client/monitor/StatusMonitor.java b/src/main/java/org/gcube/portlets/user/dataminerexecutor/client/monitor/StatusMonitor.java new file mode 100644 index 0000000..ce79cfc --- /dev/null +++ b/src/main/java/org/gcube/portlets/user/dataminerexecutor/client/monitor/StatusMonitor.java @@ -0,0 +1,69 @@ +package org.gcube.portlets.user.dataminerexecutor.client.monitor; + +import com.google.gwt.safehtml.shared.SafeHtml; +import com.sencha.gxt.widget.core.client.box.AutoProgressMessageBox; + +/** + * + * @author Giancarlo Panichi + * + * + */ +public class StatusMonitor extends AutoProgressMessageBox { + + public StatusMonitor() { + super("Waiting", "Please wait..."); + create(); + } + + /** + * + * @param headingHtml + * head + * @param messageHtml + * message + */ + public StatusMonitor(SafeHtml headingHtml, SafeHtml messageHtml) { + super(headingHtml, messageHtml); + create(); + } + + /** + * + * @param headingHtml + * head + */ + public StatusMonitor(SafeHtml headingHtml) { + super(headingHtml); + create(); + } + + /** + * + * @param headingHtml + * head + * @param messageHtml + * message + */ + public StatusMonitor(String headingHtml, String messageHtml) { + super(headingHtml, messageHtml); + create(); + } + + /** + * + * @param headingHtml + * head + */ + public StatusMonitor(String headingHtml) { + super(headingHtml); + create(); + } + + private void create() { + setProgressText("In progress..."); + auto(); + show(); + } + +} diff --git a/src/main/java/org/gcube/portlets/user/dataminerexecutor/client/parametersfield/AbstractFld.java b/src/main/java/org/gcube/portlets/user/dataminerexecutor/client/parametersfield/AbstractFld.java new file mode 100644 index 0000000..88a8536 --- /dev/null +++ b/src/main/java/org/gcube/portlets/user/dataminerexecutor/client/parametersfield/AbstractFld.java @@ -0,0 +1,58 @@ +/** + * + */ +package org.gcube.portlets.user.dataminerexecutor.client.parametersfield; + +import org.gcube.data.analysis.dataminermanagercl.shared.parameters.Parameter; + +import com.google.gwt.user.client.ui.Widget; + +/** + * + * @author Giancarlo Panichi + * + * + */ +public abstract class AbstractFld { + + protected Parameter parameter; + + public abstract String getValue(); + + public abstract Widget getWidget(); + + /** + * + * @param parameter parameter + * parameter + */ + public AbstractFld(Parameter parameter) { + this.parameter = parameter; + } + + /** + * + * @return Parameter + */ + public Parameter getParameter() { + return parameter; + } + + /** + * + * @param parameter parameter + * parameter + */ + public void setParameter(Parameter parameter) { + this.parameter = parameter; + } + + /** + * + * @return true if is valid + */ + public boolean isValid() { + return true; + } + +} diff --git a/src/main/java/org/gcube/portlets/user/dataminerexecutor/client/parametersfield/ColumnFld.java b/src/main/java/org/gcube/portlets/user/dataminerexecutor/client/parametersfield/ColumnFld.java new file mode 100644 index 0000000..5014780 --- /dev/null +++ b/src/main/java/org/gcube/portlets/user/dataminerexecutor/client/parametersfield/ColumnFld.java @@ -0,0 +1,184 @@ +/** + * + */ +package org.gcube.portlets.user.dataminerexecutor.client.parametersfield; + +import java.util.ArrayList; + +import org.gcube.data.analysis.dataminermanagercl.shared.data.ColumnItem; +import org.gcube.data.analysis.dataminermanagercl.shared.data.TableItemSimple; +import org.gcube.data.analysis.dataminermanagercl.shared.parameters.ColumnParameter; +import org.gcube.data.analysis.dataminermanagercl.shared.parameters.Parameter; +import org.gcube.portlets.user.dataminerexecutor.client.events.TabularFldChangeEvent; +import org.gcube.portlets.user.dataminerexecutor.client.events.TabularFldChangeEvent.TabularFldChangeEventHandler; +import org.gcube.portlets.user.dataminerexecutor.client.properties.ColumnItemPropertiesCombo; + +import com.allen_sauer.gwt.log.client.Log; +import com.google.gwt.core.client.GWT; +import com.google.gwt.user.client.ui.Widget; +import com.sencha.gxt.cell.core.client.form.ComboBoxCell.TriggerAction; +import com.sencha.gxt.core.client.util.Format; +import com.sencha.gxt.core.client.util.Margins; +import com.sencha.gxt.data.shared.ListStore; +import com.sencha.gxt.widget.core.client.container.BoxLayoutContainer.BoxLayoutData; +import com.sencha.gxt.widget.core.client.container.BoxLayoutContainer.BoxLayoutPack; +import com.sencha.gxt.widget.core.client.container.HBoxLayoutContainer; +import com.sencha.gxt.widget.core.client.container.HtmlLayoutContainer; +import com.sencha.gxt.widget.core.client.container.SimpleContainer; +import com.sencha.gxt.widget.core.client.container.VerticalLayoutContainer; +import com.sencha.gxt.widget.core.client.container.VerticalLayoutContainer.VerticalLayoutData; +import com.sencha.gxt.widget.core.client.form.ComboBox; + +/** + * + * @author Giancarlo Panichi + * + * + */ +public class ColumnFld extends AbstractFld implements + TabularFldChangeEventHandler { + + private String defaultColumn; + private ComboBox comboBox; + private ListStore store; + private String referredTabularParameterName; + + private SimpleContainer fieldContainer; + private SimpleContainer vContainer; + + /** + * @param parameter parameter + */ + public ColumnFld(Parameter parameter) { + super(parameter); + + ColumnParameter columnParameter = (ColumnParameter) parameter; + + referredTabularParameterName = columnParameter + .getReferredTabularParameterName(); + defaultColumn = columnParameter.getDefaultColumn(); + + fieldContainer = new SimpleContainer(); + HBoxLayoutContainer horiz = new HBoxLayoutContainer(); + horiz.setPack(BoxLayoutPack.START); + horiz.setEnableOverflow(false); + + ColumnItemPropertiesCombo props = GWT + .create(ColumnItemPropertiesCombo.class); + + store = new ListStore(props.id()); + + comboBox = new ComboBox(store, props.label()); + comboBox.setAllowBlank(false); + comboBox.setForceSelection(true); + comboBox.setEditable(false); + comboBox.setTriggerAction(TriggerAction.ALL); + comboBox.setEnabled(false); + HtmlLayoutContainer descr; + + if (columnParameter.getDescription() == null) { + descr = new HtmlLayoutContainer("

"); + descr.addStyleName("workflow-fieldDescription"); + + } else { + //comboBox.setToolTip(columnParameter.getDescription()); + descr = new HtmlLayoutContainer("

" + + columnParameter.getDescription() + "

"); + descr.addStyleName("workflow-fieldDescription"); + } + + vContainer = new SimpleContainer(); + showNoSelectionField(); + horiz.add(vContainer, new BoxLayoutData(new Margins())); + horiz.add(descr, new BoxLayoutData(new Margins())); + + fieldContainer.add(horiz); + fieldContainer.forceLayout(); + + } + + private void showNoSelectionField() { + vContainer.clear(); + VerticalLayoutContainer vField = new VerticalLayoutContainer(); + HtmlLayoutContainer typeDescription = new HtmlLayoutContainer( + "

Select table from parameter " + + Format.ellipse(referredTabularParameterName, 30) + + "

"); + typeDescription.setStylePrimaryName("workflow-parameters-description"); + vField.add(comboBox, new VerticalLayoutData(1, -1, new Margins(0))); + vField.add(typeDescription, new VerticalLayoutData(-1, -1, new Margins( + 0))); + vContainer.add(vField); + } + + private void showFieldWithSelection(TableItemSimple tableItem) { + vContainer.clear(); + VerticalLayoutContainer vField = new VerticalLayoutContainer(); + HtmlLayoutContainer typeDescription = new HtmlLayoutContainer( + "

Columns of Table " + + Format.ellipse(tableItem.getName(), 30) + + "

"); + typeDescription.setStylePrimaryName("workflow-parameters-description"); + vField.add(comboBox, new VerticalLayoutData(1, -1, new Margins(0))); + vField.add(typeDescription, new VerticalLayoutData(-1, -1, new Margins( + 0))); + vContainer.add(vField); + } + + /** + * + */ + @Override + public String getValue() { + ColumnItem columnItem = comboBox.getCurrentValue(); + return columnItem != null ? columnItem.getName() : null; + } + + /** + * + */ + @Override + public Widget getWidget() { + return fieldContainer; + } + + @Override + public boolean isValid() { + return comboBox.isValid(); + } + + @Override + public void onChange(TabularFldChangeEvent event) { + TableItemSimple tableItemSimple = event.getTableItemSimple(); + if (tableItemSimple == null) { + store.clear(); + store.commitChanges(); + comboBox.clear(); + comboBox.setEnabled(false); + showNoSelectionField(); + } else { + store.clear(); + store.commitChanges(); + comboBox.clear(); + ArrayList columns = tableItemSimple.getColumns(); + if (columns != null) { + store.addAll(columns); + store.commitChanges(); + Log.debug("DefaultColumn: "+defaultColumn); + for (ColumnItem columnItem : columns) { + Log.debug("ColumnItem: "+ columnItem); + if (columnItem.getName().compareToIgnoreCase(defaultColumn) == 0) { + comboBox.setValue(columnItem); + break; + } + } + + + } + comboBox.setEnabled(true); + showFieldWithSelection(tableItemSimple); + } + fieldContainer.forceLayout(); + } + +} diff --git a/src/main/java/org/gcube/portlets/user/dataminerexecutor/client/parametersfield/ColumnListFld.java b/src/main/java/org/gcube/portlets/user/dataminerexecutor/client/parametersfield/ColumnListFld.java new file mode 100644 index 0000000..4490af0 --- /dev/null +++ b/src/main/java/org/gcube/portlets/user/dataminerexecutor/client/parametersfield/ColumnListFld.java @@ -0,0 +1,129 @@ +/** + * + */ +package org.gcube.portlets.user.dataminerexecutor.client.parametersfield; + +import org.gcube.data.analysis.dataminermanagercl.shared.parameters.ColumnListParameter; +import org.gcube.data.analysis.dataminermanagercl.shared.parameters.Parameter; + +import com.allen_sauer.gwt.log.client.Log; +import com.google.gwt.safehtml.shared.SafeHtmlBuilder; +import com.google.gwt.user.client.ui.Widget; +import com.sencha.gxt.core.client.util.Margins; +import com.sencha.gxt.widget.core.client.container.BoxLayoutContainer.BoxLayoutData; +import com.sencha.gxt.widget.core.client.container.BoxLayoutContainer.BoxLayoutPack; +import com.sencha.gxt.widget.core.client.container.HBoxLayoutContainer; +import com.sencha.gxt.widget.core.client.container.HtmlLayoutContainer; +import com.sencha.gxt.widget.core.client.container.SimpleContainer; +import com.sencha.gxt.widget.core.client.container.VerticalLayoutContainer; +import com.sencha.gxt.widget.core.client.container.VerticalLayoutContainer.VerticalLayoutData; + +/** + * + * @author Giancarlo Panichi + * + * + */ +public class ColumnListFld extends AbstractFld { + + private SimpleContainer fieldContainer; + // private TextField textField; + private String value; + + /** + * @param parameter + * parameter + */ + public ColumnListFld(Parameter parameter) { + super(parameter); + + // ObjectParameter p = (ObjectParameter) parameter; + Log.debug("Create Column List field: " + parameter.getName()); + value = parameter.getValue(); + + ColumnListParameter columnListParameter = (ColumnListParameter) parameter; + + StringBuilder columnListHtml = new StringBuilder(); + String tempValue = new String(value); + int pos = tempValue.indexOf(columnListParameter.getSeparator()); + while (pos > -1) { + SafeHtmlBuilder safeValue=new SafeHtmlBuilder(); + safeValue.appendEscaped(tempValue.substring(0, pos)); + columnListHtml.append("" + safeValue.toSafeHtml().asString() + + ""); + tempValue = tempValue.substring(pos + 1, tempValue.length()); + pos = tempValue.indexOf(columnListParameter.getSeparator()); + } + if (tempValue != null && !tempValue.isEmpty()) { + SafeHtmlBuilder safeValue=new SafeHtmlBuilder(); + safeValue.appendEscaped(tempValue); + columnListHtml.append("" +safeValue.toSafeHtml().asString() + ""); + } else { + columnListHtml.append(""); + } + + HtmlLayoutContainer descr; + + descr = new HtmlLayoutContainer("

"); + descr.addStyleName("workflow-fieldDescription"); + + descr = new HtmlLayoutContainer( + "

" + parameter.getDescription() + "

"); + descr.addStyleName("workflow-fieldDescription"); + + String typology = "Columns of Table "+columnListParameter.getReferredTabularParameterName(); + + SimpleContainer vContainer = new SimpleContainer(); + VerticalLayoutContainer vField = new VerticalLayoutContainer(); + HtmlLayoutContainer typeDescription = new HtmlLayoutContainer(typology); + typeDescription.setStylePrimaryName("workflow-parameters-description"); + + HtmlLayoutContainer val = new HtmlLayoutContainer(columnListHtml.toString()); + val.addStyleName("workflow-fieldValue"); + + vField.add(val, new VerticalLayoutData(-1, -1, new Margins(0))); + + vField.add(typeDescription, new VerticalLayoutData(-1, -1, new Margins(0))); + vContainer.add(vField); + + fieldContainer = new SimpleContainer(); + HBoxLayoutContainer horiz = new HBoxLayoutContainer(); + horiz.setPack(BoxLayoutPack.START); + horiz.setEnableOverflow(false); + + horiz.add(vContainer, new BoxLayoutData(new Margins())); + horiz.add(descr, new BoxLayoutData(new Margins())); + + fieldContainer.add(horiz); + fieldContainer.forceLayout(); + + } + + /** + * + */ + @Override + public String getValue() { + + return value; + + } + + /** + * + */ + @Override + public Widget getWidget() { + return fieldContainer; + } + + @Override + public boolean isValid() { + if (value != null && !value.isEmpty()) { + return true; + } else { + return false; + } + } + +} diff --git a/src/main/java/org/gcube/portlets/user/dataminerexecutor/client/parametersfield/EnumFld.java b/src/main/java/org/gcube/portlets/user/dataminerexecutor/client/parametersfield/EnumFld.java new file mode 100644 index 0000000..77beb85 --- /dev/null +++ b/src/main/java/org/gcube/portlets/user/dataminerexecutor/client/parametersfield/EnumFld.java @@ -0,0 +1,94 @@ +/** + * + */ +package org.gcube.portlets.user.dataminerexecutor.client.parametersfield; + +import org.gcube.data.analysis.dataminermanagercl.shared.parameters.EnumParameter; +import org.gcube.data.analysis.dataminermanagercl.shared.parameters.Parameter; + +import com.google.gwt.user.client.ui.Widget; +import com.sencha.gxt.cell.core.client.form.ComboBoxCell.TriggerAction; +import com.sencha.gxt.core.client.util.Margins; +import com.sencha.gxt.data.shared.StringLabelProvider; +import com.sencha.gxt.widget.core.client.container.HBoxLayoutContainer; +import com.sencha.gxt.widget.core.client.container.HtmlLayoutContainer; +import com.sencha.gxt.widget.core.client.container.SimpleContainer; +import com.sencha.gxt.widget.core.client.container.BoxLayoutContainer.BoxLayoutData; +import com.sencha.gxt.widget.core.client.container.BoxLayoutContainer.BoxLayoutPack; +import com.sencha.gxt.widget.core.client.form.SimpleComboBox; + +/** + * + * @author Giancarlo Panichi + * + * + */ +public class EnumFld extends AbstractFld { + + private SimpleContainer fieldContainer; + private SimpleComboBox listBox; + + /** + * @param parameter + * parameter + */ + public EnumFld(Parameter parameter) { + super(parameter); + fieldContainer = new SimpleContainer(); + HBoxLayoutContainer horiz = new HBoxLayoutContainer(); + horiz.setPack(BoxLayoutPack.START); + horiz.setEnableOverflow(false); + + EnumParameter p = (EnumParameter) parameter; + + listBox = new SimpleComboBox(new StringLabelProvider<>()); + listBox.add(p.getValues()); + listBox.setAllowBlank(false); + listBox.setForceSelection(true); + listBox.setEditable(false); + listBox.setTriggerAction(TriggerAction.ALL); + + if (p.getDefaultValue() != null) + listBox.setValue(p.getDefaultValue()); + + HtmlLayoutContainer descr; + + if (p.getDescription() == null) { + descr = new HtmlLayoutContainer("

"); + descr.addStyleName("workflow-fieldDescription"); + + } else { + // listBox.setToolTip(p.getDescription()); + descr = new HtmlLayoutContainer("

" + p.getDescription() + "

"); + descr.addStyleName("workflow-fieldDescription"); + } + horiz.add(listBox, new BoxLayoutData(new Margins())); + horiz.add(descr, new BoxLayoutData(new Margins())); + + fieldContainer.add(horiz); + fieldContainer.forceLayout(); + + } + + /** + * + */ + @Override + public String getValue() { + return listBox.getCurrentValue(); + } + + /** + * + */ + @Override + public Widget getWidget() { + return fieldContainer; + } + + @Override + public boolean isValid() { + return listBox.isValid(); + } + +} diff --git a/src/main/java/org/gcube/portlets/user/dataminerexecutor/client/parametersfield/FileFld.java b/src/main/java/org/gcube/portlets/user/dataminerexecutor/client/parametersfield/FileFld.java new file mode 100644 index 0000000..3ad9038 --- /dev/null +++ b/src/main/java/org/gcube/portlets/user/dataminerexecutor/client/parametersfield/FileFld.java @@ -0,0 +1,109 @@ +/** + * + */ +package org.gcube.portlets.user.dataminerexecutor.client.parametersfield; + +import org.gcube.data.analysis.dataminermanagercl.shared.parameters.Parameter; + +import com.allen_sauer.gwt.log.client.Log; +import com.google.gwt.user.client.ui.Widget; +import com.sencha.gxt.core.client.util.Margins; +import com.sencha.gxt.widget.core.client.container.BoxLayoutContainer.BoxLayoutData; +import com.sencha.gxt.widget.core.client.container.BoxLayoutContainer.BoxLayoutPack; +import com.sencha.gxt.widget.core.client.container.HBoxLayoutContainer; +import com.sencha.gxt.widget.core.client.container.HtmlLayoutContainer; +import com.sencha.gxt.widget.core.client.container.SimpleContainer; +import com.sencha.gxt.widget.core.client.container.VerticalLayoutContainer; +import com.sencha.gxt.widget.core.client.container.VerticalLayoutContainer.VerticalLayoutData; + +/** + * + * @author Giancarlo Panichi + * + * + */ +public class FileFld extends AbstractFld { + + private SimpleContainer fieldContainer; + //private TextField textField; + private String value; + + + /** + * @param parameter + * parameter + */ + public FileFld(Parameter parameter) { + super(parameter); + + //ObjectParameter p = (ObjectParameter) parameter; + Log.debug("Create File field: "+parameter.getName()); + value=parameter.getValue(); + + HtmlLayoutContainer descr; + + descr = new HtmlLayoutContainer("

"); + descr.addStyleName("workflow-fieldDescription"); + + descr = new HtmlLayoutContainer("

" + parameter.getDescription() + "

"); + descr.addStyleName("workflow-fieldDescription"); + + SimpleContainer vContainer = new SimpleContainer(); + VerticalLayoutContainer vField = new VerticalLayoutContainer(); + HtmlLayoutContainer typeDescription = new HtmlLayoutContainer("File Value"); + typeDescription.setStylePrimaryName("workflow-parameters-description"); + + //textField = new TextField(); + //textField.setValue(p.getValue()); + //textField.isReadOnly(); + + HtmlLayoutContainer val = new HtmlLayoutContainer("File"); + val.addStyleName("workflow-fieldValue"); + + + vField.add(val, new VerticalLayoutData(-1, -1, new Margins(0))); + + vField.add(typeDescription, new VerticalLayoutData(-1, -1, new Margins(0))); + vContainer.add(vField); + + fieldContainer = new SimpleContainer(); + HBoxLayoutContainer horiz = new HBoxLayoutContainer(); + horiz.setPack(BoxLayoutPack.START); + horiz.setEnableOverflow(false); + + horiz.add(vContainer, new BoxLayoutData(new Margins())); + horiz.add(descr, new BoxLayoutData(new Margins())); + + fieldContainer.add(horiz); + fieldContainer.forceLayout(); + + } + + + /** + * + */ + @Override + public String getValue() { + + return value; + + } + + /** + * + */ + @Override + public Widget getWidget() { + return fieldContainer; + } + + @Override + public boolean isValid() { + if(value!=null&&!value.isEmpty()){ + return true; + } else { + return false; + } + } +} diff --git a/src/main/java/org/gcube/portlets/user/dataminerexecutor/client/parametersfield/ListIntFld.java b/src/main/java/org/gcube/portlets/user/dataminerexecutor/client/parametersfield/ListIntFld.java new file mode 100644 index 0000000..fa94ad8 --- /dev/null +++ b/src/main/java/org/gcube/portlets/user/dataminerexecutor/client/parametersfield/ListIntFld.java @@ -0,0 +1,238 @@ +/** + * + */ +package org.gcube.portlets.user.dataminerexecutor.client.parametersfield; + +import java.util.ArrayList; +import java.util.List; + +import org.gcube.data.analysis.dataminermanagercl.shared.parameters.ListParameter; +import org.gcube.data.analysis.dataminermanagercl.shared.parameters.ObjectParameter; +import org.gcube.data.analysis.dataminermanagercl.shared.parameters.Parameter; +import org.gcube.portlets.user.dataminerexecutor.client.DataMinerExecutor; + +import com.google.gwt.user.client.ui.Widget; +import com.sencha.gxt.core.client.util.Margins; +import com.sencha.gxt.widget.core.client.button.TextButton; +import com.sencha.gxt.widget.core.client.container.BoxLayoutContainer.BoxLayoutData; +import com.sencha.gxt.widget.core.client.container.BoxLayoutContainer.BoxLayoutPack; +import com.sencha.gxt.widget.core.client.container.HBoxLayoutContainer; +import com.sencha.gxt.widget.core.client.container.HtmlLayoutContainer; +import com.sencha.gxt.widget.core.client.container.MarginData; +import com.sencha.gxt.widget.core.client.container.SimpleContainer; +import com.sencha.gxt.widget.core.client.container.VerticalLayoutContainer; +import com.sencha.gxt.widget.core.client.container.VerticalLayoutContainer.VerticalLayoutData; +import com.sencha.gxt.widget.core.client.event.SelectEvent; +import com.sencha.gxt.widget.core.client.form.IntegerField; + +/** + * + * @author Giancarlo Panichi + * + * + */ +public class ListIntFld extends AbstractFld { + + private List items; + private SimpleContainer simpleContainer; + private VerticalLayoutContainer vp; + private ListParameter listParameter; + private SimpleContainer listContainer; + private SimpleContainer fieldContainer; + private HBoxLayoutContainer horiz; + + /** + * @param parameter + * parameter + */ + public ListIntFld(Parameter parameter) { + super(parameter); + this.listParameter = (ListParameter) parameter; + + listContainer = new SimpleContainer(); + vp = new VerticalLayoutContainer(); + items = new ArrayList(); + addField(null); + listContainer.add(vp, new MarginData(new Margins())); + + fieldContainer = new SimpleContainer(); + horiz = new HBoxLayoutContainer(); + horiz.setPack(BoxLayoutPack.START); + horiz.setEnableOverflow(false); + + HtmlLayoutContainer descr; + + if (listParameter.getDescription() == null) { + descr = new HtmlLayoutContainer("

"); + descr.addStyleName("workflow-fieldDescription"); + + } else { + // listContainer.setToolTip(listParameter.getDescription()); + descr = new HtmlLayoutContainer( + "

" + listParameter.getDescription() + "

"); + descr.addStyleName("workflow-fieldDescription"); + } + + horiz.add(listContainer, new BoxLayoutData(new Margins(0))); + horiz.add(descr, new BoxLayoutData(new Margins(0))); + + fieldContainer.add(horiz); + fieldContainer.forceLayout(); + + } + + private void addField(Item upperItem) { + + ObjectParameter objPar = new ObjectParameter(listParameter.getName(), listParameter.getDescription(), + listParameter.getType(), null); + + if (upperItem == null) { + Item item = new Item(objPar, true); + items.add(item); + vp.add(item, new VerticalLayoutData(1, -1, new Margins())); + } else { + // search the position of the upper item + int pos = 0; + for (int i = 0; i < items.size(); i++) + if (items.get(i) == upperItem) { + pos = i; + break; + } + + upperItem.showCancelButton(); + Item item = new Item(objPar, false); + items.add(pos + 1, item); + vp.insert(item, pos + 1); + } + + } + + /** + * @param item + */ + private void removeField(Item item) { + items.remove(item); + + vp.remove(item); + + if (items.size() == 1) { + items.get(0).hideCancelButton(); + } + + simpleContainer.forceLayout(); + + } + + /** + * + */ + @Override + public String getValue() { + String separator = listParameter.getSeparator(); + String value = ""; + boolean first = true; + for (Item item : items) { + Integer itemValue = item.getValue(); + if (itemValue != null) { + value += (first ? "" : separator) + itemValue; + first = false; + } + } + return value; + } + + /** + * + */ + @Override + public Widget getWidget() { + return fieldContainer; + } + + /** + * + */ + @Override + public boolean isValid() { + for (Item item : items) + if (!item.isValid()) { + return false; + } + return true; + } + + private class Item extends HBoxLayoutContainer { + + private IntegerField field; + private TextButton addBtn; + private TextButton removeBtn; + + /** + * @param objPar + */ + public Item(ObjectParameter objectParameter, boolean first) { + super(); + + field = new IntegerField(); + field.setAllowBlank(false); + + addBtn = new TextButton(""); + + addBtn.setIcon(DataMinerExecutor.resources.add()); + + addBtn.addSelectHandler(new SelectEvent.SelectHandler() { + + @Override + public void onSelect(SelectEvent event) { + addField(Item.this); + forceLayout(); + vp.forceLayout(); + fieldContainer.forceLayout(); + } + }); + + removeBtn = new TextButton(""); + + removeBtn.setIcon(DataMinerExecutor.resources.cancel()); + + removeBtn.addSelectHandler(new SelectEvent.SelectHandler() { + + @Override + public void onSelect(SelectEvent event) { + removeField(Item.this); + forceLayout(); + vp.forceLayout(); + fieldContainer.forceLayout(); + + } + }); + + removeBtn.setVisible(!first); + + setPack(BoxLayoutPack.START); + setEnableOverflow(false); + add(field, new BoxLayoutData(new Margins())); + add(addBtn, new BoxLayoutData(new Margins())); + add(removeBtn, new BoxLayoutData(new Margins())); + + forceLayout(); + } + + public void showCancelButton() { + removeBtn.setVisible(true); + } + + public void hideCancelButton() { + removeBtn.setVisible(false); + } + + public Integer getValue() { + return field.getCurrentValue(); + } + + public boolean isValid() { + return field.isValid(); + } + } + +} diff --git a/src/main/java/org/gcube/portlets/user/dataminerexecutor/client/parametersfield/ListStringFld.java b/src/main/java/org/gcube/portlets/user/dataminerexecutor/client/parametersfield/ListStringFld.java new file mode 100644 index 0000000..60f9169 --- /dev/null +++ b/src/main/java/org/gcube/portlets/user/dataminerexecutor/client/parametersfield/ListStringFld.java @@ -0,0 +1,169 @@ +/** + * + */ +package org.gcube.portlets.user.dataminerexecutor.client.parametersfield; + +import java.util.ArrayList; +import java.util.List; + +import org.gcube.data.analysis.dataminermanagercl.shared.parameters.ListParameter; +import org.gcube.data.analysis.dataminermanagercl.shared.parameters.ObjectParameter; +import org.gcube.data.analysis.dataminermanagercl.shared.parameters.Parameter; + +import com.google.gwt.user.client.ui.Widget; +import com.sencha.gxt.core.client.util.Margins; +import com.sencha.gxt.widget.core.client.container.BoxLayoutContainer.BoxLayoutData; +import com.sencha.gxt.widget.core.client.container.BoxLayoutContainer.BoxLayoutPack; +import com.sencha.gxt.widget.core.client.container.HBoxLayoutContainer; +import com.sencha.gxt.widget.core.client.container.HtmlLayoutContainer; +import com.sencha.gxt.widget.core.client.container.MarginData; +import com.sencha.gxt.widget.core.client.container.SimpleContainer; +import com.sencha.gxt.widget.core.client.container.VerticalLayoutContainer; + +/** + * + * @author Giancarlo Panichi + * + * + */ +public class ListStringFld extends AbstractFld { + + private SimpleContainer fieldContainer; + private HBoxLayoutContainer horiz; + private SimpleContainer listContainer; + private VerticalLayoutContainer vp; + private List items; + private ListParameter listParameter; + + /** + * + * @param parameter + * parameter + */ + public ListStringFld(Parameter parameter) { + super(parameter); + + listParameter = (ListParameter) parameter; + + listContainer = new SimpleContainer(); + vp = new VerticalLayoutContainer(); + items = new ArrayList(); + listContainer.add(vp, new MarginData(new Margins())); + + fieldContainer = new SimpleContainer(); + horiz = new HBoxLayoutContainer(); + horiz.setPack(BoxLayoutPack.START); + horiz.setEnableOverflow(false); + + HtmlLayoutContainer descr; + + if (listParameter.getDescription() == null) { + descr = new HtmlLayoutContainer("

"); + descr.addStyleName("workflow-fieldDescription"); + + } else { + /* listContainer.setToolTip(listParameter.getDescription()); */ + descr = new HtmlLayoutContainer( + "

" + listParameter.getDescription() + "

"); + descr.addStyleName("workflow-fieldDescription"); + } + + horiz.add(listContainer, new BoxLayoutData(new Margins(0))); + horiz.add(descr, new BoxLayoutData(new Margins(0))); + + fieldContainer.add(horiz); + addField(null); + } + + protected void addField(StringItem upperItem) { + + ObjectParameter objPar = new ObjectParameter(listParameter.getName(), listParameter.getDescription(), + listParameter.getType(), null); + + if (upperItem == null) { + StringItem item = new StringItem(this, objPar, true); + items.add(item); + vp.add(item); + } else { + // search the position of the upper item + int pos = items.indexOf(upperItem); + if (pos > -1) { + upperItem.showCancelButton(); + upperItem.forceLayout(); + StringItem item = new StringItem(this, objPar, false); + items.add(pos + 1, item); + vp.insert(item, pos + 1);// don't use new VerticalLayoutData(1, + // -1,new Margins(0)) + } else { + upperItem.forceLayout(); + StringItem item = new StringItem(this, objPar, true); + items.add(item); + vp.add(item);// don't use new VerticalLayoutData(-1, -1, new + // Margins(0)) + } + } + + forceLayout(); + + } + + protected void forceLayout() { + vp.forceLayout(); + horiz.forceLayout(); + fieldContainer.forceLayout(); + } + + protected void removeField(StringItem item) { + items.remove(item); + + vp.remove(item); + + if (items.size() == 1) { + items.get(0).hideCancelButton(); + items.get(0).forceLayout(); + } + + forceLayout(); + } + + /** + * + */ + @Override + public String getValue() { + String separator = listParameter.getSeparator(); + String value = ""; + boolean first = true; + for (StringItem item : items) { + String itemValue = item.getValue(); + if (itemValue != null && !itemValue.contentEquals("")) { + value += (first ? "" : separator) + itemValue; + first = false; + } + } + return value; + } + + /** + * + */ + @Override + public Widget getWidget() { + return fieldContainer; + } + + /** + * + */ + @Override + public boolean isValid() { + boolean valid = false; + for (StringItem item : items) + if (item.isValid()) { + valid = true; + break; + } + return valid; + } + +} diff --git a/src/main/java/org/gcube/portlets/user/dataminerexecutor/client/parametersfield/OperatorFieldWidget.java b/src/main/java/org/gcube/portlets/user/dataminerexecutor/client/parametersfield/OperatorFieldWidget.java new file mode 100644 index 0000000..4113a08 --- /dev/null +++ b/src/main/java/org/gcube/portlets/user/dataminerexecutor/client/parametersfield/OperatorFieldWidget.java @@ -0,0 +1,115 @@ +/** + * + */ +package org.gcube.portlets.user.dataminerexecutor.client.parametersfield; + +import org.gcube.data.analysis.dataminermanagercl.shared.parameters.Parameter; + + +import com.allen_sauer.gwt.log.client.Log; +import com.sencha.gxt.widget.core.client.form.FieldLabel; + +/** + * + * @author Giancarlo Panichi + * + * + */ +public class OperatorFieldWidget { + + private Parameter parameter; + private AbstractFld field; + private FieldLabel parameterLabel; + + /** + * + * @param parameter + * parameter + */ + public OperatorFieldWidget(Parameter parameter) { + super(); + this.parameter = parameter; + + try { + field = new StringFld(parameter); + + if (parameter.getTypology() != null) { + switch (parameter.getTypology()) { + case COLUMN: + case WKT: + case DATE: + case TIME: + case ENUM: + case OBJECT: + field = new StringFld(parameter); + break; + case FILE: + field = new FileFld(parameter); + break; + case TABULAR: + field = new TabularFld(parameter); + break; + case COLUMN_LIST: + field = new ColumnListFld(parameter); + break; + case LIST: + field = new ListStringFld(parameter); + break; + case TABULAR_LIST: + field = new TabularListFld(parameter); + break; + default: + break; + + } + } + + + + if (field == null) { + parameterLabel = new FieldLabel(null, parameter.getName()); + parameterLabel.setLabelWidth(200); + parameterLabel.setLabelWordWrap(true); + + } else { + parameterLabel = new FieldLabel(field.getWidget(), parameter.getName()); + parameterLabel.setLabelWidth(200); + parameterLabel.setLabelWordWrap(true); + } + } catch (Throwable e) { + Log.error("Error: " + e.getLocalizedMessage(),e); + } + + } + + /** + * @return the parameter + */ + public Parameter getParameter() { + return parameter; + } + + public String getFieldValue() { + return field.getValue(); + } + + public String getValue() { + return getFieldValue(); + } + + public FieldLabel getParameterLabel() { + return parameterLabel; + } + + + public AbstractFld getField() { + return field; + } + + public boolean isValid() { + if (field != null) + return field.isValid(); + else + return false; + } +} diff --git a/src/main/java/org/gcube/portlets/user/dataminerexecutor/client/parametersfield/StringFld.java b/src/main/java/org/gcube/portlets/user/dataminerexecutor/client/parametersfield/StringFld.java new file mode 100644 index 0000000..7c106e4 --- /dev/null +++ b/src/main/java/org/gcube/portlets/user/dataminerexecutor/client/parametersfield/StringFld.java @@ -0,0 +1,145 @@ +/** + * + */ +package org.gcube.portlets.user.dataminerexecutor.client.parametersfield; + +import org.gcube.data.analysis.dataminermanagercl.shared.parameters.ObjectParameter; +import org.gcube.data.analysis.dataminermanagercl.shared.parameters.Parameter; + +import com.allen_sauer.gwt.log.client.Log; +import com.google.gwt.user.client.ui.Widget; +import com.sencha.gxt.core.client.util.Margins; +import com.sencha.gxt.widget.core.client.container.BoxLayoutContainer.BoxLayoutData; +import com.sencha.gxt.widget.core.client.container.BoxLayoutContainer.BoxLayoutPack; +import com.sencha.gxt.widget.core.client.container.HBoxLayoutContainer; +import com.sencha.gxt.widget.core.client.container.HtmlLayoutContainer; +import com.sencha.gxt.widget.core.client.container.SimpleContainer; +import com.sencha.gxt.widget.core.client.container.VerticalLayoutContainer; +import com.sencha.gxt.widget.core.client.container.VerticalLayoutContainer.VerticalLayoutData; +//import com.sencha.gxt.widget.core.client.form.TextField; + +/** + * + * @author Giancarlo Panichi + * + * + */ +public class StringFld extends AbstractFld { + + private SimpleContainer fieldContainer; + // private TextField textField; + private String value; + + /** + * @param parameter + * parameter + */ + public StringFld(Parameter parameter) { + super(parameter); + + // ObjectParameter p = (ObjectParameter) parameter; + Log.debug("Create String field: " + parameter.getName()); + value = parameter.getValue(); + + HtmlLayoutContainer descr; + + descr = new HtmlLayoutContainer("

"); + descr.addStyleName("workflow-fieldDescription"); + + descr = new HtmlLayoutContainer( + "

" + parameter.getDescription() + "

"); + descr.addStyleName("workflow-fieldDescription"); + + String typology; + switch (parameter.getTypology()) { + case COLUMN: + typology="Column Value"; + case WKT: + typology="Wkt Value"; + case DATE: + typology="Date Value"; + case TIME: + typology="Time Value"; + case ENUM: + typology="Enum Value"; + case OBJECT: + typology=getObjectParameterTypology(); + break; + default: + typology="Value"; + break; + } + + SimpleContainer vContainer = new SimpleContainer(); + VerticalLayoutContainer vField = new VerticalLayoutContainer(); + HtmlLayoutContainer typeDescription = new HtmlLayoutContainer(typology); + typeDescription.setStylePrimaryName("workflow-parameters-description"); + + HtmlLayoutContainer val = new HtmlLayoutContainer( + "" + parameter.getValue() + ""); + val.addStyleName("workflow-fieldValue"); + + vField.add(val, new VerticalLayoutData(-1, -1, new Margins(0))); + + vField.add(typeDescription, new VerticalLayoutData(-1, -1, new Margins(0))); + vContainer.add(vField); + + fieldContainer = new SimpleContainer(); + HBoxLayoutContainer horiz = new HBoxLayoutContainer(); + horiz.setPack(BoxLayoutPack.START); + horiz.setEnableOverflow(false); + + horiz.add(vContainer, new BoxLayoutData(new Margins())); + horiz.add(descr, new BoxLayoutData(new Margins())); + + fieldContainer.add(horiz); + fieldContainer.forceLayout(); + + } + + + private String getObjectParameterTypology(){ + ObjectParameter objectParameter = (ObjectParameter) parameter; + String type = objectParameter.getType(); + if (type.contentEquals(Integer.class.getName())) { + return "Integer Value"; + } else if (type.contentEquals(String.class.getName())) { + return "String Value"; + } else if (type.contentEquals(Boolean.class.getName())) { + return "Boolean Value"; + } else if (type.contentEquals(Double.class.getName())) { + return "Double Value"; + } else if (type.contentEquals(Float.class.getName())) { + return "Float Value"; + } else + return "Value"; + } + + /** + * + */ + @Override + public String getValue() { + + return value; + + } + + /** + * + */ + @Override + public Widget getWidget() { + return fieldContainer; + } + + @Override + public boolean isValid() { + if (value != null && !value.isEmpty()) { + return true; + } else { + return false; + } + } + +} diff --git a/src/main/java/org/gcube/portlets/user/dataminerexecutor/client/parametersfield/StringItem.java b/src/main/java/org/gcube/portlets/user/dataminerexecutor/client/parametersfield/StringItem.java new file mode 100644 index 0000000..a7f4639 --- /dev/null +++ b/src/main/java/org/gcube/portlets/user/dataminerexecutor/client/parametersfield/StringItem.java @@ -0,0 +1,95 @@ +package org.gcube.portlets.user.dataminerexecutor.client.parametersfield; + +import org.gcube.data.analysis.dataminermanagercl.shared.parameters.ObjectParameter; +import org.gcube.portlets.user.dataminerexecutor.client.DataMinerExecutor; + +import com.sencha.gxt.core.client.util.Margins; +import com.sencha.gxt.widget.core.client.button.TextButton; +import com.sencha.gxt.widget.core.client.container.HBoxLayoutContainer; +import com.sencha.gxt.widget.core.client.event.SelectEvent; +import com.sencha.gxt.widget.core.client.form.TextField; + +/** + * + * @author Giancarlo Panichi + * + * + */ +public class StringItem extends HBoxLayoutContainer { + private ListStringFld parent; + private TextField field; + private TextButton addBtn; + private TextButton removeBtn; + + /** + * + * @param parent parend + * @param objectParameter object parameter + * @param first true if is first + */ + public StringItem(ListStringFld parent, ObjectParameter objectParameter, boolean first) { + super(); + this.parent=parent; + create(objectParameter,first); + } + + private void create( ObjectParameter objectParameter, boolean first){ + field = new TextField(); + field.setAllowBlank(false); + + addBtn = new TextButton(""); + + addBtn.setIcon(DataMinerExecutor.resources.add()); + + addBtn.addSelectHandler(new SelectEvent.SelectHandler() { + + @Override + public void onSelect(SelectEvent event) { + parent.addField(StringItem.this); + + + } + }); + + removeBtn = new TextButton(""); + + removeBtn.setIcon(DataMinerExecutor.resources.cancel()); + + removeBtn.addSelectHandler(new SelectEvent.SelectHandler() { + + @Override + public void onSelect(SelectEvent event) { + parent.removeField(StringItem.this); + + + } + }); + + removeBtn.setVisible(!first); + + setPack(BoxLayoutPack.START); + setEnableOverflow(false); + add(field, new BoxLayoutData(new Margins())); + add(addBtn, new BoxLayoutData(new Margins())); + add(removeBtn, new BoxLayoutData(new Margins())); + + forceLayout(); + } + + public void showCancelButton() { + removeBtn.setVisible(true); + } + + public void hideCancelButton() { + removeBtn.setVisible(false); + } + + public String getValue() { + return field.getCurrentValue(); + } + + public boolean isValid() { + return field.isValid(); + } + +} diff --git a/src/main/java/org/gcube/portlets/user/dataminerexecutor/client/parametersfield/TabItem.java b/src/main/java/org/gcube/portlets/user/dataminerexecutor/client/parametersfield/TabItem.java new file mode 100644 index 0000000..9e1b136 --- /dev/null +++ b/src/main/java/org/gcube/portlets/user/dataminerexecutor/client/parametersfield/TabItem.java @@ -0,0 +1,264 @@ +package org.gcube.portlets.user.dataminerexecutor.client.parametersfield; + +import org.gcube.data.analysis.dataminermanagercl.shared.data.TableItemSimple; +import org.gcube.data.analysis.dataminermanagercl.shared.parameters.TabularParameter; +import org.gcube.data.analysis.dataminermanagercl.shared.workspace.ItemDescription; +import org.gcube.portlets.user.dataminerexecutor.client.DataMinerExecutor; +import org.gcube.portlets.user.dataminerexecutor.client.rpc.DataMinerExecutorServiceAsync; +import org.gcube.portlets.user.dataminerexecutor.client.util.UtilsGXT3; +import org.gcube.portlets.user.dataminerexecutor.client.workspace.DownloadWidget; +import org.gcube.portlets.user.dataminerexecutor.shared.exception.SessionExpiredServiceException; +import org.gcube.portlets.widgets.wsexplorer.client.notification.WorkspaceExplorerSelectNotification.WorskpaceExplorerSelectNotificationListener; +import org.gcube.portlets.widgets.wsexplorer.client.select.WorkspaceExplorerSelectDialog; +import org.gcube.portlets.widgets.wsexplorer.shared.Item; +import org.gcube.portlets.widgets.wsexplorer.shared.ItemType; + +import com.allen_sauer.gwt.log.client.Log; +import com.google.gwt.user.client.rpc.AsyncCallback; +import com.sencha.gxt.core.client.dom.XDOM; +import com.sencha.gxt.core.client.util.Margins; +import com.sencha.gxt.widget.core.client.button.TextButton; +import com.sencha.gxt.widget.core.client.container.HBoxLayoutContainer; +import com.sencha.gxt.widget.core.client.event.SelectEvent; +import com.sencha.gxt.widget.core.client.form.TextField; + +/** + * + * @author Giancarlo Panichi + * + * + */ +public class TabItem extends HBoxLayoutContainer { + + private TabularListFld parent; + private TextButton selectButton; + private TextButton selectButton2; + private TableItemSimple selectedTableItem; + private TextButton addBtn; + private TextButton removeBtn; + private TextField tableDescription; + private WorkspaceExplorerSelectDialog wselectDialog; + private TextButton downloadButton; + private ItemDescription itemDescriptionSelected; + + /** + * + * @param parent + * parent + * @param tabularParameter + * tabular parameter + * @param first + * true if is first + */ + public TabItem(TabularListFld parent, TabularParameter tabularParameter, boolean first) { + super(); + this.parent = parent; + initDialog(); + create(tabularParameter, first); + } + + private void create(TabularParameter tabularParameter, boolean first) { + + tableDescription = new TextField(); + tableDescription.setReadOnly(true); + tableDescription.setVisible(false); + + selectButton = new TextButton("Select Data Set"); + selectButton.addSelectHandler(new SelectEvent.SelectHandler() { + + @Override + public void onSelect(SelectEvent event) { + wselectDialog.show(); + } + }); + + selectButton.setIcon(DataMinerExecutor.resources.folderExplore()); + selectButton.setToolTip("Select Data Set"); + + selectButton2 = new TextButton(""); + selectButton2.setIcon(DataMinerExecutor.resources.folderExplore()); + selectButton2.setToolTip("Select Another Data Set"); + selectButton2.addSelectHandler(new SelectEvent.SelectHandler() { + + @Override + public void onSelect(SelectEvent event) { + wselectDialog.show(); + } + }); + selectButton2.setVisible(false); + + downloadButton = new TextButton(""); + downloadButton.setIcon(DataMinerExecutor.resources.download()); + downloadButton.addSelectHandler(new SelectEvent.SelectHandler() { + + @Override + public void onSelect(SelectEvent event) { + downloadFile(); + } + }); + downloadButton.setVisible(false); + + addBtn = new TextButton(""); + addBtn.setIcon(DataMinerExecutor.resources.add()); + addBtn.addSelectHandler(new SelectEvent.SelectHandler() { + + @Override + public void onSelect(SelectEvent event) { + parent.addField(TabItem.this); + + } + }); + + removeBtn = new TextButton(""); + removeBtn.setIcon(DataMinerExecutor.resources.cancel()); + removeBtn.addSelectHandler(new SelectEvent.SelectHandler() { + + @Override + public void onSelect(SelectEvent event) { + selectedTableItem = null; + parent.removeField(TabItem.this); + + } + }); + removeBtn.setVisible(!first); + + setPack(BoxLayoutPack.START); + setEnableOverflow(false); + + add(tableDescription, new BoxLayoutData(new Margins())); + add(selectButton, new BoxLayoutData(new Margins())); + add(selectButton2, new BoxLayoutData(new Margins())); + add(downloadButton, new BoxLayoutData(new Margins())); + add(addBtn, new BoxLayoutData(new Margins())); + add(removeBtn, new BoxLayoutData(new Margins())); + + forceLayout(); + + } + + private void initDialog() { + + + wselectDialog = new WorkspaceExplorerSelectDialog("Select CSV", false); + + WorskpaceExplorerSelectNotificationListener handler = new WorskpaceExplorerSelectNotificationListener() { + + @Override + public void onSelectedItem(Item item) { + + if (item == null || item.getType() == ItemType.FOLDER + || item.getType() == ItemType.PRIVATE_FOLDER + || item.getType() == ItemType.SHARED_FOLDER + || item.getType() == ItemType.VRE_FOLDER) { + UtilsGXT3.info("Attention", "Select a valid csv!"); + + } else { + TabItem.this.retrieveTableInformation(item); + + } + + } + + @Override + public void onFailed(Throwable throwable) { + Log.error("Error in create project: " + throwable.getLocalizedMessage()); + UtilsGXT3.alert("Error", throwable.getLocalizedMessage()); + throwable.printStackTrace(); + } + + @Override + public void onAborted() { + + } + + @Override + public void onNotValidSelection() { + UtilsGXT3.info("Attention", "Select a valid csv!"); + } + }; + + wselectDialog.addWorkspaceExplorerSelectNotificationListener(handler); + wselectDialog.setZIndex(XDOM.getTopZIndex()); + + } + + private void retrieveTableInformation(Item item) { + Log.debug("Retrieved: " + item); + itemDescriptionSelected = new ItemDescription(item.getId(), item.getName(), item.getOwner(), item.getPath(), + item.getType().name()); + + DataMinerExecutorServiceAsync.INSTANCE.retrieveTableInformation(itemDescriptionSelected, new AsyncCallback() { + + @Override + public void onFailure(Throwable caught) { + Log.error("Error in retrieveTableInformation " + caught.getMessage()); + if (caught instanceof SessionExpiredServiceException) { + UtilsGXT3.alert("Error", "Expired Session"); + + } else { + UtilsGXT3.alert("Error", "Error retrieving table information: " + caught.getLocalizedMessage()); + } + + } + + @Override + public void onSuccess(TableItemSimple result) { + Log.debug("Retrieved: " + result); + selectedTableItem = result; + showFieldWithSelection(); + + } + }); + } + + private void downloadFile() { + if (itemDescriptionSelected != null) { + DownloadWidget downloadWidget = new DownloadWidget(); + downloadWidget.download(itemDescriptionSelected.getId()); + } else { + UtilsGXT3.info("Attention", "Select a table!"); + } + } + + /** + * + */ + private void showFieldWithSelection() { + try { + + String tableName = selectedTableItem.getName(); + + if (tableName == null || tableName.isEmpty()) { + tableName = "NoName"; + } + + tableDescription.setValue(tableName); + tableDescription.setVisible(true); + selectButton.setVisible(false); + selectButton2.setVisible(true); + downloadButton.setVisible(true); + parent.forceLayout(); + + } catch (Throwable e) { + Log.error(e.getLocalizedMessage()); + e.printStackTrace(); + } + } + + public void showCancelButton() { + removeBtn.setVisible(true); + } + + public void hideCancelButton() { + removeBtn.setVisible(false); + } + + public String getValue() { + return (selectedTableItem == null) ? null : selectedTableItem.getId(); + } + + public boolean isValid() { + return (selectedTableItem != null); + } + +} \ No newline at end of file diff --git a/src/main/java/org/gcube/portlets/user/dataminerexecutor/client/parametersfield/TabularFld.java b/src/main/java/org/gcube/portlets/user/dataminerexecutor/client/parametersfield/TabularFld.java new file mode 100644 index 0000000..167a82f --- /dev/null +++ b/src/main/java/org/gcube/portlets/user/dataminerexecutor/client/parametersfield/TabularFld.java @@ -0,0 +1,109 @@ +/** + * + */ +package org.gcube.portlets.user.dataminerexecutor.client.parametersfield; + +import org.gcube.data.analysis.dataminermanagercl.shared.parameters.Parameter; + +import com.allen_sauer.gwt.log.client.Log; +import com.google.gwt.user.client.ui.Widget; +import com.sencha.gxt.core.client.util.Margins; +import com.sencha.gxt.widget.core.client.container.BoxLayoutContainer.BoxLayoutData; +import com.sencha.gxt.widget.core.client.container.BoxLayoutContainer.BoxLayoutPack; +import com.sencha.gxt.widget.core.client.container.HBoxLayoutContainer; +import com.sencha.gxt.widget.core.client.container.HtmlLayoutContainer; +import com.sencha.gxt.widget.core.client.container.SimpleContainer; +import com.sencha.gxt.widget.core.client.container.VerticalLayoutContainer; +import com.sencha.gxt.widget.core.client.container.VerticalLayoutContainer.VerticalLayoutData; + +/** + * + * @author Giancarlo Panichi + * + * + */ +public class TabularFld extends AbstractFld { + + private SimpleContainer fieldContainer; + //private TextField textField; + private String value; + + + /** + * @param parameter + * parameter + */ + public TabularFld(Parameter parameter) { + super(parameter); + + //ObjectParameter p = (ObjectParameter) parameter; + Log.debug("Create File field: "+parameter.getName()); + value=parameter.getValue(); + + HtmlLayoutContainer descr; + + descr = new HtmlLayoutContainer("

"); + descr.addStyleName("workflow-fieldDescription"); + + descr = new HtmlLayoutContainer("

" + parameter.getDescription() + "

"); + descr.addStyleName("workflow-fieldDescription"); + + SimpleContainer vContainer = new SimpleContainer(); + VerticalLayoutContainer vField = new VerticalLayoutContainer(); + HtmlLayoutContainer typeDescription = new HtmlLayoutContainer("Table Value"); + typeDescription.setStylePrimaryName("workflow-parameters-description"); + + //textField = new TextField(); + //textField.setValue(p.getValue()); + //textField.isReadOnly(); + + HtmlLayoutContainer val = new HtmlLayoutContainer("Table"); + val.addStyleName("workflow-fieldValue"); + + + vField.add(val, new VerticalLayoutData(-1, -1, new Margins(0))); + + vField.add(typeDescription, new VerticalLayoutData(-1, -1, new Margins(0))); + vContainer.add(vField); + + fieldContainer = new SimpleContainer(); + HBoxLayoutContainer horiz = new HBoxLayoutContainer(); + horiz.setPack(BoxLayoutPack.START); + horiz.setEnableOverflow(false); + + horiz.add(vContainer, new BoxLayoutData(new Margins())); + horiz.add(descr, new BoxLayoutData(new Margins())); + + fieldContainer.add(horiz); + fieldContainer.forceLayout(); + + } + + + /** + * + */ + @Override + public String getValue() { + + return value; + + } + + /** + * + */ + @Override + public Widget getWidget() { + return fieldContainer; + } + + @Override + public boolean isValid() { + if(value!=null&&!value.isEmpty()){ + return true; + } else { + return false; + } + } +} diff --git a/src/main/java/org/gcube/portlets/user/dataminerexecutor/client/parametersfield/TabularListFld.java b/src/main/java/org/gcube/portlets/user/dataminerexecutor/client/parametersfield/TabularListFld.java new file mode 100644 index 0000000..a19d03e --- /dev/null +++ b/src/main/java/org/gcube/portlets/user/dataminerexecutor/client/parametersfield/TabularListFld.java @@ -0,0 +1,191 @@ +/** + * + */ +package org.gcube.portlets.user.dataminerexecutor.client.parametersfield; + +import java.util.ArrayList; +import java.util.List; + +import org.gcube.data.analysis.dataminermanagercl.shared.parameters.Parameter; +import org.gcube.data.analysis.dataminermanagercl.shared.parameters.TabularListParameter; +import org.gcube.data.analysis.dataminermanagercl.shared.parameters.TabularParameter; + +import com.allen_sauer.gwt.log.client.Log; +import com.google.gwt.user.client.ui.Widget; +import com.sencha.gxt.core.client.util.Margins; +import com.sencha.gxt.widget.core.client.container.BoxLayoutContainer.BoxLayoutPack; +import com.sencha.gxt.widget.core.client.container.HBoxLayoutContainer; +import com.sencha.gxt.widget.core.client.container.HtmlLayoutContainer; +import com.sencha.gxt.widget.core.client.container.MarginData; +import com.sencha.gxt.widget.core.client.container.SimpleContainer; +import com.sencha.gxt.widget.core.client.container.VerticalLayoutContainer; + +/** + * + * @author Giancarlo Panichi + * + * + */ +public class TabularListFld extends AbstractFld { + + private SimpleContainer fieldContainer; + private HBoxLayoutContainer horiz; + private SimpleContainer listContainer; + private List items; + private VerticalLayoutContainer vp; + private TabularListParameter tabularListParameter; + + /** + * @param parameter + * parameter + */ + public TabularListFld(Parameter parameter) { + super(parameter); + Log.debug("TabularListField"); + try { + tabularListParameter = (TabularListParameter) parameter; + createField(); + } catch (Throwable e) { + Log.error("TabularListField: " + e.getLocalizedMessage()); + e.printStackTrace(); + } + } + + private void createField() { + vp = new VerticalLayoutContainer(); + items = new ArrayList<>(); + + listContainer = new SimpleContainer(); + listContainer.add(vp, new MarginData(new Margins(0))); + + /* + * List templates = tabularListParameter.getTemplates(); String + * list = ""; boolean firstTemplate = true; for (String template : + * templates) { list += (firstTemplate ? "" : ", ") + + * Format.ellipse(template,50); firstTemplate = false; } + * HtmlLayoutContainer templatesList = new + * HtmlLayoutContainer("

Suitable Data Set Templates:
" + + * list+"

"); + * templatesList.addStyleName("workflow-parameters-description"); + */ + + fieldContainer = new SimpleContainer(); + // fieldContainer.setResize(true); + horiz = new HBoxLayoutContainer(); + horiz.setPack(BoxLayoutPack.START); + horiz.setEnableOverflow(false); + + HtmlLayoutContainer descr; + + if (tabularListParameter.getDescription() == null) { + descr = new HtmlLayoutContainer("

"); + descr.addStyleName("workflow-fieldDescription"); + } else { + /* listContainer.setToolTip(listParameter.getDescription()); */ + descr = new HtmlLayoutContainer( + "

" + tabularListParameter.getDescription() + "

"); + descr.addStyleName("workflow-fieldDescription"); + } + + horiz.add(listContainer); + horiz.add(descr); + + fieldContainer.add(horiz, new MarginData(new Margins(0))); + fieldContainer.forceLayout(); + addField(null); + } + + protected void addField(TabItem upperItem) { + try { + + TabularParameter tabPar = new TabularParameter(tabularListParameter.getName(), + tabularListParameter.getDescription(), null, tabularListParameter.getTemplates(), + tabularListParameter.getDefaultMimeType(), tabularListParameter.getSupportedMimeTypes()); + + if (upperItem == null) { + TabItem item = new TabItem(this, tabPar, true); + items.add(item); + vp.add(item);// don't use new VerticalLayoutData(1, -1, new + // Margins(0)) + } else { + // search the position of the upper item + int pos = items.indexOf(upperItem); + if (pos > -1) { + upperItem.showCancelButton(); + upperItem.forceLayout(); + TabItem item = new TabItem(this, tabPar, false); + items.add(pos + 1, item); + vp.insert(item, pos + 1);// don't use new + // VerticalLayoutData(-1, -1,new + // Margins(0)) + } else { + upperItem.forceLayout(); + TabItem item = new TabItem(this, tabPar, true); + items.add(item); + vp.add(item);// don't use new VerticalLayoutData(-1, -1, new + // Margins(0)) + } + } + + forceLayout(); + + } catch (Throwable e) { + Log.error(e.getLocalizedMessage()); + e.printStackTrace(); + } + } + + protected void removeField(TabItem item) { + items.remove(item); + + if (items.size() == 1) { + items.get(0).hideCancelButton(); + items.get(0).forceLayout(); + } + vp.remove(item); + forceLayout(); + } + + protected void forceLayout() { + vp.forceLayout(); + listContainer.forceLayout(); + horiz.forceLayout(); + fieldContainer.forceLayout(); + } + + @Override + public String getValue() { + String separator = tabularListParameter.getSeparator(); + // String separator=""; + String value = ""; + boolean first = true; + for (TabItem item : items) { + String itemValue = item.getValue(); + if (itemValue != null && !itemValue.contentEquals("")) { + value += (first ? "" : separator) + itemValue; + first = false; + } + } + return value; + } + + /** + * + */ + @Override + public Widget getWidget() { + return fieldContainer; + } + + @Override + public boolean isValid() { + boolean valid = false; + for (TabItem item : items) + if (item.isValid()) { + valid = true; + break; + } + return valid; + } + +} diff --git a/src/main/java/org/gcube/portlets/user/dataminerexecutor/client/properties/ColumnItemProperties.java b/src/main/java/org/gcube/portlets/user/dataminerexecutor/client/properties/ColumnItemProperties.java new file mode 100644 index 0000000..2b0cf51 --- /dev/null +++ b/src/main/java/org/gcube/portlets/user/dataminerexecutor/client/properties/ColumnItemProperties.java @@ -0,0 +1,24 @@ +package org.gcube.portlets.user.dataminerexecutor.client.properties; + + +import org.gcube.data.analysis.dataminermanagercl.shared.data.ColumnItem; + +import com.google.gwt.editor.client.Editor.Path; +import com.sencha.gxt.core.client.ValueProvider; +import com.sencha.gxt.data.shared.ModelKeyProvider; +import com.sencha.gxt.data.shared.PropertyAccess; + +/** + * + * @author Giancarlo Panichi + * + * + */ +public interface ColumnItemProperties extends PropertyAccess { + + @Path("id") + ModelKeyProvider id(); + + ValueProvider label(); + +} \ No newline at end of file diff --git a/src/main/java/org/gcube/portlets/user/dataminerexecutor/client/properties/ColumnItemPropertiesCombo.java b/src/main/java/org/gcube/portlets/user/dataminerexecutor/client/properties/ColumnItemPropertiesCombo.java new file mode 100644 index 0000000..a18641e --- /dev/null +++ b/src/main/java/org/gcube/portlets/user/dataminerexecutor/client/properties/ColumnItemPropertiesCombo.java @@ -0,0 +1,23 @@ +package org.gcube.portlets.user.dataminerexecutor.client.properties; + +import org.gcube.data.analysis.dataminermanagercl.shared.data.ColumnItem; + +import com.google.gwt.editor.client.Editor.Path; +import com.sencha.gxt.data.shared.LabelProvider; +import com.sencha.gxt.data.shared.ModelKeyProvider; +import com.sencha.gxt.data.shared.PropertyAccess; + +/** + * + * @author Giancarlo Panichi + * + * + */ +public interface ColumnItemPropertiesCombo extends PropertyAccess { + + @Path("id") + ModelKeyProvider id(); + + LabelProvider label(); + +} \ No newline at end of file diff --git a/src/main/java/org/gcube/portlets/user/dataminerexecutor/client/resources/Resources.java b/src/main/java/org/gcube/portlets/user/dataminerexecutor/client/resources/Resources.java new file mode 100644 index 0000000..45dc9cd --- /dev/null +++ b/src/main/java/org/gcube/portlets/user/dataminerexecutor/client/resources/Resources.java @@ -0,0 +1,108 @@ +package org.gcube.portlets.user.dataminerexecutor.client.resources; + +import com.google.gwt.resources.client.ClientBundle; +import com.google.gwt.resources.client.ExternalTextResource; +import com.google.gwt.resources.client.ImageResource; + +/** + * + * @author Giancarlo Panichi + * + * + */ +public interface Resources extends ClientBundle { + + @Source("WikiLink.txt") + ExternalTextResource wikiLink(); + + @Source("logoLittle.png") + ImageResource logoLittle(); + + @Source("goBack.png") + ImageResource goBack(); + + @Source("computation.png") + ImageResource executionIcon(); + + @Source("computations.png") + ImageResource computationsIcon(); + + @Source("inputSpace.png") + ImageResource inputSpaceIcon(); + + @Source("connector1.png") + ImageResource workflowConnector1(); + + @Source("triangle.png") + ImageResource startComputation(); + + @Source("delete.png") + ImageResource removeAll(); + + @Source("sort_asc.gif") + ImageResource sortAscending(); + + @Source("tree.gif") + ImageResource tree(); + + @Source("folder_explore.png") + ImageResource folderExplore(); + + @Source("draw-geometry.png") + ImageResource drawGeometry(); + + @Source("cancel_icon.png") + ImageResource cancel(); + + @Source("add.png") + ImageResource add(); + + @Source("menuItemComputations.png") + ImageResource menuItemComputations(); + + @Source("menuItemExperiment.png") + ImageResource menuItemExperiment(); + + @Source("menuItemDataspace.png") + ImageResource menuItemInputspace(); + + @Source("menuItemHelp.png") + ImageResource menuItemHelp(); + + @Source("ajax-loader-big.gif") + ImageResource loaderBig(); + + @Source("ajax-complete.gif") + ImageResource loadingComplete(); + + //@Source("save.png") + //ImageResource save(); + + @Source("user_green.png") + ImageResource userPerspective(); + + @Source("monitor.png") + ImageResource computationPerspective(); + + @Source("download.png") + ImageResource download(); + + @Source("show.png") + ImageResource netcdf(); + + @Source("cancel_circle.png") + ImageResource cancelCircle(); + + @Source("delete_circle.png") + ImageResource deleteCircle(); + + @Source("refresh.png") + ImageResource refresh(); + + @Source("resubmit.png") + ImageResource resubmit(); + + @Source("show.png") + ImageResource show(); + +} diff --git a/src/main/java/org/gcube/portlets/user/dataminerexecutor/client/resources/WikiLink.txt b/src/main/java/org/gcube/portlets/user/dataminerexecutor/client/resources/WikiLink.txt new file mode 100644 index 0000000..f722cc7 --- /dev/null +++ b/src/main/java/org/gcube/portlets/user/dataminerexecutor/client/resources/WikiLink.txt @@ -0,0 +1 @@ +http://wiki.gcube-system.org/gcube/DataMiner_Executor \ No newline at end of file diff --git a/src/main/java/org/gcube/portlets/user/dataminerexecutor/client/resources/add.png b/src/main/java/org/gcube/portlets/user/dataminerexecutor/client/resources/add.png new file mode 100644 index 0000000..6332fef Binary files /dev/null and b/src/main/java/org/gcube/portlets/user/dataminerexecutor/client/resources/add.png differ diff --git a/src/main/java/org/gcube/portlets/user/dataminerexecutor/client/resources/ajax-complete.gif b/src/main/java/org/gcube/portlets/user/dataminerexecutor/client/resources/ajax-complete.gif new file mode 100644 index 0000000..ca17bcd Binary files /dev/null and b/src/main/java/org/gcube/portlets/user/dataminerexecutor/client/resources/ajax-complete.gif differ diff --git a/src/main/java/org/gcube/portlets/user/dataminerexecutor/client/resources/ajax-error.gif b/src/main/java/org/gcube/portlets/user/dataminerexecutor/client/resources/ajax-error.gif new file mode 100644 index 0000000..8dadfb9 Binary files /dev/null and b/src/main/java/org/gcube/portlets/user/dataminerexecutor/client/resources/ajax-error.gif differ diff --git a/src/main/java/org/gcube/portlets/user/dataminerexecutor/client/resources/ajax-loader-big.gif b/src/main/java/org/gcube/portlets/user/dataminerexecutor/client/resources/ajax-loader-big.gif new file mode 100644 index 0000000..b3d6d3f Binary files /dev/null and b/src/main/java/org/gcube/portlets/user/dataminerexecutor/client/resources/ajax-loader-big.gif differ diff --git a/src/main/java/org/gcube/portlets/user/dataminerexecutor/client/resources/ajax-loader.gif b/src/main/java/org/gcube/portlets/user/dataminerexecutor/client/resources/ajax-loader.gif new file mode 100644 index 0000000..6bdc3b5 Binary files /dev/null and b/src/main/java/org/gcube/portlets/user/dataminerexecutor/client/resources/ajax-loader.gif differ diff --git a/src/main/java/org/gcube/portlets/user/dataminerexecutor/client/resources/alert.gif b/src/main/java/org/gcube/portlets/user/dataminerexecutor/client/resources/alert.gif new file mode 100644 index 0000000..024e2a9 Binary files /dev/null and b/src/main/java/org/gcube/portlets/user/dataminerexecutor/client/resources/alert.gif differ diff --git a/src/main/java/org/gcube/portlets/user/dataminerexecutor/client/resources/arrow_right.png b/src/main/java/org/gcube/portlets/user/dataminerexecutor/client/resources/arrow_right.png new file mode 100644 index 0000000..b1a1819 Binary files /dev/null and b/src/main/java/org/gcube/portlets/user/dataminerexecutor/client/resources/arrow_right.png differ diff --git a/src/main/java/org/gcube/portlets/user/dataminerexecutor/client/resources/cancel.png b/src/main/java/org/gcube/portlets/user/dataminerexecutor/client/resources/cancel.png new file mode 100644 index 0000000..c149c2b Binary files /dev/null and b/src/main/java/org/gcube/portlets/user/dataminerexecutor/client/resources/cancel.png differ diff --git a/src/main/java/org/gcube/portlets/user/dataminerexecutor/client/resources/cancel_circle.png b/src/main/java/org/gcube/portlets/user/dataminerexecutor/client/resources/cancel_circle.png new file mode 100644 index 0000000..8829755 Binary files /dev/null and b/src/main/java/org/gcube/portlets/user/dataminerexecutor/client/resources/cancel_circle.png differ diff --git a/src/main/java/org/gcube/portlets/user/dataminerexecutor/client/resources/cancel_icon.png b/src/main/java/org/gcube/portlets/user/dataminerexecutor/client/resources/cancel_icon.png new file mode 100644 index 0000000..158b8b1 Binary files /dev/null and b/src/main/java/org/gcube/portlets/user/dataminerexecutor/client/resources/cancel_icon.png differ diff --git a/src/main/java/org/gcube/portlets/user/dataminerexecutor/client/resources/computation.png b/src/main/java/org/gcube/portlets/user/dataminerexecutor/client/resources/computation.png new file mode 100644 index 0000000..aa7d0be Binary files /dev/null and b/src/main/java/org/gcube/portlets/user/dataminerexecutor/client/resources/computation.png differ diff --git a/src/main/java/org/gcube/portlets/user/dataminerexecutor/client/resources/computations.png b/src/main/java/org/gcube/portlets/user/dataminerexecutor/client/resources/computations.png new file mode 100644 index 0000000..b3f0626 Binary files /dev/null and b/src/main/java/org/gcube/portlets/user/dataminerexecutor/client/resources/computations.png differ diff --git a/src/main/java/org/gcube/portlets/user/dataminerexecutor/client/resources/connector1.png b/src/main/java/org/gcube/portlets/user/dataminerexecutor/client/resources/connector1.png new file mode 100644 index 0000000..2f00f36 Binary files /dev/null and b/src/main/java/org/gcube/portlets/user/dataminerexecutor/client/resources/connector1.png differ diff --git a/src/main/java/org/gcube/portlets/user/dataminerexecutor/client/resources/delete.png b/src/main/java/org/gcube/portlets/user/dataminerexecutor/client/resources/delete.png new file mode 100644 index 0000000..70c8035 Binary files /dev/null and b/src/main/java/org/gcube/portlets/user/dataminerexecutor/client/resources/delete.png differ diff --git a/src/main/java/org/gcube/portlets/user/dataminerexecutor/client/resources/delete_circle.png b/src/main/java/org/gcube/portlets/user/dataminerexecutor/client/resources/delete_circle.png new file mode 100644 index 0000000..5aa62e2 Binary files /dev/null and b/src/main/java/org/gcube/portlets/user/dataminerexecutor/client/resources/delete_circle.png differ diff --git a/src/main/java/org/gcube/portlets/user/dataminerexecutor/client/resources/detach.png b/src/main/java/org/gcube/portlets/user/dataminerexecutor/client/resources/detach.png new file mode 100644 index 0000000..f4db43e Binary files /dev/null and b/src/main/java/org/gcube/portlets/user/dataminerexecutor/client/resources/detach.png differ diff --git a/src/main/java/org/gcube/portlets/user/dataminerexecutor/client/resources/details.png b/src/main/java/org/gcube/portlets/user/dataminerexecutor/client/resources/details.png new file mode 100644 index 0000000..8200ce8 Binary files /dev/null and b/src/main/java/org/gcube/portlets/user/dataminerexecutor/client/resources/details.png differ diff --git a/src/main/java/org/gcube/portlets/user/dataminerexecutor/client/resources/download.png b/src/main/java/org/gcube/portlets/user/dataminerexecutor/client/resources/download.png new file mode 100644 index 0000000..f588bf6 Binary files /dev/null and b/src/main/java/org/gcube/portlets/user/dataminerexecutor/client/resources/download.png differ diff --git a/src/main/java/org/gcube/portlets/user/dataminerexecutor/client/resources/draw-geometry.png b/src/main/java/org/gcube/portlets/user/dataminerexecutor/client/resources/draw-geometry.png new file mode 100644 index 0000000..222eafb Binary files /dev/null and b/src/main/java/org/gcube/portlets/user/dataminerexecutor/client/resources/draw-geometry.png differ diff --git a/src/main/java/org/gcube/portlets/user/dataminerexecutor/client/resources/folder_explore.png b/src/main/java/org/gcube/portlets/user/dataminerexecutor/client/resources/folder_explore.png new file mode 100644 index 0000000..0ba9391 Binary files /dev/null and b/src/main/java/org/gcube/portlets/user/dataminerexecutor/client/resources/folder_explore.png differ diff --git a/src/main/java/org/gcube/portlets/user/dataminerexecutor/client/resources/goBack.png b/src/main/java/org/gcube/portlets/user/dataminerexecutor/client/resources/goBack.png new file mode 100644 index 0000000..31b0a04 Binary files /dev/null and b/src/main/java/org/gcube/portlets/user/dataminerexecutor/client/resources/goBack.png differ diff --git a/src/main/java/org/gcube/portlets/user/dataminerexecutor/client/resources/inputSpace.png b/src/main/java/org/gcube/portlets/user/dataminerexecutor/client/resources/inputSpace.png new file mode 100644 index 0000000..2d896eb Binary files /dev/null and b/src/main/java/org/gcube/portlets/user/dataminerexecutor/client/resources/inputSpace.png differ diff --git a/src/main/java/org/gcube/portlets/user/dataminerexecutor/client/resources/logoLittle.png b/src/main/java/org/gcube/portlets/user/dataminerexecutor/client/resources/logoLittle.png new file mode 100644 index 0000000..c334da7 Binary files /dev/null and b/src/main/java/org/gcube/portlets/user/dataminerexecutor/client/resources/logoLittle.png differ diff --git a/src/main/java/org/gcube/portlets/user/dataminerexecutor/client/resources/menuItemComputations.png b/src/main/java/org/gcube/portlets/user/dataminerexecutor/client/resources/menuItemComputations.png new file mode 100644 index 0000000..79eca75 Binary files /dev/null and b/src/main/java/org/gcube/portlets/user/dataminerexecutor/client/resources/menuItemComputations.png differ diff --git a/src/main/java/org/gcube/portlets/user/dataminerexecutor/client/resources/menuItemDataspace.png b/src/main/java/org/gcube/portlets/user/dataminerexecutor/client/resources/menuItemDataspace.png new file mode 100644 index 0000000..5952946 Binary files /dev/null and b/src/main/java/org/gcube/portlets/user/dataminerexecutor/client/resources/menuItemDataspace.png differ diff --git a/src/main/java/org/gcube/portlets/user/dataminerexecutor/client/resources/menuItemExperiment.png b/src/main/java/org/gcube/portlets/user/dataminerexecutor/client/resources/menuItemExperiment.png new file mode 100644 index 0000000..15a635b Binary files /dev/null and b/src/main/java/org/gcube/portlets/user/dataminerexecutor/client/resources/menuItemExperiment.png differ diff --git a/src/main/java/org/gcube/portlets/user/dataminerexecutor/client/resources/menuItemHelp.png b/src/main/java/org/gcube/portlets/user/dataminerexecutor/client/resources/menuItemHelp.png new file mode 100644 index 0000000..4e8178c Binary files /dev/null and b/src/main/java/org/gcube/portlets/user/dataminerexecutor/client/resources/menuItemHelp.png differ diff --git a/src/main/java/org/gcube/portlets/user/dataminerexecutor/client/resources/menuItemInputspace.png b/src/main/java/org/gcube/portlets/user/dataminerexecutor/client/resources/menuItemInputspace.png new file mode 100644 index 0000000..9696441 Binary files /dev/null and b/src/main/java/org/gcube/portlets/user/dataminerexecutor/client/resources/menuItemInputspace.png differ diff --git a/src/main/java/org/gcube/portlets/user/dataminerexecutor/client/resources/monitor.png b/src/main/java/org/gcube/portlets/user/dataminerexecutor/client/resources/monitor.png new file mode 100644 index 0000000..d040bd0 Binary files /dev/null and b/src/main/java/org/gcube/portlets/user/dataminerexecutor/client/resources/monitor.png differ diff --git a/src/main/java/org/gcube/portlets/user/dataminerexecutor/client/resources/refresh.png b/src/main/java/org/gcube/portlets/user/dataminerexecutor/client/resources/refresh.png new file mode 100644 index 0000000..ee2106d Binary files /dev/null and b/src/main/java/org/gcube/portlets/user/dataminerexecutor/client/resources/refresh.png differ diff --git a/src/main/java/org/gcube/portlets/user/dataminerexecutor/client/resources/resubmit.png b/src/main/java/org/gcube/portlets/user/dataminerexecutor/client/resources/resubmit.png new file mode 100644 index 0000000..0202cbe Binary files /dev/null and b/src/main/java/org/gcube/portlets/user/dataminerexecutor/client/resources/resubmit.png differ diff --git a/src/main/java/org/gcube/portlets/user/dataminerexecutor/client/resources/save.png b/src/main/java/org/gcube/portlets/user/dataminerexecutor/client/resources/save.png new file mode 100644 index 0000000..99d532e Binary files /dev/null and b/src/main/java/org/gcube/portlets/user/dataminerexecutor/client/resources/save.png differ diff --git a/src/main/java/org/gcube/portlets/user/dataminerexecutor/client/resources/show.png b/src/main/java/org/gcube/portlets/user/dataminerexecutor/client/resources/show.png new file mode 100644 index 0000000..b8a25e4 Binary files /dev/null and b/src/main/java/org/gcube/portlets/user/dataminerexecutor/client/resources/show.png differ diff --git a/src/main/java/org/gcube/portlets/user/dataminerexecutor/client/resources/sort_asc.gif b/src/main/java/org/gcube/portlets/user/dataminerexecutor/client/resources/sort_asc.gif new file mode 100644 index 0000000..986c1c9 Binary files /dev/null and b/src/main/java/org/gcube/portlets/user/dataminerexecutor/client/resources/sort_asc.gif differ diff --git a/src/main/java/org/gcube/portlets/user/dataminerexecutor/client/resources/table.png b/src/main/java/org/gcube/portlets/user/dataminerexecutor/client/resources/table.png new file mode 100644 index 0000000..abcd936 Binary files /dev/null and b/src/main/java/org/gcube/portlets/user/dataminerexecutor/client/resources/table.png differ diff --git a/src/main/java/org/gcube/portlets/user/dataminerexecutor/client/resources/tableResult.png b/src/main/java/org/gcube/portlets/user/dataminerexecutor/client/resources/tableResult.png new file mode 100644 index 0000000..8b195b6 Binary files /dev/null and b/src/main/java/org/gcube/portlets/user/dataminerexecutor/client/resources/tableResult.png differ diff --git a/src/main/java/org/gcube/portlets/user/dataminerexecutor/client/resources/tree.gif b/src/main/java/org/gcube/portlets/user/dataminerexecutor/client/resources/tree.gif new file mode 100644 index 0000000..e9dd8e0 Binary files /dev/null and b/src/main/java/org/gcube/portlets/user/dataminerexecutor/client/resources/tree.gif differ diff --git a/src/main/java/org/gcube/portlets/user/dataminerexecutor/client/resources/triangle.png b/src/main/java/org/gcube/portlets/user/dataminerexecutor/client/resources/triangle.png new file mode 100644 index 0000000..4a8eb87 Binary files /dev/null and b/src/main/java/org/gcube/portlets/user/dataminerexecutor/client/resources/triangle.png differ diff --git a/src/main/java/org/gcube/portlets/user/dataminerexecutor/client/resources/user_green.png b/src/main/java/org/gcube/portlets/user/dataminerexecutor/client/resources/user_green.png new file mode 100644 index 0000000..30383c2 Binary files /dev/null and b/src/main/java/org/gcube/portlets/user/dataminerexecutor/client/resources/user_green.png differ diff --git a/src/main/java/org/gcube/portlets/user/dataminerexecutor/client/rpc/DataMinerExecutorService.java b/src/main/java/org/gcube/portlets/user/dataminerexecutor/client/rpc/DataMinerExecutorService.java new file mode 100644 index 0000000..df69b7f --- /dev/null +++ b/src/main/java/org/gcube/portlets/user/dataminerexecutor/client/rpc/DataMinerExecutorService.java @@ -0,0 +1,59 @@ +package org.gcube.portlets.user.dataminerexecutor.client.rpc; + +import java.util.List; + +import org.gcube.data.analysis.dataminermanagercl.shared.data.OutputData; +import org.gcube.data.analysis.dataminermanagercl.shared.data.TableItemSimple; +import org.gcube.data.analysis.dataminermanagercl.shared.data.computations.ComputationData; +import org.gcube.data.analysis.dataminermanagercl.shared.data.computations.ComputationId; +import org.gcube.data.analysis.dataminermanagercl.shared.parameters.Parameter; +import org.gcube.data.analysis.dataminermanagercl.shared.process.ComputationStatus; +import org.gcube.data.analysis.dataminermanagercl.shared.process.Operator; +import org.gcube.data.analysis.dataminermanagercl.shared.process.OperatorsClassification; +import org.gcube.data.analysis.dataminermanagercl.shared.workspace.DataMinerWorkArea; +import org.gcube.data.analysis.dataminermanagercl.shared.workspace.ItemDescription; +import org.gcube.portlets.user.dataminerexecutor.shared.exception.ServiceException; +import org.gcube.portlets.user.dataminerexecutor.shared.session.UserInfo; + +import com.google.gwt.user.client.rpc.RemoteService; +import com.google.gwt.user.client.rpc.RemoteServiceRelativePath; + +/** + * The client side stub for the RPC service. + */ +@RemoteServiceRelativePath("dataminerex") +public interface DataMinerExecutorService extends RemoteService { + + public UserInfo hello() throws ServiceException; + + public List getOperatorsClassifications(boolean refresh) throws ServiceException; + + public List getParameters(Operator operator) throws ServiceException; + + public ComputationId startComputation(Operator op) throws ServiceException; + + public ComputationStatus getComputationStatus(ComputationId computationId) throws ServiceException; + + public ComputationId resubmit(ItemDescription itemDescription) throws ServiceException; + + public TableItemSimple retrieveTableInformation(ItemDescription item) throws ServiceException; + + public DataMinerWorkArea getDataMinerWorkArea() throws ServiceException; + + public String getPublicLink(ItemDescription itemDescription) throws ServiceException; + + public String cancelComputation(ComputationId computationId) throws ServiceException; + + public void deleteItem(ItemDescription itemDescription) throws ServiceException; + + public OutputData getOutputDataByComputationId(ComputationId computationId) throws ServiceException; + + public ComputationData getComputationData(ItemDescription itemDescription) throws ServiceException; + + public String cancelComputation(ItemDescription itemDescription) throws ServiceException; + + public ItemDescription getItemDescription(String itemId) throws ServiceException; + + public Operator getInvocationModel(String invocationModelFileUrl) throws ServiceException; + +} diff --git a/src/main/java/org/gcube/portlets/user/dataminerexecutor/client/rpc/DataMinerExecutorServiceAsync.java b/src/main/java/org/gcube/portlets/user/dataminerexecutor/client/rpc/DataMinerExecutorServiceAsync.java new file mode 100644 index 0000000..520e49e --- /dev/null +++ b/src/main/java/org/gcube/portlets/user/dataminerexecutor/client/rpc/DataMinerExecutorServiceAsync.java @@ -0,0 +1,63 @@ +package org.gcube.portlets.user.dataminerexecutor.client.rpc; + +import java.util.List; + +import org.gcube.data.analysis.dataminermanagercl.shared.data.OutputData; +import org.gcube.data.analysis.dataminermanagercl.shared.data.TableItemSimple; +import org.gcube.data.analysis.dataminermanagercl.shared.data.computations.ComputationData; +import org.gcube.data.analysis.dataminermanagercl.shared.data.computations.ComputationId; +import org.gcube.data.analysis.dataminermanagercl.shared.parameters.Parameter; +import org.gcube.data.analysis.dataminermanagercl.shared.process.ComputationStatus; +import org.gcube.data.analysis.dataminermanagercl.shared.process.Operator; +import org.gcube.data.analysis.dataminermanagercl.shared.process.OperatorsClassification; +import org.gcube.data.analysis.dataminermanagercl.shared.workspace.DataMinerWorkArea; +import org.gcube.data.analysis.dataminermanagercl.shared.workspace.ItemDescription; +import org.gcube.portlets.user.dataminerexecutor.shared.session.UserInfo; + +import com.google.gwt.core.client.GWT; +import com.google.gwt.user.client.rpc.AsyncCallback; + +/** + * + * @author Giancarlo Panichi + * + * + */ +public interface DataMinerExecutorServiceAsync { + + public static DataMinerExecutorServiceAsync INSTANCE = (DataMinerExecutorServiceAsync) GWT + .create(DataMinerExecutorService.class); + + void hello(AsyncCallback callback); + + void getOperatorsClassifications(boolean refresh, AsyncCallback> callback); + + void getParameters(Operator operator, AsyncCallback> callback); + + void startComputation(Operator op, AsyncCallback asyncCallback); + + void getComputationStatus(ComputationId computationId, AsyncCallback asyncCallback); + + void resubmit(ItemDescription itemDescription, AsyncCallback callback); + + void retrieveTableInformation(ItemDescription item, AsyncCallback callback); + + void getDataMinerWorkArea(AsyncCallback asyncCallback); + + void getPublicLink(ItemDescription itemDescription, AsyncCallback callback); + + void cancelComputation(ComputationId computationId, AsyncCallback asyncCallback); + + void deleteItem(ItemDescription itemDescription, AsyncCallback callback); + + void getOutputDataByComputationId(ComputationId computationId, AsyncCallback callback); + + void getComputationData(ItemDescription itemDescription, AsyncCallback callback); + + void cancelComputation(ItemDescription itemDescription, AsyncCallback asyncCallback); + + void getItemDescription(String itemId, AsyncCallback asyncCallback); + + void getInvocationModel(String invocationModelFileUrl, AsyncCallback callback); + +} diff --git a/src/main/java/org/gcube/portlets/user/dataminerexecutor/client/type/DataMinerWorkAreaElementType.java b/src/main/java/org/gcube/portlets/user/dataminerexecutor/client/type/DataMinerWorkAreaElementType.java new file mode 100644 index 0000000..f4aedef --- /dev/null +++ b/src/main/java/org/gcube/portlets/user/dataminerexecutor/client/type/DataMinerWorkAreaElementType.java @@ -0,0 +1,11 @@ +package org.gcube.portlets.user.dataminerexecutor.client.type; + +/** + * + * @author Giancarlo Panichi + * + * + */ +public enum DataMinerWorkAreaElementType { + InputDataSets, OutputDataSets, Computations; +} diff --git a/src/main/java/org/gcube/portlets/user/dataminerexecutor/client/type/DataMinerWorkAreaEventType.java b/src/main/java/org/gcube/portlets/user/dataminerexecutor/client/type/DataMinerWorkAreaEventType.java new file mode 100644 index 0000000..809f916 --- /dev/null +++ b/src/main/java/org/gcube/portlets/user/dataminerexecutor/client/type/DataMinerWorkAreaEventType.java @@ -0,0 +1,11 @@ +package org.gcube.portlets.user.dataminerexecutor.client.type; + +/** + * + * @author Giancarlo Panichi + * + * + */ +public enum DataMinerWorkAreaEventType { + OPEN, UPDATE; +} diff --git a/src/main/java/org/gcube/portlets/user/dataminerexecutor/client/type/DataMinerWorkAreaRegionType.java b/src/main/java/org/gcube/portlets/user/dataminerexecutor/client/type/DataMinerWorkAreaRegionType.java new file mode 100644 index 0000000..4bd7325 --- /dev/null +++ b/src/main/java/org/gcube/portlets/user/dataminerexecutor/client/type/DataMinerWorkAreaRegionType.java @@ -0,0 +1,11 @@ +package org.gcube.portlets.user.dataminerexecutor.client.type; + +/** + * + * @author Giancarlo Panichi + * + * + */ +public enum DataMinerWorkAreaRegionType { + DataSets, Computations; +} diff --git a/src/main/java/org/gcube/portlets/user/dataminerexecutor/client/type/DataMinerWorkAreaRequestEventType.java b/src/main/java/org/gcube/portlets/user/dataminerexecutor/client/type/DataMinerWorkAreaRequestEventType.java new file mode 100644 index 0000000..e32bcd4 --- /dev/null +++ b/src/main/java/org/gcube/portlets/user/dataminerexecutor/client/type/DataMinerWorkAreaRequestEventType.java @@ -0,0 +1,11 @@ +package org.gcube.portlets.user.dataminerexecutor.client.type; + +/** + * + * @author Giancarlo Panichi + * + * + */ +public enum DataMinerWorkAreaRequestEventType { + OPEN,UPDATE; +} diff --git a/src/main/java/org/gcube/portlets/user/dataminerexecutor/client/type/MenuType.java b/src/main/java/org/gcube/portlets/user/dataminerexecutor/client/type/MenuType.java new file mode 100644 index 0000000..556e890 --- /dev/null +++ b/src/main/java/org/gcube/portlets/user/dataminerexecutor/client/type/MenuType.java @@ -0,0 +1,11 @@ +package org.gcube.portlets.user.dataminerexecutor.client.type; + +/** + * + * @author Giancarlo Panichi + * + * + */ +public enum MenuType { + EXPERIMENT; +} diff --git a/src/main/java/org/gcube/portlets/user/dataminerexecutor/client/type/OperatorsClassificationRequestType.java b/src/main/java/org/gcube/portlets/user/dataminerexecutor/client/type/OperatorsClassificationRequestType.java new file mode 100644 index 0000000..d41c5e6 --- /dev/null +++ b/src/main/java/org/gcube/portlets/user/dataminerexecutor/client/type/OperatorsClassificationRequestType.java @@ -0,0 +1,11 @@ +package org.gcube.portlets.user.dataminerexecutor.client.type; + +/** + * + * @author Giancarlo Panichi + * + * + */ +public enum OperatorsClassificationRequestType { + Default, ByName; +} diff --git a/src/main/java/org/gcube/portlets/user/dataminerexecutor/client/type/OutputResourceRequestEventType.java b/src/main/java/org/gcube/portlets/user/dataminerexecutor/client/type/OutputResourceRequestEventType.java new file mode 100644 index 0000000..daa67c4 --- /dev/null +++ b/src/main/java/org/gcube/portlets/user/dataminerexecutor/client/type/OutputResourceRequestEventType.java @@ -0,0 +1,11 @@ +package org.gcube.portlets.user.dataminerexecutor.client.type; + +/** + * + * @author Giancarlo Panichi + * + * + */ +public enum OutputResourceRequestEventType { + ComputationId, ItemDescription; +} diff --git a/src/main/java/org/gcube/portlets/user/dataminerexecutor/client/type/SessionExpiredEventType.java b/src/main/java/org/gcube/portlets/user/dataminerexecutor/client/type/SessionExpiredEventType.java new file mode 100644 index 0000000..442738d --- /dev/null +++ b/src/main/java/org/gcube/portlets/user/dataminerexecutor/client/type/SessionExpiredEventType.java @@ -0,0 +1,11 @@ +package org.gcube.portlets.user.dataminerexecutor.client.type; + +/** + * + * @author Giancarlo Panichi + * + * + */ +public enum SessionExpiredEventType { + EXPIREDONSERVER; +} diff --git a/src/main/java/org/gcube/portlets/user/dataminerexecutor/client/type/UIStateEventType.java b/src/main/java/org/gcube/portlets/user/dataminerexecutor/client/type/UIStateEventType.java new file mode 100644 index 0000000..32caaf0 --- /dev/null +++ b/src/main/java/org/gcube/portlets/user/dataminerexecutor/client/type/UIStateEventType.java @@ -0,0 +1,13 @@ +package org.gcube.portlets.user.dataminerexecutor.client.type; + +/** + * + * @author Giancarlo Panichi + * + * + */ +public enum UIStateEventType { + START, + UPDATE, + WAITING; +} diff --git a/src/main/java/org/gcube/portlets/user/dataminerexecutor/client/type/WPSMenuType.java b/src/main/java/org/gcube/portlets/user/dataminerexecutor/client/type/WPSMenuType.java new file mode 100644 index 0000000..5a205d7 --- /dev/null +++ b/src/main/java/org/gcube/portlets/user/dataminerexecutor/client/type/WPSMenuType.java @@ -0,0 +1,11 @@ +package org.gcube.portlets.user.dataminerexecutor.client.type; + +/** + * + * @author Giancarlo Panichi + * + * + */ +public enum WPSMenuType { + MENU, INPUT_SPACE, EXPERIMENT, COMPUTATIONS +} diff --git a/src/main/java/org/gcube/portlets/user/dataminerexecutor/client/util/ElementsHighlights.java b/src/main/java/org/gcube/portlets/user/dataminerexecutor/client/util/ElementsHighlights.java new file mode 100644 index 0000000..af56db3 --- /dev/null +++ b/src/main/java/org/gcube/portlets/user/dataminerexecutor/client/util/ElementsHighlights.java @@ -0,0 +1,271 @@ +package org.gcube.portlets.user.dataminerexecutor.client.util; + +import com.allen_sauer.gwt.log.client.Log; + +/** + * + * @author Giancarlo Panichi + * + * + */ +public class ElementsHighlights { + + public ElementsHighlights() { + + } + + public String createLinkFromText(String text) { + Log.info("Message: " + text); + if (text == null || text.isEmpty()) { + return text; + } + + boolean end = false; + StringBuilder result = new StringBuilder(); + String mes = new String(text); + + while (!end) { + if (mes != null && !mes.isEmpty()) { + if (mes.contains("http") || mes.contains("https")) { + int httpIndex = mes.indexOf("http"); + int httpsIndex = mes.indexOf("https"); + if (httpIndex == -1) { + if (httpsIndex == -1) { + result.append(mes); + end = true; + } else { + String prefix = mes.substring(0, httpsIndex); + result.append(prefix); + + String checkTerminator; + if (httpsIndex > 0) { + checkTerminator = mes.substring(httpsIndex - 1, httpsIndex); + if (checkTerminator.compareTo(" ") != 0 && checkTerminator.compareTo("\"") != 0 + && checkTerminator.compareTo("'") != 0) { + Log.debug("Terminator Found:" + checkTerminator); + checkTerminator = " "; + Log.debug("Terminator Set:" + checkTerminator); + + } else { + Log.debug("Terminator Set:" + checkTerminator); + } + } else { + checkTerminator = " "; + Log.debug("Terminator Set:" + checkTerminator); + } + + + mes = mes.substring(httpsIndex, mes.length()); + + int terminator = mes.indexOf(checkTerminator); + if (terminator == -1) { + if(mes.contains("" + extractedUrl + ""); + result.append(mes.substring(j)); + } else { + result.append("" + mes + ""); + } + end = true; + } else { + String extractedUrl; + if (checkTerminator == " ") { + extractedUrl = mes.substring(0, terminator+1); + } else { + extractedUrl = mes.substring(0, terminator); + } + + + if(extractedUrl.contains("" + extractedUrl + ""); + mes = mes.substring(terminator, mes.length()); + } + } + + } else { + if (httpsIndex == -1) { + String prefix = mes.substring(0, httpIndex); + result.append(prefix); + + String checkTerminator; + if (httpIndex > 0) { + checkTerminator = mes.substring(httpIndex - 1, httpIndex); + if (checkTerminator.compareTo(" ") != 0 && checkTerminator.compareTo("\"") != 0 + && checkTerminator.compareTo("'") != 0) { + Log.debug("Terminator Found:" + checkTerminator); + checkTerminator = " "; + Log.debug("Terminator Set:" + checkTerminator); + + } else { + Log.debug("Terminator Set:" + checkTerminator); + } + } else { + checkTerminator = " "; + Log.debug("Terminator Set:" + checkTerminator); + } + + mes = mes.substring(httpIndex, mes.length()); + int terminator = mes.indexOf(checkTerminator); + Log.debug("TerminatorCheck found: "+terminator); + if (terminator == -1) { + if(mes.contains("" + extractedUrl + ""); + result.append(mes.substring(j)); + } else { + result.append("" + mes + ""); + } + end = true; + } else { + String extractedUrl; + if (checkTerminator == " ") { + extractedUrl = mes.substring(0, terminator+1); + } else { + extractedUrl = mes.substring(0, terminator); + } + + + if(extractedUrl.contains("" + extractedUrl + ""); + mes = mes.substring(terminator, mes.length()); + } + } else { + if (httpsIndex <= httpIndex) { + String prefix = mes.substring(0, httpsIndex); + result.append(prefix); + + String checkTerminator; + if (httpsIndex > 0) { + checkTerminator = mes.substring(httpsIndex - 1, httpsIndex); + if (checkTerminator.compareTo(" ") != 0 && checkTerminator.compareTo("\"") != 0 + && checkTerminator.compareTo("'") != 0) { + Log.debug("Terminator Found:" + checkTerminator); + checkTerminator = " "; + Log.debug("Terminator Set:" + checkTerminator); + + } else { + Log.debug("Terminator Set:" + checkTerminator); + } + } else { + checkTerminator = " "; + Log.debug("Terminator Set:" + checkTerminator); + } + + + mes = mes.substring(httpsIndex, mes.length()); + int terminator = mes.indexOf(checkTerminator); + + if (terminator == -1) { + if(mes.contains("" + extractedUrl + ""); + result.append(mes.substring(j)); + } else { + result.append("" + mes + ""); + } + end = true; + } else { + String extractedUrl; + if (checkTerminator == " ") { + extractedUrl = mes.substring(0, terminator); + } else { + extractedUrl = mes.substring(0, terminator - 1); + } + + + if(extractedUrl.contains("" + extractedUrl + ""); + mes = mes.substring(terminator, mes.length()); + } + } else { + String prefix = mes.substring(0, httpIndex); + result.append(prefix); + + String checkTerminator; + if (httpIndex > 0) { + checkTerminator = mes.substring(httpIndex - 1, httpIndex); + if (checkTerminator.compareTo(" ") != 0 && checkTerminator.compareTo("\"") != 0 + && checkTerminator.compareTo("'") != 0) { + Log.debug("Terminator Found:" + checkTerminator); + checkTerminator = " "; + Log.debug("Terminator Set:" + checkTerminator); + + } else { + Log.debug("Terminator Set:" + checkTerminator); + } + } else { + checkTerminator = " "; + Log.debug("Terminator Set:" + checkTerminator); + } + + + mes = mes.substring(httpIndex, mes.length()); + int terminator = mes.indexOf(checkTerminator); + + if (terminator == -1) { + if(mes.contains("" + extractedUrl + ""); + result.append(mes.substring(j)); + } else { + result.append("" + mes + ""); + } + end = true; + } else { + String extractedUrl; + if (checkTerminator == " ") { + extractedUrl = mes.substring(0, terminator); + } else { + extractedUrl = mes.substring(0, terminator - 1); + } + + if(extractedUrl.contains("" + extractedUrl + ""); + mes = mes.substring(terminator, mes.length()); + + } + } + } + + } + + } else { + result.append(mes); + end = true; + } + } else { + end = true; + } + } + Log.info("New Message: " + result.toString()); + return result.toString(); + } +} diff --git a/src/main/java/org/gcube/portlets/user/dataminerexecutor/client/util/InfoMessageBox.java b/src/main/java/org/gcube/portlets/user/dataminerexecutor/client/util/InfoMessageBox.java new file mode 100644 index 0000000..e286e33 --- /dev/null +++ b/src/main/java/org/gcube/portlets/user/dataminerexecutor/client/util/InfoMessageBox.java @@ -0,0 +1,28 @@ +package org.gcube.portlets.user.dataminerexecutor.client.util; + +import com.sencha.gxt.widget.core.client.box.MessageBox; + +/** + * + * @author Giancarlo Panichi + * + * + */ +public class InfoMessageBox extends MessageBox { + + /** + * Creates a message box with an info icon and the specified title and + * message. + * + * @param title + * the message box title + * @param message + * the message displayed in the message box + */ + public InfoMessageBox(String title, String message) { + super(title, message); + + setIcon(ICONS.info()); + } + +} \ No newline at end of file diff --git a/src/main/java/org/gcube/portlets/user/dataminerexecutor/client/util/UtilsGXT3.java b/src/main/java/org/gcube/portlets/user/dataminerexecutor/client/util/UtilsGXT3.java new file mode 100644 index 0000000..512e3d4 --- /dev/null +++ b/src/main/java/org/gcube/portlets/user/dataminerexecutor/client/util/UtilsGXT3.java @@ -0,0 +1,78 @@ +package org.gcube.portlets.user.dataminerexecutor.client.util; + +import com.google.gwt.core.client.Callback; +import com.google.gwt.dom.client.Element; +import com.sencha.gxt.core.client.dom.XElement; +import com.sencha.gxt.widget.core.client.Component; +import com.sencha.gxt.widget.core.client.box.AlertMessageBox; +import com.sencha.gxt.widget.core.client.event.HideEvent; +import com.sencha.gxt.widget.core.client.event.HideEvent.HideHandler; + +/** + * + * @author Giancarlo Panichi + * + * + */ +public class UtilsGXT3 { + public static void mask(Element element) { + XElement el = element. cast(); + el.mask("Loading..."); + } + + public static void umask(Element element) { + element. cast().unmask(); + } + + public static void alert(String title, String message) { + final AlertMessageBox d = new AlertMessageBox(title, message); + d.addHideHandler(new HideHandler() { + + public void onHide(HideEvent event) { + + } + }); + d.show(); + + } + + public static void alert(String title, String message, + final Callback callback) { + final AlertMessageBox d = new AlertMessageBox(title, message); + d.addHideHandler(new HideHandler() { + + public void onHide(HideEvent event) { + Component comp = event.getSource(); + callback.onSuccess(comp); + } + }); + d.show(); + } + + public static void info(String title, String message) { + final InfoMessageBox d = new InfoMessageBox(title, message); + d.addHideHandler(new HideHandler() { + + public void onHide(HideEvent event) { + + } + }); + d.show(); + + } + + public static void info(String title, String message, + final Callback callback) { + final InfoMessageBox d = new InfoMessageBox(title, message); + d.addHideHandler(new HideHandler() { + + public void onHide(HideEvent event) { + Component comp = event.getSource(); + callback.onSuccess(comp); + } + }); + d.show(); + + } + +} diff --git a/src/main/java/org/gcube/portlets/user/dataminerexecutor/client/widgets/FileViewer.java b/src/main/java/org/gcube/portlets/user/dataminerexecutor/client/widgets/FileViewer.java new file mode 100644 index 0000000..c94e8b8 --- /dev/null +++ b/src/main/java/org/gcube/portlets/user/dataminerexecutor/client/widgets/FileViewer.java @@ -0,0 +1,109 @@ +package org.gcube.portlets.user.dataminerexecutor.client.widgets; + +import org.gcube.data.analysis.dataminermanagercl.shared.data.computations.ComputationId; +import org.gcube.data.analysis.dataminermanagercl.shared.data.output.FileResource; +import org.gcube.portlets.user.dataminerexecutor.client.DataMinerExecutor; +import org.gcube.portlets.widgets.netcdfbasicwidgets.client.event.SelectVariableEvent; +import org.gcube.portlets.widgets.netcdfbasicwidgets.client.event.SelectVariableEvent.SelectVariableEventHandler; +import org.gcube.portlets.widgets.netcdfbasicwidgets.client.widgets.NetCDFPreviewDialog; + +import com.google.gwt.core.shared.GWT; +import com.google.gwt.safehtml.shared.SafeHtmlBuilder; +import com.google.gwt.user.client.Window; +import com.sencha.gxt.core.client.dom.XDOM; +import com.sencha.gxt.core.client.util.Margins; +import com.sencha.gxt.widget.core.client.button.TextButton; +import com.sencha.gxt.widget.core.client.container.HtmlLayoutContainer; +import com.sencha.gxt.widget.core.client.container.SimpleContainer; +import com.sencha.gxt.widget.core.client.container.VerticalLayoutContainer; +import com.sencha.gxt.widget.core.client.container.VerticalLayoutContainer.VerticalLayoutData; +import com.sencha.gxt.widget.core.client.event.SelectEvent; + +/** + * + * @author Giancarlo Panichi + * + * + */ +public class FileViewer extends SimpleContainer { + + private FileResource fileResource; + + /** + * + * @param computationId + * computation id + * @param fileResource + * file resource + */ + public FileViewer(ComputationId computationId, FileResource fileResource) { + super(); + GWT.log("FileViewer: [computationId="+computationId+", fileResource="+fileResource+"]"); + this.fileResource = fileResource; + // this.computationId = computationId; + init(); + create(); + } + + private void init() { + setHeight(56); + } + + private void create() { + VerticalLayoutContainer lc = new VerticalLayoutContainer(); + final String fileName = fileResource.getName(); + final String fileUrl = fileResource.getUrl(); + HtmlLayoutContainer fileNameHtml = new HtmlLayoutContainer("

" + + new SafeHtmlBuilder().appendEscaped(fileName).toSafeHtml().asString() + "

"); + lc.add(fileNameHtml, new VerticalLayoutData(-1, -1, new Margins(0))); + TextButton downloadBtn = new TextButton("Download File"); + downloadBtn.setIcon(DataMinerExecutor.resources.download()); + downloadBtn.addSelectHandler(new SelectEvent.SelectHandler() { + @Override + public void onSelect(SelectEvent event) { + GWT.log("Download File url: "+fileUrl); + Window.open(fileUrl, fileName, ""); + + } + }); + + TextButton netcdfButton = new TextButton(""); + netcdfButton.setIcon(DataMinerExecutor.resources.netcdf()); + netcdfButton.addSelectHandler(new SelectEvent.SelectHandler() { + + @Override + public void onSelect(SelectEvent event) { + showNetCDFFile(); + } + }); + + lc.add(downloadBtn, new VerticalLayoutData(-1, -1, new Margins(0))); + if (fileResource.isNetcdf()) { + lc.add(netcdfButton, new VerticalLayoutData(-1, -1, new Margins(0))); + } + add(lc); + } + + private void showNetCDFFile() { + if (fileResource != null && fileResource.getUrl() != null && !fileResource.getUrl().isEmpty() + && fileResource.isNetcdf()) { + GWT.log("NetcdfBasicWidgetsManager"); + + // Example + SelectVariableEventHandler handler = new SelectVariableEventHandler() { + + @Override + public void onResponse(SelectVariableEvent event) { + GWT.log("SelectVariable Response: " + event); + + } + }; + + NetCDFPreviewDialog netcdfDialog = new NetCDFPreviewDialog(fileResource.getUrl()); + netcdfDialog.addSelectVariableEventHandler(handler); + netcdfDialog.setZIndex(XDOM.getTopZIndex()); + + } + } + +} diff --git a/src/main/java/org/gcube/portlets/user/dataminerexecutor/client/widgets/HashMapViewer.java b/src/main/java/org/gcube/portlets/user/dataminerexecutor/client/widgets/HashMapViewer.java new file mode 100644 index 0000000..e91eb6f --- /dev/null +++ b/src/main/java/org/gcube/portlets/user/dataminerexecutor/client/widgets/HashMapViewer.java @@ -0,0 +1,54 @@ +/** + * + */ +package org.gcube.portlets.user.dataminerexecutor.client.widgets; + +import java.util.Map; +import java.util.Map.Entry; + +import com.sencha.gxt.widget.core.client.container.HtmlLayoutContainer; +import com.sencha.gxt.widget.core.client.container.SimpleContainer; + +/** + * + * @author Giancarlo Panichi + * + * + */ +public class HashMapViewer extends SimpleContainer { + + private Map map; + + /** + * + * @param map + * map + */ + public HashMapViewer(Map map) { + super(); + this.map = map; + init(); + + } + + /** + * + */ + private void init() { + String html = ""; + html += "" + " " + " " + + " " + " " + " "; + + for (Entry entry : map.entrySet()) + if (entry.getKey() != null) { + html += " " + " " + " " + " "; + } + + html += " " + "
" + entry.getKey() + "" + entry.getValue() + + "
"; + HtmlLayoutContainer htmlContainer = new HtmlLayoutContainer(html); + add(htmlContainer); + forceLayout(); + } + +} diff --git a/src/main/java/org/gcube/portlets/user/dataminerexecutor/client/widgets/ImageViewer.java b/src/main/java/org/gcube/portlets/user/dataminerexecutor/client/widgets/ImageViewer.java new file mode 100644 index 0000000..ae79a44 --- /dev/null +++ b/src/main/java/org/gcube/portlets/user/dataminerexecutor/client/widgets/ImageViewer.java @@ -0,0 +1,89 @@ +package org.gcube.portlets.user.dataminerexecutor.client.widgets; + +import org.gcube.data.analysis.dataminermanagercl.shared.data.computations.ComputationId; +import org.gcube.data.analysis.dataminermanagercl.shared.data.output.ImageResource; +import org.gcube.portlets.user.dataminerexecutor.client.DataMinerExecutor; + +import com.google.gwt.user.client.ui.Image; +import com.sencha.gxt.core.client.util.Margins; +import com.sencha.gxt.widget.core.client.button.TextButton; +import com.sencha.gxt.widget.core.client.container.HtmlLayoutContainer; +import com.sencha.gxt.widget.core.client.container.SimpleContainer; +import com.sencha.gxt.widget.core.client.container.VerticalLayoutContainer; +import com.sencha.gxt.widget.core.client.container.VerticalLayoutContainer.VerticalLayoutData; +import com.sencha.gxt.widget.core.client.event.SelectEvent; + +/** + * + * @author Giancarlo Panichi + * + * + */ +public class ImageViewer extends SimpleContainer { + + protected static final String SAVE_OK_MESSAGE = "The images have been saved on the Workspace in the folder "; + protected static final String SAVE_OK_TITLE = "Saving operation was successful"; + protected static final String SAVE_FAIL_TITLE = "Error"; + protected static final String SAVE_FAIL_MESSAGE = "Error in saving images."; + private ImageResource imagesResource; + // private ComputationId computationId; + + /** + * + * @param computationId + * computation id + * @param imagesResource + * image resource + */ + public ImageViewer(ComputationId computationId, ImageResource imagesResource) { + super(); + this.imagesResource = imagesResource; + // this.computationId = computationId; + create(); + } + + private void create() { + VerticalLayoutContainer v = new VerticalLayoutContainer(); + add(v); + if (imagesResource == null || imagesResource.getLink() == null || imagesResource.getLink().isEmpty()) + v.add(new HtmlLayoutContainer("No image found."), new VerticalLayoutData(-1, -1, new Margins(0))); + else { + v.add(new HtmlLayoutContainer(imagesResource.getName()), new VerticalLayoutData(-1, -1, new Margins(0))); + TextButton saveImageBtn = new TextButton("Download Image"); + saveImageBtn.setIcon(DataMinerExecutor.resources.download()); + saveImageBtn.addSelectHandler(new SelectEvent.SelectHandler() { + + @Override + public void onSelect(SelectEvent event) { + com.google.gwt.user.client.Window.open(imagesResource.getLink(), imagesResource.getName(), ""); + + } + }); + + v.add(saveImageBtn, new VerticalLayoutData(-1, -1, new Margins(0))); + final Image img = new Image(imagesResource.getLink()); + v.add(img, new VerticalLayoutData(1, -1, new Margins(0))); + } + + forceLayout(); + + } + + /* + * private void saveImages() { EventBusProvider.INSTANCE.fireEvent(new + * MaskEvent( "Saving on the workspace...")); // + * handler.maskAll("Saving on the workspace..."); + * DataMinerManager.getService().saveImage(computationId, imagesResource, + * new AsyncCallback() { + * + * @Override public void onSuccess(String result) { + * EventBusProvider.INSTANCE .fireEvent(new MaskEvent(null)); // + * handler.unmaskAll(); UtilsGXT3.info(SAVE_OK_TITLE, SAVE_OK_MESSAGE + "\"" + * + result + "\""); } + * + * @Override public void onFailure(Throwable caught) { + * EventBusProvider.INSTANCE .fireEvent(new MaskEvent(null)); // + * handler.unmaskAll(); UtilsGXT3.alert(SAVE_FAIL_TITLE, SAVE_FAIL_MESSAGE, + * null); } }); } + */ +} diff --git a/src/main/java/org/gcube/portlets/user/dataminerexecutor/client/widgets/ResourceViewer.java b/src/main/java/org/gcube/portlets/user/dataminerexecutor/client/widgets/ResourceViewer.java new file mode 100644 index 0000000..cfb6c3d --- /dev/null +++ b/src/main/java/org/gcube/portlets/user/dataminerexecutor/client/widgets/ResourceViewer.java @@ -0,0 +1,58 @@ +/** + * + */ +package org.gcube.portlets.user.dataminerexecutor.client.widgets; + +import java.util.Map; +import java.util.Map.Entry; + +import org.gcube.data.analysis.dataminermanagercl.shared.data.output.ObjectResource; +import org.gcube.data.analysis.dataminermanagercl.shared.data.output.Resource; + +import com.sencha.gxt.widget.core.client.container.HtmlLayoutContainer; + +/** + * + * @author Giancarlo Panichi + * + * + */ +public class ResourceViewer { + + private Map map; + + /** + * + * @param map + * map + */ + public ResourceViewer(Map map) { + this.map = map; + + } + + /** + * + * @return html layout container + */ + public HtmlLayoutContainer getHtml() { + String html = ""; + html += "" + " " + " " + " " + + " " + " " + " "; + + for (Entry entry : map.entrySet()) + if (entry.getKey() != null) { + if (entry.getValue() instanceof ObjectResource) { + ObjectResource or = (ObjectResource) entry.getValue(); + html += " " + " " + " " + + " "; + } else { + + } + } + + html += " " + "
" + or.getName() + "" + or.getValue() + "
"; + return new HtmlLayoutContainer(html); + } + +} diff --git a/src/main/java/org/gcube/portlets/user/dataminerexecutor/client/workspace/DownloadWidget.java b/src/main/java/org/gcube/portlets/user/dataminerexecutor/client/workspace/DownloadWidget.java new file mode 100644 index 0000000..82f676d --- /dev/null +++ b/src/main/java/org/gcube/portlets/user/dataminerexecutor/client/workspace/DownloadWidget.java @@ -0,0 +1,77 @@ +package org.gcube.portlets.user.dataminerexecutor.client.workspace; + +import org.gcube.data.analysis.dataminermanagercl.shared.workspace.ItemDescription; +import org.gcube.portal.clientcontext.client.GCubeClientContext; +import org.gcube.portlets.user.dataminerexecutor.client.common.EventBusProvider; +import org.gcube.portlets.user.dataminerexecutor.client.events.SessionExpiredEvent; +import org.gcube.portlets.user.dataminerexecutor.client.rpc.DataMinerExecutorServiceAsync; +import org.gcube.portlets.user.dataminerexecutor.client.util.UtilsGXT3; +import org.gcube.portlets.user.dataminerexecutor.shared.Constants; +import org.gcube.portlets.user.dataminerexecutor.shared.exception.SessionExpiredServiceException; + +import com.allen_sauer.gwt.log.client.Log; +import com.google.gwt.core.client.GWT; +import com.google.gwt.http.client.URL; +import com.google.gwt.user.client.Window; +import com.google.gwt.user.client.rpc.AsyncCallback; + +/** + * + * @author Giancarlo Panichi + * + * + */ +public class DownloadWidget { + + public DownloadWidget() { + + } + + public void download(String itemId) { + DataMinerExecutorServiceAsync.INSTANCE.getItemDescription(itemId, new AsyncCallback() { + + @Override + public void onFailure(Throwable caught) { + if (caught instanceof SessionExpiredServiceException) { + EventBusProvider.INSTANCE.fireEvent(new SessionExpiredEvent()); + } else { + Log.error("Error open item: " + caught.getLocalizedMessage(), caught); + UtilsGXT3.alert("Error", caught.getLocalizedMessage()); + } + caught.printStackTrace(); + + } + + @Override + public void onSuccess(ItemDescription itemDownloadInfo) { + Log.debug("Retrieved item download info: " + itemDownloadInfo); + requestDownload(itemDownloadInfo); + } + + }); + } + + private void requestDownload(ItemDescription itemDescription) { + switch (itemDescription.getType()) { + case "AbstractFileItem": + case "FolderItem": + executeDownload(itemDescription); + break; + default: + UtilsGXT3.info("Attention", "This item does not support download operation!"); + break; + } + + } + + private void executeDownload(ItemDescription itemDescription) { + StringBuilder url = new StringBuilder(); + url.append(GWT.getModuleBaseURL()); + url.append(Constants.DOWNLOAD_SERVLET + "/" + itemDescription.getName() + "?itemId=" + itemDescription.getId() + + "&" + Constants.CURR_GROUP_ID + "=" + GCubeClientContext.getCurrentContextId()); + + Window.open(URL.encode(url.toString()), "_blank", ""); + + } + +} diff --git a/src/main/java/org/gcube/portlets/user/dataminerexecutor/dataminerexecutor.gwt.xml b/src/main/java/org/gcube/portlets/user/dataminerexecutor/dataminerexecutor.gwt.xml new file mode 100644 index 0000000..1f12c0d --- /dev/null +++ b/src/main/java/org/gcube/portlets/user/dataminerexecutor/dataminerexecutor.gwt.xml @@ -0,0 +1,59 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/main/java/org/gcube/portlets/user/dataminerexecutor/portlet/DataMinerExecutor.java b/src/main/java/org/gcube/portlets/user/dataminerexecutor/portlet/DataMinerExecutor.java new file mode 100644 index 0000000..2b5a272 --- /dev/null +++ b/src/main/java/org/gcube/portlets/user/dataminerexecutor/portlet/DataMinerExecutor.java @@ -0,0 +1,55 @@ +/** + * + */ +package org.gcube.portlets.user.dataminerexecutor.portlet; + +import java.io.IOException; + +import javax.portlet.GenericPortlet; +import javax.portlet.PortletException; +import javax.portlet.PortletRequestDispatcher; +import javax.portlet.RenderRequest; +import javax.portlet.RenderResponse; + +import org.gcube.common.portal.PortalContext; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +/** + * + * @author Giancarlo Panichi + * + * + */ +public class DataMinerExecutor extends GenericPortlet { + + private final Logger logger= LoggerFactory.getLogger(GenericPortlet.class); + + + /** + * JSP folder name + */ + public static final String JSP_FOLDER = "/WEB-INF/jsp/"; + + /** + * + */ + public static final String VIEW_JSP = JSP_FOLDER + "DataMinerExecutor_view.jsp"; + + /** + * @param request . + * @param response . + * @throws IOException . + * @throws PortletException . + */ + public void doView(RenderRequest request, RenderResponse response) throws PortletException, IOException { + + logger.trace("DataMinerExecutor loading from JSP: "+VIEW_JSP); + logger.trace("Setting user in session using PortalContext"); + PortalContext.setUserInSession(request); + + logger.trace("passing to the render"); + PortletRequestDispatcher rd = getPortletContext().getRequestDispatcher(VIEW_JSP); + rd.include(request,response); + } +} diff --git a/src/main/java/org/gcube/portlets/user/dataminerexecutor/server/DataMinerExecutorServiceImpl.java b/src/main/java/org/gcube/portlets/user/dataminerexecutor/server/DataMinerExecutorServiceImpl.java new file mode 100644 index 0000000..cfd40a1 --- /dev/null +++ b/src/main/java/org/gcube/portlets/user/dataminerexecutor/server/DataMinerExecutorServiceImpl.java @@ -0,0 +1,440 @@ +package org.gcube.portlets.user.dataminerexecutor.server; + +import java.util.ArrayList; +import java.util.List; +import java.util.Map; + +import javax.servlet.ServletException; +import javax.servlet.http.HttpServletRequest; + +import org.gcube.data.analysis.dataminermanagercl.server.dmservice.SClient; +import org.gcube.data.analysis.dataminermanagercl.server.util.ServiceCredentials; +import org.gcube.data.analysis.dataminermanagercl.shared.data.OutputData; +import org.gcube.data.analysis.dataminermanagercl.shared.data.TableItemSimple; +import org.gcube.data.analysis.dataminermanagercl.shared.data.computations.ComputationData; +import org.gcube.data.analysis.dataminermanagercl.shared.data.computations.ComputationId; +import org.gcube.data.analysis.dataminermanagercl.shared.parameters.Parameter; +import org.gcube.data.analysis.dataminermanagercl.shared.process.ComputationStatus; +import org.gcube.data.analysis.dataminermanagercl.shared.process.Operator; +import org.gcube.data.analysis.dataminermanagercl.shared.process.OperatorsClassification; +import org.gcube.data.analysis.dataminermanagercl.shared.workspace.DataMinerWorkArea; +import org.gcube.data.analysis.dataminermanagercl.shared.workspace.ItemDescription; +import org.gcube.data.analysis.dminvocation.model.DataMinerInvocation; +import org.gcube.data.analysis.dminvocation.model.DataMinerParam; +import org.gcube.portlets.user.dataminerexecutor.client.rpc.DataMinerExecutorService; +import org.gcube.portlets.user.dataminerexecutor.server.invocation.InvocationManager; +import org.gcube.portlets.user.dataminerexecutor.server.storage.StorageUtil; +import org.gcube.portlets.user.dataminerexecutor.server.util.DataMinerWorkAreaManager; +import org.gcube.portlets.user.dataminerexecutor.server.util.TableReader; +import org.gcube.portlets.user.dataminerexecutor.shared.exception.ServiceException; +import org.gcube.portlets.user.dataminerexecutor.shared.session.UserInfo; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import com.allen_sauer.gwt.log.client.Log; +import com.google.gwt.user.server.rpc.RemoteServiceServlet; + +/** + * + * @author Giancarlo Panichi + * + * + */ +@SuppressWarnings("serial") +public class DataMinerExecutorServiceImpl extends RemoteServiceServlet implements DataMinerExecutorService { + + private static Logger logger = LoggerFactory.getLogger(DataMinerExecutorServiceImpl.class); + + /** + * {@inheritDoc} + */ + @Override + public void init() throws ServletException { + super.init(); + logger.info("DataMinerExecutor started!"); + + } + + /** + * + * {@inheritDoc} + * + */ + @Override + public UserInfo hello() throws ServiceException { + try { + ServiceCredentials serviceCredentials = SessionUtil.getServiceCredentials(this.getThreadLocalRequest()); + logger.debug("hello()"); + UserInfo userInfo = new UserInfo(serviceCredentials.getUserName(), serviceCredentials.getGroupId(), + serviceCredentials.getGroupName(), serviceCredentials.getScope(), serviceCredentials.getEmail(), + serviceCredentials.getFullName()); + logger.debug("UserInfo: " + userInfo); + return userInfo; + } catch (ServiceException e) { + logger.error(e.getLocalizedMessage(), e); + throw e; + } catch (Throwable e) { + logger.error("Hello(): " + e.getLocalizedMessage(), e); + throw new ServiceException(e.getLocalizedMessage(), e); + } + + } + + @Override + public List getOperatorsClassifications(boolean refresh) throws ServiceException { + + try { + HttpServletRequest httpRequest = this.getThreadLocalRequest(); + ServiceCredentials serviceCredentials = SessionUtil.getServiceCredentials(httpRequest); + SClient smClient = SessionUtil.getSClient(httpRequest, serviceCredentials); + List list = smClient.getOperatorsClassifications(refresh); + return list; + } catch (ServiceException e) { + logger.error(e.getLocalizedMessage(), e); + throw e; + } catch (Throwable e) { + logger.error("An error occurred getting the OperatorsClassifications list: " + e.getLocalizedMessage(), e); + throw new ServiceException(e.getLocalizedMessage(), e); + } + } + + @Override + public List getParameters(Operator operator) throws ServiceException { + try { + HttpServletRequest httpRequest = this.getThreadLocalRequest(); + ServiceCredentials serviceCredentials = SessionUtil.getServiceCredentials(httpRequest); + + SClient smClient = SessionUtil.getSClient(httpRequest, serviceCredentials); + + List list = smClient.getInputParameters(operator); + return list; + } catch (ServiceException e) { + logger.error(e.getLocalizedMessage()); + throw e; + } catch (Throwable e) { + logger.error("Error retrieving parameters: " + e.getLocalizedMessage(), e); + throw new ServiceException(e.getLocalizedMessage(), e); + } + } + + @Override + public Operator getInvocationModel(String invocationModelFileUrl) throws ServiceException { + try { + HttpServletRequest httpRequest = this.getThreadLocalRequest(); + ServiceCredentials serviceCredentials = SessionUtil.getServiceCredentials(httpRequest); + + InvocationManager invocationManager = new InvocationManager(); + DataMinerInvocation dmInvocation = invocationManager.readInvocation(invocationModelFileUrl); + if (dmInvocation == null || dmInvocation.getOperatorId() == null + || dmInvocation.getOperatorId().isEmpty()) { + logger.error("Invalid Invocation: " + dmInvocation); + throw new ServiceException("Invalid Invocation, operator id not found!"); + + } + + if (dmInvocation.getParameters() == null || dmInvocation.getParameters().getInput() == null + || dmInvocation.getParameters().getInput().getListParam() == null + || dmInvocation.getParameters().getInput().getListParam().isEmpty()) { + logger.error("Invalid Input Parameter: " + dmInvocation); + throw new ServiceException("Invalid Input Parameter!"); + } + + SClient smClient = SessionUtil.getSClient(httpRequest, serviceCredentials); + + Operator operator = smClient.getOperatorById(dmInvocation.getOperatorId(),true); + + if (operator == null) { + logger.error("Operator not found: " + dmInvocation); + throw new ServiceException("Invalid Invocation, operator not found!"); + + } + + List inputParameters = smClient.getInputParameters(operator); + List inputParametersFilled = new ArrayList(); + List invocationInputParams = dmInvocation.getParameters().getInput().getListParam(); + + if (inputParameters != null && !inputParameters.isEmpty()) { + for (Parameter p : inputParameters) { + boolean foundParam = false; + for (DataMinerParam dmP : invocationInputParams) { + if (p.getName().compareTo(dmP.getKey()) == 0) { + foundParam = true; + p.setValue(dmP.getValue()); + inputParametersFilled.add(p); + break; + } + } + if (!foundParam) { + logger.error("Invalid invocation, param " + p.getName() + " is not set in invocation model!"); + throw new ServiceException( + "Invalid invocation, param " + p.getName() + " is not set in invocation model!"); + } + + } + } else { + logger.error("Invalid operator, parameters not found: " + operator); + throw new ServiceException("Invalid operator, parameters not found!"); + } + + operator.setOperatorParameters(inputParametersFilled); + + return operator; + } catch (ServiceException e) { + logger.error(e.getLocalizedMessage()); + throw e; + } catch (Throwable e) { + logger.error("Error in getInvocationModel(): " + e.getLocalizedMessage(), e); + throw new ServiceException(e.getLocalizedMessage(), e); + } + } + + @Override + public ComputationId startComputation(Operator operator) throws ServiceException { + try { + HttpServletRequest httpRequest = this.getThreadLocalRequest(); + ServiceCredentials serviceCredentials = SessionUtil.getServiceCredentials(httpRequest); + + SClient smClient = SessionUtil.getSClient(httpRequest, serviceCredentials); + logger.debug("StartComputation(): [ operator=" + operator + "]"); + + ComputationId computationId = smClient.startComputation(operator); + return computationId; + } catch (ServiceException e) { + logger.error(e.getLocalizedMessage()); + throw e; + } catch (Throwable e) { + logger.error("Error in start computation: " + e.getLocalizedMessage(), e); + throw new ServiceException(e.getLocalizedMessage(), e); + } + } + + @Override + public ComputationId resubmit(ItemDescription itemDescription) throws ServiceException { + try { + StorageUtil storageUtil = new StorageUtil(); + HttpServletRequest httpRequest = this.getThreadLocalRequest(); + ServiceCredentials serviceCredentials = SessionUtil.getServiceCredentials(httpRequest); + Map properties = storageUtil.getProperties(serviceCredentials.getUserName(), + itemDescription.getId()); + logger.debug("Properties: " + properties); + + SClient smClient = SessionUtil.getSClient(httpRequest, serviceCredentials); + + ComputationId computationId = smClient.resubmitComputation(properties); + return computationId; + } catch (ServiceException e) { + logger.error(e.getLocalizedMessage(), e); + throw e; + } catch (Throwable e) { + logger.error("Error in resubmit computation: " + e.getLocalizedMessage(), e); + throw new ServiceException(e.getLocalizedMessage()); + } + } + + @Override + public ComputationStatus getComputationStatus(ComputationId computationId) throws ServiceException { + try { + HttpServletRequest httpRequest = this.getThreadLocalRequest(); + ServiceCredentials serviceCredentials = SessionUtil.getServiceCredentials(httpRequest); + SClient smClient = SessionUtil.getSClient(httpRequest, serviceCredentials); + ComputationStatus computationStatus = smClient.getComputationStatus(computationId); + return computationStatus; + + } catch (ServiceException e) { + logger.error(e.getLocalizedMessage(), e); + throw e; + } catch (Throwable e) { + logger.error("Error in getComputationStatus: " + e.getLocalizedMessage(), e); + throw new ServiceException(e.getLocalizedMessage(), e); + } + } + + @Override + public void deleteItem(ItemDescription itemDescription) throws ServiceException { + try { + HttpServletRequest httpRequest = this.getThreadLocalRequest(); + ServiceCredentials serviceCredentials = SessionUtil.getServiceCredentials(httpRequest); + logger.debug("DeleteItem(): " + itemDescription); + StorageUtil storageUtil = new StorageUtil(); + storageUtil.deleteItem(serviceCredentials.getUserName(), itemDescription.getId()); + return; + + } catch (ServiceException e) { + logger.error(e.getLocalizedMessage(), e); + throw e; + } catch (Throwable e) { + logger.error(e.getLocalizedMessage(), e); + throw new ServiceException(e.getLocalizedMessage(), e); + } + } + + @Override + public TableItemSimple retrieveTableInformation(ItemDescription item) throws ServiceException { + try { + HttpServletRequest httpRequest = this.getThreadLocalRequest(); + ServiceCredentials serviceCredentials = SessionUtil.getServiceCredentials(httpRequest); + logger.debug("retrieveTableInformation(): " + item); + TableReader tableReader = new TableReader(serviceCredentials, item); + TableItemSimple tableItemSimple = tableReader.getTableItemSimple(); + return tableItemSimple; + } catch (ServiceException e) { + logger.error(e.getLocalizedMessage(), e); + throw e; + } catch (Throwable e) { + logger.error(e.getLocalizedMessage(), e); + throw new ServiceException(e.getLocalizedMessage(), e); + } + } + + @Override + public DataMinerWorkArea getDataMinerWorkArea() throws ServiceException { + try { + HttpServletRequest httpRequest = this.getThreadLocalRequest(); + ServiceCredentials serviceCredentials = SessionUtil.getServiceCredentials(httpRequest); + logger.debug("getDataMinerWorkArea()"); + DataMinerWorkAreaManager dataMinerWorkAreaManager = new DataMinerWorkAreaManager(serviceCredentials); + return dataMinerWorkAreaManager.getDataMinerWorkArea(); + + } catch (ServiceException e) { + logger.error(e.getLocalizedMessage(), e); + throw e; + } catch (Throwable e) { + logger.error(e.getLocalizedMessage(), e); + throw new ServiceException(e.getLocalizedMessage(), e); + } + } + + @Override + public String getPublicLink(ItemDescription itemDescription) throws ServiceException { + try { + HttpServletRequest httpRequest = this.getThreadLocalRequest(); + ServiceCredentials serviceCredentials = SessionUtil.getServiceCredentials(httpRequest); + logger.debug("GetPublicLink(): " + itemDescription); + StorageUtil storageUtil = new StorageUtil(); + String link = storageUtil.getPublicLink(serviceCredentials.getUserName(), itemDescription.getId()); + + return link; + } catch (ServiceException e) { + logger.error(e.getLocalizedMessage(), e); + throw e; + } catch (Throwable e) { + logger.error(e.getLocalizedMessage(), e); + throw new ServiceException(e.getLocalizedMessage(), e); + } + } + + @Override + public String cancelComputation(ComputationId computationId) throws ServiceException { + try { + HttpServletRequest httpRequest = this.getThreadLocalRequest(); + ServiceCredentials serviceCredentials = SessionUtil.getServiceCredentials(httpRequest); + logger.debug("CancelComputation(): " + computationId); + SClient smClient = SessionUtil.getSClient(httpRequest, serviceCredentials); + String result = smClient.cancelComputation(computationId); + // SessionUtil.putSClient(session, smClient); + return result; + } catch (ServiceException e) { + logger.error(e.getLocalizedMessage(), e); + throw e; + } catch (Throwable e) { + logger.error(e.getLocalizedMessage(), e); + throw new ServiceException(e.getLocalizedMessage(), e); + } + } + + @Override + public OutputData getOutputDataByComputationId(ComputationId computationId) throws ServiceException { + try { + HttpServletRequest httpRequest = this.getThreadLocalRequest(); + ServiceCredentials serviceCredentials = SessionUtil.getServiceCredentials(httpRequest); + Log.debug("getOutputDataByComputationId: " + computationId); + SClient smClient = SessionUtil.getSClient(httpRequest, serviceCredentials); + OutputData outputData = smClient.getOutputDataByComputationId(computationId); + Log.debug("OutputData: " + outputData); + return outputData; + } catch (ServiceException e) { + logger.error(e.getLocalizedMessage(), e); + throw e; + } catch (Throwable e) { + logger.error("Error retrieving output by computation id: " + e.getLocalizedMessage(), e); + throw new ServiceException(e.getLocalizedMessage(), e); + } + + } + + @Override + public ComputationData getComputationData(ItemDescription itemDescription) throws ServiceException { + try { + HttpServletRequest httpRequest = this.getThreadLocalRequest(); + ServiceCredentials serviceCredentials = SessionUtil.getServiceCredentials(httpRequest); + logger.debug("OutputDataByComputationItemt(): " + itemDescription); + StorageUtil storageUtil = new StorageUtil(); + Map properties = storageUtil.getProperties(serviceCredentials.getUserName(), + itemDescription.getId()); + + logger.debug("Properties: " + properties); + SClient smClient = SessionUtil.getSClient(httpRequest, serviceCredentials); + + ComputationData computationData = smClient.getComputationDataByComputationProperties(properties); + return computationData; + + } catch (ServiceException e) { + logger.error(e.getLocalizedMessage(), e); + throw e; + } catch (Throwable e) { + logger.error("Error retrieving output by item: " + e.getLocalizedMessage(), e); + throw new ServiceException(e.getLocalizedMessage()); + } + } + + @Override + public String cancelComputation(ItemDescription itemDescription) throws ServiceException { + try { + HttpServletRequest httpRequest = this.getThreadLocalRequest(); + ServiceCredentials serviceCredentials = SessionUtil.getServiceCredentials(httpRequest); + logger.debug("CancelComputation(): " + itemDescription); + String compId = itemDescription.getName(); + if (compId == null) { + throw new ServiceException("Computation Id not found!"); + } else { + int lastIndexUnd = compId.lastIndexOf("_"); + if (lastIndexUnd == -1) { + throw new ServiceException("Invalid Computation Id: " + compId); + } else { + compId = compId.substring(lastIndexUnd + 1); + } + } + ComputationId computationId = new ComputationId(); + computationId.setId(compId); + SClient smClient = SessionUtil.getSClient(httpRequest, serviceCredentials); + String result = smClient.cancelComputation(computationId); + return result; + } catch (ServiceException e) { + logger.error(e.getLocalizedMessage(), e); + throw e; + } catch (Throwable e) { + logger.error(e.getLocalizedMessage(), e); + throw new ServiceException(e.getLocalizedMessage(), e); + } + } + + @Override + public ItemDescription getItemDescription(String itemId) throws ServiceException { + try { + HttpServletRequest httpRequest = this.getThreadLocalRequest(); + ServiceCredentials serviceCredentials = SessionUtil.getServiceCredentials(httpRequest); + logger.debug("getItemDescription(): [itemId=" + itemId + "]"); + StorageUtil storageUtil = new StorageUtil(); + ItemDescription itemDownloadInfo = storageUtil.getItemDescription(serviceCredentials.getUserName(), itemId); + logger.debug("ItemDescription info: " + itemDownloadInfo); + return itemDownloadInfo; + } catch (ServiceException e) { + logger.error(e.getLocalizedMessage(), e); + throw e; + } catch (Throwable e) { + logger.error("Error retrieving item description: " + e.getLocalizedMessage(), e); + throw new ServiceException("Error retrieving item description: " + e.getLocalizedMessage(), e); + } + } + +} diff --git a/src/main/java/org/gcube/portlets/user/dataminerexecutor/server/DescriptionRepository.java b/src/main/java/org/gcube/portlets/user/dataminerexecutor/server/DescriptionRepository.java new file mode 100644 index 0000000..3dd0787 --- /dev/null +++ b/src/main/java/org/gcube/portlets/user/dataminerexecutor/server/DescriptionRepository.java @@ -0,0 +1,127 @@ +package org.gcube.portlets.user.dataminerexecutor.server; + +import java.util.ArrayList; +import java.util.List; + +import org.gcube.data.analysis.dataminermanagercl.shared.process.Operator; +import org.gcube.data.analysis.dataminermanagercl.shared.process.OperatorCategory; + +/** + * + * @author Giancarlo Panichi + * + * + */ +public class DescriptionRepository { + + static List categories; + static List operators; + + private static void initCategories() { + if (categories==null) { + categories = new ArrayList(); + categories.add(new OperatorCategory( + "DISTRIBUTIONS", + "Distributions description", + "This category includes probability distributions, classifications, matching or distance measurements etc.", + true)); + categories.add(new OperatorCategory( + "MODELS", + "Models description", + "This category includes models to be trained, e.g. neural networks, species envelopes, support vector machines etc.. The result will be typically a binary file.", + false)); + categories.add(new OperatorCategory( + "EVALUATORS", + "A set of procedures for measuring the quality of a model", + "This category represent a set of procedures for measuring the quality of a model.", + false)); + } + } + + private static void initOperators() { + if (operators==null) { + operators = new ArrayList(); + operators.add(new Operator( + "AQUAMAPS_NATIVE_2050", + "Aquamaps Native for 2050 scenario", + "Aquamaps Native for 2050 scenario.", null, true)); + operators.add(new Operator( + "REMOTE_AQUAMAPS_SUITABLE_2050", + "Aquamaps Suitable for 2050 scenario", + "Aquamaps Suitable for 2050 scenario.", null, true)); + operators.add(new Operator( + "AQUAMAPS_SUITABLE_NEURALNETWORK", + "Aquamaps Suitable Distribution using a feed-Forward Neural Network", + "Aquamaps Suitable Distribution using a feed-Forward Neural Network.", null, true)); + operators.add(new Operator( + "REMOTE_AQUAMAPS_NATIVE", + "Aquamaps Native habitat generated by invoking Rainy Cloud", + "Aquamaps Native habitat generated by invoking Rainy Cloud.", null, true)); + operators.add(new Operator( + "AQUAMAPS_NEURAL_NETWORK_NS", + "Aquamaps Suitable Distribution using a Feed-Forward Neural Network provided by Neurosolutions", + "Aquamaps Suitable Distribution using a Feed-Forward Neural Network provided by Neurosolutions (http://www.neurosolutions.com).", null, true)); + operators.add(new Operator( + "REMOTE_AQUAMAPS_NATIVE_2050", + "Aquamaps Native 2050 habitat generated by invoking Rainy Cloud", + "Aquamaps Native 2050 habitat generated by invoking Rainy Cloud.", null, true)); + operators.add(new Operator( + "REMOTE_AQUAMAPS_SUITABLE", + "Aquamaps Suitable habitat generated by invoking Rainy Cloud", + "Aquamaps Suitable habitat generated by invoking Rainy Cloud.", null, true)); + operators.add(new Operator( + "AQUAMAPS_SUITABLE", + "Aquamaps Suitable habitat production", + "Aquamaps Suitable habitat production.", null, true)); + operators.add(new Operator( + "AQUAMAPS_NATIVE_NEURALNETWORK", + "Aquamaps Native Distribution using a Feed-Forward Neural Network", + "Aquamaps Native Distribution using a Feed-Forward Neural Network.", null, true)); + operators.add(new Operator( + "AQUAMAPS_NATIVE", + "Aquamaps Native habitat production", + "Aquamaps Native habitat production.", null, true)); + operators.add(new Operator( + "AQUAMAPS_SUITABLE_2050", + "Aquamaps Suitable for 2050 scenario", + "Aquamaps Suitable for 2050 scenario.", null, true)); + operators.add(new Operator( + "AQUAMAPSNN", + "Feed-Forward Neural Network for usage in Aquamaps generations", + "Feed-Forward Neural Network for usage in Aquamaps generations.", null, true)); + operators.add(new Operator( + "AQUAMAPSNNNS", + "Feed-Forward Neural Network by Neurosolutions for usage in Aquamaps generations", + "Feed-Forward Neural Network by Neurosolutions (http://www.neurosolutions.com) for usage in Aquamaps generations.", null, true)); + operators.add(new Operator( + "HSPEN", + "Hspen model by Aquamaps", + "Hspen model by Aquamaps.", null, true)); + operators.add(new Operator( + "QUALITY_ANALYSIS", + "", + ".", null)); + operators.add(new Operator( + "DISCREPANCY_ANALYSIS", + "", + ".", null)); + } + } + + public static OperatorCategory getOperatorCategory(OperatorCategory operatorCategory) { + initCategories(); + for (OperatorCategory cat : categories) + if (operatorCategory.getId().contentEquals(cat.getId())) + return cat; + return null; + } + + public static Operator getOperator(Operator operator) { + initOperators(); + for (Operator op : operators) + if (operator.getId().contentEquals(op.getId())) + return op; + return null; + } +} + diff --git a/src/main/java/org/gcube/portlets/user/dataminerexecutor/server/DownloadServlet.java b/src/main/java/org/gcube/portlets/user/dataminerexecutor/server/DownloadServlet.java new file mode 100644 index 0000000..a2673c7 --- /dev/null +++ b/src/main/java/org/gcube/portlets/user/dataminerexecutor/server/DownloadServlet.java @@ -0,0 +1,163 @@ +package org.gcube.portlets.user.dataminerexecutor.server; + +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStream; +import java.nio.ByteBuffer; +import java.nio.channels.Channels; +import java.nio.channels.ReadableByteChannel; +import java.nio.channels.WritableByteChannel; + +import javax.servlet.ServletException; +import javax.servlet.http.HttpServlet; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import javax.servlet.http.HttpSession; + +import org.gcube.common.storagehub.model.items.FolderItem; +import org.gcube.data.analysis.dataminermanagercl.server.util.ServiceCredentials; +import org.gcube.portlets.user.dataminerexecutor.server.storage.ItemDownload; +import org.gcube.portlets.user.dataminerexecutor.server.storage.StorageUtil; +import org.gcube.portlets.user.dataminerexecutor.shared.Constants; +import org.gcube.portlets.user.dataminerexecutor.shared.exception.ServiceException; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +/** + * Download Servlet + * + * @author Giancarlo Panichi + * + * + */ +public class DownloadServlet extends HttpServlet { + + private static final long serialVersionUID = 5389118370656932343L; + + private static Logger logger = LoggerFactory.getLogger(DownloadServlet.class); + + public DownloadServlet() { + super(); + } + + /** + * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse + * response) + */ + protected void doGet(HttpServletRequest request, HttpServletResponse response) + throws ServletException, IOException { + createResponse(request, response); + } + + /** + * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse + * response) + */ + protected void doPost(HttpServletRequest request, HttpServletResponse response) + throws ServletException, IOException { + createResponse(request, response); + } + + private void createResponse(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { + + try { + logger.debug("DownloadServlet()"); + + HttpSession session = req.getSession(); + + if (session == null) { + logger.error("Error getting the download session, no session valid found: " + session); + resp.sendError(HttpServletResponse.SC_INTERNAL_SERVER_ERROR, + "ERROR-Error getting the user session, no session found" + session); + return; + } + logger.debug("DownloadServlet() session id: " + session.getId()); + String scopeGroupId = req.getHeader(Constants.CURR_GROUP_ID); + if (scopeGroupId == null || scopeGroupId.isEmpty()) { + scopeGroupId = req.getParameter(Constants.CURR_GROUP_ID); + if (scopeGroupId == null || scopeGroupId.isEmpty()) { + logger.error( + "CURR_GROUP_ID is null, it is a mandatory parameter in custom servlet: " + scopeGroupId); + throw new ServletException( + "CURR_GROUP_ID is null, it is a mandatory parameter in custom servlet: " + scopeGroupId); + } + } + + String itemId = req.getParameter("itemId"); + logger.info("DownloadServlet(): [scopeGroupId=" + scopeGroupId + ",ItemId=" + itemId + "]"); + ServiceCredentials serviceCredentials = SessionUtil.getServiceCredentials(req, scopeGroupId); + StorageUtil filesStorage = new StorageUtil(); + ItemDownload itemDownload = filesStorage.getItemDownload(serviceCredentials.getUserName(), itemId); + logger.debug("ItemDownload: " + itemDownload); + if (itemDownload == null) { + logger.error("This type of item does not support download operation"); + throw new ServletException("This type of item does not support download operation"); + + } else { + if (itemDownload.getInputStream() == null) { + logger.error("This type of item does not support download operation"); + throw new ServletException("This type of item does not support download operation"); + } else { + String fileName; + if (itemDownload.getItemDescription() == null) { + fileName = "filename"; + resp.setHeader("Content-Disposition", "attachment;filename=\"" + fileName + "\""); + resp.setHeader("Content-Type", "application/force-download"); + } else { + if (itemDownload.getItemDescription().getName() == null + || itemDownload.getItemDescription().getName().isEmpty()) { + if (itemDownload.getItemDescription().getType() != null && itemDownload.getItemDescription() + .getType().compareTo(FolderItem.class.getSimpleName()) == 0) { + fileName = "folder.zip"; + resp.setHeader("Content-Disposition", "attachment;filename=\"" + fileName + "\""); + resp.setHeader("Content-Type", "application/zip"); + } else { + fileName = "filename"; + resp.setHeader("Content-Disposition", "attachment;filename=\"" + fileName + "\""); + resp.setHeader("Content-Type", "application/force-download"); + } + } else { + if (itemDownload.getItemDescription().getType() != null && itemDownload.getItemDescription() + .getType().compareTo(FolderItem.class.getSimpleName()) == 0) { + fileName = itemDownload.getItemDescription().getName() + ".zip"; + resp.setHeader("Content-Disposition", "attachment;filename=\"" + fileName + "\""); + resp.setHeader("Content-Type", "application/zip"); + + } else { + fileName = itemDownload.getItemDescription().getName(); + resp.setHeader("Content-Disposition", "attachment;filename=\"" + fileName + "\""); + resp.setHeader("Content-Type", "application/force-download"); + } + } + } + logger.debug("Content-Disposition: "+resp.getHeader("Content-Disposition")); + logger.debug("Content-Type: "+resp.getHeader("Content-Type")); + logger.debug("DownloadServlet filename: " + fileName); + stream(itemDownload.getInputStream(), resp.getOutputStream()); + } + } + } catch (ServiceException e) { + logger.error("DownloadServlet():" + e.getLocalizedMessage(), e); + throw new ServletException(e.getLocalizedMessage(), e); + } catch (Throwable e) { + logger.error("DownloadServlet(): " + e.getLocalizedMessage(), e); + throw new ServletException("Download item error: " + e.getLocalizedMessage(), e); + } + } + + private long stream(InputStream input, OutputStream output) throws IOException { + try (ReadableByteChannel inputChannel = Channels.newChannel(input); + WritableByteChannel outputChannel = Channels.newChannel(output);) { + ByteBuffer buffer = ByteBuffer.allocateDirect(10240); + long size = 0; + + while (inputChannel.read(buffer) != -1) { + buffer.flip(); + size += outputChannel.write(buffer); + buffer.clear(); + } + + return size; + } + } +} \ No newline at end of file diff --git a/src/main/java/org/gcube/portlets/user/dataminerexecutor/server/SessionUtil.java b/src/main/java/org/gcube/portlets/user/dataminerexecutor/server/SessionUtil.java new file mode 100644 index 0000000..d77fcea --- /dev/null +++ b/src/main/java/org/gcube/portlets/user/dataminerexecutor/server/SessionUtil.java @@ -0,0 +1,245 @@ +/** + * + */ +package org.gcube.portlets.user.dataminerexecutor.server; + +import java.util.HashMap; + +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpSession; + +import org.apache.log4j.Logger; +import org.gcube.common.authorization.library.provider.SecurityTokenProvider; +import org.gcube.common.portal.PortalContext; +import org.gcube.common.scope.api.ScopeProvider; +import org.gcube.data.analysis.dataminermanagercl.server.dmservice.SClient; +import org.gcube.data.analysis.dataminermanagercl.server.dmservice.SClient4WPSBuilder; +import org.gcube.data.analysis.dataminermanagercl.server.dmservice.SClientBuilder; +import org.gcube.data.analysis.dataminermanagercl.server.dmservice.SClientDirector; +import org.gcube.data.analysis.dataminermanagercl.server.util.ServiceCredentials; +import org.gcube.portlets.user.dataminerexecutor.shared.Constants; +import org.gcube.portlets.user.dataminerexecutor.shared.exception.ServiceException; +import org.gcube.vomanagement.usermanagement.impl.LiferayGroupManager; +import org.gcube.vomanagement.usermanagement.model.GCubeGroup; +import org.gcube.vomanagement.usermanagement.model.GCubeUser; + +/** + * + * @author Giancarlo Panichi + * + * + */ +public class SessionUtil { + + private static final Logger logger = Logger.getLogger(SessionUtil.class); + + /** + * + * @param httpServletRequest + * http servlet request + * @return service credentials + * @throws ServiceException + * service exception + */ + public static ServiceCredentials getServiceCredentials(HttpServletRequest httpServletRequest) + throws ServiceException { + return getServiceCredentials(httpServletRequest, null); + } + + /** + * + * @param httpServletRequest + * http servlet request + * @param scopeGroupId + * scope group id + * @return service credentials + * @throws ServiceException + * service exception + */ + public static ServiceCredentials getServiceCredentials(HttpServletRequest httpServletRequest, String scopeGroupId) + throws ServiceException { + + ServiceCredentials sCredentials = null; + String userName = null; + String scope = null; + String token = null; + String groupId = null; + String groupName = null; + + if (Constants.DEBUG_MODE) { + logger.debug("No credential found in session, use test user!"); + /* + * InfoLocale infoLocale = getInfoLocale(httpServletRequest, null); + * Locale locale = new Locale(infoLocale.getLanguage()); + * + * ResourceBundle messages = ResourceBundle.getBundle( + * StatAlgoImporterServiceMessagesConstants.TDGWTServiceMessages, + * locale); + */ + userName = Constants.DEFAULT_USER; + scope = Constants.DEFAULT_SCOPE; + token = Constants.DEFAULT_TOKEN; + + logger.debug("Set SecurityToken: " + token); + SecurityTokenProvider.instance.set(token); + logger.debug("Set ScopeProvider: " + scope); + ScopeProvider.instance.set(scope); + + sCredentials = new ServiceCredentials(userName, scope, token); + + } else { + logger.debug("Retrieving credential in session!"); + PortalContext pContext = PortalContext.getConfiguration(); + boolean hasScopeGroupId = false; + + if (scopeGroupId != null && !scopeGroupId.isEmpty()) { + hasScopeGroupId = true; + + } else { + hasScopeGroupId = false; + } + + if (hasScopeGroupId) { + scope = pContext.getCurrentScope(scopeGroupId); + } else { + scope = pContext.getCurrentScope(httpServletRequest); + } + + if (scope == null || scope.isEmpty()) { + String error = "Error retrieving scope: " + scope; + logger.error(error); + throw new ServiceException(error); + } + + GCubeUser gCubeUser = pContext.getCurrentUser(httpServletRequest); + + if (gCubeUser == null) { + String error = "Error retrieving gCubeUser in scope " + scope + ": " + gCubeUser; + logger.error(error); + throw new ServiceException(error); + } + + userName = gCubeUser.getUsername(); + + if (userName == null || userName.isEmpty()) { + String error = "Error retrieving username in scope " + scope + ": " + userName; + logger.error(error); + throw new ServiceException(error); + } + + token = pContext.getCurrentUserToken(scope, userName); + + if (token == null || token.isEmpty()) { + String error = "Error retrieving token for " + userName + " in " + scope + ": " + token; + logger.error(error); + throw new ServiceException(error); + } + + String name = gCubeUser.getFirstName(); + String lastName = gCubeUser.getLastName(); + String fullName = gCubeUser.getFullname(); + + String userAvatarURL = gCubeUser.getUserAvatarURL(); + + String email = gCubeUser.getEmail(); + + if (hasScopeGroupId) { + logger.debug("Set SecurityToken: " + token); + SecurityTokenProvider.instance.set(token); + logger.debug("Set ScopeProvider: " + scope); + ScopeProvider.instance.set(scope); + + groupId = scopeGroupId; + + long gId; + + try { + gId = Long.parseLong(scopeGroupId); + } catch (Throwable e) { + String error = "Error retrieving groupId: " + scopeGroupId; + logger.error(error, e); + throw new ServiceException(error); + } + + GCubeGroup group; + try { + group = new LiferayGroupManager().getGroup(gId); + } catch (Throwable e) { + String error = "Error retrieving group: " + groupName; + logger.error(error); + throw new ServiceException(error); + } + + groupName = group.getGroupName(); + + } else { + + groupId = String.valueOf(pContext.getCurrentGroupId(httpServletRequest)); + + groupName = pContext.getCurrentGroupName(httpServletRequest); + + } + + sCredentials = new ServiceCredentials(userName, fullName, name, lastName, email, scope, groupId, groupName, + userAvatarURL, token); + } + + logger.debug("ServiceCredentials: " + sCredentials); + + return sCredentials; + } + + public static SClient getSClient(HttpServletRequest httpRequest, ServiceCredentials serviceCredentials) + throws Exception { + + if (serviceCredentials == null) { + logger.error("ServiceCredentials is null!"); + throw new ServiceException("Service Credentials is null!"); + } + HttpSession session = httpRequest.getSession(); + + SClient sClient; + + Object obj = session.getAttribute(Constants.SClientMap); + if (obj == null) { + logger.debug("Create new SClientMap"); + HashMap sClientMap = new HashMap<>(); + logger.debug("Create new SClient"); + SClientBuilder sBuilder = new SClient4WPSBuilder(serviceCredentials); + SClientDirector director = new SClientDirector(); + director.setSClientBuilder(sBuilder); + director.constructSClient(); + sClient = director.getSClient(); + + sClientMap.put(serviceCredentials.getScope(), sClient); + session.setAttribute(Constants.SClientMap, sClientMap); + } else { + if (obj instanceof HashMap) { + @SuppressWarnings("unchecked") + HashMap sClientMap = (HashMap) obj; + if (sClientMap.containsKey(serviceCredentials.getScope())) { + logger.debug("Use SClient in session"); + sClient = sClientMap.get(serviceCredentials.getScope()); + } else { + logger.debug("Create new SClient"); + SClientBuilder sBuilder = new SClient4WPSBuilder(serviceCredentials); + + SClientDirector director = new SClientDirector(); + director.setSClientBuilder(sBuilder); + director.constructSClient(); + sClient = director.getSClient(); + sClientMap.put(serviceCredentials.getScope(), sClient); + session.setAttribute(Constants.SClientMap, sClientMap); + } + + } else { + logger.error("Attention no SClientMap in Session!"); + throw new ServiceException("Sign Out, portlet is changed, a new session is required!"); + } + } + + return sClient; + + } + +} diff --git a/src/main/java/org/gcube/portlets/user/dataminerexecutor/server/invocation/InvocationManager.java b/src/main/java/org/gcube/portlets/user/dataminerexecutor/server/invocation/InvocationManager.java new file mode 100644 index 0000000..369c9c6 --- /dev/null +++ b/src/main/java/org/gcube/portlets/user/dataminerexecutor/server/invocation/InvocationManager.java @@ -0,0 +1,93 @@ +package org.gcube.portlets.user.dataminerexecutor.server.invocation; + +import java.io.IOException; +import java.io.InputStream; +import java.net.URL; +import java.net.URLConnection; +import java.nio.file.Files; +import java.nio.file.Path; + +import javax.xml.bind.JAXBException; + +import org.gcube.data.analysis.dataminermanagercl.shared.exception.ServiceException; +import org.gcube.data.analysis.dminvocation.DataMinerInvocationManager; +import org.gcube.data.analysis.dminvocation.model.DataMinerInvocation; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.xml.sax.SAXException; + +public class InvocationManager { + + private static Logger logger = LoggerFactory.getLogger(InvocationManager.class); + private static final String INVOCATION_NAME = "DMInvocation"; + private static final String INVOCATION_JSON_EXTENTION = ".json"; + private DataMinerInvocationManager manager; + + public InvocationManager() throws ServiceException { + try { + manager = DataMinerInvocationManager.getInstance(); + } catch (JAXBException | IOException | SAXException e) { + logger.error("Error in DataMiner Invocation Manager: " + e.getLocalizedMessage(), e); + throw new ServiceException("Error in DataMiner Invocation Manager: " + e.getLocalizedMessage()); + } + + } + + public DataMinerInvocation readInvocation(String invocationFileUrl) throws ServiceException { + try { + + logger.info("Read DataMiner Invocation Model"); + Path destination = Files.createTempFile(INVOCATION_NAME, INVOCATION_JSON_EXTENTION); + logger.info("Destination: [destination=" + destination + "]"); + + logger.info("Read invocation: [fileUrl=" + invocationFileUrl+"]"); + URL smpFile = new URL(invocationFileUrl); + URLConnection uc = (URLConnection) smpFile.openConnection(); + + DataMinerInvocation dmInvocation=null; + + try (InputStream is = uc.getInputStream();) { + dmInvocation = manager.unmarshalingJSON(uc.getInputStream(), true); + } + + logger.debug("DMInvocation: "+dmInvocation); + return dmInvocation; + + } catch (Throwable e) { + logger.error("Error reading DataMiner invocation file: " + e.getLocalizedMessage(), e); + throw new ServiceException("Error reading DataMiner invocation file: "+e.getLocalizedMessage()); + } + } +// +// public void readInvocation(String invocationFileUrl) throws ServiceException { +// +// try { +// Path file=retrieveFile(invocationFileUrl); +// +// try (InputStream in = Files.newInputStream(uc.getrn_demo)) { +// while ((n = in.read()) != -1) { +// System.out.print((char) n); +// } +// } catch (IOException e) { +// System.err.println(e); +// } +// +// +// +// +// List lines = createInfoTxtData(); +// Files.write(tempFile, lines, Charset.defaultCharset(), StandardOpenOption.WRITE); +// logger.debug(tempFile.toString()); +// return tempFile; +// +// } catch (IOException e) { +// logger.error(e.getLocalizedMessage()); +// e.printStackTrace(); +// throw new ServiceException(e.getLocalizedMessage(), e); +// } +// +// +// +// +// } +} diff --git a/src/main/java/org/gcube/portlets/user/dataminerexecutor/server/storage/ItemDownload.java b/src/main/java/org/gcube/portlets/user/dataminerexecutor/server/storage/ItemDownload.java new file mode 100644 index 0000000..b9ef94d --- /dev/null +++ b/src/main/java/org/gcube/portlets/user/dataminerexecutor/server/storage/ItemDownload.java @@ -0,0 +1,44 @@ +package org.gcube.portlets.user.dataminerexecutor.server.storage; + +import java.io.InputStream; + +import org.gcube.data.analysis.dataminermanagercl.shared.workspace.ItemDescription; + +/** + * + * @author Giancarlo Panichi + * + * + */ +public class ItemDownload { + private ItemDescription itemDescription; + private InputStream inputStream; + + public ItemDownload(ItemDescription itemDescription, InputStream inputStream) { + super(); + this.itemDescription = itemDescription; + this.inputStream = inputStream; + } + + public ItemDescription getItemDescription() { + return itemDescription; + } + + public void setItemDescription(ItemDescription itemDescription) { + this.itemDescription = itemDescription; + } + + public InputStream getInputStream() { + return inputStream; + } + + public void setInputStream(InputStream inputStream) { + this.inputStream = inputStream; + } + + @Override + public String toString() { + return "ItemDownload [itemDescription=" + itemDescription + ", inputStream=" + inputStream + "]"; + } + +} diff --git a/src/main/java/org/gcube/portlets/user/dataminerexecutor/server/storage/StorageUtil.java b/src/main/java/org/gcube/portlets/user/dataminerexecutor/server/storage/StorageUtil.java new file mode 100644 index 0000000..190e5b1 --- /dev/null +++ b/src/main/java/org/gcube/portlets/user/dataminerexecutor/server/storage/StorageUtil.java @@ -0,0 +1,332 @@ +package org.gcube.portlets.user.dataminerexecutor.server.storage; + +import java.io.InputStream; +import java.net.URL; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import org.gcube.common.storagehub.client.StreamDescriptor; +import org.gcube.common.storagehub.client.dsl.FileContainer; +import org.gcube.common.storagehub.client.dsl.FolderContainer; +import org.gcube.common.storagehub.client.dsl.ItemContainer; +import org.gcube.common.storagehub.client.dsl.ListResolver; +import org.gcube.common.storagehub.client.dsl.OpenResolver; +import org.gcube.common.storagehub.client.dsl.StorageHubClient; +import org.gcube.common.storagehub.model.Metadata; +import org.gcube.common.storagehub.model.items.AbstractFileItem; +import org.gcube.common.storagehub.model.items.FolderItem; +import org.gcube.common.storagehub.model.items.GCubeItem; +import org.gcube.common.storagehub.model.items.Item; +import org.gcube.common.storagehub.model.items.TrashItem; +import org.gcube.data.analysis.dataminermanagercl.shared.workspace.ItemDescription; +import org.gcube.portlets.user.dataminerexecutor.shared.exception.ServiceException; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +/** + * + * @author Giancarlo Panichi + * + * + */ +public class StorageUtil { + + private static Logger logger = LoggerFactory.getLogger(StorageUtil.class); + + /** + * + * @param user + * user + * @param itemId + * item id + * @return map properties + * @throws ServiceException + * service exception + */ + public Map getProperties(String user, String itemId) throws ServiceException { + try { + StorageHubClient shc = new StorageHubClient(); + Item item = shc.open(itemId).asItem().get(); + Metadata metadata = item.getMetadata(); + Map itemMap = new HashMap(); + Map metadataMap = metadata.getMap(); + for (String key : metadataMap.keySet()) { + String s = String.valueOf(metadataMap.get(key)); + itemMap.put(key, s); + } + return itemMap; + + } catch (Throwable e) { + logger.error("Error retrieving properties: " + e.getLocalizedMessage(), e); + throw new ServiceException(e.getLocalizedMessage(), e); + } + + } + + /** + * + * @param user + * user + * @param itemId + * item id + * @return input stream + * @throws ServiceException + * service exception + */ + public InputStream getFileOnWorkspace(String user, String itemId) throws ServiceException { + try { + logger.debug("getInputStreamForItemOnWorkspace: [user=" + user + ", itemId=" + itemId + "]"); + StorageHubClient shc = new StorageHubClient(); + FileContainer fileContainer = shc.open(itemId).asFile(); + StreamDescriptor streamDescriptor = fileContainer.download(); + return streamDescriptor.getStream(); + + } catch (Throwable e) { + logger.error("Error retrieving InputStream for File: " + e.getLocalizedMessage(), e); + throw new ServiceException(e.getLocalizedMessage(), e); + } + } + + public ItemDownload getItemDownload(String user, String itemId) throws ServiceException { + try { + logger.debug("getItemDownload: [user=" + user + ", itemId=" + itemId + "]"); + StorageHubClient shc = new StorageHubClient(); + OpenResolver openResolver = shc.open(itemId); + ItemContainer itemContainer = openResolver.asItem(); + Item item = itemContainer.get(); + + StreamDescriptor streamDescriptor = null; + if (item instanceof AbstractFileItem) { + FileContainer fileContainer = openResolver.asFile(); + streamDescriptor = fileContainer.download(); + } else { + if (item instanceof FolderItem) { + FolderContainer folderContainer = openResolver.asFolder(); + streamDescriptor = folderContainer.download(); + } else { + } + } + + if (streamDescriptor == null) { + logger.error("This type of item does not support download: " + itemId); + return null; + } else { + ItemDescription itemDescription = new ItemDescription(item.getId(), item.getName(), item.getOwner(), + item.getPath(), getItemType(item)); + ItemDownload itemDownload = new ItemDownload(itemDescription, streamDescriptor.getStream()); + return itemDownload; + } + } catch (Throwable e) { + logger.error("Error retrieving InputStream for item: " + e.getLocalizedMessage(), e); + throw new ServiceException(e.getLocalizedMessage(), e); + } + } + + /** + * + * @param user + * User + * @param itemId + * Item id + * @return Item description + * @throws ServiceException + * Error + */ + public ItemDescription getItemDescription(String user, String itemId) throws ServiceException { + try { + logger.info("Retrieve file info on workspace: [user=" + user + ", itemId=" + itemId + "]"); + StorageHubClient shc = new StorageHubClient(); + OpenResolver openResolver = shc.open(itemId); + ItemContainer itemContainer = openResolver.asItem(); + Item item = itemContainer.get(); + ItemDescription itemDescription = new ItemDescription(item.getId(), item.getName(), item.getOwner(), + item.getPath(), getItemType(item)); + return itemDescription; + } catch (Throwable e) { + logger.error("Retrieve file info on workspace: " + e.getLocalizedMessage(), e); + throw new ServiceException(e.getLocalizedMessage()); + } + } + + /** + * + * @param user + * user + * @param itemId + * item id + * @return public link + * @throws ServiceException + * service exception + */ + public String getPublicLink(String user, String itemId) throws ServiceException { + try { + logger.debug("getPublicLink: [user=" + user + ", itemId=" + itemId + "]"); + StorageHubClient shc = new StorageHubClient(); + URL url = shc.open(itemId).asFile().getPublicLink(); + return url.toString(); + + } catch (Throwable e) { + logger.error("Error retrieving public link: " + e.getLocalizedMessage(), e); + throw new ServiceException(e.getLocalizedMessage(), e); + } + } + + /** + * + * @param user + * user + * @param folderId + * folder id + * @return input stream + * @throws ServiceException + * service exception public InputStream zipFolder(String user, + * String folderId) throws ServiceException { try { + * logger.debug("zipFolder: [user=" + user + ", folderId=" + + * folderId + "]"); StorageHubClient shc = new + * StorageHubClient(); OpenResolver openResolver = + * shc.open(folderId); + * + * ItemContainer itemContainer = openResolver.asItem(); + * Item item = itemContainer.get(); if (item instanceof + * FolderItem) { StreamDescriptor streamDescriptor = + * openResolver.asFolder().download(); InputStream is = + * streamDescriptor.getStream(); return is; } else { throw new + * ServiceException("Is not a valid folder!"); } + * + * } catch (Throwable e) { logger.error("Error in zip Folder: " + * + e.getLocalizedMessage(), e); throw new + * ServiceException(e.getLocalizedMessage(), e); } + * + * } + */ + + /** + * + * @param user + * user + * @param itemName + * item name + * @return workspace item + * @throws ServiceException + * service exception + */ + public ItemDescription getItemInRootFolderOnWorkspace(String user, String itemName) throws ServiceException { + try { + logger.debug("GetItemInRootFolder: [user=" + user + ", itemName=" + itemName + "]"); + StorageHubClient shc = new StorageHubClient(); + ListResolver listResolver = shc.getWSRoot().findByName(itemName); + List items = listResolver.getItems(); + + if (items == null || items.isEmpty()) { + logger.debug("No item found"); + return null; + } else { + Item item = items.get(0); + logger.debug("Item: " + item); + if (item != null) { + logger.debug("Item Id=" + item.getId()); + ItemDescription itemDescription = new ItemDescription(item.getId(), item.getName(), item.getOwner(), + item.getPath(), getItemType(item)); + return itemDescription; + } else { + return null; + } + } + + } catch (Throwable e) { + logger.error("Error in get Item in RootFolder: " + e.getLocalizedMessage(), e); + throw new ServiceException(e.getLocalizedMessage()); + } + } + + /** + * + * @param user + * user + * @param folderId + * folder id + * @param itemName + * item name + * @return workspace item + * @throws ServiceException + * service exception + */ + public ItemDescription getItemInFolderOnWorkspace(String user, String folderId, String itemName) + throws ServiceException { + try { + logger.debug("GetItemInFolder: [user=" + user + ", folderId=" + folderId + ", itemName=" + itemName + "]"); + StorageHubClient shc = new StorageHubClient(); + ListResolver listResolver = shc.open(folderId).asFolder().findByName(itemName); + List items = listResolver.getItems(); + + if (items == null || items.isEmpty()) { + logger.debug("No item found"); + return null; + } else { + Item item = items.get(0); + logger.debug("Item: " + item); + if (item != null) { + logger.debug("Item Id=" + item.getId()); + ItemDescription itemDescription = new ItemDescription(item.getId(), item.getName(), item.getOwner(), + item.getPath(), getItemType(item)); + return itemDescription; + } else { + return null; + } + } + + } catch (Throwable e) { + logger.error("Error in get Item in Folder: " + e.getLocalizedMessage(), e); + throw new ServiceException(e.getLocalizedMessage()); + } + } + + /** + * + * @param user + * user + * @param itemId + * item id + * @throws ServiceException + * service exception + */ + public void deleteItem(String user, String itemId) throws ServiceException { + try { + logger.debug("Delete Item: [User=" + user + ", ItemId=" + itemId + "]"); + StorageHubClient shc = new StorageHubClient(); + OpenResolver openResolver = shc.open(itemId); + + ItemContainer itemContainer = openResolver.asItem(); + itemContainer.delete(); + + return; + } catch (Throwable e) { + logger.error("Error deleting Item: " + e.getLocalizedMessage(), e); + throw new ServiceException(e.getLocalizedMessage()); + + } + + } + + private String getItemType(Item item) { + if (item instanceof AbstractFileItem) { + return AbstractFileItem.class.getSimpleName(); + } else { + if (item instanceof FolderItem) { + return FolderItem.class.getSimpleName(); + } else { + if (item instanceof GCubeItem) { + return GCubeItem.class.getSimpleName(); + } else { + if (item instanceof TrashItem) { + return TrashItem.class.getSimpleName(); + } else { + return null; + } + } + } + } + } + +} diff --git a/src/main/java/org/gcube/portlets/user/dataminerexecutor/server/util/DataMinerWorkAreaManager.java b/src/main/java/org/gcube/portlets/user/dataminerexecutor/server/util/DataMinerWorkAreaManager.java new file mode 100644 index 0000000..5d9e7bd --- /dev/null +++ b/src/main/java/org/gcube/portlets/user/dataminerexecutor/server/util/DataMinerWorkAreaManager.java @@ -0,0 +1,93 @@ +package org.gcube.portlets.user.dataminerexecutor.server.util; + +import org.gcube.data.analysis.dataminermanagercl.server.util.ServiceCredentials; +import org.gcube.data.analysis.dataminermanagercl.shared.workspace.Computations; +import org.gcube.data.analysis.dataminermanagercl.shared.workspace.DataMinerWorkArea; +import org.gcube.data.analysis.dataminermanagercl.shared.workspace.InputDataSets; +import org.gcube.data.analysis.dataminermanagercl.shared.workspace.ItemDescription; +import org.gcube.data.analysis.dataminermanagercl.shared.workspace.OutputDataSets; +import org.gcube.portlets.user.dataminerexecutor.server.storage.StorageUtil; +import org.gcube.portlets.user.dataminerexecutor.shared.exception.ServiceException; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +/** + * + * @author Giancarlo Panichi + * + * + */ +public class DataMinerWorkAreaManager { + private static final String DATA_MINER_FOLDER = "DataMiner"; + private static final String IMPORTED_DATA_FOLDER = "Input Data Sets"; + private static final String COMPUTED_DATA_FOLDER = "Output Data Sets"; + private static final String COMPUTATIONS_FOLDER = "Computations"; + + public static final Logger logger = LoggerFactory.getLogger(DataMinerWorkAreaManager.class); + + private ServiceCredentials serviceCredentials; + + public DataMinerWorkAreaManager(ServiceCredentials serviceCredentials) { + this.serviceCredentials = serviceCredentials; + } + + public DataMinerWorkArea getDataMinerWorkArea() throws ServiceException { + DataMinerWorkArea dataMinerWorkArea = null; + StorageUtil storageUtil = new StorageUtil(); + try { + + ItemDescription dataMinerWorkAreaFolder = storageUtil.getItemInRootFolderOnWorkspace(serviceCredentials.getUserName(), + DATA_MINER_FOLDER); + if (dataMinerWorkAreaFolder == null) { + dataMinerWorkArea = new DataMinerWorkArea(null); + return dataMinerWorkArea; + } else { + dataMinerWorkArea = new DataMinerWorkArea(dataMinerWorkAreaFolder); + } + + } catch (Throwable e) { + logger.debug("DataMiner Folder is set to null"); + e.printStackTrace(); + dataMinerWorkArea = new DataMinerWorkArea(null); + return dataMinerWorkArea; + } + + InputDataSets inputDataSets = null; + try { + ItemDescription importedDataFolder = storageUtil.getItemInFolderOnWorkspace(serviceCredentials.getUserName(), + dataMinerWorkArea.getDataMinerWorkAreaFolder().getId(), IMPORTED_DATA_FOLDER); + inputDataSets = new InputDataSets(importedDataFolder); + + } catch (Throwable e) { + logger.debug("ImportedData Folder is set to null"); + } + dataMinerWorkArea.setInputDataSets(inputDataSets); + + OutputDataSets outputDataSets = null; + try { + ItemDescription computedDataFolder = storageUtil.getItemInFolderOnWorkspace(serviceCredentials.getUserName(), + dataMinerWorkArea.getDataMinerWorkAreaFolder().getId(), COMPUTED_DATA_FOLDER); + outputDataSets = new OutputDataSets(computedDataFolder); + + } catch (Throwable e) { + logger.debug("ComputedData Folder is set to null"); + } + dataMinerWorkArea.setOutputDataSets(outputDataSets); + + Computations computations = null; + try { + ItemDescription computationsDataFolder = storageUtil.getItemInFolderOnWorkspace(serviceCredentials.getUserName(), + dataMinerWorkArea.getDataMinerWorkAreaFolder().getId(), COMPUTATIONS_FOLDER); + computations = new Computations(computationsDataFolder); + + } catch (Throwable e) { + logger.debug("Computations Folder is set to null"); + } + dataMinerWorkArea.setComputations(computations); + + logger.debug("DataMinerWorkArea: "+dataMinerWorkArea); + return dataMinerWorkArea; + + } + +} diff --git a/src/main/java/org/gcube/portlets/user/dataminerexecutor/server/util/TableReader.java b/src/main/java/org/gcube/portlets/user/dataminerexecutor/server/util/TableReader.java new file mode 100644 index 0000000..2466481 --- /dev/null +++ b/src/main/java/org/gcube/portlets/user/dataminerexecutor/server/util/TableReader.java @@ -0,0 +1,75 @@ +package org.gcube.portlets.user.dataminerexecutor.server.util; + +import java.io.InputStream; +import java.io.InputStreamReader; +import java.io.Reader; +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; + +import org.gcube.data.analysis.dataminermanagercl.server.util.ServiceCredentials; +import org.gcube.data.analysis.dataminermanagercl.shared.data.ColumnItem; +import org.gcube.data.analysis.dataminermanagercl.shared.data.TableItemSimple; +import org.gcube.data.analysis.dataminermanagercl.shared.workspace.ItemDescription; +import org.gcube.portlets.user.dataminerexecutor.server.storage.StorageUtil; +import org.gcube.portlets.user.dataminerexecutor.shared.exception.ServiceException; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import net.sf.csv4j.CSVReader; + +/** + * + * @author Giancarlo Panichi + * + * + */ +public class TableReader { + private static Logger logger = LoggerFactory.getLogger(TableReader.class); + + private ServiceCredentials serviceCredentials; + private ItemDescription item; + + public TableReader(ServiceCredentials serviceCredentials, ItemDescription item) { + this.serviceCredentials = serviceCredentials; + this.item= item; + } + + public TableItemSimple getTableItemSimple() throws ServiceException { + StorageUtil storageUtil=new StorageUtil(); + InputStream is = storageUtil.getFileOnWorkspace( + serviceCredentials.getUserName(), item.getId()); + Reader fileReader = new InputStreamReader(is); + CSVReader csvReader = new CSVReader(fileReader); + List firstLine = getFirstLine(csvReader, false); + ArrayList columns = new ArrayList(firstLine); + + String publicLink=storageUtil.getPublicLink(serviceCredentials.getUserName(), item.getId()); + + TableItemSimple tableItemSimple=new TableItemSimple(publicLink,item.getName(), item.getType()); + ArrayList columnItemList=new ArrayList(); + for(int i=0; i getFirstLine(CSVReader csvReader, boolean includeComment) + throws ServiceException { + try { + logger.trace("getFirstLine includeComment: " + includeComment); + + List header = csvReader.readLine(includeComment); + return header == null ? Collections. emptyList() : header; + + } catch (Throwable e) { + logger.error("Error reading csv file: " + e.getLocalizedMessage()); + e.printStackTrace(); + throw new ServiceException(e.getLocalizedMessage()); + } + } + +} diff --git a/src/main/java/org/gcube/portlets/user/dataminerexecutor/shared/Constants.java b/src/main/java/org/gcube/portlets/user/dataminerexecutor/shared/Constants.java new file mode 100644 index 0000000..f17c89a --- /dev/null +++ b/src/main/java/org/gcube/portlets/user/dataminerexecutor/shared/Constants.java @@ -0,0 +1,47 @@ +package org.gcube.portlets.user.dataminerexecutor.shared; + +/** + * + * @author Giancarlo Panichi + * + * + */ +public class Constants { + public static final boolean DEBUG_MODE = false; + public static final boolean TEST_ENABLE = false; + + public static final String APPLICATION_ID = "org.gcube.portlets.user.dataminerexecutor.portlet.DataMinerExecutor"; + public static final String DATA_MINER_EXECUTOR_ID = "DataMinerExecutorId"; + public static final String DATA_MINER_EXECUTOR_LANG_COOKIE = "DataMinerLangCookie"; + public static final String DATA_MINER_EXECUTOR_LANG = "DataMinerLang"; + public static final String DATA_MINER_EXECUTOR_OPERATOR_ID = "OperatorId"; + public static final String DATA_MINER_EXECUTOR_INVOCATION_MODEL = "dim"; + + public static final String DEFAULT_USER = "giancarlo.panichi"; + public final static String DEFAULT_SCOPE = "/gcube/devNext/NextNext"; + public final static String DEFAULT_TOKEN = ""; + + public static final String DEFAULT_ROLE = "OrganizationMember"; + + public static final String SClientMap = "DataMinerClientMap"; + public static final String DATA_MINER_SERVICE_NAME = "DataMiner"; + public static final String DATAMINER_SERVICE_CATEGORY = "DataAnalysis"; + + public static final String TD_DATASOURCE_FACTORY_ID = "DataMinerManager"; + + public static final int TIME_UPDATE_COMPUTATION_STATUS_PANEL = 5 * 1000;// 7*1000; + + // WPS Data Miner + public static final String WPSServiceURL = "http://dataminer-d-d4s.d4science.org:80/wps/"; + public static final String WPSWebProcessingService = "WebProcessingService"; + public static final String WPSCancelComputationServlet = "CancelComputationServlet"; + public static final String WPSToken = ""; + public static final String WPSUser = "giancarlo.panichi"; + public static final String WPSLanguage = "en-US"; + + // Session + public static final String CURR_GROUP_ID = "CURR_GROUP_ID"; + + // Download + public static final String DOWNLOAD_SERVLET = "DownloadServlet"; +} diff --git a/src/main/java/org/gcube/portlets/user/dataminerexecutor/shared/StringUtil.java b/src/main/java/org/gcube/portlets/user/dataminerexecutor/shared/StringUtil.java new file mode 100644 index 0000000..69ef8a3 --- /dev/null +++ b/src/main/java/org/gcube/portlets/user/dataminerexecutor/shared/StringUtil.java @@ -0,0 +1,36 @@ +/** + * + */ +package org.gcube.portlets.user.dataminerexecutor.shared; + +/** + * + * @author Giancarlo Panichi + * + * + */ +public class StringUtil { + + public static String getCapitalWords(String string) { + String ris = ""; + + boolean precUnderscore = true; + for (int i=0; i + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/main/webapp/DataMinerExecutor.css b/src/main/webapp/DataMinerExecutor.css new file mode 100644 index 0000000..50644de --- /dev/null +++ b/src/main/webapp/DataMinerExecutor.css @@ -0,0 +1,485 @@ +/* FIX FOR Portal Theme */ +/* OpenLayer Form fix */ +#wkt-geometry-text-area { + width: 400px !important; +} + +#combo-geometry-type { + width: 406px !important; +} + +.aui body { + color: #000; + font-weight: normal !important; +} + +.aui input[type="text"], .aui select, .aui textarea, .aui .uneditable-input + { + margin-bottom: 1px !important; + padding: 0px !important; +} + +.aui input[type="radio"], .aui input[type="checkbox"] { + margin: 0px !important; + width: 10px !important; +} + +.aui input, .aui textarea, .aui .uneditable-input { + width: 100% !important; +} + +.aui p { + margin: 0px !important; +} + +.aui img { + vertical-align: baseline !important; +} + +.aui fieldset { + padding: 9px !important; + /* margin: 0; */ + border: 1px solid rgb(181, 184, 200) !important; +} + +.aui legend { + margin-bottom: 0px !important; + width: auto !important; + border-bottom: none !important; +} + +.aui ul, .aui ol { + margin: 0px !important; +} + +/* Data Miner */ +.smLayoutContainer { + /* Blue + box-shadow: inset 0 0 50px rgba(0, 0, 0, 0.11), 0 0 0 + rgba(255, 255, 255, 1), 0 0 5px rgba(0, 28, 121, 1), 0px 0 40px + rgba(0, 28, 121, 0.15); + -moz-box-shadow: inset 0 0 50px rgba(0, 0, 0, 0.11), 0 0 0 + rgba(255, 255, 255, 1), 0 0 5px rgba(0, 28, 121, 1), 0px 0 40px + rgba(0, 28, 121, 0.15); + -webkit-box-shadow: inset 0 0 50px rgba(0, 0, 0, 0.11), 0 0 0 + rgba(255, 255, 255, 1), 0 0 5px rgba(0, 28, 121, 1), 0px 0 40px + rgba(0, 28, 121, 0.15); + -o-box-shadow: inset 0 0 50px rgba(0, 0, 0, 0.11), 0 0 0 + rgba(255, 255, 255, 1), 0 0 5px rgba(0, 28, 121, 1), 71px 0 27px + rgba(0, 28, 121, 0.15);*/ + box-shadow: inset 0 0 50px rgba(0, 0, 0, 0.11), 0 0 0 + rgba(255, 255, 255, 1), 0 0 5px rgba(196, 196, 196, 1), 0px 0 27px + rgba(0, 0, 0, 0.15); + -moz-box-shadow: inset 0 0 50px rgba(0, 0, 0, 0.11), 0 0 0 + rgba(255, 255, 255, 1), 0 0 5px rgba(196, 196, 196, 1), 0px 0 27px + rgba(0, 0, 0, 0.15); + -webkit-box-shadow: inset 0 0 50px rgba(0, 0, 0, 0.11), 0 0 0 + rgba(255, 255, 255, 1), 0 0 5px rgba(196, 196, 196, 1), 0px 0 27px + rgba(0, 0, 0, 0.15); + -o-box-shadow: inset 0 0 50px rgba(0, 0, 0, 0.11), 0 0 0 + rgba(255, 255, 255, 1), 0 0 5px rgba(196, 196, 196, 1), 71px 0 27px + rgba(0, 0, 0, 0.15); + border-radius: 0; + -moz-border-radius: 0; + -webkit-border-radius: 0; + -o-border-radius: 0; +} + +.smMenu { + /*width: 720px !important;*/ /*height: 570px !important;*/ + /*overflow: auto; + margin: auto; + margin-bottom: 20px;*/ + +} + +.layoutContainerArea { + margin-right: 20px; +} + +.smMenuItem { + box-shadow: inset 0 0 99px rgba(0, 0, 0, 0.11), 0 0 0 + rgba(255, 255, 255, 1), 0 0 5px rgba(196, 196, 196, 1), 0px 0 27px + rgba(0, 0, 0, 0.15); + -moz-box-shadow: inset 0 0 99px rgba(0, 0, 0, 0.11), 0 0 0 + rgba(255, 255, 255, 1), 0 0 5px rgba(196, 196, 196, 1), 0px 0 27px + rgba(0, 0, 0, 0.15); + -webkit-box-shadow: inset 0 0 99px rgba(0, 0, 0, 0.11), 0 0 0 + rgba(255, 255, 255, 1), 0 0 5px rgba(196, 196, 196, 1), 0px 0 27px + rgba(0, 0, 0, 0.15); + -o-box-shadow: inset 0 0 99px rgba(0, 0, 0, 0.11), 0 0 0 + rgba(255, 255, 255, 1), 0 0 5px rgba(196, 196, 196, 1), 71px 0 27px + rgba(0, 0, 0, 0.15); + border-radius: 0; + -moz-border-radius: 0; + -webkit-border-radius: 0; + -o-border-radius: 0; + /*padding: 10px;*/ +/*margin-bottom: 30px; + margin-left: 200px; + width: 480px;*/ +} + +.smMenuItem:HOVER { + cursor: pointer; + opacity: 0.7; +} + +.smMenuItem img { + border: 1px solid #C0C0C0; + display: inline; +} + +.smMenuItemText b { + display: block; + color: #225f97; + font-size: 20px; +} + +.smMenuItemText { + font: 12px/1.5 "Lucida Grande", "Lucida Sans Unicode", Arial, Verdana, + sans-serif; + display: block; + color: #606060; + /*margin-right: 10px;*/ +} + +/* OPERATORS PANEL */ +.opePanel { + +} + +.opePanel:hover { + cursor: pointer; +} + +.categoryItem { + margin-top: 10px; + margin-left: 5px; + font-size: 15px; + font-variant: small-caps; + font-weight: bolder; + border-bottom: 2px solid #505050; + margin-bottom: 5px; + background-image: url(images/triangle-right.png); + background-repeat: no-repeat; + background-position: right; +} + +.categoryItem-Collapsed { + background-image: url(images/triangle-right.png); +} + +.categoryItem-Expanded { + background-image: url(images/triangle-down.png); +} + +.categoryItem:hover { + color: #3087d6; + cursor: pointer; +} + +.filterResultText { + margin-top: 10px; + margin-left: 5px; + font-size: 15px; + font-variant: small-caps; + font-weight: bolder; + border-bottom: 2px solid #505050; + margin-bottom: 5px; +} + +.categoryItem .counter, .filterResultText .counter { + font-size: 10px; + color: #555555; +} + +.operatorPanel { + box-shadow: inset 0 0 28px rgba(0, 0, 0, 0.11), 0 0 0 + rgba(255, 255, 255, 1), 0 0 1px rgba(196, 196, 196, 1), inset 0 0 1px + rgba(77, 77, 77, 1); + -moz-box-shadow: inset 0 0 28px rgba(0, 0, 0, 0.11), 0 0 0 + rgba(255, 255, 255, 1), 0 0 1px rgba(196, 196, 196, 1), inset 0 0 1px + rgba(77, 77, 77, 1); + -webkit-box-shadow: inset 0 0 28px rgba(0, 0, 0, 0.11), 0 0 0 + rgba(255, 255, 255, 1), 0 0 1px rgba(196, 196, 196, 1), inset 0 0 1px + rgba(77, 77, 77, 1); + -o-box-shadow: inset 0 0 28px rgba(0, 0, 0, 0.11), 0 0 0 + rgba(255, 255, 255, 1), 0 0 1px rgba(196, 196, 196, 1), inset 0 0 1px + rgba(77, 77, 77, 1); + border-radius: 5px; + -moz-border-radius: 5px; + -webkit-border-radius: 5px; + -o-border-radius: 5px; + margin: 0px 5px 5px 10px; /* top right bottom left*/ + padding: 5px; + overflow: hidden; + height: 78px; +} + +.operatorPanel-selected { + background-color: #e0e7f7; +} + +.operatorPanel-title { + font-size: 13px; + font-weight: bolder; + color: #225f97; +} + +.operatorPanel-title-selected { + color: #770000; +} + +.operatorPanel-briefDescription { + font-size: 10px; + color: #505050; +} + +.operatorPanel img { + float: right; +} + +.operatorPanel img:hover { + cursor: pointer; + opacity: 0.6; +} + +.tableImporter, .uploadMonitor { + box-shadow: inset 0 0 28px rgba(0, 0, 0, 0.11), 0 0 0 + rgba(255, 255, 255, 1), 0 0 1px rgba(196, 196, 196, 1), inset 0 0 1px + rgba(77, 77, 77, 1); + -moz-box-shadow: inset 0 0 28px rgba(0, 0, 0, 0.11), 0 0 0 + rgba(255, 255, 255, 1), 0 0 1px rgba(196, 196, 196, 1), inset 0 0 1px + rgba(77, 77, 77, 1); + -webkit-box-shadow: inset 0 0 28px rgba(0, 0, 0, 0.11), 0 0 0 + rgba(255, 255, 255, 1), 0 0 1px rgba(196, 196, 196, 1), inset 0 0 1px + rgba(77, 77, 77, 1); + -o-box-shadow: inset 0 0 28px rgba(0, 0, 0, 0.11), 0 0 0 + rgba(255, 255, 255, 1), 0 0 1px rgba(196, 196, 196, 1), inset 0 0 1px + rgba(77, 77, 77, 1); + border-radius: 5px; + -moz-border-radius: 5px; + -webkit-border-radius: 5px; + -o-border-radius: 5px; + padding: 5px; + border: 1px solid black; + margin-left: 5px; + margin-right: 5px; +} + +/* WORKFLOW PANEL */ +.workflow { + box-shadow: inset 0 0 28px rgba(0, 0, 0, 0.11), 0 0 0 + rgba(255, 255, 255, 1), 0 0 1px rgba(196, 196, 196, 1), inset 0 0 1px + rgba(77, 77, 77, 1); + -moz-box-shadow: inset 0 0 28px rgba(0, 0, 0, 0.11), 0 0 0 + rgba(255, 255, 255, 1), 0 0 1px rgba(196, 196, 196, 1), inset 0 0 1px + rgba(77, 77, 77, 1); + -webkit-box-shadow: inset 0 0 28px rgba(0, 0, 0, 0.11), 0 0 0 + rgba(255, 255, 255, 1), 0 0 1px rgba(196, 196, 196, 1), inset 0 0 1px + rgba(77, 77, 77, 1); + -o-box-shadow: inset 0 0 28px rgba(0, 0, 0, 0.11), 0 0 0 + rgba(255, 255, 255, 1), 0 0 1px rgba(196, 196, 196, 1), inset 0 0 1px + rgba(77, 77, 77, 1); + border-radius: 5px; + -moz-border-radius: 5px; + -webkit-border-radius: 5px; + -o-border-radius: 5px; + /*padding: 5px;*/ + border: 1px solid black; + /*margin-left: 5px; + margin-right: 5px;*/ +} + +.workflow-icon { + border: 1px solid black; + float: left; + position: relative; + left: 10px; + top: -20px; +} + +.workflow-title { + text-align: center; + font-size: 16px; + font-weight: bold; + color: #225f97; +} + +.workflow-description { + font-size: 13px; + color: #505050; +} + +.workflow-computation-title { + padding-left: 5px; + padding-right: 5px; + padding-top: 8px; +} + +.workflow-fieldDescription { + font-size: 12px; + color: #505050; +} + +.workflow-fieldValue { + border: 1px solid lightgray; + max-width: 490px; + padding: 2px; +} + +.workflow-templatesList { + font-size: 9px; + color: #505050; + margin-top: 4px; +} + +.workflow-parameters-description { + font-size: 10px; + color: #505050; + margin-top: 4px; +} + +.workflow-parameters-tableDescription { + font-size: 12px; + /* border: 1px solid gray;*/ + color: white; + margin-right: 5px; + padding-right: 4px; + padding-left: 4px; + background-color: gray; +} + +.workflow-parameters-preload { + display: block; + background: url('ajax-loader-big.gif') no-repeat; + width: 400px; + height: 180px; +} + +/* TOOLTIP */ +.x-tip-mc { + padding: 6px; +} + +.categoryItemTooltip { + height: 80px; +} + +.categoryItemTooltip img { + border: 1px solid black; + float: left; + margin-right: 5px; +} + +/* TABLE EXPLORER */ +.tableSelector-details { + margin-top: 20px; + margin-left: 5px; + margin-right: 5px; +} + +.tableSelector-details img { + display: block; + margin-left: auto; + margin-right: auto; + margin-bottom: 10px; +} + +#computationGrid .x-grid3-cell { + vertical-align: middle; +} + +.menuImgLogo:HOVER { + /* cursor: pointer;*/ + +} + +.menuItemImage { + opacity: 0.5; +} + +.menuItemImage:HOVER { + cursor: pointer; + opacity: 1; +} + +.menuItemImage-selected { + opacity: 1; +} + +.menuItemImage-selected:HOVER { + cursor: auto; +} + +/* +* Computation Execution +*/ +.computationExcecutionPanel { + font-size: 12px; + color: black; +} + +.computationStatusPanel { + border: 1px solid black; + padding: 10px; +} + +.computationStatusTitle { + +} + +.computationStatusDate { + +} + +/** +* Field +*/ +.dataminer-textarea textarea { + height: 160px !important; + width: 360px !important; +} + +/** +* Computation Output +*/ +.computation-output-outputType { + background-color: #EEEEEE; + border: 1px solid #BDBDBD; + /*font-weight: bold;*/ + padding: 5px; + text-align: center; + margin-top: 20px; + margin-bottom: 10px; +} + +.computation-output-groupTitle { + font-style: italic; + font-weight: bold; + margin-top: 5px; + margin-bottom: 5px; +} + +.computation-output-separator { + border-top: 2px solid #AAAAAA; + margin-top: 8px; + margin-bootm: 8px; + + /* height: 30px; + margin: 8px auto auto; + width: 400px; + */ +} + +.computation-output-fileName { + margin-top: 2px; + margin-bottom: 2px; +} + +#netcdfSampleTextArea { + height: 318px; + width: 616px !important; + resize: none; +} \ No newline at end of file diff --git a/src/main/webapp/DataMinerExecutor.html b/src/main/webapp/DataMinerExecutor.html new file mode 100644 index 0000000..a40cde2 --- /dev/null +++ b/src/main/webapp/DataMinerExecutor.html @@ -0,0 +1,38 @@ + + + + + + + + + + + +Data Miner Manager + + + + + + + + + + + + + + + + diff --git a/src/main/webapp/WEB-INF/jsp/DataMinerExecutor_view.jsp b/src/main/webapp/WEB-INF/jsp/DataMinerExecutor_view.jsp new file mode 100644 index 0000000..a915b3f --- /dev/null +++ b/src/main/webapp/WEB-INF/jsp/DataMinerExecutor_view.jsp @@ -0,0 +1,29 @@ +<%@page contentType="text/html"%> +<%@page pageEncoding="UTF-8"%> + + + + + + + + + + + + + + + +
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..50f9730 --- /dev/null +++ b/src/main/webapp/WEB-INF/liferay-display.xml @@ -0,0 +1,9 @@ + + + + + + + + \ No newline at end of file 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..ab5f089 --- /dev/null +++ b/src/main/webapp/WEB-INF/liferay-plugin-package.properties @@ -0,0 +1,9 @@ +name=DataMinerExecutor +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..335c4ef --- /dev/null +++ b/src/main/webapp/WEB-INF/liferay-portlet.xml @@ -0,0 +1,13 @@ + + + + + + DataMinerExecutor + false + false + false + DataMinerExecutorCSS + + \ No newline at end of file diff --git a/src/main/webapp/WEB-INF/portlet.xml b/src/main/webapp/WEB-INF/portlet.xml new file mode 100644 index 0000000..7f73261 --- /dev/null +++ b/src/main/webapp/WEB-INF/portlet.xml @@ -0,0 +1,27 @@ + + + + DataMinerExecutor + DataMinerExecutor + DataMinerExecutor + org.gcube.portlets.user.dataminerexecutor.portlet.DataMinerExecutor + 0 + + text/html + VIEW + + + DataMinerExecutor + DataMinerExecutor + + + + portletSetupShowBorders + false + + + + diff --git a/src/main/webapp/WEB-INF/web.xml b/src/main/webapp/WEB-INF/web.xml new file mode 100644 index 0000000..c0b3a90 --- /dev/null +++ b/src/main/webapp/WEB-INF/web.xml @@ -0,0 +1,78 @@ + + + + + DataMinerExecutorServlet + org.gcube.portlets.user.dataminerexecutor.server.DataMinerExecutorServiceImpl + + + jUnitHostImpl + com.google.gwt.junit.server.JUnitHostImpl + + + + + DownloadServlet + org.gcube.portlets.user.dataminerexecutor.server.DownloadServlet + + + + workspaceExplorer + org.gcube.portlets.widgets.wsexplorer.server.WorkspaceExplorerServiceImpl + + + workspaceUploaderService + org.gcube.portlets.widgets.workspaceuploader.server.WorkspaceUploaderServiceImpl + + + workspaceUploadServletStream + org.gcube.portlets.widgets.workspaceuploader.server.WorkspaceUploadServletStream + + + NetCDFBasicWidgetService + org.gcube.portlets.widgets.netcdfbasicwidgets.server.NetCDFBasicWidgetServiceImpl + + + + + DataMinerExecutorServlet + /dataminerexecutor/dataminerex + + + jUnitHostImpl + /dataminerexecutor/junithost/* + + + + + DownloadServlet + /dataminerexecutor/DownloadServlet/* + + + + + workspaceExplorer + /dataminerexecutor/WorkspaceExplorerService + + + workspaceUploaderService + /dataminerexecutor/workspaceUploaderService + + + workspaceUploadServletStream + /dataminerexecutor/workspaceUploadServletStream + + + NetCDFBasicWidgetService + /dataminerexecutor/netcdfservice + + + + + + DataMinerExecutor.html + + \ No newline at end of file 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..47dc215 --- /dev/null +++ b/src/main/webapp/gxt/css/gxt-all.css @@ -0,0 +1,7451 @@ +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:'';} +.x-contrast-test { + background: url(../images/default/s.gif); + visibility: hidden; + position: relative; + left: -1000px; + top: -1000px; +} +.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; + outline: 0 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; + -moz-outline: 0 none; + outline: 0 none; +} + +.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: #CEDFF5; + filter: alpha(opacity = 10); + opacity: .4; + 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-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; + cursor: move; +}.x-tab-panel { + overflow: hidden; + -moz-outline: none; + outline: 0 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; +} +.ext-strict .ext-ie7 .x-panel-body { + position: relative !important; +} + +.x-form-field { + margin: 0; +} + +.foo { + padding: 1px; +} + +.foo { + margin: 4px; +} + +.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; +} + +.ext-strict .ext-safari .x-form-field-wrap .x-form-trigger { + height: 23px; +} + +.ext-strict .ext-safari .x-small-editor .x-form-field-wrap .x-form-trigger { + height: 19px; +} + +.ext-strict .ext-ie8 .x-small-editor .x-form-field-wrap .x-form-trigger { + height: 20px !important; +} + +.ext-strict .ext-gecko .x-small-editor .x-form-field-wrap .x-form-trigger { + height: 21px !important; +} + +.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; +} + +.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-strict .ext-ie8 .x-small-editor .x-form-text { + height: 17px !important; +} + +.ext-strict .ext-webkit .x-small-editor .x-form-text { + height: 18px !important; + padding: 0px 3px; +} + +.ext-strict .ext-gecko .x-small-editor .x-form-text { + height: 18px !important; +} + +.ext-strict .ext-gecko .x-edit-grid .x-small-editor .x-form-text { + height:17px !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; + outline: 0 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-spinner-field .x-form-twin-triggers .x-form-spinner-up, .x-spinner-field .x-form-twin-triggers .x-form-spinner-down { + height: 10px; + position: absolute; +} + +.ext-strict .ext-safari .x-form-field-wrap .x-form-spinner-up { + height: 10px; +} + +.ext-strict .ext-safari .x-form-field-wrap .x-form-spinner-down { + height: 12px; +} + +.x-spinner-field .x-form-twin-triggers .x-form-spinner-up { + top:0px; +} + +.x-spinner-field .x-form-twin-triggers .x-form-spinner-down { + top:11px; +} + +.x-spinner-field .x-form-twin-triggers { + width: 17px; +} + +.x-spinner-field .x-form-spinner-down { + background-position:0 -12px; +} + +.x-trigger-wrap-focus .x-form-spinner-up { + background-position:-85px 0; +} + +.x-trigger-wrap-focus .x-form-spinner-down { + background-position:-85px -12px; +} + +.x-form-field-wrap .x-form-spinner-overup{ + background-position:-17px 0; +} +.x-form-field-wrap .x-form-spinner-clickup{ + background-position:-34px 0; +} + +.x-trigger-wrap-focus .x-form-spinner-overup{ + background-position:-102px 0; +} + +.x-trigger-wrap-focus .x-form-spinner-clickup{ + background-position:-119px 0; +} + +.x-form-field-wrap .x-form-spinner-overdown{ + background-position:-51px -12px; +} +.x-form-field-wrap .x-form-spinner-clickdown{ + background-position:-68px -12px; +} +.x-trigger-wrap-focus .x-form-spinner-overdown{ + background-position:-136px -12px; +} +.x-trigger-wrap-focus .x-form-spinner-clickdown{ + background-position:-153px -12px; +}.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 { + -moz-outline: none; + -moz-user-focus: normal; + outline: 0 none; +} + +.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, .x-grid3 .x-grid3-summary-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; + outline: 0 none; +} + +.x-grid3-summary-row { + -moz-user-select: none; + -khtml-user-select: none; + -webkit-user-select: ignore; + outline: 0 none; +} + +.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; + outline: 0 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; + outline: none; +} + +.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: 1px solid #EEEEEE; + background-color: #f7f7f7; + -moz-user-select: none; + -khtml-user-select: none; + -webkit-user-select: ignore; + cursor: default; +} + +.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-grid3-hd-row .x-filtered-column { + font-style: italic !important; + font-weight: bold !important; +} + +.ext-strict .ext-gecko .x-inline-editor .x-small-editor .x-form-text { + height: 18px !important; +} +.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; + outline: 0 none; + 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; + outline: 0 none; +} + +.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-highlightrow { + border: 1px dotted #545352; +} + +.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; + outline: 0 none; +} + +.x-treegrid .x-treegrid-column .x-grid3-cell-inner { + padding: 0px !important; +} + +.x-tree3 { + cursor: default; + -moz-outline: none; + -moz-user-focus: none; + outline: 0 none; +} + +.ext-strict .ext-gecko .x-tree3, .ext-strict .ext-webkit .x-tree3 { + padding-bottom: 1px; +} + +.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; + -moz-outline:0 none; + outline:0 none; +} +.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; +} +.ext-border-box .x-tip .x-tip-header,.ext-border-box .ext-ie .x-tip .x-tip-tc { + line-height:1px; +} +.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; + outline: 0 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 !important; +} + +.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; + position: absolute; +} +.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; + outline: 0 none; +} +.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; + -moz-outline: none; + outline: 0 none; +} +.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; + -moz-outline: none; + outline: 0 none; +} +.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; + outline: 0 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; + outline: 0 none; + -moz-user-focus: normal; + background-color: white; + cursor: default; +} + +.my-list-item { + cursor: pointer; + -moz-outline: none; + outline: 0 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; + outline: 0 none; + background-color: white; + cursor: default; + border: 1px solid #98C0F4; + overflow: auto; + padding: 0px; + zoom: 1; +} + +.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-highlightrow { + border: 1px dotted #545352 !important; +} + +.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; + outline: 0 none; +} + +.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; + outline: 0 none; +} + +.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; + outline: 0 none; + 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; + outline: 0 none; +} + +.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; + outline: 0 none; +} + +.my-tbl-item table { + -moz-outline: none; + -moz-user-focus: normal; + table-layout: fixed; + outline: 0 none; +} + +.my-tbl-data .my-tbl-item-cell { + -moz-outline: none; + -moz-user-focus: normal; + outline: 0 none; +} + +.my-tbl-item td { + -moz-user-select: none; + -moz-outline: none; + -moz-user-focus: normal; + outline: 0 none; +} + +.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; + outline: 0 none; +} + +.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; + outline: 0 none; +} + +.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; + outline: 0 none; +} + +.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; + outline: 0 none; +} + +.my-treetbl-col-overflow { + overflow: hidden; + -moz-outline: none; + -moz-user-focus: normal; + outline: 0 none; +} + +.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; + outline: 0 none; +} + +.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; + outline: 0 none; +} + +.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: gray; +} +.x-item-disabled * { + color: gray !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-spinner-field .x-form-spinner-up { + background-image: url('../images/default/form/spinner.gif'); +} +.x-spinner-field .x-form-spinner-down { + background-image: url('../images/default/form/spinner.gif'); +}.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-highlightrow { + border: 1px dotted #545352; +} + +.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-group-selected { + background-color: #b8cfee !important; +} + +.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-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-inserted-row { + background-color: #f7f9cc +}.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; +} +.ext-ie .x-window-plain .x-window-mc { + background-color: #c9d5e4; +} +.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..bc31336 --- /dev/null +++ b/src/main/webapp/gxt/css/gxt-gray.css @@ -0,0 +1,493 @@ +.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 .xtb-sep { + background-image: url(../images/gray/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; +} +.ext-ie .x-window-plain .x-window-mc { + background-color: #e3e3e3; +} + +.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-spinner-field .x-form-spinner-up { + background-image: url('../images/gray/form/spinner.gif'); +} +.x-spinner-field .x-form-spinner-down { + background-image: url('../images/gray/form/spinner.gif'); +}.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; +} + +.x-menubar { + border-color: #D0D0D0; + background-color: #F0F0F0; + background-image: url(../images/gray/toolbar/bg.gif); +} + +.x-menubar-item-active { + background-color: #D9E8FB; +} + +.x-menubar-item-active { + background-color: #D9E8FB; +}.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/flash/swfobject.js b/src/main/webapp/gxt/flash/swfobject.js new file mode 100644 index 0000000..4b704c5 --- /dev/null +++ b/src/main/webapp/gxt/flash/swfobject.js @@ -0,0 +1,5 @@ +/* SWFObject v2.1 + Copyright (c) 2007-2008 Geoff Stearns, Michael Williams, and Bobby van der Sluis + This software is released under the MIT License +*/ +var swfobject=function(){var b="undefined",Q="object",n="Shockwave Flash",p="ShockwaveFlash.ShockwaveFlash",P="application/x-shockwave-flash",m="SWFObjectExprInst",j=window,K=document,T=navigator,o=[],N=[],i=[],d=[],J,Z=null,M=null,l=null,e=false,A=false;var h=function(){var v=typeof K.getElementById!=b&&typeof K.getElementsByTagName!=b&&typeof K.createElement!=b,AC=[0,0,0],x=null;if(typeof T.plugins!=b&&typeof T.plugins[n]==Q){x=T.plugins[n].description;if(x&&!(typeof T.mimeTypes!=b&&T.mimeTypes[P]&&!T.mimeTypes[P].enabledPlugin)){x=x.replace(/^.*\s+(\S+\s+\S+$)/,"$1");AC[0]=parseInt(x.replace(/^(.*)\..*$/,"$1"),10);AC[1]=parseInt(x.replace(/^.*\.(.*)\s.*$/,"$1"),10);AC[2]=/r/.test(x)?parseInt(x.replace(/^.*r(.*)$/,"$1"),10):0}}else{if(typeof j.ActiveXObject!=b){var y=null,AB=false;try{y=new ActiveXObject(p+".7")}catch(t){try{y=new ActiveXObject(p+".6");AC=[6,0,21];y.AllowScriptAccess="always"}catch(t){if(AC[0]==6){AB=true}}if(!AB){try{y=new ActiveXObject(p)}catch(t){}}}if(!AB&&y){try{x=y.GetVariable("$version");if(x){x=x.split(" ")[1].split(",");AC=[parseInt(x[0],10),parseInt(x[1],10),parseInt(x[2],10)]}}catch(t){}}}}var AD=T.userAgent.toLowerCase(),r=T.platform.toLowerCase(),AA=/webkit/.test(AD)?parseFloat(AD.replace(/^.*webkit\/(\d+(\.\d+)?).*$/,"$1")):false,q=false,z=r?/win/.test(r):/win/.test(AD),w=r?/mac/.test(r):/mac/.test(AD);/*@cc_on q=true;@if(@_win32)z=true;@elif(@_mac)w=true;@end@*/return{w3cdom:v,pv:AC,webkit:AA,ie:q,win:z,mac:w}}();var L=function(){if(!h.w3cdom){return }f(H);if(h.ie&&h.win){try{K.write("