diff --git a/.classpath b/.classpath new file mode 100644 index 0000000..5990e91 --- /dev/null +++ b/.classpath @@ -0,0 +1,30 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/.project b/.project new file mode 100644 index 0000000..66299ae --- /dev/null +++ b/.project @@ -0,0 +1,64 @@ + + + data-miner-manager-widget + + + + + + 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..443e085 --- /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.7 +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..5391f78 --- /dev/null +++ b/.settings/org.eclipse.wst.common.component @@ -0,0 +1,13 @@ + + + + + + + + uses + + + + + 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..c6144e8 --- /dev/null +++ b/.settings/org.eclipse.wst.common.project.facet.core.xml @@ -0,0 +1,7 @@ + + + + + + + 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/dataminermanager.launch b/dataminermanager.launch new file mode 100644 index 0000000..015b732 --- /dev/null +++ b/dataminermanager.launch @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + 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..a533e08 --- /dev/null +++ b/distro/changelog.xml @@ -0,0 +1,6 @@ + + + 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..f8c23ca --- /dev/null +++ b/distro/profile.xml @@ -0,0 +1,29 @@ + + + + Service + + ${project.description} + PortletsWidgets + ${project.artifactId} + 1.0.0 + + + ${project.description} + ${project.artifactId} + ${version} + + ${project.groupId} + ${project.artifactId} + ${project.version} + + library + + ${project.build.finalName}.${project.packaging} + + + + + + + diff --git a/pom.xml b/pom.xml new file mode 100644 index 0000000..22f69fe --- /dev/null +++ b/pom.xml @@ -0,0 +1,452 @@ + + 4.0.0 + + + + maven-parent + org.gcube.tools + 1.0.0 + + + + org.gcube.portlets.widgets + data-miner-manager-widget + 1.0.0-SNAPSHOT + war + + data-miner-manager-widget + data-miner-manager-widget offers a unique access to perform data mining and statistical operations on heterogeneous data + + + https://svn.d4science.research-infrastructures.eu/gcube/trunk/portlets/widgets/data-miner-manager-widget + + + + + + 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 + + + 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.contentmanagement + storage-manager-core + runtime + + + org.gcube.contentmanagement + storage-manager-wrapper + runtime + + + + + org.gcube.common + home-library + runtime + + + org.gcube.common + home-library-jcr + runtime + + + org.gcube.common + home-library-model + 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.contentmanagement + storage-manager-core + provided + + + + org.gcube.contentmanagement + storage-manager-wrapper + provided + + + + + org.gcube.common + home-library + provided + + + + org.gcube.common + home-library-jcr + provided + + + + org.gcube.common + home-library-model + provided + + + + + + org.gcube.resources.discovery + ic-client + + + + + + org.n52.wps + 52n-wps-client-lib + 3.2.0 + + + gt-opengis + org.geotools + + + xerces + xercesImpl + + + + + + + + + org.gcube.common + csv4j + [1.2.0-SNAPSHOT, 2.0.0-SNAPSHOT) + + + + + + + org.gcube.portlets.widgets + workspace-explorer + [1.4.0-SNAPSHOT, 2.0.0-SNAPSHOT) + + + + + org.gcube.portlets.widgets + workspace-uploader + [1.4.0-SNAPSHOT,2.0.0-SNAPSHOT) + + + + + org.gcube.portlets.widgets + openlayer-basic-widgets + [1.0.0-SNAPSHOT,2.0.0-SNAPSHOT) + + + + + org.gcube.data.analysis + data-miner-manager-cl + [1.0.0-SNAPSHOT,2.0.0-SNAPSHOT) + + + + + com.allen-sauer.gwt.log + gwt-log + ${gwtLogVersion} + + + + org.slf4j + slf4j-api + provided + + + org.slf4j + slf4j-log4j12 + provided + + + + + + + gCubeExternal + gcube-externals + http://maven.research-infrastructures.eu/nexus/content/repositories/gcube-externals/ + + + + n52-releases + 52n Releases + http://52north.org/maven/repo/releases/ + + true + + + true + + + + + + + + + + + + + + + + + org.gcube.distribution + maven-portal-bom + LATEST + pom + import + + + + + + + ${webappDirectory}/WEB-INF/classes + + + src/main/resources + + **/*.* + + + + + + + + + + org.codehaus.mojo + gwt-maven-plugin + ${gwtVersion} + + + + -Xss512m -Xmx3072m -XX:MaxPermSize=2048m + + + compile + test + + + + + DataMinerManagerWidget.html + ${webappDirectory} + org.gcube.portlets.widgets.dataminermanagerwidget.dataminermanagerwidget + + + + + + + + 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 + + ${javaVersion} + ${javaVersion} + + + + + 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/widgets/dataminermanagerwidget/client/DataMinerManager.java b/src/main/java/org/gcube/portlets/widgets/dataminermanagerwidget/client/DataMinerManager.java new file mode 100644 index 0000000..ab150bc --- /dev/null +++ b/src/main/java/org/gcube/portlets/widgets/dataminermanagerwidget/client/DataMinerManager.java @@ -0,0 +1,239 @@ +package org.gcube.portlets.widgets.dataminermanagerwidget.client; + +import org.gcube.portlets.widgets.dataminermanagerwidget.client.common.EventBusProvider; +import org.gcube.portlets.widgets.dataminermanagerwidget.client.computations.ComputationsPanel; +import org.gcube.portlets.widgets.dataminermanagerwidget.client.dataspace.DataSpacePanel; +import org.gcube.portlets.widgets.dataminermanagerwidget.client.events.DataMinerWorkAreaRequestEvent; +import org.gcube.portlets.widgets.dataminermanagerwidget.client.events.MenuSwitchEvent; +import org.gcube.portlets.widgets.dataminermanagerwidget.client.experiments.ExperimentPanel; +import org.gcube.portlets.widgets.dataminermanagerwidget.client.resources.Resources; +import org.gcube.portlets.widgets.dataminermanagerwidget.client.type.DataMinerWorkAreaRegionType; +import org.gcube.portlets.widgets.dataminermanagerwidget.client.type.DataMinerWorkAreaRequestEventType; +import org.gcube.portlets.widgets.dataminermanagerwidget.client.type.MenuType; + +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.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 DataMinerManager implements EntryPoint { + public static final Resources resources = GWT.create(Resources.class); + + private static final String SM_DIV = "contentDiv"; + private DataMinerManagerController dataMinerManagerController; + + private Header header; + private HomePanel homePanel; + private DataSpacePanel dataSpacePanel; + private ExperimentPanel experimentPanel; + private ComputationsPanel computationsPanel; + + 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() { + dataMinerManagerController = new DataMinerManagerController(); + homePanel = new HomePanel(); + dataSpacePanel = new DataSpacePanel(); + experimentPanel = new ExperimentPanel(); + computationsPanel = new ComputationsPanel(); + + bind(); + + // Layout + 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 (dataMinerManagerController.getOperatorId() != null + && !dataMinerManagerController.getOperatorId().isEmpty()){ + header.setMenu(MenuType.EXPERIMENT); + centerPanel.add(experimentPanel); + previousPanel = experimentPanel; + + } else { + centerPanel.add(homePanel); + previousPanel = homePanel; + + } + + bindWindow(mainPanelLayout); + mainPanelLayout.forceLayout(); + + } + + 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 COMPUTATIONS: + switchPanel(computationsPanel); + fireDataMinerWorkAreareRequestUpdate(DataMinerWorkAreaRegionType.Computations); + break; + case DATA_SPACE: + switchPanel(dataSpacePanel); + fireDataMinerWorkAreareRequestUpdate(DataMinerWorkAreaRegionType.DataSets); + break; + case EXPERIMENT: + switchPanel(experimentPanel); + break; + case HOME: + switchPanel(homePanel); + break; + default: + break; + + } + + } + + private void fireDataMinerWorkAreareRequestUpdate( + DataMinerWorkAreaRegionType dataMinerWorkAreaRegionType) { + DataMinerWorkAreaRequestEvent event = new DataMinerWorkAreaRequestEvent( + DataMinerWorkAreaRequestEventType.UPDATE, + dataMinerWorkAreaRegionType); + EventBusProvider.INSTANCE.fireEvent(event); + } + + /** + * + * @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/widgets/dataminermanagerwidget/client/DataMinerManagerController.java b/src/main/java/org/gcube/portlets/widgets/dataminermanagerwidget/client/DataMinerManagerController.java new file mode 100644 index 0000000..1bce0a1 --- /dev/null +++ b/src/main/java/org/gcube/portlets/widgets/dataminermanagerwidget/client/DataMinerManagerController.java @@ -0,0 +1,749 @@ +package org.gcube.portlets.widgets.dataminermanagerwidget.client; + +import java.util.List; + +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.OperatorsClassification; +import org.gcube.portlets.widgets.dataminermanagerwidget.client.common.EventBusProvider; +import org.gcube.portlets.widgets.dataminermanagerwidget.client.events.CancelComputationExecutionRequestEvent; +import org.gcube.portlets.widgets.dataminermanagerwidget.client.events.CancelExecutionFromComputationsRequestEvent; +import org.gcube.portlets.widgets.dataminermanagerwidget.client.events.ComputationDataEvent; +import org.gcube.portlets.widgets.dataminermanagerwidget.client.events.ComputationDataRequestEvent; +import org.gcube.portlets.widgets.dataminermanagerwidget.client.events.DataMinerWorkAreaEvent; +import org.gcube.portlets.widgets.dataminermanagerwidget.client.events.DataMinerWorkAreaRequestEvent; +import org.gcube.portlets.widgets.dataminermanagerwidget.client.events.DeleteItemRequestEvent; +import org.gcube.portlets.widgets.dataminermanagerwidget.client.events.MenuEvent; +import org.gcube.portlets.widgets.dataminermanagerwidget.client.events.MenuSwitchEvent; +import org.gcube.portlets.widgets.dataminermanagerwidget.client.events.OperatorsClassificationEvent; +import org.gcube.portlets.widgets.dataminermanagerwidget.client.events.OperatorsClassificationRequestEvent; +import org.gcube.portlets.widgets.dataminermanagerwidget.client.events.OutputDataEvent; +import org.gcube.portlets.widgets.dataminermanagerwidget.client.events.OutputDataRequestEvent; +import org.gcube.portlets.widgets.dataminermanagerwidget.client.events.RefreshDataMinerWorkAreaEvent; +import org.gcube.portlets.widgets.dataminermanagerwidget.client.events.ResubmitComputationExecutionEvent; +import org.gcube.portlets.widgets.dataminermanagerwidget.client.events.ResubmitComputationExecutionRequestEvent; +import org.gcube.portlets.widgets.dataminermanagerwidget.client.events.SessionExpiredEvent; +import org.gcube.portlets.widgets.dataminermanagerwidget.client.events.StartComputationExecutionEvent; +import org.gcube.portlets.widgets.dataminermanagerwidget.client.events.StartComputationExecutionRequestEvent; +import org.gcube.portlets.widgets.dataminermanagerwidget.client.monitor.StatusMonitor; +import org.gcube.portlets.widgets.dataminermanagerwidget.client.rpc.DataMinerPortletServiceAsync; +import org.gcube.portlets.widgets.dataminermanagerwidget.client.type.DataMinerWorkAreaElementType; +import org.gcube.portlets.widgets.dataminermanagerwidget.client.type.DataMinerWorkAreaEventType; +import org.gcube.portlets.widgets.dataminermanagerwidget.client.type.MenuType; +import org.gcube.portlets.widgets.dataminermanagerwidget.client.util.InfoMessageBox; +import org.gcube.portlets.widgets.dataminermanagerwidget.client.util.UtilsGXT3; +import org.gcube.portlets.widgets.dataminermanagerwidget.shared.Constants; +import org.gcube.portlets.widgets.dataminermanagerwidget.shared.exception.SessionExpiredServiceException; +import org.gcube.portlets.widgets.dataminermanagerwidget.shared.session.UserInfo; +import org.gcube.portlets.widgets.dataminermanagerwidget.shared.workspace.DataMinerWorkArea; +import org.gcube.portlets.widgets.dataminermanagerwidget.shared.workspace.ItemDescription; + +import com.allen_sauer.gwt.log.client.Log; +import com.google.gwt.user.client.rpc.AsyncCallback; +import com.sencha.gxt.widget.core.client.event.HideEvent; +import com.sencha.gxt.widget.core.client.event.HideEvent.HideHandler; + +/** + * + * @author Giancarlo Panichi email: g.panichi@isti.cnr.it + * + */ +public class DataMinerManagerController { + private UserInfo userInfo; + private DataMinerWorkArea dataMinerWorkArea; + private List operatorsClassifications; + private MenuType currentVisualization; + private String operatorId; + + public DataMinerManagerController() { + init(); + } + + public UserInfo getUserInfo() { + return userInfo; + } + + public DataMinerWorkArea getDataMinerWorkArea() { + return dataMinerWorkArea; + } + + public String getOperatorId(){ + return operatorId; + } + + private void init() { + currentVisualization = MenuType.HOME; + restoreUISession(); + bind(); + callHello(); + checkSession(); + } + + 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( + OperatorsClassificationRequestEvent.TYPE, + new OperatorsClassificationRequestEvent.OperatorsClassificationRequestEventHandler() { + + @Override + public void onRequest( + OperatorsClassificationRequestEvent event) { + Log.debug("Catch OperatorsClassificationRequestEvent: " + + event); + operatorsClassificationRequest(event); + + } + + }); + + EventBusProvider.INSTANCE.addHandler(DeleteItemRequestEvent.TYPE, + new DeleteItemRequestEvent.DeleteItemRequestEventHandler() { + + @Override + public void onDeleteRequest(DeleteItemRequestEvent event) { + Log.debug("Catch DeleteItemRequestEvent: " + event); + deleteItemRequest(event); + + } + + }); + + EventBusProvider.INSTANCE + .addHandler( + DataMinerWorkAreaRequestEvent.TYPE, + new DataMinerWorkAreaRequestEvent.DataMinerWorkAreaRequestEventHandler() { + + @Override + public void onRequest( + DataMinerWorkAreaRequestEvent event) { + Log.debug("Catch DataMinerWorkAreaRequestEvent: " + + event); + retrieveDataMinerWorkArea(event); + + } + + }); + + } + + private void restoreUISession() { + // checkLocale(); + operatorId = com.google.gwt.user.client.Window.Location + .getParameter(Constants.DATA_MINER_OPERATOR_ID); + } + + + + private void callHello() { + + DataMinerPortletServiceAsync.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) { + DataMinerPortletServiceAsync.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(); + DataMinerPortletServiceAsync.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(); + DataMinerPortletServiceAsync.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) { + currentVisualization = MenuType.EXPERIMENT; + MenuSwitchEvent menuSwitchEvent = new MenuSwitchEvent( + MenuType.EXPERIMENT); + EventBusProvider.INSTANCE.fireEvent(menuSwitchEvent); + + DataMinerPortletServiceAsync.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 operatorsClassificationRequest( + OperatorsClassificationRequestEvent event) { + if (operatorsClassifications == null) { + getOperatorsClassifications(event); + } else { + if (event.getOperatorsClassificationRequestType() == null) { + return; + } + switch (event.getOperatorsClassificationRequestType()) { + case ByName: + getOperatorsClassificationByName(event); + break; + case Default: + getOperatorsClassificationDefault(event); + break; + default: + break; + + } + + } + + } + + private void getOperatorsClassifications( + final OperatorsClassificationRequestEvent event) { + DataMinerPortletServiceAsync.INSTANCE + .getOperatorsClassifications(new AsyncCallback>() { + + @Override + public void onSuccess(List result) { + operatorsClassifications = result; + operatorsClassificationRequest(event); + } + + @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 retrieving operators classification! " + + caught.getLocalizedMessage()); + Log.error("Error retrieving operators classification: " + + caught.getLocalizedMessage()); + caught.printStackTrace(); + } + } + }); + } + + private void getOperatorsClassificationDefault( + OperatorsClassificationRequestEvent event) { + OperatorsClassification find = null; + for (OperatorsClassification oc : operatorsClassifications) { + if (oc.getName().equals(Constants.UserClassificationName)) { + find = oc; + break; + } + } + + OperatorsClassificationEvent ocEvent; + if(event.isOperatorId()){ + ocEvent = new OperatorsClassificationEvent( + find, operatorId); + } else { + ocEvent = new OperatorsClassificationEvent( + find); + } + EventBusProvider.INSTANCE.fireEvent(ocEvent); + } + + private void getOperatorsClassificationByName( + OperatorsClassificationRequestEvent event) { + OperatorsClassification find = null; + for (OperatorsClassification oc : operatorsClassifications) { + if (oc.getName().equals(event.getClassificationName())) { + find = oc; + break; + } + } + + if (find == null) { + for (OperatorsClassification oc : operatorsClassifications) { + if (oc.getName().equals(Constants.UserClassificationName)) { + find = oc; + break; + } + } + } + + OperatorsClassificationEvent ocEvent; + if(event.isOperatorId()){ + ocEvent = new OperatorsClassificationEvent( + event.getClassificationName(), find, operatorId); + } else { + ocEvent = new OperatorsClassificationEvent( + event.getClassificationName(), find); + } + EventBusProvider.INSTANCE.fireEvent(ocEvent); + } + + private void retrieveDataMinerWorkArea( + final DataMinerWorkAreaRequestEvent event) { + final StatusMonitor monitor = new StatusMonitor(); + DataMinerPortletServiceAsync.INSTANCE + .getDataMinerWorkArea(new AsyncCallback() { + + @Override + public void onFailure(Throwable caught) { + monitor.hide(); + if (caught instanceof SessionExpiredServiceException) { + UtilsGXT3.alert("Error", "Expired Session"); + EventBusProvider.INSTANCE + .fireEvent(new SessionExpiredEvent()); + } else { + UtilsGXT3.alert("Error", + "Error retrieving DataMiner work area info: " + + caught.getLocalizedMessage()); + } + } + + @Override + public void onSuccess(DataMinerWorkArea result) { + monitor.hide(); + Log.debug("DataMinerWorkArea: " + result); + fireDataMinerWorkAreaEventRetrieved(event, result); + + } + + }); + + } + + private void fireDataMinerWorkAreaEventRetrieved( + DataMinerWorkAreaRequestEvent event, DataMinerWorkArea result) { + dataMinerWorkArea = result; + DataMinerWorkAreaEvent dataMinerWorkAreaEvent = new DataMinerWorkAreaEvent( + DataMinerWorkAreaEventType.OPEN, + event.getDataMinerWorkAreaRegionType(), result); + EventBusProvider.INSTANCE.fireEvent(dataMinerWorkAreaEvent); + } + + private void deleteItemRequest(final DeleteItemRequestEvent event) { + final StatusMonitor monitor = new StatusMonitor(); + DataMinerPortletServiceAsync.INSTANCE.deleteItem( + event.getItemDescription(), new AsyncCallback() { + + @Override + public void onFailure(Throwable caught) { + monitor.hide(); + if (caught instanceof SessionExpiredServiceException) { + UtilsGXT3.alert("Error", "Expired Session"); + EventBusProvider.INSTANCE + .fireEvent(new SessionExpiredEvent()); + } else { + UtilsGXT3.alert("Error", + "Error deleting item on workspace: " + + caught.getLocalizedMessage()); + } + } + + @Override + public void onSuccess(Void result) { + monitor.hide(); + Log.debug("Deleted Item!"); + fireRefreshDataMinerWorkAreaEvent(event + .getDataMinerWorkAreaElementType()); + + } + + }); + + } + + private void fireRefreshDataMinerWorkAreaEvent( + DataMinerWorkAreaElementType dataMinerWorkAreaElementType) { + RefreshDataMinerWorkAreaEvent refreshEvent = new RefreshDataMinerWorkAreaEvent( + dataMinerWorkAreaElementType); + EventBusProvider.INSTANCE.fireEvent(refreshEvent); + + } + + 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(); + DataMinerPortletServiceAsync.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(); + DataMinerPortletServiceAsync.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/widgets/dataminermanagerwidget/client/Header.java b/src/main/java/org/gcube/portlets/widgets/dataminermanagerwidget/client/Header.java new file mode 100644 index 0000000..b9407d7 --- /dev/null +++ b/src/main/java/org/gcube/portlets/widgets/dataminermanagerwidget/client/Header.java @@ -0,0 +1,274 @@ +/** + * + */ +package org.gcube.portlets.widgets.dataminermanagerwidget.client; + +import org.gcube.portlets.widgets.dataminermanagerwidget.client.common.EventBusProvider; +import org.gcube.portlets.widgets.dataminermanagerwidget.client.events.MenuEvent; +import org.gcube.portlets.widgets.dataminermanagerwidget.client.events.MenuSwitchEvent; +import org.gcube.portlets.widgets.dataminermanagerwidget.client.type.MenuType; +import org.gcube.portlets.widgets.dataminermanagerwidget.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 email: g.panichi@isti.cnr.it + * + */ +public class Header extends HorizontalPanel { + + private Image menuGoBack, menuExperiment, menuDataSpace, menuComputations, 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"); + menuSwitch(event); + + } + }); + } + + private void create() { + // this.setStyleAttribute("background-color", "#FFFFFF"); + Image logo = new Image(DataMinerManager.resources.logoLittle()); + logo.setAltText("Data Miner Manager"); + logo.setTitle("Data Miner Manager"); + logo.addStyleName("menuImgLogo"); + + menuGoBack = new Image(DataMinerManager.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); + + } + }); + + menuDataSpace = new Image( + DataMinerManager.resources.menuItemInputspace()); + menuDataSpace.addStyleName("menuItemImage"); + menuDataSpace.addClickHandler(new ClickHandler() { + @Override + public void onClick(ClickEvent event) { + Log.debug("Click Menu Data Space"); + MenuEvent menuEvent = new MenuEvent(MenuType.DATA_SPACE); + EventBusProvider.INSTANCE.fireEvent(menuEvent); + } + }); + + menuExperiment = new Image( + DataMinerManager.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); + } + }); + + menuComputations = new Image( + DataMinerManager.resources.menuItemComputations()); + menuComputations.addStyleName("menuItemImage"); + menuComputations.addClickHandler(new ClickHandler() { + + @Override + public void onClick(ClickEvent event) { + Log.debug("Click Menu Computations"); + MenuEvent menuEvent = new MenuEvent(MenuType.COMPUTATIONS); + EventBusProvider.INSTANCE.fireEvent(menuEvent); + } + }); + + + menuHelp = new Image( + DataMinerManager.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(menuDataSpace); + add(menuExperiment); + add(menuComputations); + add(menuHelp); + + this.setCellWidth(logo, "100px"); + this.setCellWidth(menuGoBack, "100px"); + this.setCellWidth(menuDataSpace, "80px"); + this.setCellWidth(menuExperiment, "80px"); // + this.setCellWidth(menuComputations, "80px"); + this.setCellWidth(menuHelp, "80px"); + + menuGoBack.setVisible(false); + menuDataSpace.setVisible(false); + menuExperiment.setVisible(false); + menuComputations.setVisible(false); + menuHelp.setVisible(false); + } + + public void setMenu(MenuType menuType){ + Log.debug("SetMenu: " + menuType); + + if (menuType.compareTo(MenuType.HOME) == 0) { + menuGoBack.setVisible(false); + menuDataSpace.setVisible(false); + menuExperiment.setVisible(false); + menuComputations.setVisible(false); + menuHelp.setVisible(false); + + if (currentSelection != null + && currentSelection.compareTo(MenuType.EXPERIMENT) == 0) + menuExperiment.removeStyleName("menuItemImage-selected"); + else if (currentSelection != null + && currentSelection.compareTo(MenuType.DATA_SPACE) == 0) + menuDataSpace.removeStyleName("menuItemImage-selected"); + else if (currentSelection != null + && currentSelection.compareTo(MenuType.COMPUTATIONS) == 0) + menuComputations.removeStyleName("menuItemImage-selected"); + } else { + if (currentSelection == null + || (currentSelection != null && currentSelection + .compareTo(MenuType.HOME) == 0)) { + menuGoBack.setVisible(true); + menuDataSpace.setVisible(true); + menuExperiment.setVisible(true); + menuComputations.setVisible(true); + menuHelp.setVisible(true); + } + + + if (currentSelection != null + && currentSelection.compareTo(MenuType.EXPERIMENT) == 0) + menuExperiment.removeStyleName("menuItemImage-selected"); + else if (currentSelection != null + && currentSelection.compareTo(MenuType.DATA_SPACE) == 0) + menuDataSpace.removeStyleName("menuItemImage-selected"); + else if (currentSelection != null + && currentSelection.compareTo(MenuType.COMPUTATIONS) == 0) + menuComputations.removeStyleName("menuItemImage-selected"); + + Image imgNew = (menuType.compareTo(MenuType.DATA_SPACE) == 0 ? menuDataSpace + : (menuType.compareTo(MenuType.EXPERIMENT) == 0 ? menuExperiment + : menuComputations)); + + imgNew.addStyleName("menuItemImage-selected"); + } + + currentSelection = menuType; + return; + } + /** + * @param inputSpace + */ + private void menuSwitch(MenuSwitchEvent event) { + Log.debug("MenuSwitch: " + event); + + if (event.getMenuType().compareTo(MenuType.HOME) == 0) { + menuGoBack.setVisible(false); + menuDataSpace.setVisible(false); + menuExperiment.setVisible(false); + menuComputations.setVisible(false); + menuHelp.setVisible(false); + + if (currentSelection != null + && currentSelection.compareTo(MenuType.EXPERIMENT) == 0) + menuExperiment.removeStyleName("menuItemImage-selected"); + else if (currentSelection != null + && currentSelection.compareTo(MenuType.DATA_SPACE) == 0) + menuDataSpace.removeStyleName("menuItemImage-selected"); + else if (currentSelection != null + && currentSelection.compareTo(MenuType.COMPUTATIONS) == 0) + menuComputations.removeStyleName("menuItemImage-selected"); + } else { + if (currentSelection == null + || (currentSelection != null && currentSelection + .compareTo(MenuType.HOME) == 0)) { + menuGoBack.setVisible(true); + menuDataSpace.setVisible(true); + menuExperiment.setVisible(true); + menuComputations.setVisible(true); + menuHelp.setVisible(true); + } + + if (currentSelection != null + && currentSelection.compareTo(MenuType.EXPERIMENT) == 0) + menuExperiment.removeStyleName("menuItemImage-selected"); + else if (currentSelection != null + && currentSelection.compareTo(MenuType.DATA_SPACE) == 0) + menuDataSpace.removeStyleName("menuItemImage-selected"); + else if (currentSelection != null + && currentSelection.compareTo(MenuType.COMPUTATIONS) == 0) + menuComputations.removeStyleName("menuItemImage-selected"); + + Image imgNew = (event.getMenuType().compareTo(MenuType.DATA_SPACE) == 0 ? menuDataSpace + : (event.getMenuType().compareTo(MenuType.EXPERIMENT) == 0 ? menuExperiment + : menuComputations)); + + imgNew.addStyleName("menuItemImage-selected"); + } + + currentSelection = event.getMenuType(); + return; + } + + + private void showHelp() { + try { + DataMinerManager.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, + "DataMiner 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/widgets/dataminermanagerwidget/client/HomePanel.java b/src/main/java/org/gcube/portlets/widgets/dataminermanagerwidget/client/HomePanel.java new file mode 100644 index 0000000..60bb0b9 --- /dev/null +++ b/src/main/java/org/gcube/portlets/widgets/dataminermanagerwidget/client/HomePanel.java @@ -0,0 +1,158 @@ +package org.gcube.portlets.widgets.dataminermanagerwidget.client; + +import org.gcube.portlets.widgets.dataminermanagerwidget.client.common.EventBusProvider; +import org.gcube.portlets.widgets.dataminermanagerwidget.client.events.MenuEvent; +import org.gcube.portlets.widgets.dataminermanagerwidget.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 email: g.panichi@isti.cnr.it + * + */ +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)); + /* + VerticalLayoutData layoutTop = new VerticalLayoutData(1, -1, + new Margins(20, 90, 10, 90)); + VerticalLayoutData layoutNext = new VerticalLayoutData(1, -1, + new Margins(10, 90, 10, 90)); + */ + SimpleContainer itemDataSpace = createMenuItem( + "Access to the Data Space", + "The data space contains the set of input and output data sets of the users. It is possible to upload and share tables. Data sources can be chosen from those hosted by the infrastructure. Outputs of the computations can be even saved in this space.", + DataMinerManager.resources.inputSpaceIcon(), new MouseDownHandler() { + + @Override + public void onMouseDown(MouseDownEvent event) { + MenuEvent menuEvent=new MenuEvent(MenuType.DATA_SPACE); + EventBusProvider.INSTANCE.fireEvent(menuEvent); + + + } + }); + lc.add(itemDataSpace, layoutTop); + + SimpleContainer itemExperiment = createMenuItem( + "Execute an Experiment", + "This section allows to execute or prepare a Niche Modeling experiment. The section is endowed with a list of algorithms for training and executing statistical models for biological applications. Evaluation of the performances is possible by means of several kinds of measurement systems and processes.", + DataMinerManager.resources.executionIcon(), new MouseDownHandler() { + + @Override + public void onMouseDown(MouseDownEvent event) { + MenuEvent menuEvent=new MenuEvent(MenuType.EXPERIMENT); + EventBusProvider.INSTANCE.fireEvent(menuEvent); + + + + } + }); + + lc.add(itemExperiment, layoutNext); + + SimpleContainer itemComputations = createMenuItem( + "Check the Computations", + "This section allows to check the status of the computation. A list of processes launched by the user is shown along with meta-information. By clicking on the completed jobs it is possible to visualize the data set contents.", + DataMinerManager.resources.computationsIcon(), new MouseDownHandler() { + + @Override + public void onMouseDown(MouseDownEvent event) { + MenuEvent menuEvent=new MenuEvent(MenuType.COMPUTATIONS); + EventBusProvider.INSTANCE.fireEvent(menuEvent); + } + }); + + lc.add(itemComputations, layoutNext); + + 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/widgets/dataminermanagerwidget/client/PortalViewport.java b/src/main/java/org/gcube/portlets/widgets/dataminermanagerwidget/client/PortalViewport.java new file mode 100644 index 0000000..c43024c --- /dev/null +++ b/src/main/java/org/gcube/portlets/widgets/dataminermanagerwidget/client/PortalViewport.java @@ -0,0 +1,153 @@ +/** + * + */ +package org.gcube.portlets.widgets.dataminermanagerwidget.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" + * g.panichi@isti.cnr.it + * + */ +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("AM 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("AM onWindowResize viewWidth: " + viewWidth + + " viewHeight: " + viewHeight + " clientWidth: " + + Window.getClientWidth() + " clientHeight: " + + Window.getClientHeight()); + setPixelSize(viewWidth, viewHeight); + } + + + + protected int calculateWidth() { + int leftBorder = getAbsoluteLeft(); + Log.info("AM width: " + + String.valueOf(Window.getClientWidth() - 2 * leftBorder)); + return Window.getClientWidth() - 2 * leftBorder; + } + + protected int calculateHeight() { + int topBorder = getAbsoluteTop(); + Log.info("AM height: " + + String.valueOf(Window.getClientHeight() - topBorder - 34)); + return Window.getClientHeight() - topBorder - 34; + } + +} diff --git a/src/main/java/org/gcube/portlets/widgets/dataminermanagerwidget/client/common/EventBusProvider.java b/src/main/java/org/gcube/portlets/widgets/dataminermanagerwidget/client/common/EventBusProvider.java new file mode 100644 index 0000000..4291e16 --- /dev/null +++ b/src/main/java/org/gcube/portlets/widgets/dataminermanagerwidget/client/common/EventBusProvider.java @@ -0,0 +1,19 @@ +/** + * + */ +package org.gcube.portlets.widgets.dataminermanagerwidget.client.common; + +import com.google.gwt.event.shared.EventBus; +import com.google.gwt.event.shared.SimpleEventBus; + +/** + * + * @author Giancarlo Panichi email: g.panichi@isti.cnr.it + * + */ +public class EventBusProvider { + + public static final EventBus INSTANCE = new SimpleEventBus(); + +} diff --git a/src/main/java/org/gcube/portlets/widgets/dataminermanagerwidget/client/computations/ComputationValueFileListPanel.java b/src/main/java/org/gcube/portlets/widgets/dataminermanagerwidget/client/computations/ComputationValueFileListPanel.java new file mode 100644 index 0000000..be326e9 --- /dev/null +++ b/src/main/java/org/gcube/portlets/widgets/dataminermanagerwidget/client/computations/ComputationValueFileListPanel.java @@ -0,0 +1,59 @@ +package org.gcube.portlets.widgets.dataminermanagerwidget.client.computations; + + +import org.gcube.data.analysis.dataminermanagercl.shared.data.computations.ComputationValue; +import org.gcube.data.analysis.dataminermanagercl.shared.data.computations.ComputationValueFile; +import org.gcube.data.analysis.dataminermanagercl.shared.data.computations.ComputationValueFileList; +import org.gcube.data.analysis.dataminermanagercl.shared.data.computations.ComputationValueImage; + +import com.sencha.gxt.core.client.util.Margins; +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 email: g.panichi@isti.cnr.it + * + */ +public class ComputationValueFileListPanel extends SimpleContainer { + private ComputationValueFileList computationValueFileList; + + public ComputationValueFileListPanel(ComputationValueFileList computationValueFileList) { + this.computationValueFileList = computationValueFileList; + init(); + create(); + } + + private void init(){ + setBorders(false); + } + + private void create() { + VerticalLayoutContainer lc = new VerticalLayoutContainer(); + SimpleContainer simpleContainer; + TextField textField; + for(ComputationValue computationValue: computationValueFileList.getFileList()){ + if(computationValue instanceof ComputationValueFile){ + ComputationValueFile computationValueFile=(ComputationValueFile) computationValue; + simpleContainer=new ComputationValueFilePanel(computationValueFile); + lc.add(simpleContainer, new VerticalLayoutData(1, -1, new Margins(0))); + } else { + if(computationValue instanceof ComputationValueImage){ + ComputationValueImage computationValueImage=(ComputationValueImage) computationValue; + simpleContainer=new ComputationValueImagePanel(computationValueImage); + lc.add(simpleContainer, new VerticalLayoutData(1, -1, new Margins(0))); + } else { + textField = new TextField(); + textField.setValue(computationValue.getValue()); + textField.setReadOnly(true); + lc.add(textField, new VerticalLayoutData(1, -1, new Margins(0))); + } + } + } + add(lc); + } + +} diff --git a/src/main/java/org/gcube/portlets/widgets/dataminermanagerwidget/client/computations/ComputationValueFilePanel.java b/src/main/java/org/gcube/portlets/widgets/dataminermanagerwidget/client/computations/ComputationValueFilePanel.java new file mode 100644 index 0000000..2484ea1 --- /dev/null +++ b/src/main/java/org/gcube/portlets/widgets/dataminermanagerwidget/client/computations/ComputationValueFilePanel.java @@ -0,0 +1,66 @@ +package org.gcube.portlets.widgets.dataminermanagerwidget.client.computations; + +import org.gcube.data.analysis.dataminermanagercl.shared.data.computations.ComputationValueFile; +import org.gcube.portlets.widgets.dataminermanagerwidget.client.DataMinerManager; + +import com.google.gwt.safehtml.shared.SafeHtmlBuilder; +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 email: g.panichi@isti.cnr.it + * + */ +public class ComputationValueFilePanel extends SimpleContainer { + private ComputationValueFile computationValueFile; + + public ComputationValueFilePanel(ComputationValueFile computationValueFile) { + this.computationValueFile = computationValueFile; + init(); + create(); + } + + private void init(){ + setBorders(false); + } + + private void create() { + VerticalLayoutContainer lc = new VerticalLayoutContainer(); + final String fileName = computationValueFile.getFileName(); + final String fileUrl = computationValueFile.getValue(); + HtmlLayoutContainer fileNameHtml; + if (fileName != null) { + fileNameHtml = new HtmlLayoutContainer( + "

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

"); + } else { + fileNameHtml = new HtmlLayoutContainer( + "

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

"); + } + + lc.add(fileNameHtml, new VerticalLayoutData(-1, -1, new Margins(0))); + TextButton downloadBtn = new TextButton("Download File"); + downloadBtn.setIcon(DataMinerManager.resources.download()); + downloadBtn.addSelectHandler(new SelectEvent.SelectHandler() { + @Override + public void onSelect(SelectEvent event) { + com.google.gwt.user.client.Window.open(fileUrl, fileName, ""); + + } + }); + + lc.add(downloadBtn, new VerticalLayoutData(-1, -1, new Margins(0))); + add(lc); + } + +} diff --git a/src/main/java/org/gcube/portlets/widgets/dataminermanagerwidget/client/computations/ComputationValueImagePanel.java b/src/main/java/org/gcube/portlets/widgets/dataminermanagerwidget/client/computations/ComputationValueImagePanel.java new file mode 100644 index 0000000..427f521 --- /dev/null +++ b/src/main/java/org/gcube/portlets/widgets/dataminermanagerwidget/client/computations/ComputationValueImagePanel.java @@ -0,0 +1,76 @@ +package org.gcube.portlets.widgets.dataminermanagerwidget.client.computations; + +import org.gcube.data.analysis.dataminermanagercl.shared.data.computations.ComputationValueImage; +import org.gcube.portlets.widgets.dataminermanagerwidget.client.DataMinerManager; + +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 email: g.panichi@isti.cnr.it + * + */ +public class ComputationValueImagePanel extends SimpleContainer { + private ComputationValueImage computationValueImage; + + public ComputationValueImagePanel( + ComputationValueImage computationValueImage) { + this.computationValueImage = computationValueImage; + init(); + create(); + } + + private void init() { + setBorders(false); + } + + private void create() { + VerticalLayoutContainer v = new VerticalLayoutContainer(); + add(v); + if (computationValueImage == null + || computationValueImage.getValue() == null + || computationValueImage.getValue().isEmpty()) + v.add(new HtmlLayoutContainer("No image found."), + new VerticalLayoutData(-1, -1, new Margins(0))); + else { + HtmlLayoutContainer imageName; + if (computationValueImage.getFileName() == null + || computationValueImage.getFileName().isEmpty()) { + imageName = new HtmlLayoutContainer(""); + } else { + imageName = new HtmlLayoutContainer( + computationValueImage.getFileName()); + } + + v.add(imageName, new VerticalLayoutData(-1, -1, new Margins(0))); + TextButton saveImageBtn = new TextButton("Download Image"); + saveImageBtn.setIcon(DataMinerManager.resources.download()); + saveImageBtn.addSelectHandler(new SelectEvent.SelectHandler() { + + @Override + public void onSelect(SelectEvent event) { + com.google.gwt.user.client.Window.open( + computationValueImage.getValue(), + computationValueImage.getFileName(), ""); + } + }); + + v.add(saveImageBtn, new VerticalLayoutData(-1, -1, new Margins(0))); + final Image img = new Image(computationValueImage.getValue()); + img.setPixelSize(640, 480); + v.add(img, new VerticalLayoutData(1, -1, new Margins(0))); + } + + forceLayout(); + + } + +} diff --git a/src/main/java/org/gcube/portlets/widgets/dataminermanagerwidget/client/computations/ComputationsExecutedPanel.java b/src/main/java/org/gcube/portlets/widgets/dataminermanagerwidget/client/computations/ComputationsExecutedPanel.java new file mode 100644 index 0000000..8d28a27 --- /dev/null +++ b/src/main/java/org/gcube/portlets/widgets/dataminermanagerwidget/client/computations/ComputationsExecutedPanel.java @@ -0,0 +1,580 @@ +package org.gcube.portlets.widgets.dataminermanagerwidget.client.computations; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import org.gcube.portal.clientcontext.client.GCubeClientContext; +import org.gcube.portlets.widgets.dataminermanagerwidget.client.DataMinerManager; +import org.gcube.portlets.widgets.dataminermanagerwidget.client.common.EventBusProvider; +import org.gcube.portlets.widgets.dataminermanagerwidget.client.events.CancelExecutionFromComputationsRequestEvent; +import org.gcube.portlets.widgets.dataminermanagerwidget.client.events.ComputationDataRequestEvent; +import org.gcube.portlets.widgets.dataminermanagerwidget.client.events.DataMinerWorkAreaEvent; +import org.gcube.portlets.widgets.dataminermanagerwidget.client.events.DeleteItemRequestEvent; +import org.gcube.portlets.widgets.dataminermanagerwidget.client.events.RefreshDataMinerWorkAreaEvent; +import org.gcube.portlets.widgets.dataminermanagerwidget.client.events.ResubmitComputationExecutionRequestEvent; +import org.gcube.portlets.widgets.dataminermanagerwidget.client.events.SessionExpiredEvent; +import org.gcube.portlets.widgets.dataminermanagerwidget.client.events.UIStateEvent; +import org.gcube.portlets.widgets.dataminermanagerwidget.client.rpc.DataMinerPortletServiceAsync; +import org.gcube.portlets.widgets.dataminermanagerwidget.client.type.DataMinerWorkAreaElementType; +import org.gcube.portlets.widgets.dataminermanagerwidget.client.util.UtilsGXT3; +import org.gcube.portlets.widgets.dataminermanagerwidget.shared.Constants; +import org.gcube.portlets.widgets.dataminermanagerwidget.shared.exception.SessionExpiredServiceException; +import org.gcube.portlets.widgets.dataminermanagerwidget.shared.workspace.ItemDescription; +import org.gcube.portlets.widgets.workspaceuploader.client.WorkspaceUploadNotification.WorskpaceUploadNotificationListener; +import org.gcube.portlets.widgets.workspaceuploader.client.uploader.DialogUpload.UPLOAD_TYPE; +import org.gcube.portlets.widgets.workspaceuploader.client.uploader.dragdrop.MultipleDNDUpload; +import org.gcube.portlets.widgets.wsexplorer.client.explore.WorkspaceResourcesExplorerPanel; +import org.gcube.portlets.widgets.wsexplorer.client.notification.WorkspaceExplorerSelectNotification.WorskpaceExplorerSelectNotificationListener; +import org.gcube.portlets.widgets.wsexplorer.client.view.grid.ItemsTable.DISPLAY_FIELD; +import org.gcube.portlets.widgets.wsexplorer.shared.FilterCriteria; +import org.gcube.portlets.widgets.wsexplorer.shared.Item; + +import com.allen_sauer.gwt.log.client.Log; +import com.google.gwt.core.client.GWT; +import com.google.gwt.event.logical.shared.ResizeEvent; +import com.google.gwt.event.logical.shared.ResizeHandler; +import com.google.gwt.user.client.Window; +import com.google.gwt.user.client.rpc.AsyncCallback; +import com.sencha.gxt.cell.core.client.ButtonCell.ButtonScale; +import com.sencha.gxt.cell.core.client.ButtonCell.IconAlign; +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.BoxLayoutContainer.BoxLayoutData; +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.ToolBar; + +/** + * + * @author Giancarlo Panichi email: g.panichi@isti.cnr.it + * + */ +public class ComputationsExecutedPanel extends FramedPanel { + + private Item selectedItem; + private MultipleDNDUpload dnd; + private WorkspaceResourcesExplorerPanel wsResourcesExplorerPanel; + private TextButton btnShow; + private TextButton btnDownload; + private TextButton btnDelete; + private TextButton btnRefresh; + private TextButton btnResubmit; + private TextButton btnCancel; + private VerticalLayoutContainer v; + + public ComputationsExecutedPanel() { + super(); + Log.debug("ComputationsPanel"); + + // msgs = GWT.create(ServiceCategoryMessages.class); + init(); + bindToEvents(); + + } + + private void init() { + setItemId("ComputationsExecutedPanel"); + forceLayoutOnResize = true; + setBodyBorder(false); + setBorders(false); + setBodyStyle("backgroundColor:white;"); + setHeaderVisible(false); + setResize(true); + setHeadingText("List of Computations"); + setBodyStyle("backgroundColor:white;"); + + } + + private void bindToEvents() { + + EventBusProvider.INSTANCE.addHandler(UIStateEvent.TYPE, + new UIStateEvent.UIStateEventHandler() { + + @Override + public void onChange(UIStateEvent event) { + manageStateEvents(event); + + } + }); + + EventBusProvider.INSTANCE.addHandler(DataMinerWorkAreaEvent.TYPE, + new DataMinerWorkAreaEvent.DataMinerWorkAreaEventHandler() { + + @Override + public void onChange(DataMinerWorkAreaEvent event) { + manageDataMinerWorkAreaEvents(event); + + } + + }); + + EventBusProvider.INSTANCE + .addHandler( + RefreshDataMinerWorkAreaEvent.TYPE, + new RefreshDataMinerWorkAreaEvent.RefreshDataMinerWorkAreaEventHandler() { + + @Override + public void onRefresh( + RefreshDataMinerWorkAreaEvent event) { + manageRefreshDataMinerWorkAreaEvents(event); + + } + + }); + + } + + private void manageStateEvents(UIStateEvent event) { + Log.debug("ComputationsExecutedPanel recieved UIStateEvent: " + event); + if (event == null) { + Log.error("UIStateEvent null"); + return; + } + + switch (event.getUiStateType()) { + case START: + break; + case WAITING: + break; + case UPDATE: + break; + default: + break; + } + } + + private void manageDataMinerWorkAreaEvents(DataMinerWorkAreaEvent event) { + + Log.debug("ComputationsExecutedPanel recieved DataMinerWorkAreaEvent: " + + event); + if (event == null) { + Log.error("DataMinerWorkAreaEvent null"); + return; + } + switch (event.getDataMinerWorkAreaRegionType()) { + case Computations: + manageMyDataMinerWorkAreaEvents(event); + break; + case DataSets: + break; + default: + break; + + } + } + + private void manageMyDataMinerWorkAreaEvents(DataMinerWorkAreaEvent event) { + + switch (event.getDataMinerWorkAreaEventType()) { + case OPEN: + case UPDATE: + refreshWSResourceExplorerPanel(event); + break; + default: + break; + } + + } + + private void manageRefreshDataMinerWorkAreaEvents( + RefreshDataMinerWorkAreaEvent event) { + Log.debug("ComputationsExecutedPanel recieved RefreshDataMinerWorkAreaEvent: " + + event); + if (event == null) { + Log.error("RefreshDataMinerWorkAreaEvent null"); + return; + } + switch (event.getDataMinerWorkAreaElementType()) { + case Computations: + refreshWSResourceExplorerPanel(); + break; + case InputDataSets: + break; + case OutputDataSets: + break; + default: + break; + } + + } + + private void create(DataMinerWorkAreaEvent event) { + try { + + if (event == null + || event.getDataMinerWorkArea() == null + || event.getDataMinerWorkArea().getComputations() == null + || event.getDataMinerWorkArea().getComputations() + .getFolder() == null + || event.getDataMinerWorkArea().getComputations() + .getFolder().getId() == null + || event.getDataMinerWorkArea().getComputations() + .getFolder().getId().isEmpty()) { + if (v != null) { + remove(v); + forceLayout(); + } + return; + + } + + List showProperties = new ArrayList(); + for (ComputationsPropertiesType computationsProperties : ComputationsPropertiesType + .values()) { + showProperties.add(computationsProperties.getLabel()); + } + FilterCriteria filterCriteria = new FilterCriteria(); + Map map = new HashMap(); + filterCriteria.setRequiredProperties(map); + + wsResourcesExplorerPanel = new WorkspaceResourcesExplorerPanel( + event.getDataMinerWorkArea().getComputations().getFolder() + .getId(), false, showProperties, filterCriteria, + true, DISPLAY_FIELD.CREATION_DATE); + WorskpaceExplorerSelectNotificationListener wsResourceExplorerListener = new WorskpaceExplorerSelectNotificationListener() { + @Override + public void onSelectedItem(Item item) { + Log.debug("Listener Selected Item " + item); + selectedItem = item; + + } + + @Override + public void onFailed(Throwable throwable) { + Log.error(throwable.getLocalizedMessage()); + throwable.printStackTrace(); + } + + @Override + public void onAborted() { + + } + + @Override + public void onNotValidSelection() { + selectedItem = null; + } + }; + + wsResourcesExplorerPanel + .addWorkspaceExplorerSelectNotificationListener(wsResourceExplorerListener); + wsResourcesExplorerPanel.ensureDebugId("wsResourceExplorerPanel"); + wsResourcesExplorerPanel.setHeightToInternalScroll(300); + + /* + * VerticalLayoutContainer vResourcesExplorerContainer = new + * VerticalLayoutContainer(); + * vResourcesExplorerContainer.setScrollMode(ScrollMode.AUTO); + * vResourcesExplorerContainer.add(wsResourcesExplorerPanel, new + * VerticalLayoutData(1, -1, new Margins(0))); + */ + // DND + + dnd = new MultipleDNDUpload(); + dnd.setParameters(event.getDataMinerWorkArea().getComputations() + .getFolder().getId(), UPLOAD_TYPE.File); + dnd.addUniqueContainer(wsResourcesExplorerPanel); + WorskpaceUploadNotificationListener workspaceUploaderListener = new WorskpaceUploadNotificationListener() { + + @Override + public void onUploadCompleted(String parentId, String itemId) { + Log.debug("Upload completed: [parentID: " + parentId + + ", itemId: " + itemId + "]"); + wsResourcesExplorerPanel.refreshRootFolderView(); + forceLayout(); + + } + + @Override + public void onUploadAborted(String parentId, String itemId) { + Log.debug("Upload Aborted: [parentID: " + parentId + + ", itemId: " + itemId + "]"); + } + + @Override + public void onError(String parentId, String itemId, + Throwable throwable) { + Log.debug("Upload Error: [parentID: " + parentId + + ", itemId: " + itemId + "]"); + throwable.printStackTrace(); + } + + @Override + public void onOverwriteCompleted(String parentId, String itemId) { + Log.debug("Upload Override Completed: [parentID: " + + parentId + ", itemId: " + itemId + "]"); + wsResourcesExplorerPanel.refreshRootFolderView(); + forceLayout(); + } + }; + + dnd.addWorkspaceUploadNotificationListener(workspaceUploaderListener); + + // ToolBar + btnShow = new TextButton("Show"); + btnShow.setIcon(DataMinerManager.resources.show()); + btnShow.setScale(ButtonScale.SMALL); + btnShow.setIconAlign(IconAlign.LEFT); + btnShow.setToolTip("Show"); + btnShow.addSelectHandler(new SelectHandler() { + + @Override + public void onSelect(SelectEvent event) { + showComputation(); + } + + }); + + btnDownload = new TextButton("Download"); + btnDownload.setIcon(DataMinerManager.resources.download()); + btnDownload.setScale(ButtonScale.SMALL); + btnDownload.setIconAlign(IconAlign.LEFT); + btnDownload.setToolTip("Download"); + btnDownload.addSelectHandler(new SelectHandler() { + + @Override + public void onSelect(SelectEvent event) { + downloadFile(); + } + + }); + + btnDelete = new TextButton("Delete"); + btnDelete.setIcon(DataMinerManager.resources.deleteCircle()); + btnDelete.setScale(ButtonScale.SMALL); + btnDelete.setIconAlign(IconAlign.LEFT); + btnDelete.setToolTip("Delete"); + btnDelete.addSelectHandler(new SelectHandler() { + + @Override + public void onSelect(SelectEvent event) { + deleteItem(event); + } + + }); + + btnRefresh = new TextButton("Refresh"); + btnRefresh.setIcon(DataMinerManager.resources.refresh()); + btnRefresh.setScale(ButtonScale.SMALL); + btnRefresh.setIconAlign(IconAlign.LEFT); + btnRefresh.setToolTip("Refresh"); + btnRefresh.addSelectHandler(new SelectHandler() { + + @Override + public void onSelect(SelectEvent event) { + refreshWSResourceExplorerPanel(); + } + + }); + + btnResubmit = new TextButton("Resubmit"); + btnResubmit.setIcon(DataMinerManager.resources.resubmit()); + btnResubmit.setScale(ButtonScale.SMALL); + btnResubmit.setIconAlign(IconAlign.LEFT); + btnResubmit.setToolTip("Resubmit"); + btnResubmit.addSelectHandler(new SelectHandler() { + + @Override + public void onSelect(SelectEvent event) { + resubmitComputation(); + } + + }); + + btnCancel = new TextButton("Cancel"); + btnCancel.setIcon(DataMinerManager.resources.cancelCircle()); + btnCancel.setScale(ButtonScale.SMALL); + btnCancel.setIconAlign(IconAlign.LEFT); + btnCancel.setToolTip("Cancel"); + btnCancel.addSelectHandler(new SelectHandler() { + + @Override + public void onSelect(SelectEvent event) { + cancelComputation(); + } + + }); + + final ToolBar toolBar = new ToolBar(); + toolBar.add(btnShow, new BoxLayoutData(new Margins(0))); + toolBar.add(btnDownload, new BoxLayoutData(new Margins(0))); + toolBar.add(btnDelete, new BoxLayoutData(new Margins(0))); + toolBar.add(btnRefresh, new BoxLayoutData(new Margins(0))); + toolBar.add(btnResubmit, new BoxLayoutData(new Margins(0))); + toolBar.add(btnCancel, new BoxLayoutData(new Margins(0))); + + v = new VerticalLayoutContainer(); + + v.add(toolBar, new VerticalLayoutData(1, -1, new Margins(0))); + v.add(dnd, new VerticalLayoutData(1, 1, new Margins(0))); + add(v); + + v.addResizeHandler(new ResizeHandler() { + + @Override + public void onResize(ResizeEvent event) { + int scrollBarHeight = event.getHeight() + - toolBar.getElement().getHeight(false); + Log.debug("ScrollBarHeight: " + scrollBarHeight); + wsResourcesExplorerPanel + .setHeightToInternalScroll(scrollBarHeight); + forceLayout(); + + } + }); + forceLayout(); + + } catch (Exception e) { + Log.error("Error opening wsResourceExplorerPanel"); + e.printStackTrace(); + } + } + + private void refreshWSResourceExplorerPanel() { + if (wsResourcesExplorerPanel != null) { + wsResourcesExplorerPanel.refreshRootFolderView(); + } + } + + private void refreshWSResourceExplorerPanel(DataMinerWorkAreaEvent event) { + try { + + if (v != null) { + remove(v); + create(event); + } else { + create(event); + } + + } catch (Throwable e) { + Log.error("Error in ComputationsPanel: " + e.getLocalizedMessage()); + e.printStackTrace(); + } + } + + private void deleteItem(SelectEvent event) { + ItemDescription itemDescription = new ItemDescription( + selectedItem.getId(), selectedItem.getName(), + selectedItem.getOwner(), selectedItem.getPath(), selectedItem + .getType().name()); + DeleteItemRequestEvent deleteItemEvent = new DeleteItemRequestEvent( + DataMinerWorkAreaElementType.Computations, itemDescription); + EventBusProvider.INSTANCE.fireEvent(deleteItemEvent); + Log.debug("Fired: " + deleteItemEvent); + } + + private void showComputation() { + if (selectedItem != null) { + + final ItemDescription itemDescription = new ItemDescription( + selectedItem.getId(), selectedItem.getName(), + selectedItem.getOwner(), selectedItem.getPath(), + selectedItem.getType().name()); + + ComputationDataRequestEvent event = new ComputationDataRequestEvent( + itemDescription); + EventBusProvider.INSTANCE.fireEvent(event); + + } else { + UtilsGXT3.info("Attention", "Select a computation!"); + } + + } + + private void downloadFile() { + if (selectedItem != null) { + if (selectedItem.isFolder()) { + StringBuilder actionUrl = new StringBuilder(); + actionUrl.append(GWT.getModuleBaseURL()); + actionUrl + .append(Constants.DOWNLOAD_FOLDER_SERVLET + + "?" + + Constants.DOWNLOAD_FOLDER_SERVLET_ITEM_ID_PARAMETER + + "=" + + selectedItem.getId() + + "&" + + Constants.DOWNLOAD_FOLDER_SERVLET_FOLDER_NAME_PARAMETER + + "=" + selectedItem.getName() + "&" + + Constants.CURR_GROUP_ID + "=" + + GCubeClientContext.getCurrentContextId()); + + Log.debug("Retrieved link: " + actionUrl); + Window.open(actionUrl.toString(), selectedItem.getName(), ""); + + } else { + + final ItemDescription itemDescription = new ItemDescription( + selectedItem.getId(), selectedItem.getName(), + selectedItem.getOwner(), selectedItem.getPath(), + selectedItem.getType().name()); + + DataMinerPortletServiceAsync.INSTANCE.getPublicLink( + itemDescription, new AsyncCallback() { + + @Override + public void onFailure(Throwable caught) { + if (caught instanceof SessionExpiredServiceException) { + EventBusProvider.INSTANCE + .fireEvent(new SessionExpiredEvent()); + } else { + Log.error("Error open file: " + + caught.getLocalizedMessage()); + UtilsGXT3.alert("Error", + caught.getLocalizedMessage()); + } + caught.printStackTrace(); + + } + + @Override + public void onSuccess(String link) { + Log.debug("Retrieved link: " + link); + Window.open(link, itemDescription.getName(), ""); + } + + }); + } + } else { + UtilsGXT3.info("Attention", "Select a file!"); + } + + } + + private void cancelComputation() { + if (selectedItem != null) { + ItemDescription itemDescription = new ItemDescription( + selectedItem.getId(), selectedItem.getName(), + selectedItem.getOwner(), selectedItem.getPath(), + selectedItem.getType().name()); + CancelExecutionFromComputationsRequestEvent cancelComputationEvent = new CancelExecutionFromComputationsRequestEvent( + itemDescription); + EventBusProvider.INSTANCE.fireEvent(cancelComputationEvent); + Log.debug("Fired: " + cancelComputationEvent); + } else { + UtilsGXT3.info("Attention", "Select a computation!"); + } + } + + private void resubmitComputation() { + if (selectedItem != null) { + ItemDescription itemDescription = new ItemDescription( + selectedItem.getId(), selectedItem.getName(), + selectedItem.getOwner(), selectedItem.getPath(), + selectedItem.getType().name()); + ResubmitComputationExecutionRequestEvent resubmitComputationEvent = new ResubmitComputationExecutionRequestEvent( + itemDescription); + EventBusProvider.INSTANCE.fireEvent(resubmitComputationEvent); + Log.debug("Fired: " + resubmitComputationEvent); + } else { + UtilsGXT3.info("Attention", "Select a computation!"); + } + + } + +} diff --git a/src/main/java/org/gcube/portlets/widgets/dataminermanagerwidget/client/computations/ComputationsPanel.java b/src/main/java/org/gcube/portlets/widgets/dataminermanagerwidget/client/computations/ComputationsPanel.java new file mode 100644 index 0000000..7ebeaf6 --- /dev/null +++ b/src/main/java/org/gcube/portlets/widgets/dataminermanagerwidget/client/computations/ComputationsPanel.java @@ -0,0 +1,206 @@ +/** + * + */ +package org.gcube.portlets.widgets.dataminermanagerwidget.client.computations; + +import java.util.ArrayList; + +import org.gcube.portlets.widgets.dataminermanagerwidget.client.DataMinerManager; +import org.gcube.portlets.widgets.dataminermanagerwidget.client.common.EventBusProvider; +import org.gcube.portlets.widgets.dataminermanagerwidget.client.events.ComputationDataEvent; +import org.gcube.portlets.widgets.dataminermanagerwidget.client.events.DataMinerWorkAreaEvent; +import org.gcube.portlets.widgets.dataminermanagerwidget.client.events.RefreshDataMinerWorkAreaEvent; +import org.gcube.portlets.widgets.dataminermanagerwidget.client.util.UtilsGXT3; + +import com.allen_sauer.gwt.log.client.Log; +import com.sencha.gxt.widget.core.client.TabItemConfig; +import com.sencha.gxt.widget.core.client.TabPanel; +import com.sencha.gxt.widget.core.client.container.MarginData; +import com.sencha.gxt.widget.core.client.container.SimpleContainer; + +/** + * + * @author Giancarlo Panichi email: g.panichi@isti.cnr.it + * + */ +public class ComputationsPanel extends SimpleContainer { + private ArrayList computationsViewers; + + private ComputationsExecutedPanel computationsExecutedPanel; + private TabPanel computationsTabPanel; + + public ComputationsPanel() { + super(); + Log.debug("ComputationsPanel"); + init(); + create(); + bind(); + } + + private void init() { + + } + + private void bind() { + EventBusProvider.INSTANCE.addHandler(ComputationDataEvent.getType(), + new ComputationDataEvent.ComputationDataEventHandler() { + + @Override + public void onComputationData(ComputationDataEvent event) { + Log.debug("Catch ComputationDataEvent: " + event); + addComputationsViewerPanel(event); + + } + + }); + + EventBusProvider.INSTANCE.addHandler(DataMinerWorkAreaEvent.TYPE, + new DataMinerWorkAreaEvent.DataMinerWorkAreaEventHandler() { + + @Override + public void onChange(DataMinerWorkAreaEvent event) { + manageDataMinerWorkAreaEvents(event); + + } + + }); + + EventBusProvider.INSTANCE + .addHandler( + RefreshDataMinerWorkAreaEvent.TYPE, + new RefreshDataMinerWorkAreaEvent.RefreshDataMinerWorkAreaEventHandler() { + + @Override + public void onRefresh( + RefreshDataMinerWorkAreaEvent event) { + Log.debug("Catch RefreshDataMinerWorkAreaEvent: " + + event); + manageRefreshDataMinerWorkAreaEvents(event); + } + + }); + + } + + private void manageDataMinerWorkAreaEvents(DataMinerWorkAreaEvent event) { + Log.debug("ComputationsPanel recieved DataMinerWorkAreaEvent: " + event); + if (event == null) { + Log.error("DataMinerWorkAreaEvent null"); + return; + } + switch (event.getDataMinerWorkAreaRegionType()) { + case Computations: + closeAllComputationsViewer(); + break; + case DataSets: + break; + default: + break; + + } + + } + + private void manageRefreshDataMinerWorkAreaEvents( + RefreshDataMinerWorkAreaEvent event) { + Log.debug("ComputationsPanel recieved RefreshDataMinerWorkAreaEvent: " + + event); + if (event == null) { + Log.error("RefreshDataMinerWorkAreaEvent null"); + return; + } + switch (event.getDataMinerWorkAreaElementType()) { + case Computations: + closeAllComputationsViewer(); + break; + case InputDataSets: + break; + case OutputDataSets: + break; + default: + break; + } + + } + + private void create() { + computationsViewers = new ArrayList<>(); + computationsExecutedPanel = new ComputationsExecutedPanel(); + + computationsTabPanel = new TabPanel(); + computationsTabPanel.setTabScroll(true); + computationsTabPanel.setBorders(false); + computationsTabPanel.setBodyBorder(false); + + TabItemConfig computationsExecutedItemConf = new TabItemConfig( + "List of Computations", false); + + computationsExecutedItemConf.setIcon(DataMinerManager.resources + .folderExplore()); + + computationsTabPanel.add(computationsExecutedPanel, + computationsExecutedItemConf); + + computationsTabPanel.setActiveWidget(computationsExecutedPanel); + + add(computationsTabPanel, new MarginData(0)); + + } + + private void addComputationsViewerPanel(ComputationDataEvent event) { + if (event == null || event.getComputationData() == null) { + Log.error("Invalid ComputationDataEvent: " + event); + UtilsGXT3.alert("Error", "Invalid ComputationDataEvent: " + event); + return; + } + + if (event.getComputationData().getComputationId() == null) { + Log.error("Invalid ComputationId: " + + event.getComputationData().getComputationId()); + UtilsGXT3.alert("Error", "Invalid ComputationId: " + + event.getComputationData().getComputationId()); + + return; + } + + if (event.getComputationData().getComputationId().getId() == null + || event.getComputationData().getComputationId().getId() + .isEmpty()) { + Log.error("Invalid Computation id: " + + event.getComputationData().getComputationId().getId()); + UtilsGXT3.alert("Error", "Invalid Computation id: " + + event.getComputationData().getComputationId().getId()); + return; + } + + + + ComputationsViewerPanel computationsViewerPanel = new ComputationsViewerPanel( + event.getComputationData()); + computationsViewers.add(computationsViewerPanel); + TabItemConfig computationsViewerItemConf = new TabItemConfig(event + .getComputationData().getComputationId().getId(), true); + computationsViewerItemConf.setIcon(DataMinerManager.resources + .folderExplore()); + computationsTabPanel.add(computationsViewerPanel, + computationsViewerItemConf); + + computationsTabPanel.setActiveWidget(computationsViewerPanel); + + computationsTabPanel.forceLayout(); + forceLayout(); + } + + private void closeAllComputationsViewer() { + for (ComputationsViewerPanel view : computationsViewers) { + if (computationsTabPanel.getWidgetIndex(view) != -1) { + computationsTabPanel.remove(view); + } + } + computationsViewers.clear(); + computationsTabPanel.forceLayout(); + forceLayout(); + } + +} diff --git a/src/main/java/org/gcube/portlets/widgets/dataminermanagerwidget/client/computations/ComputationsPropertiesType.java b/src/main/java/org/gcube/portlets/widgets/dataminermanagerwidget/client/computations/ComputationsPropertiesType.java new file mode 100644 index 0000000..b5d647f --- /dev/null +++ b/src/main/java/org/gcube/portlets/widgets/dataminermanagerwidget/client/computations/ComputationsPropertiesType.java @@ -0,0 +1,45 @@ +package org.gcube.portlets.widgets.dataminermanagerwidget.client.computations; + +/** + * + * @author Giancarlo Panichi email: g.panichi@isti.cnr.it + * + */ +public enum ComputationsPropertiesType { + OPERATOR_NAME("operator_name"), START_DATE("start_date"), END_DATE( + "end_date"), STATUS("status"), EXECUTION_TYPE("execution_platform"), VRE( + "VRE"); + + // COMPUTATION_ID("computation_id"), + // OPERATOR_DESCRIPTION("operator_description"), + // ERROR("error"), + // EXECUTION_PLATFORM("execution_platform") + /** + * @param text + */ + private ComputationsPropertiesType(final String id) { + this.id = id; + } + + private final String id; + + @Override + public String toString() { + return id; + } + + public String getLabel() { + return id; + } + + public static ComputationsPropertiesType getFromId(String id) { + for (ComputationsPropertiesType prop : values()) { + if (prop.id.compareToIgnoreCase(id) == 0) { + return prop; + } + } + return null; + } + +} diff --git a/src/main/java/org/gcube/portlets/widgets/dataminermanagerwidget/client/computations/ComputationsViewerPanel.java b/src/main/java/org/gcube/portlets/widgets/dataminermanagerwidget/client/computations/ComputationsViewerPanel.java new file mode 100644 index 0000000..a0c385a --- /dev/null +++ b/src/main/java/org/gcube/portlets/widgets/dataminermanagerwidget/client/computations/ComputationsViewerPanel.java @@ -0,0 +1,379 @@ +package org.gcube.portlets.widgets.dataminermanagerwidget.client.computations; + +import java.util.LinkedHashMap; + +import org.gcube.data.analysis.dataminermanagercl.shared.data.computations.ComputationData; +import org.gcube.data.analysis.dataminermanagercl.shared.data.computations.ComputationValue; +import org.gcube.data.analysis.dataminermanagercl.shared.data.computations.ComputationValueFile; +import org.gcube.data.analysis.dataminermanagercl.shared.data.computations.ComputationValueFileList; +import org.gcube.data.analysis.dataminermanagercl.shared.data.computations.ComputationValueImage; +import org.gcube.portlets.widgets.dataminermanagerwidget.client.util.UtilsGXT3; + +import com.allen_sauer.gwt.log.client.Log; +import com.google.gwt.dom.client.Style.Unit; +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.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.form.FieldLabel; +import com.sencha.gxt.widget.core.client.form.FieldSet; +import com.sencha.gxt.widget.core.client.form.TextArea; +import com.sencha.gxt.widget.core.client.form.TextField; + +/** + * + * @author Giancarlo Panichi email: g.panichi@isti.cnr.it + * + */ +public class ComputationsViewerPanel extends FramedPanel { + + private VerticalLayoutContainer v; + private ComputationData computationData; + + public ComputationsViewerPanel(ComputationData computationData) { + super(); + Log.debug("ComputationsViewerPanel"); + this.computationData = computationData; + Log.debug("ComputationData: " + computationData); + init(); + create(); + + } + + private void init() { + setItemId("ComputationsViewerPanel"); + forceLayoutOnResize = true; + setBodyBorder(false); + setBorders(false); + setBodyStyle("backgroundColor:white;"); + setHeaderVisible(false); + setResize(true); + setHeadingText("Computations Viewer"); + setBodyStyle("backgroundColor:white;"); + + } + + private void create() { + try { + v = new VerticalLayoutContainer(); + v.setScrollMode(ScrollMode.AUTO); + add(v); + createView(); + forceLayout(); + } catch (Throwable e) { + Log.error("Error creating ComputationsViewerPanel: " + + e.getLocalizedMessage()); + e.printStackTrace(); + } + } + + private void createView() { + + if (computationData == null) { + Log.error("ComputationData is null!"); + UtilsGXT3.alert("Error", + "No information on computation is retrieved!"); + return; + } + + if (computationData.getComputationId() == null + || computationData.getComputationId().getId() == null + || computationData.getComputationId().getId().isEmpty()) { + Log.error("Error in computationId: " + computationData); + UtilsGXT3.alert("Error", + "No information on computation id is retrieved!"); + return; + } + + SimpleContainer sectionTitle = new SimpleContainer(); + // title + HtmlLayoutContainer title = new HtmlLayoutContainer( + "
Computation Report of " + + computationData.getComputationId().getId() + + "
"); + sectionTitle.add(title, new MarginData()); + sectionTitle.getElement().getStyle().setMarginRight(20, Unit.PX); + // v.add(sectionTitle, new VerticalLayoutData(1, -1, new + // Margins(0))); + v.add(sectionTitle, new VerticalLayoutData(-1, -1, new Margins(10))); + + if (computationData.getOutputParameters() != null + && !computationData.getOutputParameters().isEmpty()) { + FieldSet outputFieldSet = outputView(); + v.add(outputFieldSet, new VerticalLayoutData(-1, -1, + new Margins(10))); + } + + if (computationData.getInputParameters() != null + && !computationData.getInputParameters().isEmpty()) { + FieldSet inputFieldSet = inputView(); + v.add(inputFieldSet, + new VerticalLayoutData(-1, -1, new Margins(10))); + } + + FieldSet detailsFieldSet = detailsView(); + v.add(detailsFieldSet, new VerticalLayoutData(-1, -1, new Margins(10))); + + FieldSet operatorFieldSet = operatorView(); + v.add(operatorFieldSet, new VerticalLayoutData(-1, -1, new Margins(10))); + + } + + private FieldSet operatorView() { + try { + + VerticalLayoutContainer operatorVBox = new VerticalLayoutContainer(); + TextField operatorNameField = new TextField(); + operatorNameField.setValue(computationData.getComputationId() + .getOperatorName()); + operatorNameField.setReadOnly(true); + FieldLabel operatorNameLabel = new FieldLabel(operatorNameField, + "Operator Name"); + operatorNameLabel.setLabelWidth(200); + operatorNameLabel.setLabelWordWrap(true); + operatorVBox.add(operatorNameLabel, new VerticalLayoutData(1, -1, + new Margins(0, 4, 0, 4))); + + TextArea operatorDescriptionField = new TextArea(); + operatorDescriptionField.setHeight(40); + operatorDescriptionField.setValue(computationData + .getOperatorDescription()); + operatorDescriptionField.setReadOnly(true); + FieldLabel operatorDescriptionLabel = new FieldLabel( + operatorDescriptionField, "Operator Description"); + operatorDescriptionLabel.setLabelWidth(200); + operatorDescriptionLabel.setLabelWordWrap(true); + operatorDescriptionLabel.setHeight(65); + operatorVBox.add(operatorDescriptionLabel, new VerticalLayoutData( + 1, -1, new Margins(0, 5, 0, 5))); + + FieldSet operatorFieldSet = new FieldSet(); + operatorFieldSet.setHeadingText("Operator Details"); + operatorFieldSet.setCollapsible(true); + operatorFieldSet.setHeight(130); + operatorFieldSet.add(operatorVBox); + operatorFieldSet.getElement().getStyle() + .setMarginBottom(120, Unit.PX); + operatorFieldSet.getElement().getStyle() + .setMarginRight(20, Unit.PX); + return operatorFieldSet; + } catch (Throwable e) { + Log.error("Error in ComputationsViewerPanel in operator: " + + e.getLocalizedMessage()); + e.printStackTrace(); + throw e; + } + } + + private FieldSet detailsView() { + try { + VerticalLayoutContainer detailsVBox = new VerticalLayoutContainer(); + TextField startDateField = new TextField(); + startDateField.setValue(computationData.getStartDate()); + startDateField.setReadOnly(true); + FieldLabel startDateLabel = new FieldLabel(startDateField, + "Start Date"); + startDateLabel.setLabelWidth(200); + startDateLabel.setLabelWordWrap(true); + detailsVBox.add(startDateLabel, new VerticalLayoutData(1, -1, + new Margins(0, 4, 0, 4))); + + TextField endDateField = new TextField(); + endDateField.setValue(computationData.getEndDate()); + endDateField.setReadOnly(true); + FieldLabel endDateLabel = new FieldLabel(endDateField, "End Date"); + endDateLabel.setLabelWidth(200); + endDateLabel.setLabelWordWrap(true); + detailsVBox.add(endDateLabel, new VerticalLayoutData(1, -1, + new Margins(0, 4, 0, 4))); + + TextField statusField = new TextField(); + statusField.setValue(computationData.getStatus()); + statusField.setReadOnly(true); + FieldLabel statusLabel = new FieldLabel(statusField, "Status"); + statusLabel.setLabelWidth(200); + statusLabel.setLabelWordWrap(true); + detailsVBox.add(statusLabel, new VerticalLayoutData(1, -1, + new Margins(0, 4, 0, 4))); + + TextField vreField = new TextField(); + vreField.setValue(computationData.getVre()); + vreField.setReadOnly(true); + FieldLabel vreLabel = new FieldLabel(vreField, "VRE"); + vreLabel.setLabelWidth(200); + vreLabel.setLabelWordWrap(true); + detailsVBox.add(vreLabel, new VerticalLayoutData(1, -1, + new Margins(0, 4, 0, 4))); + + FieldSet detailsFieldSet = new FieldSet(); + detailsFieldSet.setHeadingText("Computation Details"); + detailsFieldSet.setCollapsible(true); + detailsFieldSet.add(detailsVBox); + detailsFieldSet.getElement().getStyle().setMarginRight(20, Unit.PX); + return detailsFieldSet; + } catch (Throwable e) { + Log.error("Error in ComputationsViewerPanel in details: " + + e.getLocalizedMessage()); + e.printStackTrace(); + throw e; + } + } + + private FieldSet inputView() { + try { + VerticalLayoutContainer inputVBox = new VerticalLayoutContainer(); + LinkedHashMap input = computationData + .getInputParameters(); + for (String key : input.keySet()) { + ComputationValue computationValue = input.get(key); + Log.debug("Input: [key=" + key + ", ComputationValue=" + + computationValue + "]"); + FieldLabel fieldLabel = null; + SimpleContainer simpleContainer; + if(computationValue==null){ + TextField textField = new TextField(); + textField.setReadOnly(true); + fieldLabel = new FieldLabel(textField, key); + fieldLabel.setLabelWidth(200); + fieldLabel.setLabelWordWrap(true); + inputVBox.add(fieldLabel, new VerticalLayoutData(1, -1, + new Margins(0, 4, 0, 4))); + continue; + } + + + switch (computationValue.getType()) { + case File: + ComputationValueFile computationValueFile = (ComputationValueFile) computationValue; + simpleContainer = new ComputationValueFilePanel( + computationValueFile); + fieldLabel = new FieldLabel(simpleContainer, key); + fieldLabel.setLabelWidth(200); + fieldLabel.setLabelWordWrap(true); + break; + case Image: + ComputationValueImage computationValueImage = (ComputationValueImage) computationValue; + simpleContainer = new ComputationValueImagePanel( + computationValueImage); + fieldLabel = new FieldLabel(simpleContainer, key); + fieldLabel.setLabelWidth(200); + fieldLabel.setLabelWordWrap(true); + break; + case FileList: + ComputationValueFileList computationValueFileList = (ComputationValueFileList) computationValue; + simpleContainer = new ComputationValueFileListPanel( + computationValueFileList); + fieldLabel = new FieldLabel(simpleContainer, key); + fieldLabel.setLabelWidth(200); + fieldLabel.setLabelWordWrap(true); + break; + case String: + default: + TextField textField = new TextField(); + textField.setValue(computationValue.getValue()); + textField.setReadOnly(true); + fieldLabel = new FieldLabel(textField, key); + fieldLabel.setLabelWidth(200); + fieldLabel.setLabelWordWrap(true); + break; + + } + inputVBox.add(fieldLabel, new VerticalLayoutData(1, -1, + new Margins(0, 4, 0, 4))); + } + + FieldSet inputFieldSet = new FieldSet(); + inputFieldSet.setHeadingText("Input Parameters"); + inputFieldSet.setCollapsible(true); + inputFieldSet.add(inputVBox); + inputFieldSet.getElement().getStyle().setMarginRight(20, Unit.PX); + return inputFieldSet; + } catch (Throwable e) { + Log.error("Error in ComputationsViewerPanel creating input view: " + + e.getLocalizedMessage()); + e.printStackTrace(); + throw e; + } + } + + private FieldSet outputView() { + try { + VerticalLayoutContainer outputVBox = new VerticalLayoutContainer(); + LinkedHashMap output = computationData + .getOutputParameters(); + for (String key : output.keySet()) { + ComputationValue computationValue = output.get(key); + Log.debug("Output: [key=" + key + ", ComputationValue=" + + computationValue + "]"); + FieldLabel fieldLabel = null; + SimpleContainer simpleContainer; + if(computationValue==null){ + TextField textField = new TextField(); + textField.setReadOnly(true); + fieldLabel = new FieldLabel(textField, key); + fieldLabel.setLabelWidth(200); + fieldLabel.setLabelWordWrap(true); + outputVBox.add(fieldLabel, new VerticalLayoutData(1, -1, + new Margins(0, 4, 0, 4))); + continue; + } + + switch (computationValue.getType()) { + case File: + ComputationValueFile computationValueFile = (ComputationValueFile) computationValue; + simpleContainer = new ComputationValueFilePanel( + computationValueFile); + fieldLabel = new FieldLabel(simpleContainer, key); + fieldLabel.setLabelWidth(200); + fieldLabel.setLabelWordWrap(true); + break; + case Image: + ComputationValueImage computationValueImage = (ComputationValueImage) computationValue; + simpleContainer = new ComputationValueImagePanel( + computationValueImage); + fieldLabel = new FieldLabel(simpleContainer, key); + fieldLabel.setLabelWidth(200); + fieldLabel.setLabelWordWrap(true); + break; + case FileList: + ComputationValueFileList computationValueFileList = (ComputationValueFileList) computationValue; + simpleContainer = new ComputationValueFileListPanel( + computationValueFileList); + fieldLabel = new FieldLabel(simpleContainer, key); + fieldLabel.setLabelWidth(200); + fieldLabel.setLabelWordWrap(true); + case String: + default: + TextField textField = new TextField(); + textField.setValue(computationValue.getValue()); + textField.setReadOnly(true); + fieldLabel = new FieldLabel(textField, key); + fieldLabel.setLabelWidth(200); + fieldLabel.setLabelWordWrap(true); + break; + + } + outputVBox.add(fieldLabel, new VerticalLayoutData(1, -1, + new Margins(0, 4, 0, 4))); + } + + FieldSet outputFieldSet = new FieldSet(); + outputFieldSet.setHeadingText("Output Result"); + outputFieldSet.setCollapsible(true); + outputFieldSet.add(outputVBox); + outputFieldSet.getElement().getStyle().setMarginRight(20, Unit.PX); + return outputFieldSet; + } catch (Throwable e) { + Log.error("Error in ComputationsViewerPanel creating output view: " + + e.getLocalizedMessage()); + e.printStackTrace(); + throw e; + } + } + +} diff --git a/src/main/java/org/gcube/portlets/widgets/dataminermanagerwidget/client/custom/Gxt2ZIndexXDOM.java b/src/main/java/org/gcube/portlets/widgets/dataminermanagerwidget/client/custom/Gxt2ZIndexXDOM.java new file mode 100644 index 0000000..028f349 --- /dev/null +++ b/src/main/java/org/gcube/portlets/widgets/dataminermanagerwidget/client/custom/Gxt2ZIndexXDOM.java @@ -0,0 +1,21 @@ +package org.gcube.portlets.widgets.dataminermanagerwidget.client.custom; + +/** + * Fix for z-index bug between GXT3 and GXT2 + * + * @author giancarlo email: g.panichi@isti.cnr.it + * + */ +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/widgets/dataminermanagerwidget/client/custom/progress/GreenProgressBar.css b/src/main/java/org/gcube/portlets/widgets/dataminermanagerwidget/client/custom/progress/GreenProgressBar.css new file mode 100644 index 0000000..1e27d40 --- /dev/null +++ b/src/main/java/org/gcube/portlets/widgets/dataminermanagerwidget/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/widgets/dataminermanagerwidget/client/custom/progress/GreenProgressBar.html b/src/main/java/org/gcube/portlets/widgets/dataminermanagerwidget/client/custom/progress/GreenProgressBar.html new file mode 100644 index 0000000..84e6165 --- /dev/null +++ b/src/main/java/org/gcube/portlets/widgets/dataminermanagerwidget/client/custom/progress/GreenProgressBar.html @@ -0,0 +1,12 @@ +
+
+
+
+
{text}
+
+
+
{text}
+
+
+
+
diff --git a/src/main/java/org/gcube/portlets/widgets/dataminermanagerwidget/client/custom/progress/GreenProgressBar.java b/src/main/java/org/gcube/portlets/widgets/dataminermanagerwidget/client/custom/progress/GreenProgressBar.java new file mode 100644 index 0000000..8bad886 --- /dev/null +++ b/src/main/java/org/gcube/portlets/widgets/dataminermanagerwidget/client/custom/progress/GreenProgressBar.java @@ -0,0 +1,18 @@ +package org.gcube.portlets.widgets.dataminermanagerwidget.client.custom.progress; + +import com.sencha.gxt.cell.core.client.ProgressBarCell; +import com.sencha.gxt.widget.core.client.ProgressBar; + +/** + * + * @author Giancarlo Panichi email: g.panichi@isti.cnr.it + * + */ +public class GreenProgressBar extends ProgressBar { + + public GreenProgressBar() { + super(new ProgressBarCell(new GreenProgressBarAppearance())); + } + +} diff --git a/src/main/java/org/gcube/portlets/widgets/dataminermanagerwidget/client/custom/progress/GreenProgressBarAppearance.java b/src/main/java/org/gcube/portlets/widgets/dataminermanagerwidget/client/custom/progress/GreenProgressBarAppearance.java new file mode 100644 index 0000000..eabd9fc --- /dev/null +++ b/src/main/java/org/gcube/portlets/widgets/dataminermanagerwidget/client/custom/progress/GreenProgressBarAppearance.java @@ -0,0 +1,132 @@ +package org.gcube.portlets.widgets.dataminermanagerwidget.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 email: g.panichi@isti.cnr.it + * + */ +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/widgets/dataminermanagerwidget/client/custom/progress/OrangeProgressBar.css b/src/main/java/org/gcube/portlets/widgets/dataminermanagerwidget/client/custom/progress/OrangeProgressBar.css new file mode 100644 index 0000000..f98a880 --- /dev/null +++ b/src/main/java/org/gcube/portlets/widgets/dataminermanagerwidget/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/widgets/dataminermanagerwidget/client/custom/progress/OrangeProgressBar.html b/src/main/java/org/gcube/portlets/widgets/dataminermanagerwidget/client/custom/progress/OrangeProgressBar.html new file mode 100644 index 0000000..cfefcb6 --- /dev/null +++ b/src/main/java/org/gcube/portlets/widgets/dataminermanagerwidget/client/custom/progress/OrangeProgressBar.html @@ -0,0 +1,12 @@ +
+
+
+
+
{text}
+
+
+
{text}
+
+
+
+
diff --git a/src/main/java/org/gcube/portlets/widgets/dataminermanagerwidget/client/custom/progress/OrangeProgressBar.java b/src/main/java/org/gcube/portlets/widgets/dataminermanagerwidget/client/custom/progress/OrangeProgressBar.java new file mode 100644 index 0000000..64b4a5d --- /dev/null +++ b/src/main/java/org/gcube/portlets/widgets/dataminermanagerwidget/client/custom/progress/OrangeProgressBar.java @@ -0,0 +1,18 @@ +package org.gcube.portlets.widgets.dataminermanagerwidget.client.custom.progress; + +import com.sencha.gxt.cell.core.client.ProgressBarCell; +import com.sencha.gxt.widget.core.client.ProgressBar; + +/** + * + * @author Giancarlo Panichi email: g.panichi@isti.cnr.it + * + */ +public class OrangeProgressBar extends ProgressBar { + + public OrangeProgressBar() { + super(new ProgressBarCell(new OrangeProgressBarAppearance())); + } + +} diff --git a/src/main/java/org/gcube/portlets/widgets/dataminermanagerwidget/client/custom/progress/OrangeProgressBarAppearance.java b/src/main/java/org/gcube/portlets/widgets/dataminermanagerwidget/client/custom/progress/OrangeProgressBarAppearance.java new file mode 100644 index 0000000..8c9c7cb --- /dev/null +++ b/src/main/java/org/gcube/portlets/widgets/dataminermanagerwidget/client/custom/progress/OrangeProgressBarAppearance.java @@ -0,0 +1,132 @@ +package org.gcube.portlets.widgets.dataminermanagerwidget.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 email: g.panichi@isti.cnr.it + * + */ +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/widgets/dataminermanagerwidget/client/custom/progress/RedProgressBar.css b/src/main/java/org/gcube/portlets/widgets/dataminermanagerwidget/client/custom/progress/RedProgressBar.css new file mode 100644 index 0000000..306668e --- /dev/null +++ b/src/main/java/org/gcube/portlets/widgets/dataminermanagerwidget/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/widgets/dataminermanagerwidget/client/custom/progress/RedProgressBar.html b/src/main/java/org/gcube/portlets/widgets/dataminermanagerwidget/client/custom/progress/RedProgressBar.html new file mode 100644 index 0000000..918b724 --- /dev/null +++ b/src/main/java/org/gcube/portlets/widgets/dataminermanagerwidget/client/custom/progress/RedProgressBar.html @@ -0,0 +1,12 @@ +
+
+
+
+
{text}
+
+
+
{text}
+
+
+
+
diff --git a/src/main/java/org/gcube/portlets/widgets/dataminermanagerwidget/client/custom/progress/RedProgressBar.java b/src/main/java/org/gcube/portlets/widgets/dataminermanagerwidget/client/custom/progress/RedProgressBar.java new file mode 100644 index 0000000..98f79d1 --- /dev/null +++ b/src/main/java/org/gcube/portlets/widgets/dataminermanagerwidget/client/custom/progress/RedProgressBar.java @@ -0,0 +1,18 @@ +package org.gcube.portlets.widgets.dataminermanagerwidget.client.custom.progress; + +import com.sencha.gxt.cell.core.client.ProgressBarCell; +import com.sencha.gxt.widget.core.client.ProgressBar; + +/** + * + * @author Giancarlo Panichi email: g.panichi@isti.cnr.it + * + */ +public class RedProgressBar extends ProgressBar { + + public RedProgressBar() { + super(new ProgressBarCell(new RedProgressBarAppearance())); + } + +} diff --git a/src/main/java/org/gcube/portlets/widgets/dataminermanagerwidget/client/custom/progress/RedProgressBarAppearance.java b/src/main/java/org/gcube/portlets/widgets/dataminermanagerwidget/client/custom/progress/RedProgressBarAppearance.java new file mode 100644 index 0000000..542739e --- /dev/null +++ b/src/main/java/org/gcube/portlets/widgets/dataminermanagerwidget/client/custom/progress/RedProgressBarAppearance.java @@ -0,0 +1,132 @@ +package org.gcube.portlets.widgets.dataminermanagerwidget.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 email: g.panichi@isti.cnr.it + * + */ +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/widgets/dataminermanagerwidget/client/custom/progress/green-bg.gif b/src/main/java/org/gcube/portlets/widgets/dataminermanagerwidget/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/widgets/dataminermanagerwidget/client/custom/progress/green-bg.gif differ diff --git a/src/main/java/org/gcube/portlets/widgets/dataminermanagerwidget/client/custom/progress/green-progress-bg.gif b/src/main/java/org/gcube/portlets/widgets/dataminermanagerwidget/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/widgets/dataminermanagerwidget/client/custom/progress/green-progress-bg.gif differ diff --git a/src/main/java/org/gcube/portlets/widgets/dataminermanagerwidget/client/custom/progress/orange-bg.gif b/src/main/java/org/gcube/portlets/widgets/dataminermanagerwidget/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/widgets/dataminermanagerwidget/client/custom/progress/orange-bg.gif differ diff --git a/src/main/java/org/gcube/portlets/widgets/dataminermanagerwidget/client/custom/progress/orange-progress-bg.gif b/src/main/java/org/gcube/portlets/widgets/dataminermanagerwidget/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/widgets/dataminermanagerwidget/client/custom/progress/orange-progress-bg.gif differ diff --git a/src/main/java/org/gcube/portlets/widgets/dataminermanagerwidget/client/custom/progress/red-bg.gif b/src/main/java/org/gcube/portlets/widgets/dataminermanagerwidget/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/widgets/dataminermanagerwidget/client/custom/progress/red-bg.gif differ diff --git a/src/main/java/org/gcube/portlets/widgets/dataminermanagerwidget/client/custom/progress/red-progress-bg.gif b/src/main/java/org/gcube/portlets/widgets/dataminermanagerwidget/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/widgets/dataminermanagerwidget/client/custom/progress/red-progress-bg.gif differ diff --git a/src/main/java/org/gcube/portlets/widgets/dataminermanagerwidget/client/dataspace/DataSpacePanel.java b/src/main/java/org/gcube/portlets/widgets/dataminermanagerwidget/client/dataspace/DataSpacePanel.java new file mode 100644 index 0000000..01522e3 --- /dev/null +++ b/src/main/java/org/gcube/portlets/widgets/dataminermanagerwidget/client/dataspace/DataSpacePanel.java @@ -0,0 +1,62 @@ +/** + * + */ +package org.gcube.portlets.widgets.dataminermanagerwidget.client.dataspace; + +import org.gcube.portlets.widgets.dataminermanagerwidget.client.DataMinerManager; + +import com.sencha.gxt.widget.core.client.TabItemConfig; +import com.sencha.gxt.widget.core.client.TabPanel; +import com.sencha.gxt.widget.core.client.container.SimpleContainer; + +/** + * + * @author Giancarlo Panichi email: g.panichi@isti.cnr.it + * + */ +public class DataSpacePanel extends SimpleContainer { + + private TabPanel dataSpaceTabPanel; + private OutputDataSetsPanel outputDataSetsPanel; + private InputDataSetsPanel inputDataSetsPanel; + + public DataSpacePanel() { + super(); + init(); + create(); + } + + private void init() { + } + + private void create() { + outputDataSetsPanel = new OutputDataSetsPanel(); + inputDataSetsPanel = new InputDataSetsPanel(); + + dataSpaceTabPanel=new TabPanel(); + dataSpaceTabPanel.setBorders(false); + dataSpaceTabPanel.setBodyBorder(false); + + TabItemConfig outputDataItemConf = new TabItemConfig("Output Data Sets", + false); + outputDataItemConf.setIcon(DataMinerManager.resources + .folderExplore()); + + dataSpaceTabPanel.add(outputDataSetsPanel, outputDataItemConf); + + TabItemConfig inputDataSetsItemConf = new TabItemConfig( + "Input Data Sets", false); + inputDataSetsItemConf.setIcon(DataMinerManager.resources + .folderExplore()); + dataSpaceTabPanel.add(inputDataSetsPanel, inputDataSetsItemConf); + + dataSpaceTabPanel.setActiveWidget(outputDataSetsPanel); + + add(dataSpaceTabPanel); + + } + + + +} diff --git a/src/main/java/org/gcube/portlets/widgets/dataminermanagerwidget/client/dataspace/DataSpacePropertiesType.java b/src/main/java/org/gcube/portlets/widgets/dataminermanagerwidget/client/dataspace/DataSpacePropertiesType.java new file mode 100644 index 0000000..d5b2c2b --- /dev/null +++ b/src/main/java/org/gcube/portlets/widgets/dataminermanagerwidget/client/dataspace/DataSpacePropertiesType.java @@ -0,0 +1,39 @@ +package org.gcube.portlets.widgets.dataminermanagerwidget.client.dataspace; + +/** + * + * @author Giancarlo Panichi email: g.panichi@isti.cnr.it + * + */ +public enum DataSpacePropertiesType { + COMPUTATION_ID("computation_id"), DATA_DESCRIPTION("data_description"), DATA_TYPE( + "data_type"), OPERATOR_NAME("operator_name"), VRE("VRE"); + /** + * @param text + */ + private DataSpacePropertiesType(final String id) { + this.id = id; + } + + private final String id; + + @Override + public String toString() { + return id; + } + + public String getLabel() { + return id; + } + + public static DataSpacePropertiesType getFromId(String id) { + for (DataSpacePropertiesType prop : values()) { + if (prop.id.compareToIgnoreCase(id) == 0) { + return prop; + } + } + return null; + } + +} diff --git a/src/main/java/org/gcube/portlets/widgets/dataminermanagerwidget/client/dataspace/InputDataSetsPanel.java b/src/main/java/org/gcube/portlets/widgets/dataminermanagerwidget/client/dataspace/InputDataSetsPanel.java new file mode 100644 index 0000000..883f23e --- /dev/null +++ b/src/main/java/org/gcube/portlets/widgets/dataminermanagerwidget/client/dataspace/InputDataSetsPanel.java @@ -0,0 +1,471 @@ +package org.gcube.portlets.widgets.dataminermanagerwidget.client.dataspace; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import org.gcube.portal.clientcontext.client.GCubeClientContext; +import org.gcube.portlets.widgets.dataminermanagerwidget.client.DataMinerManager; +import org.gcube.portlets.widgets.dataminermanagerwidget.client.common.EventBusProvider; +import org.gcube.portlets.widgets.dataminermanagerwidget.client.events.DataMinerWorkAreaEvent; +import org.gcube.portlets.widgets.dataminermanagerwidget.client.events.DeleteItemRequestEvent; +import org.gcube.portlets.widgets.dataminermanagerwidget.client.events.RefreshDataMinerWorkAreaEvent; +import org.gcube.portlets.widgets.dataminermanagerwidget.client.events.SessionExpiredEvent; +import org.gcube.portlets.widgets.dataminermanagerwidget.client.events.UIStateEvent; +import org.gcube.portlets.widgets.dataminermanagerwidget.client.rpc.DataMinerPortletServiceAsync; +import org.gcube.portlets.widgets.dataminermanagerwidget.client.type.DataMinerWorkAreaElementType; +import org.gcube.portlets.widgets.dataminermanagerwidget.client.util.UtilsGXT3; +import org.gcube.portlets.widgets.dataminermanagerwidget.shared.Constants; +import org.gcube.portlets.widgets.dataminermanagerwidget.shared.exception.SessionExpiredServiceException; +import org.gcube.portlets.widgets.dataminermanagerwidget.shared.workspace.ItemDescription; +import org.gcube.portlets.widgets.workspaceuploader.client.WorkspaceUploadNotification.WorskpaceUploadNotificationListener; +import org.gcube.portlets.widgets.workspaceuploader.client.uploader.DialogUpload.UPLOAD_TYPE; +import org.gcube.portlets.widgets.workspaceuploader.client.uploader.dragdrop.MultipleDNDUpload; +import org.gcube.portlets.widgets.wsexplorer.client.explore.WorkspaceResourcesExplorerPanel; +import org.gcube.portlets.widgets.wsexplorer.client.notification.WorkspaceExplorerSelectNotification.WorskpaceExplorerSelectNotificationListener; +import org.gcube.portlets.widgets.wsexplorer.client.view.grid.ItemsTable.DISPLAY_FIELD; +import org.gcube.portlets.widgets.wsexplorer.shared.FilterCriteria; +import org.gcube.portlets.widgets.wsexplorer.shared.Item; + +import com.allen_sauer.gwt.log.client.Log; +import com.google.gwt.core.client.GWT; +import com.google.gwt.event.logical.shared.ResizeEvent; +import com.google.gwt.event.logical.shared.ResizeHandler; +import com.google.gwt.user.client.Window; +import com.google.gwt.user.client.rpc.AsyncCallback; +import com.sencha.gxt.cell.core.client.ButtonCell.ButtonScale; +import com.sencha.gxt.cell.core.client.ButtonCell.IconAlign; +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.BoxLayoutContainer.BoxLayoutData; +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.ToolBar; + +/** + * + * @author Giancarlo Panichi email: g.panichi@isti.cnr.it + * + */ +public class InputDataSetsPanel extends FramedPanel { + + private Item selectedItem; + private MultipleDNDUpload dnd; + private WorkspaceResourcesExplorerPanel wsResourcesExplorerPanel; + private TextButton btnDownload; + private TextButton btnDelete; + private TextButton btnRefresh; + private VerticalLayoutContainer v; + + public InputDataSetsPanel() { + super(); + Log.debug("InputDataSetsPanel"); + + // msgs = GWT.create(ServiceCategoryMessages.class); + init(); + bindToEvents(); + + } + + private void init() { + setItemId("InputDataSetsPanel"); + forceLayoutOnResize = true; + setBodyBorder(false); + setBorders(false); + setHeaderVisible(false); + setResize(true); + setAnimCollapse(false); + setCollapsible(true); + setHeadingText("Input Data Sets"); + setBodyStyle("backgroundColor:white;"); + } + + private void bindToEvents() { + + EventBusProvider.INSTANCE.addHandler(UIStateEvent.TYPE, + new UIStateEvent.UIStateEventHandler() { + + @Override + public void onChange(UIStateEvent event) { + manageStateEvents(event); + + } + }); + + EventBusProvider.INSTANCE.addHandler(DataMinerWorkAreaEvent.TYPE, + new DataMinerWorkAreaEvent.DataMinerWorkAreaEventHandler() { + + @Override + public void onChange(DataMinerWorkAreaEvent event) { + manageDataMinerWorkAreaEvents(event); + + } + + }); + + EventBusProvider.INSTANCE + .addHandler( + RefreshDataMinerWorkAreaEvent.TYPE, + new RefreshDataMinerWorkAreaEvent.RefreshDataMinerWorkAreaEventHandler() { + + @Override + public void onRefresh( + RefreshDataMinerWorkAreaEvent event) { + manageRefreshDataMinerWorkAreaEvents(event); + + } + + }); + + } + + private void manageStateEvents(UIStateEvent event) { + Log.debug("InputDataSetsPanel recieved UIStateEvent: " + event); + if (event == null) { + Log.error("UIStateEvent null"); + return; + } + switch (event.getUiStateType()) { + case START: + break; + case WAITING: + break; + case UPDATE: + break; + default: + break; + } + } + + private void manageDataMinerWorkAreaEvents(DataMinerWorkAreaEvent event) { + Log.debug("InputDataSetsPanel recieved DataMinerWorkAreaEvent: " + + event); + if (event == null) { + Log.error("DataMinerWorkAreaEvent"); + return; + } + switch (event.getDataMinerWorkAreaRegionType()) { + case Computations: + break; + case DataSets: + manageMyDataMinerWorkAreaEvents(event); + break; + default: + break; + + } + } + + private void manageMyDataMinerWorkAreaEvents(DataMinerWorkAreaEvent event) { + switch (event.getDataMinerWorkAreaEventType()) { + case OPEN: + case UPDATE: + refreshWSResourceExplorerPanel(event); + break; + default: + break; + } + + } + + private void manageRefreshDataMinerWorkAreaEvents( + RefreshDataMinerWorkAreaEvent event) { + Log.debug("InputDataSetsPanel recieved RefreshDataMinerWorkAreaEvent: " + + event); + if (event == null) { + Log.error("RefreshDataMinerWorkAreaEvent"); + return; + } + + switch (event.getDataMinerWorkAreaElementType()) { + case Computations: + break; + case InputDataSets: + refreshWSResourceExplorerPanel(); + break; + case OutputDataSets: + break; + default: + break; + } + + } + + private void create(DataMinerWorkAreaEvent event) { + try { + + if (event == null + || event.getDataMinerWorkArea() == null + || event.getDataMinerWorkArea().getInputDataSets() == null + || event.getDataMinerWorkArea().getInputDataSets() + .getFolder() == null + || event.getDataMinerWorkArea().getInputDataSets() + .getFolder().getId() == null + || event.getDataMinerWorkArea().getInputDataSets() + .getFolder().getId().isEmpty()) { + if (v != null) { + remove(v); + forceLayout(); + } + return; + + } + + List showProperties = new ArrayList(); + for (DataSpacePropertiesType dataSpaceProperties : DataSpacePropertiesType + .values()) { + showProperties.add(dataSpaceProperties.getLabel()); + } + FilterCriteria filterCriteria = new FilterCriteria(); + Map map = new HashMap(); + filterCriteria.setRequiredProperties(map); + + wsResourcesExplorerPanel = new WorkspaceResourcesExplorerPanel( + event.getDataMinerWorkArea().getInputDataSets().getFolder() + .getId(), false, showProperties, filterCriteria, + true, DISPLAY_FIELD.CREATION_DATE); + WorskpaceExplorerSelectNotificationListener wsResourceExplorerListener = new WorskpaceExplorerSelectNotificationListener() { + @Override + public void onSelectedItem(Item item) { + Log.debug("Listener Selected Item " + item); + selectedItem = item; + + } + + @Override + public void onFailed(Throwable throwable) { + Log.error(throwable.getLocalizedMessage()); + throwable.printStackTrace(); + } + + @Override + public void onAborted() { + + } + + @Override + public void onNotValidSelection() { + selectedItem = null; + } + }; + + wsResourcesExplorerPanel + .addWorkspaceExplorerSelectNotificationListener(wsResourceExplorerListener); + wsResourcesExplorerPanel.ensureDebugId("wsResourceExplorerPanel"); + wsResourcesExplorerPanel.setHeightToInternalScroll(300); + + // DND + + dnd = new MultipleDNDUpload(); + dnd.setParameters(event.getDataMinerWorkArea().getInputDataSets() + .getFolder().getId(), UPLOAD_TYPE.File); + dnd.addUniqueContainer(wsResourcesExplorerPanel); + WorskpaceUploadNotificationListener workspaceUploaderListener = new WorskpaceUploadNotificationListener() { + + @Override + public void onUploadCompleted(String parentId, String itemId) { + Log.debug("Upload completed: [parentID: " + parentId + + ", itemId: " + itemId + "]"); + wsResourcesExplorerPanel.refreshRootFolderView(); + forceLayout(); + + } + + @Override + public void onUploadAborted(String parentId, String itemId) { + Log.debug("Upload Aborted: [parentID: " + parentId + + ", itemId: " + itemId + "]"); + } + + @Override + public void onError(String parentId, String itemId, + Throwable throwable) { + Log.debug("Upload Error: [parentID: " + parentId + + ", itemId: " + itemId + "]"); + throwable.printStackTrace(); + } + + @Override + public void onOverwriteCompleted(String parentId, String itemId) { + Log.debug("Upload Override Completed: [parentID: " + + parentId + ", itemId: " + itemId + "]"); + wsResourcesExplorerPanel.refreshRootFolderView(); + forceLayout(); + } + }; + + dnd.addWorkspaceUploadNotificationListener(workspaceUploaderListener); + + // ToolBar + btnDownload = new TextButton("Download"); + btnDownload.setIcon(DataMinerManager.resources.download()); + btnDownload.setScale(ButtonScale.SMALL); + btnDownload.setIconAlign(IconAlign.LEFT); + btnDownload.setToolTip("Download"); + btnDownload.addSelectHandler(new SelectHandler() { + + @Override + public void onSelect(SelectEvent event) { + downloadFile(); + } + + }); + + btnDelete = new TextButton("Delete"); + btnDelete.setIcon(DataMinerManager.resources.deleteCircle()); + btnDelete.setScale(ButtonScale.SMALL); + btnDelete.setIconAlign(IconAlign.LEFT); + btnDelete.setToolTip("Delete"); + btnDelete.addSelectHandler(new SelectHandler() { + + @Override + public void onSelect(SelectEvent event) { + deleteItem(event); + } + + }); + + btnRefresh = new TextButton("Refresh"); + btnRefresh.setIcon(DataMinerManager.resources.refresh()); + btnRefresh.setScale(ButtonScale.SMALL); + btnRefresh.setIconAlign(IconAlign.LEFT); + btnRefresh.setToolTip("Refresh"); + btnRefresh.addSelectHandler(new SelectHandler() { + + @Override + public void onSelect(SelectEvent event) { + refreshWSResourceExplorerPanel(); + } + + }); + + final ToolBar toolBar = new ToolBar(); + toolBar.add(btnDownload, new BoxLayoutData(new Margins(0))); + toolBar.add(btnDelete, new BoxLayoutData(new Margins(0))); + toolBar.add(btnRefresh, new BoxLayoutData(new Margins(0))); + + v = new VerticalLayoutContainer(); + v.setItemId("InputDataSetsPanelVert"); + + v.add(toolBar, new VerticalLayoutData(1, -1, new Margins(0))); + v.add(dnd, new VerticalLayoutData(1, 1, new Margins(0))); + add(v); + + v.addResizeHandler(new ResizeHandler() { + + @Override + public void onResize(ResizeEvent event) { + int scrollBarHeight = event.getHeight() + - toolBar.getElement().getHeight(false); + Log.debug("ScrollBarHeight: " + scrollBarHeight); + wsResourcesExplorerPanel + .setHeightToInternalScroll(scrollBarHeight); + forceLayout(); + + } + }); + forceLayout(); + + } catch (Exception e) { + Log.error("Error opening wsResourceExplorerPanel"); + e.printStackTrace(); + } + } + + private void refreshWSResourceExplorerPanel() { + if (wsResourcesExplorerPanel != null) { + wsResourcesExplorerPanel.refreshRootFolderView(); + } + } + + private void refreshWSResourceExplorerPanel(DataMinerWorkAreaEvent event) { + try { + + if (v != null) { + remove(v); + create(event); + } else { + create(event); + } + + } catch (Throwable e) { + Log.error("Error in InputDataSetsPanel: " + e.getLocalizedMessage()); + e.printStackTrace(); + } + } + + private void deleteItem(SelectEvent event) { + ItemDescription itemDescription = new ItemDescription( + selectedItem.getId(), selectedItem.getName(), + selectedItem.getOwner(), selectedItem.getPath(), selectedItem + .getType().name()); + DeleteItemRequestEvent deleteItemEvent = new DeleteItemRequestEvent( + DataMinerWorkAreaElementType.InputDataSets, itemDescription); + EventBusProvider.INSTANCE.fireEvent(deleteItemEvent); + Log.debug("Fired: " + deleteItemEvent); + } + + private void downloadFile() { + if (selectedItem != null) { + if (selectedItem.isFolder()) { + StringBuilder actionUrl = new StringBuilder(); + actionUrl.append(GWT.getModuleBaseURL()); + actionUrl + .append(Constants.DOWNLOAD_FOLDER_SERVLET + + "?" + + Constants.DOWNLOAD_FOLDER_SERVLET_ITEM_ID_PARAMETER + + "=" + + selectedItem.getId() + + "&" + + Constants.DOWNLOAD_FOLDER_SERVLET_FOLDER_NAME_PARAMETER + + "=" + selectedItem.getName() + "&" + + Constants.CURR_GROUP_ID + "=" + + GCubeClientContext.getCurrentContextId()); + + Log.debug("Retrieved link: " + actionUrl); + Window.open(actionUrl.toString(), selectedItem.getName(), ""); + } else { + + final ItemDescription itemDescription = new ItemDescription( + selectedItem.getId(), selectedItem.getName(), + selectedItem.getOwner(), selectedItem.getPath(), + selectedItem.getType().name()); + + DataMinerPortletServiceAsync.INSTANCE.getPublicLink( + itemDescription, new AsyncCallback() { + + @Override + public void onFailure(Throwable caught) { + if (caught instanceof SessionExpiredServiceException) { + EventBusProvider.INSTANCE + .fireEvent(new SessionExpiredEvent()); + } else { + Log.error("Error open file: " + + caught.getLocalizedMessage()); + UtilsGXT3.alert("Error", + caught.getLocalizedMessage()); + } + caught.printStackTrace(); + + } + + @Override + public void onSuccess(String link) { + Log.debug("Retrieved link: " + link); + Window.open(link, itemDescription.getName(), ""); + } + + }); + } + } else { + UtilsGXT3.info("Attention", "Select a file!"); + } + + } + +} diff --git a/src/main/java/org/gcube/portlets/widgets/dataminermanagerwidget/client/dataspace/OutputDataSetsPanel.java b/src/main/java/org/gcube/portlets/widgets/dataminermanagerwidget/client/dataspace/OutputDataSetsPanel.java new file mode 100644 index 0000000..a581010 --- /dev/null +++ b/src/main/java/org/gcube/portlets/widgets/dataminermanagerwidget/client/dataspace/OutputDataSetsPanel.java @@ -0,0 +1,470 @@ +package org.gcube.portlets.widgets.dataminermanagerwidget.client.dataspace; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import org.gcube.portal.clientcontext.client.GCubeClientContext; +import org.gcube.portlets.widgets.dataminermanagerwidget.client.DataMinerManager; +import org.gcube.portlets.widgets.dataminermanagerwidget.client.common.EventBusProvider; +import org.gcube.portlets.widgets.dataminermanagerwidget.client.events.DataMinerWorkAreaEvent; +import org.gcube.portlets.widgets.dataminermanagerwidget.client.events.DeleteItemRequestEvent; +import org.gcube.portlets.widgets.dataminermanagerwidget.client.events.RefreshDataMinerWorkAreaEvent; +import org.gcube.portlets.widgets.dataminermanagerwidget.client.events.SessionExpiredEvent; +import org.gcube.portlets.widgets.dataminermanagerwidget.client.events.UIStateEvent; +import org.gcube.portlets.widgets.dataminermanagerwidget.client.rpc.DataMinerPortletServiceAsync; +import org.gcube.portlets.widgets.dataminermanagerwidget.client.type.DataMinerWorkAreaElementType; +import org.gcube.portlets.widgets.dataminermanagerwidget.client.util.UtilsGXT3; +import org.gcube.portlets.widgets.dataminermanagerwidget.shared.Constants; +import org.gcube.portlets.widgets.dataminermanagerwidget.shared.exception.SessionExpiredServiceException; +import org.gcube.portlets.widgets.dataminermanagerwidget.shared.workspace.ItemDescription; +import org.gcube.portlets.widgets.workspaceuploader.client.WorkspaceUploadNotification.WorskpaceUploadNotificationListener; +import org.gcube.portlets.widgets.workspaceuploader.client.uploader.DialogUpload.UPLOAD_TYPE; +import org.gcube.portlets.widgets.workspaceuploader.client.uploader.dragdrop.MultipleDNDUpload; +import org.gcube.portlets.widgets.wsexplorer.client.explore.WorkspaceResourcesExplorerPanel; +import org.gcube.portlets.widgets.wsexplorer.client.notification.WorkspaceExplorerSelectNotification.WorskpaceExplorerSelectNotificationListener; +import org.gcube.portlets.widgets.wsexplorer.client.view.grid.ItemsTable.DISPLAY_FIELD; +import org.gcube.portlets.widgets.wsexplorer.shared.FilterCriteria; +import org.gcube.portlets.widgets.wsexplorer.shared.Item; + +import com.allen_sauer.gwt.log.client.Log; +import com.google.gwt.core.client.GWT; +import com.google.gwt.event.logical.shared.ResizeEvent; +import com.google.gwt.event.logical.shared.ResizeHandler; +import com.google.gwt.user.client.Window; +import com.google.gwt.user.client.rpc.AsyncCallback; +import com.sencha.gxt.cell.core.client.ButtonCell.ButtonScale; +import com.sencha.gxt.cell.core.client.ButtonCell.IconAlign; +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.BoxLayoutContainer.BoxLayoutData; +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.ToolBar; + +/** + * + * @author Giancarlo Panichi email: g.panichi@isti.cnr.it + * + */ +public class OutputDataSetsPanel extends FramedPanel { + + private Item selectedItem; + private MultipleDNDUpload dnd; + private WorkspaceResourcesExplorerPanel wsResourcesExplorerPanel; + private TextButton btnDownload; + private TextButton btnDelete; + private TextButton btnRefresh; + private VerticalLayoutContainer v; + + public OutputDataSetsPanel() { + super(); + Log.debug("OutputDataSetsPanel"); + + // msgs = GWT.create(ServiceCategoryMessages.class); + init(); + bindToEvents(); + + } + + private void init() { + setItemId("OutputDataSetsPanel"); + forceLayoutOnResize = true; + setBodyBorder(false); + setBorders(false); + setHeaderVisible(false); + setResize(true); + setAnimCollapse(false); + setHeadingText("Output Data Sets"); + setBodyStyle("backgroundColor:white;"); + } + + private void bindToEvents() { + + EventBusProvider.INSTANCE.addHandler(UIStateEvent.TYPE, + new UIStateEvent.UIStateEventHandler() { + + @Override + public void onChange(UIStateEvent event) { + manageStateEvents(event); + + } + }); + + EventBusProvider.INSTANCE.addHandler(DataMinerWorkAreaEvent.TYPE, + new DataMinerWorkAreaEvent.DataMinerWorkAreaEventHandler() { + + @Override + public void onChange(DataMinerWorkAreaEvent event) { + manageDataMinerWorkAreaEvents(event); + + } + + }); + + EventBusProvider.INSTANCE + .addHandler( + RefreshDataMinerWorkAreaEvent.TYPE, + new RefreshDataMinerWorkAreaEvent.RefreshDataMinerWorkAreaEventHandler() { + + @Override + public void onRefresh( + RefreshDataMinerWorkAreaEvent event) { + manageRefreshDataMinerWorkAreaEvents(event); + + } + + }); + + } + + private void manageStateEvents(UIStateEvent event) { + Log.debug("OutputDataSetsPanel recieved UIStateEvent: " + event); + if (event == null) { + Log.error("UIStateEvent"); + return; + } + switch (event.getUiStateType()) { + case START: + break; + case WAITING: + break; + case UPDATE: + break; + default: + break; + } + } + + private void manageDataMinerWorkAreaEvents(DataMinerWorkAreaEvent event) { + Log.debug("OutputDataSetsPanel recieved DataMinerWorkAreaEvent: " + + event); + if (event == null) { + Log.error("DataMinerWorkAreaEvent"); + return; + } + switch (event.getDataMinerWorkAreaRegionType()) { + case Computations: + break; + case DataSets: + manageMyDataMinerWorkAreaEvents(event); + break; + default: + break; + + } + } + + private void manageMyDataMinerWorkAreaEvents(DataMinerWorkAreaEvent event) { + switch (event.getDataMinerWorkAreaEventType()) { + case OPEN: + case UPDATE: + refreshWSResourceExplorerPanel(event); + break; + default: + break; + } + + } + + private void manageRefreshDataMinerWorkAreaEvents( + RefreshDataMinerWorkAreaEvent event) { + Log.debug("OutputDataSetsPanel recieved RefreshDataMinerWorkAreaEvent: " + + event); + if (event == null) { + Log.error("RefreshDataMinerWorkAreaEvent"); + return; + } + switch (event.getDataMinerWorkAreaElementType()) { + case Computations: + break; + case InputDataSets: + break; + case OutputDataSets: + refreshWSResourceExplorerPanel(); + break; + default: + break; + } + + } + + private void create(DataMinerWorkAreaEvent event) { + try { + + if (event == null + || event.getDataMinerWorkArea() == null + || event.getDataMinerWorkArea().getOutputDataSets() == null + || event.getDataMinerWorkArea().getOutputDataSets() + .getFolder() == null + || event.getDataMinerWorkArea().getOutputDataSets() + .getFolder().getId() == null + || event.getDataMinerWorkArea().getOutputDataSets() + .getFolder().getId().isEmpty()) { + if (v != null) { + remove(v); + forceLayout(); + } + return; + + } + + List showProperties = new ArrayList(); + for (DataSpacePropertiesType dataSpaceProperties : DataSpacePropertiesType + .values()) { + showProperties.add(dataSpaceProperties.getLabel()); + } + FilterCriteria filterCriteria = new FilterCriteria(); + Map map = new HashMap(); + filterCriteria.setRequiredProperties(map); + + wsResourcesExplorerPanel = new WorkspaceResourcesExplorerPanel( + event.getDataMinerWorkArea().getOutputDataSets() + .getFolder().getId(), false, showProperties, + filterCriteria, true, DISPLAY_FIELD.CREATION_DATE); + + WorskpaceExplorerSelectNotificationListener wsResourceExplorerListener = new WorskpaceExplorerSelectNotificationListener() { + @Override + public void onSelectedItem(Item item) { + Log.debug("Listener Selected Item " + item); + selectedItem = item; + + } + + @Override + public void onFailed(Throwable throwable) { + Log.error(throwable.getLocalizedMessage()); + throwable.printStackTrace(); + } + + @Override + public void onAborted() { + + } + + @Override + public void onNotValidSelection() { + selectedItem = null; + } + }; + + wsResourcesExplorerPanel + .addWorkspaceExplorerSelectNotificationListener(wsResourceExplorerListener); + wsResourcesExplorerPanel.ensureDebugId("wsResourceExplorerPanel"); + wsResourcesExplorerPanel.setHeightToInternalScroll(300); + + // DND + + dnd = new MultipleDNDUpload(); + dnd.setParameters(event.getDataMinerWorkArea().getOutputDataSets() + .getFolder().getId(), UPLOAD_TYPE.File); + dnd.addUniqueContainer(wsResourcesExplorerPanel); + WorskpaceUploadNotificationListener workspaceUploaderListener = new WorskpaceUploadNotificationListener() { + + @Override + public void onUploadCompleted(String parentId, String itemId) { + Log.debug("Upload completed: [parentID: " + parentId + + ", itemId: " + itemId + "]"); + wsResourcesExplorerPanel.refreshRootFolderView(); + forceLayout(); + + } + + @Override + public void onUploadAborted(String parentId, String itemId) { + Log.debug("Upload Aborted: [parentID: " + parentId + + ", itemId: " + itemId + "]"); + } + + @Override + public void onError(String parentId, String itemId, + Throwable throwable) { + Log.debug("Upload Error: [parentID: " + parentId + + ", itemId: " + itemId + "]"); + throwable.printStackTrace(); + } + + @Override + public void onOverwriteCompleted(String parentId, String itemId) { + Log.debug("Upload Override Completed: [parentID: " + + parentId + ", itemId: " + itemId + "]"); + wsResourcesExplorerPanel.refreshRootFolderView(); + forceLayout(); + } + }; + + dnd.addWorkspaceUploadNotificationListener(workspaceUploaderListener); + + // ToolBar + btnDownload = new TextButton("Download"); + btnDownload.setIcon(DataMinerManager.resources.download()); + btnDownload.setScale(ButtonScale.SMALL); + btnDownload.setIconAlign(IconAlign.LEFT); + btnDownload.setToolTip("Download"); + btnDownload.addSelectHandler(new SelectHandler() { + + @Override + public void onSelect(SelectEvent event) { + downloadFile(); + } + + }); + + btnDelete = new TextButton("Delete"); + btnDelete.setIcon(DataMinerManager.resources.deleteCircle()); + btnDelete.setScale(ButtonScale.SMALL); + btnDelete.setIconAlign(IconAlign.LEFT); + btnDelete.setToolTip("Delete"); + btnDelete.addSelectHandler(new SelectHandler() { + + @Override + public void onSelect(SelectEvent event) { + deleteItem(event); + } + + }); + + btnRefresh = new TextButton("Refresh"); + btnRefresh.setIcon(DataMinerManager.resources.refresh()); + btnRefresh.setScale(ButtonScale.SMALL); + btnRefresh.setIconAlign(IconAlign.LEFT); + btnRefresh.setToolTip("Refresh"); + btnRefresh.addSelectHandler(new SelectHandler() { + + @Override + public void onSelect(SelectEvent event) { + refreshWSResourceExplorerPanel(); + } + + }); + + final ToolBar toolBar = new ToolBar(); + toolBar.add(btnDownload, new BoxLayoutData(new Margins(0))); + toolBar.add(btnDelete, new BoxLayoutData(new Margins(0))); + toolBar.add(btnRefresh, new BoxLayoutData(new Margins(0))); + + v = new VerticalLayoutContainer(); + + v.add(toolBar, new VerticalLayoutData(1, -1, new Margins(0))); + v.add(dnd, new VerticalLayoutData(1, 1, new Margins(0))); + add(v); + + v.addResizeHandler(new ResizeHandler() { + + @Override + public void onResize(ResizeEvent event) { + int scrollBarHeight = event.getHeight() + - toolBar.getElement().getHeight(false); + Log.debug("ScrollBarHeight: " + scrollBarHeight); + wsResourcesExplorerPanel + .setHeightToInternalScroll(scrollBarHeight); + forceLayout(); + + } + }); + forceLayout(); + + } catch (Exception e) { + Log.error("Error opening wsResourceExplorerPanel"); + e.printStackTrace(); + } + } + + private void refreshWSResourceExplorerPanel() { + if (wsResourcesExplorerPanel != null) { + wsResourcesExplorerPanel.refreshRootFolderView(); + } + } + + private void refreshWSResourceExplorerPanel(DataMinerWorkAreaEvent event) { + try { + + if (v != null) { + remove(v); + create(event); + } else { + create(event); + } + + } catch (Throwable e) { + Log.error("Error in OutputDataSetsPanel: " + + e.getLocalizedMessage()); + e.printStackTrace(); + } + } + + private void deleteItem(SelectEvent event) { + ItemDescription itemDescription = new ItemDescription( + selectedItem.getId(), selectedItem.getName(), + selectedItem.getOwner(), selectedItem.getPath(), selectedItem + .getType().name()); + DeleteItemRequestEvent deleteItemEvent = new DeleteItemRequestEvent( + DataMinerWorkAreaElementType.OutputDataSets, itemDescription); + EventBusProvider.INSTANCE.fireEvent(deleteItemEvent); + Log.debug("Fired: " + deleteItemEvent); + } + + private void downloadFile() { + if (selectedItem != null) { + if (selectedItem.isFolder()) { + StringBuilder actionUrl = new StringBuilder(); + actionUrl.append(GWT.getModuleBaseURL()); + actionUrl + .append(Constants.DOWNLOAD_FOLDER_SERVLET + + "?" + + Constants.DOWNLOAD_FOLDER_SERVLET_ITEM_ID_PARAMETER + + "=" + + selectedItem.getId() + + "&" + + Constants.DOWNLOAD_FOLDER_SERVLET_FOLDER_NAME_PARAMETER + + "=" + selectedItem.getName() + "&" + + Constants.CURR_GROUP_ID + "=" + + GCubeClientContext.getCurrentContextId()); + + Log.debug("Retrieved link: " + actionUrl); + Window.open(actionUrl.toString(), selectedItem.getName(), ""); + } else { + final ItemDescription itemDescription = new ItemDescription( + selectedItem.getId(), selectedItem.getName(), + selectedItem.getOwner(), selectedItem.getPath(), + selectedItem.getType().name()); + + DataMinerPortletServiceAsync.INSTANCE.getPublicLink( + itemDescription, new AsyncCallback() { + + @Override + public void onFailure(Throwable caught) { + if (caught instanceof SessionExpiredServiceException) { + EventBusProvider.INSTANCE + .fireEvent(new SessionExpiredEvent()); + } else { + Log.error("Error open file: " + + caught.getLocalizedMessage()); + UtilsGXT3.alert("Error", + caught.getLocalizedMessage()); + } + caught.printStackTrace(); + + } + + @Override + public void onSuccess(String link) { + Log.debug("Retrieved link: " + link); + Window.open(link, itemDescription.getName(), ""); + } + + }); + } + + } else { + UtilsGXT3.info("Attention", "Select a file!"); + } + + } + +} diff --git a/src/main/java/org/gcube/portlets/widgets/dataminermanagerwidget/client/events/CancelComputationExecutionRequestEvent.java b/src/main/java/org/gcube/portlets/widgets/dataminermanagerwidget/client/events/CancelComputationExecutionRequestEvent.java new file mode 100644 index 0000000..a420ef9 --- /dev/null +++ b/src/main/java/org/gcube/portlets/widgets/dataminermanagerwidget/client/events/CancelComputationExecutionRequestEvent.java @@ -0,0 +1,71 @@ +package org.gcube.portlets.widgets.dataminermanagerwidget.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" g.panichi@isti.cnr.it + * + */ +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/widgets/dataminermanagerwidget/client/events/CancelExecutionFromComputationsRequestEvent.java b/src/main/java/org/gcube/portlets/widgets/dataminermanagerwidget/client/events/CancelExecutionFromComputationsRequestEvent.java new file mode 100644 index 0000000..e51a153 --- /dev/null +++ b/src/main/java/org/gcube/portlets/widgets/dataminermanagerwidget/client/events/CancelExecutionFromComputationsRequestEvent.java @@ -0,0 +1,71 @@ +package org.gcube.portlets.widgets.dataminermanagerwidget.client.events; + +import org.gcube.portlets.widgets.dataminermanagerwidget.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" g.panichi@isti.cnr.it + * + */ +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/widgets/dataminermanagerwidget/client/events/ComputationDataEvent.java b/src/main/java/org/gcube/portlets/widgets/dataminermanagerwidget/client/events/ComputationDataEvent.java new file mode 100644 index 0000000..071ab43 --- /dev/null +++ b/src/main/java/org/gcube/portlets/widgets/dataminermanagerwidget/client/events/ComputationDataEvent.java @@ -0,0 +1,65 @@ +package org.gcube.portlets.widgets.dataminermanagerwidget.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" g.panichi@isti.cnr.it + * + */ +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/widgets/dataminermanagerwidget/client/events/ComputationDataRequestEvent.java b/src/main/java/org/gcube/portlets/widgets/dataminermanagerwidget/client/events/ComputationDataRequestEvent.java new file mode 100644 index 0000000..e2bd831 --- /dev/null +++ b/src/main/java/org/gcube/portlets/widgets/dataminermanagerwidget/client/events/ComputationDataRequestEvent.java @@ -0,0 +1,67 @@ +package org.gcube.portlets.widgets.dataminermanagerwidget.client.events; + +import org.gcube.portlets.widgets.dataminermanagerwidget.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" g.panichi@isti.cnr.it + * + */ +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/widgets/dataminermanagerwidget/client/events/ComputationReadyEvent.java b/src/main/java/org/gcube/portlets/widgets/dataminermanagerwidget/client/events/ComputationReadyEvent.java new file mode 100644 index 0000000..8469f27 --- /dev/null +++ b/src/main/java/org/gcube/portlets/widgets/dataminermanagerwidget/client/events/ComputationReadyEvent.java @@ -0,0 +1,71 @@ +package org.gcube.portlets.widgets.dataminermanagerwidget.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" g.panichi@isti.cnr.it + * + */ +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/widgets/dataminermanagerwidget/client/events/DataMinerWorkAreaEvent.java b/src/main/java/org/gcube/portlets/widgets/dataminermanagerwidget/client/events/DataMinerWorkAreaEvent.java new file mode 100644 index 0000000..bb9ec47 --- /dev/null +++ b/src/main/java/org/gcube/portlets/widgets/dataminermanagerwidget/client/events/DataMinerWorkAreaEvent.java @@ -0,0 +1,85 @@ +package org.gcube.portlets.widgets.dataminermanagerwidget.client.events; + +import org.gcube.portlets.widgets.dataminermanagerwidget.client.type.DataMinerWorkAreaEventType; +import org.gcube.portlets.widgets.dataminermanagerwidget.client.type.DataMinerWorkAreaRegionType; +import org.gcube.portlets.widgets.dataminermanagerwidget.shared.workspace.DataMinerWorkArea; + +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; + +/** + * Data Miner Work Area Event + * + * + * @author "Giancarlo Panichi" g.panichi@isti.cnr.it + * + */ +public class DataMinerWorkAreaEvent extends + GwtEvent { + + public static Type TYPE = new Type(); + private DataMinerWorkAreaEventType dataMinerWorkAreaEventType; + private DataMinerWorkAreaRegionType dataMinerWorkAreaRegionType; + private DataMinerWorkArea dataMinerWorkArea; + + public interface DataMinerWorkAreaEventHandler extends EventHandler { + void onChange(DataMinerWorkAreaEvent event); + } + + public interface HasDataMinerWorkAreaEventHandler extends HasHandlers { + public HandlerRegistration addDataMinerWorkAreaEventHandler( + DataMinerWorkAreaEventHandler handler); + } + + public DataMinerWorkAreaEvent( + DataMinerWorkAreaEventType dataMinerWorkAreaEventType, + DataMinerWorkAreaRegionType dataMinerWorkAreaRegionType, + DataMinerWorkArea dataMinerWorkArea) { + this.dataMinerWorkAreaEventType = dataMinerWorkAreaEventType; + this.dataMinerWorkAreaRegionType = dataMinerWorkAreaRegionType; + this.dataMinerWorkArea = dataMinerWorkArea; + } + + @Override + protected void dispatch(DataMinerWorkAreaEventHandler handler) { + handler.onChange(this); + } + + @Override + public Type getAssociatedType() { + return TYPE; + } + + public static Type getType() { + return TYPE; + } + + public static void fire(HasHandlers source, + DataMinerWorkAreaEvent dataMinerWorkAreaEvent) { + source.fireEvent(dataMinerWorkAreaEvent); + } + + public DataMinerWorkAreaEventType getDataMinerWorkAreaEventType() { + return dataMinerWorkAreaEventType; + } + + public DataMinerWorkArea getDataMinerWorkArea() { + return dataMinerWorkArea; + } + + public DataMinerWorkAreaRegionType getDataMinerWorkAreaRegionType() { + return dataMinerWorkAreaRegionType; + } + + @Override + public String toString() { + return "DataMinerWorkAreaEvent [dataMinerWorkAreaEventType=" + + dataMinerWorkAreaEventType + ", dataMinerWorkAreaRegionType=" + + dataMinerWorkAreaRegionType + ", dataMinerWorkArea=" + + dataMinerWorkArea + "]"; + } + +} diff --git a/src/main/java/org/gcube/portlets/widgets/dataminermanagerwidget/client/events/DataMinerWorkAreaRequestEvent.java b/src/main/java/org/gcube/portlets/widgets/dataminermanagerwidget/client/events/DataMinerWorkAreaRequestEvent.java new file mode 100644 index 0000000..9aca3c7 --- /dev/null +++ b/src/main/java/org/gcube/portlets/widgets/dataminermanagerwidget/client/events/DataMinerWorkAreaRequestEvent.java @@ -0,0 +1,80 @@ +package org.gcube.portlets.widgets.dataminermanagerwidget.client.events; + +import org.gcube.portlets.widgets.dataminermanagerwidget.client.type.DataMinerWorkAreaRegionType; +import org.gcube.portlets.widgets.dataminermanagerwidget.client.type.DataMinerWorkAreaRequestEventType; + +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; + +/** + * Data Miner Work Area Request Event + * + * + * @author "Giancarlo Panichi" g.panichi@isti.cnr.it + * + */ +public class DataMinerWorkAreaRequestEvent + extends + GwtEvent { + + public static Type TYPE = new Type(); + private DataMinerWorkAreaRequestEventType dataMinerWorkAreaRequestEventType; + private DataMinerWorkAreaRegionType dataMinerWorkAreaRegionType; + + public interface DataMinerWorkAreaRequestEventHandler extends EventHandler { + void onRequest(DataMinerWorkAreaRequestEvent event); + } + + public interface HasDataMinerWorkAreaRequestEventHandler extends + HasHandlers { + public HandlerRegistration addDataMinerWorkAreaRequestEventHandler( + DataMinerWorkAreaRequestEventHandler handler); + } + + public DataMinerWorkAreaRequestEvent( + DataMinerWorkAreaRequestEventType dataMinerWorkAreaRequestEventType, + DataMinerWorkAreaRegionType dataMinerWorkAreaRegionType) { + this.dataMinerWorkAreaRequestEventType = dataMinerWorkAreaRequestEventType; + this.dataMinerWorkAreaRegionType = dataMinerWorkAreaRegionType; + + } + + @Override + protected void dispatch(DataMinerWorkAreaRequestEventHandler handler) { + handler.onRequest(this); + } + + @Override + public Type getAssociatedType() { + return TYPE; + } + + public static Type getType() { + return TYPE; + } + + public static void fire(HasHandlers source, + DataMinerWorkAreaRequestEvent event) { + source.fireEvent(event); + } + + public DataMinerWorkAreaRequestEventType getDataMinerWorkAreaRequestEventType() { + return dataMinerWorkAreaRequestEventType; + } + + public DataMinerWorkAreaRegionType getDataMinerWorkAreaRegionType() { + return dataMinerWorkAreaRegionType; + } + + @Override + public String toString() { + return "DataMinerWorkAreaRequestEvent [dataMinerWorkAreaRequestEventType=" + + dataMinerWorkAreaRequestEventType + + ", dataMinerWorkAreaRegionType=" + + dataMinerWorkAreaRegionType + "]"; + } + +} diff --git a/src/main/java/org/gcube/portlets/widgets/dataminermanagerwidget/client/events/DeleteItemRequestEvent.java b/src/main/java/org/gcube/portlets/widgets/dataminermanagerwidget/client/events/DeleteItemRequestEvent.java new file mode 100644 index 0000000..e6dbeb6 --- /dev/null +++ b/src/main/java/org/gcube/portlets/widgets/dataminermanagerwidget/client/events/DeleteItemRequestEvent.java @@ -0,0 +1,76 @@ +package org.gcube.portlets.widgets.dataminermanagerwidget.client.events; + +import org.gcube.portlets.widgets.dataminermanagerwidget.client.type.DataMinerWorkAreaElementType; +import org.gcube.portlets.widgets.dataminermanagerwidget.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; + +/** + * Delete Item Request Event + * + * + * @author "Giancarlo Panichi" g.panichi@isti.cnr.it + * + */ +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/widgets/dataminermanagerwidget/client/events/MenuEvent.java b/src/main/java/org/gcube/portlets/widgets/dataminermanagerwidget/client/events/MenuEvent.java new file mode 100644 index 0000000..9d28811 --- /dev/null +++ b/src/main/java/org/gcube/portlets/widgets/dataminermanagerwidget/client/events/MenuEvent.java @@ -0,0 +1,68 @@ +package org.gcube.portlets.widgets.dataminermanagerwidget.client.events; + +import org.gcube.portlets.widgets.dataminermanagerwidget.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" g.panichi@isti.cnr.it + * + */ +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/widgets/dataminermanagerwidget/client/events/MenuSwitchEvent.java b/src/main/java/org/gcube/portlets/widgets/dataminermanagerwidget/client/events/MenuSwitchEvent.java new file mode 100644 index 0000000..1698b94 --- /dev/null +++ b/src/main/java/org/gcube/portlets/widgets/dataminermanagerwidget/client/events/MenuSwitchEvent.java @@ -0,0 +1,64 @@ +package org.gcube.portlets.widgets.dataminermanagerwidget.client.events; + +import org.gcube.portlets.widgets.dataminermanagerwidget.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" g.panichi@isti.cnr.it + * + */ +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/widgets/dataminermanagerwidget/client/events/OperatorsClassificationEvent.java b/src/main/java/org/gcube/portlets/widgets/dataminermanagerwidget/client/events/OperatorsClassificationEvent.java new file mode 100644 index 0000000..9f534ac --- /dev/null +++ b/src/main/java/org/gcube/portlets/widgets/dataminermanagerwidget/client/events/OperatorsClassificationEvent.java @@ -0,0 +1,113 @@ +package org.gcube.portlets.widgets.dataminermanagerwidget.client.events; + +import org.gcube.data.analysis.dataminermanagercl.shared.process.OperatorsClassification; +import org.gcube.portlets.widgets.dataminermanagerwidget.client.type.OperatorsClassificationRequestType; + +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 Event + * + * + * @author "Giancarlo Panichi" g.panichi@isti.cnr.it + * + */ +public class OperatorsClassificationEvent + extends + GwtEvent { + + public static Type TYPE = new Type(); + private OperatorsClassificationRequestType operatorsClassificationRequestType; + private String classificationName; + private OperatorsClassification operatorsClassification; + private String operatorId; + + public interface OperatorsClassificationEventHandler extends EventHandler { + void onOperatorsClassification(OperatorsClassificationEvent event); + } + + public interface HasOperatorsClassificationEventHandler extends HasHandlers { + public HandlerRegistration addOperatorsClassificationEventHandler( + OperatorsClassificationEventHandler handler); + } + + public OperatorsClassificationEvent( + OperatorsClassification operatorsClassification) { + this.operatorsClassificationRequestType = OperatorsClassificationRequestType.Default; + this.operatorsClassification = operatorsClassification; + this.operatorId = null; + } + + public OperatorsClassificationEvent(String classificationName, + OperatorsClassification operatorsClassification) { + this.operatorsClassificationRequestType = OperatorsClassificationRequestType.ByName; + this.classificationName = classificationName; + this.operatorsClassification = operatorsClassification; + this.operatorId = null; + } + + public OperatorsClassificationEvent( + OperatorsClassification operatorsClassification, String operatorId) { + this.operatorsClassificationRequestType = OperatorsClassificationRequestType.Default; + this.operatorsClassification = operatorsClassification; + this.operatorId = operatorId; + } + + public OperatorsClassificationEvent(String classificationName, + OperatorsClassification operatorsClassification, String operatorId) { + this.operatorsClassificationRequestType = OperatorsClassificationRequestType.ByName; + this.classificationName = classificationName; + this.operatorsClassification = operatorsClassification; + this.operatorId = operatorId; + } + + @Override + protected void dispatch(OperatorsClassificationEventHandler handler) { + handler.onOperatorsClassification(this); + } + + @Override + public Type getAssociatedType() { + return TYPE; + } + + public static Type getType() { + return TYPE; + } + + public static void fire(HasHandlers source, + OperatorsClassificationEvent event) { + source.fireEvent(event); + } + + public OperatorsClassificationRequestType getOperatorsClassificationRequestType() { + return operatorsClassificationRequestType; + } + + public String getClassificationName() { + return classificationName; + } + + public OperatorsClassification getOperatorsClassification() { + return operatorsClassification; + } + + public String getOperatorId() { + return operatorId; + } + + @Override + public String toString() { + return "OperatorsClassificationEvent [operatorsClassificationRequestType=" + + operatorsClassificationRequestType + + ", classificationName=" + + classificationName + + ", operatorsClassification=" + + operatorsClassification + ", operatorId=" + operatorId + "]"; + } + +} diff --git a/src/main/java/org/gcube/portlets/widgets/dataminermanagerwidget/client/events/OperatorsClassificationRequestEvent.java b/src/main/java/org/gcube/portlets/widgets/dataminermanagerwidget/client/events/OperatorsClassificationRequestEvent.java new file mode 100644 index 0000000..70a0275 --- /dev/null +++ b/src/main/java/org/gcube/portlets/widgets/dataminermanagerwidget/client/events/OperatorsClassificationRequestEvent.java @@ -0,0 +1,95 @@ +package org.gcube.portlets.widgets.dataminermanagerwidget.client.events; + +import org.gcube.portlets.widgets.dataminermanagerwidget.client.type.OperatorsClassificationRequestType; + +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" g.panichi@isti.cnr.it + * + */ +public class OperatorsClassificationRequestEvent + extends + GwtEvent { + + public static Type TYPE = new Type(); + private OperatorsClassificationRequestType operatorsClassificationRequestType; + private String classificationName; + private boolean operatorId; + + public interface OperatorsClassificationRequestEventHandler extends + EventHandler { + void onRequest(OperatorsClassificationRequestEvent event); + } + + public interface HasOperatorsClassificationRequestEventHandler extends + HasHandlers { + public HandlerRegistration addOperatorsClassificationRequestEventHandler( + OperatorsClassificationRequestEventHandler handler); + } + + /*public OperatorsClassificationRequestEvent() { + this.operatorsClassificationRequestType = OperatorsClassificationRequestType.Default; + this.operatorId = false; + }*/ + + public OperatorsClassificationRequestEvent(String classificationName, + boolean operatorId) { + this.operatorsClassificationRequestType = OperatorsClassificationRequestType.ByName; + this.classificationName = classificationName; + this.operatorId = operatorId; + } + + /*public OperatorsClassificationRequestEvent(String classificationName) { + this.operatorsClassificationRequestType = OperatorsClassificationRequestType.ByName; + this.classificationName = classificationName; + this.operatorId = false; + }*/ + + @Override + protected void dispatch(OperatorsClassificationRequestEventHandler handler) { + handler.onRequest(this); + } + + @Override + public Type getAssociatedType() { + return TYPE; + } + + public static Type getType() { + return TYPE; + } + + public static void fire(HasHandlers source, + OperatorsClassificationRequestEvent event) { + source.fireEvent(event); + } + + public OperatorsClassificationRequestType getOperatorsClassificationRequestType() { + return operatorsClassificationRequestType; + } + + public String getClassificationName() { + return classificationName; + } + + public boolean isOperatorId() { + return operatorId; + } + + @Override + public String toString() { + return "OperatorsClassificationRequestEvent [operatorsClassificationRequestType=" + + operatorsClassificationRequestType + + ", classificationName=" + + classificationName + ", operatorId=" + operatorId + "]"; + } + +} diff --git a/src/main/java/org/gcube/portlets/widgets/dataminermanagerwidget/client/events/OutputDataEvent.java b/src/main/java/org/gcube/portlets/widgets/dataminermanagerwidget/client/events/OutputDataEvent.java new file mode 100644 index 0000000..81b06fb --- /dev/null +++ b/src/main/java/org/gcube/portlets/widgets/dataminermanagerwidget/client/events/OutputDataEvent.java @@ -0,0 +1,64 @@ +package org.gcube.portlets.widgets.dataminermanagerwidget.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" g.panichi@isti.cnr.it + * + */ +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/widgets/dataminermanagerwidget/client/events/OutputDataRequestEvent.java b/src/main/java/org/gcube/portlets/widgets/dataminermanagerwidget/client/events/OutputDataRequestEvent.java new file mode 100644 index 0000000..702e0f1 --- /dev/null +++ b/src/main/java/org/gcube/portlets/widgets/dataminermanagerwidget/client/events/OutputDataRequestEvent.java @@ -0,0 +1,67 @@ +package org.gcube.portlets.widgets.dataminermanagerwidget.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" g.panichi@isti.cnr.it + * + */ +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/widgets/dataminermanagerwidget/client/events/RefreshDataMinerWorkAreaEvent.java b/src/main/java/org/gcube/portlets/widgets/dataminermanagerwidget/client/events/RefreshDataMinerWorkAreaEvent.java new file mode 100644 index 0000000..305380b --- /dev/null +++ b/src/main/java/org/gcube/portlets/widgets/dataminermanagerwidget/client/events/RefreshDataMinerWorkAreaEvent.java @@ -0,0 +1,68 @@ +package org.gcube.portlets.widgets.dataminermanagerwidget.client.events; + +import org.gcube.portlets.widgets.dataminermanagerwidget.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; + +/** + * Refresh DataMiner Work Area Event + * + * + * @author "Giancarlo Panichi" g.panichi@isti.cnr.it + * + */ +public class RefreshDataMinerWorkAreaEvent extends + GwtEvent { + + public static Type TYPE = new Type(); + private DataMinerWorkAreaElementType dataMinerWorkAreaElementType; + + public interface RefreshDataMinerWorkAreaEventHandler extends EventHandler { + void onRefresh(RefreshDataMinerWorkAreaEvent event); + } + + public interface HasRefreshDataMinerWorkAreaEventHandler extends HasHandlers { + public HandlerRegistration addRefreshDataMinerWorkAreaEventHandler( + RefreshDataMinerWorkAreaEventHandler handler); + } + + public RefreshDataMinerWorkAreaEvent( + DataMinerWorkAreaElementType dataMinerWorkAreaElementType) { + this.dataMinerWorkAreaElementType = dataMinerWorkAreaElementType; + } + + @Override + protected void dispatch(RefreshDataMinerWorkAreaEventHandler handler) { + handler.onRefresh(this); + } + + @Override + public Type getAssociatedType() { + return TYPE; + } + + public static Type getType() { + return TYPE; + } + + public static void fire(HasHandlers source, RefreshDataMinerWorkAreaEvent deleteItemEvent) { + source.fireEvent(deleteItemEvent); + } + + public DataMinerWorkAreaElementType getDataMinerWorkAreaElementType() { + return dataMinerWorkAreaElementType; + } + + @Override + public String toString() { + return "RefreshDataMinerWorkAreaEvent [dataMinerWorkAreaElementType=" + + dataMinerWorkAreaElementType + "]"; + } + + + +} diff --git a/src/main/java/org/gcube/portlets/widgets/dataminermanagerwidget/client/events/ResubmitComputationExecutionEvent.java b/src/main/java/org/gcube/portlets/widgets/dataminermanagerwidget/client/events/ResubmitComputationExecutionEvent.java new file mode 100644 index 0000000..5b6b00e --- /dev/null +++ b/src/main/java/org/gcube/portlets/widgets/dataminermanagerwidget/client/events/ResubmitComputationExecutionEvent.java @@ -0,0 +1,72 @@ +package org.gcube.portlets.widgets.dataminermanagerwidget.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" g.panichi@isti.cnr.it + * + */ +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/widgets/dataminermanagerwidget/client/events/ResubmitComputationExecutionRequestEvent.java b/src/main/java/org/gcube/portlets/widgets/dataminermanagerwidget/client/events/ResubmitComputationExecutionRequestEvent.java new file mode 100644 index 0000000..a912542 --- /dev/null +++ b/src/main/java/org/gcube/portlets/widgets/dataminermanagerwidget/client/events/ResubmitComputationExecutionRequestEvent.java @@ -0,0 +1,71 @@ +package org.gcube.portlets.widgets.dataminermanagerwidget.client.events; + +import org.gcube.portlets.widgets.dataminermanagerwidget.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" g.panichi@isti.cnr.it + * + */ +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/widgets/dataminermanagerwidget/client/events/SessionExpiredEvent.java b/src/main/java/org/gcube/portlets/widgets/dataminermanagerwidget/client/events/SessionExpiredEvent.java new file mode 100644 index 0000000..6486fee --- /dev/null +++ b/src/main/java/org/gcube/portlets/widgets/dataminermanagerwidget/client/events/SessionExpiredEvent.java @@ -0,0 +1,70 @@ +package org.gcube.portlets.widgets.dataminermanagerwidget.client.events; + +import org.gcube.portlets.widgets.dataminermanagerwidget.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" g.panichi@isti.cnr.it + * + */ +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/widgets/dataminermanagerwidget/client/events/StartComputationExecutionEvent.java b/src/main/java/org/gcube/portlets/widgets/dataminermanagerwidget/client/events/StartComputationExecutionEvent.java new file mode 100644 index 0000000..8bb7b41 --- /dev/null +++ b/src/main/java/org/gcube/portlets/widgets/dataminermanagerwidget/client/events/StartComputationExecutionEvent.java @@ -0,0 +1,77 @@ +package org.gcube.portlets.widgets.dataminermanagerwidget.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" g.panichi@isti.cnr.it + * + */ +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/widgets/dataminermanagerwidget/client/events/StartComputationExecutionRequestEvent.java b/src/main/java/org/gcube/portlets/widgets/dataminermanagerwidget/client/events/StartComputationExecutionRequestEvent.java new file mode 100644 index 0000000..d9f61cf --- /dev/null +++ b/src/main/java/org/gcube/portlets/widgets/dataminermanagerwidget/client/events/StartComputationExecutionRequestEvent.java @@ -0,0 +1,79 @@ +package org.gcube.portlets.widgets.dataminermanagerwidget.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" g.panichi@isti.cnr.it + * + */ +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/widgets/dataminermanagerwidget/client/events/TabularFldChangeEvent.java b/src/main/java/org/gcube/portlets/widgets/dataminermanagerwidget/client/events/TabularFldChangeEvent.java new file mode 100644 index 0000000..59944b9 --- /dev/null +++ b/src/main/java/org/gcube/portlets/widgets/dataminermanagerwidget/client/events/TabularFldChangeEvent.java @@ -0,0 +1,67 @@ +package org.gcube.portlets.widgets.dataminermanagerwidget.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" g.panichi@isti.cnr.it + * + */ +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/widgets/dataminermanagerwidget/client/events/UIStateEvent.java b/src/main/java/org/gcube/portlets/widgets/dataminermanagerwidget/client/events/UIStateEvent.java new file mode 100644 index 0000000..50764bd --- /dev/null +++ b/src/main/java/org/gcube/portlets/widgets/dataminermanagerwidget/client/events/UIStateEvent.java @@ -0,0 +1,67 @@ +package org.gcube.portlets.widgets.dataminermanagerwidget.client.events; + +import org.gcube.portlets.widgets.dataminermanagerwidget.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" g.panichi@isti.cnr.it + * + */ +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/widgets/dataminermanagerwidget/client/events/WPSMenuEvent.java b/src/main/java/org/gcube/portlets/widgets/dataminermanagerwidget/client/events/WPSMenuEvent.java new file mode 100644 index 0000000..ecb3991 --- /dev/null +++ b/src/main/java/org/gcube/portlets/widgets/dataminermanagerwidget/client/events/WPSMenuEvent.java @@ -0,0 +1,68 @@ +package org.gcube.portlets.widgets.dataminermanagerwidget.client.events; + + +import org.gcube.portlets.widgets.dataminermanagerwidget.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" g.panichi@isti.cnr.it + * + */ +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/widgets/dataminermanagerwidget/client/experiments/ComputationExecutionPanel.java b/src/main/java/org/gcube/portlets/widgets/dataminermanagerwidget/client/experiments/ComputationExecutionPanel.java new file mode 100644 index 0000000..a6605be --- /dev/null +++ b/src/main/java/org/gcube/portlets/widgets/dataminermanagerwidget/client/experiments/ComputationExecutionPanel.java @@ -0,0 +1,209 @@ +package org.gcube.portlets.widgets.dataminermanagerwidget.client.experiments; + +import java.util.ArrayList; +import java.util.List; + +import org.gcube.data.analysis.dataminermanagercl.shared.process.Operator; +import org.gcube.portlets.widgets.dataminermanagerwidget.client.DataMinerManager; +import org.gcube.portlets.widgets.dataminermanagerwidget.client.common.EventBusProvider; +import org.gcube.portlets.widgets.dataminermanagerwidget.client.events.ResubmitComputationExecutionEvent; +import org.gcube.portlets.widgets.dataminermanagerwidget.client.events.StartComputationExecutionEvent; +import org.gcube.portlets.widgets.dataminermanagerwidget.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 email: g.panichi@isti.cnr.it + * + */ +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(DataMinerManager.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/widgets/dataminermanagerwidget/client/experiments/ComputationOutputPanel.java b/src/main/java/org/gcube/portlets/widgets/dataminermanagerwidget/client/experiments/ComputationOutputPanel.java new file mode 100644 index 0000000..5493caf --- /dev/null +++ b/src/main/java/org/gcube/portlets/widgets/dataminermanagerwidget/client/experiments/ComputationOutputPanel.java @@ -0,0 +1,295 @@ +/** + * + */ +package org.gcube.portlets.widgets.dataminermanagerwidget.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.data.analysis.dataminermanagercl.shared.data.output.TableResource; +import org.gcube.portlets.widgets.dataminermanagerwidget.client.common.EventBusProvider; +import org.gcube.portlets.widgets.dataminermanagerwidget.client.events.OutputDataEvent; +import org.gcube.portlets.widgets.dataminermanagerwidget.client.events.OutputDataRequestEvent; +import org.gcube.portlets.widgets.dataminermanagerwidget.client.util.UtilsGXT3; +import org.gcube.portlets.widgets.dataminermanagerwidget.client.widgets.FileViewer; +import org.gcube.portlets.widgets.dataminermanagerwidget.client.widgets.ImageViewer; +import org.gcube.portlets.widgets.dataminermanagerwidget.client.widgets.ResourceViewer; + +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 email: g.panichi@isti.cnr.it + * + */ +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/widgets/dataminermanagerwidget/client/experiments/ComputationPanel.java b/src/main/java/org/gcube/portlets/widgets/dataminermanagerwidget/client/experiments/ComputationPanel.java new file mode 100644 index 0000000..69a3c46 --- /dev/null +++ b/src/main/java/org/gcube/portlets/widgets/dataminermanagerwidget/client/experiments/ComputationPanel.java @@ -0,0 +1,146 @@ +package org.gcube.portlets.widgets.dataminermanagerwidget.client.experiments; + +import org.gcube.data.analysis.dataminermanagercl.shared.process.Operator; +import org.gcube.portlets.widgets.dataminermanagerwidget.client.DataMinerManager; +import org.gcube.portlets.widgets.dataminermanagerwidget.client.events.ComputationReadyEvent; +import org.gcube.portlets.widgets.dataminermanagerwidget.client.events.ComputationReadyEvent.ComputationReadyEventHandler; +import org.gcube.portlets.widgets.dataminermanagerwidget.client.events.ComputationReadyEvent.HasComputationReadyEventHandler; +import org.gcube.portlets.widgets.dataminermanagerwidget.client.experiments.ComputationParametersPanel.ComputationParametersPanelHandler; + +import com.google.gwt.event.shared.HandlerRegistration; +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.FramedPanel; +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.CenterLayoutContainer; +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; +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 email: g.panichi@isti.cnr.it + * + */ +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(); + } + + + 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 setToolBar() { + toolBar = new ToolBar(); + toolBar.add(new LabelToolItem("Tools:")); + + removeAllButton = new TextButton(DELETE_ALL_BUTTON_TOOLTIP); + removeAllButton.setToolTip(DELETE_ALL_BUTTON_TOOLTIP); + removeAllButton.setIcon(DataMinerManager.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(DataMinerManager.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(); + computationParametersPanel.updateOperatorParametersValues(); + Operator op = computationParametersPanel.getOperator(); + ComputationReadyEvent event = new ComputationReadyEvent(op); + fireEvent(event); + } + + } + }); + + addComputationParametersPanel(computationParametersPanel); + + } + + + +} diff --git a/src/main/java/org/gcube/portlets/widgets/dataminermanagerwidget/client/experiments/ComputationParametersPanel.java b/src/main/java/org/gcube/portlets/widgets/dataminermanagerwidget/client/experiments/ComputationParametersPanel.java new file mode 100644 index 0000000..8967ea2 --- /dev/null +++ b/src/main/java/org/gcube/portlets/widgets/dataminermanagerwidget/client/experiments/ComputationParametersPanel.java @@ -0,0 +1,325 @@ +/** + * + */ +package org.gcube.portlets.widgets.dataminermanagerwidget.client.experiments; + +import java.util.Arrays; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import org.gcube.data.analysis.dataminermanagercl.shared.parameters.ColumnListParameter; +import org.gcube.data.analysis.dataminermanagercl.shared.parameters.ColumnParameter; +import org.gcube.data.analysis.dataminermanagercl.shared.parameters.Parameter; +import org.gcube.data.analysis.dataminermanagercl.shared.parameters.ParameterType; +import org.gcube.data.analysis.dataminermanagercl.shared.process.Operator; +import org.gcube.portlets.widgets.dataminermanagerwidget.client.DataMinerManager; +import org.gcube.portlets.widgets.dataminermanagerwidget.client.common.EventBusProvider; +import org.gcube.portlets.widgets.dataminermanagerwidget.client.events.SessionExpiredEvent; +import org.gcube.portlets.widgets.dataminermanagerwidget.client.parametersfield.AbstractFld; +import org.gcube.portlets.widgets.dataminermanagerwidget.client.parametersfield.ColumnFld; +import org.gcube.portlets.widgets.dataminermanagerwidget.client.parametersfield.ColumnListFld; +import org.gcube.portlets.widgets.dataminermanagerwidget.client.parametersfield.OperatorFieldWidget; +import org.gcube.portlets.widgets.dataminermanagerwidget.client.parametersfield.TabularFld; +import org.gcube.portlets.widgets.dataminermanagerwidget.client.rpc.DataMinerPortletServiceAsync; +import org.gcube.portlets.widgets.dataminermanagerwidget.client.util.UtilsGXT3; +import org.gcube.portlets.widgets.dataminermanagerwidget.shared.Constants; +import org.gcube.portlets.widgets.dataminermanagerwidget.shared.exception.SessionExpiredServiceException; + +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.rpc.AsyncCallback; +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 email: g.panichi@isti.cnr.it + * + */ +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 = DataMinerManager.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(DataMinerManager.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 parametersPanel + */ + private void loadOperatorParameters() { + DataMinerPortletServiceAsync.INSTANCE.getParameters(operator, + new AsyncCallback>() { + @Override + public void onSuccess(List result) { + Log.debug("Retrieved Parameters!"); + operator.setOperatorParameters(result); + vParameters.clear(); + showForm(); + } + + @Override + public void onFailure(Throwable caught) { + if (caught instanceof SessionExpiredServiceException) { + UtilsGXT3.alert("Error", "Expired Session!"); + EventBusProvider.INSTANCE + .fireEvent(new SessionExpiredEvent()); + } else { + + Log.error("Impossible to retrieve parameters. " + + caught.getLocalizedMessage()); + caught.printStackTrace(); + UtilsGXT3.alert("Error ", + "Impossible to retrieve parameters. " + + caught.getLocalizedMessage()); + } + } + }); + + } + + /** + * + */ + 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))); + } + + for (Parameter p : operator.getOperatorParameters()) { + if (p.getTypology().compareTo(ParameterType.COLUMN) == 0 + || p.getTypology().compareTo( + ParameterType.COLUMN_LIST) == 0) { + // search for the table parameter which it depends + String tabParamName = (p.getTypology().compareTo( + ParameterType.COLUMN) == 0 ? ((ColumnParameter) p) + .getReferredTabularParameterName() + : ((ColumnListParameter) p) + .getReferredTabularParameterName()); + + try { + // get the column field and the tabular field referred + TabularFld tabularField = (TabularFld) fieldWidgetsMap + .get(tabParamName).getField(); + if (tabularField != null) { + AbstractFld field = fieldWidgetsMap + .get(p.getName()).getField(); + if (field instanceof ColumnFld) { + ColumnFld columnField = (ColumnFld) field; + tabularField + .addTabularFldChangeEventHandler(columnField); + } else { + if (field instanceof ColumnListFld) { + ColumnListFld columnListField = (ColumnListFld) field; + tabularField + .addTabularFldChangeEventHandler(columnListField); + } else { + + } + } + + } + } catch (Exception e) { + e.printStackTrace(); + UtilsGXT3 + .alert("Error", + "Column parameter \"" + + p.getName() + + " refers to a tabular parameter that doesn't exists (" + + tabParamName + ")\""); + } + } + } + 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.printStackTrace(); + } + } + + public void updateOperatorParametersValues() { + for (Map.Entry entry : fieldWidgetsMap + .entrySet()) { + OperatorFieldWidget fieldWidget = entry.getValue(); + fieldWidget.updateOperatorParameterValue(); + } + } + + /** + * @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/widgets/dataminermanagerwidget/client/experiments/ComputationStatusPanel.java b/src/main/java/org/gcube/portlets/widgets/dataminermanagerwidget/client/experiments/ComputationStatusPanel.java new file mode 100644 index 0000000..021b60c --- /dev/null +++ b/src/main/java/org/gcube/portlets/widgets/dataminermanagerwidget/client/experiments/ComputationStatusPanel.java @@ -0,0 +1,316 @@ +/** + * + */ +package org.gcube.portlets.widgets.dataminermanagerwidget.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.widgets.dataminermanagerwidget.client.common.EventBusProvider; +import org.gcube.portlets.widgets.dataminermanagerwidget.client.custom.progress.GreenProgressBar; +import org.gcube.portlets.widgets.dataminermanagerwidget.client.custom.progress.OrangeProgressBar; +import org.gcube.portlets.widgets.dataminermanagerwidget.client.custom.progress.RedProgressBar; +import org.gcube.portlets.widgets.dataminermanagerwidget.client.events.CancelComputationExecutionRequestEvent; +import org.gcube.portlets.widgets.dataminermanagerwidget.client.rpc.DataMinerPortletServiceAsync; +import org.gcube.portlets.widgets.dataminermanagerwidget.client.util.UtilsGXT3; +import org.gcube.portlets.widgets.dataminermanagerwidget.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 email: g.panichi@isti.cnr.it + * + */ +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; + + /** + * + */ + 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() + " [link]

")); + + 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(); + } + 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 ....."); + DataMinerPortletServiceAsync.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/widgets/dataminermanagerwidget/client/experiments/EquivalentRequestDialog.java b/src/main/java/org/gcube/portlets/widgets/dataminermanagerwidget/client/experiments/EquivalentRequestDialog.java new file mode 100644 index 0000000..0153870 --- /dev/null +++ b/src/main/java/org/gcube/portlets/widgets/dataminermanagerwidget/client/experiments/EquivalentRequestDialog.java @@ -0,0 +1,47 @@ +package org.gcube.portlets.widgets.dataminermanagerwidget.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 email: g.panichi@isti.cnr.it + * + */ +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/widgets/dataminermanagerwidget/client/experiments/ExperimentPanel.java b/src/main/java/org/gcube/portlets/widgets/dataminermanagerwidget/client/experiments/ExperimentPanel.java new file mode 100644 index 0000000..b110732 --- /dev/null +++ b/src/main/java/org/gcube/portlets/widgets/dataminermanagerwidget/client/experiments/ExperimentPanel.java @@ -0,0 +1,83 @@ +package org.gcube.portlets.widgets.dataminermanagerwidget.client.experiments; + + +import org.gcube.data.analysis.dataminermanagercl.shared.process.Operator; + +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; + +/** + * + * @author Giancarlo Panichi email: g.panichi@isti.cnr.it + * + */ +public class ExperimentPanel extends SimpleContainer implements + OperatorsPanelHandler { + + private WorkflowPanel workflowPanel; + private OperatorsPanel operatorsPanel; + private OperatorPanel lastOperatorSelected = null; + + /** + * + */ + public ExperimentPanel() { + super(); + init(); + create(); + + } + + private void init() { + } + + 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); + + // West + + BorderLayoutData westData = new BorderLayoutData(320); + westData.setCollapsible(true); + westData.setSplit(true); + westData.setFloatable(false); + westData.setCollapseMini(false); + westData.setMargins(new Margins(0, 5, 0, 0)); + westData.setCollapseHidden(false); + + experimentPanelLayout.setWestWidget(operatorsPanel, westData); + + add(experimentPanelLayout, new MarginData(0)); + + } + + /** + * + */ + @Override + public void addOperator(OperatorPanel operatorPanel, 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/widgets/dataminermanagerwidget/client/experiments/OperatorCategoryPanel.java b/src/main/java/org/gcube/portlets/widgets/dataminermanagerwidget/client/experiments/OperatorCategoryPanel.java new file mode 100644 index 0000000..6e579bf --- /dev/null +++ b/src/main/java/org/gcube/portlets/widgets/dataminermanagerwidget/client/experiments/OperatorCategoryPanel.java @@ -0,0 +1,177 @@ +/** + * + */ +package org.gcube.portlets.widgets.dataminermanagerwidget.client.experiments; + +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; + +import com.google.gwt.core.client.GWT; +import com.google.gwt.event.dom.client.ClickEvent; +import com.google.gwt.event.dom.client.ClickHandler; +import com.sencha.gxt.core.client.Style.Side; +import com.sencha.gxt.core.client.util.Format; +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.tips.ToolTipConfig; + +/** + * + * @author Giancarlo Panichi + * email: g.panichi@isti.cnr.it + * + */ +public class OperatorCategoryPanel extends SimpleContainer { + + private List operatorPanelsList = null; + private OperatorsPanelHandler handler; + private static final int TOOLTIP_WIDTH = 300; + private boolean isCollapsed = true; + private OperatorCategory category; + private HtmlLayoutContainer categoryHtml; + private VerticalLayoutContainer v; + + /** + * + * @param handler + * @param cat + */ + public OperatorCategoryPanel(OperatorsPanelHandler handler, OperatorCategory cat) { + super(); + this.handler = handler; + this.category = cat; + create(); + } + + + + public OperatorCategory getCategory() { + return category; + } + + + + private void create(){ + v=new VerticalLayoutContainer(); + add(v); + // set category info + categoryHtml = new HtmlLayoutContainer(category.getName() + " ("+category.getOperators().size()+")"); + categoryHtml.addStyleName("categoryItem"); + categoryHtml.addStyleName("categoryItem-Collapsed"); + ToolTipConfig tooltipConfig = createToolTip(category); + categoryHtml.setToolTipConfig(tooltipConfig); + + addDomHandler(new ClickHandler() { + + @Override + public void onClick(ClickEvent event) { + switchOpenClose(); + + } + + }, ClickEvent.getType()); + + v.add(categoryHtml); + } + + /** + * + * @param cat + * @return + */ + private ToolTipConfig createToolTip(OperatorCategory cat) { + ToolTipConfig tooltipConfig = new ToolTipConfig(); + tooltipConfig.setTitleHtml("
  "+cat.getName()); + tooltipConfig.setMouseOffsetX(0); + tooltipConfig.setMouseOffsetY(0); + tooltipConfig.setAnchor(Side.LEFT); + tooltipConfig.setDismissDelay(5000); + tooltipConfig.setBodyHtml( + getTooltipTemplate(GWT.getModuleBaseURL(), cat.getId(), cat.hasImage(), cat.getDescription()) + ); + tooltipConfig.setMaxWidth(TOOLTIP_WIDTH); + return tooltipConfig; + } + + /** + * + * @param base + * @param id + * @param hasImage + * @param description + * @return + */ + private String getTooltipTemplate(String base, String id, boolean hasImage, String description){ + String html = + "
"+ + ""+ + Format.ellipse(description, 100)+ + "
"; + return html; + }; + + /** + * + */ + public void switchOpenClose() { + if (isCollapsed) + expand(); + else + collapse(); + } + + /** + * + */ + private void collapse() { + categoryHtml.removeStyleName("categoryItem-Expanded"); + categoryHtml.addStyleName("categoryItem-Collapsed"); + + for (OperatorPanel op: this.operatorPanelsList) + v.remove(op); + isCollapsed = true; + forceLayout(); + } + + /** + * + */ + private void expand() { + if (operatorPanelsList==null) { + // init operator panels + operatorPanelsList = new ArrayList(); + for (Operator op : category.getOperators()) { + OperatorPanel operatorPanel = new OperatorPanel(op, handler); + operatorPanelsList.add(operatorPanel); + } + } + + categoryHtml.removeStyleName("categoryItem-Collapsed"); + categoryHtml.addStyleName("categoryItem-Expanded"); + for (OperatorPanel op: this.operatorPanelsList) + v.add(op); + isCollapsed = false; + forceLayout(); + } + + public void setDefaultOperator(){ + expand(); + } + + + + public void setOperatorDefault(Operator operatorDefault) { + expand(); + for(OperatorPanel opPanel:operatorPanelsList){ + if(opPanel.getOperator().compareTo(operatorDefault)==0){ + opPanel.setAsTheDefaultOperator(); + break; + } + } + + } +} diff --git a/src/main/java/org/gcube/portlets/widgets/dataminermanagerwidget/client/experiments/OperatorPanel.java b/src/main/java/org/gcube/portlets/widgets/dataminermanagerwidget/client/experiments/OperatorPanel.java new file mode 100644 index 0000000..6923322 --- /dev/null +++ b/src/main/java/org/gcube/portlets/widgets/dataminermanagerwidget/client/experiments/OperatorPanel.java @@ -0,0 +1,136 @@ +package org.gcube.portlets.widgets.dataminermanagerwidget.client.experiments; + + +import org.gcube.data.analysis.dataminermanagercl.shared.process.Operator; + +import com.google.gwt.core.client.GWT; +import com.google.gwt.event.dom.client.ClickEvent; +import com.google.gwt.event.dom.client.ClickHandler; +import com.google.gwt.user.client.ui.HTML; +import com.sencha.gxt.core.client.Style.Side; +import com.sencha.gxt.core.client.util.Format; +import com.sencha.gxt.core.client.util.Margins; +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.tips.ToolTipConfig; + +/** + * + * @author Giancarlo Panichi + * email: g.panichi@isti.cnr.it + * + */ +public class OperatorPanel extends SimpleContainer { + + private static final int TOOLTIP_DESCRIPTION_LENGHT = 435; + private static final int OPERATOR_BRIEF_DESCRIPTION_LENGHT = 160; + private static final int TOOLTIP_WIDTH = 500; + private VerticalLayoutContainer vert; + + private Operator operator; + private OperatorsPanelHandler handler; + private HTML titleHtml; + + /** + * + * @param operator + * @param handler + */ + public OperatorPanel(Operator operator, OperatorsPanelHandler handler) { + super(); + this.operator = operator; + this.handler = handler; + init(); + + } + + private void init() { + addStyleName("operatorPanel"); + addStyleName("opePanel"); + + addDomHandler(new ClickHandler() { + + @Override + public void onClick(ClickEvent event) { + event.stopPropagation(); + handler.addOperator(OperatorPanel.this, operator); + + } + + }, ClickEvent.getType()); + + titleHtml = new HTML(operator.getName()); + titleHtml.addStyleName("operatorPanel-title"); + + HTML descriptionHtml = new HTML(Format.ellipse(operator.getBriefDescription(),OPERATOR_BRIEF_DESCRIPTION_LENGHT)); + descriptionHtml.addStyleName("operatorPanel-briefDescription"); + + vert=new VerticalLayoutContainer(); + + vert.add(titleHtml, new VerticalLayoutData(1, -1, new Margins(0))); + vert.add(descriptionHtml, new VerticalLayoutData(1, -1, new Margins(0))); + add(vert); + + ToolTipConfig tooltipConfig = createToolTip(operator); + setToolTipConfig(tooltipConfig); + + } + + /** + * + * @return + */ + public Operator getOperator() { + return operator; + } + + /** + * @return + */ + private ToolTipConfig createToolTip(Operator op) { + ToolTipConfig tooltipConfig = new ToolTipConfig(); + tooltipConfig.setTitleHtml("
  " + op.getName()); + tooltipConfig.setMouseOffsetX(0); + tooltipConfig.setMouseOffsetY(0); + tooltipConfig.setAnchor(Side.LEFT); + tooltipConfig.setDismissDelay(5000); + tooltipConfig.setBodyHtml(getTooltipTemplate(GWT.getModuleBaseURL(), + op.getId(), op.hasImage(), op.getDescription())); + // config.setCloseable(true); + tooltipConfig.setMaxWidth(TOOLTIP_WIDTH); + return tooltipConfig; + } + + /** + * + * @param base + * @param id + * @param hasImage + * @param description + * @return + */ + private String getTooltipTemplate(String base, String id, boolean hasImage, + String description) { + String template = "
" + "" + Format.ellipse(description, TOOLTIP_DESCRIPTION_LENGHT) + + "
"; + + return template; + }; + + public void toggleSelected(boolean isSelect) { + if (isSelect) + this.addStyleName("operatorPanel-selected"); + // titleHtml.addStyleName("operatorPanel-title-selected"); + else + this.removeStyleName("operatorPanel-selected"); + // titleHtml.removeStyleName("operatorPanel-title-selected"); + } + + public void setAsTheDefaultOperator(){ + handler.addOperator(OperatorPanel.this, operator); + } + +} diff --git a/src/main/java/org/gcube/portlets/widgets/dataminermanagerwidget/client/experiments/OperatorsPanel.java b/src/main/java/org/gcube/portlets/widgets/dataminermanagerwidget/client/experiments/OperatorsPanel.java new file mode 100644 index 0000000..6f3df48 --- /dev/null +++ b/src/main/java/org/gcube/portlets/widgets/dataminermanagerwidget/client/experiments/OperatorsPanel.java @@ -0,0 +1,380 @@ +/** + * + */ +package org.gcube.portlets.widgets.dataminermanagerwidget.client.experiments; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import org.gcube.data.analysis.dataminermanagercl.shared.process.Operator; +import org.gcube.data.analysis.dataminermanagercl.shared.process.OperatorCategory; +import org.gcube.data.analysis.dataminermanagercl.shared.process.OperatorsClassification; +import org.gcube.portlets.widgets.dataminermanagerwidget.client.DataMinerManager; +import org.gcube.portlets.widgets.dataminermanagerwidget.client.common.EventBusProvider; +import org.gcube.portlets.widgets.dataminermanagerwidget.client.events.OperatorsClassificationEvent; +import org.gcube.portlets.widgets.dataminermanagerwidget.client.events.OperatorsClassificationRequestEvent; +import org.gcube.portlets.widgets.dataminermanagerwidget.client.type.OperatorsClassificationRequestType; +import org.gcube.portlets.widgets.dataminermanagerwidget.shared.Constants; + +import com.allen_sauer.gwt.log.client.Log; +import com.google.gwt.event.dom.client.KeyUpEvent; +import com.google.gwt.event.dom.client.KeyUpHandler; +import com.google.gwt.event.logical.shared.SelectionEvent; +import com.google.gwt.event.logical.shared.SelectionHandler; +import com.google.gwt.resources.client.ImageResource; +import com.google.gwt.user.client.ui.HTML; +import com.sencha.gxt.core.client.dom.ScrollSupport.ScrollMode; +import com.sencha.gxt.core.client.util.Margins; +import com.sencha.gxt.data.shared.Store; +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.form.StoreFilterField; +import com.sencha.gxt.widget.core.client.menu.Item; +import com.sencha.gxt.widget.core.client.menu.Menu; +import com.sencha.gxt.widget.core.client.menu.MenuItem; +import com.sencha.gxt.widget.core.client.toolbar.ToolBar; + +/** + * + * @author Giancarlo Panichi email: g.panichi@isti.cnr.it + * + */ +public class OperatorsPanel extends FramedPanel { + + private static final String LOADING_MESSAGE = "Loading Operators..."; + // private static final String ERROR_GET_OPERATORS = + // "Operators not loaded."; + private static final String SHOW_ALL_OPERATORS_TOOLTIP = "Show all Operators without category classification."; + private static final String SHOW_CATEGORIES_TOOLTIP = "Show Operators by Categories"; + private OperatorsPanelHandler handler; + private VerticalLayoutContainer topV; + private ToolBar toolBar; + private VerticalLayoutContainer v; + private OperatorsClassification operatorsClassification; + private List operators; + + // private ArrayList categoryPanels; + private Map> mapCategoriesPanels = new HashMap>(); + + private enum View { + CATEGORIES, FILTER, ALL + }; + + private View view = null; + private String currentClassificationName = Constants.UserClassificationName; + + + /** + * + */ + public OperatorsPanel(OperatorsPanelHandler handler) { + super(); + this.handler = handler; + this.operators = new ArrayList(); + init(); + bind(); + create(); + + } + + private void init() { + setHeadingText("Operators"); + setBodyStyle("backgroundColor:white;"); + setCollapsible(true); + } + + private void bind() { + EventBusProvider.INSTANCE + .addHandler( + OperatorsClassificationEvent.TYPE, + new OperatorsClassificationEvent.OperatorsClassificationEventHandler() { + + @Override + public void onOperatorsClassification( + OperatorsClassificationEvent event) { + Log.debug("OperatorsPanel catch OperatorsClassificationEvent: " + + event); + manageOperatorsClassificationEvent(event); + } + }); + } + + private void manageOperatorsClassificationEvent( + OperatorsClassificationEvent event) { + if (event.getOperatorsClassificationRequestType().compareTo( + OperatorsClassificationRequestType.ByName) == 0) { + if (currentClassificationName.compareTo(event + .getClassificationName()) == 0) { + waitMessage(false); + if (event.getOperatorsClassification() != null) { + operatorsClassification = event + .getOperatorsClassification(); + operators.clear(); + operators.addAll(event.getOperatorsClassification() + .getOperators()); + String operatorId = event.getOperatorId(); + + Log.debug("ShowCategoriesList"); + List categoryPanels = mapCategoriesPanels + .get(currentClassificationName); + if (categoryPanels == null) { + categoryPanels = new ArrayList(); + if (operatorsClassification != null) { + for (OperatorCategory cat : operatorsClassification + .getOperatorCategories()) { + categoryPanels.add(new OperatorCategoryPanel( + handler, cat)); + } + } + mapCategoriesPanels.put(currentClassificationName, + categoryPanels); + } + + v.clear(); + for (OperatorCategoryPanel panel : categoryPanels){ + v.add(panel); + + } + view = View.CATEGORIES; + if(operatorId!=null&&!operatorId.isEmpty()){ + OperatorCategory operatorCategoryDefault=null; + Operator operatorDefault=null; + for(Operator op:operators){ + if(op.getId().compareTo(operatorId)==0){ + operatorDefault=op; + operatorCategoryDefault=op.getCategory(); + break; + } + } + if(operatorCategoryDefault!=null){ + for (OperatorCategoryPanel opCategoryPanel : categoryPanels){ + if(opCategoryPanel.getCategory().compareTo(operatorCategoryDefault)==0){ + opCategoryPanel.setOperatorDefault(operatorDefault); + break; + } + + } + } + + + } + + forceLayout(); + } + + } + } + + } + + private void create() { + topV = new VerticalLayoutContainer(); + initToolbar(); + topV.add(toolBar, new VerticalLayoutData(1, -1, new Margins(0))); + SimpleContainer operators = new SimpleContainer(); + v = new VerticalLayoutContainer(); + v.setScrollMode(ScrollMode.AUTO); + operators.add(v); + topV.add(operators, new VerticalLayoutData(1, 1, new Margins(0))); + add(topV); + waitMessage(true); + OperatorsClassificationRequestEvent operatorsClassificationRequestEvent = new OperatorsClassificationRequestEvent( + currentClassificationName, true); + Log.debug("OperatorsPanel fire: " + operatorsClassificationRequestEvent); + EventBusProvider.INSTANCE + .fireEvent(operatorsClassificationRequestEvent); + } + + /** + * + */ + private void initToolbar() { + toolBar = new ToolBar(); + + final StoreFilterField filterField = new StoreFilterField() { + + @Override + protected boolean doSelect(Store store, String parent, + String item, String filter) { + Log.debug("StoreFilterField: " + item + " " + filter); + return false; + } + + }; + + filterField.addKeyUpHandler(new KeyUpHandler() { + + @Override + public void onKeyUp(KeyUpEvent event) { + String searchText = filterField.getCurrentValue(); + if (searchText == null || searchText.isEmpty()) { + showCategoriesList(false); + } else { + if (searchText.length() >= 2) { + showFilteredList(searchText); + } + } + + } + }); + filterField.setWidth(100); + + TextButton showAllOperatorsButton = new TextButton(); + showAllOperatorsButton.setIcon(DataMinerManager.resources + .sortAscending()); + showAllOperatorsButton + .addSelectHandler(new SelectEvent.SelectHandler() { + + @Override + public void onSelect(SelectEvent event) { + filterField.clear(); + showAllOperatorsList(); + + } + }); + showAllOperatorsButton.setToolTip(SHOW_ALL_OPERATORS_TOOLTIP); + + TextButton showCategoriesButton = new TextButton(); + showCategoriesButton.setIcon(DataMinerManager.resources.tree()); + showCategoriesButton.addSelectHandler(new SelectEvent.SelectHandler() { + + @Override + public void onSelect(SelectEvent event) { + filterField.clear(); + showCategoriesList(false); + + } + }); + + showCategoriesButton.setToolTip(SHOW_CATEGORIES_TOOLTIP); + + final TextButton btnMenuPerspective = new TextButton( + currentClassificationName); + btnMenuPerspective + .setIcon(DataMinerManager.resources.userPerspective()); + + Menu menuPerspective = new Menu(); + + for (final String perspectiveName : Constants.ClassificationNames) { + final ImageResource img = perspectiveName + .equals(Constants.UserClassificationName) ? DataMinerManager.resources + .userPerspective() : DataMinerManager.resources + .computationPerspective(); + MenuItem perspectiveItem = new MenuItem(perspectiveName); + perspectiveItem.addSelectionHandler(new SelectionHandler() { + + @Override + public void onSelection(SelectionEvent event) { + filterField.clear(); + currentClassificationName = perspectiveName; + btnMenuPerspective.setText(perspectiveName); + btnMenuPerspective.setIcon(img); + showCategoriesList(true); + + } + }); + perspectiveItem.setIcon(img); + menuPerspective.add(perspectiveItem); + } + btnMenuPerspective.setMenu(menuPerspective); + + toolBar.add(showCategoriesButton); + toolBar.add(showAllOperatorsButton); + toolBar.add(filterField); + toolBar.add(btnMenuPerspective); + + return; + } + + private void waitMessage(boolean show) { + if (show) + this.mask(LOADING_MESSAGE); + else + this.unmask(); + } + + private void showFilteredList(String searchText) { + + List filteredOperators = new ArrayList(); + List ids = new ArrayList(); + for (Operator op : operators) + // check for filtering and prevent duplicates + if (op.getName().toLowerCase().contains(searchText.toLowerCase()) + && !ids.contains(op.getId())) { + filteredOperators.add(op); + ids.add(op.getId()); + } + + v.clear(); + + HTML html = new HTML("Filtered results (" + + filteredOperators.size() + " item" + + (filteredOperators.size() == 1 ? "" : "s") + " found)"); + html.addStyleName("filterResultText"); + v.add(html); + + for (Operator op : filteredOperators) + v.add(new OperatorPanel(op, handler)); + view = View.FILTER; + forceLayout(); + + } + + private void showCategoriesList(boolean force) { + + try { + if (force || view != View.CATEGORIES) { + Log.debug("ShowCategoriesList"); + List categoryPanels = mapCategoriesPanels + .get(currentClassificationName); + if (categoryPanels == null) { + categoryPanels = new ArrayList(); + if (operatorsClassification != null) { + for (OperatorCategory cat : operatorsClassification + .getOperatorCategories()) { + categoryPanels.add(new OperatorCategoryPanel( + handler, cat)); + } + } + mapCategoriesPanels.put(currentClassificationName, + categoryPanels); + } + + v.clear(); + for (OperatorCategoryPanel panel : categoryPanels) + v.add(panel); + view = View.CATEGORIES; + forceLayout(); + } + } catch (Throwable e) { + Log.error(e.getLocalizedMessage()); + e.printStackTrace(); + } + } + + private void showAllOperatorsList() { + if (view != View.ALL) { + v.clear(); + + HTML html = new HTML("All Operators (" + + operators.size() + " item" + + (operators.size() == 1 ? "" : "s") + " found)"); + html.addStyleName("filterResultText"); + v.add(html); + + for (Operator op : operators) + v.add(new OperatorPanel(op, handler)); + view = View.ALL; + forceLayout(); + + } + } + +} diff --git a/src/main/java/org/gcube/portlets/widgets/dataminermanagerwidget/client/experiments/OperatorsPanelHandler.java b/src/main/java/org/gcube/portlets/widgets/dataminermanagerwidget/client/experiments/OperatorsPanelHandler.java new file mode 100644 index 0000000..e3e00e2 --- /dev/null +++ b/src/main/java/org/gcube/portlets/widgets/dataminermanagerwidget/client/experiments/OperatorsPanelHandler.java @@ -0,0 +1,23 @@ +/** + * + */ +package org.gcube.portlets.widgets.dataminermanagerwidget.client.experiments; + +import org.gcube.data.analysis.dataminermanagercl.shared.process.Operator; + + +/** + * + * @author Giancarlo Panichi + * email: g.panichi@isti.cnr.it + * + */ +public interface OperatorsPanelHandler { + + /** + * @param operatorPanel + * @param operator + */ + void addOperator(OperatorPanel operatorPanel, Operator operator); + +} diff --git a/src/main/java/org/gcube/portlets/widgets/dataminermanagerwidget/client/experiments/WorkflowPanel.java b/src/main/java/org/gcube/portlets/widgets/dataminermanagerwidget/client/experiments/WorkflowPanel.java new file mode 100644 index 0000000..5069530 --- /dev/null +++ b/src/main/java/org/gcube/portlets/widgets/dataminermanagerwidget/client/experiments/WorkflowPanel.java @@ -0,0 +1,113 @@ +/** + * + */ +package org.gcube.portlets.widgets.dataminermanagerwidget.client.experiments; + +import org.gcube.data.analysis.dataminermanagercl.shared.process.Operator; +import org.gcube.portlets.widgets.dataminermanagerwidget.client.DataMinerManager; +import org.gcube.portlets.widgets.dataminermanagerwidget.client.common.EventBusProvider; +import org.gcube.portlets.widgets.dataminermanagerwidget.client.events.ComputationReadyEvent; +import org.gcube.portlets.widgets.dataminermanagerwidget.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 email: g.panichi@isti.cnr.it + * + */ +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(DataMinerManager.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(DataMinerManager.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/widgets/dataminermanagerwidget/client/monitor/StatusMonitor.java b/src/main/java/org/gcube/portlets/widgets/dataminermanagerwidget/client/monitor/StatusMonitor.java new file mode 100644 index 0000000..8552f56 --- /dev/null +++ b/src/main/java/org/gcube/portlets/widgets/dataminermanagerwidget/client/monitor/StatusMonitor.java @@ -0,0 +1,63 @@ +package org.gcube.portlets.widgets.dataminermanagerwidget.client.monitor; + +import com.google.gwt.safehtml.shared.SafeHtml; +import com.sencha.gxt.widget.core.client.box.AutoProgressMessageBox; + +/** + * + * @author giancarlo email: g.panichi@isti.cnr.it + * + */ +public class StatusMonitor extends AutoProgressMessageBox { + + public StatusMonitor() { + super("Waiting", "Please wait..."); + create(); + } + + /** + * + * @param headingHtml + * @param messageHtml + */ + public StatusMonitor(SafeHtml headingHtml, SafeHtml messageHtml) { + super(headingHtml, messageHtml); + create(); + } + + /** + * + * @param headingHtml + */ + public StatusMonitor(SafeHtml headingHtml) { + super(headingHtml); + create(); + } + + /** + * + * @param headingHtml + * @param messageHtml + */ + public StatusMonitor(String headingHtml, String messageHtml) { + super(headingHtml, messageHtml); + create(); + } + + /** + * + * @param headingHtml + */ + public StatusMonitor(String headingHtml) { + super(headingHtml); + create(); + } + + private void create() { + setProgressText("In progress..."); + auto(); + show(); + } + +} diff --git a/src/main/java/org/gcube/portlets/widgets/dataminermanagerwidget/client/parametersfield/AbstractFld.java b/src/main/java/org/gcube/portlets/widgets/dataminermanagerwidget/client/parametersfield/AbstractFld.java new file mode 100644 index 0000000..a00ebcf --- /dev/null +++ b/src/main/java/org/gcube/portlets/widgets/dataminermanagerwidget/client/parametersfield/AbstractFld.java @@ -0,0 +1,54 @@ +/** + * + */ +package org.gcube.portlets.widgets.dataminermanagerwidget.client.parametersfield; + + +import org.gcube.data.analysis.dataminermanagercl.shared.parameters.Parameter; + +import com.google.gwt.user.client.ui.Widget; + +/** + * + * @author Giancarlo Panichi + * email: g.panichi@isti.cnr.it + * + */ +public abstract class AbstractFld { + + protected Parameter parameter; + public abstract String getValue(); + public abstract Widget getWidget(); + + + /** + * + */ + public AbstractFld(Parameter parameter) { + this.parameter = parameter; + } + + /** + * @return the operator + */ + public Parameter getParameter() { + return parameter; + } + + /** + * @param operator the operator to set + */ + public void setParameter(Parameter parameter) { + this.parameter = parameter; + } + + /** + * + * @return + */ + public boolean isValid() { + return true; + } + + +} diff --git a/src/main/java/org/gcube/portlets/widgets/dataminermanagerwidget/client/parametersfield/BooleanFld.java b/src/main/java/org/gcube/portlets/widgets/dataminermanagerwidget/client/parametersfield/BooleanFld.java new file mode 100644 index 0000000..8153d89 --- /dev/null +++ b/src/main/java/org/gcube/portlets/widgets/dataminermanagerwidget/client/parametersfield/BooleanFld.java @@ -0,0 +1,106 @@ +/** + * + */ +package org.gcube.portlets.widgets.dataminermanagerwidget.client.parametersfield; + +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.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.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.form.SimpleComboBox; + +/** + * + * @author Giancarlo Panichi email: g.panichi@isti.cnr.it + * + */ +public class BooleanFld extends AbstractFld { + + private SimpleContainer fieldContainer; + private SimpleComboBox listBox; + + /** + * @param parameter + */ + public BooleanFld(Parameter parameter) { + super(parameter); + fieldContainer = new SimpleContainer(); + HBoxLayoutContainer horiz = new HBoxLayoutContainer(); + horiz.setPack(BoxLayoutPack.START); + horiz.setEnableOverflow(false); + + ObjectParameter p = (ObjectParameter) parameter; + + listBox = new SimpleComboBox(new StringLabelProvider<>()); + listBox.add("true"); + listBox.add("false"); + listBox.setAllowBlank(false); + listBox.setForceSelection(true); + listBox.setEditable(false); + listBox.setTriggerAction(TriggerAction.ALL); + + if (p.getDefaultValue() != null&& !p.getDefaultValue().isEmpty()) { + Boolean b=Boolean.valueOf(p.getDefaultValue()); + if(b){ + listBox.setValue("true"); + } else { + listBox.setValue("false"); + } + + } else { + listBox.setValue("false"); + } + + 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/widgets/dataminermanagerwidget/client/parametersfield/ColumnFld.java b/src/main/java/org/gcube/portlets/widgets/dataminermanagerwidget/client/parametersfield/ColumnFld.java new file mode 100644 index 0000000..41c2a66 --- /dev/null +++ b/src/main/java/org/gcube/portlets/widgets/dataminermanagerwidget/client/parametersfield/ColumnFld.java @@ -0,0 +1,184 @@ +/** + * + */ +package org.gcube.portlets.widgets.dataminermanagerwidget.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.widgets.dataminermanagerwidget.client.events.TabularFldChangeEvent; +import org.gcube.portlets.widgets.dataminermanagerwidget.client.events.TabularFldChangeEvent.TabularFldChangeEventHandler; +import org.gcube.portlets.widgets.dataminermanagerwidget.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 email: g.panichi@isti.cnr.it + * + */ +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 + */ + 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/widgets/dataminermanagerwidget/client/parametersfield/ColumnListFld.java b/src/main/java/org/gcube/portlets/widgets/dataminermanagerwidget/client/parametersfield/ColumnListFld.java new file mode 100644 index 0000000..574a9fd --- /dev/null +++ b/src/main/java/org/gcube/portlets/widgets/dataminermanagerwidget/client/parametersfield/ColumnListFld.java @@ -0,0 +1,227 @@ +/** + * + */ +package org.gcube.portlets.widgets.dataminermanagerwidget.client.parametersfield; + +import java.util.ArrayList; +import java.util.List; + +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.ColumnListParameter; +import org.gcube.data.analysis.dataminermanagercl.shared.parameters.Parameter; +import org.gcube.portlets.widgets.dataminermanagerwidget.client.events.TabularFldChangeEvent; +import org.gcube.portlets.widgets.dataminermanagerwidget.client.events.TabularFldChangeEvent.TabularFldChangeEventHandler; +import org.gcube.portlets.widgets.dataminermanagerwidget.client.properties.ColumnItemProperties; + +import com.google.gwt.cell.client.AbstractCell; +import com.google.gwt.core.client.GWT; +import com.google.gwt.safehtml.shared.SafeHtml; +import com.google.gwt.safehtml.shared.SafeHtmlBuilder; +import com.google.gwt.user.client.ui.Widget; +import com.sencha.gxt.core.client.IdentityValueProvider; +import com.sencha.gxt.core.client.Style.SelectionMode; +import com.sencha.gxt.core.client.XTemplates; +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.grid.CheckBoxSelectionModel; +import com.sencha.gxt.widget.core.client.grid.ColumnConfig; +import com.sencha.gxt.widget.core.client.grid.ColumnModel; +import com.sencha.gxt.widget.core.client.grid.Grid; + +/** + * + * @author Giancarlo Panichi email: g.panichi@isti.cnr.it + * + */ +public class ColumnListFld extends AbstractFld implements + TabularFldChangeEventHandler { + + interface LabelTemplates extends XTemplates { + @XTemplate("{value}") + SafeHtml format(String value); + } + + // private VerticalLayoutContainer vp; + private ColumnListParameter columnListParameter; + private ListStore store; + private Grid grid; + private CheckBoxSelectionModel sm; + private SimpleContainer fieldContainer; + private SimpleContainer vContainer; + + /** + * + * @param parameter + */ + public ColumnListFld(Parameter parameter) { + super(parameter); + + columnListParameter = (ColumnListParameter) parameter; + // vp = new VerticalLayoutContainer(); + + fieldContainer = new SimpleContainer(); + HBoxLayoutContainer horiz = new HBoxLayoutContainer(); + horiz.setPack(BoxLayoutPack.START); + horiz.setEnableOverflow(false); + + createGrid(); + + HtmlLayoutContainer descr; + + if (columnListParameter.getDescription() == null) { + descr = new HtmlLayoutContainer("

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

" + + columnListParameter.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 createGrid() { + ColumnItemProperties props = GWT.create(ColumnItemProperties.class); + + ColumnConfig labelCol = new ColumnConfig( + props.label()); + + labelCol.setCell(new AbstractCell() { + + @Override + public void render(Context context, String value, SafeHtmlBuilder sb) { + LabelTemplates labelTemplates = GWT + .create(LabelTemplates.class); + sb.append(labelTemplates.format(value)); + } + }); + + + IdentityValueProvider identity = new IdentityValueProvider(); + sm = new CheckBoxSelectionModel(identity); + + List> l = new ArrayList>(); + l.add(sm.getColumn()); + l.add(labelCol); + ColumnModel cm = new ColumnModel(l); + + store = new ListStore(props.id()); + + grid = new Grid(store, cm); + + sm.setSelectionMode(SelectionMode.MULTI); + grid.setSelectionModel(sm); + // grid.getView().setAutoExpandColumn(labelCol); + grid.setSize("180px", "150px"); + grid.getView().setStripeRows(true); + grid.getView().setColumnLines(true); + grid.getView().setAutoFill(true); + grid.setBorders(false); + grid.setLoadMask(true); + grid.setColumnReordering(true); + grid.setColumnResize(false); + grid.disable(); + + } + + private void showNoSelectionField() { + vContainer.clear(); + VerticalLayoutContainer vField = new VerticalLayoutContainer(); + HtmlLayoutContainer typeDescription = new HtmlLayoutContainer( + "

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

"); + typeDescription.setStylePrimaryName("workflow-parameters-description"); + vField.add(grid, 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(grid, new VerticalLayoutData(-1, -1, new Margins(0))); + vField.add(typeDescription, new VerticalLayoutData(-1, -1, new Margins( + 0))); + vContainer.add(vField); + } + + /** + * + */ + @Override + public String getValue() { + String separator = columnListParameter.getSeparator(); + String value = ""; + boolean first = true; + + for (ColumnItem columnItem : sm.getSelection()) { + String columnName = columnItem.getName(); + value += (first ? "" : separator) + columnName; + first = false; + } + return value; + } + + /** + * + */ + @Override + public Widget getWidget() { + return fieldContainer; + } + + /** + * + */ + @Override + public boolean isValid() { + return (sm.getSelection() != null && sm.getSelection().size() > 0); + } + + @Override + public void onChange(TabularFldChangeEvent event) { + TableItemSimple tableItemSimple = event.getTableItemSimple(); + if (tableItemSimple == null) { + store.clear(); + store.commitChanges(); + grid.disable(); + showNoSelectionField(); + } else { + store.clear(); + store.commitChanges(); + store.addAll(tableItemSimple.getColumns()); + store.commitChanges(); + grid.enable(); + showFieldWithSelection(tableItemSimple); + } + + } + +} diff --git a/src/main/java/org/gcube/portlets/widgets/dataminermanagerwidget/client/parametersfield/DateFld.java b/src/main/java/org/gcube/portlets/widgets/dataminermanagerwidget/client/parametersfield/DateFld.java new file mode 100644 index 0000000..8429859 --- /dev/null +++ b/src/main/java/org/gcube/portlets/widgets/dataminermanagerwidget/client/parametersfield/DateFld.java @@ -0,0 +1,117 @@ +/** + * + */ +package org.gcube.portlets.widgets.dataminermanagerwidget.client.parametersfield; + +import java.util.Date; + +import org.gcube.data.analysis.dataminermanagercl.shared.parameters.DateParameter; +import org.gcube.data.analysis.dataminermanagercl.shared.parameters.Parameter; + +import com.allen_sauer.gwt.log.client.Log; +import com.google.gwt.i18n.client.DateTimeFormat; +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.DateField; + +/** + * + * @author Giancarlo Panichi email: g.panichi@isti.cnr.it + * + */ +public class DateFld extends AbstractFld { + + private SimpleContainer fieldContainer; + private DateField dateField; + private DateTimeFormat dateFormat; + + /** + * @param parameter + */ + public DateFld(Parameter parameter) { + super(parameter); + + DateParameter p = (DateParameter) parameter; + + dateField = new DateField(); + dateFormat = DateTimeFormat.getFormat("yyyy-MM-dd"); + + try { + Date defaultDate = dateFormat.parse(p.getDefaultValue()); + dateField.setValue(defaultDate); + } catch (Throwable e) { + Log.error("DateFld invalid default value" + p.getDefaultValue()); + } + + if (p.getDefaultValue() == null || p.getDefaultValue().isEmpty()) + dateField.setAllowBlank(false); + + HtmlLayoutContainer descr; + + if (p.getDescription() == null) { + descr = new HtmlLayoutContainer( + "

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

" + + p.getDescription() + "

"); + descr.addStyleName("workflow-fieldDescription"); + } + + SimpleContainer vContainer = new SimpleContainer(); + VerticalLayoutContainer vField = new VerticalLayoutContainer(); + HtmlLayoutContainer typeDescription = new HtmlLayoutContainer( + "Date Value"); + typeDescription.setStylePrimaryName("workflow-parameters-description"); + vField.add(dateField, 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() { + String dateS = dateFormat.format(dateField.getCurrentValue()); + return dateS; + } + + /** + * + */ + @Override + public Widget getWidget() { + return fieldContainer; + } + + @Override + public boolean isValid() { + return dateField.isValid(); + } + +} diff --git a/src/main/java/org/gcube/portlets/widgets/dataminermanagerwidget/client/parametersfield/DoubleFld.java b/src/main/java/org/gcube/portlets/widgets/dataminermanagerwidget/client/parametersfield/DoubleFld.java new file mode 100644 index 0000000..5ef3228 --- /dev/null +++ b/src/main/java/org/gcube/portlets/widgets/dataminermanagerwidget/client/parametersfield/DoubleFld.java @@ -0,0 +1,102 @@ +package org.gcube.portlets.widgets.dataminermanagerwidget.client.parametersfield; + + +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.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.DoubleField; + +/** + * + * @author Giancarlo Panichi email: g.panichi@isti.cnr.it + * + */ +public class DoubleFld extends AbstractFld { + + private SimpleContainer fieldContainer; + private DoubleField numberField; + + /** + * @param operator + */ + public DoubleFld(Parameter parameter) { + super(parameter); + fieldContainer=new SimpleContainer(); + HBoxLayoutContainer horiz = new HBoxLayoutContainer(); + horiz.setPack(BoxLayoutPack.START); + horiz.setEnableOverflow(false); + + ObjectParameter p = (ObjectParameter) parameter; + + numberField = new DoubleField(); + + if (p.getDefaultValue() != null) + numberField.setValue(Double.parseDouble(p.getDefaultValue())); + numberField.setAllowBlank(false); + + HtmlLayoutContainer descr; + + if (p.getDescription() == null) { + descr = new HtmlLayoutContainer("

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

" + + p.getDescription() + "

"); + descr.addStyleName("workflow-fieldDescription"); + } + + SimpleContainer vContainer=new SimpleContainer(); + VerticalLayoutContainer vField = new VerticalLayoutContainer(); + HtmlLayoutContainer typeDescription = new HtmlLayoutContainer( + "Double Value"); + typeDescription.setStylePrimaryName("workflow-parameters-description"); + vField.add(numberField, new VerticalLayoutData(-1,-1,new Margins(0))); + vField.add(typeDescription, new VerticalLayoutData(-1,-1,new Margins(0))); + vContainer.add(vField); + + horiz.add(vContainer, new BoxLayoutData(new Margins())); + horiz.add(descr, new BoxLayoutData(new Margins())); + + fieldContainer.add(horiz); + + fieldContainer.forceLayout(); + } + + /** + * + */ + @Override + public String getValue() { + return numberField.getCurrentValue().toString(); + } + + /** + * + */ + @Override + public Widget getWidget() { + return fieldContainer; + } + + /** + * + */ + @Override + public boolean isValid() { + return numberField.isValid(); + } + + +} diff --git a/src/main/java/org/gcube/portlets/widgets/dataminermanagerwidget/client/parametersfield/EnumFld.java b/src/main/java/org/gcube/portlets/widgets/dataminermanagerwidget/client/parametersfield/EnumFld.java new file mode 100644 index 0000000..17d0fd2 --- /dev/null +++ b/src/main/java/org/gcube/portlets/widgets/dataminermanagerwidget/client/parametersfield/EnumFld.java @@ -0,0 +1,95 @@ +/** + * + */ +package org.gcube.portlets.widgets.dataminermanagerwidget.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 email: g.panichi@isti.cnr.it + * + */ +public class EnumFld extends AbstractFld { + + private SimpleContainer fieldContainer; + private SimpleComboBox listBox; + + /** + * @param 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/widgets/dataminermanagerwidget/client/parametersfield/FileFld.java b/src/main/java/org/gcube/portlets/widgets/dataminermanagerwidget/client/parametersfield/FileFld.java new file mode 100644 index 0000000..ae110cc --- /dev/null +++ b/src/main/java/org/gcube/portlets/widgets/dataminermanagerwidget/client/parametersfield/FileFld.java @@ -0,0 +1,312 @@ +/** + * + */ +package org.gcube.portlets.widgets.dataminermanagerwidget.client.parametersfield; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; + +import org.gcube.data.analysis.dataminermanagercl.shared.parameters.FileParameter; +import org.gcube.data.analysis.dataminermanagercl.shared.parameters.Parameter; +import org.gcube.portlets.widgets.dataminermanagerwidget.client.DataMinerManager; +import org.gcube.portlets.widgets.dataminermanagerwidget.client.common.EventBusProvider; +import org.gcube.portlets.widgets.dataminermanagerwidget.client.events.SessionExpiredEvent; +import org.gcube.portlets.widgets.dataminermanagerwidget.client.rpc.DataMinerPortletServiceAsync; +import org.gcube.portlets.widgets.dataminermanagerwidget.client.util.UtilsGXT3; +import org.gcube.portlets.widgets.dataminermanagerwidget.shared.exception.SessionExpiredServiceException; +import org.gcube.portlets.widgets.dataminermanagerwidget.shared.workspace.ItemDescription; +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.Window; +import com.google.gwt.user.client.rpc.AsyncCallback; +import com.google.gwt.user.client.ui.Widget; +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.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.event.SelectEvent; +import com.sencha.gxt.widget.core.client.form.TextField; + +/** + * + * @author Giancarlo Panichi email: g.panichi@isti.cnr.it + * + */ +public class FileFld extends AbstractFld { + + private VerticalLayoutContainer vp; + + // FileSelector fileSelector; + private WorkspaceExplorerSelectDialog wselectDialog; + private TextButton selectButton, selectButton2, cancelButton; + private ItemDescription selectedFileItem = null; + + private FileParameter fileParameter; + + private SimpleContainer fieldContainer; + + private HBoxLayoutContainer horiz; + + private TextButton downloadButton; + + /** + * @param parameter + */ + public FileFld(Parameter parameter) { + super(parameter); + fileParameter = (FileParameter) parameter; + + SimpleContainer tabContainer = new SimpleContainer(); + vp = new VerticalLayoutContainer(); + init(); + tabContainer.add(vp, new MarginData(new Margins(0))); + + fieldContainer = new SimpleContainer(); + horiz = new HBoxLayoutContainer(); + horiz.setPack(BoxLayoutPack.START); + horiz.setEnableOverflow(false); + + HtmlLayoutContainer descr; + + if (fileParameter.getDescription() == null) { + descr = new HtmlLayoutContainer("

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

" + + fileParameter.getDescription() + "

"); + descr.addStyleName("workflow-fieldDescription"); + } + + horiz.add(tabContainer, new BoxLayoutData(new Margins())); + horiz.add(descr, new BoxLayoutData(new Margins())); + + fieldContainer.add(horiz); + showNoSelectionField(); + + } + + private void init() { + + List selectableTypes = new ArrayList(); + selectableTypes.add(ItemType.EXTERNAL_FILE); + List showableTypes = new ArrayList(); + showableTypes.addAll(Arrays.asList(ItemType.values())); + + wselectDialog = new WorkspaceExplorerSelectDialog("Select File", false); + // filterCriteria, selectableTypes); + + WorskpaceExplorerSelectNotificationListener handler = new WorskpaceExplorerSelectNotificationListener() { + + @Override + public void onSelectedItem(Item item) { + + if (item.isFolder() || item.isRoot()) { + UtilsGXT3.info("Attention", "Select a valid file!"); + + } else { + retrieveFileInformation(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 file!"); + } + }; + + wselectDialog.addWorkspaceExplorerSelectNotificationListener(handler); + wselectDialog.setZIndex(XDOM.getTopZIndex()); + + selectButton = new TextButton("Select File"); + selectButton.setIcon(DataMinerManager.resources.folderExplore()); + selectButton.addSelectHandler(new SelectEvent.SelectHandler() { + + @Override + public void onSelect(SelectEvent event) { + wselectDialog.show(); + + } + }); + selectButton.setToolTip("Select File"); + + selectButton2 = new TextButton(""); + selectButton2.setIcon(DataMinerManager.resources.folderExplore()); + selectButton2.addSelectHandler(new SelectEvent.SelectHandler() { + + @Override + public void onSelect(SelectEvent event) { + wselectDialog.show(); + } + }); + selectButton2.setToolTip("Select Another File"); + + cancelButton = new TextButton(""); + cancelButton.setIcon(DataMinerManager.resources.cancel()); + cancelButton.addSelectHandler(new SelectEvent.SelectHandler() { + + @Override + public void onSelect(SelectEvent event) { + selectedFileItem = null; + showNoSelectionField(); + } + }); + + downloadButton = new TextButton(""); + downloadButton.setIcon(DataMinerManager.resources.download()); + downloadButton.addSelectHandler(new SelectEvent.SelectHandler() { + + @Override + public void onSelect(SelectEvent event) { + downloadFile(); + } + }); + + } + + private void retrieveFileInformation(final Item item) { + Log.debug("Retrieved: " + item); + final ItemDescription itemDescription = new ItemDescription( + item.getId(), item.getName(), item.getOwner(), item.getPath(), + item.getType().name()); + + DataMinerPortletServiceAsync.INSTANCE.getPublicLink(itemDescription, + new AsyncCallback() { + + @Override + public void onFailure(Throwable caught) { + Log.error("Error in retrieveFileInformation: " + + caught.getMessage()); + if (caught instanceof SessionExpiredServiceException) { + UtilsGXT3.alert("Error", "Expired Session"); + + } else { + UtilsGXT3.alert("Error", + "Error retrieving file informations: " + + caught.getLocalizedMessage()); + } + + } + + @Override + public void onSuccess(String result) { + itemDescription.setPublicLink(result); + selectedFileItem = itemDescription; + Log.debug("SelectedFileItem: " + selectedFileItem); + showFieldWithSelection(); + + } + }); + + } + + private void downloadFile() { + if (selectedFileItem != null) { + DataMinerPortletServiceAsync.INSTANCE.getPublicLink( + selectedFileItem, new AsyncCallback() { + + @Override + public void onFailure(Throwable caught) { + if (caught instanceof SessionExpiredServiceException) { + EventBusProvider.INSTANCE + .fireEvent(new SessionExpiredEvent()); + } else { + Log.error("Error downloading file: " + + caught.getLocalizedMessage()); + UtilsGXT3.alert("Error", + caught.getLocalizedMessage()); + } + caught.printStackTrace(); + + } + + @Override + public void onSuccess(String link) { + Log.debug("Retrieved link: " + link); + Window.open(link, selectedFileItem.getName(), ""); + } + + }); + + } else { + UtilsGXT3.info("Attention", "Select a file!"); + } + + } + + private void showNoSelectionField() { + vp.clear(); + vp.add(selectButton); + vp.forceLayout(); + fieldContainer.forceLayout(); + } + + private void showFieldWithSelection() { + String fileName = selectedFileItem.getName(); + + if (fileName == null || fileName.isEmpty()) { + fileName = "NoName"; + } + + TextField tableDescription = new TextField(); + tableDescription.setValue(fileName); + tableDescription.setReadOnly(true); + + HBoxLayoutContainer h = new HBoxLayoutContainer(); + h.add(tableDescription, new BoxLayoutData(new Margins())); + h.add(selectButton2, new BoxLayoutData(new Margins())); + h.add(downloadButton, new BoxLayoutData(new Margins())); + h.add(cancelButton, new BoxLayoutData(new Margins())); + vp.clear(); + vp.add(h); + vp.forceLayout(); + fieldContainer.forceLayout(); + + } + + /** + * + */ + @Override + public boolean isValid() { + return (selectedFileItem != null); + } + + @Override + public Widget getWidget() { + return fieldContainer; + } + + @Override + public String getValue() { + return (selectedFileItem == null) ? null : selectedFileItem + .getPublicLink(); + } + +} diff --git a/src/main/java/org/gcube/portlets/widgets/dataminermanagerwidget/client/parametersfield/FloatFld.java b/src/main/java/org/gcube/portlets/widgets/dataminermanagerwidget/client/parametersfield/FloatFld.java new file mode 100644 index 0000000..1305a5f --- /dev/null +++ b/src/main/java/org/gcube/portlets/widgets/dataminermanagerwidget/client/parametersfield/FloatFld.java @@ -0,0 +1,99 @@ +package org.gcube.portlets.widgets.dataminermanagerwidget.client.parametersfield; + + +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.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.FloatField; + +/** + * + * @author Giancarlo Panichi email: g.panichi@isti.cnr.it + * + */ +public class FloatFld extends AbstractFld { + + private SimpleContainer fieldContainer; + private FloatField numberField; + + /** + * @param operator + */ + public FloatFld(Parameter parameter) { + super(parameter); + fieldContainer = new SimpleContainer(); + HBoxLayoutContainer horiz = new HBoxLayoutContainer(); + horiz.setPack(BoxLayoutPack.START); + horiz.setEnableOverflow(false); + + ObjectParameter p = (ObjectParameter) parameter; + + numberField = new FloatField(); + + if (p.getDefaultValue() != null) + numberField.setValue(Float.parseFloat(p.getDefaultValue())); + numberField.setAllowBlank(false); + + HtmlLayoutContainer descr; + + if (p.getDescription() == null) { + descr = new HtmlLayoutContainer("

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

" + + p.getDescription() + "

"); + descr.addStyleName("workflow-fieldDescription"); + } + + SimpleContainer vContainer = new SimpleContainer(); + VerticalLayoutContainer vField = new VerticalLayoutContainer(); + HtmlLayoutContainer typeDescription = new HtmlLayoutContainer( + "Float Value"); + typeDescription.setStylePrimaryName("workflow-parameters-description"); + vField.add(numberField, new VerticalLayoutData(-1, -1, new Margins(0))); + vField.add(typeDescription, new VerticalLayoutData(-1, -1, new Margins( + 0))); + vContainer.add(vField); + + horiz.add(vContainer, new BoxLayoutData(new Margins())); + horiz.add(descr, new BoxLayoutData(new Margins())); + + fieldContainer.add(horiz); + fieldContainer.forceLayout(); + + } + + /** + * + */ + @Override + public String getValue() { + Float f = numberField.getCurrentValue(); + return f.toString(); + } + + /** + * + */ + @Override + public Widget getWidget() { + return fieldContainer; + } + + @Override + public boolean isValid() { + return numberField.isValid(); + } +} diff --git a/src/main/java/org/gcube/portlets/widgets/dataminermanagerwidget/client/parametersfield/IntFld.java b/src/main/java/org/gcube/portlets/widgets/dataminermanagerwidget/client/parametersfield/IntFld.java new file mode 100644 index 0000000..6adef8e --- /dev/null +++ b/src/main/java/org/gcube/portlets/widgets/dataminermanagerwidget/client/parametersfield/IntFld.java @@ -0,0 +1,100 @@ +package org.gcube.portlets.widgets.dataminermanagerwidget.client.parametersfield; + + +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.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.IntegerField; + +/** + * + * @author Giancarlo Panichi email: g.panichi@isti.cnr.it + * + */ +public class IntFld extends AbstractFld { + + private SimpleContainer fieldContainer; + private IntegerField numberField; + + /** + * @param operator + */ + public IntFld(Parameter parameter) { + super(parameter); + fieldContainer = new SimpleContainer(); + HBoxLayoutContainer horiz = new HBoxLayoutContainer(); + horiz.setPack(BoxLayoutPack.START); + horiz.setEnableOverflow(false); + + ObjectParameter p = (ObjectParameter) parameter; + + numberField = new IntegerField(); + + if (p.getDefaultValue() != null) + numberField.setValue(Integer.parseInt(p.getDefaultValue())); + numberField.setAllowBlank(false); + + HtmlLayoutContainer descr; + + if (p.getDescription() == null) { + descr = new HtmlLayoutContainer("

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

" + + p.getDescription() + "

"); + descr.addStyleName("workflow-fieldDescription"); + } + + SimpleContainer vContainer=new SimpleContainer(); + VerticalLayoutContainer vField = new VerticalLayoutContainer(); + HtmlLayoutContainer typeDescription = new HtmlLayoutContainer( + "Integer Value"); + typeDescription.setStylePrimaryName("workflow-parameters-description"); + vField.add(numberField, new VerticalLayoutData(-1,-1,new Margins(0))); + vField.add(typeDescription, new VerticalLayoutData(-1,-1,new Margins(0))); + vContainer.add(vField); + + horiz.add(vContainer, new BoxLayoutData(new Margins())); + horiz.add(descr, new BoxLayoutData(new Margins())); + + fieldContainer.add(horiz); + fieldContainer.forceLayout(); + + } + + /** + * + */ + @Override + public String getValue() { + Integer i = numberField.getCurrentValue(); + return i.toString(); + } + + /** + * + */ + @Override + public Widget getWidget() { + return fieldContainer; + } + + + @Override + public boolean isValid() { + return numberField.isValid(); + } + +} diff --git a/src/main/java/org/gcube/portlets/widgets/dataminermanagerwidget/client/parametersfield/ListIntFld.java b/src/main/java/org/gcube/portlets/widgets/dataminermanagerwidget/client/parametersfield/ListIntFld.java new file mode 100644 index 0000000..3824ed9 --- /dev/null +++ b/src/main/java/org/gcube/portlets/widgets/dataminermanagerwidget/client/parametersfield/ListIntFld.java @@ -0,0 +1,238 @@ +/** + * + */ +package org.gcube.portlets.widgets.dataminermanagerwidget.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.widgets.dataminermanagerwidget.client.DataMinerManager; + +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 + * email: g.panichi@isti.cnr.it + * + */ +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 + */ + 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(DataMinerManager.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(DataMinerManager.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/widgets/dataminermanagerwidget/client/parametersfield/ListStringFld.java b/src/main/java/org/gcube/portlets/widgets/dataminermanagerwidget/client/parametersfield/ListStringFld.java new file mode 100644 index 0000000..80a3b99 --- /dev/null +++ b/src/main/java/org/gcube/portlets/widgets/dataminermanagerwidget/client/parametersfield/ListStringFld.java @@ -0,0 +1,173 @@ +/** + * + */ +package org.gcube.portlets.widgets.dataminermanagerwidget.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 email: g.panichi@isti.cnr.it + * + */ +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 + */ + 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(); + } + + + /** + * @param item + */ + 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/widgets/dataminermanagerwidget/client/parametersfield/OperatorFieldWidget.java b/src/main/java/org/gcube/portlets/widgets/dataminermanagerwidget/client/parametersfield/OperatorFieldWidget.java new file mode 100644 index 0000000..df17640 --- /dev/null +++ b/src/main/java/org/gcube/portlets/widgets/dataminermanagerwidget/client/parametersfield/OperatorFieldWidget.java @@ -0,0 +1,173 @@ +/** + * + */ +package org.gcube.portlets.widgets.dataminermanagerwidget.client.parametersfield; + + +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.allen_sauer.gwt.log.client.Log; +import com.sencha.gxt.widget.core.client.form.FieldLabel; + +/** + * + * @author Giancarlo Panichi email: g.panichi@isti.cnr.it + * + */ +public class OperatorFieldWidget { + + private Parameter parameter; + private AbstractFld field; + private FieldLabel parameterLabel; + + /** + */ + public OperatorFieldWidget(Parameter p) { + super(); + this.parameter = p; + + try { + if (p.getTypology() != null) { + switch (p.getTypology()) { + case COLUMN: + field = new ColumnFld(p); + break; + case COLUMN_LIST: + field = new ColumnListFld(p); + break; + case ENUM: + field = new EnumFld(p); + break; + case FILE: + field = new FileFld(p); + break; + case LIST: + field = createListField(p); + break; + case OBJECT: + field = createObjectField(p); + break; + case TABULAR: + field = new TabularFld(p); + break; + case TABULAR_LIST: + field = new TabularListFld(p); + break; + case WKT: + field = new WKTFld(p); + break; + case DATE: + field = new DateFld(p); + break; + case TIME: + field = new TimeFld(p); + break; + default: + break; + + } + } + + if (field == null) { + parameterLabel = new FieldLabel(null, p.getName()); + parameterLabel.setLabelWidth(200); + parameterLabel.setLabelWordWrap(true); + + } else { + parameterLabel = new FieldLabel(field.getWidget(), p.getName()); + parameterLabel.setLabelWidth(200); + parameterLabel.setLabelWordWrap(true); + } + } catch (Throwable e) { + Log.error("Error: " + e.getLocalizedMessage()); + e.printStackTrace(); + } + + } + + /** + * @return the parameter + */ + public Parameter getParameter() { + return parameter; + } + + public String getFieldValue() { + return field.getValue(); + } + + public String getValue() { + return getFieldValue(); + } + + public FieldLabel getParameterLabel() { + return parameterLabel; + } + + /** + * @param p + * @return + */ + private AbstractFld createObjectField(Parameter p) { + ObjectParameter objectParameter = (ObjectParameter) p; + String type = objectParameter.getType(); + if (type.contentEquals(Integer.class.getName())) { + return new IntFld(objectParameter); + } else if (type.contentEquals(String.class.getName())) { + return new StringFld(objectParameter); + } else if (type.contentEquals(Boolean.class.getName())) { + return new BooleanFld(objectParameter); + } else if (type.contentEquals(Double.class.getName())) { + return new DoubleFld(objectParameter); + } else if (type.contentEquals(Float.class.getName())) { + return new FloatFld(objectParameter); + } else + return null; + } + + /** + * + */ + private AbstractFld createListField(Parameter p) { + ListParameter listParameter = (ListParameter) p; + String type = listParameter.getType(); + + if (type.contentEquals(String.class.getName()) + || type.contentEquals("STRING")) { // TODO REMOVE "STRING" + return new ListStringFld(listParameter); + } else if (type.contentEquals(Integer.class.getName()) + || type.contentEquals("NUMBER")) { + return new ListIntFld(listParameter); + } + // } else if (type.contentEquals(Boolean.class.getName())) { + // return new ListBooleanField(p); + // } else if (type.contentEquals(Double.class.getName())) { + // return new ListDoubleField(p); + // } else if (type.contentEquals(Float.class.getName())) { + // return new ListFloatField(p); + // } + else + return null; + } + + /** + * + */ + public void updateOperatorParameterValue() { + this.parameter.setValue(this.getFieldValue()); + } + + 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/widgets/dataminermanagerwidget/client/parametersfield/StringFld.java b/src/main/java/org/gcube/portlets/widgets/dataminermanagerwidget/client/parametersfield/StringFld.java new file mode 100644 index 0000000..8447318 --- /dev/null +++ b/src/main/java/org/gcube/portlets/widgets/dataminermanagerwidget/client/parametersfield/StringFld.java @@ -0,0 +1,102 @@ +/** + * + */ +package org.gcube.portlets.widgets.dataminermanagerwidget.client.parametersfield; + + +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.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 email: g.panichi@isti.cnr.it + * + */ +public class StringFld extends AbstractFld { + + private SimpleContainer fieldContainer; + private TextField textField; + + /** + * @param parameter + */ + public StringFld(Parameter parameter) { + super(parameter); + + ObjectParameter p = (ObjectParameter) parameter; + + textField = new TextField(); + textField.setValue(p.getDefaultValue()); + + if (p.getDefaultValue() == null) + textField.setAllowBlank(false); + + HtmlLayoutContainer descr; + + if (p.getDescription() == null) { + descr=new HtmlLayoutContainer("

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

"+p.getDescription()+"

"); + descr.addStyleName("workflow-fieldDescription"); + } + + SimpleContainer vContainer=new SimpleContainer(); + VerticalLayoutContainer vField = new VerticalLayoutContainer(); + HtmlLayoutContainer typeDescription = new HtmlLayoutContainer( + "String Value"); + typeDescription.setStylePrimaryName("workflow-parameters-description"); + vField.add(textField, 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 textField.getValue(); + } + + /** + * + */ + @Override + public Widget getWidget() { + return fieldContainer; + } + + @Override + public boolean isValid() { + return textField.isValid(); + } + +} diff --git a/src/main/java/org/gcube/portlets/widgets/dataminermanagerwidget/client/parametersfield/StringItem.java b/src/main/java/org/gcube/portlets/widgets/dataminermanagerwidget/client/parametersfield/StringItem.java new file mode 100644 index 0000000..2d12c99 --- /dev/null +++ b/src/main/java/org/gcube/portlets/widgets/dataminermanagerwidget/client/parametersfield/StringItem.java @@ -0,0 +1,92 @@ +package org.gcube.portlets.widgets.dataminermanagerwidget.client.parametersfield; + +import org.gcube.data.analysis.dataminermanagercl.shared.parameters.ObjectParameter; +import org.gcube.portlets.widgets.dataminermanagerwidget.client.DataMinerManager; + +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 + * email: g.panichi@isti.cnr.it + * + */ +public class StringItem extends HBoxLayoutContainer { + private ListStringFld parent; + private TextField field; + private TextButton addBtn; + private TextButton removeBtn; + + /** + * @param objPar + */ + 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(DataMinerManager.resources.add()); + + addBtn.addSelectHandler(new SelectEvent.SelectHandler() { + + @Override + public void onSelect(SelectEvent event) { + parent.addField(StringItem.this); + + + } + }); + + removeBtn = new TextButton(""); + + removeBtn.setIcon(DataMinerManager.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/widgets/dataminermanagerwidget/client/parametersfield/TabItem.java b/src/main/java/org/gcube/portlets/widgets/dataminermanagerwidget/client/parametersfield/TabItem.java new file mode 100644 index 0000000..57df57d --- /dev/null +++ b/src/main/java/org/gcube/portlets/widgets/dataminermanagerwidget/client/parametersfield/TabItem.java @@ -0,0 +1,325 @@ +package org.gcube.portlets.widgets.dataminermanagerwidget.client.parametersfield; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; + +import org.gcube.data.analysis.dataminermanagercl.shared.data.TableItemSimple; +import org.gcube.data.analysis.dataminermanagercl.shared.parameters.TabularParameter; +import org.gcube.portlets.widgets.dataminermanagerwidget.client.DataMinerManager; +import org.gcube.portlets.widgets.dataminermanagerwidget.client.common.EventBusProvider; +import org.gcube.portlets.widgets.dataminermanagerwidget.client.events.SessionExpiredEvent; +import org.gcube.portlets.widgets.dataminermanagerwidget.client.rpc.DataMinerPortletServiceAsync; +import org.gcube.portlets.widgets.dataminermanagerwidget.client.util.UtilsGXT3; +import org.gcube.portlets.widgets.dataminermanagerwidget.shared.exception.SessionExpiredServiceException; +import org.gcube.portlets.widgets.dataminermanagerwidget.shared.workspace.ItemDescription; +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.Window; +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 email: g.panichi@isti.cnr.it + * + */ +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 tabularListFld + * @param tabularParameter + * @param 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(DataMinerManager.resources.folderExplore()); + selectButton.setToolTip("Select Data Set"); + + selectButton2 = new TextButton(""); + selectButton2.setIcon(DataMinerManager.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(DataMinerManager.resources.download()); + downloadButton.addSelectHandler(new SelectEvent.SelectHandler() { + + @Override + public void onSelect(SelectEvent event) { + downloadFile(); + } + }); + downloadButton.setVisible(false); + + + addBtn = new TextButton(""); + addBtn.setIcon(DataMinerManager.resources.add()); + addBtn.addSelectHandler(new SelectEvent.SelectHandler() { + + @Override + public void onSelect(SelectEvent event) { + parent.addField(TabItem.this); + + } + }); + + removeBtn = new TextButton(""); + removeBtn.setIcon(DataMinerManager.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() { + + List selectableTypes = new ArrayList(); + selectableTypes.add(ItemType.EXTERNAL_FILE); + List showableTypes = new ArrayList(); + showableTypes.addAll(Arrays.asList(ItemType.values())); + + /* + * "application/zip", "application/x-zip", + * "application/x-zip-compressed", "application/octet-stream", + * "application/x-compress", "application/x-compressed", + * "multipart/x-zip" + */ + // List allowedMimeTypes = + // Arrays.asList("text/csv","text/plain","text/plain; charset=ISO-8859-1"); + + /** + * "zip" + */ + + /* + * List allowedFileExtensions = Arrays.asList("csv"); + * + * FilterCriteria filterCriteria = new FilterCriteria(allowedMimeTypes, + * allowedFileExtensions, new HashMap()); + */ + wselectDialog = new WorkspaceExplorerSelectDialog("Select CSV", false); + // filterCriteria, selectableTypes); + + WorskpaceExplorerSelectNotificationListener handler = new WorskpaceExplorerSelectNotificationListener() { + + @Override + public void onSelectedItem(Item item) { + + if (item.isFolder() || item.isRoot()) { + 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()); + + DataMinerPortletServiceAsync.INSTANCE.retrieveTableInformation(item, + 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) { + DataMinerPortletServiceAsync.INSTANCE.getPublicLink( + itemDescriptionSelected, new AsyncCallback() { + + @Override + public void onFailure(Throwable caught) { + if (caught instanceof SessionExpiredServiceException) { + EventBusProvider.INSTANCE + .fireEvent(new SessionExpiredEvent()); + } else { + Log.error("Error downloading table: " + + caught.getLocalizedMessage()); + UtilsGXT3.alert("Error", + caught.getLocalizedMessage()); + } + caught.printStackTrace(); + + } + + @Override + public void onSuccess(String link) { + Log.debug("Retrieved link: " + link); + Window.open(link, itemDescriptionSelected.getName(), ""); + } + + }); + + } 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/widgets/dataminermanagerwidget/client/parametersfield/TabularFld.java b/src/main/java/org/gcube/portlets/widgets/dataminermanagerwidget/client/parametersfield/TabularFld.java new file mode 100644 index 0000000..e173da2 --- /dev/null +++ b/src/main/java/org/gcube/portlets/widgets/dataminermanagerwidget/client/parametersfield/TabularFld.java @@ -0,0 +1,416 @@ +/** + * + */ +package org.gcube.portlets.widgets.dataminermanagerwidget.client.parametersfield; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; + +import org.gcube.data.analysis.dataminermanagercl.shared.data.TableItemSimple; +import org.gcube.data.analysis.dataminermanagercl.shared.parameters.Parameter; +import org.gcube.data.analysis.dataminermanagercl.shared.parameters.TabularParameter; +import org.gcube.portlets.widgets.dataminermanagerwidget.client.DataMinerManager; +import org.gcube.portlets.widgets.dataminermanagerwidget.client.common.EventBusProvider; +import org.gcube.portlets.widgets.dataminermanagerwidget.client.events.SessionExpiredEvent; +import org.gcube.portlets.widgets.dataminermanagerwidget.client.events.TabularFldChangeEvent; +import org.gcube.portlets.widgets.dataminermanagerwidget.client.events.TabularFldChangeEvent.HasTabularFldChangeEventHandler; +import org.gcube.portlets.widgets.dataminermanagerwidget.client.events.TabularFldChangeEvent.TabularFldChangeEventHandler; +import org.gcube.portlets.widgets.dataminermanagerwidget.client.rpc.DataMinerPortletServiceAsync; +import org.gcube.portlets.widgets.dataminermanagerwidget.client.util.UtilsGXT3; +import org.gcube.portlets.widgets.dataminermanagerwidget.shared.exception.SessionExpiredServiceException; +import org.gcube.portlets.widgets.dataminermanagerwidget.shared.workspace.ItemDescription; +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.event.shared.GwtEvent; +import com.google.gwt.event.shared.HandlerRegistration; +import com.google.gwt.user.client.Window; +import com.google.gwt.user.client.rpc.AsyncCallback; +import com.google.gwt.user.client.ui.Widget; +import com.sencha.gxt.core.client.dom.XDOM; +import com.sencha.gxt.core.client.util.Format; +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.event.SelectEvent; +import com.sencha.gxt.widget.core.client.form.TextField; + +/** + * + * @author Giancarlo Panichi email: g.panichi@isti.cnr.it + * + */ +public class TabularFld extends AbstractFld implements + HasTabularFldChangeEventHandler { + + private SimpleContainer fieldContainer; + private HBoxLayoutContainer horiz; + private VerticalLayoutContainer vp; + + private WorkspaceExplorerSelectDialog wselectDialog; + private TextButton selectButton, selectButton2, cancelButton, + downloadButton; + private HtmlLayoutContainer templatesList; + private TableItemSimple selectedTableItem = null; + private ItemDescription itemDescriptionSelected; + private TabularParameter tabularParameter; + + + /** + * @param parameter + */ + public TabularFld(Parameter parameter) { + super(parameter); + Log.debug("TabularField"); + + try { + tabularParameter = (TabularParameter) parameter; + + SimpleContainer tabContainer = new SimpleContainer(); + vp = new VerticalLayoutContainer(); + init(); + + createField(tabContainer); + showNoSelectionField(); + } catch (Throwable e) { + Log.error("TabularField: " + e.getLocalizedMessage()); + UtilsGXT3.alert("Error", + "Error creating Tabular Field: " + e.getLocalizedMessage()); + e.printStackTrace(); + } + } + + private void createField(SimpleContainer tabContainer) { + List templates = tabularParameter.getTemplates(); + if (templates == null || templates.isEmpty()) { + templatesList = new HtmlLayoutContainer("

"); + templatesList.addStyleName("workflow-parameters-description"); + } else { + String list = ""; + boolean first = true; + for (String template : templates) { + list += (first ? "" : ", ") + Format.ellipse(template, 50); + first = false; + } + + templatesList = new HtmlLayoutContainer( + "

Suitable Data Set Templates:
" + list + "

"); + templatesList.addStyleName("workflow-parameters-description"); + } + + tabContainer.add(vp, new MarginData(new Margins(0))); + + fieldContainer = new SimpleContainer(); + horiz = new HBoxLayoutContainer(); + horiz.setPack(BoxLayoutPack.START); + horiz.setEnableOverflow(false); + + HtmlLayoutContainer descr; + + if (tabularParameter.getDescription() == null) { + descr = new HtmlLayoutContainer("

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

" + + tabularParameter.getDescription() + "

"); + descr.addStyleName("workflow-fieldDescription"); + } + + horiz.add(tabContainer, new BoxLayoutData(new Margins())); + horiz.add(descr, new BoxLayoutData(new Margins())); + + fieldContainer.add(horiz); + } + + private void init() throws Exception { + try { + List selectableTypes = new ArrayList(); + selectableTypes.add(ItemType.EXTERNAL_FILE); + List showableTypes = new ArrayList(); + showableTypes.addAll(Arrays.asList(ItemType.values())); + + try { + /* + * "application/zip", "application/x-zip", + * "application/x-zip-compressed", "application/octet-stream", + * "application/x-compress", "application/x-compressed", + * "multipart/x-zip" + */ + // List allowedMimeTypes = + // Arrays.asList("text/csv","text/plain","text/plain; charset=ISO-8859-1"); + + /** + * "zip" + */ + + /* + * List allowedFileExtensions = Arrays.asList("csv"); + * + * FilterCriteria filterCriteria = new + * FilterCriteria(allowedMimeTypes, allowedFileExtensions, new + * HashMap()); + */ + wselectDialog = new WorkspaceExplorerSelectDialog("Select CSV", + false); + // filterCriteria, selectableTypes); + + WorskpaceExplorerSelectNotificationListener handler = new WorskpaceExplorerSelectNotificationListener() { + + @Override + public void onSelectedItem(Item item) { + + if (item.isFolder() || item.isRoot()) { + UtilsGXT3.info("Attention", "Select a valid csv!"); + + } else { + 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()); + + } catch (Throwable e) { + Log.error("TabularField error using WorkspaceExplorerSelectDialog: " + + e.getLocalizedMessage()); + e.printStackTrace(); + throw new Exception( + "TabularField error using WorkspaceExplorerSelectDialog: " + + e.getLocalizedMessage()); + } + + selectButton = new TextButton("Select Data Set"); + selectButton.addSelectHandler(new SelectEvent.SelectHandler() { + + @Override + public void onSelect(SelectEvent event) { + wselectDialog.show(); + } + }); + + selectButton.setIcon(DataMinerManager.resources.folderExplore()); + selectButton.setToolTip("Select Data Set"); + + selectButton2 = new TextButton(""); + selectButton2.addSelectHandler(new SelectEvent.SelectHandler() { + + @Override + public void onSelect(SelectEvent event) { + wselectDialog.show(); + } + }); + + selectButton2.setIcon(DataMinerManager.resources.folderExplore()); + selectButton2.setToolTip("Select Another Data Set"); + + cancelButton = new TextButton(""); + cancelButton.setIcon(DataMinerManager.resources.cancel()); + cancelButton.addSelectHandler(new SelectEvent.SelectHandler() { + + @Override + public void onSelect(SelectEvent event) { + selectedTableItem = null; + showNoSelectionField(); + updateListeners(null); + } + }); + + downloadButton = new TextButton(""); + downloadButton.setIcon(DataMinerManager.resources.download()); + downloadButton.addSelectHandler(new SelectEvent.SelectHandler() { + + @Override + public void onSelect(SelectEvent event) { + downloadFile(); + } + }); + } catch (Throwable e) { + Log.error("TabularField init: " + e.getLocalizedMessage()); + e.printStackTrace(); + throw e; + } + } + + private void retrieveTableInformation(Item item) { + Log.debug("Retrieved: " + item); + itemDescriptionSelected = new ItemDescription( + item.getId(), item.getName(), item.getOwner(), item.getPath(), + item.getType().name()); + + + DataMinerPortletServiceAsync.INSTANCE.retrieveTableInformation(item, + 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(); + updateListeners(selectedTableItem); + } + }); + } + + private void downloadFile() { + if (itemDescriptionSelected != null) { + DataMinerPortletServiceAsync.INSTANCE.getPublicLink( + itemDescriptionSelected, new AsyncCallback() { + + @Override + public void onFailure(Throwable caught) { + if (caught instanceof SessionExpiredServiceException) { + EventBusProvider.INSTANCE + .fireEvent(new SessionExpiredEvent()); + } else { + Log.error("Error downloading table: " + + caught.getLocalizedMessage()); + UtilsGXT3.alert("Error", + caught.getLocalizedMessage()); + } + caught.printStackTrace(); + + } + + @Override + public void onSuccess(String link) { + Log.debug("Retrieved link: " + link); + Window.open(link, itemDescriptionSelected.getName(), ""); + } + + }); + + } else { + UtilsGXT3.info("Attention", "Select a Table!"); + } + + } + + /** + * + */ + private void showNoSelectionField() { + vp.clear(); + vp.add(selectButton); + vp.add(templatesList); + vp.forceLayout(); + fieldContainer.forceLayout(); + } + + /** + * + */ + private void showFieldWithSelection() { + String tableName = selectedTableItem.getName(); + + if (tableName == null || tableName.isEmpty()) { + tableName = "NoName"; + } + + TextField tableDescription = new TextField(); + tableDescription.setValue(tableName); + tableDescription.setReadOnly(true); + + HBoxLayoutContainer h = new HBoxLayoutContainer(); + h.add(tableDescription, new BoxLayoutData(new Margins())); + h.add(selectButton2, new BoxLayoutData(new Margins())); + h.add(downloadButton, new BoxLayoutData(new Margins())); + h.add(cancelButton, new BoxLayoutData(new Margins())); + vp.clear(); + vp.add(h); + vp.add(templatesList); + vp.forceLayout(); + fieldContainer.forceLayout(); + } + + /** + * + */ + @Override + public String getValue() { + return (selectedTableItem == null) ? null : selectedTableItem.getId(); + } + + /** + * + */ + @Override + public Widget getWidget() { + return fieldContainer; + } + + /** + * + */ + @Override + public boolean isValid() { + return (selectedTableItem != null); + } + + @Override + public HandlerRegistration addTabularFldChangeEventHandler( + TabularFldChangeEventHandler handler) { + return fieldContainer.addHandler(handler, + TabularFldChangeEvent.getType()); + + } + + private void updateListeners(TableItemSimple tableItemSimple) { + TabularFldChangeEvent event = new TabularFldChangeEvent(tableItemSimple); + fireEvent(event); + } + + @Override + public void fireEvent(GwtEvent event) { + fieldContainer.fireEvent(event); + } +} diff --git a/src/main/java/org/gcube/portlets/widgets/dataminermanagerwidget/client/parametersfield/TabularListFld.java b/src/main/java/org/gcube/portlets/widgets/dataminermanagerwidget/client/parametersfield/TabularListFld.java new file mode 100644 index 0000000..c6f8bea --- /dev/null +++ b/src/main/java/org/gcube/portlets/widgets/dataminermanagerwidget/client/parametersfield/TabularListFld.java @@ -0,0 +1,203 @@ +/** + * + */ +package org.gcube.portlets.widgets.dataminermanagerwidget.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 email: g.panichi@isti.cnr.it + * + */ +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 + */ + 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(); + } + } + + /** + * + * @param item + */ + 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/widgets/dataminermanagerwidget/client/parametersfield/TimeFld.java b/src/main/java/org/gcube/portlets/widgets/dataminermanagerwidget/client/parametersfield/TimeFld.java new file mode 100644 index 0000000..0e91c14 --- /dev/null +++ b/src/main/java/org/gcube/portlets/widgets/dataminermanagerwidget/client/parametersfield/TimeFld.java @@ -0,0 +1,120 @@ +/** + * + */ +package org.gcube.portlets.widgets.dataminermanagerwidget.client.parametersfield; + +import java.util.Date; + +import org.gcube.data.analysis.dataminermanagercl.shared.parameters.Parameter; +import org.gcube.data.analysis.dataminermanagercl.shared.parameters.TimeParameter; + +import com.allen_sauer.gwt.log.client.Log; +import com.google.gwt.i18n.client.DateTimeFormat; +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.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.TimeField; + +/** + * + * @author Giancarlo Panichi email: g.panichi@isti.cnr.it + * + */ +public class TimeFld extends AbstractFld { + + private SimpleContainer fieldContainer; + private TimeField timeField; + private DateTimeFormat timeFormat; + + /** + * @param parameter + */ + public TimeFld(Parameter parameter) { + super(parameter); + + TimeParameter p = (TimeParameter) parameter; + + timeField = new TimeField(); + timeField.setTriggerAction(TriggerAction.ALL); + timeField.setFormat(DateTimeFormat.getFormat("HH:mm:ss")); + timeFormat = DateTimeFormat.getFormat("HH:mm:ss"); + + try { + Date defaultDate = timeFormat.parse(p.getDefaultValue()); + timeField.setValue(defaultDate); + } catch (Throwable e) { + Log.error("DateFld invalid default value" + p.getDefaultValue()); + } + + if (p.getDefaultValue() == null || p.getDefaultValue().isEmpty()) + timeField.setAllowBlank(false); + + HtmlLayoutContainer descr; + + if (p.getDescription() == null) { + descr = new HtmlLayoutContainer( + "

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

" + + p.getDescription() + "

"); + descr.addStyleName("workflow-fieldDescription"); + } + + SimpleContainer vContainer = new SimpleContainer(); + VerticalLayoutContainer vField = new VerticalLayoutContainer(); + HtmlLayoutContainer typeDescription = new HtmlLayoutContainer( + "Time Value"); + typeDescription.setStylePrimaryName("workflow-parameters-description"); + vField.add(timeField, 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() { + String timeS = timeFormat.format(timeField.getCurrentValue()); + return timeS; + } + + /** + * + */ + @Override + public Widget getWidget() { + return fieldContainer; + } + + @Override + public boolean isValid() { + return timeField.isValid(); + } + +} diff --git a/src/main/java/org/gcube/portlets/widgets/dataminermanagerwidget/client/parametersfield/WKTFld.java b/src/main/java/org/gcube/portlets/widgets/dataminermanagerwidget/client/parametersfield/WKTFld.java new file mode 100644 index 0000000..27794e4 --- /dev/null +++ b/src/main/java/org/gcube/portlets/widgets/dataminermanagerwidget/client/parametersfield/WKTFld.java @@ -0,0 +1,249 @@ +/** + * + */ +package org.gcube.portlets.widgets.dataminermanagerwidget.client.parametersfield; + +import org.gcube.data.analysis.dataminermanagercl.shared.parameters.Parameter; +import org.gcube.data.analysis.dataminermanagercl.shared.parameters.WKTParameter; +import org.gcube.portlets.widgets.dataminermanagerwidget.client.DataMinerManager; +import org.gcube.portlets.widgets.dataminermanagerwidget.client.util.UtilsGXT3; +import org.gcube.portlets.widgets.openlayerbasicwidgets.client.event.SelectAreaDialogEvent; +import org.gcube.portlets.widgets.openlayerbasicwidgets.client.event.SelectAreaDialogEvent.SelectAreaDialogEventHandler; +import org.gcube.portlets.widgets.openlayerbasicwidgets.client.widgets.AreaSelectionDialog; +import org.gcube.portlets.widgets.openlayerbasicwidgets.client.widgets.GeometryType; + +import com.allen_sauer.gwt.log.client.Log; +import com.google.gwt.core.shared.GWT; +import com.google.gwt.user.client.ui.Widget; +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.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.event.SelectEvent; +import com.sencha.gxt.widget.core.client.form.TextField; + +/** + * + * @author Giancarlo Panichi email: g.panichi@isti.cnr.it + * + */ +public class WKTFld extends AbstractFld { + + private VerticalLayoutContainer vp; + + // FileSelector fileSelector; + private AreaSelectionDialog areaSelectionDialog; + private TextButton selectButton, selectButton2, cancelButton; + private String selectedArea = null; + + private WKTParameter wktParameter; + + private SimpleContainer fieldContainer; + + private HBoxLayoutContainer horiz; + + private TextField selectedAreaField; + + /** + * @param parameter + */ + public WKTFld(Parameter parameter) { + super(parameter); + wktParameter = (WKTParameter) parameter; + + SimpleContainer wktContainer = new SimpleContainer(); + vp = new VerticalLayoutContainer(); + init(); + wktContainer.add(vp, new MarginData(new Margins(0))); + + fieldContainer = new SimpleContainer(); + horiz = new HBoxLayoutContainer(); + horiz.setPack(BoxLayoutPack.START); + horiz.setEnableOverflow(false); + + HtmlLayoutContainer descr; + + if (wktParameter.getDescription() == null) { + descr = new HtmlLayoutContainer( + "

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

" + + wktParameter.getDescription() + "

"); + descr.addStyleName("workflow-fieldDescription"); + } + + horiz.add(wktContainer, new BoxLayoutData(new Margins())); + horiz.add(descr, new BoxLayoutData(new Margins())); + + fieldContainer.add(horiz); + showNoSelectionField(); + + } + + private GeometryType getGeometryType() { + if (wktParameter.getWktGeometryType() == null) { + return GeometryType.Polygon; + } + + switch (wktParameter.getWktGeometryType()) { + case Box: + return GeometryType.Box; + case Circle: + return GeometryType.Circle; + case Hexagon: + return GeometryType.Hexagon; + case LineString: + return GeometryType.LineString; + case Pentagon: + return GeometryType.Pentagon; + case Point: + return GeometryType.Point; + case Polygon: + return GeometryType.Polygon; + case Square: + return GeometryType.Square; + case Triangle: + return GeometryType.Triangle; + default: + return GeometryType.Polygon; + + } + } + + private void drawAGeometry() { + SelectAreaDialogEventHandler handler = new SelectAreaDialogEventHandler() { + + @Override + public void onResponse(SelectAreaDialogEvent event) { + GWT.log("SelectAreaDialog Response: " + event); + switch (event.getSelectAreaDialogEventType()) { + case Aborted: + Log.debug("No area selected!"); + break; + case Completed: + selectedArea = event.getArea(); + Log.debug("SelectedFileItem: " + selectedArea); + showFieldWithSelection(); + break; + case Failed: + Log.error("Error during area selection: " + + event.getException()); + UtilsGXT3.alert("Error", event.getErrorMessage()); + break; + default: + break; + + } + } + }; + + areaSelectionDialog = new AreaSelectionDialog(getGeometryType()); + areaSelectionDialog.setZIndex(XDOM.getTopZIndex()); + areaSelectionDialog.addSelectAreaDialogEventHandler(handler); + areaSelectionDialog.show(); + + } + + private void init() { + selectButton = new TextButton("Draw a " + + wktParameter.getWktGeometryType().getLabel()); + selectButton.setIcon(DataMinerManager.resources.drawGeometry()); + selectButton.addSelectHandler(new SelectEvent.SelectHandler() { + + @Override + public void onSelect(SelectEvent event) { + drawAGeometry(); + + } + }); + //selectButton.setToolTip("Draw a " + // + wktParameter.getWktGeometryType().getLabel()); + + selectButton2 = new TextButton(""); + selectButton2.setIcon(DataMinerManager.resources.folderExplore()); + selectButton2.addSelectHandler(new SelectEvent.SelectHandler() { + + @Override + public void onSelect(SelectEvent event) { + drawAGeometry(); + } + }); + //selectButton2.setToolTip("Select Another " + // + wktParameter.getWktGeometryType().getLabel()); + + cancelButton = new TextButton(""); + cancelButton.setIcon(DataMinerManager.resources.cancel()); + cancelButton.addSelectHandler(new SelectEvent.SelectHandler() { + + @Override + public void onSelect(SelectEvent event) { + selectedArea = null; + showNoSelectionField(); + } + }); + + } + + private void showNoSelectionField() { + vp.clear(); + vp.add(selectButton); + vp.forceLayout(); + fieldContainer.forceLayout(); + } + + private void showFieldWithSelection() { + if (selectedArea == null || selectedArea.isEmpty()) { + selectedArea = ""; + } + + selectedAreaField = new TextField(); + if (selectedArea != null && !selectedArea.isEmpty()) { + selectedAreaField.setValue(selectedArea); + } + selectedAreaField.setReadOnly(true); + + HBoxLayoutContainer h = new HBoxLayoutContainer(); + h.add(selectedAreaField, new BoxLayoutData(new Margins())); + h.add(selectButton2, new BoxLayoutData(new Margins())); + h.add(cancelButton, new BoxLayoutData(new Margins())); + vp.clear(); + vp.add(h); + vp.forceLayout(); + fieldContainer.forceLayout(); + + } + + @Override + public String getValue() { + if (selectedAreaField != null) { + return selectedAreaField.getCurrentValue(); + } else { + return wktParameter.getDefaultValue(); + } + } + + @Override + public boolean isValid() { + if (selectedAreaField != null) { + return selectedAreaField.isValid(); + } else { + return true; + } + } + + @Override + public Widget getWidget() { + return fieldContainer; + } + +} diff --git a/src/main/java/org/gcube/portlets/widgets/dataminermanagerwidget/client/properties/ColumnItemProperties.java b/src/main/java/org/gcube/portlets/widgets/dataminermanagerwidget/client/properties/ColumnItemProperties.java new file mode 100644 index 0000000..fdd8188 --- /dev/null +++ b/src/main/java/org/gcube/portlets/widgets/dataminermanagerwidget/client/properties/ColumnItemProperties.java @@ -0,0 +1,25 @@ +package org.gcube.portlets.widgets.dataminermanagerwidget.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 + * email: g.panichi@isti.cnr.it + * + */ +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/widgets/dataminermanagerwidget/client/properties/ColumnItemPropertiesCombo.java b/src/main/java/org/gcube/portlets/widgets/dataminermanagerwidget/client/properties/ColumnItemPropertiesCombo.java new file mode 100644 index 0000000..bba3775 --- /dev/null +++ b/src/main/java/org/gcube/portlets/widgets/dataminermanagerwidget/client/properties/ColumnItemPropertiesCombo.java @@ -0,0 +1,24 @@ +package org.gcube.portlets.widgets.dataminermanagerwidget.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 + * email: g.panichi@isti.cnr.it + * + */ +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/widgets/dataminermanagerwidget/client/resources/Resources.java b/src/main/java/org/gcube/portlets/widgets/dataminermanagerwidget/client/resources/Resources.java new file mode 100644 index 0000000..9eaeefc --- /dev/null +++ b/src/main/java/org/gcube/portlets/widgets/dataminermanagerwidget/client/resources/Resources.java @@ -0,0 +1,105 @@ +package org.gcube.portlets.widgets.dataminermanagerwidget.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 email: g.panichi@isti.cnr.it + * + */ +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("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/widgets/dataminermanagerwidget/client/resources/WikiLink.txt b/src/main/java/org/gcube/portlets/widgets/dataminermanagerwidget/client/resources/WikiLink.txt new file mode 100644 index 0000000..3eceac8 --- /dev/null +++ b/src/main/java/org/gcube/portlets/widgets/dataminermanagerwidget/client/resources/WikiLink.txt @@ -0,0 +1 @@ +http://wiki.gcube-system.org/gcube/DataMiner_Manager \ No newline at end of file diff --git a/src/main/java/org/gcube/portlets/widgets/dataminermanagerwidget/client/resources/add.png b/src/main/java/org/gcube/portlets/widgets/dataminermanagerwidget/client/resources/add.png new file mode 100644 index 0000000..6332fef Binary files /dev/null and b/src/main/java/org/gcube/portlets/widgets/dataminermanagerwidget/client/resources/add.png differ diff --git a/src/main/java/org/gcube/portlets/widgets/dataminermanagerwidget/client/resources/ajax-complete.gif b/src/main/java/org/gcube/portlets/widgets/dataminermanagerwidget/client/resources/ajax-complete.gif new file mode 100644 index 0000000..ca17bcd Binary files /dev/null and b/src/main/java/org/gcube/portlets/widgets/dataminermanagerwidget/client/resources/ajax-complete.gif differ diff --git a/src/main/java/org/gcube/portlets/widgets/dataminermanagerwidget/client/resources/ajax-error.gif b/src/main/java/org/gcube/portlets/widgets/dataminermanagerwidget/client/resources/ajax-error.gif new file mode 100644 index 0000000..8dadfb9 Binary files /dev/null and b/src/main/java/org/gcube/portlets/widgets/dataminermanagerwidget/client/resources/ajax-error.gif differ diff --git a/src/main/java/org/gcube/portlets/widgets/dataminermanagerwidget/client/resources/ajax-loader-big.gif b/src/main/java/org/gcube/portlets/widgets/dataminermanagerwidget/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/widgets/dataminermanagerwidget/client/resources/ajax-loader-big.gif differ diff --git a/src/main/java/org/gcube/portlets/widgets/dataminermanagerwidget/client/resources/ajax-loader.gif b/src/main/java/org/gcube/portlets/widgets/dataminermanagerwidget/client/resources/ajax-loader.gif new file mode 100644 index 0000000..6bdc3b5 Binary files /dev/null and b/src/main/java/org/gcube/portlets/widgets/dataminermanagerwidget/client/resources/ajax-loader.gif differ diff --git a/src/main/java/org/gcube/portlets/widgets/dataminermanagerwidget/client/resources/alert.gif b/src/main/java/org/gcube/portlets/widgets/dataminermanagerwidget/client/resources/alert.gif new file mode 100644 index 0000000..024e2a9 Binary files /dev/null and b/src/main/java/org/gcube/portlets/widgets/dataminermanagerwidget/client/resources/alert.gif differ diff --git a/src/main/java/org/gcube/portlets/widgets/dataminermanagerwidget/client/resources/arrow_right.png b/src/main/java/org/gcube/portlets/widgets/dataminermanagerwidget/client/resources/arrow_right.png new file mode 100644 index 0000000..b1a1819 Binary files /dev/null and b/src/main/java/org/gcube/portlets/widgets/dataminermanagerwidget/client/resources/arrow_right.png differ diff --git a/src/main/java/org/gcube/portlets/widgets/dataminermanagerwidget/client/resources/cancel.png b/src/main/java/org/gcube/portlets/widgets/dataminermanagerwidget/client/resources/cancel.png new file mode 100644 index 0000000..c149c2b Binary files /dev/null and b/src/main/java/org/gcube/portlets/widgets/dataminermanagerwidget/client/resources/cancel.png differ diff --git a/src/main/java/org/gcube/portlets/widgets/dataminermanagerwidget/client/resources/cancel_circle.png b/src/main/java/org/gcube/portlets/widgets/dataminermanagerwidget/client/resources/cancel_circle.png new file mode 100644 index 0000000..8829755 Binary files /dev/null and b/src/main/java/org/gcube/portlets/widgets/dataminermanagerwidget/client/resources/cancel_circle.png differ diff --git a/src/main/java/org/gcube/portlets/widgets/dataminermanagerwidget/client/resources/cancel_icon.png b/src/main/java/org/gcube/portlets/widgets/dataminermanagerwidget/client/resources/cancel_icon.png new file mode 100644 index 0000000..158b8b1 Binary files /dev/null and b/src/main/java/org/gcube/portlets/widgets/dataminermanagerwidget/client/resources/cancel_icon.png differ diff --git a/src/main/java/org/gcube/portlets/widgets/dataminermanagerwidget/client/resources/computation.png b/src/main/java/org/gcube/portlets/widgets/dataminermanagerwidget/client/resources/computation.png new file mode 100644 index 0000000..aa7d0be Binary files /dev/null and b/src/main/java/org/gcube/portlets/widgets/dataminermanagerwidget/client/resources/computation.png differ diff --git a/src/main/java/org/gcube/portlets/widgets/dataminermanagerwidget/client/resources/computations.png b/src/main/java/org/gcube/portlets/widgets/dataminermanagerwidget/client/resources/computations.png new file mode 100644 index 0000000..b3f0626 Binary files /dev/null and b/src/main/java/org/gcube/portlets/widgets/dataminermanagerwidget/client/resources/computations.png differ diff --git a/src/main/java/org/gcube/portlets/widgets/dataminermanagerwidget/client/resources/connector1.png b/src/main/java/org/gcube/portlets/widgets/dataminermanagerwidget/client/resources/connector1.png new file mode 100644 index 0000000..2f00f36 Binary files /dev/null and b/src/main/java/org/gcube/portlets/widgets/dataminermanagerwidget/client/resources/connector1.png differ diff --git a/src/main/java/org/gcube/portlets/widgets/dataminermanagerwidget/client/resources/delete.png b/src/main/java/org/gcube/portlets/widgets/dataminermanagerwidget/client/resources/delete.png new file mode 100644 index 0000000..70c8035 Binary files /dev/null and b/src/main/java/org/gcube/portlets/widgets/dataminermanagerwidget/client/resources/delete.png differ diff --git a/src/main/java/org/gcube/portlets/widgets/dataminermanagerwidget/client/resources/delete_circle.png b/src/main/java/org/gcube/portlets/widgets/dataminermanagerwidget/client/resources/delete_circle.png new file mode 100644 index 0000000..5aa62e2 Binary files /dev/null and b/src/main/java/org/gcube/portlets/widgets/dataminermanagerwidget/client/resources/delete_circle.png differ diff --git a/src/main/java/org/gcube/portlets/widgets/dataminermanagerwidget/client/resources/detach.png b/src/main/java/org/gcube/portlets/widgets/dataminermanagerwidget/client/resources/detach.png new file mode 100644 index 0000000..f4db43e Binary files /dev/null and b/src/main/java/org/gcube/portlets/widgets/dataminermanagerwidget/client/resources/detach.png differ diff --git a/src/main/java/org/gcube/portlets/widgets/dataminermanagerwidget/client/resources/details.png b/src/main/java/org/gcube/portlets/widgets/dataminermanagerwidget/client/resources/details.png new file mode 100644 index 0000000..8200ce8 Binary files /dev/null and b/src/main/java/org/gcube/portlets/widgets/dataminermanagerwidget/client/resources/details.png differ diff --git a/src/main/java/org/gcube/portlets/widgets/dataminermanagerwidget/client/resources/download.png b/src/main/java/org/gcube/portlets/widgets/dataminermanagerwidget/client/resources/download.png new file mode 100644 index 0000000..f588bf6 Binary files /dev/null and b/src/main/java/org/gcube/portlets/widgets/dataminermanagerwidget/client/resources/download.png differ diff --git a/src/main/java/org/gcube/portlets/widgets/dataminermanagerwidget/client/resources/draw-geometry.png b/src/main/java/org/gcube/portlets/widgets/dataminermanagerwidget/client/resources/draw-geometry.png new file mode 100644 index 0000000..222eafb Binary files /dev/null and b/src/main/java/org/gcube/portlets/widgets/dataminermanagerwidget/client/resources/draw-geometry.png differ diff --git a/src/main/java/org/gcube/portlets/widgets/dataminermanagerwidget/client/resources/folder_explore.png b/src/main/java/org/gcube/portlets/widgets/dataminermanagerwidget/client/resources/folder_explore.png new file mode 100644 index 0000000..0ba9391 Binary files /dev/null and b/src/main/java/org/gcube/portlets/widgets/dataminermanagerwidget/client/resources/folder_explore.png differ diff --git a/src/main/java/org/gcube/portlets/widgets/dataminermanagerwidget/client/resources/goBack.png b/src/main/java/org/gcube/portlets/widgets/dataminermanagerwidget/client/resources/goBack.png new file mode 100644 index 0000000..31b0a04 Binary files /dev/null and b/src/main/java/org/gcube/portlets/widgets/dataminermanagerwidget/client/resources/goBack.png differ diff --git a/src/main/java/org/gcube/portlets/widgets/dataminermanagerwidget/client/resources/inputSpace.png b/src/main/java/org/gcube/portlets/widgets/dataminermanagerwidget/client/resources/inputSpace.png new file mode 100644 index 0000000..2d896eb Binary files /dev/null and b/src/main/java/org/gcube/portlets/widgets/dataminermanagerwidget/client/resources/inputSpace.png differ diff --git a/src/main/java/org/gcube/portlets/widgets/dataminermanagerwidget/client/resources/logoLittle.png b/src/main/java/org/gcube/portlets/widgets/dataminermanagerwidget/client/resources/logoLittle.png new file mode 100644 index 0000000..df9bd99 Binary files /dev/null and b/src/main/java/org/gcube/portlets/widgets/dataminermanagerwidget/client/resources/logoLittle.png differ diff --git a/src/main/java/org/gcube/portlets/widgets/dataminermanagerwidget/client/resources/menuItemComputations.png b/src/main/java/org/gcube/portlets/widgets/dataminermanagerwidget/client/resources/menuItemComputations.png new file mode 100644 index 0000000..79eca75 Binary files /dev/null and b/src/main/java/org/gcube/portlets/widgets/dataminermanagerwidget/client/resources/menuItemComputations.png differ diff --git a/src/main/java/org/gcube/portlets/widgets/dataminermanagerwidget/client/resources/menuItemDataspace.png b/src/main/java/org/gcube/portlets/widgets/dataminermanagerwidget/client/resources/menuItemDataspace.png new file mode 100644 index 0000000..5952946 Binary files /dev/null and b/src/main/java/org/gcube/portlets/widgets/dataminermanagerwidget/client/resources/menuItemDataspace.png differ diff --git a/src/main/java/org/gcube/portlets/widgets/dataminermanagerwidget/client/resources/menuItemExperiment.png b/src/main/java/org/gcube/portlets/widgets/dataminermanagerwidget/client/resources/menuItemExperiment.png new file mode 100644 index 0000000..15a635b Binary files /dev/null and b/src/main/java/org/gcube/portlets/widgets/dataminermanagerwidget/client/resources/menuItemExperiment.png differ diff --git a/src/main/java/org/gcube/portlets/widgets/dataminermanagerwidget/client/resources/menuItemHelp.png b/src/main/java/org/gcube/portlets/widgets/dataminermanagerwidget/client/resources/menuItemHelp.png new file mode 100644 index 0000000..4e8178c Binary files /dev/null and b/src/main/java/org/gcube/portlets/widgets/dataminermanagerwidget/client/resources/menuItemHelp.png differ diff --git a/src/main/java/org/gcube/portlets/widgets/dataminermanagerwidget/client/resources/menuItemInputspace.png b/src/main/java/org/gcube/portlets/widgets/dataminermanagerwidget/client/resources/menuItemInputspace.png new file mode 100644 index 0000000..9696441 Binary files /dev/null and b/src/main/java/org/gcube/portlets/widgets/dataminermanagerwidget/client/resources/menuItemInputspace.png differ diff --git a/src/main/java/org/gcube/portlets/widgets/dataminermanagerwidget/client/resources/monitor.png b/src/main/java/org/gcube/portlets/widgets/dataminermanagerwidget/client/resources/monitor.png new file mode 100644 index 0000000..d040bd0 Binary files /dev/null and b/src/main/java/org/gcube/portlets/widgets/dataminermanagerwidget/client/resources/monitor.png differ diff --git a/src/main/java/org/gcube/portlets/widgets/dataminermanagerwidget/client/resources/refresh.png b/src/main/java/org/gcube/portlets/widgets/dataminermanagerwidget/client/resources/refresh.png new file mode 100644 index 0000000..ee2106d Binary files /dev/null and b/src/main/java/org/gcube/portlets/widgets/dataminermanagerwidget/client/resources/refresh.png differ diff --git a/src/main/java/org/gcube/portlets/widgets/dataminermanagerwidget/client/resources/resubmit.png b/src/main/java/org/gcube/portlets/widgets/dataminermanagerwidget/client/resources/resubmit.png new file mode 100644 index 0000000..0202cbe Binary files /dev/null and b/src/main/java/org/gcube/portlets/widgets/dataminermanagerwidget/client/resources/resubmit.png differ diff --git a/src/main/java/org/gcube/portlets/widgets/dataminermanagerwidget/client/resources/save.png b/src/main/java/org/gcube/portlets/widgets/dataminermanagerwidget/client/resources/save.png new file mode 100644 index 0000000..99d532e Binary files /dev/null and b/src/main/java/org/gcube/portlets/widgets/dataminermanagerwidget/client/resources/save.png differ diff --git a/src/main/java/org/gcube/portlets/widgets/dataminermanagerwidget/client/resources/show.png b/src/main/java/org/gcube/portlets/widgets/dataminermanagerwidget/client/resources/show.png new file mode 100644 index 0000000..b8a25e4 Binary files /dev/null and b/src/main/java/org/gcube/portlets/widgets/dataminermanagerwidget/client/resources/show.png differ diff --git a/src/main/java/org/gcube/portlets/widgets/dataminermanagerwidget/client/resources/sort_asc.gif b/src/main/java/org/gcube/portlets/widgets/dataminermanagerwidget/client/resources/sort_asc.gif new file mode 100644 index 0000000..986c1c9 Binary files /dev/null and b/src/main/java/org/gcube/portlets/widgets/dataminermanagerwidget/client/resources/sort_asc.gif differ diff --git a/src/main/java/org/gcube/portlets/widgets/dataminermanagerwidget/client/resources/table.png b/src/main/java/org/gcube/portlets/widgets/dataminermanagerwidget/client/resources/table.png new file mode 100644 index 0000000..abcd936 Binary files /dev/null and b/src/main/java/org/gcube/portlets/widgets/dataminermanagerwidget/client/resources/table.png differ diff --git a/src/main/java/org/gcube/portlets/widgets/dataminermanagerwidget/client/resources/tableResult.png b/src/main/java/org/gcube/portlets/widgets/dataminermanagerwidget/client/resources/tableResult.png new file mode 100644 index 0000000..8b195b6 Binary files /dev/null and b/src/main/java/org/gcube/portlets/widgets/dataminermanagerwidget/client/resources/tableResult.png differ diff --git a/src/main/java/org/gcube/portlets/widgets/dataminermanagerwidget/client/resources/tree.gif b/src/main/java/org/gcube/portlets/widgets/dataminermanagerwidget/client/resources/tree.gif new file mode 100644 index 0000000..e9dd8e0 Binary files /dev/null and b/src/main/java/org/gcube/portlets/widgets/dataminermanagerwidget/client/resources/tree.gif differ diff --git a/src/main/java/org/gcube/portlets/widgets/dataminermanagerwidget/client/resources/triangle.png b/src/main/java/org/gcube/portlets/widgets/dataminermanagerwidget/client/resources/triangle.png new file mode 100644 index 0000000..4a8eb87 Binary files /dev/null and b/src/main/java/org/gcube/portlets/widgets/dataminermanagerwidget/client/resources/triangle.png differ diff --git a/src/main/java/org/gcube/portlets/widgets/dataminermanagerwidget/client/resources/user_green.png b/src/main/java/org/gcube/portlets/widgets/dataminermanagerwidget/client/resources/user_green.png new file mode 100644 index 0000000..30383c2 Binary files /dev/null and b/src/main/java/org/gcube/portlets/widgets/dataminermanagerwidget/client/resources/user_green.png differ diff --git a/src/main/java/org/gcube/portlets/widgets/dataminermanagerwidget/client/rpc/DataMinerPortletService.java b/src/main/java/org/gcube/portlets/widgets/dataminermanagerwidget/client/rpc/DataMinerPortletService.java new file mode 100644 index 0000000..ef5e447 --- /dev/null +++ b/src/main/java/org/gcube/portlets/widgets/dataminermanagerwidget/client/rpc/DataMinerPortletService.java @@ -0,0 +1,62 @@ +package org.gcube.portlets.widgets.dataminermanagerwidget.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.portlets.widgets.dataminermanagerwidget.shared.exception.ServiceException; +import org.gcube.portlets.widgets.dataminermanagerwidget.shared.session.UserInfo; +import org.gcube.portlets.widgets.dataminermanagerwidget.shared.workspace.DataMinerWorkArea; +import org.gcube.portlets.widgets.dataminermanagerwidget.shared.workspace.ItemDescription; +import org.gcube.portlets.widgets.wsexplorer.shared.Item; + +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("dataminerman") +public interface DataMinerPortletService extends RemoteService { + + public UserInfo hello() throws ServiceException; + + public List getOperatorsClassifications() + 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(Item 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; + +} diff --git a/src/main/java/org/gcube/portlets/widgets/dataminermanagerwidget/client/rpc/DataMinerPortletServiceAsync.java b/src/main/java/org/gcube/portlets/widgets/dataminermanagerwidget/client/rpc/DataMinerPortletServiceAsync.java new file mode 100644 index 0000000..d7ebe83 --- /dev/null +++ b/src/main/java/org/gcube/portlets/widgets/dataminermanagerwidget/client/rpc/DataMinerPortletServiceAsync.java @@ -0,0 +1,72 @@ +package org.gcube.portlets.widgets.dataminermanagerwidget.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.portlets.widgets.dataminermanagerwidget.shared.session.UserInfo; +import org.gcube.portlets.widgets.dataminermanagerwidget.shared.workspace.DataMinerWorkArea; +import org.gcube.portlets.widgets.dataminermanagerwidget.shared.workspace.ItemDescription; +import org.gcube.portlets.widgets.wsexplorer.shared.Item; + +import com.google.gwt.core.client.GWT; +import com.google.gwt.user.client.rpc.AsyncCallback; + +/** + * + * @author Giancarlo Panichi email: g.panichi@isti.cnr.it + * + */ +public interface DataMinerPortletServiceAsync { + + public static DataMinerPortletServiceAsync INSTANCE = (DataMinerPortletServiceAsync) GWT + .create(DataMinerPortletService.class); + + void hello(AsyncCallback callback); + + void getOperatorsClassifications( + 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(Item 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); + +} diff --git a/src/main/java/org/gcube/portlets/widgets/dataminermanagerwidget/client/type/DataMinerWorkAreaElementType.java b/src/main/java/org/gcube/portlets/widgets/dataminermanagerwidget/client/type/DataMinerWorkAreaElementType.java new file mode 100644 index 0000000..bd0c3eb --- /dev/null +++ b/src/main/java/org/gcube/portlets/widgets/dataminermanagerwidget/client/type/DataMinerWorkAreaElementType.java @@ -0,0 +1,11 @@ +package org.gcube.portlets.widgets.dataminermanagerwidget.client.type; + +/** + * + * @author "Giancarlo Panichi" g.panichi@isti.cnr.it + * + */ +public enum DataMinerWorkAreaElementType { + InputDataSets, OutputDataSets, Computations; +} diff --git a/src/main/java/org/gcube/portlets/widgets/dataminermanagerwidget/client/type/DataMinerWorkAreaEventType.java b/src/main/java/org/gcube/portlets/widgets/dataminermanagerwidget/client/type/DataMinerWorkAreaEventType.java new file mode 100644 index 0000000..0676c1c --- /dev/null +++ b/src/main/java/org/gcube/portlets/widgets/dataminermanagerwidget/client/type/DataMinerWorkAreaEventType.java @@ -0,0 +1,11 @@ +package org.gcube.portlets.widgets.dataminermanagerwidget.client.type; + +/** + * + * @author "Giancarlo Panichi" + * g.panichi@isti.cnr.it + * + */ +public enum DataMinerWorkAreaEventType { + OPEN, UPDATE; +} diff --git a/src/main/java/org/gcube/portlets/widgets/dataminermanagerwidget/client/type/DataMinerWorkAreaRegionType.java b/src/main/java/org/gcube/portlets/widgets/dataminermanagerwidget/client/type/DataMinerWorkAreaRegionType.java new file mode 100644 index 0000000..84ee7ff --- /dev/null +++ b/src/main/java/org/gcube/portlets/widgets/dataminermanagerwidget/client/type/DataMinerWorkAreaRegionType.java @@ -0,0 +1,11 @@ +package org.gcube.portlets.widgets.dataminermanagerwidget.client.type; + +/** + * + * @author "Giancarlo Panichi" g.panichi@isti.cnr.it + * + */ +public enum DataMinerWorkAreaRegionType { + DataSets, Computations; +} diff --git a/src/main/java/org/gcube/portlets/widgets/dataminermanagerwidget/client/type/DataMinerWorkAreaRequestEventType.java b/src/main/java/org/gcube/portlets/widgets/dataminermanagerwidget/client/type/DataMinerWorkAreaRequestEventType.java new file mode 100644 index 0000000..e0a20c1 --- /dev/null +++ b/src/main/java/org/gcube/portlets/widgets/dataminermanagerwidget/client/type/DataMinerWorkAreaRequestEventType.java @@ -0,0 +1,11 @@ +package org.gcube.portlets.widgets.dataminermanagerwidget.client.type; + +/** + * + * @author Giancarlo Panichi + * email: g.panichi@isti.cnr.it + * + */ +public enum DataMinerWorkAreaRequestEventType { + OPEN,UPDATE; +} diff --git a/src/main/java/org/gcube/portlets/widgets/dataminermanagerwidget/client/type/MenuType.java b/src/main/java/org/gcube/portlets/widgets/dataminermanagerwidget/client/type/MenuType.java new file mode 100644 index 0000000..8ec59de --- /dev/null +++ b/src/main/java/org/gcube/portlets/widgets/dataminermanagerwidget/client/type/MenuType.java @@ -0,0 +1,11 @@ +package org.gcube.portlets.widgets.dataminermanagerwidget.client.type; + +/** + * + * @author Giancarlo Panichi + * email: g.panichi@isti.cnr.it + * + */ +public enum MenuType { + HOME, DATA_SPACE, EXPERIMENT, COMPUTATIONS; +} diff --git a/src/main/java/org/gcube/portlets/widgets/dataminermanagerwidget/client/type/OperatorsClassificationRequestType.java b/src/main/java/org/gcube/portlets/widgets/dataminermanagerwidget/client/type/OperatorsClassificationRequestType.java new file mode 100644 index 0000000..d28eccb --- /dev/null +++ b/src/main/java/org/gcube/portlets/widgets/dataminermanagerwidget/client/type/OperatorsClassificationRequestType.java @@ -0,0 +1,11 @@ +package org.gcube.portlets.widgets.dataminermanagerwidget.client.type; + +/** + * + * @author Giancarlo Panichi + * email: g.panichi@isti.cnr.it + * + */ +public enum OperatorsClassificationRequestType { + Default, ByName; +} diff --git a/src/main/java/org/gcube/portlets/widgets/dataminermanagerwidget/client/type/OutputResourceRequestEventType.java b/src/main/java/org/gcube/portlets/widgets/dataminermanagerwidget/client/type/OutputResourceRequestEventType.java new file mode 100644 index 0000000..716180b --- /dev/null +++ b/src/main/java/org/gcube/portlets/widgets/dataminermanagerwidget/client/type/OutputResourceRequestEventType.java @@ -0,0 +1,11 @@ +package org.gcube.portlets.widgets.dataminermanagerwidget.client.type; + +/** + * + * @author "Giancarlo Panichi" g.panichi@isti.cnr.it + * + */ +public enum OutputResourceRequestEventType { + ComputationId, ItemDescription; +} diff --git a/src/main/java/org/gcube/portlets/widgets/dataminermanagerwidget/client/type/SessionExpiredEventType.java b/src/main/java/org/gcube/portlets/widgets/dataminermanagerwidget/client/type/SessionExpiredEventType.java new file mode 100644 index 0000000..5a021dd --- /dev/null +++ b/src/main/java/org/gcube/portlets/widgets/dataminermanagerwidget/client/type/SessionExpiredEventType.java @@ -0,0 +1,11 @@ +package org.gcube.portlets.widgets.dataminermanagerwidget.client.type; + +/** + * + * @author "Giancarlo Panichi" + * g.panichi@isti.cnr.it + * + */ +public enum SessionExpiredEventType { + EXPIREDONSERVER; +} diff --git a/src/main/java/org/gcube/portlets/widgets/dataminermanagerwidget/client/type/UIStateEventType.java b/src/main/java/org/gcube/portlets/widgets/dataminermanagerwidget/client/type/UIStateEventType.java new file mode 100644 index 0000000..d25d71f --- /dev/null +++ b/src/main/java/org/gcube/portlets/widgets/dataminermanagerwidget/client/type/UIStateEventType.java @@ -0,0 +1,13 @@ +package org.gcube.portlets.widgets.dataminermanagerwidget.client.type; + +/** + * + * @author "Giancarlo Panichi" + * g.panichi@isti.cnr.it + * + */ +public enum UIStateEventType { + START, + UPDATE, + WAITING; +} diff --git a/src/main/java/org/gcube/portlets/widgets/dataminermanagerwidget/client/type/WPSMenuType.java b/src/main/java/org/gcube/portlets/widgets/dataminermanagerwidget/client/type/WPSMenuType.java new file mode 100644 index 0000000..2c08f17 --- /dev/null +++ b/src/main/java/org/gcube/portlets/widgets/dataminermanagerwidget/client/type/WPSMenuType.java @@ -0,0 +1,11 @@ +package org.gcube.portlets.widgets.dataminermanagerwidget.client.type; + +/** + * + * @author Giancarlo Panichi + * email: g.panichi@isti.cnr.it + * + */ +public enum WPSMenuType { + MENU, INPUT_SPACE, EXPERIMENT, COMPUTATIONS +} diff --git a/src/main/java/org/gcube/portlets/widgets/dataminermanagerwidget/client/util/InfoMessageBox.java b/src/main/java/org/gcube/portlets/widgets/dataminermanagerwidget/client/util/InfoMessageBox.java new file mode 100644 index 0000000..9b80245 --- /dev/null +++ b/src/main/java/org/gcube/portlets/widgets/dataminermanagerwidget/client/util/InfoMessageBox.java @@ -0,0 +1,28 @@ +package org.gcube.portlets.widgets.dataminermanagerwidget.client.util; + +import com.sencha.gxt.widget.core.client.box.MessageBox; + +/** + * + * @author "Giancarlo Panichi" + * g.panichi@isti.cnr.it + * + */ +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/widgets/dataminermanagerwidget/client/util/UtilsGXT3.java b/src/main/java/org/gcube/portlets/widgets/dataminermanagerwidget/client/util/UtilsGXT3.java new file mode 100644 index 0000000..9314e25 --- /dev/null +++ b/src/main/java/org/gcube/portlets/widgets/dataminermanagerwidget/client/util/UtilsGXT3.java @@ -0,0 +1,78 @@ +package org.gcube.portlets.widgets.dataminermanagerwidget.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" g.panichi@isti.cnr.it + * + */ +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/widgets/dataminermanagerwidget/client/widgets/FileViewer.java b/src/main/java/org/gcube/portlets/widgets/dataminermanagerwidget/client/widgets/FileViewer.java new file mode 100644 index 0000000..e8d89e2 --- /dev/null +++ b/src/main/java/org/gcube/portlets/widgets/dataminermanagerwidget/client/widgets/FileViewer.java @@ -0,0 +1,67 @@ +package org.gcube.portlets.widgets.dataminermanagerwidget.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.widgets.dataminermanagerwidget.client.DataMinerManager; + +import com.google.gwt.safehtml.shared.SafeHtmlBuilder; +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 + * email: g.panichi@isti.cnr.it + * + */ +public class FileViewer extends SimpleContainer { + + private FileResource fileResource; + + + /** + * @param mapImages + */ + public FileViewer(ComputationId computationId, + FileResource fileResource) { + super(); + 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(DataMinerManager.resources.download()); + downloadBtn.addSelectHandler(new SelectEvent.SelectHandler() { + @Override + public void onSelect(SelectEvent event) { + com.google.gwt.user.client.Window.open(fileUrl, fileName, ""); + + } + }); + + lc.add(downloadBtn, new VerticalLayoutData(-1, -1, new Margins(0))); + add(lc); + } + + +} diff --git a/src/main/java/org/gcube/portlets/widgets/dataminermanagerwidget/client/widgets/HashMapViewer.java b/src/main/java/org/gcube/portlets/widgets/dataminermanagerwidget/client/widgets/HashMapViewer.java new file mode 100644 index 0000000..4fc257f --- /dev/null +++ b/src/main/java/org/gcube/portlets/widgets/dataminermanagerwidget/client/widgets/HashMapViewer.java @@ -0,0 +1,61 @@ +/** + * + */ +package org.gcube.portlets.widgets.dataminermanagerwidget.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 + * email: g.panichi@isti.cnr.it + * + */ +public class HashMapViewer extends SimpleContainer { + + private Map map; + + /** + * + * @param 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/widgets/dataminermanagerwidget/client/widgets/ImageViewer.java b/src/main/java/org/gcube/portlets/widgets/dataminermanagerwidget/client/widgets/ImageViewer.java new file mode 100644 index 0000000..f3bf623 --- /dev/null +++ b/src/main/java/org/gcube/portlets/widgets/dataminermanagerwidget/client/widgets/ImageViewer.java @@ -0,0 +1,100 @@ +package org.gcube.portlets.widgets.dataminermanagerwidget.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.widgets.dataminermanagerwidget.client.DataMinerManager; + +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 + * email: g.panichi@isti.cnr.it + * + */ +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 mapImages + */ + 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(DataMinerManager.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/widgets/dataminermanagerwidget/client/widgets/ResourceViewer.java b/src/main/java/org/gcube/portlets/widgets/dataminermanagerwidget/client/widgets/ResourceViewer.java new file mode 100644 index 0000000..a10b45a --- /dev/null +++ b/src/main/java/org/gcube/portlets/widgets/dataminermanagerwidget/client/widgets/ResourceViewer.java @@ -0,0 +1,58 @@ +/** + * + */ +package org.gcube.portlets.widgets.dataminermanagerwidget.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 + * email: g.panichi@isti.cnr.it + * + */ +public class ResourceViewer { + + private Map map; + + /** + * @param map + */ + public ResourceViewer(Map map) { + this.map = map; + + } + + /** + * @param map + * @return + */ + 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/widgets/dataminermanagerwidget/dataminermanagerwidget.gwt.xml b/src/main/java/org/gcube/portlets/widgets/dataminermanagerwidget/dataminermanagerwidget.gwt.xml new file mode 100644 index 0000000..14a2531 --- /dev/null +++ b/src/main/java/org/gcube/portlets/widgets/dataminermanagerwidget/dataminermanagerwidget.gwt.xml @@ -0,0 +1,50 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/main/java/org/gcube/portlets/widgets/dataminermanagerwidget/portlet/DataMinerManager.java b/src/main/java/org/gcube/portlets/widgets/dataminermanagerwidget/portlet/DataMinerManager.java new file mode 100644 index 0000000..68986a3 --- /dev/null +++ b/src/main/java/org/gcube/portlets/widgets/dataminermanagerwidget/portlet/DataMinerManager.java @@ -0,0 +1,55 @@ +/** + * + */ +package org.gcube.portlets.widgets.dataminermanagerwidget.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 + * email: g.panichi@isti.cnr.it + * + */ +public class DataMinerManager 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 + "DataMinerManager_view.jsp"; + + /** + * @param request . + * @param response . + * @throws IOException . + * @throws PortletException . + */ + public void doView(RenderRequest request, RenderResponse response) throws PortletException, IOException { + + logger.trace("DataMinerManager 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/widgets/dataminermanagerwidget/server/DataMinerManagerServiceImpl.java b/src/main/java/org/gcube/portlets/widgets/dataminermanagerwidget/server/DataMinerManagerServiceImpl.java new file mode 100644 index 0000000..b16daaa --- /dev/null +++ b/src/main/java/org/gcube/portlets/widgets/dataminermanagerwidget/server/DataMinerManagerServiceImpl.java @@ -0,0 +1,416 @@ +package org.gcube.portlets.widgets.dataminermanagerwidget.server; + +import java.util.List; +import java.util.Map; + +import javax.servlet.ServletException; +import javax.servlet.http.HttpServletRequest; + +import org.gcube.portlets.widgets.dataminermanagerwidget.client.rpc.DataMinerPortletService; +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.portlets.widgets.dataminermanagerwidget.server.util.DataMinerWorkAreaManager; +import org.gcube.portlets.widgets.dataminermanagerwidget.server.util.StorageUtil; +import org.gcube.portlets.widgets.dataminermanagerwidget.server.util.TableReader; +import org.gcube.portlets.widgets.dataminermanagerwidget.shared.exception.ServiceException; +import org.gcube.portlets.widgets.dataminermanagerwidget.shared.session.UserInfo; +import org.gcube.portlets.widgets.dataminermanagerwidget.shared.workspace.DataMinerWorkArea; +import org.gcube.portlets.widgets.dataminermanagerwidget.shared.workspace.ItemDescription; +//import org.gcube.portlets.user.tdw.server.datasource.DataSourceFactoryRegistry; +//import org.gcube.portlets.widgets.file_dw_import_wizard.server.file.TargetRegistry; +import org.gcube.portlets.widgets.wsexplorer.shared.Item; +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 email: g.panichi@isti.cnr.it + * + */ +@SuppressWarnings("serial") +public class DataMinerManagerServiceImpl extends RemoteServiceServlet implements + DataMinerPortletService { + + private static Logger logger = LoggerFactory + .getLogger(DataMinerManagerServiceImpl.class); + + /** + * {@inheritDoc} + */ + @Override + public void init() throws ServletException { + super.init(); + logger.info("DataMinerManager 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) { + e.printStackTrace(); + throw e; + } catch (Throwable e) { + e.printStackTrace(); + logger.error("Hello(): " + e.getLocalizedMessage(), e); + throw new ServiceException(e.getLocalizedMessage(), e); + } + + } + + @Override + public List getOperatorsClassifications() + throws ServiceException { + + try { + HttpServletRequest httpRequest = this.getThreadLocalRequest(); + ServiceCredentials serviceCredentials = SessionUtil + .getServiceCredentials(httpRequest); + SClient smClient = SessionUtil.getSClient(httpRequest, + serviceCredentials); + List list = smClient + .getOperatorsClassifications(); + return list; + } catch (ServiceException e) { + logger.error(e.getLocalizedMessage()); + throw e; + } catch (Throwable e) { + logger.error( + "An error occurred getting the OperatorsClassifications list: " + + e.getLocalizedMessage(), e); + e.printStackTrace(); + 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.printStackTrace(); + 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.printStackTrace(); + throw new ServiceException(e.getLocalizedMessage(), e); + } + } + + @Override + public ComputationId resubmit(ItemDescription itemDescription) + throws ServiceException { + try { + 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()); + throw e; + } catch (Throwable e) { + logger.error("Error in resubmit computation: " + + e.getLocalizedMessage()); + e.printStackTrace(); + 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()); + throw e; + } catch (Throwable e) { + logger.error("Error in getComputationStatus: " + + e.getLocalizedMessage()); + e.printStackTrace(); + 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.deleteItem(serviceCredentials.getUserName(), + itemDescription.getId()); + return; + + } catch (ServiceException e) { + logger.error(e.getLocalizedMessage()); + throw e; + } catch (Throwable e) { + logger.error(e.getLocalizedMessage(), e); + e.printStackTrace(); + throw new ServiceException(e.getLocalizedMessage(), e); + } + } + + @Override + public TableItemSimple retrieveTableInformation(Item 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()); + throw e; + } catch (Throwable e) { + logger.error(e.getLocalizedMessage(), e); + e.printStackTrace(); + 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()); + throw e; + } catch (Throwable e) { + logger.error(e.getLocalizedMessage(), e); + e.printStackTrace(); + 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); + String link = StorageUtil.getPublicLink( + serviceCredentials.getUserName(), itemDescription.getId()); + + return link; + } catch (ServiceException e) { + logger.error(e.getLocalizedMessage()); + throw e; + } catch (Throwable e) { + logger.error(e.getLocalizedMessage(), e); + e.printStackTrace(); + 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()); + throw e; + } catch (Throwable e) { + logger.error(e.getLocalizedMessage(), e); + e.printStackTrace(); + 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()); + throw e; + } catch (Throwable e) { + logger.error("Error retrieving output by computation id: " + + e.getLocalizedMessage()); + e.printStackTrace(); + 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); + 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()); + throw e; + } catch (Throwable e) { + logger.error("Error retrieving output by item: " + + e.getLocalizedMessage()); + e.printStackTrace(); + 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()); + throw e; + } catch (Throwable e) { + logger.error(e.getLocalizedMessage(), e); + e.printStackTrace(); + throw new ServiceException(e.getLocalizedMessage(), e); + } + } + +} diff --git a/src/main/java/org/gcube/portlets/widgets/dataminermanagerwidget/server/DescriptionRepository.java b/src/main/java/org/gcube/portlets/widgets/dataminermanagerwidget/server/DescriptionRepository.java new file mode 100644 index 0000000..fcbe1de --- /dev/null +++ b/src/main/java/org/gcube/portlets/widgets/dataminermanagerwidget/server/DescriptionRepository.java @@ -0,0 +1,128 @@ +package org.gcube.portlets.widgets.dataminermanagerwidget.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 + * email: g.panichi@isti.cnr.it + * + */ +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/widgets/dataminermanagerwidget/server/DownloadFolderServlet.java b/src/main/java/org/gcube/portlets/widgets/dataminermanagerwidget/server/DownloadFolderServlet.java new file mode 100644 index 0000000..2a479bb --- /dev/null +++ b/src/main/java/org/gcube/portlets/widgets/dataminermanagerwidget/server/DownloadFolderServlet.java @@ -0,0 +1,137 @@ +package org.gcube.portlets.widgets.dataminermanagerwidget.server; + +import java.io.File; +import java.io.FileInputStream; +import java.io.IOException; +import java.io.OutputStream; + +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.apache.commons.io.IOUtils; +import org.gcube.data.analysis.dataminermanagercl.server.util.ServiceCredentials; +import org.gcube.portlets.widgets.dataminermanagerwidget.server.util.StorageUtil; +import org.gcube.portlets.widgets.dataminermanagerwidget.shared.Constants; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +/** + * + * @author Giancarlo Panichi email: g.panichi@isti.cnr.it + * + * Download Folder Servlet + * + */ +public class DownloadFolderServlet extends HttpServlet { + private static final long serialVersionUID = -1838255772767180518L; + private static Logger logger = LoggerFactory + .getLogger(DownloadFolderServlet.class); + + /** + * @see HttpServlet#HttpServlet() + */ + public DownloadFolderServlet() { + super(); + // TODO Auto-generated constructor stub + } + + /** + * @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 request, + HttpServletResponse response) throws ServletException, IOException { + try { + logger.info("DownloadFolderServlet"); + + HttpSession session = request.getSession(); + + if (session == null) { + logger.error("Error getting the session, no session valid found: " + + session); + response.sendError( + HttpServletResponse.SC_INTERNAL_SERVER_ERROR, + "ERROR-Error getting the user session, no session found " + + session); + return; + } + logger.debug("DownloadFolderServlet session id: " + session.getId()); + + ServiceCredentials serviceCredentials; + + String scopeGroupId = request.getHeader(Constants.CURR_GROUP_ID); + if (scopeGroupId == null || scopeGroupId.isEmpty()) { + scopeGroupId = request.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); + } + } + + try { + serviceCredentials = SessionUtil.getServiceCredentials(request, + scopeGroupId); + + } catch (Exception e) { + logger.error( + "Error retrieving credentials:" + + e.getLocalizedMessage(), e); + throw new ServletException(e.getLocalizedMessage()); + } + + String itemId = request + .getParameter(Constants.DOWNLOAD_FOLDER_SERVLET_ITEM_ID_PARAMETER); + String folderName = request + .getParameter(Constants.DOWNLOAD_FOLDER_SERVLET_FOLDER_NAME_PARAMETER); + logger.debug("Request: [itemId=" + itemId + ", folderName=" + + folderName + "]"); + + File tmpZip = StorageUtil.zipFolder( + serviceCredentials.getUserName(), itemId); + response.setHeader("Content-Disposition", "attachment; filename=\"" + + folderName + ".zip\""); + response.setContentType("application/zip"); + response.setHeader("Content-Length", + String.valueOf(tmpZip.length())); + + OutputStream out = response.getOutputStream(); + + FileInputStream fileTmpZip = new FileInputStream(tmpZip); + IOUtils.copy(fileTmpZip, response.getOutputStream()); + out.flush(); + out.close(); + fileTmpZip.close(); + tmpZip.delete(); + return; + + } catch (Throwable e) { + logger.error("Error in DownloadFolderServlet: " + + e.getLocalizedMessage()); + e.printStackTrace(); + throw new ServletException("Error:" + e.getLocalizedMessage(), e); + + } + } + +} diff --git a/src/main/java/org/gcube/portlets/widgets/dataminermanagerwidget/server/SessionUtil.java b/src/main/java/org/gcube/portlets/widgets/dataminermanagerwidget/server/SessionUtil.java new file mode 100644 index 0000000..813ed04 --- /dev/null +++ b/src/main/java/org/gcube/portlets/widgets/dataminermanagerwidget/server/SessionUtil.java @@ -0,0 +1,238 @@ +/** + * + */ +package org.gcube.portlets.widgets.dataminermanagerwidget.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.DataMinerService; +import org.gcube.data.analysis.dataminermanagercl.server.dmservice.SClient; +import org.gcube.data.analysis.dataminermanagercl.server.util.ServiceCredentials; +import org.gcube.portlets.widgets.dataminermanagerwidget.shared.Constants; +import org.gcube.portlets.widgets.dataminermanagerwidget.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 email: g.panichi@isti.cnr.it + * + */ +public class SessionUtil { + + private static final Logger logger = Logger.getLogger(SessionUtil.class); + + /** + * + * @param httpServletRequest + * @return + * @throws TDGWTServiceException + */ + public static ServiceCredentials getServiceCredentials( + HttpServletRequest httpServletRequest) throws ServiceException { + return getServiceCredentials(httpServletRequest, null); + } + + /** + * + * @param httpServletRequest + * @param scopeGroupId + * @return + * @throws TDGWTServiceException + */ + 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.info("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.info("Set SecurityToken: " + token); + SecurityTokenProvider.instance.set(token); + logger.info("Set ScopeProvider: " + scope); + ScopeProvider.instance.set(scope); + + sCredentials = new ServiceCredentials(userName, scope, token); + + } else { + logger.info("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.info("Set SecurityToken: " + token); + SecurityTokenProvider.instance.set(token); + logger.info("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.info("Create new SClientMap"); + HashMap sClientMap = new HashMap<>(); + logger.info("Create new SClient"); + DataMinerService dataMinerService=new DataMinerService(); + sClient = dataMinerService.getClient(serviceCredentials.getToken()); + 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.info("Use SClient in session"); + sClient = sClientMap.get(serviceCredentials.getScope()); + } else { + logger.info("Create new SClient"); + DataMinerService dataMinerService=new DataMinerService(); + sClient = dataMinerService.getClient(serviceCredentials.getToken()); + 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/widgets/dataminermanagerwidget/server/util/DataMinerWorkAreaManager.java b/src/main/java/org/gcube/portlets/widgets/dataminermanagerwidget/server/util/DataMinerWorkAreaManager.java new file mode 100644 index 0000000..850b901 --- /dev/null +++ b/src/main/java/org/gcube/portlets/widgets/dataminermanagerwidget/server/util/DataMinerWorkAreaManager.java @@ -0,0 +1,134 @@ +package org.gcube.portlets.widgets.dataminermanagerwidget.server.util; + + +import org.gcube.common.homelibrary.home.workspace.WorkspaceItem; +import org.gcube.data.analysis.dataminermanagercl.server.util.ServiceCredentials; +import org.gcube.portlets.widgets.dataminermanagerwidget.shared.exception.ServiceException; +import org.gcube.portlets.widgets.dataminermanagerwidget.shared.workspace.Computations; +import org.gcube.portlets.widgets.dataminermanagerwidget.shared.workspace.DataMinerWorkArea; +import org.gcube.portlets.widgets.dataminermanagerwidget.shared.workspace.InputDataSets; +import org.gcube.portlets.widgets.dataminermanagerwidget.shared.workspace.ItemDescription; +import org.gcube.portlets.widgets.dataminermanagerwidget.shared.workspace.OutputDataSets; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +/** + * + * @author Giancarlo Panichi email: g.panichi@isti.cnr.it + * + */ +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; + try { + WorkspaceItem wiDataMinerFolder = StorageUtil + .getItemInRootFolderOnWorkspace(serviceCredentials.getUserName(), + DATA_MINER_FOLDER); + + if (wiDataMinerFolder == null) { + dataMinerWorkArea = new DataMinerWorkArea(null); + return dataMinerWorkArea; + } else { + ItemDescription dataMinerWorkAreaFolder = null; + + dataMinerWorkAreaFolder = new ItemDescription( + wiDataMinerFolder.getId(), wiDataMinerFolder.getName(), + wiDataMinerFolder.getOwner().getPortalLogin(), + wiDataMinerFolder.getPath(), wiDataMinerFolder + .getType().name()); + 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 { + WorkspaceItem wiImportedDataFolder = StorageUtil + .getItemInFolderOnWorkspace(serviceCredentials.getUserName(), + dataMinerWorkArea.getDataMinerWorkAreaFolder() + .getId(), IMPORTED_DATA_FOLDER); + ItemDescription importedDataFolder = null; + + importedDataFolder = new ItemDescription( + wiImportedDataFolder.getId(), + wiImportedDataFolder.getName(), wiImportedDataFolder + .getOwner().getPortalLogin(), + wiImportedDataFolder.getPath(), wiImportedDataFolder + .getType().name()); + + inputDataSets = new InputDataSets(importedDataFolder); + + } catch (Throwable e) { + logger.debug("ImportedData Folder is set to null"); + } + dataMinerWorkArea.setInputDataSets(inputDataSets); + + OutputDataSets outputDataSets = null; + try { + WorkspaceItem wiComputedDataFolder = StorageUtil + .getItemInFolderOnWorkspace(serviceCredentials.getUserName(), + dataMinerWorkArea.getDataMinerWorkAreaFolder() + .getId(), COMPUTED_DATA_FOLDER); + ItemDescription computedDataFolder = null; + + computedDataFolder = new ItemDescription( + wiComputedDataFolder.getId(), + wiComputedDataFolder.getName(), wiComputedDataFolder + .getOwner().getPortalLogin(), + wiComputedDataFolder.getPath(), wiComputedDataFolder + .getType().name()); + outputDataSets = new OutputDataSets(computedDataFolder); + + } catch (Throwable e) { + logger.debug("ComputedData Folder is set to null"); + } + dataMinerWorkArea.setOutputDataSets(outputDataSets); + + Computations computations = null; + try { + WorkspaceItem wiComputationsDataFolder = StorageUtil + .getItemInFolderOnWorkspace(serviceCredentials.getUserName(), + dataMinerWorkArea.getDataMinerWorkAreaFolder() + .getId(), COMPUTATIONS_FOLDER); + ItemDescription computationsDataFolder = null; + + computationsDataFolder = new ItemDescription( + wiComputationsDataFolder.getId(), + wiComputationsDataFolder.getName(), + wiComputationsDataFolder.getOwner().getPortalLogin(), + wiComputationsDataFolder.getPath(), + wiComputationsDataFolder.getType().name()); + computations = new Computations(computationsDataFolder); + + } catch (Throwable e) { + logger.debug("Computations Folder is set to null"); + } + dataMinerWorkArea.setComputations(computations); + + return dataMinerWorkArea; + + } + +} diff --git a/src/main/java/org/gcube/portlets/widgets/dataminermanagerwidget/server/util/StorageUtil.java b/src/main/java/org/gcube/portlets/widgets/dataminermanagerwidget/server/util/StorageUtil.java new file mode 100644 index 0000000..f81d876 --- /dev/null +++ b/src/main/java/org/gcube/portlets/widgets/dataminermanagerwidget/server/util/StorageUtil.java @@ -0,0 +1,275 @@ +package org.gcube.portlets.widgets.dataminermanagerwidget.server.util; + +import java.io.File; +import java.io.InputStream; +import java.text.SimpleDateFormat; +import java.util.Date; +import java.util.Map; + +import org.gcube.common.homelibrary.home.HomeLibrary; +import org.gcube.common.homelibrary.home.workspace.Properties; +import org.gcube.common.homelibrary.home.workspace.Workspace; +import org.gcube.common.homelibrary.home.workspace.WorkspaceFolder; +import org.gcube.common.homelibrary.home.workspace.WorkspaceItem; +import org.gcube.common.homelibrary.util.zip.ZipUtil; +import org.gcube.contentmanagement.blobstorage.service.IClient; +import org.gcube.contentmanager.storageclient.wrapper.AccessType; +import org.gcube.contentmanager.storageclient.wrapper.MemoryType; +import org.gcube.contentmanager.storageclient.wrapper.StorageClient; +import org.gcube.portlets.widgets.dataminermanagerwidget.shared.exception.ServiceException; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +/** + * + * @author Giancarlo Panichi + * email: g.panichi@isti.cnr.it + * + */ +public class StorageUtil { + + private static Logger logger = LoggerFactory.getLogger(StorageUtil.class); + + /** + * + * @param user + * @param itemId + * @return + * @throws ServiceException + */ + public static Map getProperties(String user, + String itemId) throws ServiceException { + try { + Workspace ws = HomeLibrary.getUserWorkspace(user); + + WorkspaceItem workSpaceItem = ws.getItem(itemId); + Properties properties = workSpaceItem.getProperties(); + + return properties.getProperties(); + + } catch (Throwable e) { + logger.error(e.getLocalizedMessage()); + e.printStackTrace(); + throw new ServiceException(e.getLocalizedMessage()); + } + + } + + + /** + * + * @param user + * User + * @param itemId + * Item id + * @return Input stream + * @throws StatAlgoImporterServiceException + */ + public static InputStream getInputStreamForItemOnWorkspace(String user, + String itemId) throws ServiceException { + Workspace ws; + try { + ws = HomeLibrary.getUserWorkspace(user); + + WorkspaceItem workSpaceItem = ws.getItem(itemId); + if (workSpaceItem.isFolder()) { + throw new ServiceException("Folder is not valid!"); + } + + return getInputStream(user, workSpaceItem); + + } catch (Throwable e) { + logger.error(e.getLocalizedMessage()); + e.printStackTrace(); + throw new ServiceException(e.getLocalizedMessage()); + } + } + + /** + * + * @param user + * User + * @param wi + * WorkspaceItem + * @return InputStream + * @throws StatAlgoImporterServiceException + */ + private static InputStream getInputStream(String user, WorkspaceItem wi) + throws ServiceException { + InputStream is = null; + try { + + org.gcube.common.homelibrary.home.workspace.folder.items.File gcubeItem = ((org.gcube.common.homelibrary.home.workspace.folder.items.File) wi); + is = gcubeItem.getData(); + return is; + + } catch (Throwable e) { + logger.error("Error retrieving InputStream from storage", e); + e.printStackTrace(); + throw new ServiceException("Error retrieving file from storage: " + + e.getLocalizedMessage(), e); + } + + } + + /** + * + * @param user + * User + * @param itemId + * Item id + * @return Public link + * @throws StatAlgoImporterServiceException + */ + public static String getPublicLink(String user, String itemId) + throws ServiceException { + Workspace ws; + try { + ws = HomeLibrary.getUserWorkspace(user); + + WorkspaceItem workSpaceItem = ws.getItem(itemId); + if (workSpaceItem.isFolder()) { + throw new ServiceException("Attention this is a folder!"); + } + + return workSpaceItem.getPublicLink(false); + + } catch (Throwable e) { + logger.error("Error retrieving public link: " + + e.getLocalizedMessage()); + e.printStackTrace(); + throw new ServiceException(e.getLocalizedMessage()); + + } + } + + /** + * + * @param user + * @param folderId + * @return + * @throws ServiceException + */ + public static File zipFolder(String user, String folderId) + throws ServiceException { + Workspace ws; + try { + logger.debug("zipFolder: [user="+user+", folderId="+folderId+"]"); + ws = HomeLibrary.getUserWorkspace(user); + + WorkspaceItem workSpaceItem = ws.getItem(folderId); + if (!workSpaceItem.isFolder()) { + throw new ServiceException( + "Item is not valid folder!"); + } + + WorkspaceFolder folder = (WorkspaceFolder) workSpaceItem; + + File fileZip = ZipUtil.zipFolder(folder); + + return fileZip; + + } catch (Throwable e) { + e.printStackTrace(); + throw new ServiceException(e.getLocalizedMessage()); + } + + } + + /** + * + * @param user + * @param itemName + * @return + * @throws ServiceException + */ + public static WorkspaceItem getItemInRootFolderOnWorkspace(String user, + String itemName) throws ServiceException { + Workspace ws; + try { + ws = HomeLibrary.getUserWorkspace(user); + + WorkspaceItem item = ws.find(itemName, ws.getRoot().getId()); + + return item; + + } catch (Throwable e) { + e.printStackTrace(); + throw new ServiceException(e.getLocalizedMessage()); + } + } + + /** + * + * @param user + * @param folderId + * @param itemName + * @return + * @throws ServiceException + */ + public static WorkspaceItem getItemInFolderOnWorkspace(String user, + String folderId, String itemName) throws ServiceException { + Workspace ws; + try { + ws = HomeLibrary.getUserWorkspace(user); + + WorkspaceItem item = ws.find(itemName, folderId); + + return item; + + } catch (Throwable e) { + e.printStackTrace(); + throw new ServiceException(e.getLocalizedMessage()); + } + } + + /** + * + * @param user + * @param itemId + * @throws ServiceException + */ + public static void deleteItem(String user, String itemId) + throws ServiceException { + Workspace ws; + try { + logger.debug("User: " + user + ", ItemId:" + itemId); + ws = HomeLibrary.getUserWorkspace(user); + + ws.removeItems(itemId); + + return; + } catch (Throwable e) { + e.printStackTrace(); + throw new ServiceException(e.getLocalizedMessage()); + + } + + } + + public static String saveOnStorageInTemporalFile(InputStream is) + throws ServiceException { + try { + logger.debug("SaveOnStorageInTemporalFile()"); + SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd_HHmmss"); + Double v = Math.random() * 10000; + String tempFile = "P_" + sdf.format(new Date()) + "_" + + v.intValue() + ".xml"; + String remotePath = "/DataMiner/AlgoritmsParameters/" + tempFile; + IClient client = new StorageClient("DataAnalysis", "DataMiner", + "DataMiner", AccessType.PUBLIC, MemoryType.VOLATILE) + .getClient(); + String storageId = client.put(true).LFile(is).RFile(remotePath); + logger.debug("Storage id: " + storageId); + String publicLink = client.getHttpUrl().RFile(remotePath); + logger.debug("Storage public link: " + publicLink); + return publicLink; + + } catch (Throwable e) { + logger.error(e.getLocalizedMessage()); + e.printStackTrace(); + throw new ServiceException(e.getLocalizedMessage(), e); + } + } + +} diff --git a/src/main/java/org/gcube/portlets/widgets/dataminermanagerwidget/server/util/TableReader.java b/src/main/java/org/gcube/portlets/widgets/dataminermanagerwidget/server/util/TableReader.java new file mode 100644 index 0000000..02a07d8 --- /dev/null +++ b/src/main/java/org/gcube/portlets/widgets/dataminermanagerwidget/server/util/TableReader.java @@ -0,0 +1,74 @@ +package org.gcube.portlets.widgets.dataminermanagerwidget.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 net.sf.csv4j.CSVReader; + +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.portlets.widgets.dataminermanagerwidget.shared.exception.ServiceException; +import org.gcube.portlets.widgets.wsexplorer.shared.Item; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +/** + * + * @author Giancarlo Panichi email: g.panichi@isti.cnr.it + * + */ +public class TableReader { + private static Logger logger = LoggerFactory.getLogger(TableReader.class); + + private ServiceCredentials serviceCredentials; + private Item item; + + public TableReader(ServiceCredentials serviceCredentials, Item item) { + this.serviceCredentials = serviceCredentials; + this.item= item; + } + + public TableItemSimple getTableItemSimple() throws ServiceException { + + InputStream is = StorageUtil.getInputStreamForItemOnWorkspace( + 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().name()); + 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/widgets/dataminermanagerwidget/shared/Constants.java b/src/main/java/org/gcube/portlets/widgets/dataminermanagerwidget/shared/Constants.java new file mode 100644 index 0000000..a80fd37 --- /dev/null +++ b/src/main/java/org/gcube/portlets/widgets/dataminermanagerwidget/shared/Constants.java @@ -0,0 +1,64 @@ +package org.gcube.portlets.widgets.dataminermanagerwidget.shared; + +/** + * + * @author Giancarlo Panichi + * email: g.panichi@isti.cnr.it + * + */ +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.dataminermanager.portlet.DataMinerManager"; + public static final String DATA_MINER_MANAGER_ID = "DataMinerManagerId"; + public static final String DATA_MINER_LANG_COOKIE = "DataMinerLangCookie"; + public static final String DATA_MINER_LANG = "DataMinerLang"; + public static final String DATA_MINER_OPERATOR_ID = "OperatorId"; + + public static final String DEFAULT_USER = "giancarlo.panichi"; + public final static String DEFAULT_SCOPE = "/gcube/devNext"; + public final static String DEFAULT_TOKEN = "16e65d4f-11e0-4e4a-84b9-351688fccc12-98187548"; + + public static final String DEFAULT_ROLE = "OrganizationMember"; + // public final static String DEFAULT_SCOPE = "/gcube/devNext"; + //public final static String DEFAULT_SCOPE = "/gcube/devNext/NextNext"; + + + + 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; + + public static final String[] ClassificationNames = { "User Perspective" }; + // "Computation Perspective"}; + public static final String UserClassificationName = ClassificationNames[0]; + // public final static String computationClassificationName = + // classificationNames[1]; + + // 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 = "f0666597-4302-49ce-bea2-555b94e569cb"; + public static final String WPSUser = "giancarlo.panichi"; + public static final String WPSLanguage = "en-US"; + /*public static final String WPSToken = "4ccc2c35-60c9-4c9b-9800-616538d5d48b"; + public static final String WPSUser = "gianpaolo.coro";*/ + + + //DownloadFolderServlet + public static final String DOWNLOAD_FOLDER_SERVLET= "DownloadFolderServlet"; + public static final String DOWNLOAD_FOLDER_SERVLET_ITEM_ID_PARAMETER = "itemId"; + public static final String DOWNLOAD_FOLDER_SERVLET_FOLDER_NAME_PARAMETER = "folderName"; + + //Session + public static final String CURR_GROUP_ID="CURR_GROUP_ID"; + public static final String CURR_USER_ID = "CURR_USER_ID"; + +} diff --git a/src/main/java/org/gcube/portlets/widgets/dataminermanagerwidget/shared/StringUtil.java b/src/main/java/org/gcube/portlets/widgets/dataminermanagerwidget/shared/StringUtil.java new file mode 100644 index 0000000..a81f3df --- /dev/null +++ b/src/main/java/org/gcube/portlets/widgets/dataminermanagerwidget/shared/StringUtil.java @@ -0,0 +1,36 @@ +/** + * + */ +package org.gcube.portlets.widgets.dataminermanagerwidget.shared; + +/** + * + * @author Giancarlo Panichi + * email: g.panichi@isti.cnr.it + * + */ +public class StringUtil { + + public static String getCapitalWords(String string) { + String ris = ""; + + boolean precUnderscore = true; + for (int i=0; ig.panichi@isti.cnr.it + * + */ +public class ServiceException extends Exception { + + + private static final long serialVersionUID = -2255657546267656458L; + + + /** + * + */ + public ServiceException() { + super(); + } + + /** + * @param message + */ + public ServiceException(String message) { + super(message); + } + + + public ServiceException(String message,Throwable t) { + super(message,t); + } + + +} diff --git a/src/main/java/org/gcube/portlets/widgets/dataminermanagerwidget/shared/exception/SessionExpiredServiceException.java b/src/main/java/org/gcube/portlets/widgets/dataminermanagerwidget/shared/exception/SessionExpiredServiceException.java new file mode 100644 index 0000000..7ad34da --- /dev/null +++ b/src/main/java/org/gcube/portlets/widgets/dataminermanagerwidget/shared/exception/SessionExpiredServiceException.java @@ -0,0 +1,37 @@ +package org.gcube.portlets.widgets.dataminermanagerwidget.shared.exception; + +/** + * Session Expired Service Exception + * + * @author "Giancarlo Panichi" + * + */ +public class SessionExpiredServiceException extends + ServiceException { + + private static final long serialVersionUID = -4831171355042165166L; + + /** + * + */ + public SessionExpiredServiceException() { + super(); + } + + /** + * @param message + */ + public SessionExpiredServiceException(String message) { + super(message); + } + + /** + * + * @param message + * @param t + */ + public SessionExpiredServiceException(String message, Throwable t) { + super(message, t); + } + +} diff --git a/src/main/java/org/gcube/portlets/widgets/dataminermanagerwidget/shared/session/UserInfo.java b/src/main/java/org/gcube/portlets/widgets/dataminermanagerwidget/shared/session/UserInfo.java new file mode 100644 index 0000000..3a7131d --- /dev/null +++ b/src/main/java/org/gcube/portlets/widgets/dataminermanagerwidget/shared/session/UserInfo.java @@ -0,0 +1,95 @@ +package org.gcube.portlets.widgets.dataminermanagerwidget.shared.session; + +import java.io.Serializable; + +/** + * + * @author giancarlo + * email: g.panichi@isti.cnr.it + * + */ +public class UserInfo implements Serializable { + + private static final long serialVersionUID = -2826549639677017234L; + + private String username; + private String groupId; + private String groupName; + private String scope; + private String userEmailAddress; + private String userFullName; + + public UserInfo() { + super(); + } + + public UserInfo(String username, String groupId, String groupName, + String scope, String userEmailAddress, String userFullName) { + super(); + this.username = username; + this.groupId = groupId; + this.groupName = groupName; + this.scope = scope; + this.userEmailAddress = userEmailAddress; + this.userFullName = userFullName; + } + + public String getUsername() { + return username; + } + + public void setUsername(String username) { + this.username = username; + } + + public String getGroupId() { + return groupId; + } + + public void setGroupId(String groupId) { + this.groupId = groupId; + } + + public String getGroupName() { + return groupName; + } + + public void setGroupName(String groupName) { + this.groupName = groupName; + } + + public String getScope() { + return scope; + } + + public void setScope(String scope) { + this.scope = scope; + } + + public String getUserEmailAddress() { + return userEmailAddress; + } + + public void setUserEmailAddress(String userEmailAddress) { + this.userEmailAddress = userEmailAddress; + } + + public String getUserFullName() { + return userFullName; + } + + public void setUserFullName(String userFullName) { + this.userFullName = userFullName; + } + + @Override + public String toString() { + return "UserInfo [username=" + username + ", groupId=" + groupId + + ", groupName=" + groupName + ", scope=" + scope + + ", userEmailAddress=" + userEmailAddress + ", userFullName=" + + userFullName + "]"; + } + + + +} diff --git a/src/main/java/org/gcube/portlets/widgets/dataminermanagerwidget/shared/workspace/Computations.java b/src/main/java/org/gcube/portlets/widgets/dataminermanagerwidget/shared/workspace/Computations.java new file mode 100644 index 0000000..b10991c --- /dev/null +++ b/src/main/java/org/gcube/portlets/widgets/dataminermanagerwidget/shared/workspace/Computations.java @@ -0,0 +1,38 @@ +package org.gcube.portlets.widgets.dataminermanagerwidget.shared.workspace; + +import java.io.Serializable; + +/** + * + * @author Giancarlo Panichi email: g.panichi@isti.cnr.it + * + */ +public class Computations implements Serializable { + + private static final long serialVersionUID = 7375248981531583668L; + private ItemDescription folder; + + public Computations() { + super(); + } + + public Computations(ItemDescription folder) { + super(); + this.folder = folder; + } + + public ItemDescription getFolder() { + return folder; + } + + public void setFolder(ItemDescription folder) { + this.folder = folder; + } + + @Override + public String toString() { + return "Computations [folder=" + folder + "]"; + } + +} diff --git a/src/main/java/org/gcube/portlets/widgets/dataminermanagerwidget/shared/workspace/DataMinerWorkArea.java b/src/main/java/org/gcube/portlets/widgets/dataminermanagerwidget/shared/workspace/DataMinerWorkArea.java new file mode 100644 index 0000000..57ef595 --- /dev/null +++ b/src/main/java/org/gcube/portlets/widgets/dataminermanagerwidget/shared/workspace/DataMinerWorkArea.java @@ -0,0 +1,93 @@ +package org.gcube.portlets.widgets.dataminermanagerwidget.shared.workspace; + +import java.io.Serializable; + +/** + * + * @author "Giancarlo Panichi" g.panichi@isti.cnr.it + * + */ +public class DataMinerWorkArea implements Serializable { + + private static final long serialVersionUID = -7906477664944910362L; + private ItemDescription dataMinerWorkAreaFolder; + private InputDataSets inputDataSets; + private OutputDataSets outputDataSets; + private Computations computations; + + public DataMinerWorkArea() { + super(); + } + + /** + * + * @param dataMinerWorkAreaFolder + */ + public DataMinerWorkArea(ItemDescription dataMinerWorkAreaFolder) { + super(); + this.dataMinerWorkAreaFolder = dataMinerWorkAreaFolder; + + } + + /** + * + * @param dataMinerWorkAreaFolder + * @param inputDataSets + * @param outputDataSets + * @param computations + */ + public DataMinerWorkArea(ItemDescription dataMinerWorkAreaFolder, + InputDataSets inputDataSets, OutputDataSets outputDataSets, + Computations computations) { + super(); + this.dataMinerWorkAreaFolder = dataMinerWorkAreaFolder; + this.inputDataSets = inputDataSets; + this.outputDataSets = outputDataSets; + this.computations = computations; + } + + public ItemDescription getDataMinerWorkAreaFolder() { + return dataMinerWorkAreaFolder; + } + + public void setDataMinerWorkAreaFolder(ItemDescription dataMinerWorkAreaFolder) { + this.dataMinerWorkAreaFolder = dataMinerWorkAreaFolder; + } + + public InputDataSets getInputDataSets() { + return inputDataSets; + } + + public void setInputDataSets(InputDataSets inputDataSets) { + this.inputDataSets = inputDataSets; + } + + public OutputDataSets getOutputDataSets() { + return outputDataSets; + } + + public void setOutputDataSets(OutputDataSets outputDataSets) { + this.outputDataSets = outputDataSets; + } + + public Computations getComputations() { + return computations; + } + + public void setComputations(Computations computations) { + this.computations = computations; + } + + @Override + public String toString() { + return "DataMinerWorkArea [dataMinerWorkAreaFolder=" + + dataMinerWorkAreaFolder + ", inputDataSets=" + inputDataSets + + ", outputDataSets=" + outputDataSets + ", computations=" + + computations + "]"; + } + + + + +} diff --git a/src/main/java/org/gcube/portlets/widgets/dataminermanagerwidget/shared/workspace/InputDataSets.java b/src/main/java/org/gcube/portlets/widgets/dataminermanagerwidget/shared/workspace/InputDataSets.java new file mode 100644 index 0000000..c5b6cfa --- /dev/null +++ b/src/main/java/org/gcube/portlets/widgets/dataminermanagerwidget/shared/workspace/InputDataSets.java @@ -0,0 +1,38 @@ +package org.gcube.portlets.widgets.dataminermanagerwidget.shared.workspace; + +import java.io.Serializable; + +/** + * + * @author Giancarlo Panichi email: g.panichi@isti.cnr.it + * + */ +public class InputDataSets implements Serializable { + private static final long serialVersionUID = -4408116083736005844L; + + private ItemDescription folder; + + public InputDataSets() { + super(); + } + + public InputDataSets(ItemDescription folder) { + super(); + this.folder = folder; + } + + public ItemDescription getFolder() { + return folder; + } + + public void setFolder(ItemDescription folder) { + this.folder = folder; + } + + @Override + public String toString() { + return "ImportedData [folder=" + folder + "]"; + } + +} diff --git a/src/main/java/org/gcube/portlets/widgets/dataminermanagerwidget/shared/workspace/ItemDescription.java b/src/main/java/org/gcube/portlets/widgets/dataminermanagerwidget/shared/workspace/ItemDescription.java new file mode 100644 index 0000000..cff6b8a --- /dev/null +++ b/src/main/java/org/gcube/portlets/widgets/dataminermanagerwidget/shared/workspace/ItemDescription.java @@ -0,0 +1,112 @@ +package org.gcube.portlets.widgets.dataminermanagerwidget.shared.workspace; + +import java.io.Serializable; + +/** + * + * @author Giancarlo Panichi email: g.panichi@isti.cnr.it + * + */ +public class ItemDescription implements Serializable { + + private static final long serialVersionUID = -6624452446980057923L; + + private String id; + private String name; + private String owner; + private String path; + private String type; + private String publicLink; + + public ItemDescription() { + super(); + } + + public ItemDescription(String id, String name, String owner, String path, + String type) { + super(); + this.id = id; + this.name = name; + this.owner = owner; + this.path = path; + this.type = type; + } + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String getOwner() { + return owner; + } + + public void setOwner(String owner) { + this.owner = owner; + } + + public String getPath() { + return path; + } + + public void setPath(String path) { + this.path = path; + } + + public String getType() { + return type; + } + + public void setType(String type) { + this.type = type; + } + + public String getPublicLink() { + return publicLink; + } + + public void setPublicLink(String publicLink) { + this.publicLink = publicLink; + } + + /** + * Compare basic information with another ItemDescription not null + * + * @param itemDescription + * @return boolean + * + */ + public boolean compareInfo(ItemDescription itemDescription){ + if(itemDescription!=null && id.compareTo(itemDescription.getId())==0 && + name.compareTo(itemDescription.getName())==0 && + owner.compareTo(itemDescription.getOwner())==0 && + path.compareTo(itemDescription.getPath())==0 && + type.compareTo(itemDescription.getType())==0 + ){ + return true; + } else { + return false; + } + + } + + @Override + public String toString() { + return "ItemDescription [id=" + id + ", name=" + name + ", owner=" + + owner + ", path=" + path + ", type=" + type + ", publicLink=" + + publicLink + "]"; + } + +} diff --git a/src/main/java/org/gcube/portlets/widgets/dataminermanagerwidget/shared/workspace/OutputDataSets.java b/src/main/java/org/gcube/portlets/widgets/dataminermanagerwidget/shared/workspace/OutputDataSets.java new file mode 100644 index 0000000..12c50b1 --- /dev/null +++ b/src/main/java/org/gcube/portlets/widgets/dataminermanagerwidget/shared/workspace/OutputDataSets.java @@ -0,0 +1,38 @@ +package org.gcube.portlets.widgets.dataminermanagerwidget.shared.workspace; + +import java.io.Serializable; + +/** + * + * @author Giancarlo Panichi email: g.panichi@isti.cnr.it + * + */ +public class OutputDataSets implements Serializable { + private static final long serialVersionUID = -8235652292513149983L; + + private ItemDescription folder; + + public OutputDataSets() { + super(); + } + + public OutputDataSets(ItemDescription folder) { + super(); + this.folder = folder; + } + + public ItemDescription getFolder() { + return folder; + } + + public void setFolder(ItemDescription folder) { + this.folder = folder; + } + + @Override + public String toString() { + return "ComputedData [folder=" + folder + "]"; + } + +} diff --git a/src/main/resources/org/gcube/portlets/widgets/dataminermanagerwidget/dataminermanager.gwt.xml b/src/main/resources/org/gcube/portlets/widgets/dataminermanagerwidget/dataminermanager.gwt.xml new file mode 100644 index 0000000..31c7f0d --- /dev/null +++ b/src/main/resources/org/gcube/portlets/widgets/dataminermanagerwidget/dataminermanager.gwt.xml @@ -0,0 +1,48 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/main/webapp/DataMinerManagerWidget.css b/src/main/webapp/DataMinerManagerWidget.css new file mode 100644 index 0000000..6faa4b1 --- /dev/null +++ b/src/main/webapp/DataMinerManagerWidget.css @@ -0,0 +1,465 @@ +/* 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-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 { + +} + +/** +* 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; +} \ No newline at end of file diff --git a/src/main/webapp/DataMinerManagerWidget.html b/src/main/webapp/DataMinerManagerWidget.html new file mode 100644 index 0000000..b884eff --- /dev/null +++ b/src/main/webapp/DataMinerManagerWidget.html @@ -0,0 +1,38 @@ + + + + + + + + + + + +Data Miner Manager + + + + + + + + + + + + + + + + diff --git a/src/main/webapp/WEB-INF/jsp/DataMinerManagerWidget_view.jsp b/src/main/webapp/WEB-INF/jsp/DataMinerManagerWidget_view.jsp new file mode 100644 index 0000000..99fb536 --- /dev/null +++ b/src/main/webapp/WEB-INF/jsp/DataMinerManagerWidget_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..a9a32ba --- /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..2d0b6f7 --- /dev/null +++ b/src/main/webapp/WEB-INF/liferay-plugin-package.properties @@ -0,0 +1,9 @@ +name=DataMinerManagerWidget +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..0c32740 --- /dev/null +++ b/src/main/webapp/WEB-INF/liferay-portlet.xml @@ -0,0 +1,13 @@ + + + + + + DataMinerManagerWidget + false + false + false + DataMinerManagerWidgetCSS + + \ 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..ac27f4a --- /dev/null +++ b/src/main/webapp/WEB-INF/portlet.xml @@ -0,0 +1,27 @@ + + + + DataMinerManagerWidget + DataMinerManagerWidget + DataMinerManagerWidget + org.gcube.portlets.widgets.dataminermanagerwidget.portlet.DataMinerManagerWidget + 0 + + text/html + VIEW + + + DataMinerManagerWidget + DataMinerManagerWidget + + + + 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..d8e98d1 --- /dev/null +++ b/src/main/webapp/WEB-INF/web.xml @@ -0,0 +1,61 @@ + + + + + DataMinerManagerServlet + org.gcube.portlets.widgets.dataminermanagerwidget.server.DataMinerManagerServiceImpl + + + jUnitHostImpl + com.google.gwt.junit.server.JUnitHostImpl + + + DownloadFolderServlet + org.gcube.portlets.widgets.dataminermanagerwidget.server.DownloadFolderServlet + + + workspaceExplorer + org.gcube.portlets.widgets.wsexplorer.server.WorkspaceExplorerServiceImpl + + + workspaceUploaderService + org.gcube.portlets.widgets.workspaceuploader.server.WorkspaceUploaderServiceImpl + + + workspaceUploadServletStream + org.gcube.portlets.widgets.workspaceuploader.server.WorkspaceUploadServletStream + + + + + DataMinerManagerServlet + /dataminermanagerwidget/dataminermanwidget + + + jUnitHostImpl + /dataminermanagerwidget/junithost/* + + + DownloadFolderServlet + /dataminermanagerwidget/DownloadFolderServlet + + + workspaceExplorer + /dataminermanagerwidget/WorkspaceExplorerService + + + workspaceUploaderService + /dataminermanagerwidget/workspaceUploaderService + + + workspaceUploadServletStream + /dataminermanagerwidget/workspaceUploadServletStream + + + + DataMinerManagerWidget.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("