From 1630f645c14cf1744aa76130ada0a055526ce1ae Mon Sep 17 00:00:00 2001 From: Giancarlo Panichi Date: Thu, 17 Jan 2019 19:11:53 +0000 Subject: [PATCH] git-svn-id: https://svn.d4science.research-infrastructures.eu/gcube/trunk/portlets/user/data-miner-executor@176679 82a268e6-3cf1-43bd-a215-b396298e98cf --- .classpath | 38 + .project | 64 + .settings/org.eclipse.core.resources.prefs | 6 + .settings/org.eclipse.jdt.core.prefs | 8 + .settings/org.eclipse.m2e.core.prefs | 4 + .settings/org.eclipse.wst.common.component | 10 + ...se.wst.common.project.facet.core.prefs.xml | 7 + ....eclipse.wst.common.project.facet.core.xml | 8 + .settings/org.eclipse.wst.validation.prefs | 2 + distro/LICENSE | 1 + distro/README | 68 + distro/changelog.xml | 5 + distro/descriptor.xml | 32 + distro/profile.xml | 29 + pom.xml | 385 + .../client/DataMinerExecutor.java | 209 + .../client/DataMinerExecutorController.java | 490 ++ .../user/dataminerexecutor/client/Header.java | 181 + .../dataminerexecutor/client/HomePanel.java | 124 + .../client/PortalViewport.java | 153 + .../client/common/EventBusProvider.java | 19 + .../client/custom/Gxt2ZIndexXDOM.java | 21 + .../custom/progress/GreenProgressBar.css | 50 + .../custom/progress/GreenProgressBar.html | 12 + .../custom/progress/GreenProgressBar.java | 18 + .../progress/GreenProgressBarAppearance.java | 132 + .../custom/progress/OrangeProgressBar.css | 50 + .../custom/progress/OrangeProgressBar.html | 12 + .../custom/progress/OrangeProgressBar.java | 18 + .../progress/OrangeProgressBarAppearance.java | 132 + .../client/custom/progress/RedProgressBar.css | 50 + .../custom/progress/RedProgressBar.html | 12 + .../custom/progress/RedProgressBar.java | 18 + .../progress/RedProgressBarAppearance.java | 132 + .../client/custom/progress/green-bg.gif | Bin 0 -> 496 bytes .../custom/progress/green-progress-bg.gif | Bin 0 -> 99 bytes .../client/custom/progress/orange-bg.gif | Bin 0 -> 462 bytes .../custom/progress/orange-progress-bg.gif | Bin 0 -> 99 bytes .../client/custom/progress/red-bg.gif | Bin 0 -> 492 bytes .../custom/progress/red-progress-bg.gif | Bin 0 -> 120 bytes ...ancelComputationExecutionRequestEvent.java | 70 + ...ExecutionFromComputationsRequestEvent.java | 71 + .../client/events/ComputationDataEvent.java | 64 + .../events/ComputationDataRequestEvent.java | 67 + .../client/events/ComputationReadyEvent.java | 70 + .../client/events/DeleteItemRequestEvent.java | 76 + .../client/events/InvocationModelEvent.java | 66 + .../events/InvocationModelRequestEvent.java | 55 + .../client/events/MenuEvent.java | 68 + .../client/events/MenuSwitchEvent.java | 64 + .../client/events/OutputDataEvent.java | 63 + .../client/events/OutputDataRequestEvent.java | 66 + .../events/RemoveSelectedOperatorEvent.java | 48 + .../ResubmitComputationExecutionEvent.java | 71 + ...ubmitComputationExecutionRequestEvent.java | 71 + .../client/events/SessionExpiredEvent.java | 70 + .../StartComputationExecutionEvent.java | 76 + ...StartComputationExecutionRequestEvent.java | 78 + .../SyncRefreshUploadDataSpaceEvent.java | 57 + .../client/events/TabularFldChangeEvent.java | 66 + .../client/events/UIStateEvent.java | 67 + .../client/events/WPSMenuEvent.java | 68 + .../ComputationExecutionPanel.java | 209 + .../experiments/ComputationOutputPanel.java | 295 + .../client/experiments/ComputationPanel.java | 155 + .../ComputationParametersPanel.java | 233 + .../experiments/ComputationStatusPanel.java | 320 + .../experiments/EquivalentRequestDialog.java | 46 + .../client/experiments/ExperimentPanel.java | 88 + .../client/experiments/WorkflowPanel.java | 113 + .../client/monitor/StatusMonitor.java | 69 + .../client/parametersfield/AbstractFld.java | 58 + .../client/parametersfield/ColumnFld.java | 184 + .../client/parametersfield/ColumnListFld.java | 129 + .../client/parametersfield/EnumFld.java | 94 + .../client/parametersfield/FileFld.java | 109 + .../client/parametersfield/ListIntFld.java | 238 + .../client/parametersfield/ListStringFld.java | 169 + .../parametersfield/OperatorFieldWidget.java | 115 + .../client/parametersfield/StringFld.java | 145 + .../client/parametersfield/StringItem.java | 95 + .../client/parametersfield/TabItem.java | 264 + .../client/parametersfield/TabularFld.java | 109 + .../parametersfield/TabularListFld.java | 191 + .../properties/ColumnItemProperties.java | 24 + .../properties/ColumnItemPropertiesCombo.java | 23 + .../client/resources/Resources.java | 108 + .../client/resources/WikiLink.txt | 1 + .../client/resources/add.png | Bin 0 -> 733 bytes .../client/resources/ajax-complete.gif | Bin 0 -> 137 bytes .../client/resources/ajax-error.gif | Bin 0 -> 293 bytes .../client/resources/ajax-loader-big.gif | Bin 0 -> 1672 bytes .../client/resources/ajax-loader.gif | Bin 0 -> 723 bytes .../client/resources/alert.gif | Bin 0 -> 271 bytes .../client/resources/arrow_right.png | Bin 0 -> 349 bytes .../client/resources/cancel.png | Bin 0 -> 587 bytes .../client/resources/cancel_circle.png | Bin 0 -> 890 bytes .../client/resources/cancel_icon.png | Bin 0 -> 416 bytes .../client/resources/computation.png | Bin 0 -> 14026 bytes .../client/resources/computations.png | Bin 0 -> 12178 bytes .../client/resources/connector1.png | Bin 0 -> 2872 bytes .../client/resources/delete.png | Bin 0 -> 1284 bytes .../client/resources/delete_circle.png | Bin 0 -> 852 bytes .../client/resources/detach.png | Bin 0 -> 597 bytes .../client/resources/details.png | Bin 0 -> 1169 bytes .../client/resources/download.png | Bin 0 -> 605 bytes .../client/resources/draw-geometry.png | Bin 0 -> 499 bytes .../client/resources/folder_explore.png | Bin 0 -> 679 bytes .../client/resources/goBack.png | Bin 0 -> 3689 bytes .../client/resources/inputSpace.png | Bin 0 -> 11739 bytes .../client/resources/logoLittle.png | Bin 0 -> 15988 bytes .../client/resources/menuItemComputations.png | Bin 0 -> 7388 bytes .../client/resources/menuItemDataspace.png | Bin 0 -> 7020 bytes .../client/resources/menuItemExperiment.png | Bin 0 -> 6826 bytes .../client/resources/menuItemHelp.png | Bin 0 -> 4178 bytes .../client/resources/menuItemInputspace.png | Bin 0 -> 7032 bytes .../client/resources/monitor.png | Bin 0 -> 612 bytes .../client/resources/refresh.png | Bin 0 -> 783 bytes .../client/resources/resubmit.png | Bin 0 -> 770 bytes .../client/resources/save.png | Bin 0 -> 620 bytes .../client/resources/show.png | Bin 0 -> 906 bytes .../client/resources/sort_asc.gif | Bin 0 -> 898 bytes .../client/resources/table.png | Bin 0 -> 566 bytes .../client/resources/tableResult.png | Bin 0 -> 2402 bytes .../client/resources/tree.gif | Bin 0 -> 372 bytes .../client/resources/triangle.png | Bin 0 -> 3219 bytes .../client/resources/user_green.png | Bin 0 -> 722 bytes .../client/rpc/DataMinerExecutorService.java | 59 + .../rpc/DataMinerExecutorServiceAsync.java | 63 + .../type/DataMinerWorkAreaElementType.java | 11 + .../type/DataMinerWorkAreaEventType.java | 11 + .../type/DataMinerWorkAreaRegionType.java | 11 + .../DataMinerWorkAreaRequestEventType.java | 11 + .../client/type/MenuType.java | 11 + .../OperatorsClassificationRequestType.java | 11 + .../type/OutputResourceRequestEventType.java | 11 + .../client/type/SessionExpiredEventType.java | 11 + .../client/type/UIStateEventType.java | 13 + .../client/type/WPSMenuType.java | 11 + .../client/util/ElementsHighlights.java | 271 + .../client/util/InfoMessageBox.java | 28 + .../client/util/UtilsGXT3.java | 78 + .../client/widgets/FileViewer.java | 109 + .../client/widgets/HashMapViewer.java | 54 + .../client/widgets/ImageViewer.java | 89 + .../client/widgets/ResourceViewer.java | 58 + .../client/workspace/DownloadWidget.java | 77 + .../dataminerexecutor.gwt.xml | 59 + .../portlet/DataMinerExecutor.java | 55 + .../server/DataMinerExecutorServiceImpl.java | 440 + .../server/DescriptionRepository.java | 127 + .../server/DownloadServlet.java | 163 + .../dataminerexecutor/server/SessionUtil.java | 245 + .../server/invocation/InvocationManager.java | 93 + .../server/storage/ItemDownload.java | 44 + .../server/storage/StorageUtil.java | 332 + .../server/util/DataMinerWorkAreaManager.java | 93 + .../server/util/TableReader.java | 75 + .../dataminerexecutor/shared/Constants.java | 47 + .../dataminerexecutor/shared/StringUtil.java | 36 + .../shared/exception/ServiceException.java | 42 + .../SessionExpiredServiceException.java | 40 + .../shared/session/UserInfo.java | 95 + .../dataminerexecutor.gwt.xml | 59 + src/main/webapp/DataMinerExecutor.css | 485 ++ src/main/webapp/DataMinerExecutor.html | 38 + .../WEB-INF/jsp/DataMinerExecutor_view.jsp | 29 + src/main/webapp/WEB-INF/liferay-display.xml | 9 + .../WEB-INF/liferay-plugin-package.properties | 9 + src/main/webapp/WEB-INF/liferay-portlet.xml | 13 + src/main/webapp/WEB-INF/portlet.xml | 27 + src/main/webapp/WEB-INF/web.xml | 78 + src/main/webapp/gxt/css/gxt-all.css | 7451 +++++++++++++++++ src/main/webapp/gxt/css/gxt-gray.css | 493 ++ src/main/webapp/gxt/desktop/css/desktop.css | 638 ++ .../webapp/gxt/desktop/images/desktop.gif | Bin 0 -> 63601 bytes .../webapp/gxt/desktop/images/desktop3.jpg | Bin 0 -> 158508 bytes src/main/webapp/gxt/desktop/images/gears.gif | Bin 0 -> 996 bytes src/main/webapp/gxt/desktop/images/gears.png | Bin 0 -> 967 bytes src/main/webapp/gxt/desktop/images/grid.png | Bin 0 -> 513 bytes src/main/webapp/gxt/desktop/images/hatch.gif | Bin 0 -> 842 bytes src/main/webapp/gxt/desktop/images/hd-bg.gif | Bin 0 -> 992 bytes .../webapp/gxt/desktop/images/hd-tb-bg.gif | Bin 0 -> 808 bytes .../gxt/desktop/images/icon_padlock.png | Bin 0 -> 400 bytes .../webapp/gxt/desktop/images/icons-bg.png | Bin 0 -> 191 bytes .../webapp/gxt/desktop/images/launcher-bg.gif | Bin 0 -> 944 bytes .../gxt/desktop/images/launcher-btn.gif | Bin 0 -> 1247 bytes src/main/webapp/gxt/desktop/images/logout.gif | Bin 0 -> 920 bytes src/main/webapp/gxt/desktop/images/logout.png | Bin 0 -> 505 bytes src/main/webapp/gxt/desktop/images/member.gif | Bin 0 -> 972 bytes src/main/webapp/gxt/desktop/images/member.png | Bin 0 -> 832 bytes .../webapp/gxt/desktop/images/powered.gif | Bin 0 -> 2291 bytes .../webapp/gxt/desktop/images/powered.png | Bin 0 -> 3606 bytes src/main/webapp/gxt/desktop/images/s.gif | Bin 0 -> 43 bytes .../images/taskbar/black/item-over.gif | Bin 0 -> 166 bytes .../images/taskbar/black/scroll-left.gif | Bin 0 -> 1405 bytes .../images/taskbar/black/scroll-right.gif | Bin 0 -> 1405 bytes .../taskbar/black/start-menu-left-corners.png | Bin 0 -> 206 bytes .../taskbar/black/start-menu-left-right.png | Bin 0 -> 143 bytes .../black/start-menu-right-corners.png | Bin 0 -> 224 bytes .../images/taskbar/black/start-menu-right.png | Bin 0 -> 141 bytes .../taskbar/black/start-menu-top-bottom.png | Bin 0 -> 158 bytes .../images/taskbar/black/startbutton-icon.gif | Bin 0 -> 748 bytes .../images/taskbar/black/startbutton.gif | Bin 0 -> 2419 bytes .../images/taskbar/black/taskbar-split-h.gif | Bin 0 -> 327 bytes .../taskbar/black/taskbar-start-panel-bg.gif | Bin 0 -> 890 bytes .../images/taskbar/black/taskbutton.gif | Bin 0 -> 1894 bytes .../taskbar/black/taskbuttons-panel-bg.gif | Bin 0 -> 195 bytes .../webapp/gxt/desktop/images/winbar-bg.gif | Bin 0 -> 888 bytes .../webapp/gxt/desktop/images/winbar-btn.gif | Bin 0 -> 1316 bytes .../webapp/gxt/desktop/images/windows-bg.gif | Bin 0 -> 830 bytes .../webapp/gxt/desktop/wallpapers/desktop.jpg | Bin 0 -> 84237 bytes src/main/webapp/gxt/flash/swfobject.js | 5 + .../gxt/images/default/box/corners-blue.gif | Bin 0 -> 1010 bytes .../webapp/gxt/images/default/box/corners.gif | Bin 0 -> 1005 bytes .../webapp/gxt/images/default/box/l-blue.gif | Bin 0 -> 810 bytes src/main/webapp/gxt/images/default/box/l.gif | Bin 0 -> 810 bytes .../webapp/gxt/images/default/box/r-blue.gif | Bin 0 -> 810 bytes src/main/webapp/gxt/images/default/box/r.gif | Bin 0 -> 810 bytes .../webapp/gxt/images/default/box/tb-blue.gif | Bin 0 -> 851 bytes src/main/webapp/gxt/images/default/box/tb.gif | Bin 0 -> 839 bytes .../gxt/images/default/button/arrow.gif | Bin 0 -> 828 bytes .../gxt/images/default/button/btn-arrow.gif | Bin 0 -> 870 bytes .../gxt/images/default/button/btn-sprite.gif | Bin 0 -> 1341 bytes .../webapp/gxt/images/default/button/btn.gif | Bin 0 -> 4298 bytes .../gxt/images/default/button/group-cs.gif | Bin 0 -> 2459 bytes .../gxt/images/default/button/group-lr.gif | Bin 0 -> 861 bytes .../gxt/images/default/button/group-tb.gif | Bin 0 -> 846 bytes .../default/button/s-arrow-b-noline.gif | Bin 0 -> 898 bytes .../gxt/images/default/button/s-arrow-b.gif | Bin 0 -> 937 bytes .../gxt/images/default/button/s-arrow-bo.gif | Bin 0 -> 955 bytes .../images/default/button/s-arrow-noline.gif | Bin 0 -> 863 bytes .../gxt/images/default/button/s-arrow-o.gif | Bin 0 -> 937 bytes .../gxt/images/default/button/s-arrow.gif | Bin 0 -> 937 bytes .../webapp/gxt/images/default/dd/drop-add.gif | Bin 0 -> 1001 bytes .../webapp/gxt/images/default/dd/drop-no.gif | Bin 0 -> 949 bytes .../webapp/gxt/images/default/dd/drop-yes.gif | Bin 0 -> 1016 bytes .../gxt/images/default/editor/tb-bold.gif | Bin 0 -> 892 bytes .../images/default/editor/tb-font-color.gif | Bin 0 -> 905 bytes .../default/editor/tb-font-decrease.gif | Bin 0 -> 879 bytes .../default/editor/tb-font-highlight.gif | Bin 0 -> 941 bytes .../default/editor/tb-font-increase.gif | Bin 0 -> 906 bytes .../gxt/images/default/editor/tb-italic.gif | Bin 0 -> 862 bytes .../default/editor/tb-justify-center.gif | Bin 0 -> 848 bytes .../images/default/editor/tb-justify-left.gif | Bin 0 -> 848 bytes .../default/editor/tb-justify-right.gif | Bin 0 -> 848 bytes .../gxt/images/default/editor/tb-link.gif | Bin 0 -> 1060 bytes .../gxt/images/default/editor/tb-ol.gif | Bin 0 -> 877 bytes .../gxt/images/default/editor/tb-source.gif | Bin 0 -> 952 bytes .../gxt/images/default/editor/tb-sprite.gif | Bin 0 -> 2072 bytes .../gxt/images/default/editor/tb-ul.gif | Bin 0 -> 871 bytes .../images/default/editor/tb-underline.gif | Bin 0 -> 884 bytes .../gxt/images/default/form/checkbox.gif | Bin 0 -> 2061 bytes .../gxt/images/default/form/clear-trigger.gif | Bin 0 -> 1988 bytes .../gxt/images/default/form/date-trigger.gif | Bin 0 -> 1603 bytes .../images/default/form/error-tip-corners.gif | Bin 0 -> 4183 bytes .../gxt/images/default/form/exclamation.gif | Bin 0 -> 996 bytes .../webapp/gxt/images/default/form/radio.gif | Bin 0 -> 1746 bytes .../images/default/form/search-trigger.gif | Bin 0 -> 2182 bytes .../gxt/images/default/form/spinner.gif | Bin 0 -> 3186 bytes .../gxt/images/default/form/text-bg.gif | Bin 0 -> 819 bytes .../gxt/images/default/form/trigger-tpl.gif | Bin 0 -> 1487 bytes .../gxt/images/default/form/trigger.gif | Bin 0 -> 1688 bytes .../webapp/gxt/images/default/gradient-bg.gif | Bin 0 -> 1472 bytes .../images/default/grid/arrow-left-white.gif | Bin 0 -> 825 bytes .../images/default/grid/arrow-right-white.gif | Bin 0 -> 825 bytes .../images/default/grid/col-move-bottom.gif | Bin 0 -> 868 bytes .../gxt/images/default/grid/col-move-top.gif | Bin 0 -> 869 bytes .../gxt/images/default/grid/columns.gif | Bin 0 -> 962 bytes .../webapp/gxt/images/default/grid/dirty.gif | Bin 0 -> 832 bytes .../webapp/gxt/images/default/grid/done.gif | Bin 0 -> 133 bytes .../gxt/images/default/grid/drop-no.gif | Bin 0 -> 947 bytes .../gxt/images/default/grid/drop-yes.gif | Bin 0 -> 860 bytes .../gxt/images/default/grid/footer-bg.gif | Bin 0 -> 834 bytes .../gxt/images/default/grid/grid-blue-hd.gif | Bin 0 -> 829 bytes .../images/default/grid/grid-blue-split.gif | Bin 0 -> 817 bytes .../gxt/images/default/grid/grid-hrow.gif | Bin 0 -> 855 bytes .../gxt/images/default/grid/grid-loading.gif | Bin 0 -> 701 bytes .../gxt/images/default/grid/grid-split.gif | Bin 0 -> 817 bytes .../gxt/images/default/grid/grid-vista-hd.gif | Bin 0 -> 829 bytes .../gxt/images/default/grid/grid3-hd-btn.gif | Bin 0 -> 1298 bytes .../images/default/grid/grid3-hrow-group.gif | Bin 0 -> 811 bytes .../images/default/grid/grid3-hrow-over.gif | Bin 0 -> 823 bytes .../gxt/images/default/grid/grid3-hrow.gif | Bin 0 -> 836 bytes .../default/grid/grid3-special-col-bg.gif | Bin 0 -> 837 bytes .../default/grid/grid3-special-col-sel-bg.gif | Bin 0 -> 843 bytes .../gxt/images/default/grid/group-by.gif | Bin 0 -> 917 bytes .../default/grid/group-expand-sprite.gif | Bin 0 -> 955 bytes .../webapp/gxt/images/default/grid/hd-pop.gif | Bin 0 -> 839 bytes .../gxt/images/default/grid/hmenu-asc.gif | Bin 0 -> 931 bytes .../gxt/images/default/grid/hmenu-desc.gif | Bin 0 -> 930 bytes .../gxt/images/default/grid/hmenu-lock.gif | Bin 0 -> 955 bytes .../gxt/images/default/grid/hmenu-lock.png | Bin 0 -> 648 bytes .../gxt/images/default/grid/hmenu-unlock.gif | Bin 0 -> 971 bytes .../gxt/images/default/grid/hmenu-unlock.png | Bin 0 -> 697 bytes .../gxt/images/default/grid/invalid_line.gif | Bin 0 -> 815 bytes .../gxt/images/default/grid/loading.gif | Bin 0 -> 771 bytes .../webapp/gxt/images/default/grid/mso-hd.gif | Bin 0 -> 875 bytes .../webapp/gxt/images/default/grid/nowait.gif | Bin 0 -> 884 bytes .../default/grid/page-first-disabled.gif | Bin 0 -> 925 bytes .../gxt/images/default/grid/page-first.gif | Bin 0 -> 925 bytes .../default/grid/page-last-disabled.gif | Bin 0 -> 923 bytes .../gxt/images/default/grid/page-last.gif | Bin 0 -> 923 bytes .../default/grid/page-next-disabled.gif | Bin 0 -> 875 bytes .../gxt/images/default/grid/page-next.gif | Bin 0 -> 875 bytes .../default/grid/page-prev-disabled.gif | Bin 0 -> 879 bytes .../gxt/images/default/grid/page-prev.gif | Bin 0 -> 879 bytes .../gxt/images/default/grid/pick-button.gif | Bin 0 -> 1036 bytes .../gxt/images/default/grid/refresh.gif | Bin 0 -> 977 bytes .../gxt/images/default/grid/refresh.png | Bin 0 -> 791 bytes .../images/default/grid/row-check-sprite.gif | Bin 0 -> 1083 bytes .../images/default/grid/row-expand-sprite.gif | Bin 0 -> 955 bytes .../gxt/images/default/grid/row-over.gif | Bin 0 -> 823 bytes .../gxt/images/default/grid/row-sel.gif | Bin 0 -> 823 bytes .../gxt/images/default/grid/sort-hd.gif | Bin 0 -> 1473 bytes .../gxt/images/default/grid/sort_asc.gif | Bin 0 -> 830 bytes .../gxt/images/default/grid/sort_desc.gif | Bin 0 -> 833 bytes .../webapp/gxt/images/default/grid/wait.gif | Bin 0 -> 1100 bytes .../gxt/images/default/layout/collapse.gif | Bin 0 -> 842 bytes .../gxt/images/default/layout/expand.gif | Bin 0 -> 842 bytes .../gxt/images/default/layout/gradient-bg.gif | Bin 0 -> 1472 bytes .../gxt/images/default/layout/mini-bottom.gif | Bin 0 -> 856 bytes .../gxt/images/default/layout/mini-left.gif | Bin 0 -> 871 bytes .../gxt/images/default/layout/mini-right.gif | Bin 0 -> 872 bytes .../gxt/images/default/layout/mini-top.gif | Bin 0 -> 856 bytes .../gxt/images/default/layout/ns-collapse.gif | Bin 0 -> 842 bytes .../gxt/images/default/layout/ns-expand.gif | Bin 0 -> 843 bytes .../gxt/images/default/layout/panel-close.gif | Bin 0 -> 829 bytes .../images/default/layout/panel-title-bg.gif | Bin 0 -> 838 bytes .../default/layout/panel-title-light-bg.gif | Bin 0 -> 835 bytes .../gxt/images/default/layout/stick.gif | Bin 0 -> 874 bytes .../gxt/images/default/layout/stuck.gif | Bin 0 -> 92 bytes .../images/default/layout/tab-close-on.gif | Bin 0 -> 880 bytes .../gxt/images/default/layout/tab-close.gif | Bin 0 -> 859 bytes .../gxt/images/default/menu/checked.gif | Bin 0 -> 959 bytes .../gxt/images/default/menu/group-checked.gif | Bin 0 -> 891 bytes .../gxt/images/default/menu/item-over.gif | Bin 0 -> 820 bytes .../gxt/images/default/menu/menu-parent.gif | Bin 0 -> 854 bytes .../webapp/gxt/images/default/menu/menu.gif | Bin 0 -> 834 bytes .../gxt/images/default/menu/unchecked.gif | Bin 0 -> 941 bytes .../images/default/panel/corners-sprite.gif | Bin 0 -> 1418 bytes .../gxt/images/default/panel/left-right.gif | Bin 0 -> 815 bytes .../gxt/images/default/panel/light-hd.gif | Bin 0 -> 827 bytes .../images/default/panel/tool-sprite-tpl.gif | Bin 0 -> 971 bytes .../gxt/images/default/panel/tool-sprites.gif | Bin 0 -> 4392 bytes .../default/panel/tools-sprites-trans.gif | Bin 0 -> 2843 bytes .../gxt/images/default/panel/top-bottom.gif | Bin 0 -> 875 bytes .../gxt/images/default/panel/top-bottom.png | Bin 0 -> 218 bytes .../default/panel/white-corners-sprite.gif | Bin 0 -> 1366 bytes .../images/default/panel/white-left-right.gif | Bin 0 -> 815 bytes .../images/default/panel/white-top-bottom.gif | Bin 0 -> 872 bytes .../images/default/progress/progress-bg.gif | Bin 0 -> 834 bytes .../webapp/gxt/images/default/qtip/bg.gif | Bin 0 -> 1091 bytes .../webapp/gxt/images/default/qtip/close.gif | Bin 0 -> 972 bytes .../images/default/qtip/tip-anchor-sprite.gif | Bin 0 -> 951 bytes .../gxt/images/default/qtip/tip-sprite.gif | Bin 0 -> 4271 bytes src/main/webapp/gxt/images/default/s.gif | Bin 0 -> 43 bytes .../webapp/gxt/images/default/shadow-c.png | Bin 0 -> 118 bytes .../webapp/gxt/images/default/shadow-lr.png | Bin 0 -> 135 bytes src/main/webapp/gxt/images/default/shadow.png | Bin 0 -> 311 bytes .../images/default/shared/blue-loading.gif | Bin 0 -> 3236 bytes .../gxt/images/default/shared/calendar.gif | Bin 0 -> 979 bytes .../gxt/images/default/shared/clear.gif | Bin 0 -> 43 bytes .../gxt/images/default/shared/glass-bg.gif | Bin 0 -> 873 bytes .../gxt/images/default/shared/hd-sprite.gif | Bin 0 -> 1099 bytes .../images/default/shared/large-loading.gif | Bin 0 -> 3236 bytes .../gxt/images/default/shared/left-btn.gif | Bin 0 -> 870 bytes .../images/default/shared/loading-balls.gif | Bin 0 -> 2118 bytes .../gxt/images/default/shared/right-btn.gif | Bin 0 -> 871 bytes .../gxt/images/default/shared/warning.gif | Bin 0 -> 960 bytes .../images/default/sizer/e-handle-dark.gif | Bin 0 -> 1062 bytes .../gxt/images/default/sizer/e-handle.gif | Bin 0 -> 1586 bytes .../images/default/sizer/ne-handle-dark.gif | Bin 0 -> 839 bytes .../gxt/images/default/sizer/ne-handle.gif | Bin 0 -> 854 bytes .../images/default/sizer/nw-handle-dark.gif | Bin 0 -> 839 bytes .../gxt/images/default/sizer/nw-handle.gif | Bin 0 -> 853 bytes .../images/default/sizer/s-handle-dark.gif | Bin 0 -> 1060 bytes .../gxt/images/default/sizer/s-handle.gif | Bin 0 -> 1318 bytes .../images/default/sizer/se-handle-dark.gif | Bin 0 -> 838 bytes .../gxt/images/default/sizer/se-handle.gif | Bin 0 -> 853 bytes .../gxt/images/default/sizer/square.gif | Bin 0 -> 864 bytes .../images/default/sizer/sw-handle-dark.gif | Bin 0 -> 839 bytes .../gxt/images/default/sizer/sw-handle.gif | Bin 0 -> 855 bytes .../gxt/images/default/slider/slider-bg.png | Bin 0 -> 300 bytes .../images/default/slider/slider-thumb.png | Bin 0 -> 933 bytes .../gxt/images/default/slider/slider-v-bg.png | Bin 0 -> 288 bytes .../images/default/slider/slider-v-thumb.png | Bin 0 -> 883 bytes .../gxt/images/default/tabs/scroll-left.gif | Bin 0 -> 1295 bytes .../gxt/images/default/tabs/scroll-right.gif | Bin 0 -> 1300 bytes .../gxt/images/default/tabs/scroller-bg.gif | Bin 0 -> 1100 bytes .../default/tabs/tab-btm-inactive-left-bg.gif | Bin 0 -> 886 bytes .../tabs/tab-btm-inactive-right-bg.gif | Bin 0 -> 1386 bytes .../images/default/tabs/tab-btm-left-bg.gif | Bin 0 -> 863 bytes .../images/default/tabs/tab-btm-right-bg.gif | Bin 0 -> 1402 bytes .../gxt/images/default/tabs/tab-close.gif | Bin 0 -> 896 bytes .../gxt/images/default/tabs/tab-strip-bg.gif | Bin 0 -> 835 bytes .../gxt/images/default/tabs/tab-strip-bg.png | Bin 0 -> 259 bytes .../images/default/tabs/tab-strip-btm-bg.gif | Bin 0 -> 826 bytes .../gxt/images/default/tabs/tabs-sprite.gif | Bin 0 -> 2120 bytes .../webapp/gxt/images/default/toolbar/bg.gif | Bin 0 -> 904 bytes .../default/toolbar/btn-arrow-light.gif | Bin 0 -> 916 bytes .../gxt/images/default/toolbar/btn-arrow.gif | Bin 0 -> 919 bytes .../images/default/toolbar/btn-over-bg.gif | Bin 0 -> 837 bytes .../gxt/images/default/toolbar/gray-bg.gif | Bin 0 -> 832 bytes .../gxt/images/default/toolbar/more.gif | Bin 0 -> 845 bytes .../gxt/images/default/toolbar/tb-bg.gif | Bin 0 -> 862 bytes .../images/default/toolbar/tb-btn-sprite.gif | Bin 0 -> 1127 bytes .../default/toolbar/tb-xl-btn-sprite.gif | Bin 0 -> 1663 bytes .../gxt/images/default/toolbar/tb-xl-sep.gif | Bin 0 -> 810 bytes .../webapp/gxt/images/default/tree/arrows.gif | Bin 0 -> 1024 bytes .../gxt/images/default/tree/drop-add.gif | Bin 0 -> 1001 bytes .../gxt/images/default/tree/drop-between.gif | Bin 0 -> 907 bytes .../gxt/images/default/tree/drop-no.gif | Bin 0 -> 949 bytes .../gxt/images/default/tree/drop-over.gif | Bin 0 -> 911 bytes .../gxt/images/default/tree/drop-under.gif | Bin 0 -> 911 bytes .../gxt/images/default/tree/drop-yes.gif | Bin 0 -> 1016 bytes .../default/tree/elbow-end-minus-nl.gif | Bin 0 -> 898 bytes .../images/default/tree/elbow-end-minus.gif | Bin 0 -> 905 bytes .../images/default/tree/elbow-end-plus-nl.gif | Bin 0 -> 900 bytes .../images/default/tree/elbow-end-plus.gif | Bin 0 -> 907 bytes .../gxt/images/default/tree/elbow-end.gif | Bin 0 -> 844 bytes .../gxt/images/default/tree/elbow-line.gif | Bin 0 -> 846 bytes .../images/default/tree/elbow-minus-nl.gif | Bin 0 -> 898 bytes .../gxt/images/default/tree/elbow-minus.gif | Bin 0 -> 908 bytes .../gxt/images/default/tree/elbow-plus-nl.gif | Bin 0 -> 900 bytes .../gxt/images/default/tree/elbow-plus.gif | Bin 0 -> 910 bytes .../webapp/gxt/images/default/tree/elbow.gif | Bin 0 -> 850 bytes .../gxt/images/default/tree/folder-open.gif | Bin 0 -> 956 bytes .../webapp/gxt/images/default/tree/folder.gif | Bin 0 -> 952 bytes .../webapp/gxt/images/default/tree/leaf.gif | Bin 0 -> 945 bytes .../gxt/images/default/tree/loading.gif | Bin 0 -> 771 bytes src/main/webapp/gxt/images/default/tree/s.gif | Bin 0 -> 43 bytes .../gxt/images/default/window/icon-error.gif | Bin 0 -> 1669 bytes .../gxt/images/default/window/icon-info.gif | Bin 0 -> 1586 bytes .../images/default/window/icon-question.gif | Bin 0 -> 1607 bytes .../images/default/window/icon-warning.gif | Bin 0 -> 1483 bytes .../images/default/window/left-corners.png | Bin 0 -> 200 bytes .../gxt/images/default/window/left-right.png | Bin 0 -> 152 bytes .../images/default/window/right-corners.png | Bin 0 -> 256 bytes .../gxt/images/default/window/top-bottom.png | Bin 0 -> 180 bytes .../gxt/images/gray/button/btn-arrow.gif | Bin 0 -> 870 bytes .../gxt/images/gray/button/btn-sprite.gif | Bin 0 -> 1222 bytes .../webapp/gxt/images/gray/button/btn.gif | Bin 0 -> 3319 bytes .../gxt/images/gray/button/group-cs.gif | Bin 0 -> 2459 bytes .../gxt/images/gray/button/group-lr.gif | Bin 0 -> 861 bytes .../gxt/images/gray/button/group-tb.gif | Bin 0 -> 846 bytes .../webapp/gxt/images/gray/form/spinner.gif | Bin 0 -> 3046 bytes .../webapp/gxt/images/gray/gradient-bg.gif | Bin 0 -> 1472 bytes .../gxt/images/gray/grid/col-move-bottom.gif | Bin 0 -> 177 bytes .../gxt/images/gray/grid/col-move-top.gif | Bin 0 -> 178 bytes .../gxt/images/gray/grid/grid-split.gif | Bin 0 -> 809 bytes .../gxt/images/gray/grid/grid3-hd-btn.gif | Bin 0 -> 482 bytes .../gxt/images/gray/grid/grid3-hrow-over.gif | Bin 0 -> 56 bytes .../gxt/images/gray/grid/grid3-hrow-over2.gif | Bin 0 -> 107 bytes .../gxt/images/gray/grid/grid3-hrow.gif | Bin 0 -> 836 bytes .../gxt/images/gray/grid/grid3-hrow2.gif | Bin 0 -> 107 bytes .../images/gray/grid/grid3-special-col-bg.gif | Bin 0 -> 158 bytes .../gray/grid/grid3-special-col-bg2.gif | Bin 0 -> 158 bytes .../gray/grid/grid3-special-col-sel-bg.gif | Bin 0 -> 158 bytes .../gxt/images/gray/grid/group-collapse.gif | Bin 0 -> 136 bytes .../images/gray/grid/group-expand-sprite.gif | Bin 0 -> 196 bytes .../gxt/images/gray/grid/group-expand.gif | Bin 0 -> 138 bytes .../gxt/images/gray/grid/page-first.gif | Bin 0 -> 327 bytes .../webapp/gxt/images/gray/grid/page-last.gif | Bin 0 -> 325 bytes .../webapp/gxt/images/gray/grid/page-next.gif | Bin 0 -> 183 bytes .../webapp/gxt/images/gray/grid/page-prev.gif | Bin 0 -> 186 bytes .../webapp/gxt/images/gray/grid/refresh.gif | Bin 0 -> 570 bytes .../images/gray/grid/row-expand-sprite.gif | Bin 0 -> 196 bytes .../webapp/gxt/images/gray/grid/sort_asc.gif | Bin 0 -> 59 bytes .../webapp/gxt/images/gray/grid/sort_desc.gif | Bin 0 -> 59 bytes .../gxt/images/gray/panel/corners-sprite.gif | Bin 0 -> 765 bytes .../gxt/images/gray/panel/left-right.gif | Bin 0 -> 63 bytes .../webapp/gxt/images/gray/panel/light-hd.gif | Bin 0 -> 827 bytes .../gxt/images/gray/panel/tool-sprite-tpl.gif | Bin 0 -> 971 bytes .../gxt/images/gray/panel/tool-sprites.gif | Bin 0 -> 4464 bytes .../images/gray/panel/tools-sprites-trans.gif | Bin 0 -> 2640 bytes .../gxt/images/gray/panel/top-bottom.gif | Bin 0 -> 873 bytes .../gxt/images/gray/panel/top-bottom.png | Bin 0 -> 218 bytes .../gray/panel/white-corners-sprite.gif | Bin 0 -> 1365 bytes .../images/gray/panel/white-left-right.gif | Bin 0 -> 815 bytes .../images/gray/panel/white-top-bottom.gif | Bin 0 -> 868 bytes src/main/webapp/gxt/images/gray/qtip/bg.gif | Bin 0 -> 1024 bytes .../webapp/gxt/images/gray/qtip/close.gif | Bin 0 -> 972 bytes .../gxt/images/gray/qtip/tip-sprite.gif | Bin 0 -> 4033 bytes src/main/webapp/gxt/images/gray/s.gif | Bin 0 -> 43 bytes .../gxt/images/gray/tabs/scroll-left.gif | Bin 0 -> 1260 bytes .../gxt/images/gray/tabs/scroll-right.gif | Bin 0 -> 1269 bytes .../gxt/images/gray/tabs/scroller-bg.gif | Bin 0 -> 1090 bytes .../gray/tabs/tab-btm-inactive-left-bg.gif | Bin 0 -> 881 bytes .../gray/tabs/tab-btm-inactive-right-bg.gif | Bin 0 -> 1383 bytes .../gxt/images/gray/tabs/tab-btm-left-bg.gif | Bin 0 -> 863 bytes .../gxt/images/gray/tabs/tab-btm-right-bg.gif | Bin 0 -> 1402 bytes .../webapp/gxt/images/gray/tabs/tab-close.gif | Bin 0 -> 896 bytes .../gxt/images/gray/tabs/tab-strip-bg.gif | Bin 0 -> 835 bytes .../gxt/images/gray/tabs/tab-strip-bg.png | Bin 0 -> 259 bytes .../gxt/images/gray/tabs/tab-strip-btm-bg.gif | Bin 0 -> 826 bytes .../gxt/images/gray/tabs/tabs-sprite.gif | Bin 0 -> 2109 bytes .../webapp/gxt/images/gray/toolbar/bg.gif | Bin 0 -> 853 bytes .../images/gray/toolbar/btn-arrow-light.gif | Bin 0 -> 916 bytes .../gxt/images/gray/toolbar/btn-arrow.gif | Bin 0 -> 919 bytes .../gxt/images/gray/toolbar/btn-over-bg.gif | Bin 0 -> 837 bytes .../gxt/images/gray/toolbar/gray-bg.gif | Bin 0 -> 815 bytes .../webapp/gxt/images/gray/toolbar/tb-bg.gif | Bin 0 -> 862 bytes .../gxt/images/gray/toolbar/tb-btn-sprite.gif | Bin 0 -> 1021 bytes .../gxt/images/gray/window/icon-error.gif | Bin 0 -> 1669 bytes .../gxt/images/gray/window/icon-info.gif | Bin 0 -> 1586 bytes .../gxt/images/gray/window/icon-question.gif | Bin 0 -> 1607 bytes .../gxt/images/gray/window/icon-warning.gif | Bin 0 -> 1483 bytes .../gxt/images/gray/window/left-corners.png | Bin 0 -> 325 bytes .../images/gray/window/left-corners.pspimage | Bin 0 -> 4385 bytes .../gxt/images/gray/window/left-right.png | Bin 0 -> 2815 bytes .../gxt/images/gray/window/right-corners.png | Bin 0 -> 344 bytes .../gxt/images/gray/window/top-bottom.png | Bin 0 -> 2860 bytes .../webapp/gxt/images/gxt/dd/insert-bg.gif | Bin 0 -> 54 bytes .../gxt/images/gxt/grid/row-editor-bg.gif | Bin 0 -> 819 bytes .../gxt/images/gxt/grid/row-editor-btns.gif | Bin 0 -> 1087 bytes .../webapp/gxt/images/gxt/icons/bottom2.gif | Bin 0 -> 927 bytes .../webapp/gxt/images/gxt/icons/columns.gif | Bin 0 -> 962 bytes src/main/webapp/gxt/images/gxt/icons/done.gif | Bin 0 -> 133 bytes .../gxt/images/gxt/icons/doubleleft2.gif | Bin 0 -> 174 bytes .../gxt/images/gxt/icons/doubleright2.gif | Bin 0 -> 171 bytes .../webapp/gxt/images/gxt/icons/down2.gif | Bin 0 -> 920 bytes .../gxt/images/gxt/icons/folder-closed.gif | Bin 0 -> 999 bytes .../gxt/images/gxt/icons/folder-closed.png | Bin 0 -> 686 bytes .../webapp/gxt/images/gxt/icons/folder.gif | Bin 0 -> 996 bytes .../webapp/gxt/images/gxt/icons/folder.png | Bin 0 -> 711 bytes .../gxt/images/gxt/icons/grid-loading.gif | Bin 0 -> 701 bytes .../webapp/gxt/images/gxt/icons/hmenu-asc.gif | Bin 0 -> 931 bytes .../gxt/images/gxt/icons/hmenu-desc.gif | Bin 0 -> 930 bytes .../webapp/gxt/images/gxt/icons/left2.gif | Bin 0 -> 920 bytes .../webapp/gxt/images/gxt/icons/loading.gif | Bin 0 -> 771 bytes .../webapp/gxt/images/gxt/icons/nowait.gif | Bin 0 -> 884 bytes .../images/gxt/icons/page-first-disabled.gif | Bin 0 -> 925 bytes .../gxt/images/gxt/icons/page-first.gif | Bin 0 -> 925 bytes .../images/gxt/icons/page-last-disabled.gif | Bin 0 -> 923 bytes .../webapp/gxt/images/gxt/icons/page-last.gif | Bin 0 -> 923 bytes .../images/gxt/icons/page-next-disabled.gif | Bin 0 -> 875 bytes .../webapp/gxt/images/gxt/icons/page-next.gif | Bin 0 -> 875 bytes .../images/gxt/icons/page-prev-disabled.gif | Bin 0 -> 879 bytes .../webapp/gxt/images/gxt/icons/page-prev.gif | Bin 0 -> 879 bytes .../webapp/gxt/images/gxt/icons/paging.gif | Bin 0 -> 989 bytes .../webapp/gxt/images/gxt/icons/right2.gif | Bin 0 -> 925 bytes src/main/webapp/gxt/images/gxt/icons/tabs.gif | Bin 0 -> 917 bytes src/main/webapp/gxt/images/gxt/icons/top2.gif | Bin 0 -> 927 bytes src/main/webapp/gxt/images/gxt/icons/up2.gif | Bin 0 -> 920 bytes src/main/webapp/gxt/images/gxt/icons/wait.gif | Bin 0 -> 1100 bytes .../gxt/images/gxt/info/corners-sprite.gif | Bin 0 -> 1154 bytes .../webapp/gxt/images/gxt/info/top-bottom.gif | Bin 0 -> 1329 bytes .../gxt/images/gxt/menu/disabledcheck.gif | Bin 0 -> 907 bytes .../webapp/gxt/images/gxt/shared/clear.gif | Bin 0 -> 43 bytes .../gxt/images/gxt/shared/large-loading.gif | Bin 0 -> 3236 bytes .../gxt/images/gxt/shared/select-18-bg.gif | Bin 0 -> 508 bytes .../images/gxt/shared/select-19-bg-gray.gif | Bin 0 -> 1192 bytes .../gxt/images/gxt/shared/select-19-bg.gif | Bin 0 -> 2018 bytes .../gxt/images/gxt/shared/select-bg.gif | Bin 0 -> 1431 bytes .../gxt/images/gxt/shared/select-light.gif | Bin 0 -> 540 bytes .../webapp/gxt/images/gxt/table/row-over.gif | Bin 0 -> 823 bytes .../gxt/images/gxt/table/vs-column-bg.gif | Bin 0 -> 548 bytes .../webapp/gxt/images/gxt/table/vsort-asc.gif | Bin 0 -> 846 bytes .../gxt/images/gxt/table/vsort-desc.gif | Bin 0 -> 845 bytes .../webapp/gxt/images/gxt/tree/checked.gif | Bin 0 -> 533 bytes .../gxt/images/gxt/tree/joint-close.gif | Bin 0 -> 900 bytes .../webapp/gxt/images/gxt/tree/joint-open.gif | Bin 0 -> 898 bytes .../webapp/gxt/images/gxt/tree/notchecked.gif | Bin 0 -> 321 bytes .../gxt/tree/tree-table-special-col-sel.gif | Bin 0 -> 835 bytes .../gxt/tree/tree-table-special-col.gif | Bin 0 -> 96 bytes src/main/webapp/gxt/images/gxt/tree/vnode.gif | Bin 0 -> 846 bytes .../gxt/images/gxt/tree/vnode_transparent.gif | Bin 0 -> 972 bytes .../gxt/themes/access/css/xtheme-access.css | 2347 ++++++ .../themes/access/images/box/corners-blue.gif | Bin 0 -> 1010 bytes .../gxt/themes/access/images/box/corners.gif | Bin 0 -> 1005 bytes .../gxt/themes/access/images/box/l-blue.gif | Bin 0 -> 810 bytes .../webapp/gxt/themes/access/images/box/l.gif | Bin 0 -> 810 bytes .../gxt/themes/access/images/box/r-blue.gif | Bin 0 -> 810 bytes .../webapp/gxt/themes/access/images/box/r.gif | Bin 0 -> 810 bytes .../gxt/themes/access/images/box/tb-blue.gif | Bin 0 -> 843 bytes .../gxt/themes/access/images/box/tb.gif | Bin 0 -> 839 bytes .../gxt/themes/access/images/button/arrow.gif | Bin 0 -> 833 bytes .../gxt/themes/access/images/button/btn.gif | Bin 0 -> 2871 bytes .../themes/access/images/button/group-cs.gif | Bin 0 -> 2459 bytes .../themes/access/images/button/group-lr.gif | Bin 0 -> 861 bytes .../themes/access/images/button/group-tb.gif | Bin 0 -> 70 bytes .../access/images/button/s-arrow-b-noline.gif | Bin 0 -> 904 bytes .../themes/access/images/button/s-arrow-b.gif | Bin 0 -> 943 bytes .../access/images/button/s-arrow-bo.gif | Bin 0 -> 961 bytes .../access/images/button/s-arrow-noline.gif | Bin 0 -> 875 bytes .../themes/access/images/button/s-arrow-o.gif | Bin 0 -> 155 bytes .../themes/access/images/button/s-arrow.gif | Bin 0 -> 956 bytes .../themes/access/images/editor/tb-source.gif | Bin 0 -> 952 bytes .../themes/access/images/editor/tb-sprite.gif | Bin 0 -> 1994 bytes .../themes/access/images/form/checkbox.gif | Bin 0 -> 2061 bytes .../access/images/form/clear-trigger.gif | Bin 0 -> 2027 bytes .../access/images/form/date-trigger.gif | Bin 0 -> 1620 bytes .../access/images/form/error-tip-corners.gif | Bin 0 -> 4183 bytes .../themes/access/images/form/exclamation.gif | Bin 0 -> 614 bytes .../gxt/themes/access/images/form/radio.gif | Bin 0 -> 1746 bytes .../access/images/form/search-trigger.gif | Bin 0 -> 2134 bytes .../gxt/themes/access/images/form/spinner.gif | Bin 0 -> 4142 bytes .../gxt/themes/access/images/form/text-bg.gif | Bin 0 -> 66 bytes .../access/images/form/trigger-single.gif | Bin 0 -> 605 bytes .../themes/access/images/form/trigger-tpl.gif | Bin 0 -> 908 bytes .../gxt/themes/access/images/form/trigger.gif | Bin 0 -> 1451 bytes .../access/images/grid/arrow-left-white.gif | Bin 0 -> 825 bytes .../access/images/grid/arrow-right-white.gif | Bin 0 -> 825 bytes .../access/images/grid/col-move-bottom.gif | Bin 0 -> 868 bytes .../access/images/grid/col-move-top.gif | Bin 0 -> 869 bytes .../gxt/themes/access/images/grid/columns.gif | Bin 0 -> 962 bytes .../gxt/themes/access/images/grid/dirty.gif | Bin 0 -> 68 bytes .../gxt/themes/access/images/grid/done.gif | Bin 0 -> 133 bytes .../gxt/themes/access/images/grid/drop-no.gif | Bin 0 -> 947 bytes .../themes/access/images/grid/drop-yes.gif | Bin 0 -> 860 bytes .../themes/access/images/grid/footer-bg.gif | Bin 0 -> 834 bytes .../access/images/grid/grid-blue-hd.gif | Bin 0 -> 829 bytes .../access/images/grid/grid-blue-split.gif | Bin 0 -> 47 bytes .../themes/access/images/grid/grid-hrow.gif | Bin 0 -> 855 bytes .../access/images/grid/grid-loading.gif | Bin 0 -> 701 bytes .../themes/access/images/grid/grid-split.gif | Bin 0 -> 817 bytes .../access/images/grid/grid-vista-hd.gif | Bin 0 -> 829 bytes .../images/grid/grid3-hd-btn-contrast.gif | Bin 0 -> 336 bytes .../access/images/grid/grid3-hd-btn.gif | Bin 0 -> 419 bytes .../access/images/grid/grid3-hrow-over.gif | Bin 0 -> 268 bytes .../themes/access/images/grid/grid3-hrow.gif | Bin 0 -> 164 bytes .../images/grid/grid3-special-col-bg.gif | Bin 0 -> 162 bytes .../images/grid/grid3-special-col-sel-bg.gif | Bin 0 -> 162 bytes .../themes/access/images/grid/group-by.gif | Bin 0 -> 917 bytes .../access/images/grid/group-collapse.gif | Bin 0 -> 77 bytes .../images/grid/group-expand-sprite.gif | Bin 0 -> 131 bytes .../access/images/grid/group-expand.gif | Bin 0 -> 82 bytes .../gxt/themes/access/images/grid/hd-pop.gif | Bin 0 -> 839 bytes .../themes/access/images/grid/hmenu-asc.gif | Bin 0 -> 931 bytes .../themes/access/images/grid/hmenu-desc.gif | Bin 0 -> 930 bytes .../themes/access/images/grid/hmenu-lock.gif | Bin 0 -> 955 bytes .../themes/access/images/grid/hmenu-lock.png | Bin 0 -> 648 bytes .../access/images/grid/hmenu-unlock.gif | Bin 0 -> 971 bytes .../access/images/grid/hmenu-unlock.png | Bin 0 -> 697 bytes .../access/images/grid/invalid_line.gif | Bin 0 -> 46 bytes .../gxt/themes/access/images/grid/loading.gif | Bin 0 -> 771 bytes .../gxt/themes/access/images/grid/mso-hd.gif | Bin 0 -> 875 bytes .../gxt/themes/access/images/grid/nowait.gif | Bin 0 -> 884 bytes .../images/grid/page-first-disabled.gif | Bin 0 -> 340 bytes .../themes/access/images/grid/page-first.gif | Bin 0 -> 96 bytes .../access/images/grid/page-last-disabled.gif | Bin 0 -> 340 bytes .../themes/access/images/grid/page-last.gif | Bin 0 -> 96 bytes .../access/images/grid/page-next-disabled.gif | Bin 0 -> 195 bytes .../themes/access/images/grid/page-next.gif | Bin 0 -> 82 bytes .../access/images/grid/page-prev-disabled.gif | Bin 0 -> 197 bytes .../themes/access/images/grid/page-prev.gif | Bin 0 -> 82 bytes .../themes/access/images/grid/pick-button.gif | Bin 0 -> 1036 bytes .../gxt/themes/access/images/grid/refresh.gif | Bin 0 -> 91 bytes .../access/images/grid/row-check-sel.gif | Bin 0 -> 932 bytes .../access/images/grid/row-check-sprite.gif | Bin 0 -> 1083 bytes .../themes/access/images/grid/row-check.gif | Bin 0 -> 918 bytes .../access/images/grid/row-expand-sprite.gif | Bin 0 -> 955 bytes .../themes/access/images/grid/row-over.gif | Bin 0 -> 823 bytes .../gxt/themes/access/images/grid/row-sel.gif | Bin 0 -> 823 bytes .../gxt/themes/access/images/grid/sort-hd.gif | Bin 0 -> 2075 bytes .../themes/access/images/grid/sort_asc.gif | Bin 0 -> 74 bytes .../themes/access/images/grid/sort_desc.gif | Bin 0 -> 73 bytes .../gxt/themes/access/images/grid/wait.gif | Bin 0 -> 1100 bytes .../themes/access/images/icons/bottom2.gif | Bin 0 -> 927 bytes .../access/images/icons/doubleleft2.gif | Bin 0 -> 174 bytes .../access/images/icons/doubleright2.gif | Bin 0 -> 171 bytes .../gxt/themes/access/images/icons/down2.gif | Bin 0 -> 920 bytes .../gxt/themes/access/images/icons/left2.gif | Bin 0 -> 920 bytes .../gxt/themes/access/images/icons/right2.gif | Bin 0 -> 925 bytes .../gxt/themes/access/images/icons/top2.gif | Bin 0 -> 927 bytes .../gxt/themes/access/images/icons/up2.gif | Bin 0 -> 920 bytes .../access/images/layout/mini-bottom.gif | Bin 0 -> 856 bytes .../themes/access/images/layout/mini-top.gif | Bin 0 -> 856 bytes .../gxt/themes/access/images/menu/checked.gif | Bin 0 -> 959 bytes .../access/images/menu/group-checked.gif | Bin 0 -> 856 bytes .../themes/access/images/menu/item-over.gif | Bin 0 -> 820 bytes .../themes/access/images/menu/menu-parent.gif | Bin 0 -> 73 bytes .../gxt/themes/access/images/menu/menu.gif | Bin 0 -> 826 bytes .../themes/access/images/menu/unchecked.gif | Bin 0 -> 941 bytes .../access/images/panel/corners-sprite.gif | Bin 0 -> 577 bytes .../themes/access/images/panel/left-right.gif | Bin 0 -> 52 bytes .../themes/access/images/panel/light-hd.gif | Bin 0 -> 161 bytes .../themes/access/images/panel/tool-close.gif | Bin 0 -> 104 bytes .../access/images/panel/tool-collapse.gif | Bin 0 -> 95 bytes .../access/images/panel/tool-expand.gif | Bin 0 -> 93 bytes .../themes/access/images/panel/tool-gear.gif | Bin 0 -> 106 bytes .../access/images/panel/tool-maximize.gif | Bin 0 -> 111 bytes .../access/images/panel/tool-minimize.gif | Bin 0 -> 93 bytes .../themes/access/images/panel/tool-pin.gif | Bin 0 -> 101 bytes .../access/images/panel/tool-sprite-tpl.gif | Bin 0 -> 971 bytes .../access/images/panel/tool-sprites.gif | Bin 0 -> 1981 bytes .../images/panel/tools-sprites-trans.gif | Bin 0 -> 2843 bytes .../themes/access/images/panel/top-bottom.gif | Bin 0 -> 116 bytes .../images/panel/white-corners-sprite.gif | Bin 0 -> 1366 bytes .../access/images/panel/white-left-right.gif | Bin 0 -> 52 bytes .../access/images/panel/white-top-bottom.gif | Bin 0 -> 115 bytes .../access/images/progress/progress-bg.gif | Bin 0 -> 151 bytes .../gxt/themes/access/images/qtip/close.gif | Bin 0 -> 972 bytes .../access/images/qtip/tip-anchor-sprite.gif | Bin 0 -> 951 bytes .../themes/access/images/qtip/tip-sprite.gif | Bin 0 -> 3376 bytes .../themes/access/images/shared/glass-bg.gif | Bin 0 -> 103 bytes .../themes/access/images/shared/hd-sprite.gif | Bin 0 -> 673 bytes .../themes/access/images/shared/left-btn.gif | Bin 0 -> 77 bytes .../themes/access/images/shared/right-btn.gif | Bin 0 -> 79 bytes .../access/images/sizer/e-handle-dark.gif | Bin 0 -> 248 bytes .../themes/access/images/sizer/e-handle.gif | Bin 0 -> 753 bytes .../access/images/sizer/ne-handle-dark.gif | Bin 0 -> 66 bytes .../themes/access/images/sizer/ne-handle.gif | Bin 0 -> 115 bytes .../access/images/sizer/nw-handle-dark.gif | Bin 0 -> 66 bytes .../themes/access/images/sizer/nw-handle.gif | Bin 0 -> 114 bytes .../access/images/sizer/s-handle-dark.gif | Bin 0 -> 246 bytes .../themes/access/images/sizer/s-handle.gif | Bin 0 -> 494 bytes .../access/images/sizer/se-handle-dark.gif | Bin 0 -> 65 bytes .../themes/access/images/sizer/se-handle.gif | Bin 0 -> 114 bytes .../gxt/themes/access/images/sizer/square.gif | Bin 0 -> 123 bytes .../access/images/sizer/sw-handle-dark.gif | Bin 0 -> 66 bytes .../themes/access/images/sizer/sw-handle.gif | Bin 0 -> 116 bytes .../themes/access/images/slider/slider-bg.png | Bin 0 -> 3636 bytes .../images/slider/slider-thumb-single.png | Bin 0 -> 3067 bytes .../access/images/slider/slider-thumb.png | Bin 0 -> 3436 bytes .../access/images/slider/slider-v-bg.png | Bin 0 -> 3630 bytes .../access/images/slider/slider-v-thumb.png | Bin 0 -> 3432 bytes .../themes/access/images/tabs/scroll-left.gif | Bin 0 -> 996 bytes .../access/images/tabs/scroll-right.gif | Bin 0 -> 999 bytes .../images/tabs/tab-btm-inactive-left-bg.gif | Bin 0 -> 130 bytes .../images/tabs/tab-btm-inactive-right-bg.gif | Bin 0 -> 513 bytes .../access/images/tabs/tab-btm-left-bg.gif | Bin 0 -> 117 bytes .../access/images/tabs/tab-btm-right-bg.gif | Bin 0 -> 512 bytes .../themes/access/images/tabs/tab-close.gif | Bin 0 -> 76 bytes .../access/images/tabs/tab-strip-bg.gif | Bin 0 -> 827 bytes .../access/images/tabs/tab-strip-btm-bg.gif | Bin 0 -> 70 bytes .../themes/access/images/tabs/tabs-sprite.gif | Bin 0 -> 1221 bytes .../gxt/themes/access/images/toolbar/bg.gif | Bin 0 -> 82 bytes .../access/images/toolbar/btn-arrow-light.gif | Bin 0 -> 916 bytes .../access/images/toolbar/btn-arrow.gif | Bin 0 -> 919 bytes .../access/images/toolbar/btn-over-bg.gif | Bin 0 -> 837 bytes .../themes/access/images/toolbar/gray-bg.gif | Bin 0 -> 832 bytes .../gxt/themes/access/images/toolbar/more.gif | Bin 0 -> 67 bytes .../access/images/toolbar/s-arrow-bo.gif | Bin 0 -> 186 bytes .../access/images/toolbar/tb-btn-sprite.gif | Bin 0 -> 1127 bytes .../images/toolbar/tb-xl-btn-sprite.gif | Bin 0 -> 1663 bytes .../access/images/toolbar/tb-xl-sep.gif | Bin 0 -> 810 bytes .../gxt/themes/access/images/tree/arrows.gif | Bin 0 -> 183 bytes .../themes/access/images/tree/drop-add.gif | Bin 0 -> 1001 bytes .../access/images/tree/drop-between.gif | Bin 0 -> 907 bytes .../gxt/themes/access/images/tree/drop-no.gif | Bin 0 -> 949 bytes .../themes/access/images/tree/drop-over.gif | Bin 0 -> 911 bytes .../themes/access/images/tree/drop-under.gif | Bin 0 -> 911 bytes .../themes/access/images/tree/drop-yes.gif | Bin 0 -> 1016 bytes .../access/images/tree/elbow-end-minus-nl.gif | Bin 0 -> 86 bytes .../access/images/tree/elbow-end-minus.gif | Bin 0 -> 104 bytes .../access/images/tree/elbow-end-plus-nl.gif | Bin 0 -> 89 bytes .../access/images/tree/elbow-end-plus.gif | Bin 0 -> 108 bytes .../themes/access/images/tree/elbow-end.gif | Bin 0 -> 844 bytes .../themes/access/images/tree/elbow-line.gif | Bin 0 -> 846 bytes .../access/images/tree/elbow-minus-nl.gif | Bin 0 -> 86 bytes .../themes/access/images/tree/elbow-minus.gif | Bin 0 -> 106 bytes .../access/images/tree/elbow-plus-nl.gif | Bin 0 -> 89 bytes .../themes/access/images/tree/elbow-plus.gif | Bin 0 -> 111 bytes .../gxt/themes/access/images/tree/elbow.gif | Bin 0 -> 850 bytes .../themes/access/images/tree/folder-open.gif | Bin 0 -> 342 bytes .../gxt/themes/access/images/tree/folder.gif | Bin 0 -> 340 bytes .../gxt/themes/access/images/tree/leaf.gif | Bin 0 -> 945 bytes .../gxt/themes/access/images/tree/loading.gif | Bin 0 -> 771 bytes .../gxt/themes/access/images/tree/s.gif | Bin 0 -> 43 bytes .../access/images/tree/tree-collapsed.png | Bin 0 -> 2928 bytes .../access/images/tree/tree-expanded.png | Bin 0 -> 2904 bytes .../access/images/window/icon-error.gif | Bin 0 -> 256 bytes .../themes/access/images/window/icon-info.gif | Bin 0 -> 172 bytes .../access/images/window/icon-question.gif | Bin 0 -> 217 bytes .../access/images/window/icon-warning.gif | Bin 0 -> 173 bytes .../access/images/window/left-corners.png | Bin 0 -> 3612 bytes .../access/images/window/left-right.png | Bin 0 -> 3578 bytes .../access/images/window/right-corners.png | Bin 0 -> 3612 bytes .../access/images/window/top-bottom.png | Bin 0 -> 3600 bytes .../gxt/themes/slate/css/xtheme-slate.css | 1058 +++ .../slate/images/slate/button/arrow.gif | Bin 0 -> 59 bytes .../slate/images/slate/button/btn-arrow.gif | Bin 0 -> 871 bytes .../slate/images/slate/button/btn-sprite.gif | Bin 0 -> 1394 bytes .../themes/slate/images/slate/button/btn.gif | Bin 0 -> 4687 bytes .../slate/images/slate/button/group-cs.gif | Bin 0 -> 1598 bytes .../slate/images/slate/button/group-lr.gif | Bin 0 -> 94 bytes .../slate/images/slate/button/group-tb.gif | Bin 0 -> 88 bytes .../images/slate/button/s-arrow-b-noline.gif | Bin 0 -> 82 bytes .../slate/images/slate/button/s-arrow-b.gif | Bin 0 -> 151 bytes .../slate/images/slate/button/s-arrow-bo.gif | Bin 0 -> 151 bytes .../images/slate/button/s-arrow-noline.gif | Bin 0 -> 82 bytes .../slate/images/slate/button/s-arrow-o.gif | Bin 0 -> 152 bytes .../slate/images/slate/button/s-arrow.gif | Bin 0 -> 152 bytes .../slate/images/slate/editor/tb-sprite.gif | Bin 0 -> 1994 bytes .../slate/images/slate/form/checkbox.gif | Bin 0 -> 1483 bytes .../slate/images/slate/form/clear-trigger.gif | Bin 0 -> 2091 bytes .../slate/images/slate/form/date-trigger.gif | Bin 0 -> 1612 bytes .../images/slate/form/error-tip-corners.gif | Bin 0 -> 4183 bytes .../themes/slate/images/slate/form/radio.gif | Bin 0 -> 1846 bytes .../images/slate/form/search-trigger.gif | Bin 0 -> 2345 bytes .../slate/images/slate/form/spinner.gif | Bin 0 -> 1857 bytes .../slate/images/slate/form/trigger-tpl.gif | Bin 0 -> 1506 bytes .../slate/images/slate/form/trigger.gif | Bin 0 -> 1657 bytes .../themes/slate/images/slate/gradient-bg.gif | Bin 0 -> 1472 bytes .../images/slate/grid/arrow-left-white.gif | Bin 0 -> 825 bytes .../images/slate/grid/arrow-right-white.gif | Bin 0 -> 825 bytes .../images/slate/grid/col-move-bottom.gif | Bin 0 -> 868 bytes .../slate/images/slate/grid/col-move-top.gif | Bin 0 -> 869 bytes .../slate/images/slate/grid/footer-bg.gif | Bin 0 -> 834 bytes .../slate/images/slate/grid/grid-blue-hd.gif | Bin 0 -> 829 bytes .../images/slate/grid/grid-blue-split.gif | Bin 0 -> 817 bytes .../slate/images/slate/grid/grid-hrow.gif | Bin 0 -> 855 bytes .../slate/images/slate/grid/grid-split.gif | Bin 0 -> 817 bytes .../slate/images/slate/grid/grid-vista-hd.gif | Bin 0 -> 829 bytes .../slate/images/slate/grid/grid3-hd-btn.gif | Bin 0 -> 1212 bytes .../images/slate/grid/grid3-hrow-over.gif | Bin 0 -> 826 bytes .../slate/images/slate/grid/grid3-hrow.gif | Bin 0 -> 828 bytes .../slate/grid/grid3-special-col-bg.gif | Bin 0 -> 837 bytes .../slate/grid/grid3-special-col-sel-bg.gif | Bin 0 -> 847 bytes .../images/slate/grid/group-expand-sprite.gif | Bin 0 -> 955 bytes .../themes/slate/images/slate/grid/mso-hd.gif | Bin 0 -> 875 bytes .../images/slate/grid/page-first-disabled.gif | Bin 0 -> 925 bytes .../slate/images/slate/grid/page-first.gif | Bin 0 -> 925 bytes .../images/slate/grid/page-last-disabled.gif | Bin 0 -> 923 bytes .../slate/images/slate/grid/page-last.gif | Bin 0 -> 923 bytes .../images/slate/grid/page-next-disabled.gif | Bin 0 -> 875 bytes .../slate/images/slate/grid/page-next.gif | Bin 0 -> 875 bytes .../images/slate/grid/page-prev-disabled.gif | Bin 0 -> 879 bytes .../slate/images/slate/grid/page-prev.gif | Bin 0 -> 879 bytes .../slate/images/slate/grid/refresh.gif | Bin 0 -> 980 bytes .../slate/images/slate/grid/row-over.gif | Bin 0 -> 823 bytes .../slate/images/slate/grid/row-sel.gif | Bin 0 -> 823 bytes .../slate/images/slate/grid/sort_asc.gif | Bin 0 -> 830 bytes .../slate/images/slate/grid/sort_desc.gif | Bin 0 -> 833 bytes .../slate/images/slate/menu/checked.gif | Bin 0 -> 894 bytes .../slate/images/slate/menu/group-checked.gif | Bin 0 -> 887 bytes .../images/slate/menu/item-over - Copy.gif | Bin 0 -> 833 bytes .../slate/images/slate/menu/item-over.gif | Bin 0 -> 833 bytes .../slate/images/slate/menu/menu-parent.gif | Bin 0 -> 853 bytes .../themes/slate/images/slate/menu/menu.gif | Bin 0 -> 839 bytes .../slate/images/slate/menu/unchecked.gif | Bin 0 -> 877 bytes .../images/slate/panel/corners-sprite.gif | Bin 0 -> 1384 bytes .../slate/images/slate/panel/left-right.gif | Bin 0 -> 807 bytes .../slate/images/slate/panel/light-hd.gif | Bin 0 -> 844 bytes .../images/slate/panel/tool-sprite-tpl.gif | Bin 0 -> 1197 bytes .../slate/images/slate/panel/tool-sprites.gif | Bin 0 -> 5787 bytes .../slate/panel/tools-sprites-trans.gif | Bin 0 -> 2640 bytes .../slate/images/slate/panel/top-bottom.gif | Bin 0 -> 870 bytes .../slate/images/slate/panel/top-bottom.png | Bin 0 -> 215 bytes .../slate/panel/white-corners-sprite.gif | Bin 0 -> 1365 bytes .../images/slate/panel/white-left-right.gif | Bin 0 -> 805 bytes .../images/slate/panel/white-top-bottom.gif | Bin 0 -> 864 bytes .../images/slate/progress/progress-bg.gif | Bin 0 -> 837 bytes .../gxt/themes/slate/images/slate/qtip/bg.gif | Bin 0 -> 1091 bytes .../themes/slate/images/slate/qtip/close.gif | Bin 0 -> 972 bytes .../slate/images/slate/qtip/tip-sprite.gif | Bin 0 -> 4129 bytes .../gxt/themes/slate/images/slate/s.gif | Bin 0 -> 43 bytes .../slate/images/slate/shared/glass-bg.gif | Bin 0 -> 865 bytes .../slate/images/slate/shared/hd-sprite.gif | Bin 0 -> 1099 bytes .../slate/images/slate/shared/left-btn.gif | Bin 0 -> 878 bytes .../slate/images/slate/shared/right-btn.gif | Bin 0 -> 879 bytes .../images/slate/sizer/e-handle-dark.gif | Bin 0 -> 1069 bytes .../slate/images/slate/sizer/e-handle.gif | Bin 0 -> 1599 bytes .../images/slate/sizer/ne-handle-dark.gif | Bin 0 -> 843 bytes .../slate/images/slate/sizer/ne-handle.gif | Bin 0 -> 839 bytes .../images/slate/sizer/nw-handle-dark.gif | Bin 0 -> 841 bytes .../slate/images/slate/sizer/nw-handle.gif | Bin 0 -> 839 bytes .../images/slate/sizer/s-handle-dark.gif | Bin 0 -> 1051 bytes .../slate/images/slate/sizer/s-handle.gif | Bin 0 -> 1311 bytes .../images/slate/sizer/se-handle-dark.gif | Bin 0 -> 844 bytes .../slate/images/slate/sizer/se-handle.gif | Bin 0 -> 838 bytes .../slate/images/slate/sizer/square.gif | Bin 0 -> 841 bytes .../images/slate/sizer/sw-handle-dark.gif | Bin 0 -> 844 bytes .../slate/images/slate/sizer/sw-handle.gif | Bin 0 -> 839 bytes .../slate/images/slate/slider/slider-bg.png | Bin 0 -> 1033 bytes .../images/slate/slider/slider-thumb.png | Bin 0 -> 1569 bytes .../slate/images/slate/slider/slider-v-bg.png | Bin 0 -> 1016 bytes .../images/slate/slider/slider-v-thumb.png | Bin 0 -> 1476 bytes .../slate/images/slate/tabs/scroll-left.gif | Bin 0 -> 1260 bytes .../slate/images/slate/tabs/scroll-right.gif | Bin 0 -> 1269 bytes .../slate/images/slate/tabs/scroller-bg.gif | Bin 0 -> 1090 bytes .../slate/tabs/tab-btm-inactive-left-bg.gif | Bin 0 -> 883 bytes .../slate/tabs/tab-btm-inactive-right-bg.gif | Bin 0 -> 1553 bytes .../images/slate/tabs/tab-btm-left-bg.gif | Bin 0 -> 888 bytes .../images/slate/tabs/tab-btm-right-bg.gif | Bin 0 -> 1586 bytes .../slate/images/slate/tabs/tab-close.gif | Bin 0 -> 853 bytes .../slate/images/slate/tabs/tab-strip-bg.gif | Bin 0 -> 906 bytes .../slate/images/slate/tabs/tab-strip-bg.png | Bin 0 -> 259 bytes .../images/slate/tabs/tab-strip-btm-bg.gif | Bin 0 -> 826 bytes .../slate/images/slate/tabs/tabs-sprite.gif | Bin 0 -> 2625 bytes .../themes/slate/images/slate/toolbar/bg.gif | Bin 0 -> 540 bytes .../images/slate/toolbar/btn-arrow-light.gif | Bin 0 -> 916 bytes .../slate/images/slate/toolbar/btn-arrow.gif | Bin 0 -> 908 bytes .../images/slate/toolbar/btn-over-bg.gif | Bin 0 -> 829 bytes .../slate/images/slate/toolbar/gray-bg.gif | Bin 0 -> 832 bytes .../themes/slate/images/slate/toolbar/sep.gif | Bin 0 -> 66 bytes .../slate/images/slate/toolbar/tb-bg.gif | Bin 0 -> 862 bytes .../images/slate/toolbar/tb-btn-sprite.gif | Bin 0 -> 1070 bytes .../themes/slate/images/slate/tree/arrows.gif | Bin 0 -> 1024 bytes .../slate/images/slate/window/icon-error.gif | Bin 0 -> 1669 bytes .../slate/images/slate/window/icon-info.gif | Bin 0 -> 1586 bytes .../images/slate/window/icon-question.gif | Bin 0 -> 1607 bytes .../images/slate/window/icon-warning.gif | Bin 0 -> 1483 bytes .../images/slate/window/left-corners.png | Bin 0 -> 432 bytes .../slate/images/slate/window/left-right.png | Bin 0 -> 160 bytes .../images/slate/window/right-corners.png | Bin 0 -> 459 bytes .../slate/images/slate/window/top-bottom.png | Bin 0 -> 294 bytes .../images/categories/DEFAULT_IMAGE.png | Bin 0 -> 6181 bytes .../images/categories/DISTRIBUTIONS.png | Bin 0 -> 4167 bytes src/main/webapp/images/fileIcon.png | Bin 0 -> 6314 bytes .../webapp/images/operators/AQUAMAPSNN.png | Bin 0 -> 5497 bytes .../webapp/images/operators/AQUAMAPSNNNS.png | Bin 0 -> 5497 bytes .../images/operators/AQUAMAPS_NATIVE.png | Bin 0 -> 6870 bytes .../images/operators/AQUAMAPS_NATIVE_2050.png | Bin 0 -> 6870 bytes .../AQUAMAPS_NATIVE_NEURALNETWORK.png | Bin 0 -> 5497 bytes .../operators/AQUAMAPS_NEURAL_NETWORK_NS.png | Bin 0 -> 5497 bytes .../images/operators/AQUAMAPS_SUITABLE.png | Bin 0 -> 6870 bytes .../operators/AQUAMAPS_SUITABLE_2050.png | Bin 0 -> 6870 bytes .../AQUAMAPS_SUITABLE_NEURALNETWORK.png | Bin 0 -> 5497 bytes .../webapp/images/operators/DEFAULT_IMAGE.png | Bin 0 -> 5024 bytes .../images/operators/DEFAULT_IMAGEold.png | Bin 0 -> 2334 bytes src/main/webapp/images/operators/HSPEN.png | Bin 0 -> 6870 bytes .../operators/REMOTE_AQUAMAPS_NATIVE.png | Bin 0 -> 6870 bytes .../operators/REMOTE_AQUAMAPS_NATIVE_2050.png | Bin 0 -> 6870 bytes .../operators/REMOTE_AQUAMAPS_SUITABLE.png | Bin 0 -> 6870 bytes .../REMOTE_AQUAMAPS_SUITABLE_2050.png | Bin 0 -> 6870 bytes .../images/provenances/provenanceCOMPUTED.png | Bin 0 -> 3867 bytes .../provenances/provenanceCOMPUTED2.png | Bin 0 -> 3746 bytes .../images/provenances/provenanceIMPORTED.png | Bin 0 -> 3900 bytes .../provenances/provenanceIMPORTED2.png | Bin 0 -> 3746 bytes .../images/provenances/provenanceSYSTEM.png | Bin 0 -> 3474 bytes .../images/provenances/provenanceSYSTEM2.png | Bin 0 -> 3392 bytes .../webapp/images/templateIcons/CLUSTER.png | Bin 0 -> 8799 bytes src/main/webapp/images/templateIcons/FILE.png | Bin 0 -> 6314 bytes .../webapp/images/templateIcons/GENERIC.png | Bin 0 -> 7525 bytes src/main/webapp/images/templateIcons/HCAF.png | Bin 0 -> 8566 bytes .../webapp/images/templateIcons/HSPEC.png | Bin 0 -> 7915 bytes .../webapp/images/templateIcons/HSPEN.png | Bin 0 -> 8504 bytes .../webapp/images/templateIcons/MINMAXLAT.png | Bin 0 -> 9225 bytes .../templateIcons/OCCURRENCE_AQUAMAPS.png | Bin 0 -> 8767 bytes .../templateIcons/OCCURRENCE_SPECIES.png | Bin 0 -> 8767 bytes .../webapp/images/templateIcons/TESTSET.png | Bin 0 -> 9080 bytes .../images/templateIcons/TIMESERIES.png | Bin 0 -> 7131 bytes .../images/templateIcons/TIME_SERIES.png | Bin 0 -> 7131 bytes .../images/templateIcons/TRAININGSET.png | Bin 0 -> 9437 bytes src/main/webapp/images/test | 12 + src/main/webapp/images/triangle-down.png | Bin 0 -> 198 bytes src/main/webapp/images/triangle-right.png | Bin 0 -> 171 bytes .../webapp/templateDescriptions/CLUSTER.html | 43 + .../webapp/templateDescriptions/GENERIC.html | 35 + .../webapp/templateDescriptions/HCAF.html | 142 + .../webapp/templateDescriptions/HSPEC.html | 49 + .../webapp/templateDescriptions/HSPEN.html | 258 + .../templateDescriptions/MINMAXLAT.html | 34 + .../OCCURRENCE_AQUAMAPS.html | 59 + .../OCCURRENCE_SPECIES.html | 110 + .../webapp/templateDescriptions/TESTSET.html | 39 + .../templateDescriptions/TIMESERIES.html | 43 + .../templateDescriptions/TRAININGSET.html | 44 + .../webapp/templateDescriptions/base.html | 132 + .../ElementsHighlightsTest.java | 59 + .../TestDataMinerService.java | 161 + .../TestDataMinerServiceDBSCAN.xml | 52 + .../TestDataMinerServiceDBSCANReference.xml | 43 + .../TestDataMinerServiceXMEANS.xml | 71 + 957 files changed, 24665 insertions(+) create mode 100644 .classpath create mode 100644 .project create mode 100644 .settings/org.eclipse.core.resources.prefs create mode 100644 .settings/org.eclipse.jdt.core.prefs create mode 100644 .settings/org.eclipse.m2e.core.prefs create mode 100644 .settings/org.eclipse.wst.common.component create mode 100644 .settings/org.eclipse.wst.common.project.facet.core.prefs.xml create mode 100644 .settings/org.eclipse.wst.common.project.facet.core.xml create mode 100644 .settings/org.eclipse.wst.validation.prefs create mode 100644 distro/LICENSE create mode 100644 distro/README create mode 100644 distro/changelog.xml create mode 100644 distro/descriptor.xml create mode 100644 distro/profile.xml create mode 100644 pom.xml create mode 100644 src/main/java/org/gcube/portlets/user/dataminerexecutor/client/DataMinerExecutor.java create mode 100644 src/main/java/org/gcube/portlets/user/dataminerexecutor/client/DataMinerExecutorController.java create mode 100644 src/main/java/org/gcube/portlets/user/dataminerexecutor/client/Header.java create mode 100644 src/main/java/org/gcube/portlets/user/dataminerexecutor/client/HomePanel.java create mode 100644 src/main/java/org/gcube/portlets/user/dataminerexecutor/client/PortalViewport.java create mode 100644 src/main/java/org/gcube/portlets/user/dataminerexecutor/client/common/EventBusProvider.java create mode 100644 src/main/java/org/gcube/portlets/user/dataminerexecutor/client/custom/Gxt2ZIndexXDOM.java create mode 100644 src/main/java/org/gcube/portlets/user/dataminerexecutor/client/custom/progress/GreenProgressBar.css create mode 100644 src/main/java/org/gcube/portlets/user/dataminerexecutor/client/custom/progress/GreenProgressBar.html create mode 100644 src/main/java/org/gcube/portlets/user/dataminerexecutor/client/custom/progress/GreenProgressBar.java create mode 100644 src/main/java/org/gcube/portlets/user/dataminerexecutor/client/custom/progress/GreenProgressBarAppearance.java create mode 100644 src/main/java/org/gcube/portlets/user/dataminerexecutor/client/custom/progress/OrangeProgressBar.css create mode 100644 src/main/java/org/gcube/portlets/user/dataminerexecutor/client/custom/progress/OrangeProgressBar.html create mode 100644 src/main/java/org/gcube/portlets/user/dataminerexecutor/client/custom/progress/OrangeProgressBar.java create mode 100644 src/main/java/org/gcube/portlets/user/dataminerexecutor/client/custom/progress/OrangeProgressBarAppearance.java create mode 100644 src/main/java/org/gcube/portlets/user/dataminerexecutor/client/custom/progress/RedProgressBar.css create mode 100644 src/main/java/org/gcube/portlets/user/dataminerexecutor/client/custom/progress/RedProgressBar.html create mode 100644 src/main/java/org/gcube/portlets/user/dataminerexecutor/client/custom/progress/RedProgressBar.java create mode 100644 src/main/java/org/gcube/portlets/user/dataminerexecutor/client/custom/progress/RedProgressBarAppearance.java create mode 100644 src/main/java/org/gcube/portlets/user/dataminerexecutor/client/custom/progress/green-bg.gif create mode 100644 src/main/java/org/gcube/portlets/user/dataminerexecutor/client/custom/progress/green-progress-bg.gif create mode 100644 src/main/java/org/gcube/portlets/user/dataminerexecutor/client/custom/progress/orange-bg.gif create mode 100644 src/main/java/org/gcube/portlets/user/dataminerexecutor/client/custom/progress/orange-progress-bg.gif create mode 100644 src/main/java/org/gcube/portlets/user/dataminerexecutor/client/custom/progress/red-bg.gif create mode 100644 src/main/java/org/gcube/portlets/user/dataminerexecutor/client/custom/progress/red-progress-bg.gif create mode 100644 src/main/java/org/gcube/portlets/user/dataminerexecutor/client/events/CancelComputationExecutionRequestEvent.java create mode 100644 src/main/java/org/gcube/portlets/user/dataminerexecutor/client/events/CancelExecutionFromComputationsRequestEvent.java create mode 100644 src/main/java/org/gcube/portlets/user/dataminerexecutor/client/events/ComputationDataEvent.java create mode 100644 src/main/java/org/gcube/portlets/user/dataminerexecutor/client/events/ComputationDataRequestEvent.java create mode 100644 src/main/java/org/gcube/portlets/user/dataminerexecutor/client/events/ComputationReadyEvent.java create mode 100644 src/main/java/org/gcube/portlets/user/dataminerexecutor/client/events/DeleteItemRequestEvent.java create mode 100644 src/main/java/org/gcube/portlets/user/dataminerexecutor/client/events/InvocationModelEvent.java create mode 100644 src/main/java/org/gcube/portlets/user/dataminerexecutor/client/events/InvocationModelRequestEvent.java create mode 100644 src/main/java/org/gcube/portlets/user/dataminerexecutor/client/events/MenuEvent.java create mode 100644 src/main/java/org/gcube/portlets/user/dataminerexecutor/client/events/MenuSwitchEvent.java create mode 100644 src/main/java/org/gcube/portlets/user/dataminerexecutor/client/events/OutputDataEvent.java create mode 100644 src/main/java/org/gcube/portlets/user/dataminerexecutor/client/events/OutputDataRequestEvent.java create mode 100644 src/main/java/org/gcube/portlets/user/dataminerexecutor/client/events/RemoveSelectedOperatorEvent.java create mode 100644 src/main/java/org/gcube/portlets/user/dataminerexecutor/client/events/ResubmitComputationExecutionEvent.java create mode 100644 src/main/java/org/gcube/portlets/user/dataminerexecutor/client/events/ResubmitComputationExecutionRequestEvent.java create mode 100644 src/main/java/org/gcube/portlets/user/dataminerexecutor/client/events/SessionExpiredEvent.java create mode 100644 src/main/java/org/gcube/portlets/user/dataminerexecutor/client/events/StartComputationExecutionEvent.java create mode 100644 src/main/java/org/gcube/portlets/user/dataminerexecutor/client/events/StartComputationExecutionRequestEvent.java create mode 100644 src/main/java/org/gcube/portlets/user/dataminerexecutor/client/events/SyncRefreshUploadDataSpaceEvent.java create mode 100644 src/main/java/org/gcube/portlets/user/dataminerexecutor/client/events/TabularFldChangeEvent.java create mode 100644 src/main/java/org/gcube/portlets/user/dataminerexecutor/client/events/UIStateEvent.java create mode 100644 src/main/java/org/gcube/portlets/user/dataminerexecutor/client/events/WPSMenuEvent.java create mode 100644 src/main/java/org/gcube/portlets/user/dataminerexecutor/client/experiments/ComputationExecutionPanel.java create mode 100644 src/main/java/org/gcube/portlets/user/dataminerexecutor/client/experiments/ComputationOutputPanel.java create mode 100644 src/main/java/org/gcube/portlets/user/dataminerexecutor/client/experiments/ComputationPanel.java create mode 100644 src/main/java/org/gcube/portlets/user/dataminerexecutor/client/experiments/ComputationParametersPanel.java create mode 100644 src/main/java/org/gcube/portlets/user/dataminerexecutor/client/experiments/ComputationStatusPanel.java create mode 100644 src/main/java/org/gcube/portlets/user/dataminerexecutor/client/experiments/EquivalentRequestDialog.java create mode 100644 src/main/java/org/gcube/portlets/user/dataminerexecutor/client/experiments/ExperimentPanel.java create mode 100644 src/main/java/org/gcube/portlets/user/dataminerexecutor/client/experiments/WorkflowPanel.java create mode 100644 src/main/java/org/gcube/portlets/user/dataminerexecutor/client/monitor/StatusMonitor.java create mode 100644 src/main/java/org/gcube/portlets/user/dataminerexecutor/client/parametersfield/AbstractFld.java create mode 100644 src/main/java/org/gcube/portlets/user/dataminerexecutor/client/parametersfield/ColumnFld.java create mode 100644 src/main/java/org/gcube/portlets/user/dataminerexecutor/client/parametersfield/ColumnListFld.java create mode 100644 src/main/java/org/gcube/portlets/user/dataminerexecutor/client/parametersfield/EnumFld.java create mode 100644 src/main/java/org/gcube/portlets/user/dataminerexecutor/client/parametersfield/FileFld.java create mode 100644 src/main/java/org/gcube/portlets/user/dataminerexecutor/client/parametersfield/ListIntFld.java create mode 100644 src/main/java/org/gcube/portlets/user/dataminerexecutor/client/parametersfield/ListStringFld.java create mode 100644 src/main/java/org/gcube/portlets/user/dataminerexecutor/client/parametersfield/OperatorFieldWidget.java create mode 100644 src/main/java/org/gcube/portlets/user/dataminerexecutor/client/parametersfield/StringFld.java create mode 100644 src/main/java/org/gcube/portlets/user/dataminerexecutor/client/parametersfield/StringItem.java create mode 100644 src/main/java/org/gcube/portlets/user/dataminerexecutor/client/parametersfield/TabItem.java create mode 100644 src/main/java/org/gcube/portlets/user/dataminerexecutor/client/parametersfield/TabularFld.java create mode 100644 src/main/java/org/gcube/portlets/user/dataminerexecutor/client/parametersfield/TabularListFld.java create mode 100644 src/main/java/org/gcube/portlets/user/dataminerexecutor/client/properties/ColumnItemProperties.java create mode 100644 src/main/java/org/gcube/portlets/user/dataminerexecutor/client/properties/ColumnItemPropertiesCombo.java create mode 100644 src/main/java/org/gcube/portlets/user/dataminerexecutor/client/resources/Resources.java create mode 100644 src/main/java/org/gcube/portlets/user/dataminerexecutor/client/resources/WikiLink.txt create mode 100644 src/main/java/org/gcube/portlets/user/dataminerexecutor/client/resources/add.png create mode 100644 src/main/java/org/gcube/portlets/user/dataminerexecutor/client/resources/ajax-complete.gif create mode 100644 src/main/java/org/gcube/portlets/user/dataminerexecutor/client/resources/ajax-error.gif create mode 100644 src/main/java/org/gcube/portlets/user/dataminerexecutor/client/resources/ajax-loader-big.gif create mode 100644 src/main/java/org/gcube/portlets/user/dataminerexecutor/client/resources/ajax-loader.gif create mode 100644 src/main/java/org/gcube/portlets/user/dataminerexecutor/client/resources/alert.gif create mode 100644 src/main/java/org/gcube/portlets/user/dataminerexecutor/client/resources/arrow_right.png create mode 100644 src/main/java/org/gcube/portlets/user/dataminerexecutor/client/resources/cancel.png create mode 100644 src/main/java/org/gcube/portlets/user/dataminerexecutor/client/resources/cancel_circle.png create mode 100644 src/main/java/org/gcube/portlets/user/dataminerexecutor/client/resources/cancel_icon.png create mode 100644 src/main/java/org/gcube/portlets/user/dataminerexecutor/client/resources/computation.png create mode 100644 src/main/java/org/gcube/portlets/user/dataminerexecutor/client/resources/computations.png create mode 100644 src/main/java/org/gcube/portlets/user/dataminerexecutor/client/resources/connector1.png create mode 100644 src/main/java/org/gcube/portlets/user/dataminerexecutor/client/resources/delete.png create mode 100644 src/main/java/org/gcube/portlets/user/dataminerexecutor/client/resources/delete_circle.png create mode 100644 src/main/java/org/gcube/portlets/user/dataminerexecutor/client/resources/detach.png create mode 100644 src/main/java/org/gcube/portlets/user/dataminerexecutor/client/resources/details.png create mode 100644 src/main/java/org/gcube/portlets/user/dataminerexecutor/client/resources/download.png create mode 100644 src/main/java/org/gcube/portlets/user/dataminerexecutor/client/resources/draw-geometry.png create mode 100644 src/main/java/org/gcube/portlets/user/dataminerexecutor/client/resources/folder_explore.png create mode 100644 src/main/java/org/gcube/portlets/user/dataminerexecutor/client/resources/goBack.png create mode 100644 src/main/java/org/gcube/portlets/user/dataminerexecutor/client/resources/inputSpace.png create mode 100644 src/main/java/org/gcube/portlets/user/dataminerexecutor/client/resources/logoLittle.png create mode 100644 src/main/java/org/gcube/portlets/user/dataminerexecutor/client/resources/menuItemComputations.png create mode 100644 src/main/java/org/gcube/portlets/user/dataminerexecutor/client/resources/menuItemDataspace.png create mode 100644 src/main/java/org/gcube/portlets/user/dataminerexecutor/client/resources/menuItemExperiment.png create mode 100644 src/main/java/org/gcube/portlets/user/dataminerexecutor/client/resources/menuItemHelp.png create mode 100644 src/main/java/org/gcube/portlets/user/dataminerexecutor/client/resources/menuItemInputspace.png create mode 100644 src/main/java/org/gcube/portlets/user/dataminerexecutor/client/resources/monitor.png create mode 100644 src/main/java/org/gcube/portlets/user/dataminerexecutor/client/resources/refresh.png create mode 100644 src/main/java/org/gcube/portlets/user/dataminerexecutor/client/resources/resubmit.png create mode 100644 src/main/java/org/gcube/portlets/user/dataminerexecutor/client/resources/save.png create mode 100644 src/main/java/org/gcube/portlets/user/dataminerexecutor/client/resources/show.png create mode 100644 src/main/java/org/gcube/portlets/user/dataminerexecutor/client/resources/sort_asc.gif create mode 100644 src/main/java/org/gcube/portlets/user/dataminerexecutor/client/resources/table.png create mode 100644 src/main/java/org/gcube/portlets/user/dataminerexecutor/client/resources/tableResult.png create mode 100644 src/main/java/org/gcube/portlets/user/dataminerexecutor/client/resources/tree.gif create mode 100644 src/main/java/org/gcube/portlets/user/dataminerexecutor/client/resources/triangle.png create mode 100644 src/main/java/org/gcube/portlets/user/dataminerexecutor/client/resources/user_green.png create mode 100644 src/main/java/org/gcube/portlets/user/dataminerexecutor/client/rpc/DataMinerExecutorService.java create mode 100644 src/main/java/org/gcube/portlets/user/dataminerexecutor/client/rpc/DataMinerExecutorServiceAsync.java create mode 100644 src/main/java/org/gcube/portlets/user/dataminerexecutor/client/type/DataMinerWorkAreaElementType.java create mode 100644 src/main/java/org/gcube/portlets/user/dataminerexecutor/client/type/DataMinerWorkAreaEventType.java create mode 100644 src/main/java/org/gcube/portlets/user/dataminerexecutor/client/type/DataMinerWorkAreaRegionType.java create mode 100644 src/main/java/org/gcube/portlets/user/dataminerexecutor/client/type/DataMinerWorkAreaRequestEventType.java create mode 100644 src/main/java/org/gcube/portlets/user/dataminerexecutor/client/type/MenuType.java create mode 100644 src/main/java/org/gcube/portlets/user/dataminerexecutor/client/type/OperatorsClassificationRequestType.java create mode 100644 src/main/java/org/gcube/portlets/user/dataminerexecutor/client/type/OutputResourceRequestEventType.java create mode 100644 src/main/java/org/gcube/portlets/user/dataminerexecutor/client/type/SessionExpiredEventType.java create mode 100644 src/main/java/org/gcube/portlets/user/dataminerexecutor/client/type/UIStateEventType.java create mode 100644 src/main/java/org/gcube/portlets/user/dataminerexecutor/client/type/WPSMenuType.java create mode 100644 src/main/java/org/gcube/portlets/user/dataminerexecutor/client/util/ElementsHighlights.java create mode 100644 src/main/java/org/gcube/portlets/user/dataminerexecutor/client/util/InfoMessageBox.java create mode 100644 src/main/java/org/gcube/portlets/user/dataminerexecutor/client/util/UtilsGXT3.java create mode 100644 src/main/java/org/gcube/portlets/user/dataminerexecutor/client/widgets/FileViewer.java create mode 100644 src/main/java/org/gcube/portlets/user/dataminerexecutor/client/widgets/HashMapViewer.java create mode 100644 src/main/java/org/gcube/portlets/user/dataminerexecutor/client/widgets/ImageViewer.java create mode 100644 src/main/java/org/gcube/portlets/user/dataminerexecutor/client/widgets/ResourceViewer.java create mode 100644 src/main/java/org/gcube/portlets/user/dataminerexecutor/client/workspace/DownloadWidget.java create mode 100644 src/main/java/org/gcube/portlets/user/dataminerexecutor/dataminerexecutor.gwt.xml create mode 100644 src/main/java/org/gcube/portlets/user/dataminerexecutor/portlet/DataMinerExecutor.java create mode 100644 src/main/java/org/gcube/portlets/user/dataminerexecutor/server/DataMinerExecutorServiceImpl.java create mode 100644 src/main/java/org/gcube/portlets/user/dataminerexecutor/server/DescriptionRepository.java create mode 100644 src/main/java/org/gcube/portlets/user/dataminerexecutor/server/DownloadServlet.java create mode 100644 src/main/java/org/gcube/portlets/user/dataminerexecutor/server/SessionUtil.java create mode 100644 src/main/java/org/gcube/portlets/user/dataminerexecutor/server/invocation/InvocationManager.java create mode 100644 src/main/java/org/gcube/portlets/user/dataminerexecutor/server/storage/ItemDownload.java create mode 100644 src/main/java/org/gcube/portlets/user/dataminerexecutor/server/storage/StorageUtil.java create mode 100644 src/main/java/org/gcube/portlets/user/dataminerexecutor/server/util/DataMinerWorkAreaManager.java create mode 100644 src/main/java/org/gcube/portlets/user/dataminerexecutor/server/util/TableReader.java create mode 100644 src/main/java/org/gcube/portlets/user/dataminerexecutor/shared/Constants.java create mode 100644 src/main/java/org/gcube/portlets/user/dataminerexecutor/shared/StringUtil.java create mode 100644 src/main/java/org/gcube/portlets/user/dataminerexecutor/shared/exception/ServiceException.java create mode 100644 src/main/java/org/gcube/portlets/user/dataminerexecutor/shared/exception/SessionExpiredServiceException.java create mode 100644 src/main/java/org/gcube/portlets/user/dataminerexecutor/shared/session/UserInfo.java create mode 100644 src/main/resources/org/gcube/portlets/user/dataminerexecutor/dataminerexecutor.gwt.xml create mode 100644 src/main/webapp/DataMinerExecutor.css create mode 100644 src/main/webapp/DataMinerExecutor.html create mode 100644 src/main/webapp/WEB-INF/jsp/DataMinerExecutor_view.jsp create mode 100644 src/main/webapp/WEB-INF/liferay-display.xml create mode 100644 src/main/webapp/WEB-INF/liferay-plugin-package.properties create mode 100644 src/main/webapp/WEB-INF/liferay-portlet.xml create mode 100644 src/main/webapp/WEB-INF/portlet.xml create mode 100644 src/main/webapp/WEB-INF/web.xml create mode 100644 src/main/webapp/gxt/css/gxt-all.css create mode 100644 src/main/webapp/gxt/css/gxt-gray.css create mode 100644 src/main/webapp/gxt/desktop/css/desktop.css create mode 100644 src/main/webapp/gxt/desktop/images/desktop.gif create mode 100644 src/main/webapp/gxt/desktop/images/desktop3.jpg create mode 100644 src/main/webapp/gxt/desktop/images/gears.gif create mode 100644 src/main/webapp/gxt/desktop/images/gears.png create mode 100644 src/main/webapp/gxt/desktop/images/grid.png create mode 100644 src/main/webapp/gxt/desktop/images/hatch.gif create mode 100644 src/main/webapp/gxt/desktop/images/hd-bg.gif create mode 100644 src/main/webapp/gxt/desktop/images/hd-tb-bg.gif create mode 100644 src/main/webapp/gxt/desktop/images/icon_padlock.png create mode 100644 src/main/webapp/gxt/desktop/images/icons-bg.png create mode 100644 src/main/webapp/gxt/desktop/images/launcher-bg.gif create mode 100644 src/main/webapp/gxt/desktop/images/launcher-btn.gif create mode 100644 src/main/webapp/gxt/desktop/images/logout.gif create mode 100644 src/main/webapp/gxt/desktop/images/logout.png create mode 100644 src/main/webapp/gxt/desktop/images/member.gif create mode 100644 src/main/webapp/gxt/desktop/images/member.png create mode 100644 src/main/webapp/gxt/desktop/images/powered.gif create mode 100644 src/main/webapp/gxt/desktop/images/powered.png create mode 100644 src/main/webapp/gxt/desktop/images/s.gif create mode 100644 src/main/webapp/gxt/desktop/images/taskbar/black/item-over.gif create mode 100644 src/main/webapp/gxt/desktop/images/taskbar/black/scroll-left.gif create mode 100644 src/main/webapp/gxt/desktop/images/taskbar/black/scroll-right.gif create mode 100644 src/main/webapp/gxt/desktop/images/taskbar/black/start-menu-left-corners.png create mode 100644 src/main/webapp/gxt/desktop/images/taskbar/black/start-menu-left-right.png create mode 100644 src/main/webapp/gxt/desktop/images/taskbar/black/start-menu-right-corners.png create mode 100644 src/main/webapp/gxt/desktop/images/taskbar/black/start-menu-right.png create mode 100644 src/main/webapp/gxt/desktop/images/taskbar/black/start-menu-top-bottom.png create mode 100644 src/main/webapp/gxt/desktop/images/taskbar/black/startbutton-icon.gif create mode 100644 src/main/webapp/gxt/desktop/images/taskbar/black/startbutton.gif create mode 100644 src/main/webapp/gxt/desktop/images/taskbar/black/taskbar-split-h.gif create mode 100644 src/main/webapp/gxt/desktop/images/taskbar/black/taskbar-start-panel-bg.gif create mode 100644 src/main/webapp/gxt/desktop/images/taskbar/black/taskbutton.gif create mode 100644 src/main/webapp/gxt/desktop/images/taskbar/black/taskbuttons-panel-bg.gif create mode 100644 src/main/webapp/gxt/desktop/images/winbar-bg.gif create mode 100644 src/main/webapp/gxt/desktop/images/winbar-btn.gif create mode 100644 src/main/webapp/gxt/desktop/images/windows-bg.gif create mode 100644 src/main/webapp/gxt/desktop/wallpapers/desktop.jpg create mode 100644 src/main/webapp/gxt/flash/swfobject.js create mode 100644 src/main/webapp/gxt/images/default/box/corners-blue.gif create mode 100644 src/main/webapp/gxt/images/default/box/corners.gif create mode 100644 src/main/webapp/gxt/images/default/box/l-blue.gif create mode 100644 src/main/webapp/gxt/images/default/box/l.gif create mode 100644 src/main/webapp/gxt/images/default/box/r-blue.gif create mode 100644 src/main/webapp/gxt/images/default/box/r.gif create mode 100644 src/main/webapp/gxt/images/default/box/tb-blue.gif create mode 100644 src/main/webapp/gxt/images/default/box/tb.gif create mode 100644 src/main/webapp/gxt/images/default/button/arrow.gif create mode 100644 src/main/webapp/gxt/images/default/button/btn-arrow.gif create mode 100644 src/main/webapp/gxt/images/default/button/btn-sprite.gif create mode 100644 src/main/webapp/gxt/images/default/button/btn.gif create mode 100644 src/main/webapp/gxt/images/default/button/group-cs.gif create mode 100644 src/main/webapp/gxt/images/default/button/group-lr.gif create mode 100644 src/main/webapp/gxt/images/default/button/group-tb.gif create mode 100644 src/main/webapp/gxt/images/default/button/s-arrow-b-noline.gif create mode 100644 src/main/webapp/gxt/images/default/button/s-arrow-b.gif create mode 100644 src/main/webapp/gxt/images/default/button/s-arrow-bo.gif create mode 100644 src/main/webapp/gxt/images/default/button/s-arrow-noline.gif create mode 100644 src/main/webapp/gxt/images/default/button/s-arrow-o.gif create mode 100644 src/main/webapp/gxt/images/default/button/s-arrow.gif create mode 100644 src/main/webapp/gxt/images/default/dd/drop-add.gif create mode 100644 src/main/webapp/gxt/images/default/dd/drop-no.gif create mode 100644 src/main/webapp/gxt/images/default/dd/drop-yes.gif create mode 100644 src/main/webapp/gxt/images/default/editor/tb-bold.gif create mode 100644 src/main/webapp/gxt/images/default/editor/tb-font-color.gif create mode 100644 src/main/webapp/gxt/images/default/editor/tb-font-decrease.gif create mode 100644 src/main/webapp/gxt/images/default/editor/tb-font-highlight.gif create mode 100644 src/main/webapp/gxt/images/default/editor/tb-font-increase.gif create mode 100644 src/main/webapp/gxt/images/default/editor/tb-italic.gif create mode 100644 src/main/webapp/gxt/images/default/editor/tb-justify-center.gif create mode 100644 src/main/webapp/gxt/images/default/editor/tb-justify-left.gif create mode 100644 src/main/webapp/gxt/images/default/editor/tb-justify-right.gif create mode 100644 src/main/webapp/gxt/images/default/editor/tb-link.gif create mode 100644 src/main/webapp/gxt/images/default/editor/tb-ol.gif create mode 100644 src/main/webapp/gxt/images/default/editor/tb-source.gif create mode 100644 src/main/webapp/gxt/images/default/editor/tb-sprite.gif create mode 100644 src/main/webapp/gxt/images/default/editor/tb-ul.gif create mode 100644 src/main/webapp/gxt/images/default/editor/tb-underline.gif create mode 100644 src/main/webapp/gxt/images/default/form/checkbox.gif create mode 100644 src/main/webapp/gxt/images/default/form/clear-trigger.gif create mode 100644 src/main/webapp/gxt/images/default/form/date-trigger.gif create mode 100644 src/main/webapp/gxt/images/default/form/error-tip-corners.gif create mode 100644 src/main/webapp/gxt/images/default/form/exclamation.gif create mode 100644 src/main/webapp/gxt/images/default/form/radio.gif create mode 100644 src/main/webapp/gxt/images/default/form/search-trigger.gif create mode 100644 src/main/webapp/gxt/images/default/form/spinner.gif create mode 100644 src/main/webapp/gxt/images/default/form/text-bg.gif create mode 100644 src/main/webapp/gxt/images/default/form/trigger-tpl.gif create mode 100644 src/main/webapp/gxt/images/default/form/trigger.gif create mode 100644 src/main/webapp/gxt/images/default/gradient-bg.gif create mode 100644 src/main/webapp/gxt/images/default/grid/arrow-left-white.gif create mode 100644 src/main/webapp/gxt/images/default/grid/arrow-right-white.gif create mode 100644 src/main/webapp/gxt/images/default/grid/col-move-bottom.gif create mode 100644 src/main/webapp/gxt/images/default/grid/col-move-top.gif create mode 100644 src/main/webapp/gxt/images/default/grid/columns.gif create mode 100644 src/main/webapp/gxt/images/default/grid/dirty.gif create mode 100644 src/main/webapp/gxt/images/default/grid/done.gif create mode 100644 src/main/webapp/gxt/images/default/grid/drop-no.gif create mode 100644 src/main/webapp/gxt/images/default/grid/drop-yes.gif create mode 100644 src/main/webapp/gxt/images/default/grid/footer-bg.gif create mode 100644 src/main/webapp/gxt/images/default/grid/grid-blue-hd.gif create mode 100644 src/main/webapp/gxt/images/default/grid/grid-blue-split.gif create mode 100644 src/main/webapp/gxt/images/default/grid/grid-hrow.gif create mode 100644 src/main/webapp/gxt/images/default/grid/grid-loading.gif create mode 100644 src/main/webapp/gxt/images/default/grid/grid-split.gif create mode 100644 src/main/webapp/gxt/images/default/grid/grid-vista-hd.gif create mode 100644 src/main/webapp/gxt/images/default/grid/grid3-hd-btn.gif create mode 100644 src/main/webapp/gxt/images/default/grid/grid3-hrow-group.gif create mode 100644 src/main/webapp/gxt/images/default/grid/grid3-hrow-over.gif create mode 100644 src/main/webapp/gxt/images/default/grid/grid3-hrow.gif create mode 100644 src/main/webapp/gxt/images/default/grid/grid3-special-col-bg.gif create mode 100644 src/main/webapp/gxt/images/default/grid/grid3-special-col-sel-bg.gif create mode 100644 src/main/webapp/gxt/images/default/grid/group-by.gif create mode 100644 src/main/webapp/gxt/images/default/grid/group-expand-sprite.gif create mode 100644 src/main/webapp/gxt/images/default/grid/hd-pop.gif create mode 100644 src/main/webapp/gxt/images/default/grid/hmenu-asc.gif create mode 100644 src/main/webapp/gxt/images/default/grid/hmenu-desc.gif create mode 100644 src/main/webapp/gxt/images/default/grid/hmenu-lock.gif create mode 100644 src/main/webapp/gxt/images/default/grid/hmenu-lock.png create mode 100644 src/main/webapp/gxt/images/default/grid/hmenu-unlock.gif create mode 100644 src/main/webapp/gxt/images/default/grid/hmenu-unlock.png create mode 100644 src/main/webapp/gxt/images/default/grid/invalid_line.gif create mode 100644 src/main/webapp/gxt/images/default/grid/loading.gif create mode 100644 src/main/webapp/gxt/images/default/grid/mso-hd.gif create mode 100644 src/main/webapp/gxt/images/default/grid/nowait.gif create mode 100644 src/main/webapp/gxt/images/default/grid/page-first-disabled.gif create mode 100644 src/main/webapp/gxt/images/default/grid/page-first.gif create mode 100644 src/main/webapp/gxt/images/default/grid/page-last-disabled.gif create mode 100644 src/main/webapp/gxt/images/default/grid/page-last.gif create mode 100644 src/main/webapp/gxt/images/default/grid/page-next-disabled.gif create mode 100644 src/main/webapp/gxt/images/default/grid/page-next.gif create mode 100644 src/main/webapp/gxt/images/default/grid/page-prev-disabled.gif create mode 100644 src/main/webapp/gxt/images/default/grid/page-prev.gif create mode 100644 src/main/webapp/gxt/images/default/grid/pick-button.gif create mode 100644 src/main/webapp/gxt/images/default/grid/refresh.gif create mode 100644 src/main/webapp/gxt/images/default/grid/refresh.png create mode 100644 src/main/webapp/gxt/images/default/grid/row-check-sprite.gif create mode 100644 src/main/webapp/gxt/images/default/grid/row-expand-sprite.gif create mode 100644 src/main/webapp/gxt/images/default/grid/row-over.gif create mode 100644 src/main/webapp/gxt/images/default/grid/row-sel.gif create mode 100644 src/main/webapp/gxt/images/default/grid/sort-hd.gif create mode 100644 src/main/webapp/gxt/images/default/grid/sort_asc.gif create mode 100644 src/main/webapp/gxt/images/default/grid/sort_desc.gif create mode 100644 src/main/webapp/gxt/images/default/grid/wait.gif create mode 100644 src/main/webapp/gxt/images/default/layout/collapse.gif create mode 100644 src/main/webapp/gxt/images/default/layout/expand.gif create mode 100644 src/main/webapp/gxt/images/default/layout/gradient-bg.gif create mode 100644 src/main/webapp/gxt/images/default/layout/mini-bottom.gif create mode 100644 src/main/webapp/gxt/images/default/layout/mini-left.gif create mode 100644 src/main/webapp/gxt/images/default/layout/mini-right.gif create mode 100644 src/main/webapp/gxt/images/default/layout/mini-top.gif create mode 100644 src/main/webapp/gxt/images/default/layout/ns-collapse.gif create mode 100644 src/main/webapp/gxt/images/default/layout/ns-expand.gif create mode 100644 src/main/webapp/gxt/images/default/layout/panel-close.gif create mode 100644 src/main/webapp/gxt/images/default/layout/panel-title-bg.gif create mode 100644 src/main/webapp/gxt/images/default/layout/panel-title-light-bg.gif create mode 100644 src/main/webapp/gxt/images/default/layout/stick.gif create mode 100644 src/main/webapp/gxt/images/default/layout/stuck.gif create mode 100644 src/main/webapp/gxt/images/default/layout/tab-close-on.gif create mode 100644 src/main/webapp/gxt/images/default/layout/tab-close.gif create mode 100644 src/main/webapp/gxt/images/default/menu/checked.gif create mode 100644 src/main/webapp/gxt/images/default/menu/group-checked.gif create mode 100644 src/main/webapp/gxt/images/default/menu/item-over.gif create mode 100644 src/main/webapp/gxt/images/default/menu/menu-parent.gif create mode 100644 src/main/webapp/gxt/images/default/menu/menu.gif create mode 100644 src/main/webapp/gxt/images/default/menu/unchecked.gif create mode 100644 src/main/webapp/gxt/images/default/panel/corners-sprite.gif create mode 100644 src/main/webapp/gxt/images/default/panel/left-right.gif create mode 100644 src/main/webapp/gxt/images/default/panel/light-hd.gif create mode 100644 src/main/webapp/gxt/images/default/panel/tool-sprite-tpl.gif create mode 100644 src/main/webapp/gxt/images/default/panel/tool-sprites.gif create mode 100644 src/main/webapp/gxt/images/default/panel/tools-sprites-trans.gif create mode 100644 src/main/webapp/gxt/images/default/panel/top-bottom.gif create mode 100644 src/main/webapp/gxt/images/default/panel/top-bottom.png create mode 100644 src/main/webapp/gxt/images/default/panel/white-corners-sprite.gif create mode 100644 src/main/webapp/gxt/images/default/panel/white-left-right.gif create mode 100644 src/main/webapp/gxt/images/default/panel/white-top-bottom.gif create mode 100644 src/main/webapp/gxt/images/default/progress/progress-bg.gif create mode 100644 src/main/webapp/gxt/images/default/qtip/bg.gif create mode 100644 src/main/webapp/gxt/images/default/qtip/close.gif create mode 100644 src/main/webapp/gxt/images/default/qtip/tip-anchor-sprite.gif create mode 100644 src/main/webapp/gxt/images/default/qtip/tip-sprite.gif create mode 100644 src/main/webapp/gxt/images/default/s.gif create mode 100644 src/main/webapp/gxt/images/default/shadow-c.png create mode 100644 src/main/webapp/gxt/images/default/shadow-lr.png create mode 100644 src/main/webapp/gxt/images/default/shadow.png create mode 100644 src/main/webapp/gxt/images/default/shared/blue-loading.gif create mode 100644 src/main/webapp/gxt/images/default/shared/calendar.gif create mode 100644 src/main/webapp/gxt/images/default/shared/clear.gif create mode 100644 src/main/webapp/gxt/images/default/shared/glass-bg.gif create mode 100644 src/main/webapp/gxt/images/default/shared/hd-sprite.gif create mode 100644 src/main/webapp/gxt/images/default/shared/large-loading.gif create mode 100644 src/main/webapp/gxt/images/default/shared/left-btn.gif create mode 100644 src/main/webapp/gxt/images/default/shared/loading-balls.gif create mode 100644 src/main/webapp/gxt/images/default/shared/right-btn.gif create mode 100644 src/main/webapp/gxt/images/default/shared/warning.gif create mode 100644 src/main/webapp/gxt/images/default/sizer/e-handle-dark.gif create mode 100644 src/main/webapp/gxt/images/default/sizer/e-handle.gif create mode 100644 src/main/webapp/gxt/images/default/sizer/ne-handle-dark.gif create mode 100644 src/main/webapp/gxt/images/default/sizer/ne-handle.gif create mode 100644 src/main/webapp/gxt/images/default/sizer/nw-handle-dark.gif create mode 100644 src/main/webapp/gxt/images/default/sizer/nw-handle.gif create mode 100644 src/main/webapp/gxt/images/default/sizer/s-handle-dark.gif create mode 100644 src/main/webapp/gxt/images/default/sizer/s-handle.gif create mode 100644 src/main/webapp/gxt/images/default/sizer/se-handle-dark.gif create mode 100644 src/main/webapp/gxt/images/default/sizer/se-handle.gif create mode 100644 src/main/webapp/gxt/images/default/sizer/square.gif create mode 100644 src/main/webapp/gxt/images/default/sizer/sw-handle-dark.gif create mode 100644 src/main/webapp/gxt/images/default/sizer/sw-handle.gif create mode 100644 src/main/webapp/gxt/images/default/slider/slider-bg.png create mode 100644 src/main/webapp/gxt/images/default/slider/slider-thumb.png create mode 100644 src/main/webapp/gxt/images/default/slider/slider-v-bg.png create mode 100644 src/main/webapp/gxt/images/default/slider/slider-v-thumb.png create mode 100644 src/main/webapp/gxt/images/default/tabs/scroll-left.gif create mode 100644 src/main/webapp/gxt/images/default/tabs/scroll-right.gif create mode 100644 src/main/webapp/gxt/images/default/tabs/scroller-bg.gif create mode 100644 src/main/webapp/gxt/images/default/tabs/tab-btm-inactive-left-bg.gif create mode 100644 src/main/webapp/gxt/images/default/tabs/tab-btm-inactive-right-bg.gif create mode 100644 src/main/webapp/gxt/images/default/tabs/tab-btm-left-bg.gif create mode 100644 src/main/webapp/gxt/images/default/tabs/tab-btm-right-bg.gif create mode 100644 src/main/webapp/gxt/images/default/tabs/tab-close.gif create mode 100644 src/main/webapp/gxt/images/default/tabs/tab-strip-bg.gif create mode 100644 src/main/webapp/gxt/images/default/tabs/tab-strip-bg.png create mode 100644 src/main/webapp/gxt/images/default/tabs/tab-strip-btm-bg.gif create mode 100644 src/main/webapp/gxt/images/default/tabs/tabs-sprite.gif create mode 100644 src/main/webapp/gxt/images/default/toolbar/bg.gif create mode 100644 src/main/webapp/gxt/images/default/toolbar/btn-arrow-light.gif create mode 100644 src/main/webapp/gxt/images/default/toolbar/btn-arrow.gif create mode 100644 src/main/webapp/gxt/images/default/toolbar/btn-over-bg.gif create mode 100644 src/main/webapp/gxt/images/default/toolbar/gray-bg.gif create mode 100644 src/main/webapp/gxt/images/default/toolbar/more.gif create mode 100644 src/main/webapp/gxt/images/default/toolbar/tb-bg.gif create mode 100644 src/main/webapp/gxt/images/default/toolbar/tb-btn-sprite.gif create mode 100644 src/main/webapp/gxt/images/default/toolbar/tb-xl-btn-sprite.gif create mode 100644 src/main/webapp/gxt/images/default/toolbar/tb-xl-sep.gif create mode 100644 src/main/webapp/gxt/images/default/tree/arrows.gif create mode 100644 src/main/webapp/gxt/images/default/tree/drop-add.gif create mode 100644 src/main/webapp/gxt/images/default/tree/drop-between.gif create mode 100644 src/main/webapp/gxt/images/default/tree/drop-no.gif create mode 100644 src/main/webapp/gxt/images/default/tree/drop-over.gif create mode 100644 src/main/webapp/gxt/images/default/tree/drop-under.gif create mode 100644 src/main/webapp/gxt/images/default/tree/drop-yes.gif create mode 100644 src/main/webapp/gxt/images/default/tree/elbow-end-minus-nl.gif create mode 100644 src/main/webapp/gxt/images/default/tree/elbow-end-minus.gif create mode 100644 src/main/webapp/gxt/images/default/tree/elbow-end-plus-nl.gif create mode 100644 src/main/webapp/gxt/images/default/tree/elbow-end-plus.gif create mode 100644 src/main/webapp/gxt/images/default/tree/elbow-end.gif create mode 100644 src/main/webapp/gxt/images/default/tree/elbow-line.gif create mode 100644 src/main/webapp/gxt/images/default/tree/elbow-minus-nl.gif create mode 100644 src/main/webapp/gxt/images/default/tree/elbow-minus.gif create mode 100644 src/main/webapp/gxt/images/default/tree/elbow-plus-nl.gif create mode 100644 src/main/webapp/gxt/images/default/tree/elbow-plus.gif create mode 100644 src/main/webapp/gxt/images/default/tree/elbow.gif create mode 100644 src/main/webapp/gxt/images/default/tree/folder-open.gif create mode 100644 src/main/webapp/gxt/images/default/tree/folder.gif create mode 100644 src/main/webapp/gxt/images/default/tree/leaf.gif create mode 100644 src/main/webapp/gxt/images/default/tree/loading.gif create mode 100644 src/main/webapp/gxt/images/default/tree/s.gif create mode 100644 src/main/webapp/gxt/images/default/window/icon-error.gif create mode 100644 src/main/webapp/gxt/images/default/window/icon-info.gif create mode 100644 src/main/webapp/gxt/images/default/window/icon-question.gif create mode 100644 src/main/webapp/gxt/images/default/window/icon-warning.gif create mode 100644 src/main/webapp/gxt/images/default/window/left-corners.png create mode 100644 src/main/webapp/gxt/images/default/window/left-right.png create mode 100644 src/main/webapp/gxt/images/default/window/right-corners.png create mode 100644 src/main/webapp/gxt/images/default/window/top-bottom.png create mode 100644 src/main/webapp/gxt/images/gray/button/btn-arrow.gif create mode 100644 src/main/webapp/gxt/images/gray/button/btn-sprite.gif create mode 100644 src/main/webapp/gxt/images/gray/button/btn.gif create mode 100644 src/main/webapp/gxt/images/gray/button/group-cs.gif create mode 100644 src/main/webapp/gxt/images/gray/button/group-lr.gif create mode 100644 src/main/webapp/gxt/images/gray/button/group-tb.gif create mode 100644 src/main/webapp/gxt/images/gray/form/spinner.gif create mode 100644 src/main/webapp/gxt/images/gray/gradient-bg.gif create mode 100644 src/main/webapp/gxt/images/gray/grid/col-move-bottom.gif create mode 100644 src/main/webapp/gxt/images/gray/grid/col-move-top.gif create mode 100644 src/main/webapp/gxt/images/gray/grid/grid-split.gif create mode 100644 src/main/webapp/gxt/images/gray/grid/grid3-hd-btn.gif create mode 100644 src/main/webapp/gxt/images/gray/grid/grid3-hrow-over.gif create mode 100644 src/main/webapp/gxt/images/gray/grid/grid3-hrow-over2.gif create mode 100644 src/main/webapp/gxt/images/gray/grid/grid3-hrow.gif create mode 100644 src/main/webapp/gxt/images/gray/grid/grid3-hrow2.gif create mode 100644 src/main/webapp/gxt/images/gray/grid/grid3-special-col-bg.gif create mode 100644 src/main/webapp/gxt/images/gray/grid/grid3-special-col-bg2.gif create mode 100644 src/main/webapp/gxt/images/gray/grid/grid3-special-col-sel-bg.gif create mode 100644 src/main/webapp/gxt/images/gray/grid/group-collapse.gif create mode 100644 src/main/webapp/gxt/images/gray/grid/group-expand-sprite.gif create mode 100644 src/main/webapp/gxt/images/gray/grid/group-expand.gif create mode 100644 src/main/webapp/gxt/images/gray/grid/page-first.gif create mode 100644 src/main/webapp/gxt/images/gray/grid/page-last.gif create mode 100644 src/main/webapp/gxt/images/gray/grid/page-next.gif create mode 100644 src/main/webapp/gxt/images/gray/grid/page-prev.gif create mode 100644 src/main/webapp/gxt/images/gray/grid/refresh.gif create mode 100644 src/main/webapp/gxt/images/gray/grid/row-expand-sprite.gif create mode 100644 src/main/webapp/gxt/images/gray/grid/sort_asc.gif create mode 100644 src/main/webapp/gxt/images/gray/grid/sort_desc.gif create mode 100644 src/main/webapp/gxt/images/gray/panel/corners-sprite.gif create mode 100644 src/main/webapp/gxt/images/gray/panel/left-right.gif create mode 100644 src/main/webapp/gxt/images/gray/panel/light-hd.gif create mode 100644 src/main/webapp/gxt/images/gray/panel/tool-sprite-tpl.gif create mode 100644 src/main/webapp/gxt/images/gray/panel/tool-sprites.gif create mode 100644 src/main/webapp/gxt/images/gray/panel/tools-sprites-trans.gif create mode 100644 src/main/webapp/gxt/images/gray/panel/top-bottom.gif create mode 100644 src/main/webapp/gxt/images/gray/panel/top-bottom.png create mode 100644 src/main/webapp/gxt/images/gray/panel/white-corners-sprite.gif create mode 100644 src/main/webapp/gxt/images/gray/panel/white-left-right.gif create mode 100644 src/main/webapp/gxt/images/gray/panel/white-top-bottom.gif create mode 100644 src/main/webapp/gxt/images/gray/qtip/bg.gif create mode 100644 src/main/webapp/gxt/images/gray/qtip/close.gif create mode 100644 src/main/webapp/gxt/images/gray/qtip/tip-sprite.gif create mode 100644 src/main/webapp/gxt/images/gray/s.gif create mode 100644 src/main/webapp/gxt/images/gray/tabs/scroll-left.gif create mode 100644 src/main/webapp/gxt/images/gray/tabs/scroll-right.gif create mode 100644 src/main/webapp/gxt/images/gray/tabs/scroller-bg.gif create mode 100644 src/main/webapp/gxt/images/gray/tabs/tab-btm-inactive-left-bg.gif create mode 100644 src/main/webapp/gxt/images/gray/tabs/tab-btm-inactive-right-bg.gif create mode 100644 src/main/webapp/gxt/images/gray/tabs/tab-btm-left-bg.gif create mode 100644 src/main/webapp/gxt/images/gray/tabs/tab-btm-right-bg.gif create mode 100644 src/main/webapp/gxt/images/gray/tabs/tab-close.gif create mode 100644 src/main/webapp/gxt/images/gray/tabs/tab-strip-bg.gif create mode 100644 src/main/webapp/gxt/images/gray/tabs/tab-strip-bg.png create mode 100644 src/main/webapp/gxt/images/gray/tabs/tab-strip-btm-bg.gif create mode 100644 src/main/webapp/gxt/images/gray/tabs/tabs-sprite.gif create mode 100644 src/main/webapp/gxt/images/gray/toolbar/bg.gif create mode 100644 src/main/webapp/gxt/images/gray/toolbar/btn-arrow-light.gif create mode 100644 src/main/webapp/gxt/images/gray/toolbar/btn-arrow.gif create mode 100644 src/main/webapp/gxt/images/gray/toolbar/btn-over-bg.gif create mode 100644 src/main/webapp/gxt/images/gray/toolbar/gray-bg.gif create mode 100644 src/main/webapp/gxt/images/gray/toolbar/tb-bg.gif create mode 100644 src/main/webapp/gxt/images/gray/toolbar/tb-btn-sprite.gif create mode 100644 src/main/webapp/gxt/images/gray/window/icon-error.gif create mode 100644 src/main/webapp/gxt/images/gray/window/icon-info.gif create mode 100644 src/main/webapp/gxt/images/gray/window/icon-question.gif create mode 100644 src/main/webapp/gxt/images/gray/window/icon-warning.gif create mode 100644 src/main/webapp/gxt/images/gray/window/left-corners.png create mode 100644 src/main/webapp/gxt/images/gray/window/left-corners.pspimage create mode 100644 src/main/webapp/gxt/images/gray/window/left-right.png create mode 100644 src/main/webapp/gxt/images/gray/window/right-corners.png create mode 100644 src/main/webapp/gxt/images/gray/window/top-bottom.png create mode 100644 src/main/webapp/gxt/images/gxt/dd/insert-bg.gif create mode 100644 src/main/webapp/gxt/images/gxt/grid/row-editor-bg.gif create mode 100644 src/main/webapp/gxt/images/gxt/grid/row-editor-btns.gif create mode 100644 src/main/webapp/gxt/images/gxt/icons/bottom2.gif create mode 100644 src/main/webapp/gxt/images/gxt/icons/columns.gif create mode 100644 src/main/webapp/gxt/images/gxt/icons/done.gif create mode 100644 src/main/webapp/gxt/images/gxt/icons/doubleleft2.gif create mode 100644 src/main/webapp/gxt/images/gxt/icons/doubleright2.gif create mode 100644 src/main/webapp/gxt/images/gxt/icons/down2.gif create mode 100644 src/main/webapp/gxt/images/gxt/icons/folder-closed.gif create mode 100644 src/main/webapp/gxt/images/gxt/icons/folder-closed.png create mode 100644 src/main/webapp/gxt/images/gxt/icons/folder.gif create mode 100644 src/main/webapp/gxt/images/gxt/icons/folder.png create mode 100644 src/main/webapp/gxt/images/gxt/icons/grid-loading.gif create mode 100644 src/main/webapp/gxt/images/gxt/icons/hmenu-asc.gif create mode 100644 src/main/webapp/gxt/images/gxt/icons/hmenu-desc.gif create mode 100644 src/main/webapp/gxt/images/gxt/icons/left2.gif create mode 100644 src/main/webapp/gxt/images/gxt/icons/loading.gif create mode 100644 src/main/webapp/gxt/images/gxt/icons/nowait.gif create mode 100644 src/main/webapp/gxt/images/gxt/icons/page-first-disabled.gif create mode 100644 src/main/webapp/gxt/images/gxt/icons/page-first.gif create mode 100644 src/main/webapp/gxt/images/gxt/icons/page-last-disabled.gif create mode 100644 src/main/webapp/gxt/images/gxt/icons/page-last.gif create mode 100644 src/main/webapp/gxt/images/gxt/icons/page-next-disabled.gif create mode 100644 src/main/webapp/gxt/images/gxt/icons/page-next.gif create mode 100644 src/main/webapp/gxt/images/gxt/icons/page-prev-disabled.gif create mode 100644 src/main/webapp/gxt/images/gxt/icons/page-prev.gif create mode 100644 src/main/webapp/gxt/images/gxt/icons/paging.gif create mode 100644 src/main/webapp/gxt/images/gxt/icons/right2.gif create mode 100644 src/main/webapp/gxt/images/gxt/icons/tabs.gif create mode 100644 src/main/webapp/gxt/images/gxt/icons/top2.gif create mode 100644 src/main/webapp/gxt/images/gxt/icons/up2.gif create mode 100644 src/main/webapp/gxt/images/gxt/icons/wait.gif create mode 100644 src/main/webapp/gxt/images/gxt/info/corners-sprite.gif create mode 100644 src/main/webapp/gxt/images/gxt/info/top-bottom.gif create mode 100644 src/main/webapp/gxt/images/gxt/menu/disabledcheck.gif create mode 100644 src/main/webapp/gxt/images/gxt/shared/clear.gif create mode 100644 src/main/webapp/gxt/images/gxt/shared/large-loading.gif create mode 100644 src/main/webapp/gxt/images/gxt/shared/select-18-bg.gif create mode 100644 src/main/webapp/gxt/images/gxt/shared/select-19-bg-gray.gif create mode 100644 src/main/webapp/gxt/images/gxt/shared/select-19-bg.gif create mode 100644 src/main/webapp/gxt/images/gxt/shared/select-bg.gif create mode 100644 src/main/webapp/gxt/images/gxt/shared/select-light.gif create mode 100644 src/main/webapp/gxt/images/gxt/table/row-over.gif create mode 100644 src/main/webapp/gxt/images/gxt/table/vs-column-bg.gif create mode 100644 src/main/webapp/gxt/images/gxt/table/vsort-asc.gif create mode 100644 src/main/webapp/gxt/images/gxt/table/vsort-desc.gif create mode 100644 src/main/webapp/gxt/images/gxt/tree/checked.gif create mode 100644 src/main/webapp/gxt/images/gxt/tree/joint-close.gif create mode 100644 src/main/webapp/gxt/images/gxt/tree/joint-open.gif create mode 100644 src/main/webapp/gxt/images/gxt/tree/notchecked.gif create mode 100644 src/main/webapp/gxt/images/gxt/tree/tree-table-special-col-sel.gif create mode 100644 src/main/webapp/gxt/images/gxt/tree/tree-table-special-col.gif create mode 100644 src/main/webapp/gxt/images/gxt/tree/vnode.gif create mode 100644 src/main/webapp/gxt/images/gxt/tree/vnode_transparent.gif create mode 100644 src/main/webapp/gxt/themes/access/css/xtheme-access.css create mode 100644 src/main/webapp/gxt/themes/access/images/box/corners-blue.gif create mode 100644 src/main/webapp/gxt/themes/access/images/box/corners.gif create mode 100644 src/main/webapp/gxt/themes/access/images/box/l-blue.gif create mode 100644 src/main/webapp/gxt/themes/access/images/box/l.gif create mode 100644 src/main/webapp/gxt/themes/access/images/box/r-blue.gif create mode 100644 src/main/webapp/gxt/themes/access/images/box/r.gif create mode 100644 src/main/webapp/gxt/themes/access/images/box/tb-blue.gif create mode 100644 src/main/webapp/gxt/themes/access/images/box/tb.gif create mode 100644 src/main/webapp/gxt/themes/access/images/button/arrow.gif create mode 100644 src/main/webapp/gxt/themes/access/images/button/btn.gif create mode 100644 src/main/webapp/gxt/themes/access/images/button/group-cs.gif create mode 100644 src/main/webapp/gxt/themes/access/images/button/group-lr.gif create mode 100644 src/main/webapp/gxt/themes/access/images/button/group-tb.gif create mode 100644 src/main/webapp/gxt/themes/access/images/button/s-arrow-b-noline.gif create mode 100644 src/main/webapp/gxt/themes/access/images/button/s-arrow-b.gif create mode 100644 src/main/webapp/gxt/themes/access/images/button/s-arrow-bo.gif create mode 100644 src/main/webapp/gxt/themes/access/images/button/s-arrow-noline.gif create mode 100644 src/main/webapp/gxt/themes/access/images/button/s-arrow-o.gif create mode 100644 src/main/webapp/gxt/themes/access/images/button/s-arrow.gif create mode 100644 src/main/webapp/gxt/themes/access/images/editor/tb-source.gif create mode 100644 src/main/webapp/gxt/themes/access/images/editor/tb-sprite.gif create mode 100644 src/main/webapp/gxt/themes/access/images/form/checkbox.gif create mode 100644 src/main/webapp/gxt/themes/access/images/form/clear-trigger.gif create mode 100644 src/main/webapp/gxt/themes/access/images/form/date-trigger.gif create mode 100644 src/main/webapp/gxt/themes/access/images/form/error-tip-corners.gif create mode 100644 src/main/webapp/gxt/themes/access/images/form/exclamation.gif create mode 100644 src/main/webapp/gxt/themes/access/images/form/radio.gif create mode 100644 src/main/webapp/gxt/themes/access/images/form/search-trigger.gif create mode 100644 src/main/webapp/gxt/themes/access/images/form/spinner.gif create mode 100644 src/main/webapp/gxt/themes/access/images/form/text-bg.gif create mode 100644 src/main/webapp/gxt/themes/access/images/form/trigger-single.gif create mode 100644 src/main/webapp/gxt/themes/access/images/form/trigger-tpl.gif create mode 100644 src/main/webapp/gxt/themes/access/images/form/trigger.gif create mode 100644 src/main/webapp/gxt/themes/access/images/grid/arrow-left-white.gif create mode 100644 src/main/webapp/gxt/themes/access/images/grid/arrow-right-white.gif create mode 100644 src/main/webapp/gxt/themes/access/images/grid/col-move-bottom.gif create mode 100644 src/main/webapp/gxt/themes/access/images/grid/col-move-top.gif create mode 100644 src/main/webapp/gxt/themes/access/images/grid/columns.gif create mode 100644 src/main/webapp/gxt/themes/access/images/grid/dirty.gif create mode 100644 src/main/webapp/gxt/themes/access/images/grid/done.gif create mode 100644 src/main/webapp/gxt/themes/access/images/grid/drop-no.gif create mode 100644 src/main/webapp/gxt/themes/access/images/grid/drop-yes.gif create mode 100644 src/main/webapp/gxt/themes/access/images/grid/footer-bg.gif create mode 100644 src/main/webapp/gxt/themes/access/images/grid/grid-blue-hd.gif create mode 100644 src/main/webapp/gxt/themes/access/images/grid/grid-blue-split.gif create mode 100644 src/main/webapp/gxt/themes/access/images/grid/grid-hrow.gif create mode 100644 src/main/webapp/gxt/themes/access/images/grid/grid-loading.gif create mode 100644 src/main/webapp/gxt/themes/access/images/grid/grid-split.gif create mode 100644 src/main/webapp/gxt/themes/access/images/grid/grid-vista-hd.gif create mode 100644 src/main/webapp/gxt/themes/access/images/grid/grid3-hd-btn-contrast.gif create mode 100644 src/main/webapp/gxt/themes/access/images/grid/grid3-hd-btn.gif create mode 100644 src/main/webapp/gxt/themes/access/images/grid/grid3-hrow-over.gif create mode 100644 src/main/webapp/gxt/themes/access/images/grid/grid3-hrow.gif create mode 100644 src/main/webapp/gxt/themes/access/images/grid/grid3-special-col-bg.gif create mode 100644 src/main/webapp/gxt/themes/access/images/grid/grid3-special-col-sel-bg.gif create mode 100644 src/main/webapp/gxt/themes/access/images/grid/group-by.gif create mode 100644 src/main/webapp/gxt/themes/access/images/grid/group-collapse.gif create mode 100644 src/main/webapp/gxt/themes/access/images/grid/group-expand-sprite.gif create mode 100644 src/main/webapp/gxt/themes/access/images/grid/group-expand.gif create mode 100644 src/main/webapp/gxt/themes/access/images/grid/hd-pop.gif create mode 100644 src/main/webapp/gxt/themes/access/images/grid/hmenu-asc.gif create mode 100644 src/main/webapp/gxt/themes/access/images/grid/hmenu-desc.gif create mode 100644 src/main/webapp/gxt/themes/access/images/grid/hmenu-lock.gif create mode 100644 src/main/webapp/gxt/themes/access/images/grid/hmenu-lock.png create mode 100644 src/main/webapp/gxt/themes/access/images/grid/hmenu-unlock.gif create mode 100644 src/main/webapp/gxt/themes/access/images/grid/hmenu-unlock.png create mode 100644 src/main/webapp/gxt/themes/access/images/grid/invalid_line.gif create mode 100644 src/main/webapp/gxt/themes/access/images/grid/loading.gif create mode 100644 src/main/webapp/gxt/themes/access/images/grid/mso-hd.gif create mode 100644 src/main/webapp/gxt/themes/access/images/grid/nowait.gif create mode 100644 src/main/webapp/gxt/themes/access/images/grid/page-first-disabled.gif create mode 100644 src/main/webapp/gxt/themes/access/images/grid/page-first.gif create mode 100644 src/main/webapp/gxt/themes/access/images/grid/page-last-disabled.gif create mode 100644 src/main/webapp/gxt/themes/access/images/grid/page-last.gif create mode 100644 src/main/webapp/gxt/themes/access/images/grid/page-next-disabled.gif create mode 100644 src/main/webapp/gxt/themes/access/images/grid/page-next.gif create mode 100644 src/main/webapp/gxt/themes/access/images/grid/page-prev-disabled.gif create mode 100644 src/main/webapp/gxt/themes/access/images/grid/page-prev.gif create mode 100644 src/main/webapp/gxt/themes/access/images/grid/pick-button.gif create mode 100644 src/main/webapp/gxt/themes/access/images/grid/refresh.gif create mode 100644 src/main/webapp/gxt/themes/access/images/grid/row-check-sel.gif create mode 100644 src/main/webapp/gxt/themes/access/images/grid/row-check-sprite.gif create mode 100644 src/main/webapp/gxt/themes/access/images/grid/row-check.gif create mode 100644 src/main/webapp/gxt/themes/access/images/grid/row-expand-sprite.gif create mode 100644 src/main/webapp/gxt/themes/access/images/grid/row-over.gif create mode 100644 src/main/webapp/gxt/themes/access/images/grid/row-sel.gif create mode 100644 src/main/webapp/gxt/themes/access/images/grid/sort-hd.gif create mode 100644 src/main/webapp/gxt/themes/access/images/grid/sort_asc.gif create mode 100644 src/main/webapp/gxt/themes/access/images/grid/sort_desc.gif create mode 100644 src/main/webapp/gxt/themes/access/images/grid/wait.gif create mode 100644 src/main/webapp/gxt/themes/access/images/icons/bottom2.gif create mode 100644 src/main/webapp/gxt/themes/access/images/icons/doubleleft2.gif create mode 100644 src/main/webapp/gxt/themes/access/images/icons/doubleright2.gif create mode 100644 src/main/webapp/gxt/themes/access/images/icons/down2.gif create mode 100644 src/main/webapp/gxt/themes/access/images/icons/left2.gif create mode 100644 src/main/webapp/gxt/themes/access/images/icons/right2.gif create mode 100644 src/main/webapp/gxt/themes/access/images/icons/top2.gif create mode 100644 src/main/webapp/gxt/themes/access/images/icons/up2.gif create mode 100644 src/main/webapp/gxt/themes/access/images/layout/mini-bottom.gif create mode 100644 src/main/webapp/gxt/themes/access/images/layout/mini-top.gif create mode 100644 src/main/webapp/gxt/themes/access/images/menu/checked.gif create mode 100644 src/main/webapp/gxt/themes/access/images/menu/group-checked.gif create mode 100644 src/main/webapp/gxt/themes/access/images/menu/item-over.gif create mode 100644 src/main/webapp/gxt/themes/access/images/menu/menu-parent.gif create mode 100644 src/main/webapp/gxt/themes/access/images/menu/menu.gif create mode 100644 src/main/webapp/gxt/themes/access/images/menu/unchecked.gif create mode 100644 src/main/webapp/gxt/themes/access/images/panel/corners-sprite.gif create mode 100644 src/main/webapp/gxt/themes/access/images/panel/left-right.gif create mode 100644 src/main/webapp/gxt/themes/access/images/panel/light-hd.gif create mode 100644 src/main/webapp/gxt/themes/access/images/panel/tool-close.gif create mode 100644 src/main/webapp/gxt/themes/access/images/panel/tool-collapse.gif create mode 100644 src/main/webapp/gxt/themes/access/images/panel/tool-expand.gif create mode 100644 src/main/webapp/gxt/themes/access/images/panel/tool-gear.gif create mode 100644 src/main/webapp/gxt/themes/access/images/panel/tool-maximize.gif create mode 100644 src/main/webapp/gxt/themes/access/images/panel/tool-minimize.gif create mode 100644 src/main/webapp/gxt/themes/access/images/panel/tool-pin.gif create mode 100644 src/main/webapp/gxt/themes/access/images/panel/tool-sprite-tpl.gif create mode 100644 src/main/webapp/gxt/themes/access/images/panel/tool-sprites.gif create mode 100644 src/main/webapp/gxt/themes/access/images/panel/tools-sprites-trans.gif create mode 100644 src/main/webapp/gxt/themes/access/images/panel/top-bottom.gif create mode 100644 src/main/webapp/gxt/themes/access/images/panel/white-corners-sprite.gif create mode 100644 src/main/webapp/gxt/themes/access/images/panel/white-left-right.gif create mode 100644 src/main/webapp/gxt/themes/access/images/panel/white-top-bottom.gif create mode 100644 src/main/webapp/gxt/themes/access/images/progress/progress-bg.gif create mode 100644 src/main/webapp/gxt/themes/access/images/qtip/close.gif create mode 100644 src/main/webapp/gxt/themes/access/images/qtip/tip-anchor-sprite.gif create mode 100644 src/main/webapp/gxt/themes/access/images/qtip/tip-sprite.gif create mode 100644 src/main/webapp/gxt/themes/access/images/shared/glass-bg.gif create mode 100644 src/main/webapp/gxt/themes/access/images/shared/hd-sprite.gif create mode 100644 src/main/webapp/gxt/themes/access/images/shared/left-btn.gif create mode 100644 src/main/webapp/gxt/themes/access/images/shared/right-btn.gif create mode 100644 src/main/webapp/gxt/themes/access/images/sizer/e-handle-dark.gif create mode 100644 src/main/webapp/gxt/themes/access/images/sizer/e-handle.gif create mode 100644 src/main/webapp/gxt/themes/access/images/sizer/ne-handle-dark.gif create mode 100644 src/main/webapp/gxt/themes/access/images/sizer/ne-handle.gif create mode 100644 src/main/webapp/gxt/themes/access/images/sizer/nw-handle-dark.gif create mode 100644 src/main/webapp/gxt/themes/access/images/sizer/nw-handle.gif create mode 100644 src/main/webapp/gxt/themes/access/images/sizer/s-handle-dark.gif create mode 100644 src/main/webapp/gxt/themes/access/images/sizer/s-handle.gif create mode 100644 src/main/webapp/gxt/themes/access/images/sizer/se-handle-dark.gif create mode 100644 src/main/webapp/gxt/themes/access/images/sizer/se-handle.gif create mode 100644 src/main/webapp/gxt/themes/access/images/sizer/square.gif create mode 100644 src/main/webapp/gxt/themes/access/images/sizer/sw-handle-dark.gif create mode 100644 src/main/webapp/gxt/themes/access/images/sizer/sw-handle.gif create mode 100644 src/main/webapp/gxt/themes/access/images/slider/slider-bg.png create mode 100644 src/main/webapp/gxt/themes/access/images/slider/slider-thumb-single.png create mode 100644 src/main/webapp/gxt/themes/access/images/slider/slider-thumb.png create mode 100644 src/main/webapp/gxt/themes/access/images/slider/slider-v-bg.png create mode 100644 src/main/webapp/gxt/themes/access/images/slider/slider-v-thumb.png create mode 100644 src/main/webapp/gxt/themes/access/images/tabs/scroll-left.gif create mode 100644 src/main/webapp/gxt/themes/access/images/tabs/scroll-right.gif create mode 100644 src/main/webapp/gxt/themes/access/images/tabs/tab-btm-inactive-left-bg.gif create mode 100644 src/main/webapp/gxt/themes/access/images/tabs/tab-btm-inactive-right-bg.gif create mode 100644 src/main/webapp/gxt/themes/access/images/tabs/tab-btm-left-bg.gif create mode 100644 src/main/webapp/gxt/themes/access/images/tabs/tab-btm-right-bg.gif create mode 100644 src/main/webapp/gxt/themes/access/images/tabs/tab-close.gif create mode 100644 src/main/webapp/gxt/themes/access/images/tabs/tab-strip-bg.gif create mode 100644 src/main/webapp/gxt/themes/access/images/tabs/tab-strip-btm-bg.gif create mode 100644 src/main/webapp/gxt/themes/access/images/tabs/tabs-sprite.gif create mode 100644 src/main/webapp/gxt/themes/access/images/toolbar/bg.gif create mode 100644 src/main/webapp/gxt/themes/access/images/toolbar/btn-arrow-light.gif create mode 100644 src/main/webapp/gxt/themes/access/images/toolbar/btn-arrow.gif create mode 100644 src/main/webapp/gxt/themes/access/images/toolbar/btn-over-bg.gif create mode 100644 src/main/webapp/gxt/themes/access/images/toolbar/gray-bg.gif create mode 100644 src/main/webapp/gxt/themes/access/images/toolbar/more.gif create mode 100644 src/main/webapp/gxt/themes/access/images/toolbar/s-arrow-bo.gif create mode 100644 src/main/webapp/gxt/themes/access/images/toolbar/tb-btn-sprite.gif create mode 100644 src/main/webapp/gxt/themes/access/images/toolbar/tb-xl-btn-sprite.gif create mode 100644 src/main/webapp/gxt/themes/access/images/toolbar/tb-xl-sep.gif create mode 100644 src/main/webapp/gxt/themes/access/images/tree/arrows.gif create mode 100644 src/main/webapp/gxt/themes/access/images/tree/drop-add.gif create mode 100644 src/main/webapp/gxt/themes/access/images/tree/drop-between.gif create mode 100644 src/main/webapp/gxt/themes/access/images/tree/drop-no.gif create mode 100644 src/main/webapp/gxt/themes/access/images/tree/drop-over.gif create mode 100644 src/main/webapp/gxt/themes/access/images/tree/drop-under.gif create mode 100644 src/main/webapp/gxt/themes/access/images/tree/drop-yes.gif create mode 100644 src/main/webapp/gxt/themes/access/images/tree/elbow-end-minus-nl.gif create mode 100644 src/main/webapp/gxt/themes/access/images/tree/elbow-end-minus.gif create mode 100644 src/main/webapp/gxt/themes/access/images/tree/elbow-end-plus-nl.gif create mode 100644 src/main/webapp/gxt/themes/access/images/tree/elbow-end-plus.gif create mode 100644 src/main/webapp/gxt/themes/access/images/tree/elbow-end.gif create mode 100644 src/main/webapp/gxt/themes/access/images/tree/elbow-line.gif create mode 100644 src/main/webapp/gxt/themes/access/images/tree/elbow-minus-nl.gif create mode 100644 src/main/webapp/gxt/themes/access/images/tree/elbow-minus.gif create mode 100644 src/main/webapp/gxt/themes/access/images/tree/elbow-plus-nl.gif create mode 100644 src/main/webapp/gxt/themes/access/images/tree/elbow-plus.gif create mode 100644 src/main/webapp/gxt/themes/access/images/tree/elbow.gif create mode 100644 src/main/webapp/gxt/themes/access/images/tree/folder-open.gif create mode 100644 src/main/webapp/gxt/themes/access/images/tree/folder.gif create mode 100644 src/main/webapp/gxt/themes/access/images/tree/leaf.gif create mode 100644 src/main/webapp/gxt/themes/access/images/tree/loading.gif create mode 100644 src/main/webapp/gxt/themes/access/images/tree/s.gif create mode 100644 src/main/webapp/gxt/themes/access/images/tree/tree-collapsed.png create mode 100644 src/main/webapp/gxt/themes/access/images/tree/tree-expanded.png create mode 100644 src/main/webapp/gxt/themes/access/images/window/icon-error.gif create mode 100644 src/main/webapp/gxt/themes/access/images/window/icon-info.gif create mode 100644 src/main/webapp/gxt/themes/access/images/window/icon-question.gif create mode 100644 src/main/webapp/gxt/themes/access/images/window/icon-warning.gif create mode 100644 src/main/webapp/gxt/themes/access/images/window/left-corners.png create mode 100644 src/main/webapp/gxt/themes/access/images/window/left-right.png create mode 100644 src/main/webapp/gxt/themes/access/images/window/right-corners.png create mode 100644 src/main/webapp/gxt/themes/access/images/window/top-bottom.png create mode 100644 src/main/webapp/gxt/themes/slate/css/xtheme-slate.css create mode 100644 src/main/webapp/gxt/themes/slate/images/slate/button/arrow.gif create mode 100644 src/main/webapp/gxt/themes/slate/images/slate/button/btn-arrow.gif create mode 100644 src/main/webapp/gxt/themes/slate/images/slate/button/btn-sprite.gif create mode 100644 src/main/webapp/gxt/themes/slate/images/slate/button/btn.gif create mode 100644 src/main/webapp/gxt/themes/slate/images/slate/button/group-cs.gif create mode 100644 src/main/webapp/gxt/themes/slate/images/slate/button/group-lr.gif create mode 100644 src/main/webapp/gxt/themes/slate/images/slate/button/group-tb.gif create mode 100644 src/main/webapp/gxt/themes/slate/images/slate/button/s-arrow-b-noline.gif create mode 100644 src/main/webapp/gxt/themes/slate/images/slate/button/s-arrow-b.gif create mode 100644 src/main/webapp/gxt/themes/slate/images/slate/button/s-arrow-bo.gif create mode 100644 src/main/webapp/gxt/themes/slate/images/slate/button/s-arrow-noline.gif create mode 100644 src/main/webapp/gxt/themes/slate/images/slate/button/s-arrow-o.gif create mode 100644 src/main/webapp/gxt/themes/slate/images/slate/button/s-arrow.gif create mode 100644 src/main/webapp/gxt/themes/slate/images/slate/editor/tb-sprite.gif create mode 100644 src/main/webapp/gxt/themes/slate/images/slate/form/checkbox.gif create mode 100644 src/main/webapp/gxt/themes/slate/images/slate/form/clear-trigger.gif create mode 100644 src/main/webapp/gxt/themes/slate/images/slate/form/date-trigger.gif create mode 100644 src/main/webapp/gxt/themes/slate/images/slate/form/error-tip-corners.gif create mode 100644 src/main/webapp/gxt/themes/slate/images/slate/form/radio.gif create mode 100644 src/main/webapp/gxt/themes/slate/images/slate/form/search-trigger.gif create mode 100644 src/main/webapp/gxt/themes/slate/images/slate/form/spinner.gif create mode 100644 src/main/webapp/gxt/themes/slate/images/slate/form/trigger-tpl.gif create mode 100644 src/main/webapp/gxt/themes/slate/images/slate/form/trigger.gif create mode 100644 src/main/webapp/gxt/themes/slate/images/slate/gradient-bg.gif create mode 100644 src/main/webapp/gxt/themes/slate/images/slate/grid/arrow-left-white.gif create mode 100644 src/main/webapp/gxt/themes/slate/images/slate/grid/arrow-right-white.gif create mode 100644 src/main/webapp/gxt/themes/slate/images/slate/grid/col-move-bottom.gif create mode 100644 src/main/webapp/gxt/themes/slate/images/slate/grid/col-move-top.gif create mode 100644 src/main/webapp/gxt/themes/slate/images/slate/grid/footer-bg.gif create mode 100644 src/main/webapp/gxt/themes/slate/images/slate/grid/grid-blue-hd.gif create mode 100644 src/main/webapp/gxt/themes/slate/images/slate/grid/grid-blue-split.gif create mode 100644 src/main/webapp/gxt/themes/slate/images/slate/grid/grid-hrow.gif create mode 100644 src/main/webapp/gxt/themes/slate/images/slate/grid/grid-split.gif create mode 100644 src/main/webapp/gxt/themes/slate/images/slate/grid/grid-vista-hd.gif create mode 100644 src/main/webapp/gxt/themes/slate/images/slate/grid/grid3-hd-btn.gif create mode 100644 src/main/webapp/gxt/themes/slate/images/slate/grid/grid3-hrow-over.gif create mode 100644 src/main/webapp/gxt/themes/slate/images/slate/grid/grid3-hrow.gif create mode 100644 src/main/webapp/gxt/themes/slate/images/slate/grid/grid3-special-col-bg.gif create mode 100644 src/main/webapp/gxt/themes/slate/images/slate/grid/grid3-special-col-sel-bg.gif create mode 100644 src/main/webapp/gxt/themes/slate/images/slate/grid/group-expand-sprite.gif create mode 100644 src/main/webapp/gxt/themes/slate/images/slate/grid/mso-hd.gif create mode 100644 src/main/webapp/gxt/themes/slate/images/slate/grid/page-first-disabled.gif create mode 100644 src/main/webapp/gxt/themes/slate/images/slate/grid/page-first.gif create mode 100644 src/main/webapp/gxt/themes/slate/images/slate/grid/page-last-disabled.gif create mode 100644 src/main/webapp/gxt/themes/slate/images/slate/grid/page-last.gif create mode 100644 src/main/webapp/gxt/themes/slate/images/slate/grid/page-next-disabled.gif create mode 100644 src/main/webapp/gxt/themes/slate/images/slate/grid/page-next.gif create mode 100644 src/main/webapp/gxt/themes/slate/images/slate/grid/page-prev-disabled.gif create mode 100644 src/main/webapp/gxt/themes/slate/images/slate/grid/page-prev.gif create mode 100644 src/main/webapp/gxt/themes/slate/images/slate/grid/refresh.gif create mode 100644 src/main/webapp/gxt/themes/slate/images/slate/grid/row-over.gif create mode 100644 src/main/webapp/gxt/themes/slate/images/slate/grid/row-sel.gif create mode 100644 src/main/webapp/gxt/themes/slate/images/slate/grid/sort_asc.gif create mode 100644 src/main/webapp/gxt/themes/slate/images/slate/grid/sort_desc.gif create mode 100644 src/main/webapp/gxt/themes/slate/images/slate/menu/checked.gif create mode 100644 src/main/webapp/gxt/themes/slate/images/slate/menu/group-checked.gif create mode 100644 src/main/webapp/gxt/themes/slate/images/slate/menu/item-over - Copy.gif create mode 100644 src/main/webapp/gxt/themes/slate/images/slate/menu/item-over.gif create mode 100644 src/main/webapp/gxt/themes/slate/images/slate/menu/menu-parent.gif create mode 100644 src/main/webapp/gxt/themes/slate/images/slate/menu/menu.gif create mode 100644 src/main/webapp/gxt/themes/slate/images/slate/menu/unchecked.gif create mode 100644 src/main/webapp/gxt/themes/slate/images/slate/panel/corners-sprite.gif create mode 100644 src/main/webapp/gxt/themes/slate/images/slate/panel/left-right.gif create mode 100644 src/main/webapp/gxt/themes/slate/images/slate/panel/light-hd.gif create mode 100644 src/main/webapp/gxt/themes/slate/images/slate/panel/tool-sprite-tpl.gif create mode 100644 src/main/webapp/gxt/themes/slate/images/slate/panel/tool-sprites.gif create mode 100644 src/main/webapp/gxt/themes/slate/images/slate/panel/tools-sprites-trans.gif create mode 100644 src/main/webapp/gxt/themes/slate/images/slate/panel/top-bottom.gif create mode 100644 src/main/webapp/gxt/themes/slate/images/slate/panel/top-bottom.png create mode 100644 src/main/webapp/gxt/themes/slate/images/slate/panel/white-corners-sprite.gif create mode 100644 src/main/webapp/gxt/themes/slate/images/slate/panel/white-left-right.gif create mode 100644 src/main/webapp/gxt/themes/slate/images/slate/panel/white-top-bottom.gif create mode 100644 src/main/webapp/gxt/themes/slate/images/slate/progress/progress-bg.gif create mode 100644 src/main/webapp/gxt/themes/slate/images/slate/qtip/bg.gif create mode 100644 src/main/webapp/gxt/themes/slate/images/slate/qtip/close.gif create mode 100644 src/main/webapp/gxt/themes/slate/images/slate/qtip/tip-sprite.gif create mode 100644 src/main/webapp/gxt/themes/slate/images/slate/s.gif create mode 100644 src/main/webapp/gxt/themes/slate/images/slate/shared/glass-bg.gif create mode 100644 src/main/webapp/gxt/themes/slate/images/slate/shared/hd-sprite.gif create mode 100644 src/main/webapp/gxt/themes/slate/images/slate/shared/left-btn.gif create mode 100644 src/main/webapp/gxt/themes/slate/images/slate/shared/right-btn.gif create mode 100644 src/main/webapp/gxt/themes/slate/images/slate/sizer/e-handle-dark.gif create mode 100644 src/main/webapp/gxt/themes/slate/images/slate/sizer/e-handle.gif create mode 100644 src/main/webapp/gxt/themes/slate/images/slate/sizer/ne-handle-dark.gif create mode 100644 src/main/webapp/gxt/themes/slate/images/slate/sizer/ne-handle.gif create mode 100644 src/main/webapp/gxt/themes/slate/images/slate/sizer/nw-handle-dark.gif create mode 100644 src/main/webapp/gxt/themes/slate/images/slate/sizer/nw-handle.gif create mode 100644 src/main/webapp/gxt/themes/slate/images/slate/sizer/s-handle-dark.gif create mode 100644 src/main/webapp/gxt/themes/slate/images/slate/sizer/s-handle.gif create mode 100644 src/main/webapp/gxt/themes/slate/images/slate/sizer/se-handle-dark.gif create mode 100644 src/main/webapp/gxt/themes/slate/images/slate/sizer/se-handle.gif create mode 100644 src/main/webapp/gxt/themes/slate/images/slate/sizer/square.gif create mode 100644 src/main/webapp/gxt/themes/slate/images/slate/sizer/sw-handle-dark.gif create mode 100644 src/main/webapp/gxt/themes/slate/images/slate/sizer/sw-handle.gif create mode 100644 src/main/webapp/gxt/themes/slate/images/slate/slider/slider-bg.png create mode 100644 src/main/webapp/gxt/themes/slate/images/slate/slider/slider-thumb.png create mode 100644 src/main/webapp/gxt/themes/slate/images/slate/slider/slider-v-bg.png create mode 100644 src/main/webapp/gxt/themes/slate/images/slate/slider/slider-v-thumb.png create mode 100644 src/main/webapp/gxt/themes/slate/images/slate/tabs/scroll-left.gif create mode 100644 src/main/webapp/gxt/themes/slate/images/slate/tabs/scroll-right.gif create mode 100644 src/main/webapp/gxt/themes/slate/images/slate/tabs/scroller-bg.gif create mode 100644 src/main/webapp/gxt/themes/slate/images/slate/tabs/tab-btm-inactive-left-bg.gif create mode 100644 src/main/webapp/gxt/themes/slate/images/slate/tabs/tab-btm-inactive-right-bg.gif create mode 100644 src/main/webapp/gxt/themes/slate/images/slate/tabs/tab-btm-left-bg.gif create mode 100644 src/main/webapp/gxt/themes/slate/images/slate/tabs/tab-btm-right-bg.gif create mode 100644 src/main/webapp/gxt/themes/slate/images/slate/tabs/tab-close.gif create mode 100644 src/main/webapp/gxt/themes/slate/images/slate/tabs/tab-strip-bg.gif create mode 100644 src/main/webapp/gxt/themes/slate/images/slate/tabs/tab-strip-bg.png create mode 100644 src/main/webapp/gxt/themes/slate/images/slate/tabs/tab-strip-btm-bg.gif create mode 100644 src/main/webapp/gxt/themes/slate/images/slate/tabs/tabs-sprite.gif create mode 100644 src/main/webapp/gxt/themes/slate/images/slate/toolbar/bg.gif create mode 100644 src/main/webapp/gxt/themes/slate/images/slate/toolbar/btn-arrow-light.gif create mode 100644 src/main/webapp/gxt/themes/slate/images/slate/toolbar/btn-arrow.gif create mode 100644 src/main/webapp/gxt/themes/slate/images/slate/toolbar/btn-over-bg.gif create mode 100644 src/main/webapp/gxt/themes/slate/images/slate/toolbar/gray-bg.gif create mode 100644 src/main/webapp/gxt/themes/slate/images/slate/toolbar/sep.gif create mode 100644 src/main/webapp/gxt/themes/slate/images/slate/toolbar/tb-bg.gif create mode 100644 src/main/webapp/gxt/themes/slate/images/slate/toolbar/tb-btn-sprite.gif create mode 100644 src/main/webapp/gxt/themes/slate/images/slate/tree/arrows.gif create mode 100644 src/main/webapp/gxt/themes/slate/images/slate/window/icon-error.gif create mode 100644 src/main/webapp/gxt/themes/slate/images/slate/window/icon-info.gif create mode 100644 src/main/webapp/gxt/themes/slate/images/slate/window/icon-question.gif create mode 100644 src/main/webapp/gxt/themes/slate/images/slate/window/icon-warning.gif create mode 100644 src/main/webapp/gxt/themes/slate/images/slate/window/left-corners.png create mode 100644 src/main/webapp/gxt/themes/slate/images/slate/window/left-right.png create mode 100644 src/main/webapp/gxt/themes/slate/images/slate/window/right-corners.png create mode 100644 src/main/webapp/gxt/themes/slate/images/slate/window/top-bottom.png create mode 100644 src/main/webapp/images/categories/DEFAULT_IMAGE.png create mode 100644 src/main/webapp/images/categories/DISTRIBUTIONS.png create mode 100644 src/main/webapp/images/fileIcon.png create mode 100644 src/main/webapp/images/operators/AQUAMAPSNN.png create mode 100644 src/main/webapp/images/operators/AQUAMAPSNNNS.png create mode 100644 src/main/webapp/images/operators/AQUAMAPS_NATIVE.png create mode 100644 src/main/webapp/images/operators/AQUAMAPS_NATIVE_2050.png create mode 100644 src/main/webapp/images/operators/AQUAMAPS_NATIVE_NEURALNETWORK.png create mode 100644 src/main/webapp/images/operators/AQUAMAPS_NEURAL_NETWORK_NS.png create mode 100644 src/main/webapp/images/operators/AQUAMAPS_SUITABLE.png create mode 100644 src/main/webapp/images/operators/AQUAMAPS_SUITABLE_2050.png create mode 100644 src/main/webapp/images/operators/AQUAMAPS_SUITABLE_NEURALNETWORK.png create mode 100644 src/main/webapp/images/operators/DEFAULT_IMAGE.png create mode 100644 src/main/webapp/images/operators/DEFAULT_IMAGEold.png create mode 100644 src/main/webapp/images/operators/HSPEN.png create mode 100644 src/main/webapp/images/operators/REMOTE_AQUAMAPS_NATIVE.png create mode 100644 src/main/webapp/images/operators/REMOTE_AQUAMAPS_NATIVE_2050.png create mode 100644 src/main/webapp/images/operators/REMOTE_AQUAMAPS_SUITABLE.png create mode 100644 src/main/webapp/images/operators/REMOTE_AQUAMAPS_SUITABLE_2050.png create mode 100644 src/main/webapp/images/provenances/provenanceCOMPUTED.png create mode 100644 src/main/webapp/images/provenances/provenanceCOMPUTED2.png create mode 100644 src/main/webapp/images/provenances/provenanceIMPORTED.png create mode 100644 src/main/webapp/images/provenances/provenanceIMPORTED2.png create mode 100644 src/main/webapp/images/provenances/provenanceSYSTEM.png create mode 100644 src/main/webapp/images/provenances/provenanceSYSTEM2.png create mode 100644 src/main/webapp/images/templateIcons/CLUSTER.png create mode 100644 src/main/webapp/images/templateIcons/FILE.png create mode 100644 src/main/webapp/images/templateIcons/GENERIC.png create mode 100644 src/main/webapp/images/templateIcons/HCAF.png create mode 100644 src/main/webapp/images/templateIcons/HSPEC.png create mode 100644 src/main/webapp/images/templateIcons/HSPEN.png create mode 100644 src/main/webapp/images/templateIcons/MINMAXLAT.png create mode 100644 src/main/webapp/images/templateIcons/OCCURRENCE_AQUAMAPS.png create mode 100644 src/main/webapp/images/templateIcons/OCCURRENCE_SPECIES.png create mode 100644 src/main/webapp/images/templateIcons/TESTSET.png create mode 100644 src/main/webapp/images/templateIcons/TIMESERIES.png create mode 100644 src/main/webapp/images/templateIcons/TIME_SERIES.png create mode 100644 src/main/webapp/images/templateIcons/TRAININGSET.png create mode 100644 src/main/webapp/images/test create mode 100644 src/main/webapp/images/triangle-down.png create mode 100644 src/main/webapp/images/triangle-right.png create mode 100644 src/main/webapp/templateDescriptions/CLUSTER.html create mode 100644 src/main/webapp/templateDescriptions/GENERIC.html create mode 100644 src/main/webapp/templateDescriptions/HCAF.html create mode 100644 src/main/webapp/templateDescriptions/HSPEC.html create mode 100644 src/main/webapp/templateDescriptions/HSPEN.html create mode 100644 src/main/webapp/templateDescriptions/MINMAXLAT.html create mode 100644 src/main/webapp/templateDescriptions/OCCURRENCE_AQUAMAPS.html create mode 100644 src/main/webapp/templateDescriptions/OCCURRENCE_SPECIES.html create mode 100644 src/main/webapp/templateDescriptions/TESTSET.html create mode 100644 src/main/webapp/templateDescriptions/TIMESERIES.html create mode 100644 src/main/webapp/templateDescriptions/TRAININGSET.html create mode 100644 src/main/webapp/templateDescriptions/base.html create mode 100644 src/test/java/org/gcube/portlets/user/dataminerexecutor/ElementsHighlightsTest.java create mode 100644 src/test/java/org/gcube/portlets/user/dataminerexecutor/TestDataMinerService.java create mode 100644 src/test/resources/org/gcube/portlets/user/dataminerexecutor/TestDataMinerServiceDBSCAN.xml create mode 100644 src/test/resources/org/gcube/portlets/user/dataminerexecutor/TestDataMinerServiceDBSCANReference.xml create mode 100644 src/test/resources/org/gcube/portlets/user/dataminerexecutor/TestDataMinerServiceXMEANS.xml diff --git a/.classpath b/.classpath new file mode 100644 index 0000000..15fcc7d --- /dev/null +++ b/.classpath @@ -0,0 +1,38 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/.project b/.project new file mode 100644 index 0000000..adb7cef --- /dev/null +++ b/.project @@ -0,0 +1,64 @@ + + + data-miner-executor + + + + + + org.eclipse.wst.jsdt.core.javascriptValidator + + + + + org.eclipse.jdt.core.javabuilder + + + + + org.eclipse.wst.common.project.facet.core.builder + + + + + org.eclipse.wst.validation.validationbuilder + + + + + com.google.gdt.eclipse.core.webAppProjectValidator + + + + + com.google.gwt.eclipse.core.gwtProjectValidator + + + + + org.eclipse.pde.ManifestBuilder + + + + + org.eclipse.pde.SchemaBuilder + + + + + org.eclipse.m2e.core.maven2Builder + + + + + + org.eclipse.m2e.core.maven2Nature + org.eclipse.jem.workbench.JavaEMFNature + org.eclipse.wst.common.modulecore.ModuleCoreNature + org.eclipse.jdt.core.javanature + org.eclipse.wst.common.project.facet.core.nature + com.google.gwt.eclipse.core.gwtNature + org.eclipse.wst.jsdt.core.jsNature + org.eclipse.pde.PluginNature + + diff --git a/.settings/org.eclipse.core.resources.prefs b/.settings/org.eclipse.core.resources.prefs new file mode 100644 index 0000000..29abf99 --- /dev/null +++ b/.settings/org.eclipse.core.resources.prefs @@ -0,0 +1,6 @@ +eclipse.preferences.version=1 +encoding//src/main/java=UTF-8 +encoding//src/main/resources=UTF-8 +encoding//src/test/java=UTF-8 +encoding//src/test/resources=UTF-8 +encoding/=UTF-8 diff --git a/.settings/org.eclipse.jdt.core.prefs b/.settings/org.eclipse.jdt.core.prefs new file mode 100644 index 0000000..b257af7 --- /dev/null +++ b/.settings/org.eclipse.jdt.core.prefs @@ -0,0 +1,8 @@ +eclipse.preferences.version=1 +org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled +org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.8 +org.eclipse.jdt.core.compiler.compliance=1.7 +org.eclipse.jdt.core.compiler.problem.assertIdentifier=error +org.eclipse.jdt.core.compiler.problem.enumIdentifier=error +org.eclipse.jdt.core.compiler.problem.forbiddenReference=warning +org.eclipse.jdt.core.compiler.source=1.7 diff --git a/.settings/org.eclipse.m2e.core.prefs b/.settings/org.eclipse.m2e.core.prefs new file mode 100644 index 0000000..f897a7f --- /dev/null +++ b/.settings/org.eclipse.m2e.core.prefs @@ -0,0 +1,4 @@ +activeProfiles= +eclipse.preferences.version=1 +resolveWorkspaceProjects=true +version=1 diff --git a/.settings/org.eclipse.wst.common.component b/.settings/org.eclipse.wst.common.component new file mode 100644 index 0000000..08bc278 --- /dev/null +++ b/.settings/org.eclipse.wst.common.component @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/.settings/org.eclipse.wst.common.project.facet.core.prefs.xml b/.settings/org.eclipse.wst.common.project.facet.core.prefs.xml new file mode 100644 index 0000000..cc81385 --- /dev/null +++ b/.settings/org.eclipse.wst.common.project.facet.core.prefs.xml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/.settings/org.eclipse.wst.common.project.facet.core.xml b/.settings/org.eclipse.wst.common.project.facet.core.xml new file mode 100644 index 0000000..f7f0893 --- /dev/null +++ b/.settings/org.eclipse.wst.common.project.facet.core.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/.settings/org.eclipse.wst.validation.prefs b/.settings/org.eclipse.wst.validation.prefs new file mode 100644 index 0000000..04cad8c --- /dev/null +++ b/.settings/org.eclipse.wst.validation.prefs @@ -0,0 +1,2 @@ +disabled=06target +eclipse.preferences.version=1 diff --git a/distro/LICENSE b/distro/LICENSE new file mode 100644 index 0000000..2d9616a --- /dev/null +++ b/distro/LICENSE @@ -0,0 +1 @@ +${gcube.license} \ No newline at end of file diff --git a/distro/README b/distro/README new file mode 100644 index 0000000..21a6f3b --- /dev/null +++ b/distro/README @@ -0,0 +1,68 @@ +The gCube System - ${name} +-------------------------------------------------- + +${description} + + +${gcube.description} + +${gcube.funding} + + +Version +-------------------------------------------------- + +${version} (${buildDate}) + +Please see the file named "changelog.xml" in this directory for the release notes. + + +Authors +-------------------------------------------------- + +* Giancarlo Panichi (giancarlo.panichi-AT-isti.cnr.it), + Istituto di Scienza e Tecnologie dell'Informazione "A. Faedo" CNR, Pisa IT + + +Maintainers +----------- + +* Giancarlo Panichi (giancarlo.panichi-AT-isti.cnr.it), + Istituto di Scienza e Tecnologie dell'Informazione "A. Faedo" CNR, Pisa IT + + +Download information +-------------------------------------------------- + +Source code is available from SVN: + ${scm.url} + +Binaries can be downloaded from the gCube website: + ${gcube.website} + + +Installation +-------------------------------------------------- + +Installation documentation is available on-line in the gCube Wiki: + https://gcube.wiki.gcube-system.org/gcube/Data_Miner_Manager + + +Documentation +-------------------------------------------------- + +Documentation is available on-line in the gCube Wiki: + https://gcube.wiki.gcube-system.org/gcube/Data_Miner_Manager + + +Support +-------------------------------------------------- + +Bugs and support requests can be reported in the gCube issue tracking tool: + ${gcube.issueTracking} + + +Licensing +-------------------------------------------------- + +This software is licensed under the terms you may find in the file named "LICENSE" in this directory. diff --git a/distro/changelog.xml b/distro/changelog.xml new file mode 100644 index 0000000..d6224c6 --- /dev/null +++ b/distro/changelog.xml @@ -0,0 +1,5 @@ + + + First release + + \ No newline at end of file diff --git a/distro/descriptor.xml b/distro/descriptor.xml new file mode 100644 index 0000000..b468e51 --- /dev/null +++ b/distro/descriptor.xml @@ -0,0 +1,32 @@ + + servicearchive + + tar.gz + + / + + + ${distroDirectory} + / + true + + README + LICENSE + changelog.xml + profile.xml + + 755 + true + + + + + target/${build.finalName}.${project.packaging} + /${artifactId} + + + + \ No newline at end of file diff --git a/distro/profile.xml b/distro/profile.xml new file mode 100644 index 0000000..6a7af9b --- /dev/null +++ b/distro/profile.xml @@ -0,0 +1,29 @@ + + + + Service + + ${project.description} + PortletsUser + ${project.artifactId} + 1.0.0 + + + ${project.description} + ${project.artifactId} + ${version} + + ${project.groupId} + ${project.artifactId} + ${project.version} + + webapplication + + ${project.build.finalName}.${project.packaging} + + + + + + + diff --git a/pom.xml b/pom.xml new file mode 100644 index 0000000..e447f83 --- /dev/null +++ b/pom.xml @@ -0,0 +1,385 @@ + + 4.0.0 + + + + maven-parent + org.gcube.tools + 1.0.0 + + + + org.gcube.portlets.user + data-miner-executor + 1.0.0-SNAPSHOT + war + + data-miner-executor + data-miner-executor allows the execution of an algorithm. + + + https://svn.d4science.research-infrastructures.eu/gcube/trunk/portlets/user/data-miner-executor + + + + + + Giancarlo Panichi + g.panichi@isti.cnr.it + CNR Pisa, Istituto di Scienza e Tecnologie dell'Informazione "A. Faedo" + + architect + developer + + + + + + ${project.build.directory}/${project.build.finalName} + distro + config + + + + 1.7 + 1.8 + + + + 2.6.1 + 3.3.2 + 3.1.1 + 2.6.1 + + ${env.KEYS} + + UTF-8 + UTF-8 + + + + + localRun + + + + org.slf4j + slf4j-api + compile + + + org.slf4j + slf4j-log4j12 + runtime + + + + xerces + xerces + 2.4.0 + + + + + + org.gcube.common + storagehub-client-library + runtime + + + + + org.gcube.common + common-authorization + runtime + + + + org.gcube.common + authorization-client + runtime + + + + + + + + + + + com.google.gwt + gwt-user + ${gwtVersion} + provided + + + + com.google.gwt + gwt-servlet + ${gwtVersion} + + + + + + com.sencha.gxt + gxt + ${gxtVersion} + + + + + + javax.portlet + portlet-api + + + + + + org.gcube.core + common-scope-maps + compile + + + + org.gcube.common.portal + portal-manager + provided + + + + org.gcube.dvos + usermanagement-core + provided + + + + org.gcube.portal + client-context-library + [1.0.0-SNAPSHOT,) + compile + + + + + + + org.gcube.common + common-authorization + provided + + + + org.gcube.common + authorization-client + provided + + + + + org.gcube.common + storagehub-client-library + compile + + + + + org.gcube.resources.discovery + ic-client + + + + + org.gcube.data.analysis + data-miner-manager-cl + [1.4.0-SNAPSHOT, 2.0.0-SNAPSHOT) + + + + + + org.gcube.common + csv4j + [1.2.0-SNAPSHOT, 2.0.0-SNAPSHOT) + + + + + + + org.gcube.portlets.widgets + workspace-explorer + [2.0.0-SNAPSHOT,3.0.0-SNAPSHOT) + + + + + org.gcube.portlets.widgets + workspace-uploader + [1.0.0-SNAPSHOT,3.0.0-SNAPSHOT) + + + + + org.gcube.portlets.widgets + openlayer-basic-widgets + [1.0.0-SNAPSHOT,2.0.0-SNAPSHOT) + + + + + org.gcube.portlets.widgets + netcdf-basic-widgets + [1.0.0-SNAPSHOT,2.0.0-SNAPSHOT) + + + + + org.gcube.data.analysis + dataminer-invocation-model + [0.1.0-SNAPSHOT,2.0.0-SNAPSHOT) + + + + + org.projectlombok + lombok + 1.14.4 + + + + + com.allen-sauer.gwt.log + gwt-log + ${gwtLogVersion} + + + + org.slf4j + slf4j-api + provided + + + org.slf4j + slf4j-log4j12 + provided + + + + junit + junit + [3.0.0,4.0.0) + test + + + + + + + + + org.gcube.distribution + maven-portal-bom + LATEST + pom + import + + + + + + + ${webappDirectory}/WEB-INF/classes + + + src/main/resources + + **/*.* + + + + + + + + + + + org.codehaus.mojo + gwt-maven-plugin + ${gwtVersion} + + + + + + + compile + test + + + + + DataMinerExecutor.html + ${webappDirectory} + org.gcube.portlets.user.dataminerexecutor.dataminerexecutor + + + + + + + + org.apache.maven.plugins + maven-war-plugin + 2.1.1 + + + compile + + + + ${webappDirectory} + ${project.build.finalName} + + + + + + + org.apache.maven.plugins + maven-compiler-plugin + 2.3.2 + + ${maven.compiler.source} + ${maven.compiler.target} + + + + + org.apache.maven.plugins + maven-assembly-plugin + + + ${distroDirectory}/descriptor.xml + + + + + servicearchive + install + + single + + + + + + + + + + \ No newline at end of file diff --git a/src/main/java/org/gcube/portlets/user/dataminerexecutor/client/DataMinerExecutor.java b/src/main/java/org/gcube/portlets/user/dataminerexecutor/client/DataMinerExecutor.java new file mode 100644 index 0000000..259ae89 --- /dev/null +++ b/src/main/java/org/gcube/portlets/user/dataminerexecutor/client/DataMinerExecutor.java @@ -0,0 +1,209 @@ +package org.gcube.portlets.user.dataminerexecutor.client; + +import org.gcube.portlets.user.dataminerexecutor.client.common.EventBusProvider; +import org.gcube.portlets.user.dataminerexecutor.client.events.InvocationModelRequestEvent; +import org.gcube.portlets.user.dataminerexecutor.client.events.MenuSwitchEvent; +import org.gcube.portlets.user.dataminerexecutor.client.experiments.ExperimentPanel; +import org.gcube.portlets.user.dataminerexecutor.client.resources.Resources; + +import com.allen_sauer.gwt.log.client.Log; +import com.google.gwt.core.client.EntryPoint; +import com.google.gwt.core.client.GWT; +import com.google.gwt.core.client.Scheduler; +import com.google.gwt.core.client.Scheduler.ScheduledCommand; +import com.google.gwt.user.client.Command; +import com.google.gwt.user.client.ui.RootPanel; +import com.sencha.gxt.core.client.util.Margins; +import com.sencha.gxt.widget.core.client.container.BorderLayoutContainer; +import com.sencha.gxt.widget.core.client.container.BorderLayoutContainer.BorderLayoutData; +import com.sencha.gxt.widget.core.client.container.MarginData; +import com.sencha.gxt.widget.core.client.container.SimpleContainer; +import com.sencha.gxt.widget.core.client.container.Viewport; + +/** + * Entry point classes define onModuleLoad(). + */ +public class DataMinerExecutor implements EntryPoint { + public static final Resources resources = GWT.create(Resources.class); + + private static final String SM_DIV = "contentDiv"; + private DataMinerExecutorController dataMinerExecutorController; + + private Header header; + //private HomePanel homePanel; + private ExperimentPanel experimentPanel; + + //private SimpleContainer previousPanel; + private SimpleContainer centerPanel; + + /** + * {@inheritDoc} + */ + public void onModuleLoad() { + + /* + * Install an UncaughtExceptionHandler which will produce + * FATAL log messages + */ + Log.setUncaughtExceptionHandler(); + + // use deferred command to catch initialization exceptions in + // onModuleLoad2 + Scheduler.get().scheduleDeferred(new ScheduledCommand() { + public void execute() { + // loadScope(); + loadMainPanel(); + } + }); + + } + + /* + * private void loadScope() { + * ClientScopeHelper.getService().setScope(Location.getHref(), new + * AsyncCallback() { + * + * @Override public void onSuccess(Boolean result) { if (result) { + * loadMainPanel(); } else { UtilsGXT3 .info("Attention", + * "ClientScopeHelper has returned a false value!"); } } + * + * @Override public void onFailure(Throwable caught) { + * UtilsGXT3.alert("Error", "Error setting scope: " + + * caught.getLocalizedMessage()); caught.printStackTrace(); } }); + * + * } + */ + + private void loadMainPanel() { + Log.info("DataMinerExecutor"); + + dataMinerExecutorController = new DataMinerExecutorController(); + //homePanel = new HomePanel(); + experimentPanel = new ExperimentPanel(); + + bind(); + + // Layout + final BorderLayoutContainer mainPanelLayout = new BorderLayoutContainer(); + mainPanelLayout.setId("mainPanelLayout"); + mainPanelLayout.setBorders(false); + mainPanelLayout.setResize(true); + mainPanelLayout.getElement().getStyle().setBackgroundColor("#FFFFFF"); + + // Center + centerPanel = new SimpleContainer(); + MarginData mainData = new MarginData(new Margins(0)); + mainPanelLayout.setCenterWidget(centerPanel, mainData); + + // Menu + header = new Header(); + + BorderLayoutData menuData = new BorderLayoutData(40); + menuData.setMargins(new Margins(5)); + menuData.setCollapsible(false); + menuData.setSplit(false); + + mainPanelLayout.setNorthWidget(header, menuData); + + // + + if (dataMinerExecutorController.getDataMinerInvocationModelFileUrl() != null + && !dataMinerExecutorController.getDataMinerInvocationModelFileUrl().isEmpty()) { + centerPanel.add(experimentPanel); + } + + + bindWindow(mainPanelLayout); + + + Scheduler.get().scheduleDeferred(new Command() { + + public void execute() { + mainPanelLayout.forceLayout(); + EventBusProvider.INSTANCE.fireEvent(new InvocationModelRequestEvent()); + } + }); + + + } + + private void bind() { + EventBusProvider.INSTANCE.addHandler(MenuSwitchEvent.TYPE, + new MenuSwitchEvent.MenuSwitchEventHandler() { + + @Override + public void onSelect(MenuSwitchEvent event) { + Log.debug("Catch MenuSwitchEvent"); + menuSwitch(event); + + } + }); + } + + /** + * + * @param mainWidget + */ + private void bindWindow(BorderLayoutContainer mainWidget) { + try { + RootPanel root = RootPanel.get(SM_DIV); + Log.info("Root Panel: " + root); + if (root == null) { + Log.info("Div with id " + SM_DIV + + " not found, starting in dev mode"); + Viewport viewport = new Viewport(); + viewport.setWidget(mainWidget); + viewport.onResize(); + RootPanel.get().add(viewport); + } else { + Log.info("Application div with id " + SM_DIV + + " found, starting in portal mode"); + PortalViewport viewport = new PortalViewport(); + Log.info("Created Viewport"); + viewport.setEnableScroll(false); + viewport.setWidget(mainWidget); + Log.info("Set Widget"); + Log.info("getOffsetWidth(): " + viewport.getOffsetWidth()); + Log.info("getOffsetHeight(): " + viewport.getOffsetHeight()); + viewport.onResize(); + root.add(viewport); + Log.info("Added viewport to root"); + } + } catch (Exception e) { + e.printStackTrace(); + Log.error("Error in attach viewport:" + e.getLocalizedMessage()); + } + } + + /** + * + * @param event + */ + private void menuSwitch(MenuSwitchEvent event) { + if (event == null || event.getMenuType() == null) { + return; + } + + switch (event.getMenuType()) { + case EXPERIMENT: + switchPanel(experimentPanel); + break; + default: + break; + + } + + } + + /** + * + * @param panel + */ + private void switchPanel(SimpleContainer panel) { + /*centerPanel.remove(previousPanel); + centerPanel.add(panel); + centerPanel.forceLayout(); + previousPanel = panel;*/ + } + +} diff --git a/src/main/java/org/gcube/portlets/user/dataminerexecutor/client/DataMinerExecutorController.java b/src/main/java/org/gcube/portlets/user/dataminerexecutor/client/DataMinerExecutorController.java new file mode 100644 index 0000000..9258eee --- /dev/null +++ b/src/main/java/org/gcube/portlets/user/dataminerexecutor/client/DataMinerExecutorController.java @@ -0,0 +1,490 @@ +package org.gcube.portlets.user.dataminerexecutor.client; + +import org.gcube.data.analysis.dataminermanagercl.shared.data.OutputData; +import org.gcube.data.analysis.dataminermanagercl.shared.data.computations.ComputationData; +import org.gcube.data.analysis.dataminermanagercl.shared.data.computations.ComputationId; +import org.gcube.data.analysis.dataminermanagercl.shared.process.Operator; +import org.gcube.data.analysis.dataminermanagercl.shared.workspace.ItemDescription; +import org.gcube.portlets.user.dataminerexecutor.client.common.EventBusProvider; +import org.gcube.portlets.user.dataminerexecutor.client.events.CancelComputationExecutionRequestEvent; +import org.gcube.portlets.user.dataminerexecutor.client.events.CancelExecutionFromComputationsRequestEvent; +import org.gcube.portlets.user.dataminerexecutor.client.events.ComputationDataEvent; +import org.gcube.portlets.user.dataminerexecutor.client.events.ComputationDataRequestEvent; +import org.gcube.portlets.user.dataminerexecutor.client.events.DeleteItemRequestEvent; +import org.gcube.portlets.user.dataminerexecutor.client.events.InvocationModelEvent; +import org.gcube.portlets.user.dataminerexecutor.client.events.InvocationModelRequestEvent; +import org.gcube.portlets.user.dataminerexecutor.client.events.MenuEvent; +import org.gcube.portlets.user.dataminerexecutor.client.events.MenuSwitchEvent; +import org.gcube.portlets.user.dataminerexecutor.client.events.OutputDataEvent; +import org.gcube.portlets.user.dataminerexecutor.client.events.OutputDataRequestEvent; +import org.gcube.portlets.user.dataminerexecutor.client.events.ResubmitComputationExecutionEvent; +import org.gcube.portlets.user.dataminerexecutor.client.events.ResubmitComputationExecutionRequestEvent; +import org.gcube.portlets.user.dataminerexecutor.client.events.SessionExpiredEvent; +import org.gcube.portlets.user.dataminerexecutor.client.events.StartComputationExecutionEvent; +import org.gcube.portlets.user.dataminerexecutor.client.events.StartComputationExecutionRequestEvent; +import org.gcube.portlets.user.dataminerexecutor.client.monitor.StatusMonitor; +import org.gcube.portlets.user.dataminerexecutor.client.rpc.DataMinerExecutorServiceAsync; +import org.gcube.portlets.user.dataminerexecutor.client.type.MenuType; +import org.gcube.portlets.user.dataminerexecutor.client.util.InfoMessageBox; +import org.gcube.portlets.user.dataminerexecutor.client.util.UtilsGXT3; +import org.gcube.portlets.user.dataminerexecutor.shared.Constants; +import org.gcube.portlets.user.dataminerexecutor.shared.exception.SessionExpiredServiceException; +import org.gcube.portlets.user.dataminerexecutor.shared.session.UserInfo; + +import com.allen_sauer.gwt.log.client.Log; +import com.google.gwt.user.client.rpc.AsyncCallback; +import com.sencha.gxt.widget.core.client.box.AutoProgressMessageBox; +import com.sencha.gxt.widget.core.client.event.HideEvent; +import com.sencha.gxt.widget.core.client.event.HideEvent.HideHandler; + +/** + * + * @author Giancarlo Panichi + * + * + */ +public class DataMinerExecutorController { + private UserInfo userInfo; + private String invocationModelFileUrl; + + public DataMinerExecutorController() { + restoreUISession(); + bind(); + callHello(); + checkSession(); + } + + public UserInfo getUserInfo() { + return userInfo; + } + + public String getDataMinerInvocationModelFileUrl() { + return invocationModelFileUrl; + } + + private void checkSession() { + // if you do not need to something when the session expire + // CheckSession.getInstance().startPolling(); + } + + private void sessionExpiredShow() { + // CheckSession.showLogoutDialog(); + } + + /* + * private void sessionExpiredShowDelayed() { Timer timeoutTimer = new + * Timer() { public void run() { sessionExpiredShow(); + * + * } }; int TIMEOUT = 3; // 3 second timeout + * + * timeoutTimer.schedule(TIMEOUT * 1000); // timeout is in milliseconds + * + * } + */ + + private void bind() { + + EventBusProvider.INSTANCE.addHandler(SessionExpiredEvent.TYPE, + new SessionExpiredEvent.SessionExpiredEventHandler() { + + @Override + public void onChange(SessionExpiredEvent event) { + Log.debug("Catch SessionExpiredEvent"); + sessionExpiredShow(); + + } + }); + + EventBusProvider.INSTANCE.addHandler(MenuEvent.TYPE, new MenuEvent.MenuEventHandler() { + + @Override + public void onSelect(MenuEvent event) { + Log.debug("Catch MenuEvent:" + event); + // manageMenuEvent(event); + + } + }); + + EventBusProvider.INSTANCE.addHandler(StartComputationExecutionRequestEvent.TYPE, + new StartComputationExecutionRequestEvent.StartComputationExecutionRequestEventHandler() { + + @Override + public void onStart(StartComputationExecutionRequestEvent event) { + Log.debug("Catch StartComputationExecutionRequestEvent: " + event); + startComputationRequest(event); + + } + }); + + EventBusProvider.INSTANCE.addHandler(CancelComputationExecutionRequestEvent.TYPE, + new CancelComputationExecutionRequestEvent.CancelComputationExecutionRequestEventHandler() { + + @Override + public void onCancel(CancelComputationExecutionRequestEvent event) { + Log.debug("Catch CancelComputationRequestEvent: " + event); + cancelComputationRequest(event); + + } + }); + + EventBusProvider.INSTANCE.addHandler(CancelExecutionFromComputationsRequestEvent.TYPE, + new CancelExecutionFromComputationsRequestEvent.CancelExecutionFromComputationsRequestEventHandler() { + + @Override + public void onCancel(CancelExecutionFromComputationsRequestEvent event) { + Log.debug("Catch CancelExecutionFromComputationsRequestEvent: " + event); + cancelExecutionFromComputationsRequest(event); + + } + + }); + + EventBusProvider.INSTANCE.addHandler(ResubmitComputationExecutionRequestEvent.TYPE, + new ResubmitComputationExecutionRequestEvent.ResubmitComputationExecutionRequestEventHandler() { + + @Override + public void onResubmit(ResubmitComputationExecutionRequestEvent event) { + Log.debug("Catch ResubmitComputationExecutionRequestEvent: " + event); + resubmitComputationRequest(event); + + } + + }); + + EventBusProvider.INSTANCE.addHandler(OutputDataRequestEvent.TYPE, + new OutputDataRequestEvent.OutputDataRequestEventHandler() { + + @Override + public void onOutputRequest(OutputDataRequestEvent event) { + Log.debug("Catch OutputDataRequestEvent: " + event); + manageOutputDataRequestEvent(event); + + } + + }); + + EventBusProvider.INSTANCE.addHandler(ComputationDataRequestEvent.TYPE, + new ComputationDataRequestEvent.ComputationDataRequestEventHandler() { + + @Override + public void onComputationDataRequest(ComputationDataRequestEvent event) { + Log.debug("Catch ComputationDataRequestEvent: " + event); + manageComputationDataRequestEvent(event); + + } + + }); + + EventBusProvider.INSTANCE.addHandler(InvocationModelRequestEvent.TYPE, + new InvocationModelRequestEvent.InvocationModelRequestEventHandler() { + + @Override + public void onInvocationRequest(InvocationModelRequestEvent event) { + Log.debug("Catch InvocationModelRequestEvent: " + event); + getDataMinerInvocationModelRequest(); + + } + }); + + EventBusProvider.INSTANCE.addHandler(DeleteItemRequestEvent.TYPE, + new DeleteItemRequestEvent.DeleteItemRequestEventHandler() { + + @Override + public void onDeleteRequest(DeleteItemRequestEvent event) { + Log.debug("Catch DeleteItemRequestEvent: " + event); + // deleteItemRequest(event); + + } + + }); + + } + + private void restoreUISession() { + // checkLocale(); + invocationModelFileUrl = com.google.gwt.user.client.Window.Location + .getParameter(Constants.DATA_MINER_EXECUTOR_INVOCATION_MODEL); + } + + private void callHello() { + + DataMinerExecutorServiceAsync.INSTANCE.hello(new AsyncCallback() { + + @Override + public void onFailure(Throwable caught) { + if (caught instanceof SessionExpiredServiceException) { + UtilsGXT3.alert("Error", "Expired Session!"); + EventBusProvider.INSTANCE.fireEvent(new SessionExpiredEvent()); + } else { + UtilsGXT3.alert("Error", "No user found: " + caught.getLocalizedMessage()); + } + } + + @Override + public void onSuccess(UserInfo result) { + userInfo = result; + Log.info("Hello: " + userInfo.getUsername()); + } + + }); + + } + + /* + * private void manageMenuEvent(MenuEvent event) { + * Log.debug("CurrentVisualization=" + currentVisualization); if (event == + * null || event.getMenuType() == null || (currentVisualization == null && + * event.getMenuType().compareTo(MenuType.HOME) == 0) || + * (currentVisualization != null && + * event.getMenuType().compareTo(currentVisualization) == 0)) { + * + * return; } currentVisualization = event.getMenuType(); MenuSwitchEvent + * menuSwitchEvent = new MenuSwitchEvent(event.getMenuType()); + * EventBusProvider.INSTANCE.fireEvent(menuSwitchEvent); } + */ + + private void startComputationRequest(final StartComputationExecutionRequestEvent event) { + DataMinerExecutorServiceAsync.INSTANCE.startComputation(event.getOp(), new AsyncCallback() { + + @Override + public void onFailure(Throwable caught) { + if (caught instanceof SessionExpiredServiceException) { + UtilsGXT3.alert("Error", "Expired Session!"); + EventBusProvider.INSTANCE.fireEvent(new SessionExpiredEvent()); + } else { + UtilsGXT3.alert("Error", "Failed start computation " + event.getOp().getName() + "! " + + caught.getLocalizedMessage()); + caught.printStackTrace(); + } + } + + @Override + public void onSuccess(ComputationId computationId) { + if (computationId == null) + UtilsGXT3.alert("Error", + "Failed start computation " + event.getOp().getName() + ", the computation id is null!"); + else { + startComputation(computationId, event.getComputationStatusPanelIndex()); + } + } + }); + + } + + private void startComputation(ComputationId computationId, int computationStatusPanelIndex) { + StartComputationExecutionEvent event = new StartComputationExecutionEvent(computationId, + computationStatusPanelIndex); + EventBusProvider.INSTANCE.fireEvent(event); + } + + private void cancelExecutionFromComputationsRequest(CancelExecutionFromComputationsRequestEvent event) { + final ItemDescription itemDescription = event.getItemDescription(); + DataMinerExecutorServiceAsync.INSTANCE.cancelComputation(itemDescription, new AsyncCallback() { + + @Override + public void onFailure(Throwable caught) { + if (caught instanceof SessionExpiredServiceException) { + UtilsGXT3.alert("Error", "Expired Session!"); + EventBusProvider.INSTANCE.fireEvent(new SessionExpiredEvent()); + } else { + Log.error("Error in cancenExecutionFromComputations:" + caught.getLocalizedMessage()); + UtilsGXT3.alert("Error", "Error in cancel computation " + itemDescription.getName() + ": " + + caught.getLocalizedMessage()); + } + + } + + @Override + public void onSuccess(String result) { + Log.debug("Computation Cancelled!"); + final InfoMessageBox d = new InfoMessageBox("Info", + "Computation cancellation request has been accepted!"); + d.addHideHandler(new HideHandler() { + + public void onHide(HideEvent event) { + // fireRefreshDataMinerWorkAreaEvent(DataMinerWorkAreaElementType.Computations); + } + }); + d.show(); + + } + }); + + } + + private void cancelComputationRequest(CancelComputationExecutionRequestEvent event) { + final ComputationId computationId = event.getComputationId(); + DataMinerExecutorServiceAsync.INSTANCE.cancelComputation(computationId, new AsyncCallback() { + + @Override + public void onFailure(Throwable caught) { + if (caught instanceof SessionExpiredServiceException) { + UtilsGXT3.alert("Error", "Expired Session!"); + EventBusProvider.INSTANCE.fireEvent(new SessionExpiredEvent()); + } else { + UtilsGXT3.alert("Error", "Error in cancel computation " + computationId.getId() + ": " + + caught.getLocalizedMessage()); + } + + } + + @Override + public void onSuccess(String result) { + Log.debug("Computation Cancelled!"); + + } + }); + } + + private void resubmitComputationRequest(final ResubmitComputationExecutionRequestEvent event) { + MenuSwitchEvent menuSwitchEvent = new MenuSwitchEvent(MenuType.EXPERIMENT); + EventBusProvider.INSTANCE.fireEvent(menuSwitchEvent); + + DataMinerExecutorServiceAsync.INSTANCE.resubmit(event.getItemDescription(), new AsyncCallback() { + + @Override + public void onFailure(Throwable caught) { + if (caught instanceof SessionExpiredServiceException) { + UtilsGXT3.alert("Error", "Expired Session!"); + EventBusProvider.INSTANCE.fireEvent(new SessionExpiredEvent()); + } else { + UtilsGXT3.alert("Error", "Failed to resubmit computation: " + caught.getMessage()); + } + } + + @Override + public void onSuccess(ComputationId result) { + if (result == null) + UtilsGXT3.alert("Error", "Failed to resubmit computation, the computation id is null!"); + else { + resubmitComputation(result); + } + + } + }); + } + + private void resubmitComputation(ComputationId computationId) { + ResubmitComputationExecutionEvent event = new ResubmitComputationExecutionEvent(computationId); + EventBusProvider.INSTANCE.fireEvent(event); + } + + private void getDataMinerInvocationModelRequest() { + if (invocationModelFileUrl == null || invocationModelFileUrl.isEmpty()) { + Log.error("Invalid request, the invocation model has not been specified correctly: " + invocationModelFileUrl); + UtilsGXT3.alert("Error", "Invalid request, the invocation model has not been specified correctly!"); + } else { + final AutoProgressMessageBox messageBox = new AutoProgressMessageBox("Retrieve Info", + "Retrieving information, please wait..."); + messageBox.setProgressText("Loading..."); + messageBox.auto(); + messageBox.show(); + + DataMinerExecutorServiceAsync.INSTANCE.getInvocationModel(invocationModelFileUrl, + new AsyncCallback() { + + @Override + public void onFailure(Throwable caught) { + messageBox.hide(); + if (caught instanceof SessionExpiredServiceException) { + UtilsGXT3.alert("Error", "Expired Session"); + EventBusProvider.INSTANCE.fireEvent(new SessionExpiredEvent()); + } else { + UtilsGXT3.alert("Error", + "The VRE currently has problems loading the required operator using the invocation model specified!"); + Log.error( + "The VRE currently has problems loading the required operator using the invocation model specified: " + + caught.getLocalizedMessage(),caught); + + } + + } + + @Override + public void onSuccess(Operator operator) { + messageBox.hide(); + Log.debug("Invocation Retrieved: " + operator); + InvocationModelEvent event = new InvocationModelEvent(operator); + Log.debug("Fire: " + event); + EventBusProvider.INSTANCE.fireEvent(event); + } + + }); + } + } + + private void manageOutputDataRequestEvent(OutputDataRequestEvent event) { + if (event == null) { + UtilsGXT3.alert("Error", "Invalid output request!"); + } else { + if (event.getComputationId() == null || event.getComputationId().getId() == null + || event.getComputationId().getId().isEmpty()) { + UtilsGXT3.alert("Error", "Invalid output request, computation id: " + event.getComputationId()); + } else { + final StatusMonitor monitor = new StatusMonitor(); + DataMinerExecutorServiceAsync.INSTANCE.getOutputDataByComputationId(event.getComputationId(), + new AsyncCallback() { + @Override + public void onSuccess(OutputData outputData) { + monitor.hide(); + fireOutputDataEvent(outputData); + } + + @Override + public void onFailure(Throwable caught) { + monitor.hide(); + Log.error("Error in getResourceByComputationId: " + caught.getLocalizedMessage()); + UtilsGXT3.alert("Error", + "Impossible to retrieve output info. " + caught.getLocalizedMessage()); + + } + }); + } + } + } + + private void fireOutputDataEvent(OutputData outputData) { + OutputDataEvent event = new OutputDataEvent(outputData); + EventBusProvider.INSTANCE.fireEvent(event); + + } + + private void manageComputationDataRequestEvent(ComputationDataRequestEvent event) { + if (event == null) { + UtilsGXT3.alert("Error", "Invalid computation info request!"); + } else { + if (event.getItemDescription() == null || event.getItemDescription().getId() == null + || event.getItemDescription().getId().isEmpty()) { + UtilsGXT3.alert("Error", + "Invalid computation info request, item description: " + event.getItemDescription()); + } else { + final StatusMonitor monitor = new StatusMonitor(); + DataMinerExecutorServiceAsync.INSTANCE.getComputationData(event.getItemDescription(), + new AsyncCallback() { + @Override + public void onSuccess(ComputationData computationData) { + monitor.hide(); + fireComputationDataEvent(computationData); + } + + @Override + public void onFailure(Throwable caught) { + monitor.hide(); + Log.error("Error in getComputationData: " + caught.getLocalizedMessage()); + caught.printStackTrace(); + UtilsGXT3.alert("Error", + "Impossible to retrieve computation info. " + caught.getLocalizedMessage()); + + } + }); + } + } + } + + private void fireComputationDataEvent(ComputationData computationData) { + ComputationDataEvent event = new ComputationDataEvent(computationData); + EventBusProvider.INSTANCE.fireEvent(event); + + } + +} \ No newline at end of file diff --git a/src/main/java/org/gcube/portlets/user/dataminerexecutor/client/Header.java b/src/main/java/org/gcube/portlets/user/dataminerexecutor/client/Header.java new file mode 100644 index 0000000..0267e6b --- /dev/null +++ b/src/main/java/org/gcube/portlets/user/dataminerexecutor/client/Header.java @@ -0,0 +1,181 @@ +/** + * + */ +package org.gcube.portlets.user.dataminerexecutor.client; + +import org.gcube.portlets.user.dataminerexecutor.client.common.EventBusProvider; +import org.gcube.portlets.user.dataminerexecutor.client.events.MenuSwitchEvent; +import org.gcube.portlets.user.dataminerexecutor.client.type.MenuType; +import org.gcube.portlets.user.dataminerexecutor.client.util.UtilsGXT3; + +import com.allen_sauer.gwt.log.client.Log; +import com.google.gwt.event.dom.client.ClickEvent; +import com.google.gwt.event.dom.client.ClickHandler; +import com.google.gwt.resources.client.ResourceCallback; +import com.google.gwt.resources.client.ResourceException; +import com.google.gwt.resources.client.TextResource; +import com.google.gwt.user.client.Window; +import com.google.gwt.user.client.ui.HorizontalPanel; +import com.google.gwt.user.client.ui.Image; + +/** + * + * @author Giancarlo Panichi + * + * + */ +public class Header extends HorizontalPanel { + + // private Image menuGoBack; + //private Image menuExperiment; + private Image menuHelp; + //private Enum currentSelection; + + public Header() { + super(); + create(); + bind(); + } + + private void bind() { + EventBusProvider.INSTANCE.addHandler(MenuSwitchEvent.TYPE, new MenuSwitchEvent.MenuSwitchEventHandler() { + + @Override + public void onSelect(MenuSwitchEvent event) { + Log.debug("Catch MenuSwitchEvent"); + + + } + }); + } + + private void create() { + // this.setStyleAttribute("background-color", "#FFFFFF"); + Image logo = new Image(DataMinerExecutor.resources.logoLittle()); + logo.setAltText("Data Miner Executor"); + logo.setTitle("Data Miner Executor"); + logo.addStyleName("menuImgLogo"); + + /* + * menuGoBack = new Image(DataMinerExecutor.resources.goBack()); + * menuGoBack.addStyleName("menuItemImage"); + * menuGoBack.addClickHandler(new ClickHandler() { + * + * @Override public void onClick(ClickEvent event) { MenuEvent menuEvent + * = new MenuEvent(MenuType.HOME); + * EventBusProvider.INSTANCE.fireEvent(menuEvent); + * + * } }); + */ + + /*menuExperiment = new Image(DataMinerExecutor.resources.menuItemExperiment()); + menuExperiment.addStyleName("menuItemImage"); + menuExperiment.addClickHandler(new ClickHandler() { + @Override + public void onClick(ClickEvent event) { + Log.debug("Click Menu Experiment"); + MenuEvent menuEvent = new MenuEvent(MenuType.EXPERIMENT); + EventBusProvider.INSTANCE.fireEvent(menuEvent); + } + });*/ + + menuHelp = new Image(DataMinerExecutor.resources.menuItemHelp()); + menuHelp.addStyleName("menuItemImage"); + menuHelp.addClickHandler(new ClickHandler() { + + @Override + public void onClick(ClickEvent event) { + Log.debug("Click Menu Help"); + showHelp(); + } + }); + + add(logo); + // add(menuGoBack); + //add(menuExperiment); + add(menuHelp); + + this.setCellWidth(logo, "100px"); + // this.setCellWidth(menuGoBack, "100px"); + //this.setCellWidth(menuExperiment, "80px"); // + this.setCellWidth(menuHelp, "80px"); + + // menuGoBack.setVisible(false); + //menuExperiment.setVisible(true); + menuHelp.setVisible(true); + } + + public void setMenu(MenuType menuType) { + Log.debug("SetMenu: " + menuType); + menuHelp.setVisible(true); + + /*if (currentSelection == null) { + // menuGoBack.setVisible(true); + //menuExperiment.setVisible(true); + } + + if (currentSelection != null && currentSelection.compareTo(MenuType.EXPERIMENT) == 0) + menuExperiment.removeStyleName("menuItemImage-selected"); + + Image imgNew = menuExperiment; + + imgNew.addStyleName("menuItemImage-selected"); + */ + //currentSelection = menuType; + return; + } + + /* + private void menuSwitch(MenuSwitchEvent event) { + Log.debug("MenuSwitch: " + event); + + if (event.getMenuType().compareTo(MenuType.HOME) == 0) { + // menuGoBack.setVisible(false); + menuExperiment.setVisible(false); + menuHelp.setVisible(false); + + if (currentSelection != null && currentSelection.compareTo(MenuType.EXPERIMENT) == 0) + menuExperiment.removeStyleName("menuItemImage-selected"); + } else { + if (currentSelection == null + || (currentSelection != null && currentSelection.compareTo(MenuType.HOME) == 0)) { + // menuGoBack.setVisible(true); + menuExperiment.setVisible(true); + menuHelp.setVisible(true); + } + + if (currentSelection != null && currentSelection.compareTo(MenuType.EXPERIMENT) == 0) + menuExperiment.removeStyleName("menuItemImage-selected"); + + Image imgNew = menuExperiment; + + imgNew.addStyleName("menuItemImage-selected"); + } + + currentSelection = event.getMenuType(); + return; + }*/ + + private void showHelp() { + try { + DataMinerExecutor.resources.wikiLink().getText(new ResourceCallback() { + public void onError(ResourceException e) { + Log.error("Error retrieving wiki link!: " + e.getLocalizedMessage()); + UtilsGXT3.alert("Error", "Error retrieving wiki link!"); + } + + public void onSuccess(TextResource r) { + String s = r.getText(); + Window.open(s, "DMExecutor Wiki", ""); + } + }); + } catch (ResourceException e) { + Log.error("Error retrieving wiki link!: " + e.getLocalizedMessage()); + UtilsGXT3.alert("Error", "Error retrieving wiki link!"); + e.printStackTrace(); + + } + + } + +} diff --git a/src/main/java/org/gcube/portlets/user/dataminerexecutor/client/HomePanel.java b/src/main/java/org/gcube/portlets/user/dataminerexecutor/client/HomePanel.java new file mode 100644 index 0000000..43194bf --- /dev/null +++ b/src/main/java/org/gcube/portlets/user/dataminerexecutor/client/HomePanel.java @@ -0,0 +1,124 @@ +package org.gcube.portlets.user.dataminerexecutor.client; + +import org.gcube.portlets.user.dataminerexecutor.client.common.EventBusProvider; +import org.gcube.portlets.user.dataminerexecutor.client.events.MenuEvent; +import org.gcube.portlets.user.dataminerexecutor.client.type.MenuType; + +import com.google.gwt.event.dom.client.MouseDownEvent; +import com.google.gwt.event.dom.client.MouseDownHandler; +import com.google.gwt.resources.client.ImageResource; +import com.google.gwt.user.client.ui.HTML; +import com.google.gwt.user.client.ui.Image; +import com.sencha.gxt.core.client.dom.ScrollSupport.ScrollMode; +import com.sencha.gxt.core.client.util.Margins; +import com.sencha.gxt.widget.core.client.container.BoxLayoutContainer.BoxLayoutData; +import com.sencha.gxt.widget.core.client.container.BoxLayoutContainer.BoxLayoutPack; +import com.sencha.gxt.widget.core.client.container.HBoxLayoutContainer; +import com.sencha.gxt.widget.core.client.container.HBoxLayoutContainer.HBoxLayoutAlign; +//import com.sencha.gxt.widget.core.client.container.HorizontalLayoutContainer.HorizontalLayoutData; +import com.sencha.gxt.widget.core.client.container.SimpleContainer; +import com.sencha.gxt.widget.core.client.container.VerticalLayoutContainer; +import com.sencha.gxt.widget.core.client.container.VerticalLayoutContainer.VerticalLayoutData; + +/** + * + * @author Giancarlo Panichi + * + * + */ +public class HomePanel extends SimpleContainer { + + public HomePanel() { + super(); + init(); + create(); + } + + private void init() { + setItemId("HomePanel"); + setStylePrimaryName("smMenu"); + //setBodyStyle("backgroundColor:white;"); + //addStyleName("smLayoutContainer"); + //setHeaderVisible(false); + setBorders(false); + //setBodyBorder(false); + + } + + private void create() { + VerticalLayoutContainer lc = new VerticalLayoutContainer(); + lc.setScrollMode(ScrollMode.AUTO); + + VerticalLayoutData layoutTop = new VerticalLayoutData(1, -1, + new Margins(20,0,10,0)); + //VerticalLayoutData layoutNext = new VerticalLayoutData(1, -1, + // new Margins(10,0,10,0)); + + SimpleContainer itemExperiment = createMenuItem( + "Execute an Experiment", + "This section allows to execute or prepare an online experiment or method. The section is endowed with a list of algorithms for executing models for various application domains.", + DataMinerExecutor.resources.executionIcon(), new MouseDownHandler() { + + @Override + public void onMouseDown(MouseDownEvent event) { + MenuEvent menuEvent=new MenuEvent(MenuType.EXPERIMENT); + EventBusProvider.INSTANCE.fireEvent(menuEvent); + + + + } + }); + + lc.add(itemExperiment, layoutTop); + + add(lc); + + } + + private SimpleContainer createMenuItem(String title, String description, + ImageResource imgResource, MouseDownHandler handle) { + HBoxLayoutContainer horiz=new HBoxLayoutContainer(HBoxLayoutAlign.MIDDLE); + horiz.setPack(BoxLayoutPack.CENTER); + horiz.setEnableOverflow(false); + + //HorizontalLayoutContainer horiz = new HorizontalLayoutContainer(); + + Image img = new Image(imgResource); + + HTML text = new HTML("" + title + "
" + description); + text.addStyleName("smMenuItemText"); + text.setWidth("400px"); + /*HorizontalLayoutData textLayoutData = new HorizontalLayoutData(400, + 140, new Margins(10, 5, 10, 10)); + HorizontalLayoutData imgLayoutData = new HorizontalLayoutData(140, 140, + new Margins(10, 10, 10, 5));*/ + + //horiz.add(text, textLayoutData); + //horiz.add(img, imgLayoutData); + + horiz.add(text, new BoxLayoutData(new Margins(0))); + horiz.add(img,new BoxLayoutData(new Margins(0))); + + + SimpleContainer container = new SimpleContainer(); + container.addDomHandler(handle, MouseDownEvent.getType()); + + container.setWidth(540); + container.setHeight(160); + container.addStyleName("smMenuItem"); + container.addStyleOnOver(container.getElement(), "smMenuItem:HOVER"); + container.add(horiz); + + SimpleContainer container2 = new SimpleContainer(); + HBoxLayoutContainer hbox=new HBoxLayoutContainer(HBoxLayoutAlign.MIDDLE); + hbox.setPack(BoxLayoutPack.CENTER); + hbox.setEnableOverflow(false); + hbox.add(container, new BoxLayoutData(new Margins(0))); + container2.add(hbox); + return container2; + } + + + + +} diff --git a/src/main/java/org/gcube/portlets/user/dataminerexecutor/client/PortalViewport.java b/src/main/java/org/gcube/portlets/user/dataminerexecutor/client/PortalViewport.java new file mode 100644 index 0000000..eef1833 --- /dev/null +++ b/src/main/java/org/gcube/portlets/user/dataminerexecutor/client/PortalViewport.java @@ -0,0 +1,153 @@ +/** + * + */ +package org.gcube.portlets.user.dataminerexecutor.client; + +import com.allen_sauer.gwt.log.client.Log; +import com.google.gwt.core.client.GWT; +import com.google.gwt.dom.client.Element; +import com.google.gwt.safehtml.shared.SafeHtmlBuilder; +import com.google.gwt.user.client.Window; +import com.sencha.gxt.core.client.dom.XDOM; +import com.sencha.gxt.core.client.dom.XElement; +import com.sencha.gxt.widget.core.client.container.SimpleContainer; +import com.sencha.gxt.widget.core.client.container.Viewport.ViewportAppearance; + +/** + * + * @author Giancarlo Panichi + * + * + */ +public class PortalViewport extends SimpleContainer { + + protected int rightScrollBarSize = 17; + + protected boolean enableScroll; + + + /** + * Creates a viewport layout container with the default appearance. + */ + public PortalViewport() { + this(GWT. create(ViewportAppearance.class)); + } + + /** + * Creates a viewport layout container with the specified appearance. + * + * @param appearance + * the appearance of the viewport layout container + */ + public PortalViewport(ViewportAppearance appearance) { + super(true); + try { + + SafeHtmlBuilder sb = new SafeHtmlBuilder(); + appearance.render(sb); + XElement element=XDOM.create(sb.toSafeHtml()); + setElement((Element)element); + monitorWindowResize = true; + forceLayoutOnResize = true; + getFocusSupport().setIgnore(false); + resize(); + } catch (Exception e) { + Log.error("PortalViewport: constructor error " + + e.getLocalizedMessage()); + } + } + + /** + * Returns true if window scrolling is enabled. + * + * @return true if window scrolling is enabled + */ + public boolean isEnableScroll() { + return enableScroll; + } + + /** + * Sets whether window scrolling is enabled. + * + * @param enableScroll + * true to enable window scrolling + */ + public void setEnableScroll(boolean enableScroll) { + this.enableScroll = enableScroll; + Window.enableScrolling(enableScroll); + } + + /** + * @return the rightScrollBarSize + */ + public int getRightScrollBarSize() { + return rightScrollBarSize; + } + + /** + * @param rightScrollBarSize + * the rightScrollBarSize to set + */ + public void setRightScrollBarSize(int rightScrollBarSize) { + this.rightScrollBarSize = rightScrollBarSize; + } + + @Override + protected void onAttach() { + super.onAttach(); + setEnableScroll(enableScroll); + resize(); + + } + + protected void resize() { + int viewWidth; + if(enableScroll){ + viewWidth= calculateWidth() - rightScrollBarSize; + } else { + viewWidth = calculateWidth(); + } + + int viewHeight = calculateHeight(); + Log.info("DataMiner resize viewWidth: " + viewWidth + " viewHeight: " + + viewHeight + " clientWidth: " + Window.getClientWidth() + + " clientHeight: " + Window.getClientHeight()); + try { + setPixelSize(viewWidth, viewHeight); + } catch (Exception e) { + Log.error("PortalViewport: error in resize() at setPixelSize " + + e.getLocalizedMessage()); + } + } + + /** + * {@inheritDoc} + */ + @Override + protected void onWindowResize(int width, int height) { + int viewWidth = calculateWidth(); + int viewHeight = calculateHeight(); + Log.trace("DataMiner onWindowResize viewWidth: " + viewWidth + + " viewHeight: " + viewHeight + " clientWidth: " + + Window.getClientWidth() + " clientHeight: " + + Window.getClientHeight()); + setPixelSize(viewWidth, viewHeight); + } + + + + protected int calculateWidth() { + int leftBorder = getAbsoluteLeft(); + Log.info("DataMiner width: " + + String.valueOf(Window.getClientWidth() - 2 * leftBorder)); + return Window.getClientWidth() - 2 * leftBorder; + } + + protected int calculateHeight() { + int topBorder = getAbsoluteTop(); + Log.info("DataMiner height: " + + String.valueOf(Window.getClientHeight() - topBorder - 34)); + return Window.getClientHeight() - topBorder - 34; + } + +} diff --git a/src/main/java/org/gcube/portlets/user/dataminerexecutor/client/common/EventBusProvider.java b/src/main/java/org/gcube/portlets/user/dataminerexecutor/client/common/EventBusProvider.java new file mode 100644 index 0000000..ab4bdae --- /dev/null +++ b/src/main/java/org/gcube/portlets/user/dataminerexecutor/client/common/EventBusProvider.java @@ -0,0 +1,19 @@ +/** + * + */ +package org.gcube.portlets.user.dataminerexecutor.client.common; + +import com.google.gwt.event.shared.EventBus; +import com.google.gwt.event.shared.SimpleEventBus; + +/** + * + * @author Giancarlo Panichi + * + * + */ +public class EventBusProvider { + + public static final EventBus INSTANCE = new SimpleEventBus(); + +} diff --git a/src/main/java/org/gcube/portlets/user/dataminerexecutor/client/custom/Gxt2ZIndexXDOM.java b/src/main/java/org/gcube/portlets/user/dataminerexecutor/client/custom/Gxt2ZIndexXDOM.java new file mode 100644 index 0000000..a969a9e --- /dev/null +++ b/src/main/java/org/gcube/portlets/user/dataminerexecutor/client/custom/Gxt2ZIndexXDOM.java @@ -0,0 +1,21 @@ +package org.gcube.portlets.user.dataminerexecutor.client.custom; + +/** + * Fix for z-index bug between GXT3 and GXT2 + * + * @author Giancarlo Panichi + * + * + */ +public class Gxt2ZIndexXDOM extends + com.sencha.gxt.core.client.dom.XDOM.XDOMImpl { + + /* + public int getTopZIndex() { + return com.extjs.gxt.ui.client.core.XDOM.getTopZIndex(); + } + + public int getTopZIndex(int i) { + return com.extjs.gxt.ui.client.core.XDOM.getTopZIndex(i); + }*/ +} \ No newline at end of file diff --git a/src/main/java/org/gcube/portlets/user/dataminerexecutor/client/custom/progress/GreenProgressBar.css b/src/main/java/org/gcube/portlets/user/dataminerexecutor/client/custom/progress/GreenProgressBar.css new file mode 100644 index 0000000..1e27d40 --- /dev/null +++ b/src/main/java/org/gcube/portlets/user/dataminerexecutor/client/custom/progress/GreenProgressBar.css @@ -0,0 +1,50 @@ +/** +* +*/ +.progressWrapGreen { + border: 1px solid #65cf81; + overflow: hidden; +} + +@sprite .progressInnerGreen { + background-color: #e0f3e5; + gwt-image: 'innerBarGreen'; + height: auto; + position: relative; +} + +@sprite .progressBarGreen { + background-color: #9ceeb0; + gwt-image: 'barGreen'; + background-repeat: repeat-x; + background-position: left center; + height: 18px; + border-top-color: #d1fdd9; + border-bottom-color: #7fe498; + border-right-color: #7fe498; +} + +.progressTextGreen { + color: #fff; + text-align: center; + font-size: 11px; + font-weight: bold; + font-family: sans-serif; + padding: 1px 5px; + overflow: hidden; + position: absolute; + z-index: 99; +} + +.progressTextBackGreen { + color: #399544 !important; + z-index: 9 !important; +} + +@if user.agent ie6 ie8 ie9 { + .progressTextBackGreen { + line-height: 15px; + color: #953941 !important; + z-index: 9 !important; + } +} \ No newline at end of file diff --git a/src/main/java/org/gcube/portlets/user/dataminerexecutor/client/custom/progress/GreenProgressBar.html b/src/main/java/org/gcube/portlets/user/dataminerexecutor/client/custom/progress/GreenProgressBar.html new file mode 100644 index 0000000..84e6165 --- /dev/null +++ b/src/main/java/org/gcube/portlets/user/dataminerexecutor/client/custom/progress/GreenProgressBar.html @@ -0,0 +1,12 @@ +
+
+
+
+
{text}
+
+
+
{text}
+
+
+
+
diff --git a/src/main/java/org/gcube/portlets/user/dataminerexecutor/client/custom/progress/GreenProgressBar.java b/src/main/java/org/gcube/portlets/user/dataminerexecutor/client/custom/progress/GreenProgressBar.java new file mode 100644 index 0000000..7dc2a2c --- /dev/null +++ b/src/main/java/org/gcube/portlets/user/dataminerexecutor/client/custom/progress/GreenProgressBar.java @@ -0,0 +1,18 @@ +package org.gcube.portlets.user.dataminerexecutor.client.custom.progress; + +import com.sencha.gxt.cell.core.client.ProgressBarCell; +import com.sencha.gxt.widget.core.client.ProgressBar; + +/** + * + * @author Giancarlo Panichi + * + * + */ +public class GreenProgressBar extends ProgressBar { + + public GreenProgressBar() { + super(new ProgressBarCell(new GreenProgressBarAppearance())); + } + +} diff --git a/src/main/java/org/gcube/portlets/user/dataminerexecutor/client/custom/progress/GreenProgressBarAppearance.java b/src/main/java/org/gcube/portlets/user/dataminerexecutor/client/custom/progress/GreenProgressBarAppearance.java new file mode 100644 index 0000000..1a75e41 --- /dev/null +++ b/src/main/java/org/gcube/portlets/user/dataminerexecutor/client/custom/progress/GreenProgressBarAppearance.java @@ -0,0 +1,132 @@ +package org.gcube.portlets.user.dataminerexecutor.client.custom.progress; + +import com.google.gwt.core.client.GWT; +import com.google.gwt.resources.client.ClientBundle; +import com.google.gwt.resources.client.CssResource; +import com.google.gwt.resources.client.ImageResource; +import com.google.gwt.resources.client.ImageResource.ImageOptions; +import com.google.gwt.resources.client.ImageResource.RepeatStyle; +import com.google.gwt.safecss.shared.SafeStyles; +import com.google.gwt.safecss.shared.SafeStylesUtils; +import com.google.gwt.safehtml.shared.SafeHtml; +import com.google.gwt.safehtml.shared.SafeHtmlBuilder; +import com.google.gwt.safehtml.shared.SafeHtmlUtils; +import com.sencha.gxt.cell.core.client.ProgressBarCell.ProgressBarAppearance; +import com.sencha.gxt.cell.core.client.ProgressBarCell.ProgressBarAppearanceOptions; +import com.sencha.gxt.core.client.GXT; +import com.sencha.gxt.core.client.XTemplates; +import com.sencha.gxt.core.client.util.Format; + +/** + * + * @author Giancarlo Panichi + * + * + */ +public class GreenProgressBarAppearance implements ProgressBarAppearance { + + public interface GreenProgressBarResources { + + ImageResource barGreen(); + + ImageResource innerBarGreen(); + + GreenProgressBarStyle style(); + + } + + public interface GreenProgressBarStyle extends CssResource { + + String progressBarGreen(); + + String progressInnerGreen(); + + String progressTextGreen(); + + String progressTextBackGreen(); + + String progressWrapGreen(); + + } + + public interface GreenProgressBarTemplate extends XTemplates { + + @XTemplate(source = "GreenProgressBar.html") + SafeHtml render(SafeHtml text, GreenProgressBarStyle style, + SafeStyles wrapStyles, SafeStyles progressBarStyles, + SafeStyles progressTextStyles, SafeStyles widthStyles); + + } + + public interface GreenProgressBarDefaultResources extends + GreenProgressBarResources, ClientBundle { + + @Source({ "GreenProgressBar.css" }) + @Override + GreenProgressBarStyle style(); + + @Source("green-progress-bg.gif") + @ImageOptions(repeatStyle = RepeatStyle.Horizontal) + @Override + ImageResource barGreen(); + + @Source("green-bg.gif") + @ImageOptions(repeatStyle = RepeatStyle.Horizontal) + @Override + ImageResource innerBarGreen(); + } + + private final GreenProgressBarStyle style; + private GreenProgressBarTemplate template; + + + public GreenProgressBarAppearance() { + this( + GWT. create(GreenProgressBarDefaultResources.class), + GWT. create(GreenProgressBarTemplate.class)); + } + + public GreenProgressBarAppearance(GreenProgressBarResources resources, + GreenProgressBarTemplate template) { + this.style = resources.style(); + this.style.ensureInjected(); + this.template = template; + } + + @Override + public void render(SafeHtmlBuilder sb, Double value, + ProgressBarAppearanceOptions options) { + value = value == null ? 0 : value; + double valueWidth = value * options.getWidth(); + + int vw = new Double(valueWidth).intValue(); + + String text = options.getProgressText(); + + if (text != null) { + int v = (int) Math.round(value * 100); + text = Format.substitute(text, v); + } + + SafeHtml txt; + if (text == null) { + txt = SafeHtmlUtils.fromSafeConstant(" "); + } else { + txt = SafeHtmlUtils.fromString(text); + } + + int adj = GXT.isIE() ? 4 : 2; + + SafeStyles wrapStyles = SafeStylesUtils.fromTrustedString("width:" + + (options.getWidth() - adj) + "px;"); + SafeStyles progressBarStyles = SafeStylesUtils + .fromTrustedString("width:" + vw + "px;"); + SafeStyles progressTextStyles = SafeStylesUtils + .fromTrustedString("width:" + Math.max(vw - 8, 0) + "px;"); + SafeStyles widthStyles = SafeStylesUtils.fromTrustedString("width:" + + (Math.max(0, options.getWidth() - adj)) + "px;"); + sb.append(template.render(txt, style, wrapStyles, progressBarStyles, + progressTextStyles, widthStyles)); + } + +} diff --git a/src/main/java/org/gcube/portlets/user/dataminerexecutor/client/custom/progress/OrangeProgressBar.css b/src/main/java/org/gcube/portlets/user/dataminerexecutor/client/custom/progress/OrangeProgressBar.css new file mode 100644 index 0000000..f98a880 --- /dev/null +++ b/src/main/java/org/gcube/portlets/user/dataminerexecutor/client/custom/progress/OrangeProgressBar.css @@ -0,0 +1,50 @@ +/** +* +*/ +.progressWrapOrange { + border: 1px solid #ffd075; + overflow: hidden; +} + +@sprite .progressInnerOrange { + background-color: #f3ede0; + gwt-image: 'innerBarOrange'; + height: auto; + position: relative; +} + +@sprite .progressBarOrange { + background-color: #ffdf9f; + gwt-image: 'barOrange'; + background-repeat: repeat-x; + background-position: left center; + height: 18px; + border-top-color: #fdefd1; + border-bottom-color: #f9d793; + border-right-color: #ffdd97; +} + +.progressTextOrange { + color: #fff; + text-align: center; + font-size: 11px; + font-weight: bold; + font-family: sans-serif; + padding: 1px 5px; + overflow: hidden; + position: absolute; + z-index: 99; +} + +.progressTextBackOrange { + color: #ffaf0d!important; + z-index: 9 !important; +} + +@if user.agent ie6 ie8 ie9 { + .progressTextBackOrange { + line-height: 15px; + color: #ffaa00!important; + z-index: 9 !important; + } +} \ No newline at end of file diff --git a/src/main/java/org/gcube/portlets/user/dataminerexecutor/client/custom/progress/OrangeProgressBar.html b/src/main/java/org/gcube/portlets/user/dataminerexecutor/client/custom/progress/OrangeProgressBar.html new file mode 100644 index 0000000..cfefcb6 --- /dev/null +++ b/src/main/java/org/gcube/portlets/user/dataminerexecutor/client/custom/progress/OrangeProgressBar.html @@ -0,0 +1,12 @@ +
+
+
+
+
{text}
+
+
+
{text}
+
+
+
+
diff --git a/src/main/java/org/gcube/portlets/user/dataminerexecutor/client/custom/progress/OrangeProgressBar.java b/src/main/java/org/gcube/portlets/user/dataminerexecutor/client/custom/progress/OrangeProgressBar.java new file mode 100644 index 0000000..88c7d1b --- /dev/null +++ b/src/main/java/org/gcube/portlets/user/dataminerexecutor/client/custom/progress/OrangeProgressBar.java @@ -0,0 +1,18 @@ +package org.gcube.portlets.user.dataminerexecutor.client.custom.progress; + +import com.sencha.gxt.cell.core.client.ProgressBarCell; +import com.sencha.gxt.widget.core.client.ProgressBar; + +/** + * + * @author Giancarlo Panichi + * + * + */ +public class OrangeProgressBar extends ProgressBar { + + public OrangeProgressBar() { + super(new ProgressBarCell(new OrangeProgressBarAppearance())); + } + +} diff --git a/src/main/java/org/gcube/portlets/user/dataminerexecutor/client/custom/progress/OrangeProgressBarAppearance.java b/src/main/java/org/gcube/portlets/user/dataminerexecutor/client/custom/progress/OrangeProgressBarAppearance.java new file mode 100644 index 0000000..26f659f --- /dev/null +++ b/src/main/java/org/gcube/portlets/user/dataminerexecutor/client/custom/progress/OrangeProgressBarAppearance.java @@ -0,0 +1,132 @@ +package org.gcube.portlets.user.dataminerexecutor.client.custom.progress; + +import com.google.gwt.core.client.GWT; +import com.google.gwt.resources.client.ClientBundle; +import com.google.gwt.resources.client.CssResource; +import com.google.gwt.resources.client.ImageResource; +import com.google.gwt.resources.client.ImageResource.ImageOptions; +import com.google.gwt.resources.client.ImageResource.RepeatStyle; +import com.google.gwt.safecss.shared.SafeStyles; +import com.google.gwt.safecss.shared.SafeStylesUtils; +import com.google.gwt.safehtml.shared.SafeHtml; +import com.google.gwt.safehtml.shared.SafeHtmlBuilder; +import com.google.gwt.safehtml.shared.SafeHtmlUtils; +import com.sencha.gxt.cell.core.client.ProgressBarCell.ProgressBarAppearance; +import com.sencha.gxt.cell.core.client.ProgressBarCell.ProgressBarAppearanceOptions; +import com.sencha.gxt.core.client.GXT; +import com.sencha.gxt.core.client.XTemplates; +import com.sencha.gxt.core.client.util.Format; + +/** + * + * @author Giancarlo Panichi + * + * + */ +public class OrangeProgressBarAppearance implements ProgressBarAppearance { + + public interface OrangeProgressBarResources { + + ImageResource barOrange(); + + ImageResource innerBarOrange(); + + OrangeProgressBarStyle style(); + + } + + public interface OrangeProgressBarStyle extends CssResource { + + String progressBarOrange(); + + String progressInnerOrange(); + + String progressTextOrange(); + + String progressTextBackOrange(); + + String progressWrapOrange(); + + } + + public interface OrangeProgressBarTemplate extends XTemplates { + + @XTemplate(source = "OrangeProgressBar.html") + SafeHtml render(SafeHtml text, OrangeProgressBarStyle style, + SafeStyles wrapStyles, SafeStyles progressBarStyles, + SafeStyles progressTextStyles, SafeStyles widthStyles); + + } + + public interface OrangeProgressBarDefaultResources extends + OrangeProgressBarResources, ClientBundle { + + @Source({ "OrangeProgressBar.css" }) + @Override + OrangeProgressBarStyle style(); + + @Source("orange-progress-bg.gif") + @ImageOptions(repeatStyle = RepeatStyle.Horizontal) + @Override + ImageResource barOrange(); + + @Source("orange-bg.gif") + @ImageOptions(repeatStyle = RepeatStyle.Horizontal) + @Override + ImageResource innerBarOrange(); + } + + private final OrangeProgressBarStyle style; + private OrangeProgressBarTemplate template; + + + public OrangeProgressBarAppearance() { + this( + GWT. create(OrangeProgressBarDefaultResources.class), + GWT. create(OrangeProgressBarTemplate.class)); + } + + public OrangeProgressBarAppearance(OrangeProgressBarResources resources, + OrangeProgressBarTemplate template) { + this.style = resources.style(); + this.style.ensureInjected(); + this.template = template; + } + + @Override + public void render(SafeHtmlBuilder sb, Double value, + ProgressBarAppearanceOptions options) { + value = value == null ? 0 : value; + double valueWidth = value * options.getWidth(); + + int vw = new Double(valueWidth).intValue(); + + String text = options.getProgressText(); + + if (text != null) { + int v = (int) Math.round(value * 100); + text = Format.substitute(text, v); + } + + SafeHtml txt; + if (text == null) { + txt = SafeHtmlUtils.fromSafeConstant(" "); + } else { + txt = SafeHtmlUtils.fromString(text); + } + + int adj = GXT.isIE() ? 4 : 2; + + SafeStyles wrapStyles = SafeStylesUtils.fromTrustedString("width:" + + (options.getWidth() - adj) + "px;"); + SafeStyles progressBarStyles = SafeStylesUtils + .fromTrustedString("width:" + vw + "px;"); + SafeStyles progressTextStyles = SafeStylesUtils + .fromTrustedString("width:" + Math.max(vw - 8, 0) + "px;"); + SafeStyles widthStyles = SafeStylesUtils.fromTrustedString("width:" + + (Math.max(0, options.getWidth() - adj)) + "px;"); + sb.append(template.render(txt, style, wrapStyles, progressBarStyles, + progressTextStyles, widthStyles)); + } + +} diff --git a/src/main/java/org/gcube/portlets/user/dataminerexecutor/client/custom/progress/RedProgressBar.css b/src/main/java/org/gcube/portlets/user/dataminerexecutor/client/custom/progress/RedProgressBar.css new file mode 100644 index 0000000..306668e --- /dev/null +++ b/src/main/java/org/gcube/portlets/user/dataminerexecutor/client/custom/progress/RedProgressBar.css @@ -0,0 +1,50 @@ +/** +* +*/ +.progressWrapRed { + border: 1px solid #cf656f; + overflow: hidden; +} + +@sprite .progressInnerRed { + background-color: #f3e0e2; + gwt-image: 'innerBarRed'; + height: auto; + position: relative; +} + +@sprite .progressBarRed { + background-color: #ee9ca4; + gwt-image: 'barRed'; + background-repeat: repeat-x; + background-position: left center; + height: 18px; + border-top-color: #fdd1d5; + border-bottom-color: #e47f88; + border-right-color: #e47f88; +} + +.progressTextRed { + color: #fff; + text-align: center; + font-size: 11px; + font-weight: bold; + font-family: sans-serif; + padding: 1px 5px; + overflow: hidden; + position: absolute; + z-index: 99; +} + +.progressTextBackRed { + color: #953941 !important; + z-index: 9 !important; +} + +@if user.agent ie6 ie8 ie9 { + .progressTextBackRed { + line-height: 15px; + color: #953941 !important; + z-index: 9 !important; + } +} \ No newline at end of file diff --git a/src/main/java/org/gcube/portlets/user/dataminerexecutor/client/custom/progress/RedProgressBar.html b/src/main/java/org/gcube/portlets/user/dataminerexecutor/client/custom/progress/RedProgressBar.html new file mode 100644 index 0000000..918b724 --- /dev/null +++ b/src/main/java/org/gcube/portlets/user/dataminerexecutor/client/custom/progress/RedProgressBar.html @@ -0,0 +1,12 @@ +
+
+
+
+
{text}
+
+
+
{text}
+
+
+
+
diff --git a/src/main/java/org/gcube/portlets/user/dataminerexecutor/client/custom/progress/RedProgressBar.java b/src/main/java/org/gcube/portlets/user/dataminerexecutor/client/custom/progress/RedProgressBar.java new file mode 100644 index 0000000..5da929c --- /dev/null +++ b/src/main/java/org/gcube/portlets/user/dataminerexecutor/client/custom/progress/RedProgressBar.java @@ -0,0 +1,18 @@ +package org.gcube.portlets.user.dataminerexecutor.client.custom.progress; + +import com.sencha.gxt.cell.core.client.ProgressBarCell; +import com.sencha.gxt.widget.core.client.ProgressBar; + +/** + * + * @author Giancarlo Panichi + * + * + */ +public class RedProgressBar extends ProgressBar { + + public RedProgressBar() { + super(new ProgressBarCell(new RedProgressBarAppearance())); + } + +} diff --git a/src/main/java/org/gcube/portlets/user/dataminerexecutor/client/custom/progress/RedProgressBarAppearance.java b/src/main/java/org/gcube/portlets/user/dataminerexecutor/client/custom/progress/RedProgressBarAppearance.java new file mode 100644 index 0000000..8525920 --- /dev/null +++ b/src/main/java/org/gcube/portlets/user/dataminerexecutor/client/custom/progress/RedProgressBarAppearance.java @@ -0,0 +1,132 @@ +package org.gcube.portlets.user.dataminerexecutor.client.custom.progress; + +import com.google.gwt.core.client.GWT; +import com.google.gwt.resources.client.ClientBundle; +import com.google.gwt.resources.client.CssResource; +import com.google.gwt.resources.client.ImageResource; +import com.google.gwt.resources.client.ImageResource.ImageOptions; +import com.google.gwt.resources.client.ImageResource.RepeatStyle; +import com.google.gwt.safecss.shared.SafeStyles; +import com.google.gwt.safecss.shared.SafeStylesUtils; +import com.google.gwt.safehtml.shared.SafeHtml; +import com.google.gwt.safehtml.shared.SafeHtmlBuilder; +import com.google.gwt.safehtml.shared.SafeHtmlUtils; +import com.sencha.gxt.cell.core.client.ProgressBarCell.ProgressBarAppearance; +import com.sencha.gxt.cell.core.client.ProgressBarCell.ProgressBarAppearanceOptions; +import com.sencha.gxt.core.client.GXT; +import com.sencha.gxt.core.client.XTemplates; +import com.sencha.gxt.core.client.util.Format; + +/** + * + * @author Giancarlo Panichi + * + * + */ +public class RedProgressBarAppearance implements ProgressBarAppearance { + + public interface RedProgressBarResources { + + ImageResource barRed(); + + ImageResource innerBarRed(); + + RedProgressBarStyle style(); + + } + + public interface RedProgressBarStyle extends CssResource { + + String progressBarRed(); + + String progressInnerRed(); + + String progressTextRed(); + + String progressTextBackRed(); + + String progressWrapRed(); + + } + + public interface RedProgressBarTemplate extends XTemplates { + + @XTemplate(source = "RedProgressBar.html") + SafeHtml render(SafeHtml text, RedProgressBarStyle style, + SafeStyles wrapStyles, SafeStyles progressBarStyles, + SafeStyles progressTextStyles, SafeStyles widthStyles); + + } + + public interface RedProgressBarDefaultResources extends + RedProgressBarResources, ClientBundle { + + @Source({ "RedProgressBar.css" }) + @Override + RedProgressBarStyle style(); + + @Source("red-progress-bg.gif") + @ImageOptions(repeatStyle = RepeatStyle.Horizontal) + @Override + ImageResource barRed(); + + @Source("red-bg.gif") + @ImageOptions(repeatStyle = RepeatStyle.Horizontal) + @Override + ImageResource innerBarRed(); + } + + private final RedProgressBarStyle style; + private RedProgressBarTemplate template; + + + public RedProgressBarAppearance() { + this( + GWT. create(RedProgressBarDefaultResources.class), + GWT. create(RedProgressBarTemplate.class)); + } + + public RedProgressBarAppearance(RedProgressBarResources resources, + RedProgressBarTemplate template) { + this.style = resources.style(); + this.style.ensureInjected(); + this.template = template; + } + + @Override + public void render(SafeHtmlBuilder sb, Double value, + ProgressBarAppearanceOptions options) { + value = value == null ? 0 : value; + double valueWidth = value * options.getWidth(); + + int vw = new Double(valueWidth).intValue(); + + String text = options.getProgressText(); + + if (text != null) { + int v = (int) Math.round(value * 100); + text = Format.substitute(text, v); + } + + SafeHtml txt; + if (text == null) { + txt = SafeHtmlUtils.fromSafeConstant(" "); + } else { + txt = SafeHtmlUtils.fromString(text); + } + + int adj = GXT.isIE() ? 4 : 2; + + SafeStyles wrapStyles = SafeStylesUtils.fromTrustedString("width:" + + (options.getWidth() - adj) + "px;"); + SafeStyles progressBarStyles = SafeStylesUtils + .fromTrustedString("width:" + vw + "px;"); + SafeStyles progressTextStyles = SafeStylesUtils + .fromTrustedString("width:" + Math.max(vw - 8, 0) + "px;"); + SafeStyles widthStyles = SafeStylesUtils.fromTrustedString("width:" + + (Math.max(0, options.getWidth() - adj)) + "px;"); + sb.append(template.render(txt, style, wrapStyles, progressBarStyles, + progressTextStyles, widthStyles)); + } + +} diff --git a/src/main/java/org/gcube/portlets/user/dataminerexecutor/client/custom/progress/green-bg.gif b/src/main/java/org/gcube/portlets/user/dataminerexecutor/client/custom/progress/green-bg.gif new file mode 100644 index 0000000000000000000000000000000000000000..ece6da876e3a6a813b1c84f917b886820314fb29 GIT binary patch literal 496 zcmZ?wbhEHb_>`ycN<0MXC)pMHM${PW}IU!T5!(C4qezI^@t_1o{S z-+zDm0Yrbk|NQgg=bxXyfaos}{rU|;zyJLG^XK26zyJRJ1EGKaNe7Dm1f7dg6H8K4 z6v{J8G8EiBeFGSD7=QreK?b&e2c{QT*husrZz(#NqbGVHqr`D-nDmV`WwT2w_Q!Wr z*!0afpWa!ucixWs`CT=3>uAwDcnMso;%TAj< zU2fLw*$VRW7tB{wSh949(u$QUmDj9YtD>@Qt(uzZw(Y9wyLRu^+_!(fmezs&+Q*I` z*Ex0iwB9-03m4B_*1L4|;)OG}PTbKxa{qwFqdiY{?AW;J<;zuXmc3i}Va}%+U#5JU z@T2Ef$Dfve4GcdyjyO-~bF|>Nxxw-91fH4f{0BUqI0cfdCAphM_km$1Wb5l7r3k9fu$^@%^`pLjed`9yHaiO`Ib zQQ4A8CE4zq0{Ml1px&WSRftJdYb-j~C|U=0AH C1SaYL literal 0 HcmV?d00001 diff --git a/src/main/java/org/gcube/portlets/user/dataminerexecutor/client/custom/progress/orange-bg.gif b/src/main/java/org/gcube/portlets/user/dataminerexecutor/client/custom/progress/orange-bg.gif new file mode 100644 index 0000000000000000000000000000000000000000..9bc56adc34616b051164d04faf23086d89561756 GIT binary patch literal 462 zcmZ?wbhEHbE->;uO57U{qW1{$6ww&`tk-yKKb(Y$=7#JzrK6+_5Jg2 zAoTLvhZo;Jy!!U>)%TCDzkhu5{nP6opWgoX{O-q>cR#;;`1$qy Uef#w5+vi{3 zzx@93_4ki&zkh!H^YiiWR9Njg^Uo#wPDgX)|Aaot=J#mUSTtB#`*M)s=a+X?!WJ>v0H!R zeR)^i{{27x*NZhZH%qj&w@Y?)_w;s4O_(@Qddk$Pax-Sml$Dt~Z?5dZMT_K@E?cIs za@8tD#nr2nl-6!utGsRdc9mVbcdM%I*{ycy@L~01$B%2AI&tjOIgOJS&Rjlz4c}{iR{SpcTkt>U#sW!?wlmG_ z2|`7Y9jT4Z+5$^GN;Vy7INB}Fo^fZ##)jkl@|+zqmO%|CC#y5Bh&j3GsTYGm@-ZGJ G25SKD2|)t@ literal 0 HcmV?d00001 diff --git a/src/main/java/org/gcube/portlets/user/dataminerexecutor/client/custom/progress/orange-progress-bg.gif b/src/main/java/org/gcube/portlets/user/dataminerexecutor/client/custom/progress/orange-progress-bg.gif new file mode 100644 index 0000000000000000000000000000000000000000..8806af1887e121ca8a1d7ac61547f672af327418 GIT binary patch literal 99 zcmZ?wbhEHbWMoKSc+AJ}f3fxdrS|`qJN;Yk`G1AW|CMh4R{H*1<^OL@@V~X8|JH^7 z-x&FSOZ@+>N&mq>hXDvcdKp+GHk|Zay?4i^rI#dG1vp#`B|KKG%Xz&ohlRl!0NHCW AR{#J2 literal 0 HcmV?d00001 diff --git a/src/main/java/org/gcube/portlets/user/dataminerexecutor/client/custom/progress/red-bg.gif b/src/main/java/org/gcube/portlets/user/dataminerexecutor/client/custom/progress/red-bg.gif new file mode 100644 index 0000000000000000000000000000000000000000..1bb42019affe5c386409577c6a1b78c3922826e9 GIT binary patch literal 492 zcmZ?wbhEHbHg!-4}j>&=Z8e` zQEFmIYKlU6W=V#EyQgmegAM}_fIP^+_UFK~0t*|7e)pE5lR0|A7cxQ|*M>>nSW`AT zw_^YO_6nP}8RwsORPCL%6+S)-)1c8!XP^44w2sylb>Qs298pN7W% zeVRv)9n(5_>Xgn|?eiDTUedXE<-+;XH;>=eJbZ7z+QZ$Cw{PFD@x_akua~}E_x-bELWJ*oO5GAq(@s1Gkbzk(aet2Mptc#r5PogSUTOA n6`b3295$tRGHC=alR2;{)tk{E`52GG<}_ahi{fWIObpfl3e866 literal 0 HcmV?d00001 diff --git a/src/main/java/org/gcube/portlets/user/dataminerexecutor/client/custom/progress/red-progress-bg.gif b/src/main/java/org/gcube/portlets/user/dataminerexecutor/client/custom/progress/red-progress-bg.gif new file mode 100644 index 0000000000000000000000000000000000000000..5575481100e4831765849d4a1ed15953599ba027 GIT binary patch literal 120 zcmZ?wbhEHbWMoKSc+AJ}(Zl1TkIyH6|4)H|pMrxwg@%5LjQkWG{W&h~b3(%Bq@>R& zDPJ-(zvSlr2Lr`_g3d*$i6yBi3gww484B*6z5xt63_t)fkby;F!%5H8dv|PFdP$Q- TfP* { + + public static Type TYPE = new Type(); + private ComputationId computationId; + + public interface CancelComputationExecutionRequestEventHandler extends + EventHandler { + void onCancel(CancelComputationExecutionRequestEvent event); + } + + public interface HasCancelComputationExecutionRequestEventHandler extends + HasHandlers { + public HandlerRegistration addCancelComputationExecutionRequestEventHandler( + CancelComputationExecutionRequestEventHandler handler); + } + + public CancelComputationExecutionRequestEvent(ComputationId computationId) { + this.computationId = computationId; + } + + @Override + protected void dispatch( + CancelComputationExecutionRequestEventHandler handler) { + handler.onCancel(this); + } + + @Override + public Type getAssociatedType() { + return TYPE; + } + + public static Type getType() { + return TYPE; + } + + public static void fire(HasHandlers source, + CancelComputationExecutionRequestEvent event) { + source.fireEvent(event); + } + + public ComputationId getComputationId() { + return computationId; + } + + @Override + public String toString() { + return "CancelComputationExecutionRequestEvent [computationId=" + + computationId + "]"; + } + +} diff --git a/src/main/java/org/gcube/portlets/user/dataminerexecutor/client/events/CancelExecutionFromComputationsRequestEvent.java b/src/main/java/org/gcube/portlets/user/dataminerexecutor/client/events/CancelExecutionFromComputationsRequestEvent.java new file mode 100644 index 0000000..61dc8a9 --- /dev/null +++ b/src/main/java/org/gcube/portlets/user/dataminerexecutor/client/events/CancelExecutionFromComputationsRequestEvent.java @@ -0,0 +1,71 @@ +package org.gcube.portlets.user.dataminerexecutor.client.events; + +import org.gcube.data.analysis.dataminermanagercl.shared.workspace.ItemDescription; + +import com.google.gwt.event.shared.EventHandler; +import com.google.gwt.event.shared.GwtEvent; +import com.google.gwt.event.shared.HandlerRegistration; +import com.google.gwt.event.shared.HasHandlers; + +/** + * Cancel Execution From Computations Request Event + * + * + * @author Giancarlo Panichi + * + * + */ +public class CancelExecutionFromComputationsRequestEvent + extends + GwtEvent { + + public static Type TYPE = new Type(); + private ItemDescription itemDescription; + + public interface CancelExecutionFromComputationsRequestEventHandler extends + EventHandler { + void onCancel(CancelExecutionFromComputationsRequestEvent event); + } + + public interface HasCancelExecutionFromComputationsRequestEventHandler + extends HasHandlers { + public HandlerRegistration addCancelExecutionFromComputationsRequestEventHandler( + CancelExecutionFromComputationsRequestEventHandler handler); + } + + public CancelExecutionFromComputationsRequestEvent( + ItemDescription itemDescription) { + this.itemDescription = itemDescription; + } + + @Override + protected void dispatch( + CancelExecutionFromComputationsRequestEventHandler handler) { + handler.onCancel(this); + } + + @Override + public Type getAssociatedType() { + return TYPE; + } + + public static Type getType() { + return TYPE; + } + + public static void fire(HasHandlers source, + CancelExecutionFromComputationsRequestEvent event) { + source.fireEvent(event); + } + + public ItemDescription getItemDescription() { + return itemDescription; + } + + @Override + public String toString() { + return "CancelExecutionFromComputationsRequestEvent [itemDescription=" + + itemDescription + "]"; + } + +} diff --git a/src/main/java/org/gcube/portlets/user/dataminerexecutor/client/events/ComputationDataEvent.java b/src/main/java/org/gcube/portlets/user/dataminerexecutor/client/events/ComputationDataEvent.java new file mode 100644 index 0000000..edc55c7 --- /dev/null +++ b/src/main/java/org/gcube/portlets/user/dataminerexecutor/client/events/ComputationDataEvent.java @@ -0,0 +1,64 @@ +package org.gcube.portlets.user.dataminerexecutor.client.events; + +import org.gcube.data.analysis.dataminermanagercl.shared.data.computations.ComputationData; + +import com.google.gwt.event.shared.EventHandler; +import com.google.gwt.event.shared.GwtEvent; +import com.google.gwt.event.shared.HandlerRegistration; +import com.google.gwt.event.shared.HasHandlers; + +/** + * Computation Data Event + * + * + * @author Giancarlo Panichi + * + * + */ +public class ComputationDataEvent extends + GwtEvent { + + public static Type TYPE = new Type(); + private ComputationData computationData; + + public interface ComputationDataEventHandler extends EventHandler { + void onComputationData(ComputationDataEvent event); + } + + public interface HasOutputShowResourceEventHandler extends HasHandlers { + public HandlerRegistration addOutputShowResourceEventHandler( + ComputationDataEventHandler handler); + } + + public ComputationDataEvent(ComputationData computationData) { + this.computationData = computationData; + } + + @Override + protected void dispatch(ComputationDataEventHandler handler) { + handler.onComputationData(this); + } + + @Override + public Type getAssociatedType() { + return TYPE; + } + + public static Type getType() { + return TYPE; + } + + public static void fire(HasHandlers source, ComputationDataEvent event) { + source.fireEvent(event); + } + + public ComputationData getComputationData() { + return computationData; + } + + @Override + public String toString() { + return "ComputationDataEvent [computationData=" + computationData + "]"; + } + +} diff --git a/src/main/java/org/gcube/portlets/user/dataminerexecutor/client/events/ComputationDataRequestEvent.java b/src/main/java/org/gcube/portlets/user/dataminerexecutor/client/events/ComputationDataRequestEvent.java new file mode 100644 index 0000000..d769b78 --- /dev/null +++ b/src/main/java/org/gcube/portlets/user/dataminerexecutor/client/events/ComputationDataRequestEvent.java @@ -0,0 +1,67 @@ +package org.gcube.portlets.user.dataminerexecutor.client.events; + +import org.gcube.data.analysis.dataminermanagercl.shared.workspace.ItemDescription; + +import com.google.gwt.event.shared.EventHandler; +import com.google.gwt.event.shared.GwtEvent; +import com.google.gwt.event.shared.HandlerRegistration; +import com.google.gwt.event.shared.HasHandlers; + +/** + * Output Show Request Event + * + * + * @author Giancarlo Panichi + * + * + */ +public class ComputationDataRequestEvent + extends + GwtEvent { + + public static Type TYPE = new Type(); + private ItemDescription itemDescription; + + public interface ComputationDataRequestEventHandler extends EventHandler { + void onComputationDataRequest(ComputationDataRequestEvent event); + } + + public interface HasComputationDataRequestEventHandler extends HasHandlers { + public HandlerRegistration addComputationDataRequestEventHandler( + ComputationDataRequestEventHandler handler); + } + + public ComputationDataRequestEvent(ItemDescription itemDescription) { + this.itemDescription = itemDescription; + } + + @Override + protected void dispatch(ComputationDataRequestEventHandler handler) { + handler.onComputationDataRequest(this); + } + + @Override + public Type getAssociatedType() { + return TYPE; + } + + public static Type getType() { + return TYPE; + } + + public static void fire(HasHandlers source, + ComputationDataRequestEvent event) { + source.fireEvent(event); + } + + public ItemDescription getItemDescription() { + return itemDescription; + } + + @Override + public String toString() { + return "ComputationDataRequestEvent [itemDescription=" + + itemDescription + "]"; + } + +} diff --git a/src/main/java/org/gcube/portlets/user/dataminerexecutor/client/events/ComputationReadyEvent.java b/src/main/java/org/gcube/portlets/user/dataminerexecutor/client/events/ComputationReadyEvent.java new file mode 100644 index 0000000..35a418e --- /dev/null +++ b/src/main/java/org/gcube/portlets/user/dataminerexecutor/client/events/ComputationReadyEvent.java @@ -0,0 +1,70 @@ +package org.gcube.portlets.user.dataminerexecutor.client.events; + +import org.gcube.data.analysis.dataminermanagercl.shared.process.Operator; + +import com.google.gwt.event.shared.EventHandler; +import com.google.gwt.event.shared.GwtEvent; +import com.google.gwt.event.shared.HandlerRegistration; +import com.google.gwt.event.shared.HasHandlers; + +/** + * Computation Ready Event + * + * + * @author Giancarlo Panichi + * + * + */ +public class ComputationReadyEvent extends + GwtEvent { + + public static Type TYPE = new Type(); + private Operator operator; + + public interface ComputationReadyEventHandler extends EventHandler { + void onReady(ComputationReadyEvent event); + } + + public interface HasComputationReadyEventHandler extends HasHandlers { + public HandlerRegistration addComputationReadyEventHandler( + ComputationReadyEventHandler handler); + } + + public ComputationReadyEvent(Operator operator) { + super(); + this.operator = operator; + } + + @Override + protected void dispatch(ComputationReadyEventHandler handler) { + handler.onReady(this); + } + + @Override + public Type getAssociatedType() { + return TYPE; + } + + public static Type getType() { + return TYPE; + } + + public static void fire(HasHandlers source, ComputationReadyEvent event) { + source.fireEvent(event); + } + + public static Type getTYPE() { + return TYPE; + } + + public Operator getOperator() { + return operator; + } + + + @Override + public String toString() { + return "ComputationReadyEvent [operator=" + operator + "]"; + } + +} diff --git a/src/main/java/org/gcube/portlets/user/dataminerexecutor/client/events/DeleteItemRequestEvent.java b/src/main/java/org/gcube/portlets/user/dataminerexecutor/client/events/DeleteItemRequestEvent.java new file mode 100644 index 0000000..73e3c6c --- /dev/null +++ b/src/main/java/org/gcube/portlets/user/dataminerexecutor/client/events/DeleteItemRequestEvent.java @@ -0,0 +1,76 @@ +package org.gcube.portlets.user.dataminerexecutor.client.events; + +import org.gcube.data.analysis.dataminermanagercl.shared.workspace.ItemDescription; +import org.gcube.portlets.user.dataminerexecutor.client.type.DataMinerWorkAreaElementType; + +import com.google.gwt.event.shared.EventHandler; +import com.google.gwt.event.shared.GwtEvent; +import com.google.gwt.event.shared.HandlerRegistration; +import com.google.gwt.event.shared.HasHandlers; + +/** + * Delete Item Request Event + * + * + * @author Giancarlo Panichi + * + * + */ +public class DeleteItemRequestEvent extends + GwtEvent { + + public static Type TYPE = new Type(); + private DataMinerWorkAreaElementType dataMinerWorkAreaElementType; + private ItemDescription itemDescription; + + public interface DeleteItemRequestEventHandler extends EventHandler { + void onDeleteRequest(DeleteItemRequestEvent event); + } + + public interface HasDeleteItemRequestEventHandler extends HasHandlers { + public HandlerRegistration addDeleteItemRequestEventHandler( + DeleteItemRequestEventHandler handler); + } + + public DeleteItemRequestEvent( + DataMinerWorkAreaElementType dataMinerWorkAreaElementType, + ItemDescription itemDescription) { + this.itemDescription = itemDescription; + this.dataMinerWorkAreaElementType = dataMinerWorkAreaElementType; + } + + @Override + protected void dispatch(DeleteItemRequestEventHandler handler) { + handler.onDeleteRequest(this); + } + + @Override + public Type getAssociatedType() { + return TYPE; + } + + public static Type getType() { + return TYPE; + } + + public static void fire(HasHandlers source, + DeleteItemRequestEvent deleteItemEvent) { + source.fireEvent(deleteItemEvent); + } + + public ItemDescription getItemDescription() { + return itemDescription; + } + + public DataMinerWorkAreaElementType getDataMinerWorkAreaElementType() { + return dataMinerWorkAreaElementType; + } + + @Override + public String toString() { + return "DeleteItemRequestEvent [dataMinerWorkAreaElementType=" + + dataMinerWorkAreaElementType + ", itemDescription=" + + itemDescription + "]"; + } + +} diff --git a/src/main/java/org/gcube/portlets/user/dataminerexecutor/client/events/InvocationModelEvent.java b/src/main/java/org/gcube/portlets/user/dataminerexecutor/client/events/InvocationModelEvent.java new file mode 100644 index 0000000..7aae0a4 --- /dev/null +++ b/src/main/java/org/gcube/portlets/user/dataminerexecutor/client/events/InvocationModelEvent.java @@ -0,0 +1,66 @@ +package org.gcube.portlets.user.dataminerexecutor.client.events; + +import org.gcube.data.analysis.dataminermanagercl.shared.process.Operator; + +import com.google.gwt.event.shared.EventHandler; +import com.google.gwt.event.shared.GwtEvent; +import com.google.gwt.event.shared.HandlerRegistration; +import com.google.gwt.event.shared.HasHandlers; + +/** + * Operators Classification Request Event + * + * + * @author Giancarlo Panichi + * + * + */ +public class InvocationModelEvent + extends GwtEvent { + + public static Type TYPE = new Type(); + private Operator operator; + + public interface InvocationModelEventHandler extends EventHandler { + void onInvocation(InvocationModelEvent event); + } + + public interface HasInvocationModelEventHandler extends HasHandlers { + public HandlerRegistration addInvocationModelEventHandler( + InvocationModelEventHandler handler); + } + + + public InvocationModelEvent(Operator operator) { + this.operator=operator; + } + + @Override + protected void dispatch(InvocationModelEventHandler handler) { + handler.onInvocation(this); + } + + @Override + public Type getAssociatedType() { + return TYPE; + } + + public static Type getType() { + return TYPE; + } + + public static void fire(HasHandlers source, InvocationModelEvent event) { + source.fireEvent(event); + } + + public Operator getOperator() { + return operator; + } + + @Override + public String toString() { + return "InvocationModelEvent [operator=" + operator + "]"; + } + + +} diff --git a/src/main/java/org/gcube/portlets/user/dataminerexecutor/client/events/InvocationModelRequestEvent.java b/src/main/java/org/gcube/portlets/user/dataminerexecutor/client/events/InvocationModelRequestEvent.java new file mode 100644 index 0000000..7c48cc7 --- /dev/null +++ b/src/main/java/org/gcube/portlets/user/dataminerexecutor/client/events/InvocationModelRequestEvent.java @@ -0,0 +1,55 @@ +package org.gcube.portlets.user.dataminerexecutor.client.events; + +import com.google.gwt.event.shared.EventHandler; +import com.google.gwt.event.shared.GwtEvent; +import com.google.gwt.event.shared.HandlerRegistration; +import com.google.gwt.event.shared.HasHandlers; + +/** + * Operators Classification Request Event + * + * + * @author Giancarlo Panichi + * + * + */ +public class InvocationModelRequestEvent + extends GwtEvent { + + public static Type TYPE = new Type(); + + public interface InvocationModelRequestEventHandler extends EventHandler { + void onInvocationRequest(InvocationModelRequestEvent event); + } + + public interface HasInvocationModelEventHandler extends HasHandlers { + public HandlerRegistration addInvocationModelEventHandler(InvocationModelRequestEventHandler handler); + } + + public InvocationModelRequestEvent() { + } + + @Override + protected void dispatch(InvocationModelRequestEventHandler handler) { + handler.onInvocationRequest(this); + } + + @Override + public Type getAssociatedType() { + return TYPE; + } + + public static Type getType() { + return TYPE; + } + + public static void fire(HasHandlers source, InvocationModelRequestEvent event) { + source.fireEvent(event); + } + + @Override + public String toString() { + return "InvocationModelRequestEvent []"; + } + +} diff --git a/src/main/java/org/gcube/portlets/user/dataminerexecutor/client/events/MenuEvent.java b/src/main/java/org/gcube/portlets/user/dataminerexecutor/client/events/MenuEvent.java new file mode 100644 index 0000000..f6d4bf8 --- /dev/null +++ b/src/main/java/org/gcube/portlets/user/dataminerexecutor/client/events/MenuEvent.java @@ -0,0 +1,68 @@ +package org.gcube.portlets.user.dataminerexecutor.client.events; + +import org.gcube.portlets.user.dataminerexecutor.client.type.MenuType; + +import com.google.gwt.event.shared.EventHandler; +import com.google.gwt.event.shared.GwtEvent; +import com.google.gwt.event.shared.HandlerRegistration; +import com.google.gwt.event.shared.HasHandlers; + +/** + * Menu Event + * + * + * @author Giancarlo Panichi + * + * + */ +public class MenuEvent extends + GwtEvent { + + public static Type TYPE = new Type(); + private MenuType menuType; + + public interface MenuEventHandler extends EventHandler { + void onSelect(MenuEvent event); + } + + public interface HasMenuEventHandler extends HasHandlers { + public HandlerRegistration addMenuEventHandler( + MenuEventHandler handler); + } + + public MenuEvent( + MenuType menuType) { + this.menuType = menuType; + } + + @Override + protected void dispatch(MenuEventHandler handler) { + handler.onSelect(this); + } + + @Override + public Type getAssociatedType() { + return TYPE; + } + + public static Type getType() { + return TYPE; + } + + public static void fire(HasHandlers source, MenuEvent event) { + source.fireEvent(event); + } + + public MenuType getMenuType() { + return menuType; + } + + @Override + public String toString() { + return "MenuEvent [menuType=" + menuType + "]"; + } + + + + +} diff --git a/src/main/java/org/gcube/portlets/user/dataminerexecutor/client/events/MenuSwitchEvent.java b/src/main/java/org/gcube/portlets/user/dataminerexecutor/client/events/MenuSwitchEvent.java new file mode 100644 index 0000000..ff1e524 --- /dev/null +++ b/src/main/java/org/gcube/portlets/user/dataminerexecutor/client/events/MenuSwitchEvent.java @@ -0,0 +1,64 @@ +package org.gcube.portlets.user.dataminerexecutor.client.events; + +import org.gcube.portlets.user.dataminerexecutor.client.type.MenuType; + +import com.google.gwt.event.shared.EventHandler; +import com.google.gwt.event.shared.GwtEvent; +import com.google.gwt.event.shared.HandlerRegistration; +import com.google.gwt.event.shared.HasHandlers; + +/** + * Menu Event + * + * + * @author Giancarlo Panichi + * + * + */ +public class MenuSwitchEvent extends + GwtEvent { + + public static Type TYPE = new Type(); + private MenuType menuType; + + public interface MenuSwitchEventHandler extends EventHandler { + void onSelect(MenuSwitchEvent event); + } + + public interface HasMenuSwitchEventHandler extends HasHandlers { + public HandlerRegistration addMenuSwitchEventHandler( + MenuSwitchEventHandler handler); + } + + public MenuSwitchEvent(MenuType menuType) { + this.menuType = menuType; + } + + @Override + protected void dispatch(MenuSwitchEventHandler handler) { + handler.onSelect(this); + } + + @Override + public Type getAssociatedType() { + return TYPE; + } + + public static Type getType() { + return TYPE; + } + + public static void fire(HasHandlers source, MenuSwitchEvent event) { + source.fireEvent(event); + } + + public MenuType getMenuType() { + return menuType; + } + + @Override + public String toString() { + return "MenuSwitchEvent [menuType=" + menuType + "]"; + } + +} diff --git a/src/main/java/org/gcube/portlets/user/dataminerexecutor/client/events/OutputDataEvent.java b/src/main/java/org/gcube/portlets/user/dataminerexecutor/client/events/OutputDataEvent.java new file mode 100644 index 0000000..b1526a3 --- /dev/null +++ b/src/main/java/org/gcube/portlets/user/dataminerexecutor/client/events/OutputDataEvent.java @@ -0,0 +1,63 @@ +package org.gcube.portlets.user.dataminerexecutor.client.events; + +import org.gcube.data.analysis.dataminermanagercl.shared.data.OutputData; + +import com.google.gwt.event.shared.EventHandler; +import com.google.gwt.event.shared.GwtEvent; +import com.google.gwt.event.shared.HandlerRegistration; +import com.google.gwt.event.shared.HasHandlers; + +/** + * Output Data Event + * + * + * @author Giancarlo Panichi + * + * + */ +public class OutputDataEvent extends + GwtEvent { + public static Type TYPE = new Type(); + public OutputData outputData; + + public interface OutputDataEventHandler extends EventHandler { + void onOutput(OutputDataEvent event); + } + + public interface HasOutputDataEventHandler extends HasHandlers { + public HandlerRegistration addOutputDataEventHandler( + OutputDataEventHandler handler); + } + + public OutputDataEvent(OutputData outputData) { + this.outputData = outputData; + } + + @Override + protected void dispatch(OutputDataEventHandler handler) { + handler.onOutput(this); + } + + @Override + public Type getAssociatedType() { + return TYPE; + } + + public static Type getType() { + return TYPE; + } + + public static void fire(HasHandlers source, OutputDataEvent event) { + source.fireEvent(event); + } + + public OutputData getOutputData() { + return outputData; + } + + @Override + public String toString() { + return "OutputDataEvent [outputData=" + outputData + "]"; + } + +} diff --git a/src/main/java/org/gcube/portlets/user/dataminerexecutor/client/events/OutputDataRequestEvent.java b/src/main/java/org/gcube/portlets/user/dataminerexecutor/client/events/OutputDataRequestEvent.java new file mode 100644 index 0000000..6feb5dd --- /dev/null +++ b/src/main/java/org/gcube/portlets/user/dataminerexecutor/client/events/OutputDataRequestEvent.java @@ -0,0 +1,66 @@ +package org.gcube.portlets.user.dataminerexecutor.client.events; + +import org.gcube.data.analysis.dataminermanagercl.shared.data.computations.ComputationId; + +import com.google.gwt.event.shared.EventHandler; +import com.google.gwt.event.shared.GwtEvent; +import com.google.gwt.event.shared.HandlerRegistration; +import com.google.gwt.event.shared.HasHandlers; + +/** + * Output Data Request Event + * + * + * @author Giancarlo Panichi + * + * + */ +public class OutputDataRequestEvent extends + GwtEvent { + + public static Type TYPE = new Type(); + private ComputationId computationId; + + public interface OutputDataRequestEventHandler extends EventHandler { + void onOutputRequest(OutputDataRequestEvent event); + } + + public interface HasOutputDataRequestEventHandler extends HasHandlers { + public HandlerRegistration addOutputDataRequestEventHandler( + OutputDataRequestEventHandler handler); + } + + public OutputDataRequestEvent(ComputationId computationId) { + this.computationId = computationId; + } + + @Override + protected void dispatch(OutputDataRequestEventHandler handler) { + handler.onOutputRequest(this); + } + + @Override + public Type getAssociatedType() { + return TYPE; + } + + public static Type getType() { + return TYPE; + } + + public static void fire(HasHandlers source, OutputDataRequestEvent event) { + source.fireEvent(event); + } + + public ComputationId getComputationId() { + return computationId; + } + + @Override + public String toString() { + return "OutputDataRequestEvent [computationId=" + computationId + "]"; + } + + + +} diff --git a/src/main/java/org/gcube/portlets/user/dataminerexecutor/client/events/RemoveSelectedOperatorEvent.java b/src/main/java/org/gcube/portlets/user/dataminerexecutor/client/events/RemoveSelectedOperatorEvent.java new file mode 100644 index 0000000..df617a7 --- /dev/null +++ b/src/main/java/org/gcube/portlets/user/dataminerexecutor/client/events/RemoveSelectedOperatorEvent.java @@ -0,0 +1,48 @@ +package org.gcube.portlets.user.dataminerexecutor.client.events; + +import com.google.gwt.event.shared.EventHandler; +import com.google.gwt.event.shared.GwtEvent; +import com.google.gwt.event.shared.HandlerRegistration; +import com.google.gwt.event.shared.HasHandlers; + +public class RemoveSelectedOperatorEvent + extends GwtEvent { + + public static Type TYPE = new Type(); + + public interface RemoveSelectedOperatorEventHandler extends EventHandler { + void onSelect(RemoveSelectedOperatorEvent event); + } + + public interface HasRemoveSelectedOperatorEventHandler extends HasHandlers { + public HandlerRegistration removeSelectedOperatorEventHandler(RemoveSelectedOperatorEventHandler handler); + } + + public RemoveSelectedOperatorEvent() { + + } + + @Override + protected void dispatch(RemoveSelectedOperatorEventHandler handler) { + handler.onSelect(this); + } + + @Override + public Type getAssociatedType() { + return TYPE; + } + + public static Type getType() { + return TYPE; + } + + public static void fire(HasHandlers source, MenuEvent event) { + source.fireEvent(event); + } + + @Override + public String toString() { + return "RemoveSelectedOperatorEvent []"; + } + +} diff --git a/src/main/java/org/gcube/portlets/user/dataminerexecutor/client/events/ResubmitComputationExecutionEvent.java b/src/main/java/org/gcube/portlets/user/dataminerexecutor/client/events/ResubmitComputationExecutionEvent.java new file mode 100644 index 0000000..1645a3d --- /dev/null +++ b/src/main/java/org/gcube/portlets/user/dataminerexecutor/client/events/ResubmitComputationExecutionEvent.java @@ -0,0 +1,71 @@ +package org.gcube.portlets.user.dataminerexecutor.client.events; + +import org.gcube.data.analysis.dataminermanagercl.shared.data.computations.ComputationId; + +import com.google.gwt.event.shared.EventHandler; +import com.google.gwt.event.shared.GwtEvent; +import com.google.gwt.event.shared.HandlerRegistration; +import com.google.gwt.event.shared.HasHandlers; + +/** + * Resubmit Computation Execution Event + * + * + * @author Giancarlo Panichi + * + * + */ +public class ResubmitComputationExecutionEvent + extends + GwtEvent { + + public static Type TYPE = new Type(); + private ComputationId computationId; + + public interface ResubmitComputationExecutionEventHandler extends + EventHandler { + void onResubmit(ResubmitComputationExecutionEvent event); + } + + public interface HasResubmitComputationExecutionEventHandler extends + HasHandlers { + public HandlerRegistration addResubmitComputationExecutionEventHandler( + ResubmitComputationExecutionEventHandler handler); + } + + public ResubmitComputationExecutionEvent(ComputationId computationId) { + this.computationId = computationId; + } + + @Override + protected void dispatch(ResubmitComputationExecutionEventHandler handler) { + handler.onResubmit(this); + } + + @Override + public Type getAssociatedType() { + return TYPE; + } + + public static Type getType() { + return TYPE; + } + + public static void fire(HasHandlers source, + ResubmitComputationExecutionEvent event) { + source.fireEvent(event); + } + + public ComputationId getComputationId() { + return computationId; + } + + @Override + public String toString() { + return "ResubmitComputationExecutionEvent [computationId=" + + computationId + "]"; + } + + + +} diff --git a/src/main/java/org/gcube/portlets/user/dataminerexecutor/client/events/ResubmitComputationExecutionRequestEvent.java b/src/main/java/org/gcube/portlets/user/dataminerexecutor/client/events/ResubmitComputationExecutionRequestEvent.java new file mode 100644 index 0000000..f75bf2c --- /dev/null +++ b/src/main/java/org/gcube/portlets/user/dataminerexecutor/client/events/ResubmitComputationExecutionRequestEvent.java @@ -0,0 +1,71 @@ +package org.gcube.portlets.user.dataminerexecutor.client.events; + +import org.gcube.data.analysis.dataminermanagercl.shared.workspace.ItemDescription; + +import com.google.gwt.event.shared.EventHandler; +import com.google.gwt.event.shared.GwtEvent; +import com.google.gwt.event.shared.HandlerRegistration; +import com.google.gwt.event.shared.HasHandlers; + +/** + * Resubmit Computation Execution Request Event + * + * + * @author Giancarlo Panichi + * + * + */ +public class ResubmitComputationExecutionRequestEvent + extends + GwtEvent { + + public static Type TYPE = new Type(); + private ItemDescription itemDescription; + + public interface ResubmitComputationExecutionRequestEventHandler extends + EventHandler { + void onResubmit(ResubmitComputationExecutionRequestEvent event); + } + + public interface HasResubmitComputationExecutionRequestEventHandler extends + HasHandlers { + public HandlerRegistration addResubmitComputationExecutionRequestEventHandler( + ResubmitComputationExecutionRequestEventHandler handler); + } + + public ResubmitComputationExecutionRequestEvent( + ItemDescription itemDescription) { + this.itemDescription = itemDescription; + } + + @Override + protected void dispatch( + ResubmitComputationExecutionRequestEventHandler handler) { + handler.onResubmit(this); + } + + @Override + public Type getAssociatedType() { + return TYPE; + } + + public static Type getType() { + return TYPE; + } + + public static void fire(HasHandlers source, + ResubmitComputationExecutionRequestEvent event) { + source.fireEvent(event); + } + + public ItemDescription getItemDescription() { + return itemDescription; + } + + @Override + public String toString() { + return "ResubmitComputationExecutionRequestEvent [itemDescription=" + + itemDescription + "]"; + } + +} diff --git a/src/main/java/org/gcube/portlets/user/dataminerexecutor/client/events/SessionExpiredEvent.java b/src/main/java/org/gcube/portlets/user/dataminerexecutor/client/events/SessionExpiredEvent.java new file mode 100644 index 0000000..5a44517 --- /dev/null +++ b/src/main/java/org/gcube/portlets/user/dataminerexecutor/client/events/SessionExpiredEvent.java @@ -0,0 +1,70 @@ +package org.gcube.portlets.user.dataminerexecutor.client.events; + +import org.gcube.portlets.user.dataminerexecutor.client.type.SessionExpiredEventType; + +import com.google.gwt.event.shared.EventHandler; +import com.google.gwt.event.shared.GwtEvent; +import com.google.gwt.event.shared.HandlerRegistration; +import com.google.gwt.event.shared.HasHandlers; + +/** + * Session Expired Event + * + * + * @author Giancarlo Panichi + * + * + */ +public class SessionExpiredEvent extends GwtEvent { + + public static Type TYPE = new Type(); + private SessionExpiredEventType sessionExpiredEventType; + + public interface SessionExpiredEventHandler extends EventHandler { + void onChange(SessionExpiredEvent event); + } + + public interface HasSessionExpiredEventHandler extends HasHandlers { + public HandlerRegistration addSessionExpiredEventHandler( + SessionExpiredEventHandler handler); + } + + public SessionExpiredEvent() { + this.sessionExpiredEventType = SessionExpiredEventType.EXPIREDONSERVER; + } + + public SessionExpiredEvent(SessionExpiredEventType sessionExpiredEventType) { + this.sessionExpiredEventType = sessionExpiredEventType; + } + + @Override + protected void dispatch(SessionExpiredEventHandler handler) { + handler.onChange(this); + } + + @Override + public Type getAssociatedType() { + return TYPE; + } + + public static Type getType() { + return TYPE; + } + + public static void fire(HasHandlers source, SessionExpiredEvent sessionExpieredEvent) { + source.fireEvent(sessionExpieredEvent); + } + + public SessionExpiredEventType getSessionExpiredEventType() { + return sessionExpiredEventType; + } + + @Override + public String toString() { + return "SessionExpiredEvent [sessionExpiredEventType=" + + sessionExpiredEventType + "]"; + } + + + +} diff --git a/src/main/java/org/gcube/portlets/user/dataminerexecutor/client/events/StartComputationExecutionEvent.java b/src/main/java/org/gcube/portlets/user/dataminerexecutor/client/events/StartComputationExecutionEvent.java new file mode 100644 index 0000000..a408a03 --- /dev/null +++ b/src/main/java/org/gcube/portlets/user/dataminerexecutor/client/events/StartComputationExecutionEvent.java @@ -0,0 +1,76 @@ +package org.gcube.portlets.user.dataminerexecutor.client.events; + +import org.gcube.data.analysis.dataminermanagercl.shared.data.computations.ComputationId; + +import com.google.gwt.event.shared.EventHandler; +import com.google.gwt.event.shared.GwtEvent; +import com.google.gwt.event.shared.HandlerRegistration; +import com.google.gwt.event.shared.HasHandlers; + +/** + * Start Computation Execution Event + * + * + * @author Giancarlo Panichi + * + * + */ +public class StartComputationExecutionEvent + extends + GwtEvent { + + public static Type TYPE = new Type(); + private ComputationId computationId; + private int computationStatusPanelIndex; + + public interface StartComputationExecutionEventHandler extends EventHandler { + void onStart(StartComputationExecutionEvent event); + } + + public interface HasStartComputationExecutionEventHandler extends + HasHandlers { + public HandlerRegistration addStartComputationExecutionEventHandler( + StartComputationExecutionEventHandler handler); + } + + public StartComputationExecutionEvent(ComputationId computationId, + int computationStatusPanelIndex) { + this.computationId = computationId; + this.computationStatusPanelIndex = computationStatusPanelIndex; + } + + @Override + protected void dispatch(StartComputationExecutionEventHandler handler) { + handler.onStart(this); + } + + @Override + public Type getAssociatedType() { + return TYPE; + } + + public static Type getType() { + return TYPE; + } + + public static void fire(HasHandlers source, + StartComputationExecutionEvent event) { + source.fireEvent(event); + } + + public ComputationId getComputationId() { + return computationId; + } + + public int getComputationStatusPanelIndex() { + return computationStatusPanelIndex; + } + + @Override + public String toString() { + return "StartComputationExecutionEvent [computationId=" + computationId + + ", computationStatusPanelIndex=" + + computationStatusPanelIndex + "]"; + } + +} diff --git a/src/main/java/org/gcube/portlets/user/dataminerexecutor/client/events/StartComputationExecutionRequestEvent.java b/src/main/java/org/gcube/portlets/user/dataminerexecutor/client/events/StartComputationExecutionRequestEvent.java new file mode 100644 index 0000000..1c18ca0 --- /dev/null +++ b/src/main/java/org/gcube/portlets/user/dataminerexecutor/client/events/StartComputationExecutionRequestEvent.java @@ -0,0 +1,78 @@ +package org.gcube.portlets.user.dataminerexecutor.client.events; + +import org.gcube.data.analysis.dataminermanagercl.shared.process.Operator; + +import com.google.gwt.event.shared.EventHandler; +import com.google.gwt.event.shared.GwtEvent; +import com.google.gwt.event.shared.HandlerRegistration; +import com.google.gwt.event.shared.HasHandlers; + +/** + * Start Computation Execution Request Event + * + * + * @author Giancarlo Panichi + * + * + */ +public class StartComputationExecutionRequestEvent + extends + GwtEvent { + + public static Type TYPE = new Type(); + private Operator op; + private int computationStatusPanelIndex; + + public interface StartComputationExecutionRequestEventHandler extends + EventHandler { + void onStart(StartComputationExecutionRequestEvent event); + } + + public interface HasStartComputationExecutionRequestEventHandler extends + HasHandlers { + public HandlerRegistration addStartComputationExecutionRequestEventHandler( + StartComputationExecutionRequestEventHandler handler); + } + + public StartComputationExecutionRequestEvent(Operator op, + int computationStatusPanelIndex) { + this.op = op; + this.computationStatusPanelIndex = computationStatusPanelIndex; + + } + + @Override + protected void dispatch(StartComputationExecutionRequestEventHandler handler) { + handler.onStart(this); + } + + @Override + public Type getAssociatedType() { + return TYPE; + } + + public static Type getType() { + return TYPE; + } + + public static void fire(HasHandlers source, + StartComputationExecutionRequestEvent event) { + source.fireEvent(event); + } + + public Operator getOp() { + return op; + } + + public int getComputationStatusPanelIndex() { + return computationStatusPanelIndex; + } + + @Override + public String toString() { + return "StartComputationExecutionRequestEvent [op=" + op + + ", computationStatusPanelIndex=" + + computationStatusPanelIndex + "]"; + } + +} diff --git a/src/main/java/org/gcube/portlets/user/dataminerexecutor/client/events/SyncRefreshUploadDataSpaceEvent.java b/src/main/java/org/gcube/portlets/user/dataminerexecutor/client/events/SyncRefreshUploadDataSpaceEvent.java new file mode 100644 index 0000000..dade895 --- /dev/null +++ b/src/main/java/org/gcube/portlets/user/dataminerexecutor/client/events/SyncRefreshUploadDataSpaceEvent.java @@ -0,0 +1,57 @@ +package org.gcube.portlets.user.dataminerexecutor.client.events; + +import com.google.gwt.event.shared.EventHandler; +import com.google.gwt.event.shared.GwtEvent; +import com.google.gwt.event.shared.HandlerRegistration; +import com.google.gwt.event.shared.HasHandlers; + +/** + * SyncRefreshUpload + * + * + * @author Giancarlo Panichi + * + * + */ +public class SyncRefreshUploadDataSpaceEvent + extends GwtEvent { + + public static Type TYPE = new Type(); + + public interface SyncRefreshUploadDataSpaceEventHandler extends EventHandler { + void onRefresh(SyncRefreshUploadDataSpaceEvent event); + } + + public interface HasSyncRefreshUploadDataSpaceEventHandler extends HasHandlers { + public HandlerRegistration addSyncRefreshUploadDataSpaceEventHandler( + SyncRefreshUploadDataSpaceEventHandler handler); + } + + public SyncRefreshUploadDataSpaceEvent() { + + } + + @Override + protected void dispatch(SyncRefreshUploadDataSpaceEventHandler handler) { + handler.onRefresh(this); + } + + @Override + public Type getAssociatedType() { + return TYPE; + } + + public static Type getType() { + return TYPE; + } + + public static void fire(HasHandlers source, SyncRefreshUploadDataSpaceEvent deleteItemEvent) { + source.fireEvent(deleteItemEvent); + } + + @Override + public String toString() { + return "SyncRefreshUploadDataSpaceEvent []"; + } + +} diff --git a/src/main/java/org/gcube/portlets/user/dataminerexecutor/client/events/TabularFldChangeEvent.java b/src/main/java/org/gcube/portlets/user/dataminerexecutor/client/events/TabularFldChangeEvent.java new file mode 100644 index 0000000..9d6be58 --- /dev/null +++ b/src/main/java/org/gcube/portlets/user/dataminerexecutor/client/events/TabularFldChangeEvent.java @@ -0,0 +1,66 @@ +package org.gcube.portlets.user.dataminerexecutor.client.events; + +import org.gcube.data.analysis.dataminermanagercl.shared.data.TableItemSimple; + +import com.google.gwt.event.shared.EventHandler; +import com.google.gwt.event.shared.GwtEvent; +import com.google.gwt.event.shared.HandlerRegistration; +import com.google.gwt.event.shared.HasHandlers; + +/** + * Start Computation Event + * + * + * @author Giancarlo Panichi + * + * + */ +public class TabularFldChangeEvent extends + GwtEvent { + + public static Type TYPE = new Type(); + private TableItemSimple tableItemSimple; + + public interface TabularFldChangeEventHandler extends EventHandler { + void onChange(TabularFldChangeEvent event); + } + + public interface HasTabularFldChangeEventHandler extends HasHandlers { + public HandlerRegistration addTabularFldChangeEventHandler( + TabularFldChangeEventHandler handler); + } + + public TabularFldChangeEvent(TableItemSimple tableItemSimple) { + this.tableItemSimple = tableItemSimple; + + } + + @Override + protected void dispatch(TabularFldChangeEventHandler handler) { + handler.onChange(this); + } + + @Override + public Type getAssociatedType() { + return TYPE; + } + + public static Type getType() { + return TYPE; + } + + public static void fire(HasHandlers source, TabularFldChangeEvent event) { + source.fireEvent(event); + } + + public TableItemSimple getTableItemSimple() { + return tableItemSimple; + } + + @Override + public String toString() { + return "TabularFldChangeEvent [tableItemSimple=" + tableItemSimple + + "]"; + } + +} diff --git a/src/main/java/org/gcube/portlets/user/dataminerexecutor/client/events/UIStateEvent.java b/src/main/java/org/gcube/portlets/user/dataminerexecutor/client/events/UIStateEvent.java new file mode 100644 index 0000000..f7eb1e6 --- /dev/null +++ b/src/main/java/org/gcube/portlets/user/dataminerexecutor/client/events/UIStateEvent.java @@ -0,0 +1,67 @@ +package org.gcube.portlets.user.dataminerexecutor.client.events; + +import org.gcube.portlets.user.dataminerexecutor.client.type.UIStateEventType; + +import com.google.gwt.event.shared.EventHandler; +import com.google.gwt.event.shared.GwtEvent; +import com.google.gwt.event.shared.HandlerRegistration; +import com.google.gwt.event.shared.HasHandlers; + +/** + * User Interface State Event + * + * + * @author Giancarlo Panichi + * + * + */ +public class UIStateEvent extends GwtEvent { + + public static Type TYPE = new Type(); + private UIStateEventType uiStateType; + + public interface UIStateEventHandler extends EventHandler { + void onChange(UIStateEvent event); + } + + public interface HasUIStateEventHandler extends HasHandlers { + public HandlerRegistration addUIStateEventHandler( + UIStateEventHandler handler); + } + + public UIStateEvent() { + this.uiStateType = UIStateEventType.START; + } + + public UIStateEvent(UIStateEventType uiStateType) { + this.uiStateType = uiStateType; + } + + @Override + protected void dispatch(UIStateEventHandler handler) { + handler.onChange(this); + } + + @Override + public Type getAssociatedType() { + return TYPE; + } + + public static Type getType() { + return TYPE; + } + + public static void fire(HasHandlers source, UIStateEvent uiStateEvent) { + source.fireEvent(uiStateEvent); + } + + public UIStateEventType getUiStateType() { + return uiStateType; + } + + @Override + public String toString() { + return "UIStatusEvent [uiStateType=" + uiStateType + "]"; + } + +} diff --git a/src/main/java/org/gcube/portlets/user/dataminerexecutor/client/events/WPSMenuEvent.java b/src/main/java/org/gcube/portlets/user/dataminerexecutor/client/events/WPSMenuEvent.java new file mode 100644 index 0000000..324523f --- /dev/null +++ b/src/main/java/org/gcube/portlets/user/dataminerexecutor/client/events/WPSMenuEvent.java @@ -0,0 +1,68 @@ +package org.gcube.portlets.user.dataminerexecutor.client.events; + + +import org.gcube.portlets.user.dataminerexecutor.client.type.WPSMenuType; + +import com.google.gwt.event.shared.EventHandler; +import com.google.gwt.event.shared.GwtEvent; +import com.google.gwt.event.shared.HandlerRegistration; +import com.google.gwt.event.shared.HasHandlers; + +/** + * WPS Menu Event + * + * + * @author Giancarlo Panichi + * + * + */ +public class WPSMenuEvent extends + GwtEvent { + + public static Type TYPE = new Type(); + private WPSMenuType menuType; + + public interface WPSMenuEventHandler extends EventHandler { + void onMenu(WPSMenuEvent event); + } + + public interface HasWPSMenuEventHandler extends HasHandlers { + public HandlerRegistration addWPSMenuEventHandler( + WPSMenuEventHandler handler); + } + + public WPSMenuEvent(WPSMenuType menuType) { + this.menuType = menuType; + } + + @Override + protected void dispatch(WPSMenuEventHandler handler) { + handler.onMenu(this); + } + + @Override + public Type getAssociatedType() { + return TYPE; + } + + public static Type getType() { + return TYPE; + } + + public static void fire(HasHandlers source, WPSMenuEvent wpsMenuEvent) { + source.fireEvent(wpsMenuEvent); + } + + public WPSMenuType getMenuType() { + return menuType; + } + + @Override + public String toString() { + return "WPSMenuEvent [menuType=" + menuType + "]"; + } + + + + +} diff --git a/src/main/java/org/gcube/portlets/user/dataminerexecutor/client/experiments/ComputationExecutionPanel.java b/src/main/java/org/gcube/portlets/user/dataminerexecutor/client/experiments/ComputationExecutionPanel.java new file mode 100644 index 0000000..9f1522e --- /dev/null +++ b/src/main/java/org/gcube/portlets/user/dataminerexecutor/client/experiments/ComputationExecutionPanel.java @@ -0,0 +1,209 @@ +package org.gcube.portlets.user.dataminerexecutor.client.experiments; + +import java.util.ArrayList; +import java.util.List; + +import org.gcube.data.analysis.dataminermanagercl.shared.process.Operator; +import org.gcube.portlets.user.dataminerexecutor.client.DataMinerExecutor; +import org.gcube.portlets.user.dataminerexecutor.client.common.EventBusProvider; +import org.gcube.portlets.user.dataminerexecutor.client.events.ResubmitComputationExecutionEvent; +import org.gcube.portlets.user.dataminerexecutor.client.events.StartComputationExecutionEvent; +import org.gcube.portlets.user.dataminerexecutor.client.events.StartComputationExecutionRequestEvent; + +import com.allen_sauer.gwt.log.client.Log; +import com.sencha.gxt.core.client.dom.ScrollSupport.ScrollMode; +import com.sencha.gxt.core.client.util.Margins; +import com.sencha.gxt.widget.core.client.FramedPanel; +import com.sencha.gxt.widget.core.client.button.TextButton; +import com.sencha.gxt.widget.core.client.container.SimpleContainer; +import com.sencha.gxt.widget.core.client.container.VerticalLayoutContainer; +import com.sencha.gxt.widget.core.client.container.VerticalLayoutContainer.VerticalLayoutData; +import com.sencha.gxt.widget.core.client.event.SelectEvent; +import com.sencha.gxt.widget.core.client.event.SelectEvent.SelectHandler; +import com.sencha.gxt.widget.core.client.toolbar.LabelToolItem; +import com.sencha.gxt.widget.core.client.toolbar.ToolBar; + +/** + * + * @author Giancarlo Panichi + * + * + */ +public class ComputationExecutionPanel extends FramedPanel { + + private List computationStatusPanels = new ArrayList(); + + private static final String DELETE_ALL_BUTTON_TOOLTIP = "Remove Computations Log"; + private TextButton removeAllButton; + + private VerticalLayoutContainer v; + + private ToolBar toolBar; + + private VerticalLayoutContainer topV; + + /** + * + */ + public ComputationExecutionPanel() { + super(); + Log.debug("Computation Execution Panel"); + init(); + create(); + bind(); + } + + private void init() { + setHeaderVisible(false); + addStyleName("computationExcecutionPanel"); + setBodyStyle("backgroundColor:white;"); + } + + private void create() { + topV = new VerticalLayoutContainer(); + setToolBar(); + topV.add(toolBar, new VerticalLayoutData(1, -1, new Margins(0))); + SimpleContainer computations = new SimpleContainer(); + v = new VerticalLayoutContainer(); + v.setScrollMode(ScrollMode.AUTO); + computations.add(v); + topV.add(computations, new VerticalLayoutData(1, 1, new Margins(0))); + add(topV); + } + + private void bind() { + EventBusProvider.INSTANCE + .addHandler( + ResubmitComputationExecutionEvent.getType(), + new ResubmitComputationExecutionEvent.ResubmitComputationExecutionEventHandler() { + @Override + public void onResubmit( + ResubmitComputationExecutionEvent event) { + Log.debug("ResubmitComputationExecutionEvent: " + + event); + resubmitComputation(event); + } + }); + + EventBusProvider.INSTANCE + .addHandler( + StartComputationExecutionEvent.getType(), + new StartComputationExecutionEvent.StartComputationExecutionEventHandler() { + + @Override + public void onStart( + StartComputationExecutionEvent event) { + Log.debug("Catch StartComputationExecutionEvent: " + + event); + startComputation(event); + + } + + }); + + + + } + + public void startNewComputation(final Operator operator) { + Log.debug("Computation Panel: start new computation "); + ComputationStatusPanel statusPanel = new ComputationStatusPanel( + operator.getName()); + computationStatusPanels.add(statusPanel); + int index = computationStatusPanels.indexOf(statusPanel); + statusPanel.setItemId("ComputationStatusPanel" + String.valueOf(index)); + + Log.debug("Added status bar"); + v.insert(statusPanel, 0, new VerticalLayoutData(1, -1, new Margins(20))); + removeAllButton.setEnabled(true); + forceLayout(); + + StartComputationExecutionRequestEvent event = new StartComputationExecutionRequestEvent( + operator, index); + EventBusProvider.INSTANCE.fireEvent(event); + + } + + private void startComputation(StartComputationExecutionEvent event) { + try { + ComputationStatusPanel statusPanel = null; + try { + statusPanel = computationStatusPanels.get(event + .getComputationStatusPanelIndex()); + } catch (IndexOutOfBoundsException e) { + Log.debug("No ComputationStatusPanel retrieved!"); + Log.debug(e.getLocalizedMessage()); + } + + if (statusPanel == null) { + + } else { + statusPanel.computationStarted(event.getComputationId()); + forceLayout(); + } + + } catch (Throwable e) { + Log.error(e.getLocalizedMessage()); + e.printStackTrace(); + } + } + + private void resubmitComputation(ResubmitComputationExecutionEvent event) { + final ComputationStatusPanel statusPanel = new ComputationStatusPanel( + event.getComputationId().getOperatorName()); + computationStatusPanels.add(statusPanel); + if (v.getWidgetCount() == 0) { + v.add(statusPanel, new VerticalLayoutData(1, -1, new Margins(20))); + } else { + v.insert(statusPanel, 0, new VerticalLayoutData(1, -1, new Margins( + 20))); + } + removeAllButton.setEnabled(true); + + statusPanel.computationStarted(event.getComputationId()); + + forceLayout(); + + } + + + + /** + * + */ + private void emptyPanel() { + // stop timers + for (ComputationStatusPanel statusPanel : computationStatusPanels) + statusPanel.stopTimer(); + + removeAllButton.setEnabled(false); + v.clear(); + computationStatusPanels.clear(); + forceLayout(); + } + + private void setToolBar() { + toolBar = new ToolBar(); + + removeAllButton = new TextButton("Remove All"); + + removeAllButton.addSelectHandler(new SelectHandler() { + + @Override + public void onSelect(SelectEvent event) { + emptyPanel(); + + } + }); + + removeAllButton.setIcon(DataMinerExecutor.resources.removeAll()); + + removeAllButton.setToolTip(DELETE_ALL_BUTTON_TOOLTIP); + // removeAllButton.setScale(ButtonScale.MEDIUM); + removeAllButton.setEnabled(false); + + toolBar.add(new LabelToolItem("Tools:")); + toolBar.add(removeAllButton); + + } +} diff --git a/src/main/java/org/gcube/portlets/user/dataminerexecutor/client/experiments/ComputationOutputPanel.java b/src/main/java/org/gcube/portlets/user/dataminerexecutor/client/experiments/ComputationOutputPanel.java new file mode 100644 index 0000000..bc45765 --- /dev/null +++ b/src/main/java/org/gcube/portlets/user/dataminerexecutor/client/experiments/ComputationOutputPanel.java @@ -0,0 +1,295 @@ +/** + * + */ +package org.gcube.portlets.user.dataminerexecutor.client.experiments; + +import java.util.LinkedHashMap; +import java.util.Map; + +import org.gcube.data.analysis.dataminermanagercl.shared.data.computations.ComputationId; +import org.gcube.data.analysis.dataminermanagercl.shared.data.output.FileResource; +import org.gcube.data.analysis.dataminermanagercl.shared.data.output.ImageResource; +import org.gcube.data.analysis.dataminermanagercl.shared.data.output.MapResource; +import org.gcube.data.analysis.dataminermanagercl.shared.data.output.ObjectResource; +import org.gcube.data.analysis.dataminermanagercl.shared.data.output.Resource; +import org.gcube.data.analysis.dataminermanagercl.shared.data.output.Resource.ResourceType; +import org.gcube.portlets.user.dataminerexecutor.client.common.EventBusProvider; +import org.gcube.portlets.user.dataminerexecutor.client.events.OutputDataEvent; +import org.gcube.portlets.user.dataminerexecutor.client.events.OutputDataRequestEvent; +import org.gcube.portlets.user.dataminerexecutor.client.util.UtilsGXT3; +import org.gcube.portlets.user.dataminerexecutor.client.widgets.FileViewer; +import org.gcube.portlets.user.dataminerexecutor.client.widgets.ImageViewer; +import org.gcube.portlets.user.dataminerexecutor.client.widgets.ResourceViewer; +import org.gcube.data.analysis.dataminermanagercl.shared.data.output.TableResource; + +import com.allen_sauer.gwt.log.client.Log; +import com.google.gwt.core.client.GWT; +import com.google.gwt.safehtml.shared.SafeHtml; +import com.sencha.gxt.core.client.XTemplates; +import com.sencha.gxt.core.client.util.Margins; +import com.sencha.gxt.widget.core.client.container.HtmlLayoutContainer; +import com.sencha.gxt.widget.core.client.container.SimpleContainer; +import com.sencha.gxt.widget.core.client.container.VerticalLayoutContainer; +import com.sencha.gxt.widget.core.client.container.VerticalLayoutContainer.VerticalLayoutData; + +/** + * + * @author Giancarlo Panichi + * + * + */ +public class ComputationOutputPanel extends SimpleContainer { + + private ComputationId computationId; + private VerticalLayoutContainer v; + + public ComputationOutputPanel(ComputationId computationId) { + super(); + this.computationId = computationId; + Log.debug("ComputationOutputPanel: " + computationId); + bind(); + init(); + OutputDataRequestEvent event = new OutputDataRequestEvent(computationId); + EventBusProvider.INSTANCE.fireEvent(event); + + } + + private void init() { + v = new VerticalLayoutContainer(); + add(v); + } + + private void bind() { + EventBusProvider.INSTANCE.addHandler(OutputDataEvent.TYPE, + new OutputDataEvent.OutputDataEventHandler() { + + @Override + public void onOutput(OutputDataEvent event) { + Log.debug("Catch OutputDataEvent: " + event); + if (event!=null&& event.getOutputData()!=null&& + event.getOutputData().getComputationId()!=null&& + event.getOutputData().getComputationId().getId() + .compareTo(computationId.getId()) == 0) { + manageOutputDataEvent(event); + } + + } + }); + + } + + /** + * + * @param resource + */ + private void manageOutputDataEvent(OutputDataEvent event) { + try { + if (event == null || event.getOutputData() == null) { + Log.error("OutputDataEvent is null"); + UtilsGXT3.alert("Error", "Invalid output data!"); + return; + } + Resource resource = event.getOutputData().getResource(); + showResource(resource); + } catch (Throwable e) { + Log.error("Error in show output info: " + e.getLocalizedMessage()); + e.printStackTrace(); + } + } + + private void showResource(Resource resource) { + try { + Log.info("Show Output Info on: " + resource); + if (resource == null) { + Log.debug("Output Data hasn't resource!"); + return; + } + + ResourceType resourceType = resource.getResourceType(); + + switch (resourceType) { + + case FILE: + FileResource fileResource = (FileResource) resource; + v.add(getHtmlTitle("The algorithm produced a", "File"), + new VerticalLayoutData(1, -1, new Margins(0))); + v.add(getFileResourceOutput(fileResource), + new VerticalLayoutData(1, -1, new Margins(0))); + break; + + case TABULAR: + //TableResource tabResource = (TableResource) resource; + v.add(getHtmlTitle("The algorithm produced a", "Table"), + new VerticalLayoutData(1, -1, new Margins(0))); + // v.add(getTabResourceOutput(tabResource), + // new VerticalLayoutData(1, -1, new Margins(0))); + break; + + case IMAGE: + v.add(getHtmlTitle("The algorithm produced an", "Set of Images"), + new VerticalLayoutData(1, -1, new Margins(0))); + final ImageResource imagesResource = (ImageResource) resource; + v.add(getImagesResourceOutput(imagesResource), + new VerticalLayoutData(1, -1, new Margins(0))); + break; + + case MAP: + v.add(getHtmlTitle("The algorithm produced ", + "Multiple Results"), new VerticalLayoutData(1, -1, + new Margins(0))); + + final MapResource mapResource = (MapResource) resource; + + v.add(getMultipleOutput(mapResource), new VerticalLayoutData(1, + -1, new Margins(0))); + break; + case OBJECT: + break; + default: + break; + + } + + forceLayout(); + } catch (Throwable e) { + Log.error("Error in show resource: " + e.getLocalizedMessage()); + e.printStackTrace(); + } + } + + public interface TitleTemplate extends XTemplates { + @XTemplate("

{intro} {produced}.

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

Computation of " + + operatorName + "

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

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

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

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

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

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

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

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

" + + columnParameter.getDescription() + "

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

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

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

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

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

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

" + parameter.getDescription() + "

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

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

" + p.getDescription() + "

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

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

" + parameter.getDescription() + "

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

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

" + listParameter.getDescription() + "

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

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

" + listParameter.getDescription() + "

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

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

" + parameter.getDescription() + "

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

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

" + parameter.getDescription() + "

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

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

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

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

" + tabularListParameter.getDescription() + "

"); + descr.addStyleName("workflow-fieldDescription"); + } + + horiz.add(listContainer); + horiz.add(descr); + + fieldContainer.add(horiz, new MarginData(new Margins(0))); + fieldContainer.forceLayout(); + addField(null); + } + + protected void addField(TabItem upperItem) { + try { + + TabularParameter tabPar = new TabularParameter(tabularListParameter.getName(), + tabularListParameter.getDescription(), null, tabularListParameter.getTemplates(), + tabularListParameter.getDefaultMimeType(), tabularListParameter.getSupportedMimeTypes()); + + if (upperItem == null) { + TabItem item = new TabItem(this, tabPar, true); + items.add(item); + vp.add(item);// don't use new VerticalLayoutData(1, -1, new + // Margins(0)) + } else { + // search the position of the upper item + int pos = items.indexOf(upperItem); + if (pos > -1) { + upperItem.showCancelButton(); + upperItem.forceLayout(); + TabItem item = new TabItem(this, tabPar, false); + items.add(pos + 1, item); + vp.insert(item, pos + 1);// don't use new + // VerticalLayoutData(-1, -1,new + // Margins(0)) + } else { + upperItem.forceLayout(); + TabItem item = new TabItem(this, tabPar, true); + items.add(item); + vp.add(item);// don't use new VerticalLayoutData(-1, -1, new + // Margins(0)) + } + } + + forceLayout(); + + } catch (Throwable e) { + Log.error(e.getLocalizedMessage()); + e.printStackTrace(); + } + } + + protected void removeField(TabItem item) { + items.remove(item); + + if (items.size() == 1) { + items.get(0).hideCancelButton(); + items.get(0).forceLayout(); + } + vp.remove(item); + forceLayout(); + } + + protected void forceLayout() { + vp.forceLayout(); + listContainer.forceLayout(); + horiz.forceLayout(); + fieldContainer.forceLayout(); + } + + @Override + public String getValue() { + String separator = tabularListParameter.getSeparator(); + // String separator=""; + String value = ""; + boolean first = true; + for (TabItem item : items) { + String itemValue = item.getValue(); + if (itemValue != null && !itemValue.contentEquals("")) { + value += (first ? "" : separator) + itemValue; + first = false; + } + } + return value; + } + + /** + * + */ + @Override + public Widget getWidget() { + return fieldContainer; + } + + @Override + public boolean isValid() { + boolean valid = false; + for (TabItem item : items) + if (item.isValid()) { + valid = true; + break; + } + return valid; + } + +} diff --git a/src/main/java/org/gcube/portlets/user/dataminerexecutor/client/properties/ColumnItemProperties.java b/src/main/java/org/gcube/portlets/user/dataminerexecutor/client/properties/ColumnItemProperties.java new file mode 100644 index 0000000..2b0cf51 --- /dev/null +++ b/src/main/java/org/gcube/portlets/user/dataminerexecutor/client/properties/ColumnItemProperties.java @@ -0,0 +1,24 @@ +package org.gcube.portlets.user.dataminerexecutor.client.properties; + + +import org.gcube.data.analysis.dataminermanagercl.shared.data.ColumnItem; + +import com.google.gwt.editor.client.Editor.Path; +import com.sencha.gxt.core.client.ValueProvider; +import com.sencha.gxt.data.shared.ModelKeyProvider; +import com.sencha.gxt.data.shared.PropertyAccess; + +/** + * + * @author Giancarlo Panichi + * + * + */ +public interface ColumnItemProperties extends PropertyAccess { + + @Path("id") + ModelKeyProvider id(); + + ValueProvider label(); + +} \ No newline at end of file diff --git a/src/main/java/org/gcube/portlets/user/dataminerexecutor/client/properties/ColumnItemPropertiesCombo.java b/src/main/java/org/gcube/portlets/user/dataminerexecutor/client/properties/ColumnItemPropertiesCombo.java new file mode 100644 index 0000000..a18641e --- /dev/null +++ b/src/main/java/org/gcube/portlets/user/dataminerexecutor/client/properties/ColumnItemPropertiesCombo.java @@ -0,0 +1,23 @@ +package org.gcube.portlets.user.dataminerexecutor.client.properties; + +import org.gcube.data.analysis.dataminermanagercl.shared.data.ColumnItem; + +import com.google.gwt.editor.client.Editor.Path; +import com.sencha.gxt.data.shared.LabelProvider; +import com.sencha.gxt.data.shared.ModelKeyProvider; +import com.sencha.gxt.data.shared.PropertyAccess; + +/** + * + * @author Giancarlo Panichi + * + * + */ +public interface ColumnItemPropertiesCombo extends PropertyAccess { + + @Path("id") + ModelKeyProvider id(); + + LabelProvider label(); + +} \ No newline at end of file diff --git a/src/main/java/org/gcube/portlets/user/dataminerexecutor/client/resources/Resources.java b/src/main/java/org/gcube/portlets/user/dataminerexecutor/client/resources/Resources.java new file mode 100644 index 0000000..45dc9cd --- /dev/null +++ b/src/main/java/org/gcube/portlets/user/dataminerexecutor/client/resources/Resources.java @@ -0,0 +1,108 @@ +package org.gcube.portlets.user.dataminerexecutor.client.resources; + +import com.google.gwt.resources.client.ClientBundle; +import com.google.gwt.resources.client.ExternalTextResource; +import com.google.gwt.resources.client.ImageResource; + +/** + * + * @author Giancarlo Panichi + * + * + */ +public interface Resources extends ClientBundle { + + @Source("WikiLink.txt") + ExternalTextResource wikiLink(); + + @Source("logoLittle.png") + ImageResource logoLittle(); + + @Source("goBack.png") + ImageResource goBack(); + + @Source("computation.png") + ImageResource executionIcon(); + + @Source("computations.png") + ImageResource computationsIcon(); + + @Source("inputSpace.png") + ImageResource inputSpaceIcon(); + + @Source("connector1.png") + ImageResource workflowConnector1(); + + @Source("triangle.png") + ImageResource startComputation(); + + @Source("delete.png") + ImageResource removeAll(); + + @Source("sort_asc.gif") + ImageResource sortAscending(); + + @Source("tree.gif") + ImageResource tree(); + + @Source("folder_explore.png") + ImageResource folderExplore(); + + @Source("draw-geometry.png") + ImageResource drawGeometry(); + + @Source("cancel_icon.png") + ImageResource cancel(); + + @Source("add.png") + ImageResource add(); + + @Source("menuItemComputations.png") + ImageResource menuItemComputations(); + + @Source("menuItemExperiment.png") + ImageResource menuItemExperiment(); + + @Source("menuItemDataspace.png") + ImageResource menuItemInputspace(); + + @Source("menuItemHelp.png") + ImageResource menuItemHelp(); + + @Source("ajax-loader-big.gif") + ImageResource loaderBig(); + + @Source("ajax-complete.gif") + ImageResource loadingComplete(); + + //@Source("save.png") + //ImageResource save(); + + @Source("user_green.png") + ImageResource userPerspective(); + + @Source("monitor.png") + ImageResource computationPerspective(); + + @Source("download.png") + ImageResource download(); + + @Source("show.png") + ImageResource netcdf(); + + @Source("cancel_circle.png") + ImageResource cancelCircle(); + + @Source("delete_circle.png") + ImageResource deleteCircle(); + + @Source("refresh.png") + ImageResource refresh(); + + @Source("resubmit.png") + ImageResource resubmit(); + + @Source("show.png") + ImageResource show(); + +} diff --git a/src/main/java/org/gcube/portlets/user/dataminerexecutor/client/resources/WikiLink.txt b/src/main/java/org/gcube/portlets/user/dataminerexecutor/client/resources/WikiLink.txt new file mode 100644 index 0000000..f722cc7 --- /dev/null +++ b/src/main/java/org/gcube/portlets/user/dataminerexecutor/client/resources/WikiLink.txt @@ -0,0 +1 @@ +http://wiki.gcube-system.org/gcube/DataMiner_Executor \ No newline at end of file diff --git a/src/main/java/org/gcube/portlets/user/dataminerexecutor/client/resources/add.png b/src/main/java/org/gcube/portlets/user/dataminerexecutor/client/resources/add.png new file mode 100644 index 0000000000000000000000000000000000000000..6332fefea4be19eeadf211b0b202b272e8564898 GIT binary patch literal 733 zcmV<30wVp1P)9VHk(~TedF+gQSL8D5xnVSSWAVY>J9b+m>@{iq7_KE}go~11+5s4;8hc+i0Xa zI1j@EX5!S+Me6HNqKzU5YQwL;-W5$p%ZMKMeR<%zp69-~?<4?8|C8S?bklXr4v&Ov zb&06v2|-x?qB`90yn>Qi%Sh2^G4n)$ZdyvTPf9}1)_buUT7>`e2G&2VU@~Bb(o+Mz zi4)>IxlSY${Dj4k={-9RzU^W5g9|2V5RZ2ZulL9s2xQbZ@r6eP9Ra5u(s|C0Nj#&4>wTSkb?%#=9?@ z^oxDy-O@tyN{L@by(WWvQ3%CyEu8x{+#Jb4-h&K9Owi)2pgg+heWDyked|3R$$kL@A z#sp1v-r+=G4B8D6DqsDH0@7OztA7aT9qc1Py{()w`m``?Y0&gi2=ROcc-9+nU^I6< zT=e_Y=vSnG@?3Ue{BW5ONFttcE!R-R_W4O01|0-|K-YNXLo2`4Qv z`r1LxR6#yf3FB%T95gJnaKKivA~Z}S9A(ZxEDK}O3T04USJ P00000NkvXXu0mjf^IS-S literal 0 HcmV?d00001 diff --git a/src/main/java/org/gcube/portlets/user/dataminerexecutor/client/resources/ajax-complete.gif b/src/main/java/org/gcube/portlets/user/dataminerexecutor/client/resources/ajax-complete.gif new file mode 100644 index 0000000000000000000000000000000000000000..ca17bcdb0d0fe359f5716469bf27b6c5d6ba4ce2 GIT binary patch literal 137 zcmZ?wbhEHb6ky2SPMJv2( zHwX3X{r~?z0~jd&WMLIy;APMO@jzxUu$XN)=^4#odU}G;MUm&43tCE8EG5}md7Ql@ ko6`?%$}SP#!yv`PZuVm;%X*~^S1fdTd^(+2yBHX(0YvLBF8}}l literal 0 HcmV?d00001 diff --git a/src/main/java/org/gcube/portlets/user/dataminerexecutor/client/resources/ajax-error.gif b/src/main/java/org/gcube/portlets/user/dataminerexecutor/client/resources/ajax-error.gif new file mode 100644 index 0000000000000000000000000000000000000000..8dadfb99d0a3efe89834a31b1e6e1edcbac7f98d GIT binary patch literal 293 zcmZ?wbhEHb86zYITe+YSt++Bv_H#9pOzf|`RT3GRb@}M zEc;kebl2JSL_yjSX}Kq-cE37*Y?rvyOId}-E9YIYv3_M^{qf|%)eV*3KHPeL`@#ho z>F;+gU)EB6S5d}5I#B${!pOj&&!7X+3i1;Jo6~{m1s*zFs&g0*X5_4KYZcc{Xfm*6 zYCf!b$e>lq;brqLKFP^lkri2r8r+)~F;`7gde)t_W21pEyDPt z)`~r~W##4N0gJundTm{Gb#=t%th=YSuD-rL;c%C%_qH`RH)mX46?=Ny+S}U;9-o@) zy?x!?-4&l--95d1{r&w7%-nK5J2pH#+##$TcV@@N$Hylqd(ZRPx#{WY8OGW7&g|U$ z{QLsvZaLpwTV7sX5xhF??5?e^uWv{`JeN`a;!&5*wil1O4UTC%?h$28c-(6)*Ydc}>fH?G-itp^ zC_6emiU^o!&-7Ael9}AeC6hh0e#%T{bckFs)yZq;lgTbcmI70w%-GYW2TrO?opHMN z=hEp+D?8PS@|XnD=j4l-tIsZa6scZVK5gf+`PEYFFXr2Qn~}PpLv7WIMLlM(UM!yA zruA~kl(4LqOJ}65dbw;)*{he!7qn@;TCrqW)~l5(maTfVYR$G+uU2n3mZkN2&6aCf zuh;H)w(9k|J>OovUVng1`^|vy|99MgWk=gYP1_j`XlTm63DpKq_fiASf3cbv`7jZZwMaD=WCxheGI Y^ek!lq&XEER2mu(h6@3mLT$sX0n_NhSpWb4 literal 0 HcmV?d00001 diff --git a/src/main/java/org/gcube/portlets/user/dataminerexecutor/client/resources/ajax-loader.gif b/src/main/java/org/gcube/portlets/user/dataminerexecutor/client/resources/ajax-loader.gif new file mode 100644 index 0000000000000000000000000000000000000000..6bdc3b5e698ef1f0882270721fd706990336d3b2 GIT binary patch literal 723 zcmZ?wbhEHb6ky3UH!ouR`=lAT{vl};VeEIUl!ouRtojadCecHBd+kyoPPMtdS z?%g|}ArPSWPs+I{HL)Z$MWH;iBts!FE3qOcKQTowGcPTlLGdRG&>0L2ivPL&TtkAL z9RpmA^bD98fkHYU{UAp&u<9x(^rd9ZTe5)b(J7{N4g$>Gc2q|J&Z^5nGyhi$A(dH;4Gd;!(eDU zz)umGL1+X70s#$c6apd=aDD-30fHVDVgeKe8;t=~mKz0y5)dAg8yf=yp_(2L5)&C6 VtgWuB85J5B9JRK$wHO*906Q;YecS*5 literal 0 HcmV?d00001 diff --git a/src/main/java/org/gcube/portlets/user/dataminerexecutor/client/resources/arrow_right.png b/src/main/java/org/gcube/portlets/user/dataminerexecutor/client/resources/arrow_right.png new file mode 100644 index 0000000000000000000000000000000000000000..b1a1819238c6de8f9e50988f4151261fa6ba64ea GIT binary patch literal 349 zcmV-j0iyniP)o>#A+qW*AYQLZl(!&BX$x7Ik;qO170ssEM z@$bKXf%rGW?|(r27bf-TSv zD}TdX0CM*JhkLO)8|Y^+n~Q^sK~hqR;q|N647YFGy>NTZJsWr!5CaSfwJm@a><8NX v2&h?|FS^-G}e*;M)Q6>s#cP zI`Y#S($G6W`W@NI5g|L-MKl0Zmu$m^(0~^Lwo5OO~d#(vPfzd8+e%$~70|!Y& zK~y-)b(3Fc9Ay;6f8RGV`={$}r`a`WYh!8`lD1+ZRjgpv2Pp^zr9u$|UkVXXN~P7H zSfkYl7OVK;OHkZOeGvo&p@?EZHWtl;V2Xq`n5LU-wwvs>`7<-SJM+zaK7=+X^*r4R zhjR~{a|Qo{+9w~RB1i#9E!?gXZ@72jiCe?`=mR}kptGChKmNjZ zy~57X561x{!0hm`xS=W8{e4)=Rg88MlmgcQXBGSaakGIrGle~{2TO?3%<#+c+X4cL z*5)*p)4HdBd@L0_GXoqbXAdK`L~-+@@RydSMFDbcx1J zAr1{8cJBi~Uz#8)o+Jugmm8O+4Q2{#eAqpV~!1uwD>z8k3tuI;O`fn zkL$MI>N@Z^vBo?`q@Y$s*K6yx(>7$Xs6-N#zn|KVzaY$bJYPKLOMv`mU$w*4wZh_s zaoYBFLTRCuLK`O9j6tYT85`BJhsB>uD90Jh7ti^(t33Ve(SiJ_i3*SO{cyp*{LDf6zCHi%Z~QN=JoRKsqf_gfcKW{m$-5KpA7biJ0iO0A QyZ`_I07*qoM6N<$f<$wmA^-pY literal 0 HcmV?d00001 diff --git a/src/main/java/org/gcube/portlets/user/dataminerexecutor/client/resources/cancel_icon.png b/src/main/java/org/gcube/portlets/user/dataminerexecutor/client/resources/cancel_icon.png new file mode 100644 index 0000000000000000000000000000000000000000..158b8b1f607741a929c87cf76e9bd01d6c85f501 GIT binary patch literal 416 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 S%kxDI2IQoaC2Pe^L;nx>MZ7`) literal 0 HcmV?d00001 diff --git a/src/main/java/org/gcube/portlets/user/dataminerexecutor/client/resources/computations.png b/src/main/java/org/gcube/portlets/user/dataminerexecutor/client/resources/computations.png new file mode 100644 index 0000000000000000000000000000000000000000..b3f06267377277d97e2dd06691edf55947cd8c53 GIT binary patch literal 12178 zcmV;DFKy6?P)Oz@Z0f2-7z;ux~O9+4z06=<WDR*FRcSTFz- zW=q650N5=6FiBTtNC2?60Km==3$g$R3;-}uh=nNt1bYBr$Ri_o0EC$U6h`t_Jn<{8 z5a%iY0C<_QJh>z}MS)ugEpZ1|S1ukX&Pf+56gFW3VVXcL!g-k)GJ!M?;PcD?0HBc- z5#WRK{dmp}uFlRjj{U%*%WZ25jX z{P*?XzTzZ-GF^d31o+^>%=Ap99M6&ogks$0k4OBs3;+Bb(;~!4V!2o<6ys46agIcq zjPo+3B8fthDa9qy|77CdEc*jK-!%ZRYCZvbku9iQV*~a}ClFY4z~c7+0P?$U!PF=S z1Au6Q;m>#f??3%Vpd|o+W=WE9003S@Bra6Svp>fO002awfhw>;8}z{#EWidF!3EsG z3;bXU&9EIRU@z1_9W=mEXoiz;4lcq~xDGvV5BgyU zp1~-*fe8db$Osc*A=-!mVv1NJjtCc-h4>-CNCXm#Bp}I%6j35eku^v$Qi@a{RY)E3 zJ#qp$hg?Rwkvqr$GJ^buyhkyVfwECO)C{#lxu`c9ghrwZ&}4KmnvWKso6vH!8a<3Q zq36)6Xb;+tK10Vaz~~qUGsJ8#F2=(`u{bOVlVi)VBCHIn#u~6ztOL7=^<&SmcLWlF zMZgI*1b0FpVIDz9SWH+>*hr`#93(Um+6gxa1B6k+CnA%mOSC4s5&6UzVlpv@SV$}* z))J2sFA#f(L&P^E5{W}HC%KRUNwK6<(h|}}(r!{C=`5+6G)NjFlgZj-YqAG9lq?`C z$c5yc>d>VnA`E_*3F2Qp##d8RZb=H01_mm@+|Cqnc9PsG(F5HIG_C zt)aG3uTh7n6Et<2In9F>NlT@zqLtGcXcuVrX|L#Xx)I%#9!{6gSJKPrN9dR61N3(c z4Tcqi$B1Vr8Jidf7-t!G7_XR2rWwr)$3XQ?}=hpK0&Z&W{| zep&sA23f;Q!%st`QJ}G3cbou<7-yIK2z4nfCCCtN2-XOGSWo##{8Q{ATurxr~;I`ytDs%xbip}RzP zziy}Qn4Z2~fSycmr`~zJ=lUFdFa1>gZThG6M+{g7vkW8#+YHVaJjFF}Z#*3@$J_By zLtVo_L#1JrVVB{Ak-5=4qt!-@Mh}c>#$4kh<88)m#-k<%CLtzEP3leVno>={htGUuD;o7bD)w_sX$S}eAxwzy?UvgBH(S?;#HZiQMoS*2K2 zT3xe7t(~nU*1N5{rxB;QPLocnp4Ml>u<^FZwyC!nu;thW+pe~4wtZn|Vi#w(#jeBd zlf9FDx_yoPJqHbk*$%56S{;6Kv~mM9!g3B(KJ}#RZ#@)!hR|78Dq|Iq-afF%KE1Brn_fm;Im z_u$xr8UFki1L{Ox>G0o)(&RAZ;=|I=wN2l97;cLaHH6leTB-XXa*h%dBOEvi`+x zi?=Txl?TadvyiL>SuF~-LZ;|cS}4~l2eM~nS7yJ>iOM;atDY;(?aZ^v+mJV$@1Ote z62cPUlD4IWOIIx&SmwQ~YB{nzae3Pc;}r!fhE@iwJh+OsDs9zItL;~pu715HdQEGA zUct(O!LkCy1<%NCg+}G`0PgpNm-?d@-hMgNe6^V+j6x$b<6@S<$+<4_1hi}Ti zncS4LsjI}fWY1>OX6feMEuLErma3QLmkw?X+1j)X-&VBk_4Y;EFPF_I+q;9dL%E~B zJh;4Nr^(LEJ3myURP{Rblsw%57T)g973R8o)DE9*xN#~;4_o$q%o z4K@u`jhx2fBXC4{U8Qn{*%*B$Ge=nny$HAYq{=vy|sI0 z_vss+H_qMky?OB#|JK!>IX&II^LlUh#rO5!7TtbwC;iULyV-Xq?ybB}ykGP{?LpZ? z-G|jbTmIbG@7#ZCz;~eY(cDM(28Dyq{*m>M4?_iynUBkc4TkHUI6gT!;y-fz>HMcd z&t%Ugo)`Y2{>!cx7B7DI)$7;J(U{Spm-3gBzioV_{p!H$8L!*M!p0uH$#^p{Ui4P` z?ZJ24cOCDe-w#jZd?0@)|7iKK^;6KN`;!@ylm7$*nDhK&GcDTy000JJOGiWi{{a60 z|De66lK=n!32;bRa{vGf6951U69E94oEQKA00(qQO+^Rb2LTHM1|Am^KmY(B07*na zRCwC$oq2dw)wRIa-ebf>TY9f{~IGj1-KNq+q0Aq$C9+1tTRX7%3PjNx?|LNJ$DtN>VUVF#3~V zL~82__gy9&Ro+>-cg_04Bm2{P4|cxz_KsF>(07-e#OFz zMyET>XQmPOv(og0GEFC{PC7&JhW2n{N2H}I5|dPe5ZxfUuB(bF0K^qNJ^koa-mcgO zAJ@I~;qEqG@A~;FQyxW=Q$1|4r77m0HAxKWDEcpLja8DxIjemM-ml~xn)P|9sl!TAHTAC-J!d0 znKmL7ZfXthrHNku^yYzvH=k;FXi@byZk=|1z@UsZcZS=2(Y8R`ACdwwITTYvF-0d- z;Bd0_MS<%ne;kG{{|^vC2YIN1-YI`wV6Uy%efQD}hWQkG_IJEd*U(3SA1=MT=h=U*?IsR!-WAbMp^PtJcn93L(#Zmb_vxJ@@^Sd_WIsa zYOznQ+B&PcxT-v}PgPh_H3OsLdV)cS$LSD7UQ+a*J-xb*%RM@G*V5_}zEo5_5|uFS zYhh;q2%$`u;|#%YXE>Y=ix!pz4s#e`l+>9SLI@aR=)|GWQ%lAur4%8I80{W3EGd-7 z$m@$n;!2jw0RT5#F}@EN0Pv$HR{r(r8#3M2Qx$mViRG(1v=hF($c3JG=q8Ud?MF|n zswIg&?*D^ZYk2;|ZP}VH_WsAqoBC}ZQP=joct6i`XK2$`UYtWIWsCr$j4@yo7^Rdl z##r*d$%dzdQiB+V9G4Qopc0ILs_Kb2F?3?+MAr#1C^aY{j1pN@+qy!@`;Q%+IZ5cN zbM0f&9S^+O+@l0HTb^s$GCg zw=Fj(zop6BmCyx>7R(qkbNXlvI2#X#4z+b|->+*50EbXgn@VmD$)TnWO*1TJ5daGF z)BE4e2yojUKDg_GG56j!-R(TC`EI;&`UNe%qCEH5iu^2hnn@I2cw_r7Kio2qrzo7dd^bEU2)>IC22qDHO!Uz!Piaw=0_omCHyEE(-f&1jM-5+c^=<~IN}T@d5*eFqd4s4Ncc{#g%S13_+rh;mqKaI1`0K_3fcJBy>QGWoEf`O;Q;F zMlr%10>B6%4q-^hw7K2qOtS%i$uzjW`O5A?uk1bq09FlI5C&ifkY6A}=!a&rc$Q&Y z|J3^o_rIu27S%sL^>vTSF}f({lO4?hFH<5Qga8<&j55+x-`vm|%W%6e0=vs4^2lnj zwY0Q$btWuUlabJEW+Vz?r$UmZOAZ(Yz?kruX%z20)HrEONzyJdw1<>LCIJ~vGijQB zmQCnchJ+~XTU7u6hppSFSyq%2q!vk*RXL_eQ6&*m6A>v9_XUF;?LMp%LpE$!z|3fG zZbIht=JrP54Ox##x|Z#9hQT2*QKEc|2rQKyG{vZHs+tYrwV619ukH(er2}VYmy|f?)05oh)espZokxAvON7`Ea0a;Rz ztTT^0JtHg2B3L^D!B9A&GNvdx&j}8*qd?ScOtOJuL#hqy4y4#=jOVb`V)k~$)&+cU z_GH&y@A(8n6ovB9B>-R{2@{b-s)$q;m?}^;7)x{p0)*<4s$fyXhCvirl1ZmOMl?_p zRFie4$UNrV7DyAR+f1Dn?6x2?k1m>6lIF0lUUvx2syzS3_VZ?+k(A>6yllFOa99AH z0wN3uZ~!c!lddkm#p+ZPg%PYM5ml9l!X+Ypmt9a48Bxf|&8+Y2bXYBv7#MK~VM56$ zr}(|QuM0<&$5(6t?rg$X9|>&O)_j5$fKry+)%RmaMf_QSk(=$Q%y%_(#_T*029!~q zQp%8k1YcKIQGOAVWyVNmmMf+(Uo_lB+oM_Wr&ckUUyNJ zE92)+uO=Lvb-C}iD_8&b?U}Bl8~d!x^o6-5yS1-Fa>kfR@RZ67wcdHC2CKwfD8!!*C8rOk}_M!>3RG{4$>Fp5CX9FZumrxA%KAjsUm;?AS&ahTUq( z%l7Q9?+{HE0E7^W#+7eeckxwoC;Ng@rpuby7}$HTy#q`fC#I!)!isvJ{%|6y1mg)+ z5O{lS52C0lp5 zU48$n%ir65Mn?t!6z6#|((IB#c!5_8?XuYu(`=R>Ke1Xe!6WZ&+Pb^#Ter`cKWD;} z$)nl=iG-vP+Iv$UrQ5kPRhD~Z^6TF{A6+UO;=5H*i3!y z7Grzohbl3HjqovU)Dmb$YPD_rmgR?|)pkmq~EW%M+`%J^hbu zx6P=$xTdtc)Z=zqF-8c1VbD&0;=tjqH5(e1?>l_#lJmiu1Gir{c_=XMSTI3Rw7xyJ z7yu!ZkfS^@osKlSr6VL!h9-{Abvi7+{I4}9T=kLH`_U`idnio1T@=`P==ZA$@ci}z z&u>4_y-?GB9^|EWcU-e@Y?{L~Xc*u5`l6v#u^=nsP;1cTuuQ4U>*|WHIMUMB!1_1x zz3#U^9l`3x?M;`?tvEvqH~^I7xe!KKE_-F6=dD$>kdkBM-GA;k2t9K!N^@Oyvv|>z zQbjTTzIuNOz;RP_ySJr1a^_$ZWM^bKZF44;?Aq@=!l@|$C&h<`-$cZ71pkyKYVA=+?vvU>K~3LWVJBYeYiRJ*s@R7hXbdnJ~JK8Up;i`0AqQE z2xIwYb)WAzA}bmIGKqpH@M(5aRgrtr=-!~ePZ&4Z02UZ2GUdC&afs$e+&r2;V~j~HVHVFsaQ6JMV1Dlc#rW~b-5?ODe=XDX`k&7Z9JeB^u# zmOpUiv`Gd1s(Gg}w0XN?7d`muNZDo(g)e^l6^!VA{QRY@GM}zVTVDEZzc7YkLT~ZK z!ZE4Ge#n3!mh^LG000Q_JmPsw8LMsR+IFzrZV~d_j(m?j&*P{pa+l@10l;kHAA8`E z`9E7eA`gGx%yIpa=1y_!CAvmF0>-=eSo>7x;;&vW-(nv-e!?jx^km3fW~)Z?lz z81!W8IYJ1*{${@{s{+UM(4a&!3{|wGB_FtF3u6*EQNWbYMsMg~i(lj*!!D*-gn~@R zjH;rEm4)}s8vn-)!!=&<2HbPo^Z|9)J}uC5Yep?xk+a&{G0ghRae3y}lzzBo=le|w zju>pf0n2^CxaphE_!F9N%&iCjhfzjecDmD!y89UbKxqG`*ifVC1)j2MI4ML7VSq9hi{|fZj%H1wReX4-Y56Jt4ebTBNtPIIW){j@3ImX0JM2SZ1A})1_6U1gel{A zV1`Nzofw*7=~7SV2n3$I*2Iz|`Y|8xyS~ z3JM1W=41@M!9by$ z2D~Dqdn}6E23bxC}F?^p2s8WYl|7>Ko7)q zj6erW7>+aZBwHvauT zvN8$jC45oUnTgkKyJpNS7tRt49(0K^!~qqVYGyK~`owW#cmz9Y+lJYKhZ_7NH7p`A zWo^T-M(Tz@pery$N610I;DJSnpkWI^9M5zUl{rJo%}Psmh`k>o0%$tpIb-P+#kViI z*bRb7^SMzh(@e}5E^w>YEUam032u%LHy>p~pB4N^>9pV5V_9 zlAXNjGJpg%YQUb&32Kfk(V`1g74Z(B8uj4+H&(ata?9H0D9pe9fqNOOwJWfd(Z&TYZP zrK5EHIDH0VFp1c16%Z%3ba5MY$$$IDp+Ek0&BkqO%v8pJWu45euDtWwiw_;kxT1hl`A&rExg>aTVjhM?PjxGJp(z!h5 zAO7vfBQ?D|zx}|>FN!XiT{h%9G_{4k`P_)r=Ydz(jw{b98{}rbFBnS}AI){Oc55xH zWFlf#ffocbFPMlDD=I2837F`ZLlBebfyVIOeMcG&*ZDgeI=F1$_#Cr3HVX?DD`y^s z1)FNHDWkIPyMC6_VR>ZPC;v)>VC3YU|6ToFmVI2sP>d_Vu=K#AAHaypeLsKi#br0< zWDa6KKhTrD$Nup0JDXeFqMl|ki&i@?npI!@^_R@4EYID!ziaRQ!-wnlNVne9A9RUpHi87$K@B81^!z0Z{kvCApHeW`G4bu6zPAtL z5wA?H#=rRFb!Ek_k%XbB+C2~b=MEp2XEAJ6t7x$cqJ=79F5K=5b^#P3Zx;Ab`Od57jLr9?HMWL+`qV!+#lvvgy7n|Z9X0h0fSi-MA3`|k>gE(04Ht5#~f)A z!iuufe|pE9U{GrBiZ-@}H*9Tsv#x<5IFnLsNuO0+IDSk{es-E5azKFr>k1_5>bur$ zZu}w?fHNzL@^WWSD;{0qc4b&cm%7l}wA1X$p1*qyA8=BM?(HO~6Rt5YO>n zrs(WO0sxe;OQ(&xY+BjIMnMl=}8?M=0Ts$Vb{kilQ5YD5}AL9c=b@MiSR89{b|X1F6uJxn^&=C_4X8iqg&~+qMR)I@C}6nV}ntF z+dgAVPR*EH0JwVL*c5z`lQ{Mk9I7N=|Y;XCInxwQXD_~pOv ze00So0La&c51+l=ZWD(HLpR95!`{YLe>^e7bcwn_mRwrx56KTd{qeWII&=Euf`bj- z9ebKi<(GLfIn%e@s8eJFwC9HCE zPW6P+wvOoI&wRRI_UP*`8#felNGOtc{%`Ac?rrjg;>|=*`61fU7(&0gcGA*oW>N|m z!?Hhr_}1EeT|!@;XFSoXGx()TYOY!^b+Xi_st5px(!MWA`bIvqu;LrH&HwwVeGe{QcaD&lpOyWW-&}j(aN7?bf1{RJ z`hAvU%IvW;Q9Y?75Q=yDB6r<#@#2do4iv_Y+Q$EQ@@=nR!;~P#`pt%TTIG=|$K7$m zoF|_7?73}q=Yqbp@wua+nx1^Jge%`izf|ul1A}_+!ctf z-*VvH`fxI`Vto+R)q5vZ74-w7zOgeoUMRwIJp3IuUSzR|x@IKD55gy|KgnPi#=1K_ zLV%CoUNT^m9{bj}K^Gu|8H8LiyX@@3xNGS&1`v))R*MM_*xjE2I5X_oSs6un?(mDN zKlLMy7zo&o+Qxoh5JFqLNAn;S=D7udmu2lsI|puV^KaR4SXFg|5Cet)RaN9o7+Z`G z5Xv|Xhr-gP?FR#)c(Oq$r3HEJ=~K$gCV?gkL=u~~*9SuJ?|tqk6O`2#hff z<4{!Exb;vd5>FnGFkso946}LCsKU&Jxw)&o-m^jiQ>ZNSL}Rj|8W#}P`SQRy$Q zt@%7ej#V&NUEunbu3N9YP!xrDTzT&GPuB*HD**fbS03@+b?ZEgv8wBTdTI5B$Z;wP z!~T{w-+%u6mT8mn&K8U-%L;8)v7;+8$)9ac(9JRC4tF(sJM?hhpl zp&hjik(eY3T&p+md5CbtI9h;Fju`Ll?}{f>lPDZ&@NVpo5o5;|0LDH&^{F;+)vo;rVFhyrJ` zh+PBD>-NZ%Gj6+fvZm|4VD$6N`?>;AS=KI@Gd?>ro#Svxp>uSJ`_3DtuKM)g0S=;Yh2pU>Knodk2$4(=Qa~=jmh$F_Fn(>A~ zH*V`Ek=^2gyr+M5SwfP3`kObG?+X9`;zW)Z6k!C6!x$lyjIE2sl~`N}*`>Vf^j|)> zFzW^T?>^hr$DKDugMpyra#=h5r|~6R_?(A3b z?~L#~e)30`_EA#j;n`QW*sP{3m*X^@RiC>sD8js<-*fB5tsT)@e)oPKB}Wm{jaQD3 z#N=2)9l~CO!zdb8+PflS%QNqsT+v6#|N3m#hieYxWTiRmW=h%rr;&k>nHpK1bXhj+ zeQq$mdfn87r0(9|%98Iz8N6^D4u%tkL2kZkLf<9BQ6;Hr|Nj~pn3A|?S-LC*iNiPnGYk@r$>{W-BLDydxJg7oR7Lq2Q_a0wz`i$c z^4ceFxpm1TgHTz~PsiSG5Vb$mMA`2I+Vkq^Z1Ov$fa-|+Fe+I#Pq zcjFZk7GGSsc4NcyZ*1ME9n~*$bv`5Av}b>drn98l$^fC0&fplJzN?84j>Q#^(>}g3 zXZxEnBweUOvC#(z&CX+aqs(So{3?eHsr{1@45bh9XjauA5Sp=CGVx2Zpg(S4DyE z>!1{Yt`h*r&FgXMN z8n((jIc9Rp*AsJVrr2#}O*0Df-Pf0Ayj$l#)`!8WDYwrqci7FErj0Jmxuz=nodd@e zuxs+QGs`_Lhob0X%JVNDoAd7R1ugN5YA~A>6^uXOSfB3D7KKbH^ z-6qE3N_v{La&)e$8M)cc8^(Ix-P@rb<6FcV`b`%U=jS+egPfX0GR-ZUKdUUuW1ly( zEZt!ughpagC@RMi3ZsyGrP7eCQ^&SvuhR*CLg{0Dav1}RQ8FzEr7Y8(_U*4(MZ@PNs_{!E!e}pl{7zjLzGQZ(VUV`Y=;U#wCQ%@SavWZI&8({OW`8iM8zdQ2m7n7pTaj-P1;gk| z>(vQu@rH`>(?^%MqcORuH7Ki^tm+65#t032c|ErMh2C=9^2aOPxU?`6Hg;?D2M>GW zan)uM31LYd9#`6>7f*>XB*_{=pzDNChB4x~5m20X9tT75owbbsB0~sMQeK+f|1>qa zG&`x|V@9`0_>V9CbMd@MMfo04;3;FELcG5u9SK<-W&uf72iVaRMTg{BIU33xdb=s8 znvt{yj>x)z0LiM>>J6@3vvY?caMWN3ag1qj8Ae(pCm{A~+@ zGvOTlZ!8qy9>s@Z?wT>4F{5*PA$RghQdi&p%|~8q5$uCa%bJpY?Q9ftRV?wxC%;;l z=N=FY0N7F6_}|a3{wzRx^nJuqgJW0>lK)Oz@Z0f2-7z;ux~O9+4z06=<WDR*FRcSTFz- zW=q650N5=6FiBTtNC2?60Km==3$g$R3;-}uh=nNt1bYBr$Ri_o0EC$U6h`t_Jn<{8 z5a%iY0C<_QJh>z}MS)ugEpZ1|S1ukX&Pf+56gFW3VVXcL!g-k)GJ!M?;PcD?0HBc- z5#WRK{dmp}uFlRjj{U%*%WZ25jX z{P*?XzTzZ-GF^d31o+^>%=Ap99M6&ogks$0k4OBs3;+Bb(;~!4V!2o<6ys46agIcq zjPo+3B8fthDa9qy|77CdEc*jK-!%ZRYCZvbku9iQV*~a}ClFY4z~c7+0P?$U!PF=S z1Au6Q;m>#f??3%Vpd|o+W=WE9003S@Bra6Svp>fO002awfhw>;8}z{#EWidF!3EsG z3;bXU&9EIRU@z1_9W=mEXoiz;4lcq~xDGvV5BgyU zp1~-*fe8db$Osc*A=-!mVv1NJjtCc-h4>-CNCXm#Bp}I%6j35eku^v$Qi@a{RY)E3 zJ#qp$hg?Rwkvqr$GJ^buyhkyVfwECO)C{#lxu`c9ghrwZ&}4KmnvWKso6vH!8a<3Q zq36)6Xb;+tK10Vaz~~qUGsJ8#F2=(`u{bOVlVi)VBCHIn#u~6ztOL7=^<&SmcLWlF zMZgI*1b0FpVIDz9SWH+>*hr`#93(Um+6gxa1B6k+CnA%mOSC4s5&6UzVlpv@SV$}* z))J2sFA#f(L&P^E5{W}HC%KRUNwK6<(h|}}(r!{C=`5+6G)NjFlgZj-YqAG9lq?`C z$c5yc>d>VnA`E_*3F2Qp##d8RZb=H01_mm@+|Cqnc9PsG(F5HIG_C zt)aG3uTh7n6Et<2In9F>NlT@zqLtGcXcuVrX|L#Xx)I%#9!{6gSJKPrN9dR61N3(c z4Tcqi$B1Vr8Jidf7-t!G7_XR2rWwr)$3XQ?}=hpK0&Z&W{| zep&sA23f;Q!%st`QJ}G3cbou<7-yIK2z4nfCCCtN2-XOGSWo##{8Q{ATurxr~;I`ytDs%xbip}RzP zziy}Qn4Z2~fSycmr`~zJ=lUFdFa1>gZThG6M+{g7vkW8#+YHVaJjFF}Z#*3@$J_By zLtVo_L#1JrVVB{Ak-5=4qt!-@Mh}c>#$4kh<88)m#-k<%CLtzEP3leVno>={htGUuD;o7bD)w_sX$S}eAxwzy?UvgBH(S?;#HZiQMoS*2K2 zT3xe7t(~nU*1N5{rxB;QPLocnp4Ml>u<^FZwyC!nu;thW+pe~4wtZn|Vi#w(#jeBd zlf9FDx_yoPJqHbk*$%56S{;6Kv~mM9!g3B(KJ}#RZ#@)!hR|78Dq|Iq-afF%KE1Brn_fm;Im z_u$xr8UFki1L{Ox>G0o)(&RAZ;=|I=wN2l97;cLaHH6leTB-XXa*h%dBOEvi`+x zi?=Txl?TadvyiL>SuF~-LZ;|cS}4~l2eM~nS7yJ>iOM;atDY;(?aZ^v+mJV$@1Ote z62cPUlD4IWOIIx&SmwQ~YB{nzae3Pc;}r!fhE@iwJh+OsDs9zItL;~pu715HdQEGA zUct(O!LkCy1<%NCg+}G`0PgpNm-?d@-hMgNe6^V+j6x$b<6@S<$+<4_1hi}Ti zncS4LsjI}fWY1>OX6feMEuLErma3QLmkw?X+1j)X-&VBk_4Y;EFPF_I+q;9dL%E~B zJh;4Nr^(LEJ3myURP{Rblsw%57T)g973R8o)DE9*xN#~;4_o$q%o z4K@u`jhx2fBXC4{U8Qn{*%*B$Ge=nny$HAYq{=vy|sI0 z_vss+H_qMky?OB#|JK!>IX&II^LlUh#rO5!7TtbwC;iULyV-Xq?ybB}ykGP{?LpZ? z-G|jbTmIbG@7#ZCz;~eY(cDM(28Dyq{*m>M4?_iynUBkc4TkHUI6gT!;y-fz>HMcd z&t%Ugo)`Y2{>!cx7B7DI)$7;J(U{Spm-3gBzioV_{p!H$8L!*M!p0uH$#^p{Ui4P` z?ZJ24cOCDe-w#jZd?0@)|7iKK^;6KN`;!@ylm7$*nDhK&GcDTy000JJOGiWi{{a60 z|De66lK=n!32;bRa{vGf6951U69E94oEQKA00(qQO+^Rb2LTHO4n~$d^Z)<=YDq*v zR5;6HWRR(3fB_|Ex&I6}z`ebX7-4KCVl<%3GZCW!T_dAX{B)u;AOj`_GQg-Nm?q?y zCI;Nw`-qW=R1I+F-P`+!k&unZ@+{aSkdqZQ!&v@5ZbK1Zl&!+B1zpW(iWt>2P?`WO W3n$0sRUlyi0000ZAcqu96uFxi?Ob&D~ns*!#Ug-OYS9a<}@=g7ngt$XQYNv#7pjpxtV*}-Q#iw zDN&24qii2qI=g|cw6y!uB3s$m7!6aHt_(W{L;9h#qtdM~3TrKHpxwn9yAN{*ch3vI z-|zqSf#(nJ^5i4u{xoW34T`PgNM-<5P#Kjm3h3F%*@PD8s1`^Yd~Xg0RR9 zz;4L#!|yJ`77Q!Hg`OCSMLL*-EZVpN#-@vk!N#zbR$bu|gAjo@91tWge(#$rI1qR* z-s_Bz5hVaqLMW@kXtuK_ksVBUc)axu(4sSjfCv!>bTKVyjPAv^bs1w{xF&G04MBrm z{BcsTNEZmmDg;g&X-$wW3b-6L%0YS@p4S0QQY1mq1nIU?B;#~5Bn5UJ+=!;~Nv4}^ z--%_Mym$&Bg&~McCS%LkZL&H*P#%wmAZdc8tp>uX4NHjAt&-MIRA8Z&Pz41EvIGi> zTwESPUfjs^aS5WbD=TR`Z8920=$t}OHnLDs5g3X5KU5TV(HiQ8PxAdwVXbFafkZdd z>;cdt^CX>|$3+MzWTY6%dFzZ4~GgBwo&F+xSR?2}>H{qy!AJ zUffWy2?Eb}{4P67`dt)hcT!Z4^3#4-Fc5UQT>+|z^|*^%R!$6wP(np6|Agz_lUuNY zs2Gu1s0!~vzFn0?uw61E?465aPrV&3zjrRqJ-LLD3{e>DzXn~rGTc+x?%LKk>>3|R zhTB!c*4OWT0WhpY53~Lr{d&AVU%K_^(Isqg(>Jo!+SpWcGTIL+e9s-I`unGKJ8pRy zJNvL~zGU*s+J<%F$L}TTlW*6}!SVUiwd0pg){TE~uCC*^(r21!nm(F)VKTjX|I1m+ z^!a=7uhuuLeX|#qP4)-Luc?sf{#bQ+U1~B7mVPe>3uoT`g&x^@`2K~Px7Ol`*x>_a zJ1V_)t*t$E^G4-V&fIXDPTR^Yrt;|yAO6z8EySeI!d2wQD0SncHh}zrZ zW`xcA_UHE1F6x%M`0;$jC^=dEY@jlfJ>=`#s)^5>U1@vkSUNx6JA3P3ZZ&dsg&NuX zt1`GbGb8k$e!6!x=g2w6%$Via3d!deeK7a44-pGTOjXg5ioV<$#^=({FMYgpqjLGv zJN2=PB^Di9EQPP2+>6O2ZhGH`59;TRepit^RXLX~`*rls##fv7SNY!YXXmgJ>-FH2 q>&|C~o4P*VIFl{8>igq04CJxPBk2=X_J_-b|57;E$zE*hANvQAp|y$t literal 0 HcmV?d00001 diff --git a/src/main/java/org/gcube/portlets/user/dataminerexecutor/client/resources/delete_circle.png b/src/main/java/org/gcube/portlets/user/dataminerexecutor/client/resources/delete_circle.png new file mode 100644 index 0000000000000000000000000000000000000000..5aa62e22fd89dd8520b62550e103e93252580051 GIT binary patch literal 852 zcmV-a1FQUrP)9o%itxII)B<{6t`p!&(D84~}j?y5&psqz5AwrYlBtt8o9 zbGzR-)-8W9&-l9wI|8Nm-{FBLo~HV9v0(MNMSCzub~H~Wp93`AT9atKhTLqRqR#Bt zlLwc|7tXWiy^nSrTs!$z!Omujx&04ghnt976$pKh5-f*wWH&NDM&sh|#6dVav2bc> z+riZnM>AG7+ZjB#AKSl$Sz1LWDJazwkP6+2NM{~HjXy;Fmy2|xwmbFl=UuU-a>gF$ z#|}1oaH@N-QaxBH&>$`?VOFkS4fJDTeF-40ojB?xQTV8Pe;)Bq6`caY0@DW5L0b-3 z4wx2bfmr*E?8p#F6z(e>f8DdRlwRV8`M&%hdi_rfVIp2T4t@Q-aJ26ARvmTf7&Pi+ zhjJu-I3z6FvrrN(V@MN_F{HW&-3GV1)*507N}Bbp1MAH%Bry4V`E!eYtI$C_o)3AV(*N%2f>0 znY-gFufFtr!O9I3?|tSeGR>Qa@)dNe0ZL&wE^1;LH8RP~pO%r$R$=eC#pP{*wO3yx zJN!67X}Mt7cF`RjrhjS=-uMV;2r4&d|5c*1zCqfJXLAo8SZb~R!SvVP?l`#o%3-Fz zS!DIOXB{%;8P)CVOFQupfN-6f<+>}VWNzmBALG@R4>NOa@y=`fZ(V-jkf+h!)?4~B e-~ABYZSP;U6lGLo#3(}m0000IqP)B-uLEv?;GdJmuj;SNoKIW9LU4Mx*?~N$$$5kf}1pVK|&%l-yrhZhsZ5`4$M1=jQzlkCAYHn5{%( zu}vJO_FTG|m$D|clyK?%Qqk>ppH6Fiw>`)2ahL8@Qm_1*6d%j7?3cCdiAuhiHSbi7&|hOcxvy@NBZBmG+hpM!Chdw&k1ey25eTN<;v zH^_ED$-YVtdq%6pDoc>Q-o|x)A$F~dF>y2;!tec`;iBiPx90rkv`RPXx=I~FnXUvB z$={iDc1zaRP#HIlV;Ch#6$B^Vq-l1Y5PEi|u+=G_KzUpop>JCKD5W5kg3)+l2$IE^ jLLbh=C1my^{tGYwv~lu$hIg0q00000NkvXXu0mjfG#w8Z literal 0 HcmV?d00001 diff --git a/src/main/java/org/gcube/portlets/user/dataminerexecutor/client/resources/details.png b/src/main/java/org/gcube/portlets/user/dataminerexecutor/client/resources/details.png new file mode 100644 index 0000000000000000000000000000000000000000..8200ce818aa7330ee41f630e0355e1223ee46625 GIT binary patch literal 1169 zcmV;C1aA9@P)G6Bb&N}Xpn9pQ6rJY1V3pke&mBGgv5}Lt+;3qoJ=uFVuG6{ z8kB`e%wz$_?4bL@*4DP8rR{sq``YxeDqG)uo1Wz4=G}MCIlp`EIp?0sfRZ};r@Uln zCT#!5uQ=i1(`_|_H2N4di(dFVA{+IsGB9ncjf~w{Rh++%FN!C!5^^FCy+b%7kx>ef z=}_PE?!jdNXg@vC#Oaw}twq=BHtS$y86=6N6fu|)%GdIGz+zxv<#b5rB}C>$+(?N7 zIYIKD>3HB*Y5>oj9N+IUvB7!=OBPAEnG`U4TO@|1C3nQ@8MsV3+;7zrDF%PU@KKHhX{;oza~hEs zNo>T^{&Ra85C03m)7>LYX5KJtHyIF#&8t@Y+U7NA-{`<}Du)B-!i8}$ay!gOq;p87 z?=*kgwXqPGy3$Wk6oVF{0TZ)H2!g1JJ*&8aahcXwIJDH7ms~IFHu0Ri>tM-l0l=1H zm%SDv-#Q&l5+H(VHgV-4l+5HS%E&fM#;R7?rYyr2cQ5#|c>&pMj_O>m&dg&nk;Ph@ z0hey3@XeLEiZWT^36^CGHp%B;VGBJZ0^9R zA@mJRs6PAahuXI&w_%|uh@zhqvtd<1xWITKoyGfKT*hY?!|LAx4E##Vro1YCJT+}= zc`+`D(ssG5F2!3PaifaUZh6O)e}wR;DTzi z<6hBDBF;a1Y!Cg@Y#}-Kc6-UyNg`KjQ|a%1x$})4?^@pD^j>7|I_@obghX|7F|C+V j`VPdq_fkF2{}x~XB?1miZl@ob00000NkvXXu0mjf`u8@Z literal 0 HcmV?d00001 diff --git a/src/main/java/org/gcube/portlets/user/dataminerexecutor/client/resources/download.png b/src/main/java/org/gcube/portlets/user/dataminerexecutor/client/resources/download.png new file mode 100644 index 0000000000000000000000000000000000000000..f588bf63c6047d41b5addafab7690105478adb4d GIT binary patch literal 605 zcmV-j0;2tiP)7Y2rzJLjHr?py^Z;C!ReSlrv&GfWQE zY&L(C%jK_86phA*Kmj;mt^H}OjSjp}YP`>~Om(~6@AZ29a-~vHgTX-OcLm^-h={dT z(lnJMNhFSA+1}ok;czHhTU#O`((Co4)9HKwF3!x%_yEq|6wk$0F|j^m(|LPQV| zeBURIV~jC~2w@nG*?SW$R|?1ZqtF<0z|=gvDQ&}b-Te-jj8ds|XwFoCTuyK-VCmUB zwbBB5q)C$G{{eE^wc`uiUb=(MQZ~M9@RpDK)5d9`wMGO4NOhWj!s!eILG9ww!7>-lnH!I<$WFZb{74TTTzg2hTw}ex#{66r zgQfp#;10hKs8hC=-<(Q+ zw{^)68*j(DO%vz@Oa=2J-OHRC|6%*Y9WlP9!_D>w+0@s?*m)FzLNQF pJZ?t9;TX_XS^H3_0%{He{s-&5gNG~{Dggih002ovPDHLkV1l5^(Xapj literal 0 HcmV?d00001 diff --git a/src/main/java/org/gcube/portlets/user/dataminerexecutor/client/resources/folder_explore.png b/src/main/java/org/gcube/portlets/user/dataminerexecutor/client/resources/folder_explore.png new file mode 100644 index 0000000000000000000000000000000000000000..0ba939184d5e2257e380004ed799f00f66a49277 GIT binary patch literal 679 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 Hu0mjfT>AgP literal 0 HcmV?d00001 diff --git a/src/main/java/org/gcube/portlets/user/dataminerexecutor/client/resources/inputSpace.png b/src/main/java/org/gcube/portlets/user/dataminerexecutor/client/resources/inputSpace.png new file mode 100644 index 0000000000000000000000000000000000000000..2d896eb148da0075dba9b51bd1456bc3421174f3 GIT binary patch literal 11739 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 hSgU*JM#`-7X@uMUCNM_yV5R3&K={6CeoocaI& literal 0 HcmV?d00001 diff --git a/src/main/java/org/gcube/portlets/user/dataminerexecutor/client/resources/logoLittle.png b/src/main/java/org/gcube/portlets/user/dataminerexecutor/client/resources/logoLittle.png new file mode 100644 index 0000000000000000000000000000000000000000..c334da78e25d6dfe383a0c1375b4f3aea5c8b6b4 GIT binary patch literal 15988 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 z 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 KMNUMnLSTXt*K+g# literal 0 HcmV?d00001 diff --git a/src/main/java/org/gcube/portlets/user/dataminerexecutor/client/resources/menuItemExperiment.png b/src/main/java/org/gcube/portlets/user/dataminerexecutor/client/resources/menuItemExperiment.png new file mode 100644 index 0000000000000000000000000000000000000000..15a635b94608c7972bff89eed496fb96fc93e72c GIT binary patch literal 6826 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 Y11_#I(EFW$7XSbN07*qoM6N<$f_4uLdjJ3c literal 0 HcmV?d00001 diff --git a/src/main/java/org/gcube/portlets/user/dataminerexecutor/client/resources/menuItemHelp.png b/src/main/java/org/gcube/portlets/user/dataminerexecutor/client/resources/menuItemHelp.png new file mode 100644 index 0000000000000000000000000000000000000000..4e8178ce9b89a3755d6dabbcd934ca4d765ef8bb GIT binary patch literal 4178 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 literal 0 HcmV?d00001 diff --git a/src/main/java/org/gcube/portlets/user/dataminerexecutor/client/resources/menuItemInputspace.png b/src/main/java/org/gcube/portlets/user/dataminerexecutor/client/resources/menuItemInputspace.png new file mode 100644 index 0000000000000000000000000000000000000000..9696441552f63819668be431972dcb79f87ea637 GIT binary patch literal 7032 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 W>qqOP4L9@v0000 zlf7$HK@h-y`|e%TykI^w7?PY_EJaAPQ54c>8q53x3fJksAZa2BCYUM*sVua!l3=50 z1dSH9NARmNLGvZv<-M8Rv3QsB1}{LI`;8@!q4VZC%_V z($)|W@MebM6lV#a& zfU34!!f@p@U7a0N`V)>GiP;fDG$0YU$1qc=n0xaYRSAaA#PbPt+vx8D8 zB67J83x@zGq~M&(A%HnYBlWn*@^>KYPa(@PqEZCFm(QR6T7^0eIoK=XlUq$sy&MG<48XIWqWo>Z&VtMl{o y&kv0NU}|dWorsL?pTgE;zOB`27yg*S|Hv=)vtlNu1or3v0000Zwnh~kPtfCbMLwL+tiixj33X)qV^u2kxS(^H_pyS$hr5I44LH5)nud zY$>tXwHZ@Czrp{(U(>)&nBsJ$CdVhk&|?5Fm>3EK4H|?HnE3J@ z1AbqN=`hdSuX$nvfKk&bR;uc}i7rUP+flVe}|N8flK)jso1CzUqtKB{YaZ&yvv z*9f<}Zm&=jBq7B7z+d6$9PINHp{=r$@~`E15)+&aj(A5P!j(0Y>b9JI<%ly;ked&8 zRyF`}chLr=jfK_eDH$H;vLw77>6?G0Qeef1i;aVOiyNltz|hDLhDY8VSP-bVQ5F-N z2{vzBzwy+X)hWF*rCd0f9|MM1YCGl0n2^X7Ha3C??o~_G{RUd5JcjNy!+QV# N002ovPDHLkV1kQ~T^#@b literal 0 HcmV?d00001 diff --git a/src/main/java/org/gcube/portlets/user/dataminerexecutor/client/resources/resubmit.png b/src/main/java/org/gcube/portlets/user/dataminerexecutor/client/resources/resubmit.png new file mode 100644 index 0000000000000000000000000000000000000000..0202cbe587ab95dd4a251b2e1423ff54c11475e1 GIT binary patch literal 770 zcmV+d1O5DoP)fA@}KY3fu6wa{MDYa}Y#Xhk7CFe>Q!g7}K4V0^*zyw=o6`h383?gHO7#@29q z|9zZHr33e>?V`fPxQ>fji>jblR25NW*h|v;u9vs(`(EVcDHp%4hbZc!vR((|?02$oc zuwhrgapO1k-2MQN92y2dh0)biQ7c$cj4z`kZoje-fXcenvCzcOx$J_8gP94M54W=J z=&EcZ{`K(O@YIx-;`N(evI4<=@nq=d8MiiU*jF;GBsO`{6rS`v#;Qe(AR=HLLir&| z=a+)x(9+hz=TD!{cAkD->qM??3x5ALR2MEPjTRLa;fui-A3?F!A|hDF5^w|Lu_4t`91i-Nv+ljtNMxSd1|Yd>y3uVKZHc#0$r|k>y90j7s_H?wdZa zml%n3Ivtx_Foj1?J5Xy8qlgG<1kdwZM$#h}^78WTJUY?+ed)o{UrrTU3qbjirLi5C zHubMRxib52npk#d(Z9cK_0h6z701d8$NQZ>0DP@xs=eKdA^-pY07*qoM6N<$f{XBK A9smFU literal 0 HcmV?d00001 diff --git a/src/main/java/org/gcube/portlets/user/dataminerexecutor/client/resources/save.png b/src/main/java/org/gcube/portlets/user/dataminerexecutor/client/resources/save.png new file mode 100644 index 0000000000000000000000000000000000000000..99d532e8b1750115952f97302a92d713c0486f97 GIT binary patch literal 620 zcmV-y0+aoTP)~H+MJzd|s z^YP1Hc07G_>)Lgir!F1{Qn4GcTg%?koHo<=1qRN{}nPDolOeI^o4N5I>! zU$N=L=sg~ zDx#dOA*B0N~cqPsWI(^rbbkh)DS0_H_UN0C4l_kvWIm2#Kyy6%BCh z(yIUf003&1xdx>t$*eR2ZvXxT0001Z_R$y3Iju92q*wg58};}zm(OaAH=p|y0002M zh5O5#fxp|~jc?yi@+7$`d4Q6Hl%z;WiWG??NXR{Hx%)pMd~SE0000OQI literal 0 HcmV?d00001 diff --git a/src/main/java/org/gcube/portlets/user/dataminerexecutor/client/resources/show.png b/src/main/java/org/gcube/portlets/user/dataminerexecutor/client/resources/show.png new file mode 100644 index 0000000000000000000000000000000000000000..b8a25e4b6a85e76f17a29b4ecf1e902c6288d124 GIT binary patch literal 906 zcmV;519kj~P)f-U?SNEpex4z2p&I^6(3%>cKz@Bs)XJ!innyO4T#1tN?*J&~}0E(92=90~PvCO@) z7y|2ZG^G{wnu#+g~LI6s|7Lz3QDPZ$Ku+`fzBx;*t*ir%hPzMi;&W!bUM zUfb=e05!rB4KanAOBH^dEn#RHv8c|A&urzTXSWfL=tK;iiA!_L&6ns%)}b2u7Xa$1 z$-HU1VPCRA=X#++L{kAt)$uu(%X4mOfvPKzNOVKx^7R6}sb;LQ(?4?Ttf_i_XjW?? zxxv)29e)ju8Pn)bw~*;d5RV!tfFc!EZI|x$2CRyk5CNtd2!ZGO_tBM9-2lf6Xs(Z< zDF0>e`98h~P`x0uC9+hsJj|$$1XNXJrQ#BVk|306=G%+-lqlb2|yjsH-A(<^3xp=KWETZMUdvmC& z12i-mFV7e4=O5YJ#`c~TvR4;5K0bpdd_q3}LShkvryqZq&8G)O_hdI)I$AhBb_L6J2Ts4g-&-rv+b1uxYilFp ze-sB)m~2nP=}m2*r?U|WOy64O_iKwx-zu?E_6B$KC9_v%ml=ESzk07*qoM6N<$f}^9UJ^%m! literal 0 HcmV?d00001 diff --git a/src/main/java/org/gcube/portlets/user/dataminerexecutor/client/resources/sort_asc.gif b/src/main/java/org/gcube/portlets/user/dataminerexecutor/client/resources/sort_asc.gif new file mode 100644 index 0000000000000000000000000000000000000000..986c1c96b09aa88a0865d90103b43ecc0f505a84 GIT binary patch literal 898 zcmZ?wbhEHb6krfw_|59PteQ zIYl@U793z;=7+(>q?GuNnCdgP^*Bj5V_b?dAq2Ppn9^MBB^YUM zad0N-T{Ujg*A6d~mYV4na=hT4Nz+_}SGTgW|Iir!%$ z;@OGkWI6+j0H}~K4RYR%!7y|zM`O@*K>rL{*&}x3lR**HrMXC1->#slU>X|w!U1xQ zqc z32;wmT zTFVth(ISYFjjnS9QM7U3tUS-#NK8C0&}~3fRm5YlXgsF;ThbDX&mMm1yNdvN-?1=5 zO{ufe(ld$;CR2_i$z)8*G8m0kQIbuPY~W)*dS_C5LsP9YWwV4bnp)6#gRu{ z6Cfa+oL1ejUmSRzi2z>UNq0!cJef@5%TNA`g3+VU(om06WZ7``+wXMpE(b*4=|s5X`XbE$5(ymI ze*nGv^+UkZicm0!tlXaPx4JMZv=6t$8{um6VE^p*@J7|ry$wgU*>!*(!yeoD$0b#z zL4N=Z=jtwT@bdxKb|2dJG0bT)vNH`Z$rLR~1(_K#Znmmut*eJOuLxrPK$)+(8dHo~YPv5BU6WHZ*k^=17YI2crZM6(&g|t-&CwFp4P{1Qn8yB%Ol9ry%nQ zUGrRfcu|1rZ;sicKqY$up56WxMvj|?*VmNQwtU?IkaN>S$K%UhwX+>?HacNVQ&H51 zw$B)cEVArr4*_P61sXGEFc=_75@cEa$vM;Pn(Huf=OZto@cu`!>&2(K159vC|LYce zC=i0Hxdmn8Gm&o-^&eizI9t ryhHW!yT(jyKo;r5nJ&365zC|85Tl!|=AYVRz-o zF5({>Ny?C5CK`0W3FAzm2nm{0^z#C8y2rE!y5pYo-5|JQMX}MTFZzArUu?d4m zmtglx^DY3`2w-Y?l|3AaAmH_3$I=nl^U(=}qhvT3Lx_w~0_(=qXb`8p0*1)-Naqz; z!~`;>7&1s(#W>z~_d(h9U+dR0uTmuNdiqv}N>H|V4#v%@LH`kB@%GD4cL#XT@yJu_ z?U9Irpf7+;^M~R2g{v_8`V+_^<7pIVBHvlJI8>Y-fyx2LXv((>dnKFzjr6)x15tj{ zS-K~*3n%Kj+F6LQ@)?*gcNcmO8I5i!s#K2y|rUkcQ(~4DC zH0XQXu@Y`WC>k zVPSWG@s3Hep0g`T98ubZ%?#lADl97WURX&tV-=s8Q8^}|&*Pc^pTeUx!oj0(*hw2x zcrBarh;s&r#x$s+32k8wYZsPa@}l>UeeEFZ-MIJyKsEtPocWAB7E2(eB(P;+0sgjj zJEo7|;0lwmXuGsUG~LlDOT{IlCD{FC2(T!v@9a$D~ zLdKait&*!0uNQz}%_Dczn%asJsR5*DSAfcLHSfD{yIIt z5b>|=m9_4ZT>!sxjIsaOo>JMRh?=D%y8zgal~@u@t{_~V5S*oluy4r1{lDs zDI>99+ZniMF(19LvbMDoAhYi{$LNw-cIsUqNNIR&dGSxaf{LpBsGNJ{7`PHZlrrm; zH@?7=rK3@?s}79~ZhZXabG5DCb^|E7e})~L1W``MjuoS>8Xy)=qORGG>Yax$Vo1Io z57bP7#g)+@q5loJxU;Y?R_}G<+?fXa=k4bS;N1%Vg=44L!OM`17SvRX#c%@A^(4*ise0eh z?xfw}CAwpN#u>*4N9iy-`8^IeR=?{#{r)5!z)AqaelwW>j4+zBP*XVu2ald3XI5Rz zCRul)UBL-1anh-wuULaWl7v5;g4376@wyo5eyGN(7ufSfSx@lp+NdrACgX$`>RSI`!Slamxw z3SM52^cte+y&w=*B6P3?5e+l(t6^VLB;+~o3%O5yr+7}Tqc433Et%2*jClnsZyq&u ziHWvfHs_#VP!23o08P#|ePyja1=MmvGMFh#Oq8ld3NVR^Pyz}$QKBKzAuSSc#lqhD zK-k;hOGG{HRLs{%a$b!Get@Pnk*j8s^CWH({m({w|0!CjQuG|P-~?qA;h9#C}D3R;%f?pef54N=yI!ZzmuHQlbnT`pe6y%4hM9WBgB%2 zRcmyF#-*dZ@#FM^eylNP@B&MZAwx};Ug@bsG#Lpr2bG}HlTy6o#NR+p&S}ZW`Hq#i zNZLq(tk#euI#+cyqkHGc>S`XzKoT3PEgdUiPW&Vhk~m4~$5!)8#?Sh9{A-T?15Xa0 UU6A5+=>Px#07*qoM6N<$f+m)URR910 literal 0 HcmV?d00001 diff --git a/src/main/java/org/gcube/portlets/user/dataminerexecutor/client/resources/tree.gif b/src/main/java/org/gcube/portlets/user/dataminerexecutor/client/resources/tree.gif new file mode 100644 index 0000000000000000000000000000000000000000..e9dd8e0f5cf3494b55dc2f6c4418c2c029445a70 GIT binary patch literal 372 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 FV1lh;{O$k% literal 0 HcmV?d00001 diff --git a/src/main/java/org/gcube/portlets/user/dataminerexecutor/client/resources/user_green.png b/src/main/java/org/gcube/portlets/user/dataminerexecutor/client/resources/user_green.png new file mode 100644 index 0000000000000000000000000000000000000000..30383c2de517fd22945a87b0528d2821ec4d49ce GIT binary patch literal 722 zcmV;@0xkWCP)3!D zZfa?ojY$@yCfls+a1%C3!?bPMoJoiMdi{ifAhYP=;XUyGJ@1Lv1Axc>uU*mi_s!1e4vIF-H#zjvi{6P9o7zm~Hif`95cSO@Tw_#RTVDspTCI z?1WjG!bBB?H3jy17EBr*CLT#JGjJG|1`1Y%7iN^+_#&sEmmS*TR?wE>{mu5i50)3r zn0j6Zo9P&A#u&_fP@^wz+rsO{#Px0kH{x~-S%>do+MvP0OBF%Q^sPn}YIyzzw?{}< z(i?*=pB}Br+>1rSU3`Dj!LTr*1f9DNClXJN#^0{pys98gNpFg+%29?Cu`%T6g0wUU zjn_^wEcJC$EeI~$jk2`tLa|P3?vTXF_G9381A1*0Xm}??wJ{CS0RhBM zc(^l?fyc8lgo$?{qD0u7+*rH8B}lF-EKX`Vjux|sVJUcXP=K;$@hH+?Kz?@=vfD#Z zF_Z*JKOYHlF5)Y*s$Bw89_QC|mk`%`&!M!R$57mNks0T8MIx(>i*!{G`1MDTsR@Rq zHy?wUzCT=oS66+VR-K3x9KkI^DhbArRilynARJe;T+&7mNf;zg`8Z#B5H@`QhO_;g zF2QJ1N{%td=O@1|5Yf`zr0~+JgiHJpF5U@Ke!wEh6s&lKk7|J@t(W>ll_$K7EDLm= zDcwUZEC8V;{s<`wARKUph`3*C9+vx!w+KAl{>Fdd57Mf getOperatorsClassifications(boolean refresh) throws ServiceException; + + public List getParameters(Operator operator) throws ServiceException; + + public ComputationId startComputation(Operator op) throws ServiceException; + + public ComputationStatus getComputationStatus(ComputationId computationId) throws ServiceException; + + public ComputationId resubmit(ItemDescription itemDescription) throws ServiceException; + + public TableItemSimple retrieveTableInformation(ItemDescription item) throws ServiceException; + + public DataMinerWorkArea getDataMinerWorkArea() throws ServiceException; + + public String getPublicLink(ItemDescription itemDescription) throws ServiceException; + + public String cancelComputation(ComputationId computationId) throws ServiceException; + + public void deleteItem(ItemDescription itemDescription) throws ServiceException; + + public OutputData getOutputDataByComputationId(ComputationId computationId) throws ServiceException; + + public ComputationData getComputationData(ItemDescription itemDescription) throws ServiceException; + + public String cancelComputation(ItemDescription itemDescription) throws ServiceException; + + public ItemDescription getItemDescription(String itemId) throws ServiceException; + + public Operator getInvocationModel(String invocationModelFileUrl) throws ServiceException; + +} diff --git a/src/main/java/org/gcube/portlets/user/dataminerexecutor/client/rpc/DataMinerExecutorServiceAsync.java b/src/main/java/org/gcube/portlets/user/dataminerexecutor/client/rpc/DataMinerExecutorServiceAsync.java new file mode 100644 index 0000000..520e49e --- /dev/null +++ b/src/main/java/org/gcube/portlets/user/dataminerexecutor/client/rpc/DataMinerExecutorServiceAsync.java @@ -0,0 +1,63 @@ +package org.gcube.portlets.user.dataminerexecutor.client.rpc; + +import java.util.List; + +import org.gcube.data.analysis.dataminermanagercl.shared.data.OutputData; +import org.gcube.data.analysis.dataminermanagercl.shared.data.TableItemSimple; +import org.gcube.data.analysis.dataminermanagercl.shared.data.computations.ComputationData; +import org.gcube.data.analysis.dataminermanagercl.shared.data.computations.ComputationId; +import org.gcube.data.analysis.dataminermanagercl.shared.parameters.Parameter; +import org.gcube.data.analysis.dataminermanagercl.shared.process.ComputationStatus; +import org.gcube.data.analysis.dataminermanagercl.shared.process.Operator; +import org.gcube.data.analysis.dataminermanagercl.shared.process.OperatorsClassification; +import org.gcube.data.analysis.dataminermanagercl.shared.workspace.DataMinerWorkArea; +import org.gcube.data.analysis.dataminermanagercl.shared.workspace.ItemDescription; +import org.gcube.portlets.user.dataminerexecutor.shared.session.UserInfo; + +import com.google.gwt.core.client.GWT; +import com.google.gwt.user.client.rpc.AsyncCallback; + +/** + * + * @author Giancarlo Panichi + * + * + */ +public interface DataMinerExecutorServiceAsync { + + public static DataMinerExecutorServiceAsync INSTANCE = (DataMinerExecutorServiceAsync) GWT + .create(DataMinerExecutorService.class); + + void hello(AsyncCallback callback); + + void getOperatorsClassifications(boolean refresh, AsyncCallback> callback); + + void getParameters(Operator operator, AsyncCallback> callback); + + void startComputation(Operator op, AsyncCallback asyncCallback); + + void getComputationStatus(ComputationId computationId, AsyncCallback asyncCallback); + + void resubmit(ItemDescription itemDescription, AsyncCallback callback); + + void retrieveTableInformation(ItemDescription item, AsyncCallback callback); + + void getDataMinerWorkArea(AsyncCallback asyncCallback); + + void getPublicLink(ItemDescription itemDescription, AsyncCallback callback); + + void cancelComputation(ComputationId computationId, AsyncCallback asyncCallback); + + void deleteItem(ItemDescription itemDescription, AsyncCallback callback); + + void getOutputDataByComputationId(ComputationId computationId, AsyncCallback callback); + + void getComputationData(ItemDescription itemDescription, AsyncCallback callback); + + void cancelComputation(ItemDescription itemDescription, AsyncCallback asyncCallback); + + void getItemDescription(String itemId, AsyncCallback asyncCallback); + + void getInvocationModel(String invocationModelFileUrl, AsyncCallback callback); + +} diff --git a/src/main/java/org/gcube/portlets/user/dataminerexecutor/client/type/DataMinerWorkAreaElementType.java b/src/main/java/org/gcube/portlets/user/dataminerexecutor/client/type/DataMinerWorkAreaElementType.java new file mode 100644 index 0000000..f4aedef --- /dev/null +++ b/src/main/java/org/gcube/portlets/user/dataminerexecutor/client/type/DataMinerWorkAreaElementType.java @@ -0,0 +1,11 @@ +package org.gcube.portlets.user.dataminerexecutor.client.type; + +/** + * + * @author Giancarlo Panichi + * + * + */ +public enum DataMinerWorkAreaElementType { + InputDataSets, OutputDataSets, Computations; +} diff --git a/src/main/java/org/gcube/portlets/user/dataminerexecutor/client/type/DataMinerWorkAreaEventType.java b/src/main/java/org/gcube/portlets/user/dataminerexecutor/client/type/DataMinerWorkAreaEventType.java new file mode 100644 index 0000000..809f916 --- /dev/null +++ b/src/main/java/org/gcube/portlets/user/dataminerexecutor/client/type/DataMinerWorkAreaEventType.java @@ -0,0 +1,11 @@ +package org.gcube.portlets.user.dataminerexecutor.client.type; + +/** + * + * @author Giancarlo Panichi + * + * + */ +public enum DataMinerWorkAreaEventType { + OPEN, UPDATE; +} diff --git a/src/main/java/org/gcube/portlets/user/dataminerexecutor/client/type/DataMinerWorkAreaRegionType.java b/src/main/java/org/gcube/portlets/user/dataminerexecutor/client/type/DataMinerWorkAreaRegionType.java new file mode 100644 index 0000000..4bd7325 --- /dev/null +++ b/src/main/java/org/gcube/portlets/user/dataminerexecutor/client/type/DataMinerWorkAreaRegionType.java @@ -0,0 +1,11 @@ +package org.gcube.portlets.user.dataminerexecutor.client.type; + +/** + * + * @author Giancarlo Panichi + * + * + */ +public enum DataMinerWorkAreaRegionType { + DataSets, Computations; +} diff --git a/src/main/java/org/gcube/portlets/user/dataminerexecutor/client/type/DataMinerWorkAreaRequestEventType.java b/src/main/java/org/gcube/portlets/user/dataminerexecutor/client/type/DataMinerWorkAreaRequestEventType.java new file mode 100644 index 0000000..e32bcd4 --- /dev/null +++ b/src/main/java/org/gcube/portlets/user/dataminerexecutor/client/type/DataMinerWorkAreaRequestEventType.java @@ -0,0 +1,11 @@ +package org.gcube.portlets.user.dataminerexecutor.client.type; + +/** + * + * @author Giancarlo Panichi + * + * + */ +public enum DataMinerWorkAreaRequestEventType { + OPEN,UPDATE; +} diff --git a/src/main/java/org/gcube/portlets/user/dataminerexecutor/client/type/MenuType.java b/src/main/java/org/gcube/portlets/user/dataminerexecutor/client/type/MenuType.java new file mode 100644 index 0000000..556e890 --- /dev/null +++ b/src/main/java/org/gcube/portlets/user/dataminerexecutor/client/type/MenuType.java @@ -0,0 +1,11 @@ +package org.gcube.portlets.user.dataminerexecutor.client.type; + +/** + * + * @author Giancarlo Panichi + * + * + */ +public enum MenuType { + EXPERIMENT; +} diff --git a/src/main/java/org/gcube/portlets/user/dataminerexecutor/client/type/OperatorsClassificationRequestType.java b/src/main/java/org/gcube/portlets/user/dataminerexecutor/client/type/OperatorsClassificationRequestType.java new file mode 100644 index 0000000..d41c5e6 --- /dev/null +++ b/src/main/java/org/gcube/portlets/user/dataminerexecutor/client/type/OperatorsClassificationRequestType.java @@ -0,0 +1,11 @@ +package org.gcube.portlets.user.dataminerexecutor.client.type; + +/** + * + * @author Giancarlo Panichi + * + * + */ +public enum OperatorsClassificationRequestType { + Default, ByName; +} diff --git a/src/main/java/org/gcube/portlets/user/dataminerexecutor/client/type/OutputResourceRequestEventType.java b/src/main/java/org/gcube/portlets/user/dataminerexecutor/client/type/OutputResourceRequestEventType.java new file mode 100644 index 0000000..daa67c4 --- /dev/null +++ b/src/main/java/org/gcube/portlets/user/dataminerexecutor/client/type/OutputResourceRequestEventType.java @@ -0,0 +1,11 @@ +package org.gcube.portlets.user.dataminerexecutor.client.type; + +/** + * + * @author Giancarlo Panichi + * + * + */ +public enum OutputResourceRequestEventType { + ComputationId, ItemDescription; +} diff --git a/src/main/java/org/gcube/portlets/user/dataminerexecutor/client/type/SessionExpiredEventType.java b/src/main/java/org/gcube/portlets/user/dataminerexecutor/client/type/SessionExpiredEventType.java new file mode 100644 index 0000000..442738d --- /dev/null +++ b/src/main/java/org/gcube/portlets/user/dataminerexecutor/client/type/SessionExpiredEventType.java @@ -0,0 +1,11 @@ +package org.gcube.portlets.user.dataminerexecutor.client.type; + +/** + * + * @author Giancarlo Panichi + * + * + */ +public enum SessionExpiredEventType { + EXPIREDONSERVER; +} diff --git a/src/main/java/org/gcube/portlets/user/dataminerexecutor/client/type/UIStateEventType.java b/src/main/java/org/gcube/portlets/user/dataminerexecutor/client/type/UIStateEventType.java new file mode 100644 index 0000000..32caaf0 --- /dev/null +++ b/src/main/java/org/gcube/portlets/user/dataminerexecutor/client/type/UIStateEventType.java @@ -0,0 +1,13 @@ +package org.gcube.portlets.user.dataminerexecutor.client.type; + +/** + * + * @author Giancarlo Panichi + * + * + */ +public enum UIStateEventType { + START, + UPDATE, + WAITING; +} diff --git a/src/main/java/org/gcube/portlets/user/dataminerexecutor/client/type/WPSMenuType.java b/src/main/java/org/gcube/portlets/user/dataminerexecutor/client/type/WPSMenuType.java new file mode 100644 index 0000000..5a205d7 --- /dev/null +++ b/src/main/java/org/gcube/portlets/user/dataminerexecutor/client/type/WPSMenuType.java @@ -0,0 +1,11 @@ +package org.gcube.portlets.user.dataminerexecutor.client.type; + +/** + * + * @author Giancarlo Panichi + * + * + */ +public enum WPSMenuType { + MENU, INPUT_SPACE, EXPERIMENT, COMPUTATIONS +} diff --git a/src/main/java/org/gcube/portlets/user/dataminerexecutor/client/util/ElementsHighlights.java b/src/main/java/org/gcube/portlets/user/dataminerexecutor/client/util/ElementsHighlights.java new file mode 100644 index 0000000..af56db3 --- /dev/null +++ b/src/main/java/org/gcube/portlets/user/dataminerexecutor/client/util/ElementsHighlights.java @@ -0,0 +1,271 @@ +package org.gcube.portlets.user.dataminerexecutor.client.util; + +import com.allen_sauer.gwt.log.client.Log; + +/** + * + * @author Giancarlo Panichi + * + * + */ +public class ElementsHighlights { + + public ElementsHighlights() { + + } + + public String createLinkFromText(String text) { + Log.info("Message: " + text); + if (text == null || text.isEmpty()) { + return text; + } + + boolean end = false; + StringBuilder result = new StringBuilder(); + String mes = new String(text); + + while (!end) { + if (mes != null && !mes.isEmpty()) { + if (mes.contains("http") || mes.contains("https")) { + int httpIndex = mes.indexOf("http"); + int httpsIndex = mes.indexOf("https"); + if (httpIndex == -1) { + if (httpsIndex == -1) { + result.append(mes); + end = true; + } else { + String prefix = mes.substring(0, httpsIndex); + result.append(prefix); + + String checkTerminator; + if (httpsIndex > 0) { + checkTerminator = mes.substring(httpsIndex - 1, httpsIndex); + if (checkTerminator.compareTo(" ") != 0 && checkTerminator.compareTo("\"") != 0 + && checkTerminator.compareTo("'") != 0) { + Log.debug("Terminator Found:" + checkTerminator); + checkTerminator = " "; + Log.debug("Terminator Set:" + checkTerminator); + + } else { + Log.debug("Terminator Set:" + checkTerminator); + } + } else { + checkTerminator = " "; + Log.debug("Terminator Set:" + checkTerminator); + } + + + mes = mes.substring(httpsIndex, mes.length()); + + int terminator = mes.indexOf(checkTerminator); + if (terminator == -1) { + if(mes.contains("" + extractedUrl + ""); + result.append(mes.substring(j)); + } else { + result.append("" + mes + ""); + } + end = true; + } else { + String extractedUrl; + if (checkTerminator == " ") { + extractedUrl = mes.substring(0, terminator+1); + } else { + extractedUrl = mes.substring(0, terminator); + } + + + if(extractedUrl.contains("" + extractedUrl + ""); + mes = mes.substring(terminator, mes.length()); + } + } + + } else { + if (httpsIndex == -1) { + String prefix = mes.substring(0, httpIndex); + result.append(prefix); + + String checkTerminator; + if (httpIndex > 0) { + checkTerminator = mes.substring(httpIndex - 1, httpIndex); + if (checkTerminator.compareTo(" ") != 0 && checkTerminator.compareTo("\"") != 0 + && checkTerminator.compareTo("'") != 0) { + Log.debug("Terminator Found:" + checkTerminator); + checkTerminator = " "; + Log.debug("Terminator Set:" + checkTerminator); + + } else { + Log.debug("Terminator Set:" + checkTerminator); + } + } else { + checkTerminator = " "; + Log.debug("Terminator Set:" + checkTerminator); + } + + mes = mes.substring(httpIndex, mes.length()); + int terminator = mes.indexOf(checkTerminator); + Log.debug("TerminatorCheck found: "+terminator); + if (terminator == -1) { + if(mes.contains("" + extractedUrl + ""); + result.append(mes.substring(j)); + } else { + result.append("" + mes + ""); + } + end = true; + } else { + String extractedUrl; + if (checkTerminator == " ") { + extractedUrl = mes.substring(0, terminator+1); + } else { + extractedUrl = mes.substring(0, terminator); + } + + + if(extractedUrl.contains("" + extractedUrl + ""); + mes = mes.substring(terminator, mes.length()); + } + } else { + if (httpsIndex <= httpIndex) { + String prefix = mes.substring(0, httpsIndex); + result.append(prefix); + + String checkTerminator; + if (httpsIndex > 0) { + checkTerminator = mes.substring(httpsIndex - 1, httpsIndex); + if (checkTerminator.compareTo(" ") != 0 && checkTerminator.compareTo("\"") != 0 + && checkTerminator.compareTo("'") != 0) { + Log.debug("Terminator Found:" + checkTerminator); + checkTerminator = " "; + Log.debug("Terminator Set:" + checkTerminator); + + } else { + Log.debug("Terminator Set:" + checkTerminator); + } + } else { + checkTerminator = " "; + Log.debug("Terminator Set:" + checkTerminator); + } + + + mes = mes.substring(httpsIndex, mes.length()); + int terminator = mes.indexOf(checkTerminator); + + if (terminator == -1) { + if(mes.contains("" + extractedUrl + ""); + result.append(mes.substring(j)); + } else { + result.append("" + mes + ""); + } + end = true; + } else { + String extractedUrl; + if (checkTerminator == " ") { + extractedUrl = mes.substring(0, terminator); + } else { + extractedUrl = mes.substring(0, terminator - 1); + } + + + if(extractedUrl.contains("" + extractedUrl + ""); + mes = mes.substring(terminator, mes.length()); + } + } else { + String prefix = mes.substring(0, httpIndex); + result.append(prefix); + + String checkTerminator; + if (httpIndex > 0) { + checkTerminator = mes.substring(httpIndex - 1, httpIndex); + if (checkTerminator.compareTo(" ") != 0 && checkTerminator.compareTo("\"") != 0 + && checkTerminator.compareTo("'") != 0) { + Log.debug("Terminator Found:" + checkTerminator); + checkTerminator = " "; + Log.debug("Terminator Set:" + checkTerminator); + + } else { + Log.debug("Terminator Set:" + checkTerminator); + } + } else { + checkTerminator = " "; + Log.debug("Terminator Set:" + checkTerminator); + } + + + mes = mes.substring(httpIndex, mes.length()); + int terminator = mes.indexOf(checkTerminator); + + if (terminator == -1) { + if(mes.contains("" + extractedUrl + ""); + result.append(mes.substring(j)); + } else { + result.append("" + mes + ""); + } + end = true; + } else { + String extractedUrl; + if (checkTerminator == " ") { + extractedUrl = mes.substring(0, terminator); + } else { + extractedUrl = mes.substring(0, terminator - 1); + } + + if(extractedUrl.contains("" + extractedUrl + ""); + mes = mes.substring(terminator, mes.length()); + + } + } + } + + } + + } else { + result.append(mes); + end = true; + } + } else { + end = true; + } + } + Log.info("New Message: " + result.toString()); + return result.toString(); + } +} diff --git a/src/main/java/org/gcube/portlets/user/dataminerexecutor/client/util/InfoMessageBox.java b/src/main/java/org/gcube/portlets/user/dataminerexecutor/client/util/InfoMessageBox.java new file mode 100644 index 0000000..e286e33 --- /dev/null +++ b/src/main/java/org/gcube/portlets/user/dataminerexecutor/client/util/InfoMessageBox.java @@ -0,0 +1,28 @@ +package org.gcube.portlets.user.dataminerexecutor.client.util; + +import com.sencha.gxt.widget.core.client.box.MessageBox; + +/** + * + * @author Giancarlo Panichi + * + * + */ +public class InfoMessageBox extends MessageBox { + + /** + * Creates a message box with an info icon and the specified title and + * message. + * + * @param title + * the message box title + * @param message + * the message displayed in the message box + */ + public InfoMessageBox(String title, String message) { + super(title, message); + + setIcon(ICONS.info()); + } + +} \ No newline at end of file diff --git a/src/main/java/org/gcube/portlets/user/dataminerexecutor/client/util/UtilsGXT3.java b/src/main/java/org/gcube/portlets/user/dataminerexecutor/client/util/UtilsGXT3.java new file mode 100644 index 0000000..512e3d4 --- /dev/null +++ b/src/main/java/org/gcube/portlets/user/dataminerexecutor/client/util/UtilsGXT3.java @@ -0,0 +1,78 @@ +package org.gcube.portlets.user.dataminerexecutor.client.util; + +import com.google.gwt.core.client.Callback; +import com.google.gwt.dom.client.Element; +import com.sencha.gxt.core.client.dom.XElement; +import com.sencha.gxt.widget.core.client.Component; +import com.sencha.gxt.widget.core.client.box.AlertMessageBox; +import com.sencha.gxt.widget.core.client.event.HideEvent; +import com.sencha.gxt.widget.core.client.event.HideEvent.HideHandler; + +/** + * + * @author Giancarlo Panichi + * + * + */ +public class UtilsGXT3 { + public static void mask(Element element) { + XElement el = element. cast(); + el.mask("Loading..."); + } + + public static void umask(Element element) { + element. cast().unmask(); + } + + public static void alert(String title, String message) { + final AlertMessageBox d = new AlertMessageBox(title, message); + d.addHideHandler(new HideHandler() { + + public void onHide(HideEvent event) { + + } + }); + d.show(); + + } + + public static void alert(String title, String message, + final Callback callback) { + final AlertMessageBox d = new AlertMessageBox(title, message); + d.addHideHandler(new HideHandler() { + + public void onHide(HideEvent event) { + Component comp = event.getSource(); + callback.onSuccess(comp); + } + }); + d.show(); + } + + public static void info(String title, String message) { + final InfoMessageBox d = new InfoMessageBox(title, message); + d.addHideHandler(new HideHandler() { + + public void onHide(HideEvent event) { + + } + }); + d.show(); + + } + + public static void info(String title, String message, + final Callback callback) { + final InfoMessageBox d = new InfoMessageBox(title, message); + d.addHideHandler(new HideHandler() { + + public void onHide(HideEvent event) { + Component comp = event.getSource(); + callback.onSuccess(comp); + } + }); + d.show(); + + } + +} diff --git a/src/main/java/org/gcube/portlets/user/dataminerexecutor/client/widgets/FileViewer.java b/src/main/java/org/gcube/portlets/user/dataminerexecutor/client/widgets/FileViewer.java new file mode 100644 index 0000000..c94e8b8 --- /dev/null +++ b/src/main/java/org/gcube/portlets/user/dataminerexecutor/client/widgets/FileViewer.java @@ -0,0 +1,109 @@ +package org.gcube.portlets.user.dataminerexecutor.client.widgets; + +import org.gcube.data.analysis.dataminermanagercl.shared.data.computations.ComputationId; +import org.gcube.data.analysis.dataminermanagercl.shared.data.output.FileResource; +import org.gcube.portlets.user.dataminerexecutor.client.DataMinerExecutor; +import org.gcube.portlets.widgets.netcdfbasicwidgets.client.event.SelectVariableEvent; +import org.gcube.portlets.widgets.netcdfbasicwidgets.client.event.SelectVariableEvent.SelectVariableEventHandler; +import org.gcube.portlets.widgets.netcdfbasicwidgets.client.widgets.NetCDFPreviewDialog; + +import com.google.gwt.core.shared.GWT; +import com.google.gwt.safehtml.shared.SafeHtmlBuilder; +import com.google.gwt.user.client.Window; +import com.sencha.gxt.core.client.dom.XDOM; +import com.sencha.gxt.core.client.util.Margins; +import com.sencha.gxt.widget.core.client.button.TextButton; +import com.sencha.gxt.widget.core.client.container.HtmlLayoutContainer; +import com.sencha.gxt.widget.core.client.container.SimpleContainer; +import com.sencha.gxt.widget.core.client.container.VerticalLayoutContainer; +import com.sencha.gxt.widget.core.client.container.VerticalLayoutContainer.VerticalLayoutData; +import com.sencha.gxt.widget.core.client.event.SelectEvent; + +/** + * + * @author Giancarlo Panichi + * + * + */ +public class FileViewer extends SimpleContainer { + + private FileResource fileResource; + + /** + * + * @param computationId + * computation id + * @param fileResource + * file resource + */ + public FileViewer(ComputationId computationId, FileResource fileResource) { + super(); + GWT.log("FileViewer: [computationId="+computationId+", fileResource="+fileResource+"]"); + this.fileResource = fileResource; + // this.computationId = computationId; + init(); + create(); + } + + private void init() { + setHeight(56); + } + + private void create() { + VerticalLayoutContainer lc = new VerticalLayoutContainer(); + final String fileName = fileResource.getName(); + final String fileUrl = fileResource.getUrl(); + HtmlLayoutContainer fileNameHtml = new HtmlLayoutContainer("

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

"); + lc.add(fileNameHtml, new VerticalLayoutData(-1, -1, new Margins(0))); + TextButton downloadBtn = new TextButton("Download File"); + downloadBtn.setIcon(DataMinerExecutor.resources.download()); + downloadBtn.addSelectHandler(new SelectEvent.SelectHandler() { + @Override + public void onSelect(SelectEvent event) { + GWT.log("Download File url: "+fileUrl); + Window.open(fileUrl, fileName, ""); + + } + }); + + TextButton netcdfButton = new TextButton(""); + netcdfButton.setIcon(DataMinerExecutor.resources.netcdf()); + netcdfButton.addSelectHandler(new SelectEvent.SelectHandler() { + + @Override + public void onSelect(SelectEvent event) { + showNetCDFFile(); + } + }); + + lc.add(downloadBtn, new VerticalLayoutData(-1, -1, new Margins(0))); + if (fileResource.isNetcdf()) { + lc.add(netcdfButton, new VerticalLayoutData(-1, -1, new Margins(0))); + } + add(lc); + } + + private void showNetCDFFile() { + if (fileResource != null && fileResource.getUrl() != null && !fileResource.getUrl().isEmpty() + && fileResource.isNetcdf()) { + GWT.log("NetcdfBasicWidgetsManager"); + + // Example + SelectVariableEventHandler handler = new SelectVariableEventHandler() { + + @Override + public void onResponse(SelectVariableEvent event) { + GWT.log("SelectVariable Response: " + event); + + } + }; + + NetCDFPreviewDialog netcdfDialog = new NetCDFPreviewDialog(fileResource.getUrl()); + netcdfDialog.addSelectVariableEventHandler(handler); + netcdfDialog.setZIndex(XDOM.getTopZIndex()); + + } + } + +} diff --git a/src/main/java/org/gcube/portlets/user/dataminerexecutor/client/widgets/HashMapViewer.java b/src/main/java/org/gcube/portlets/user/dataminerexecutor/client/widgets/HashMapViewer.java new file mode 100644 index 0000000..e91eb6f --- /dev/null +++ b/src/main/java/org/gcube/portlets/user/dataminerexecutor/client/widgets/HashMapViewer.java @@ -0,0 +1,54 @@ +/** + * + */ +package org.gcube.portlets.user.dataminerexecutor.client.widgets; + +import java.util.Map; +import java.util.Map.Entry; + +import com.sencha.gxt.widget.core.client.container.HtmlLayoutContainer; +import com.sencha.gxt.widget.core.client.container.SimpleContainer; + +/** + * + * @author Giancarlo Panichi + * + * + */ +public class HashMapViewer extends SimpleContainer { + + private Map map; + + /** + * + * @param map + * map + */ + public HashMapViewer(Map map) { + super(); + this.map = map; + init(); + + } + + /** + * + */ + private void init() { + String html = ""; + html += "" + " " + " " + + " " + " " + " "; + + for (Entry entry : map.entrySet()) + if (entry.getKey() != null) { + html += " " + " " + " " + " "; + } + + html += " " + "
" + entry.getKey() + "" + entry.getValue() + + "
"; + HtmlLayoutContainer htmlContainer = new HtmlLayoutContainer(html); + add(htmlContainer); + forceLayout(); + } + +} diff --git a/src/main/java/org/gcube/portlets/user/dataminerexecutor/client/widgets/ImageViewer.java b/src/main/java/org/gcube/portlets/user/dataminerexecutor/client/widgets/ImageViewer.java new file mode 100644 index 0000000..ae79a44 --- /dev/null +++ b/src/main/java/org/gcube/portlets/user/dataminerexecutor/client/widgets/ImageViewer.java @@ -0,0 +1,89 @@ +package org.gcube.portlets.user.dataminerexecutor.client.widgets; + +import org.gcube.data.analysis.dataminermanagercl.shared.data.computations.ComputationId; +import org.gcube.data.analysis.dataminermanagercl.shared.data.output.ImageResource; +import org.gcube.portlets.user.dataminerexecutor.client.DataMinerExecutor; + +import com.google.gwt.user.client.ui.Image; +import com.sencha.gxt.core.client.util.Margins; +import com.sencha.gxt.widget.core.client.button.TextButton; +import com.sencha.gxt.widget.core.client.container.HtmlLayoutContainer; +import com.sencha.gxt.widget.core.client.container.SimpleContainer; +import com.sencha.gxt.widget.core.client.container.VerticalLayoutContainer; +import com.sencha.gxt.widget.core.client.container.VerticalLayoutContainer.VerticalLayoutData; +import com.sencha.gxt.widget.core.client.event.SelectEvent; + +/** + * + * @author Giancarlo Panichi + * + * + */ +public class ImageViewer extends SimpleContainer { + + protected static final String SAVE_OK_MESSAGE = "The images have been saved on the Workspace in the folder "; + protected static final String SAVE_OK_TITLE = "Saving operation was successful"; + protected static final String SAVE_FAIL_TITLE = "Error"; + protected static final String SAVE_FAIL_MESSAGE = "Error in saving images."; + private ImageResource imagesResource; + // private ComputationId computationId; + + /** + * + * @param computationId + * computation id + * @param imagesResource + * image resource + */ + public ImageViewer(ComputationId computationId, ImageResource imagesResource) { + super(); + this.imagesResource = imagesResource; + // this.computationId = computationId; + create(); + } + + private void create() { + VerticalLayoutContainer v = new VerticalLayoutContainer(); + add(v); + if (imagesResource == null || imagesResource.getLink() == null || imagesResource.getLink().isEmpty()) + v.add(new HtmlLayoutContainer("No image found."), new VerticalLayoutData(-1, -1, new Margins(0))); + else { + v.add(new HtmlLayoutContainer(imagesResource.getName()), new VerticalLayoutData(-1, -1, new Margins(0))); + TextButton saveImageBtn = new TextButton("Download Image"); + saveImageBtn.setIcon(DataMinerExecutor.resources.download()); + saveImageBtn.addSelectHandler(new SelectEvent.SelectHandler() { + + @Override + public void onSelect(SelectEvent event) { + com.google.gwt.user.client.Window.open(imagesResource.getLink(), imagesResource.getName(), ""); + + } + }); + + v.add(saveImageBtn, new VerticalLayoutData(-1, -1, new Margins(0))); + final Image img = new Image(imagesResource.getLink()); + v.add(img, new VerticalLayoutData(1, -1, new Margins(0))); + } + + forceLayout(); + + } + + /* + * private void saveImages() { EventBusProvider.INSTANCE.fireEvent(new + * MaskEvent( "Saving on the workspace...")); // + * handler.maskAll("Saving on the workspace..."); + * DataMinerManager.getService().saveImage(computationId, imagesResource, + * new AsyncCallback() { + * + * @Override public void onSuccess(String result) { + * EventBusProvider.INSTANCE .fireEvent(new MaskEvent(null)); // + * handler.unmaskAll(); UtilsGXT3.info(SAVE_OK_TITLE, SAVE_OK_MESSAGE + "\"" + * + result + "\""); } + * + * @Override public void onFailure(Throwable caught) { + * EventBusProvider.INSTANCE .fireEvent(new MaskEvent(null)); // + * handler.unmaskAll(); UtilsGXT3.alert(SAVE_FAIL_TITLE, SAVE_FAIL_MESSAGE, + * null); } }); } + */ +} diff --git a/src/main/java/org/gcube/portlets/user/dataminerexecutor/client/widgets/ResourceViewer.java b/src/main/java/org/gcube/portlets/user/dataminerexecutor/client/widgets/ResourceViewer.java new file mode 100644 index 0000000..cfb6c3d --- /dev/null +++ b/src/main/java/org/gcube/portlets/user/dataminerexecutor/client/widgets/ResourceViewer.java @@ -0,0 +1,58 @@ +/** + * + */ +package org.gcube.portlets.user.dataminerexecutor.client.widgets; + +import java.util.Map; +import java.util.Map.Entry; + +import org.gcube.data.analysis.dataminermanagercl.shared.data.output.ObjectResource; +import org.gcube.data.analysis.dataminermanagercl.shared.data.output.Resource; + +import com.sencha.gxt.widget.core.client.container.HtmlLayoutContainer; + +/** + * + * @author Giancarlo Panichi + * + * + */ +public class ResourceViewer { + + private Map map; + + /** + * + * @param map + * map + */ + public ResourceViewer(Map map) { + this.map = map; + + } + + /** + * + * @return html layout container + */ + public HtmlLayoutContainer getHtml() { + String html = ""; + html += "" + " " + " " + " " + + " " + " " + " "; + + for (Entry entry : map.entrySet()) + if (entry.getKey() != null) { + if (entry.getValue() instanceof ObjectResource) { + ObjectResource or = (ObjectResource) entry.getValue(); + html += " " + " " + " " + + " "; + } else { + + } + } + + html += " " + "
" + or.getName() + "" + or.getValue() + "
"; + return new HtmlLayoutContainer(html); + } + +} diff --git a/src/main/java/org/gcube/portlets/user/dataminerexecutor/client/workspace/DownloadWidget.java b/src/main/java/org/gcube/portlets/user/dataminerexecutor/client/workspace/DownloadWidget.java new file mode 100644 index 0000000..82f676d --- /dev/null +++ b/src/main/java/org/gcube/portlets/user/dataminerexecutor/client/workspace/DownloadWidget.java @@ -0,0 +1,77 @@ +package org.gcube.portlets.user.dataminerexecutor.client.workspace; + +import org.gcube.data.analysis.dataminermanagercl.shared.workspace.ItemDescription; +import org.gcube.portal.clientcontext.client.GCubeClientContext; +import org.gcube.portlets.user.dataminerexecutor.client.common.EventBusProvider; +import org.gcube.portlets.user.dataminerexecutor.client.events.SessionExpiredEvent; +import org.gcube.portlets.user.dataminerexecutor.client.rpc.DataMinerExecutorServiceAsync; +import org.gcube.portlets.user.dataminerexecutor.client.util.UtilsGXT3; +import org.gcube.portlets.user.dataminerexecutor.shared.Constants; +import org.gcube.portlets.user.dataminerexecutor.shared.exception.SessionExpiredServiceException; + +import com.allen_sauer.gwt.log.client.Log; +import com.google.gwt.core.client.GWT; +import com.google.gwt.http.client.URL; +import com.google.gwt.user.client.Window; +import com.google.gwt.user.client.rpc.AsyncCallback; + +/** + * + * @author Giancarlo Panichi + * + * + */ +public class DownloadWidget { + + public DownloadWidget() { + + } + + public void download(String itemId) { + DataMinerExecutorServiceAsync.INSTANCE.getItemDescription(itemId, new AsyncCallback() { + + @Override + public void onFailure(Throwable caught) { + if (caught instanceof SessionExpiredServiceException) { + EventBusProvider.INSTANCE.fireEvent(new SessionExpiredEvent()); + } else { + Log.error("Error open item: " + caught.getLocalizedMessage(), caught); + UtilsGXT3.alert("Error", caught.getLocalizedMessage()); + } + caught.printStackTrace(); + + } + + @Override + public void onSuccess(ItemDescription itemDownloadInfo) { + Log.debug("Retrieved item download info: " + itemDownloadInfo); + requestDownload(itemDownloadInfo); + } + + }); + } + + private void requestDownload(ItemDescription itemDescription) { + switch (itemDescription.getType()) { + case "AbstractFileItem": + case "FolderItem": + executeDownload(itemDescription); + break; + default: + UtilsGXT3.info("Attention", "This item does not support download operation!"); + break; + } + + } + + private void executeDownload(ItemDescription itemDescription) { + StringBuilder url = new StringBuilder(); + url.append(GWT.getModuleBaseURL()); + url.append(Constants.DOWNLOAD_SERVLET + "/" + itemDescription.getName() + "?itemId=" + itemDescription.getId() + + "&" + Constants.CURR_GROUP_ID + "=" + GCubeClientContext.getCurrentContextId()); + + Window.open(URL.encode(url.toString()), "_blank", ""); + + } + +} diff --git a/src/main/java/org/gcube/portlets/user/dataminerexecutor/dataminerexecutor.gwt.xml b/src/main/java/org/gcube/portlets/user/dataminerexecutor/dataminerexecutor.gwt.xml new file mode 100644 index 0000000..1f12c0d --- /dev/null +++ b/src/main/java/org/gcube/portlets/user/dataminerexecutor/dataminerexecutor.gwt.xml @@ -0,0 +1,59 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/main/java/org/gcube/portlets/user/dataminerexecutor/portlet/DataMinerExecutor.java b/src/main/java/org/gcube/portlets/user/dataminerexecutor/portlet/DataMinerExecutor.java new file mode 100644 index 0000000..2b5a272 --- /dev/null +++ b/src/main/java/org/gcube/portlets/user/dataminerexecutor/portlet/DataMinerExecutor.java @@ -0,0 +1,55 @@ +/** + * + */ +package org.gcube.portlets.user.dataminerexecutor.portlet; + +import java.io.IOException; + +import javax.portlet.GenericPortlet; +import javax.portlet.PortletException; +import javax.portlet.PortletRequestDispatcher; +import javax.portlet.RenderRequest; +import javax.portlet.RenderResponse; + +import org.gcube.common.portal.PortalContext; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +/** + * + * @author Giancarlo Panichi + * + * + */ +public class DataMinerExecutor extends GenericPortlet { + + private final Logger logger= LoggerFactory.getLogger(GenericPortlet.class); + + + /** + * JSP folder name + */ + public static final String JSP_FOLDER = "/WEB-INF/jsp/"; + + /** + * + */ + public static final String VIEW_JSP = JSP_FOLDER + "DataMinerExecutor_view.jsp"; + + /** + * @param request . + * @param response . + * @throws IOException . + * @throws PortletException . + */ + public void doView(RenderRequest request, RenderResponse response) throws PortletException, IOException { + + logger.trace("DataMinerExecutor loading from JSP: "+VIEW_JSP); + logger.trace("Setting user in session using PortalContext"); + PortalContext.setUserInSession(request); + + logger.trace("passing to the render"); + PortletRequestDispatcher rd = getPortletContext().getRequestDispatcher(VIEW_JSP); + rd.include(request,response); + } +} diff --git a/src/main/java/org/gcube/portlets/user/dataminerexecutor/server/DataMinerExecutorServiceImpl.java b/src/main/java/org/gcube/portlets/user/dataminerexecutor/server/DataMinerExecutorServiceImpl.java new file mode 100644 index 0000000..cfd40a1 --- /dev/null +++ b/src/main/java/org/gcube/portlets/user/dataminerexecutor/server/DataMinerExecutorServiceImpl.java @@ -0,0 +1,440 @@ +package org.gcube.portlets.user.dataminerexecutor.server; + +import java.util.ArrayList; +import java.util.List; +import java.util.Map; + +import javax.servlet.ServletException; +import javax.servlet.http.HttpServletRequest; + +import org.gcube.data.analysis.dataminermanagercl.server.dmservice.SClient; +import org.gcube.data.analysis.dataminermanagercl.server.util.ServiceCredentials; +import org.gcube.data.analysis.dataminermanagercl.shared.data.OutputData; +import org.gcube.data.analysis.dataminermanagercl.shared.data.TableItemSimple; +import org.gcube.data.analysis.dataminermanagercl.shared.data.computations.ComputationData; +import org.gcube.data.analysis.dataminermanagercl.shared.data.computations.ComputationId; +import org.gcube.data.analysis.dataminermanagercl.shared.parameters.Parameter; +import org.gcube.data.analysis.dataminermanagercl.shared.process.ComputationStatus; +import org.gcube.data.analysis.dataminermanagercl.shared.process.Operator; +import org.gcube.data.analysis.dataminermanagercl.shared.process.OperatorsClassification; +import org.gcube.data.analysis.dataminermanagercl.shared.workspace.DataMinerWorkArea; +import org.gcube.data.analysis.dataminermanagercl.shared.workspace.ItemDescription; +import org.gcube.data.analysis.dminvocation.model.DataMinerInvocation; +import org.gcube.data.analysis.dminvocation.model.DataMinerParam; +import org.gcube.portlets.user.dataminerexecutor.client.rpc.DataMinerExecutorService; +import org.gcube.portlets.user.dataminerexecutor.server.invocation.InvocationManager; +import org.gcube.portlets.user.dataminerexecutor.server.storage.StorageUtil; +import org.gcube.portlets.user.dataminerexecutor.server.util.DataMinerWorkAreaManager; +import org.gcube.portlets.user.dataminerexecutor.server.util.TableReader; +import org.gcube.portlets.user.dataminerexecutor.shared.exception.ServiceException; +import org.gcube.portlets.user.dataminerexecutor.shared.session.UserInfo; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import com.allen_sauer.gwt.log.client.Log; +import com.google.gwt.user.server.rpc.RemoteServiceServlet; + +/** + * + * @author Giancarlo Panichi + * + * + */ +@SuppressWarnings("serial") +public class DataMinerExecutorServiceImpl extends RemoteServiceServlet implements DataMinerExecutorService { + + private static Logger logger = LoggerFactory.getLogger(DataMinerExecutorServiceImpl.class); + + /** + * {@inheritDoc} + */ + @Override + public void init() throws ServletException { + super.init(); + logger.info("DataMinerExecutor started!"); + + } + + /** + * + * {@inheritDoc} + * + */ + @Override + public UserInfo hello() throws ServiceException { + try { + ServiceCredentials serviceCredentials = SessionUtil.getServiceCredentials(this.getThreadLocalRequest()); + logger.debug("hello()"); + UserInfo userInfo = new UserInfo(serviceCredentials.getUserName(), serviceCredentials.getGroupId(), + serviceCredentials.getGroupName(), serviceCredentials.getScope(), serviceCredentials.getEmail(), + serviceCredentials.getFullName()); + logger.debug("UserInfo: " + userInfo); + return userInfo; + } catch (ServiceException e) { + logger.error(e.getLocalizedMessage(), e); + throw e; + } catch (Throwable e) { + logger.error("Hello(): " + e.getLocalizedMessage(), e); + throw new ServiceException(e.getLocalizedMessage(), e); + } + + } + + @Override + public List getOperatorsClassifications(boolean refresh) throws ServiceException { + + try { + HttpServletRequest httpRequest = this.getThreadLocalRequest(); + ServiceCredentials serviceCredentials = SessionUtil.getServiceCredentials(httpRequest); + SClient smClient = SessionUtil.getSClient(httpRequest, serviceCredentials); + List list = smClient.getOperatorsClassifications(refresh); + return list; + } catch (ServiceException e) { + logger.error(e.getLocalizedMessage(), e); + throw e; + } catch (Throwable e) { + logger.error("An error occurred getting the OperatorsClassifications list: " + e.getLocalizedMessage(), e); + throw new ServiceException(e.getLocalizedMessage(), e); + } + } + + @Override + public List getParameters(Operator operator) throws ServiceException { + try { + HttpServletRequest httpRequest = this.getThreadLocalRequest(); + ServiceCredentials serviceCredentials = SessionUtil.getServiceCredentials(httpRequest); + + SClient smClient = SessionUtil.getSClient(httpRequest, serviceCredentials); + + List list = smClient.getInputParameters(operator); + return list; + } catch (ServiceException e) { + logger.error(e.getLocalizedMessage()); + throw e; + } catch (Throwable e) { + logger.error("Error retrieving parameters: " + e.getLocalizedMessage(), e); + throw new ServiceException(e.getLocalizedMessage(), e); + } + } + + @Override + public Operator getInvocationModel(String invocationModelFileUrl) throws ServiceException { + try { + HttpServletRequest httpRequest = this.getThreadLocalRequest(); + ServiceCredentials serviceCredentials = SessionUtil.getServiceCredentials(httpRequest); + + InvocationManager invocationManager = new InvocationManager(); + DataMinerInvocation dmInvocation = invocationManager.readInvocation(invocationModelFileUrl); + if (dmInvocation == null || dmInvocation.getOperatorId() == null + || dmInvocation.getOperatorId().isEmpty()) { + logger.error("Invalid Invocation: " + dmInvocation); + throw new ServiceException("Invalid Invocation, operator id not found!"); + + } + + if (dmInvocation.getParameters() == null || dmInvocation.getParameters().getInput() == null + || dmInvocation.getParameters().getInput().getListParam() == null + || dmInvocation.getParameters().getInput().getListParam().isEmpty()) { + logger.error("Invalid Input Parameter: " + dmInvocation); + throw new ServiceException("Invalid Input Parameter!"); + } + + SClient smClient = SessionUtil.getSClient(httpRequest, serviceCredentials); + + Operator operator = smClient.getOperatorById(dmInvocation.getOperatorId(),true); + + if (operator == null) { + logger.error("Operator not found: " + dmInvocation); + throw new ServiceException("Invalid Invocation, operator not found!"); + + } + + List inputParameters = smClient.getInputParameters(operator); + List inputParametersFilled = new ArrayList(); + List invocationInputParams = dmInvocation.getParameters().getInput().getListParam(); + + if (inputParameters != null && !inputParameters.isEmpty()) { + for (Parameter p : inputParameters) { + boolean foundParam = false; + for (DataMinerParam dmP : invocationInputParams) { + if (p.getName().compareTo(dmP.getKey()) == 0) { + foundParam = true; + p.setValue(dmP.getValue()); + inputParametersFilled.add(p); + break; + } + } + if (!foundParam) { + logger.error("Invalid invocation, param " + p.getName() + " is not set in invocation model!"); + throw new ServiceException( + "Invalid invocation, param " + p.getName() + " is not set in invocation model!"); + } + + } + } else { + logger.error("Invalid operator, parameters not found: " + operator); + throw new ServiceException("Invalid operator, parameters not found!"); + } + + operator.setOperatorParameters(inputParametersFilled); + + return operator; + } catch (ServiceException e) { + logger.error(e.getLocalizedMessage()); + throw e; + } catch (Throwable e) { + logger.error("Error in getInvocationModel(): " + e.getLocalizedMessage(), e); + throw new ServiceException(e.getLocalizedMessage(), e); + } + } + + @Override + public ComputationId startComputation(Operator operator) throws ServiceException { + try { + HttpServletRequest httpRequest = this.getThreadLocalRequest(); + ServiceCredentials serviceCredentials = SessionUtil.getServiceCredentials(httpRequest); + + SClient smClient = SessionUtil.getSClient(httpRequest, serviceCredentials); + logger.debug("StartComputation(): [ operator=" + operator + "]"); + + ComputationId computationId = smClient.startComputation(operator); + return computationId; + } catch (ServiceException e) { + logger.error(e.getLocalizedMessage()); + throw e; + } catch (Throwable e) { + logger.error("Error in start computation: " + e.getLocalizedMessage(), e); + throw new ServiceException(e.getLocalizedMessage(), e); + } + } + + @Override + public ComputationId resubmit(ItemDescription itemDescription) throws ServiceException { + try { + StorageUtil storageUtil = new StorageUtil(); + HttpServletRequest httpRequest = this.getThreadLocalRequest(); + ServiceCredentials serviceCredentials = SessionUtil.getServiceCredentials(httpRequest); + Map properties = storageUtil.getProperties(serviceCredentials.getUserName(), + itemDescription.getId()); + logger.debug("Properties: " + properties); + + SClient smClient = SessionUtil.getSClient(httpRequest, serviceCredentials); + + ComputationId computationId = smClient.resubmitComputation(properties); + return computationId; + } catch (ServiceException e) { + logger.error(e.getLocalizedMessage(), e); + throw e; + } catch (Throwable e) { + logger.error("Error in resubmit computation: " + e.getLocalizedMessage(), e); + throw new ServiceException(e.getLocalizedMessage()); + } + } + + @Override + public ComputationStatus getComputationStatus(ComputationId computationId) throws ServiceException { + try { + HttpServletRequest httpRequest = this.getThreadLocalRequest(); + ServiceCredentials serviceCredentials = SessionUtil.getServiceCredentials(httpRequest); + SClient smClient = SessionUtil.getSClient(httpRequest, serviceCredentials); + ComputationStatus computationStatus = smClient.getComputationStatus(computationId); + return computationStatus; + + } catch (ServiceException e) { + logger.error(e.getLocalizedMessage(), e); + throw e; + } catch (Throwable e) { + logger.error("Error in getComputationStatus: " + e.getLocalizedMessage(), e); + throw new ServiceException(e.getLocalizedMessage(), e); + } + } + + @Override + public void deleteItem(ItemDescription itemDescription) throws ServiceException { + try { + HttpServletRequest httpRequest = this.getThreadLocalRequest(); + ServiceCredentials serviceCredentials = SessionUtil.getServiceCredentials(httpRequest); + logger.debug("DeleteItem(): " + itemDescription); + StorageUtil storageUtil = new StorageUtil(); + storageUtil.deleteItem(serviceCredentials.getUserName(), itemDescription.getId()); + return; + + } catch (ServiceException e) { + logger.error(e.getLocalizedMessage(), e); + throw e; + } catch (Throwable e) { + logger.error(e.getLocalizedMessage(), e); + throw new ServiceException(e.getLocalizedMessage(), e); + } + } + + @Override + public TableItemSimple retrieveTableInformation(ItemDescription item) throws ServiceException { + try { + HttpServletRequest httpRequest = this.getThreadLocalRequest(); + ServiceCredentials serviceCredentials = SessionUtil.getServiceCredentials(httpRequest); + logger.debug("retrieveTableInformation(): " + item); + TableReader tableReader = new TableReader(serviceCredentials, item); + TableItemSimple tableItemSimple = tableReader.getTableItemSimple(); + return tableItemSimple; + } catch (ServiceException e) { + logger.error(e.getLocalizedMessage(), e); + throw e; + } catch (Throwable e) { + logger.error(e.getLocalizedMessage(), e); + throw new ServiceException(e.getLocalizedMessage(), e); + } + } + + @Override + public DataMinerWorkArea getDataMinerWorkArea() throws ServiceException { + try { + HttpServletRequest httpRequest = this.getThreadLocalRequest(); + ServiceCredentials serviceCredentials = SessionUtil.getServiceCredentials(httpRequest); + logger.debug("getDataMinerWorkArea()"); + DataMinerWorkAreaManager dataMinerWorkAreaManager = new DataMinerWorkAreaManager(serviceCredentials); + return dataMinerWorkAreaManager.getDataMinerWorkArea(); + + } catch (ServiceException e) { + logger.error(e.getLocalizedMessage(), e); + throw e; + } catch (Throwable e) { + logger.error(e.getLocalizedMessage(), e); + throw new ServiceException(e.getLocalizedMessage(), e); + } + } + + @Override + public String getPublicLink(ItemDescription itemDescription) throws ServiceException { + try { + HttpServletRequest httpRequest = this.getThreadLocalRequest(); + ServiceCredentials serviceCredentials = SessionUtil.getServiceCredentials(httpRequest); + logger.debug("GetPublicLink(): " + itemDescription); + StorageUtil storageUtil = new StorageUtil(); + String link = storageUtil.getPublicLink(serviceCredentials.getUserName(), itemDescription.getId()); + + return link; + } catch (ServiceException e) { + logger.error(e.getLocalizedMessage(), e); + throw e; + } catch (Throwable e) { + logger.error(e.getLocalizedMessage(), e); + throw new ServiceException(e.getLocalizedMessage(), e); + } + } + + @Override + public String cancelComputation(ComputationId computationId) throws ServiceException { + try { + HttpServletRequest httpRequest = this.getThreadLocalRequest(); + ServiceCredentials serviceCredentials = SessionUtil.getServiceCredentials(httpRequest); + logger.debug("CancelComputation(): " + computationId); + SClient smClient = SessionUtil.getSClient(httpRequest, serviceCredentials); + String result = smClient.cancelComputation(computationId); + // SessionUtil.putSClient(session, smClient); + return result; + } catch (ServiceException e) { + logger.error(e.getLocalizedMessage(), e); + throw e; + } catch (Throwable e) { + logger.error(e.getLocalizedMessage(), e); + throw new ServiceException(e.getLocalizedMessage(), e); + } + } + + @Override + public OutputData getOutputDataByComputationId(ComputationId computationId) throws ServiceException { + try { + HttpServletRequest httpRequest = this.getThreadLocalRequest(); + ServiceCredentials serviceCredentials = SessionUtil.getServiceCredentials(httpRequest); + Log.debug("getOutputDataByComputationId: " + computationId); + SClient smClient = SessionUtil.getSClient(httpRequest, serviceCredentials); + OutputData outputData = smClient.getOutputDataByComputationId(computationId); + Log.debug("OutputData: " + outputData); + return outputData; + } catch (ServiceException e) { + logger.error(e.getLocalizedMessage(), e); + throw e; + } catch (Throwable e) { + logger.error("Error retrieving output by computation id: " + e.getLocalizedMessage(), e); + throw new ServiceException(e.getLocalizedMessage(), e); + } + + } + + @Override + public ComputationData getComputationData(ItemDescription itemDescription) throws ServiceException { + try { + HttpServletRequest httpRequest = this.getThreadLocalRequest(); + ServiceCredentials serviceCredentials = SessionUtil.getServiceCredentials(httpRequest); + logger.debug("OutputDataByComputationItemt(): " + itemDescription); + StorageUtil storageUtil = new StorageUtil(); + Map properties = storageUtil.getProperties(serviceCredentials.getUserName(), + itemDescription.getId()); + + logger.debug("Properties: " + properties); + SClient smClient = SessionUtil.getSClient(httpRequest, serviceCredentials); + + ComputationData computationData = smClient.getComputationDataByComputationProperties(properties); + return computationData; + + } catch (ServiceException e) { + logger.error(e.getLocalizedMessage(), e); + throw e; + } catch (Throwable e) { + logger.error("Error retrieving output by item: " + e.getLocalizedMessage(), e); + throw new ServiceException(e.getLocalizedMessage()); + } + } + + @Override + public String cancelComputation(ItemDescription itemDescription) throws ServiceException { + try { + HttpServletRequest httpRequest = this.getThreadLocalRequest(); + ServiceCredentials serviceCredentials = SessionUtil.getServiceCredentials(httpRequest); + logger.debug("CancelComputation(): " + itemDescription); + String compId = itemDescription.getName(); + if (compId == null) { + throw new ServiceException("Computation Id not found!"); + } else { + int lastIndexUnd = compId.lastIndexOf("_"); + if (lastIndexUnd == -1) { + throw new ServiceException("Invalid Computation Id: " + compId); + } else { + compId = compId.substring(lastIndexUnd + 1); + } + } + ComputationId computationId = new ComputationId(); + computationId.setId(compId); + SClient smClient = SessionUtil.getSClient(httpRequest, serviceCredentials); + String result = smClient.cancelComputation(computationId); + return result; + } catch (ServiceException e) { + logger.error(e.getLocalizedMessage(), e); + throw e; + } catch (Throwable e) { + logger.error(e.getLocalizedMessage(), e); + throw new ServiceException(e.getLocalizedMessage(), e); + } + } + + @Override + public ItemDescription getItemDescription(String itemId) throws ServiceException { + try { + HttpServletRequest httpRequest = this.getThreadLocalRequest(); + ServiceCredentials serviceCredentials = SessionUtil.getServiceCredentials(httpRequest); + logger.debug("getItemDescription(): [itemId=" + itemId + "]"); + StorageUtil storageUtil = new StorageUtil(); + ItemDescription itemDownloadInfo = storageUtil.getItemDescription(serviceCredentials.getUserName(), itemId); + logger.debug("ItemDescription info: " + itemDownloadInfo); + return itemDownloadInfo; + } catch (ServiceException e) { + logger.error(e.getLocalizedMessage(), e); + throw e; + } catch (Throwable e) { + logger.error("Error retrieving item description: " + e.getLocalizedMessage(), e); + throw new ServiceException("Error retrieving item description: " + e.getLocalizedMessage(), e); + } + } + +} diff --git a/src/main/java/org/gcube/portlets/user/dataminerexecutor/server/DescriptionRepository.java b/src/main/java/org/gcube/portlets/user/dataminerexecutor/server/DescriptionRepository.java new file mode 100644 index 0000000..3dd0787 --- /dev/null +++ b/src/main/java/org/gcube/portlets/user/dataminerexecutor/server/DescriptionRepository.java @@ -0,0 +1,127 @@ +package org.gcube.portlets.user.dataminerexecutor.server; + +import java.util.ArrayList; +import java.util.List; + +import org.gcube.data.analysis.dataminermanagercl.shared.process.Operator; +import org.gcube.data.analysis.dataminermanagercl.shared.process.OperatorCategory; + +/** + * + * @author Giancarlo Panichi + * + * + */ +public class DescriptionRepository { + + static List categories; + static List operators; + + private static void initCategories() { + if (categories==null) { + categories = new ArrayList(); + categories.add(new OperatorCategory( + "DISTRIBUTIONS", + "Distributions description", + "This category includes probability distributions, classifications, matching or distance measurements etc.", + true)); + categories.add(new OperatorCategory( + "MODELS", + "Models description", + "This category includes models to be trained, e.g. neural networks, species envelopes, support vector machines etc.. The result will be typically a binary file.", + false)); + categories.add(new OperatorCategory( + "EVALUATORS", + "A set of procedures for measuring the quality of a model", + "This category represent a set of procedures for measuring the quality of a model.", + false)); + } + } + + private static void initOperators() { + if (operators==null) { + operators = new ArrayList(); + operators.add(new Operator( + "AQUAMAPS_NATIVE_2050", + "Aquamaps Native for 2050 scenario", + "Aquamaps Native for 2050 scenario.", null, true)); + operators.add(new Operator( + "REMOTE_AQUAMAPS_SUITABLE_2050", + "Aquamaps Suitable for 2050 scenario", + "Aquamaps Suitable for 2050 scenario.", null, true)); + operators.add(new Operator( + "AQUAMAPS_SUITABLE_NEURALNETWORK", + "Aquamaps Suitable Distribution using a feed-Forward Neural Network", + "Aquamaps Suitable Distribution using a feed-Forward Neural Network.", null, true)); + operators.add(new Operator( + "REMOTE_AQUAMAPS_NATIVE", + "Aquamaps Native habitat generated by invoking Rainy Cloud", + "Aquamaps Native habitat generated by invoking Rainy Cloud.", null, true)); + operators.add(new Operator( + "AQUAMAPS_NEURAL_NETWORK_NS", + "Aquamaps Suitable Distribution using a Feed-Forward Neural Network provided by Neurosolutions", + "Aquamaps Suitable Distribution using a Feed-Forward Neural Network provided by Neurosolutions (http://www.neurosolutions.com).", null, true)); + operators.add(new Operator( + "REMOTE_AQUAMAPS_NATIVE_2050", + "Aquamaps Native 2050 habitat generated by invoking Rainy Cloud", + "Aquamaps Native 2050 habitat generated by invoking Rainy Cloud.", null, true)); + operators.add(new Operator( + "REMOTE_AQUAMAPS_SUITABLE", + "Aquamaps Suitable habitat generated by invoking Rainy Cloud", + "Aquamaps Suitable habitat generated by invoking Rainy Cloud.", null, true)); + operators.add(new Operator( + "AQUAMAPS_SUITABLE", + "Aquamaps Suitable habitat production", + "Aquamaps Suitable habitat production.", null, true)); + operators.add(new Operator( + "AQUAMAPS_NATIVE_NEURALNETWORK", + "Aquamaps Native Distribution using a Feed-Forward Neural Network", + "Aquamaps Native Distribution using a Feed-Forward Neural Network.", null, true)); + operators.add(new Operator( + "AQUAMAPS_NATIVE", + "Aquamaps Native habitat production", + "Aquamaps Native habitat production.", null, true)); + operators.add(new Operator( + "AQUAMAPS_SUITABLE_2050", + "Aquamaps Suitable for 2050 scenario", + "Aquamaps Suitable for 2050 scenario.", null, true)); + operators.add(new Operator( + "AQUAMAPSNN", + "Feed-Forward Neural Network for usage in Aquamaps generations", + "Feed-Forward Neural Network for usage in Aquamaps generations.", null, true)); + operators.add(new Operator( + "AQUAMAPSNNNS", + "Feed-Forward Neural Network by Neurosolutions for usage in Aquamaps generations", + "Feed-Forward Neural Network by Neurosolutions (http://www.neurosolutions.com) for usage in Aquamaps generations.", null, true)); + operators.add(new Operator( + "HSPEN", + "Hspen model by Aquamaps", + "Hspen model by Aquamaps.", null, true)); + operators.add(new Operator( + "QUALITY_ANALYSIS", + "", + ".", null)); + operators.add(new Operator( + "DISCREPANCY_ANALYSIS", + "", + ".", null)); + } + } + + public static OperatorCategory getOperatorCategory(OperatorCategory operatorCategory) { + initCategories(); + for (OperatorCategory cat : categories) + if (operatorCategory.getId().contentEquals(cat.getId())) + return cat; + return null; + } + + public static Operator getOperator(Operator operator) { + initOperators(); + for (Operator op : operators) + if (operator.getId().contentEquals(op.getId())) + return op; + return null; + } +} + diff --git a/src/main/java/org/gcube/portlets/user/dataminerexecutor/server/DownloadServlet.java b/src/main/java/org/gcube/portlets/user/dataminerexecutor/server/DownloadServlet.java new file mode 100644 index 0000000..a2673c7 --- /dev/null +++ b/src/main/java/org/gcube/portlets/user/dataminerexecutor/server/DownloadServlet.java @@ -0,0 +1,163 @@ +package org.gcube.portlets.user.dataminerexecutor.server; + +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStream; +import java.nio.ByteBuffer; +import java.nio.channels.Channels; +import java.nio.channels.ReadableByteChannel; +import java.nio.channels.WritableByteChannel; + +import javax.servlet.ServletException; +import javax.servlet.http.HttpServlet; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import javax.servlet.http.HttpSession; + +import org.gcube.common.storagehub.model.items.FolderItem; +import org.gcube.data.analysis.dataminermanagercl.server.util.ServiceCredentials; +import org.gcube.portlets.user.dataminerexecutor.server.storage.ItemDownload; +import org.gcube.portlets.user.dataminerexecutor.server.storage.StorageUtil; +import org.gcube.portlets.user.dataminerexecutor.shared.Constants; +import org.gcube.portlets.user.dataminerexecutor.shared.exception.ServiceException; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +/** + * Download Servlet + * + * @author Giancarlo Panichi + * + * + */ +public class DownloadServlet extends HttpServlet { + + private static final long serialVersionUID = 5389118370656932343L; + + private static Logger logger = LoggerFactory.getLogger(DownloadServlet.class); + + public DownloadServlet() { + super(); + } + + /** + * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse + * response) + */ + protected void doGet(HttpServletRequest request, HttpServletResponse response) + throws ServletException, IOException { + createResponse(request, response); + } + + /** + * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse + * response) + */ + protected void doPost(HttpServletRequest request, HttpServletResponse response) + throws ServletException, IOException { + createResponse(request, response); + } + + private void createResponse(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { + + try { + logger.debug("DownloadServlet()"); + + HttpSession session = req.getSession(); + + if (session == null) { + logger.error("Error getting the download session, no session valid found: " + session); + resp.sendError(HttpServletResponse.SC_INTERNAL_SERVER_ERROR, + "ERROR-Error getting the user session, no session found" + session); + return; + } + logger.debug("DownloadServlet() session id: " + session.getId()); + String scopeGroupId = req.getHeader(Constants.CURR_GROUP_ID); + if (scopeGroupId == null || scopeGroupId.isEmpty()) { + scopeGroupId = req.getParameter(Constants.CURR_GROUP_ID); + if (scopeGroupId == null || scopeGroupId.isEmpty()) { + logger.error( + "CURR_GROUP_ID is null, it is a mandatory parameter in custom servlet: " + scopeGroupId); + throw new ServletException( + "CURR_GROUP_ID is null, it is a mandatory parameter in custom servlet: " + scopeGroupId); + } + } + + String itemId = req.getParameter("itemId"); + logger.info("DownloadServlet(): [scopeGroupId=" + scopeGroupId + ",ItemId=" + itemId + "]"); + ServiceCredentials serviceCredentials = SessionUtil.getServiceCredentials(req, scopeGroupId); + StorageUtil filesStorage = new StorageUtil(); + ItemDownload itemDownload = filesStorage.getItemDownload(serviceCredentials.getUserName(), itemId); + logger.debug("ItemDownload: " + itemDownload); + if (itemDownload == null) { + logger.error("This type of item does not support download operation"); + throw new ServletException("This type of item does not support download operation"); + + } else { + if (itemDownload.getInputStream() == null) { + logger.error("This type of item does not support download operation"); + throw new ServletException("This type of item does not support download operation"); + } else { + String fileName; + if (itemDownload.getItemDescription() == null) { + fileName = "filename"; + resp.setHeader("Content-Disposition", "attachment;filename=\"" + fileName + "\""); + resp.setHeader("Content-Type", "application/force-download"); + } else { + if (itemDownload.getItemDescription().getName() == null + || itemDownload.getItemDescription().getName().isEmpty()) { + if (itemDownload.getItemDescription().getType() != null && itemDownload.getItemDescription() + .getType().compareTo(FolderItem.class.getSimpleName()) == 0) { + fileName = "folder.zip"; + resp.setHeader("Content-Disposition", "attachment;filename=\"" + fileName + "\""); + resp.setHeader("Content-Type", "application/zip"); + } else { + fileName = "filename"; + resp.setHeader("Content-Disposition", "attachment;filename=\"" + fileName + "\""); + resp.setHeader("Content-Type", "application/force-download"); + } + } else { + if (itemDownload.getItemDescription().getType() != null && itemDownload.getItemDescription() + .getType().compareTo(FolderItem.class.getSimpleName()) == 0) { + fileName = itemDownload.getItemDescription().getName() + ".zip"; + resp.setHeader("Content-Disposition", "attachment;filename=\"" + fileName + "\""); + resp.setHeader("Content-Type", "application/zip"); + + } else { + fileName = itemDownload.getItemDescription().getName(); + resp.setHeader("Content-Disposition", "attachment;filename=\"" + fileName + "\""); + resp.setHeader("Content-Type", "application/force-download"); + } + } + } + logger.debug("Content-Disposition: "+resp.getHeader("Content-Disposition")); + logger.debug("Content-Type: "+resp.getHeader("Content-Type")); + logger.debug("DownloadServlet filename: " + fileName); + stream(itemDownload.getInputStream(), resp.getOutputStream()); + } + } + } catch (ServiceException e) { + logger.error("DownloadServlet():" + e.getLocalizedMessage(), e); + throw new ServletException(e.getLocalizedMessage(), e); + } catch (Throwable e) { + logger.error("DownloadServlet(): " + e.getLocalizedMessage(), e); + throw new ServletException("Download item error: " + e.getLocalizedMessage(), e); + } + } + + private long stream(InputStream input, OutputStream output) throws IOException { + try (ReadableByteChannel inputChannel = Channels.newChannel(input); + WritableByteChannel outputChannel = Channels.newChannel(output);) { + ByteBuffer buffer = ByteBuffer.allocateDirect(10240); + long size = 0; + + while (inputChannel.read(buffer) != -1) { + buffer.flip(); + size += outputChannel.write(buffer); + buffer.clear(); + } + + return size; + } + } +} \ No newline at end of file diff --git a/src/main/java/org/gcube/portlets/user/dataminerexecutor/server/SessionUtil.java b/src/main/java/org/gcube/portlets/user/dataminerexecutor/server/SessionUtil.java new file mode 100644 index 0000000..d77fcea --- /dev/null +++ b/src/main/java/org/gcube/portlets/user/dataminerexecutor/server/SessionUtil.java @@ -0,0 +1,245 @@ +/** + * + */ +package org.gcube.portlets.user.dataminerexecutor.server; + +import java.util.HashMap; + +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpSession; + +import org.apache.log4j.Logger; +import org.gcube.common.authorization.library.provider.SecurityTokenProvider; +import org.gcube.common.portal.PortalContext; +import org.gcube.common.scope.api.ScopeProvider; +import org.gcube.data.analysis.dataminermanagercl.server.dmservice.SClient; +import org.gcube.data.analysis.dataminermanagercl.server.dmservice.SClient4WPSBuilder; +import org.gcube.data.analysis.dataminermanagercl.server.dmservice.SClientBuilder; +import org.gcube.data.analysis.dataminermanagercl.server.dmservice.SClientDirector; +import org.gcube.data.analysis.dataminermanagercl.server.util.ServiceCredentials; +import org.gcube.portlets.user.dataminerexecutor.shared.Constants; +import org.gcube.portlets.user.dataminerexecutor.shared.exception.ServiceException; +import org.gcube.vomanagement.usermanagement.impl.LiferayGroupManager; +import org.gcube.vomanagement.usermanagement.model.GCubeGroup; +import org.gcube.vomanagement.usermanagement.model.GCubeUser; + +/** + * + * @author Giancarlo Panichi + * + * + */ +public class SessionUtil { + + private static final Logger logger = Logger.getLogger(SessionUtil.class); + + /** + * + * @param httpServletRequest + * http servlet request + * @return service credentials + * @throws ServiceException + * service exception + */ + public static ServiceCredentials getServiceCredentials(HttpServletRequest httpServletRequest) + throws ServiceException { + return getServiceCredentials(httpServletRequest, null); + } + + /** + * + * @param httpServletRequest + * http servlet request + * @param scopeGroupId + * scope group id + * @return service credentials + * @throws ServiceException + * service exception + */ + public static ServiceCredentials getServiceCredentials(HttpServletRequest httpServletRequest, String scopeGroupId) + throws ServiceException { + + ServiceCredentials sCredentials = null; + String userName = null; + String scope = null; + String token = null; + String groupId = null; + String groupName = null; + + if (Constants.DEBUG_MODE) { + logger.debug("No credential found in session, use test user!"); + /* + * InfoLocale infoLocale = getInfoLocale(httpServletRequest, null); + * Locale locale = new Locale(infoLocale.getLanguage()); + * + * ResourceBundle messages = ResourceBundle.getBundle( + * StatAlgoImporterServiceMessagesConstants.TDGWTServiceMessages, + * locale); + */ + userName = Constants.DEFAULT_USER; + scope = Constants.DEFAULT_SCOPE; + token = Constants.DEFAULT_TOKEN; + + logger.debug("Set SecurityToken: " + token); + SecurityTokenProvider.instance.set(token); + logger.debug("Set ScopeProvider: " + scope); + ScopeProvider.instance.set(scope); + + sCredentials = new ServiceCredentials(userName, scope, token); + + } else { + logger.debug("Retrieving credential in session!"); + PortalContext pContext = PortalContext.getConfiguration(); + boolean hasScopeGroupId = false; + + if (scopeGroupId != null && !scopeGroupId.isEmpty()) { + hasScopeGroupId = true; + + } else { + hasScopeGroupId = false; + } + + if (hasScopeGroupId) { + scope = pContext.getCurrentScope(scopeGroupId); + } else { + scope = pContext.getCurrentScope(httpServletRequest); + } + + if (scope == null || scope.isEmpty()) { + String error = "Error retrieving scope: " + scope; + logger.error(error); + throw new ServiceException(error); + } + + GCubeUser gCubeUser = pContext.getCurrentUser(httpServletRequest); + + if (gCubeUser == null) { + String error = "Error retrieving gCubeUser in scope " + scope + ": " + gCubeUser; + logger.error(error); + throw new ServiceException(error); + } + + userName = gCubeUser.getUsername(); + + if (userName == null || userName.isEmpty()) { + String error = "Error retrieving username in scope " + scope + ": " + userName; + logger.error(error); + throw new ServiceException(error); + } + + token = pContext.getCurrentUserToken(scope, userName); + + if (token == null || token.isEmpty()) { + String error = "Error retrieving token for " + userName + " in " + scope + ": " + token; + logger.error(error); + throw new ServiceException(error); + } + + String name = gCubeUser.getFirstName(); + String lastName = gCubeUser.getLastName(); + String fullName = gCubeUser.getFullname(); + + String userAvatarURL = gCubeUser.getUserAvatarURL(); + + String email = gCubeUser.getEmail(); + + if (hasScopeGroupId) { + logger.debug("Set SecurityToken: " + token); + SecurityTokenProvider.instance.set(token); + logger.debug("Set ScopeProvider: " + scope); + ScopeProvider.instance.set(scope); + + groupId = scopeGroupId; + + long gId; + + try { + gId = Long.parseLong(scopeGroupId); + } catch (Throwable e) { + String error = "Error retrieving groupId: " + scopeGroupId; + logger.error(error, e); + throw new ServiceException(error); + } + + GCubeGroup group; + try { + group = new LiferayGroupManager().getGroup(gId); + } catch (Throwable e) { + String error = "Error retrieving group: " + groupName; + logger.error(error); + throw new ServiceException(error); + } + + groupName = group.getGroupName(); + + } else { + + groupId = String.valueOf(pContext.getCurrentGroupId(httpServletRequest)); + + groupName = pContext.getCurrentGroupName(httpServletRequest); + + } + + sCredentials = new ServiceCredentials(userName, fullName, name, lastName, email, scope, groupId, groupName, + userAvatarURL, token); + } + + logger.debug("ServiceCredentials: " + sCredentials); + + return sCredentials; + } + + public static SClient getSClient(HttpServletRequest httpRequest, ServiceCredentials serviceCredentials) + throws Exception { + + if (serviceCredentials == null) { + logger.error("ServiceCredentials is null!"); + throw new ServiceException("Service Credentials is null!"); + } + HttpSession session = httpRequest.getSession(); + + SClient sClient; + + Object obj = session.getAttribute(Constants.SClientMap); + if (obj == null) { + logger.debug("Create new SClientMap"); + HashMap sClientMap = new HashMap<>(); + logger.debug("Create new SClient"); + SClientBuilder sBuilder = new SClient4WPSBuilder(serviceCredentials); + SClientDirector director = new SClientDirector(); + director.setSClientBuilder(sBuilder); + director.constructSClient(); + sClient = director.getSClient(); + + sClientMap.put(serviceCredentials.getScope(), sClient); + session.setAttribute(Constants.SClientMap, sClientMap); + } else { + if (obj instanceof HashMap) { + @SuppressWarnings("unchecked") + HashMap sClientMap = (HashMap) obj; + if (sClientMap.containsKey(serviceCredentials.getScope())) { + logger.debug("Use SClient in session"); + sClient = sClientMap.get(serviceCredentials.getScope()); + } else { + logger.debug("Create new SClient"); + SClientBuilder sBuilder = new SClient4WPSBuilder(serviceCredentials); + + SClientDirector director = new SClientDirector(); + director.setSClientBuilder(sBuilder); + director.constructSClient(); + sClient = director.getSClient(); + sClientMap.put(serviceCredentials.getScope(), sClient); + session.setAttribute(Constants.SClientMap, sClientMap); + } + + } else { + logger.error("Attention no SClientMap in Session!"); + throw new ServiceException("Sign Out, portlet is changed, a new session is required!"); + } + } + + return sClient; + + } + +} diff --git a/src/main/java/org/gcube/portlets/user/dataminerexecutor/server/invocation/InvocationManager.java b/src/main/java/org/gcube/portlets/user/dataminerexecutor/server/invocation/InvocationManager.java new file mode 100644 index 0000000..369c9c6 --- /dev/null +++ b/src/main/java/org/gcube/portlets/user/dataminerexecutor/server/invocation/InvocationManager.java @@ -0,0 +1,93 @@ +package org.gcube.portlets.user.dataminerexecutor.server.invocation; + +import java.io.IOException; +import java.io.InputStream; +import java.net.URL; +import java.net.URLConnection; +import java.nio.file.Files; +import java.nio.file.Path; + +import javax.xml.bind.JAXBException; + +import org.gcube.data.analysis.dataminermanagercl.shared.exception.ServiceException; +import org.gcube.data.analysis.dminvocation.DataMinerInvocationManager; +import org.gcube.data.analysis.dminvocation.model.DataMinerInvocation; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.xml.sax.SAXException; + +public class InvocationManager { + + private static Logger logger = LoggerFactory.getLogger(InvocationManager.class); + private static final String INVOCATION_NAME = "DMInvocation"; + private static final String INVOCATION_JSON_EXTENTION = ".json"; + private DataMinerInvocationManager manager; + + public InvocationManager() throws ServiceException { + try { + manager = DataMinerInvocationManager.getInstance(); + } catch (JAXBException | IOException | SAXException e) { + logger.error("Error in DataMiner Invocation Manager: " + e.getLocalizedMessage(), e); + throw new ServiceException("Error in DataMiner Invocation Manager: " + e.getLocalizedMessage()); + } + + } + + public DataMinerInvocation readInvocation(String invocationFileUrl) throws ServiceException { + try { + + logger.info("Read DataMiner Invocation Model"); + Path destination = Files.createTempFile(INVOCATION_NAME, INVOCATION_JSON_EXTENTION); + logger.info("Destination: [destination=" + destination + "]"); + + logger.info("Read invocation: [fileUrl=" + invocationFileUrl+"]"); + URL smpFile = new URL(invocationFileUrl); + URLConnection uc = (URLConnection) smpFile.openConnection(); + + DataMinerInvocation dmInvocation=null; + + try (InputStream is = uc.getInputStream();) { + dmInvocation = manager.unmarshalingJSON(uc.getInputStream(), true); + } + + logger.debug("DMInvocation: "+dmInvocation); + return dmInvocation; + + } catch (Throwable e) { + logger.error("Error reading DataMiner invocation file: " + e.getLocalizedMessage(), e); + throw new ServiceException("Error reading DataMiner invocation file: "+e.getLocalizedMessage()); + } + } +// +// public void readInvocation(String invocationFileUrl) throws ServiceException { +// +// try { +// Path file=retrieveFile(invocationFileUrl); +// +// try (InputStream in = Files.newInputStream(uc.getrn_demo)) { +// while ((n = in.read()) != -1) { +// System.out.print((char) n); +// } +// } catch (IOException e) { +// System.err.println(e); +// } +// +// +// +// +// List lines = createInfoTxtData(); +// Files.write(tempFile, lines, Charset.defaultCharset(), StandardOpenOption.WRITE); +// logger.debug(tempFile.toString()); +// return tempFile; +// +// } catch (IOException e) { +// logger.error(e.getLocalizedMessage()); +// e.printStackTrace(); +// throw new ServiceException(e.getLocalizedMessage(), e); +// } +// +// +// +// +// } +} diff --git a/src/main/java/org/gcube/portlets/user/dataminerexecutor/server/storage/ItemDownload.java b/src/main/java/org/gcube/portlets/user/dataminerexecutor/server/storage/ItemDownload.java new file mode 100644 index 0000000..b9ef94d --- /dev/null +++ b/src/main/java/org/gcube/portlets/user/dataminerexecutor/server/storage/ItemDownload.java @@ -0,0 +1,44 @@ +package org.gcube.portlets.user.dataminerexecutor.server.storage; + +import java.io.InputStream; + +import org.gcube.data.analysis.dataminermanagercl.shared.workspace.ItemDescription; + +/** + * + * @author Giancarlo Panichi + * + * + */ +public class ItemDownload { + private ItemDescription itemDescription; + private InputStream inputStream; + + public ItemDownload(ItemDescription itemDescription, InputStream inputStream) { + super(); + this.itemDescription = itemDescription; + this.inputStream = inputStream; + } + + public ItemDescription getItemDescription() { + return itemDescription; + } + + public void setItemDescription(ItemDescription itemDescription) { + this.itemDescription = itemDescription; + } + + public InputStream getInputStream() { + return inputStream; + } + + public void setInputStream(InputStream inputStream) { + this.inputStream = inputStream; + } + + @Override + public String toString() { + return "ItemDownload [itemDescription=" + itemDescription + ", inputStream=" + inputStream + "]"; + } + +} diff --git a/src/main/java/org/gcube/portlets/user/dataminerexecutor/server/storage/StorageUtil.java b/src/main/java/org/gcube/portlets/user/dataminerexecutor/server/storage/StorageUtil.java new file mode 100644 index 0000000..190e5b1 --- /dev/null +++ b/src/main/java/org/gcube/portlets/user/dataminerexecutor/server/storage/StorageUtil.java @@ -0,0 +1,332 @@ +package org.gcube.portlets.user.dataminerexecutor.server.storage; + +import java.io.InputStream; +import java.net.URL; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import org.gcube.common.storagehub.client.StreamDescriptor; +import org.gcube.common.storagehub.client.dsl.FileContainer; +import org.gcube.common.storagehub.client.dsl.FolderContainer; +import org.gcube.common.storagehub.client.dsl.ItemContainer; +import org.gcube.common.storagehub.client.dsl.ListResolver; +import org.gcube.common.storagehub.client.dsl.OpenResolver; +import org.gcube.common.storagehub.client.dsl.StorageHubClient; +import org.gcube.common.storagehub.model.Metadata; +import org.gcube.common.storagehub.model.items.AbstractFileItem; +import org.gcube.common.storagehub.model.items.FolderItem; +import org.gcube.common.storagehub.model.items.GCubeItem; +import org.gcube.common.storagehub.model.items.Item; +import org.gcube.common.storagehub.model.items.TrashItem; +import org.gcube.data.analysis.dataminermanagercl.shared.workspace.ItemDescription; +import org.gcube.portlets.user.dataminerexecutor.shared.exception.ServiceException; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +/** + * + * @author Giancarlo Panichi + * + * + */ +public class StorageUtil { + + private static Logger logger = LoggerFactory.getLogger(StorageUtil.class); + + /** + * + * @param user + * user + * @param itemId + * item id + * @return map properties + * @throws ServiceException + * service exception + */ + public Map getProperties(String user, String itemId) throws ServiceException { + try { + StorageHubClient shc = new StorageHubClient(); + Item item = shc.open(itemId).asItem().get(); + Metadata metadata = item.getMetadata(); + Map itemMap = new HashMap(); + Map metadataMap = metadata.getMap(); + for (String key : metadataMap.keySet()) { + String s = String.valueOf(metadataMap.get(key)); + itemMap.put(key, s); + } + return itemMap; + + } catch (Throwable e) { + logger.error("Error retrieving properties: " + e.getLocalizedMessage(), e); + throw new ServiceException(e.getLocalizedMessage(), e); + } + + } + + /** + * + * @param user + * user + * @param itemId + * item id + * @return input stream + * @throws ServiceException + * service exception + */ + public InputStream getFileOnWorkspace(String user, String itemId) throws ServiceException { + try { + logger.debug("getInputStreamForItemOnWorkspace: [user=" + user + ", itemId=" + itemId + "]"); + StorageHubClient shc = new StorageHubClient(); + FileContainer fileContainer = shc.open(itemId).asFile(); + StreamDescriptor streamDescriptor = fileContainer.download(); + return streamDescriptor.getStream(); + + } catch (Throwable e) { + logger.error("Error retrieving InputStream for File: " + e.getLocalizedMessage(), e); + throw new ServiceException(e.getLocalizedMessage(), e); + } + } + + public ItemDownload getItemDownload(String user, String itemId) throws ServiceException { + try { + logger.debug("getItemDownload: [user=" + user + ", itemId=" + itemId + "]"); + StorageHubClient shc = new StorageHubClient(); + OpenResolver openResolver = shc.open(itemId); + ItemContainer itemContainer = openResolver.asItem(); + Item item = itemContainer.get(); + + StreamDescriptor streamDescriptor = null; + if (item instanceof AbstractFileItem) { + FileContainer fileContainer = openResolver.asFile(); + streamDescriptor = fileContainer.download(); + } else { + if (item instanceof FolderItem) { + FolderContainer folderContainer = openResolver.asFolder(); + streamDescriptor = folderContainer.download(); + } else { + } + } + + if (streamDescriptor == null) { + logger.error("This type of item does not support download: " + itemId); + return null; + } else { + ItemDescription itemDescription = new ItemDescription(item.getId(), item.getName(), item.getOwner(), + item.getPath(), getItemType(item)); + ItemDownload itemDownload = new ItemDownload(itemDescription, streamDescriptor.getStream()); + return itemDownload; + } + } catch (Throwable e) { + logger.error("Error retrieving InputStream for item: " + e.getLocalizedMessage(), e); + throw new ServiceException(e.getLocalizedMessage(), e); + } + } + + /** + * + * @param user + * User + * @param itemId + * Item id + * @return Item description + * @throws ServiceException + * Error + */ + public ItemDescription getItemDescription(String user, String itemId) throws ServiceException { + try { + logger.info("Retrieve file info on workspace: [user=" + user + ", itemId=" + itemId + "]"); + StorageHubClient shc = new StorageHubClient(); + OpenResolver openResolver = shc.open(itemId); + ItemContainer itemContainer = openResolver.asItem(); + Item item = itemContainer.get(); + ItemDescription itemDescription = new ItemDescription(item.getId(), item.getName(), item.getOwner(), + item.getPath(), getItemType(item)); + return itemDescription; + } catch (Throwable e) { + logger.error("Retrieve file info on workspace: " + e.getLocalizedMessage(), e); + throw new ServiceException(e.getLocalizedMessage()); + } + } + + /** + * + * @param user + * user + * @param itemId + * item id + * @return public link + * @throws ServiceException + * service exception + */ + public String getPublicLink(String user, String itemId) throws ServiceException { + try { + logger.debug("getPublicLink: [user=" + user + ", itemId=" + itemId + "]"); + StorageHubClient shc = new StorageHubClient(); + URL url = shc.open(itemId).asFile().getPublicLink(); + return url.toString(); + + } catch (Throwable e) { + logger.error("Error retrieving public link: " + e.getLocalizedMessage(), e); + throw new ServiceException(e.getLocalizedMessage(), e); + } + } + + /** + * + * @param user + * user + * @param folderId + * folder id + * @return input stream + * @throws ServiceException + * service exception public InputStream zipFolder(String user, + * String folderId) throws ServiceException { try { + * logger.debug("zipFolder: [user=" + user + ", folderId=" + + * folderId + "]"); StorageHubClient shc = new + * StorageHubClient(); OpenResolver openResolver = + * shc.open(folderId); + * + * ItemContainer itemContainer = openResolver.asItem(); + * Item item = itemContainer.get(); if (item instanceof + * FolderItem) { StreamDescriptor streamDescriptor = + * openResolver.asFolder().download(); InputStream is = + * streamDescriptor.getStream(); return is; } else { throw new + * ServiceException("Is not a valid folder!"); } + * + * } catch (Throwable e) { logger.error("Error in zip Folder: " + * + e.getLocalizedMessage(), e); throw new + * ServiceException(e.getLocalizedMessage(), e); } + * + * } + */ + + /** + * + * @param user + * user + * @param itemName + * item name + * @return workspace item + * @throws ServiceException + * service exception + */ + public ItemDescription getItemInRootFolderOnWorkspace(String user, String itemName) throws ServiceException { + try { + logger.debug("GetItemInRootFolder: [user=" + user + ", itemName=" + itemName + "]"); + StorageHubClient shc = new StorageHubClient(); + ListResolver listResolver = shc.getWSRoot().findByName(itemName); + List items = listResolver.getItems(); + + if (items == null || items.isEmpty()) { + logger.debug("No item found"); + return null; + } else { + Item item = items.get(0); + logger.debug("Item: " + item); + if (item != null) { + logger.debug("Item Id=" + item.getId()); + ItemDescription itemDescription = new ItemDescription(item.getId(), item.getName(), item.getOwner(), + item.getPath(), getItemType(item)); + return itemDescription; + } else { + return null; + } + } + + } catch (Throwable e) { + logger.error("Error in get Item in RootFolder: " + e.getLocalizedMessage(), e); + throw new ServiceException(e.getLocalizedMessage()); + } + } + + /** + * + * @param user + * user + * @param folderId + * folder id + * @param itemName + * item name + * @return workspace item + * @throws ServiceException + * service exception + */ + public ItemDescription getItemInFolderOnWorkspace(String user, String folderId, String itemName) + throws ServiceException { + try { + logger.debug("GetItemInFolder: [user=" + user + ", folderId=" + folderId + ", itemName=" + itemName + "]"); + StorageHubClient shc = new StorageHubClient(); + ListResolver listResolver = shc.open(folderId).asFolder().findByName(itemName); + List items = listResolver.getItems(); + + if (items == null || items.isEmpty()) { + logger.debug("No item found"); + return null; + } else { + Item item = items.get(0); + logger.debug("Item: " + item); + if (item != null) { + logger.debug("Item Id=" + item.getId()); + ItemDescription itemDescription = new ItemDescription(item.getId(), item.getName(), item.getOwner(), + item.getPath(), getItemType(item)); + return itemDescription; + } else { + return null; + } + } + + } catch (Throwable e) { + logger.error("Error in get Item in Folder: " + e.getLocalizedMessage(), e); + throw new ServiceException(e.getLocalizedMessage()); + } + } + + /** + * + * @param user + * user + * @param itemId + * item id + * @throws ServiceException + * service exception + */ + public void deleteItem(String user, String itemId) throws ServiceException { + try { + logger.debug("Delete Item: [User=" + user + ", ItemId=" + itemId + "]"); + StorageHubClient shc = new StorageHubClient(); + OpenResolver openResolver = shc.open(itemId); + + ItemContainer itemContainer = openResolver.asItem(); + itemContainer.delete(); + + return; + } catch (Throwable e) { + logger.error("Error deleting Item: " + e.getLocalizedMessage(), e); + throw new ServiceException(e.getLocalizedMessage()); + + } + + } + + private String getItemType(Item item) { + if (item instanceof AbstractFileItem) { + return AbstractFileItem.class.getSimpleName(); + } else { + if (item instanceof FolderItem) { + return FolderItem.class.getSimpleName(); + } else { + if (item instanceof GCubeItem) { + return GCubeItem.class.getSimpleName(); + } else { + if (item instanceof TrashItem) { + return TrashItem.class.getSimpleName(); + } else { + return null; + } + } + } + } + } + +} diff --git a/src/main/java/org/gcube/portlets/user/dataminerexecutor/server/util/DataMinerWorkAreaManager.java b/src/main/java/org/gcube/portlets/user/dataminerexecutor/server/util/DataMinerWorkAreaManager.java new file mode 100644 index 0000000..5d9e7bd --- /dev/null +++ b/src/main/java/org/gcube/portlets/user/dataminerexecutor/server/util/DataMinerWorkAreaManager.java @@ -0,0 +1,93 @@ +package org.gcube.portlets.user.dataminerexecutor.server.util; + +import org.gcube.data.analysis.dataminermanagercl.server.util.ServiceCredentials; +import org.gcube.data.analysis.dataminermanagercl.shared.workspace.Computations; +import org.gcube.data.analysis.dataminermanagercl.shared.workspace.DataMinerWorkArea; +import org.gcube.data.analysis.dataminermanagercl.shared.workspace.InputDataSets; +import org.gcube.data.analysis.dataminermanagercl.shared.workspace.ItemDescription; +import org.gcube.data.analysis.dataminermanagercl.shared.workspace.OutputDataSets; +import org.gcube.portlets.user.dataminerexecutor.server.storage.StorageUtil; +import org.gcube.portlets.user.dataminerexecutor.shared.exception.ServiceException; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +/** + * + * @author Giancarlo Panichi + * + * + */ +public class DataMinerWorkAreaManager { + private static final String DATA_MINER_FOLDER = "DataMiner"; + private static final String IMPORTED_DATA_FOLDER = "Input Data Sets"; + private static final String COMPUTED_DATA_FOLDER = "Output Data Sets"; + private static final String COMPUTATIONS_FOLDER = "Computations"; + + public static final Logger logger = LoggerFactory.getLogger(DataMinerWorkAreaManager.class); + + private ServiceCredentials serviceCredentials; + + public DataMinerWorkAreaManager(ServiceCredentials serviceCredentials) { + this.serviceCredentials = serviceCredentials; + } + + public DataMinerWorkArea getDataMinerWorkArea() throws ServiceException { + DataMinerWorkArea dataMinerWorkArea = null; + StorageUtil storageUtil = new StorageUtil(); + try { + + ItemDescription dataMinerWorkAreaFolder = storageUtil.getItemInRootFolderOnWorkspace(serviceCredentials.getUserName(), + DATA_MINER_FOLDER); + if (dataMinerWorkAreaFolder == null) { + dataMinerWorkArea = new DataMinerWorkArea(null); + return dataMinerWorkArea; + } else { + dataMinerWorkArea = new DataMinerWorkArea(dataMinerWorkAreaFolder); + } + + } catch (Throwable e) { + logger.debug("DataMiner Folder is set to null"); + e.printStackTrace(); + dataMinerWorkArea = new DataMinerWorkArea(null); + return dataMinerWorkArea; + } + + InputDataSets inputDataSets = null; + try { + ItemDescription importedDataFolder = storageUtil.getItemInFolderOnWorkspace(serviceCredentials.getUserName(), + dataMinerWorkArea.getDataMinerWorkAreaFolder().getId(), IMPORTED_DATA_FOLDER); + inputDataSets = new InputDataSets(importedDataFolder); + + } catch (Throwable e) { + logger.debug("ImportedData Folder is set to null"); + } + dataMinerWorkArea.setInputDataSets(inputDataSets); + + OutputDataSets outputDataSets = null; + try { + ItemDescription computedDataFolder = storageUtil.getItemInFolderOnWorkspace(serviceCredentials.getUserName(), + dataMinerWorkArea.getDataMinerWorkAreaFolder().getId(), COMPUTED_DATA_FOLDER); + outputDataSets = new OutputDataSets(computedDataFolder); + + } catch (Throwable e) { + logger.debug("ComputedData Folder is set to null"); + } + dataMinerWorkArea.setOutputDataSets(outputDataSets); + + Computations computations = null; + try { + ItemDescription computationsDataFolder = storageUtil.getItemInFolderOnWorkspace(serviceCredentials.getUserName(), + dataMinerWorkArea.getDataMinerWorkAreaFolder().getId(), COMPUTATIONS_FOLDER); + computations = new Computations(computationsDataFolder); + + } catch (Throwable e) { + logger.debug("Computations Folder is set to null"); + } + dataMinerWorkArea.setComputations(computations); + + logger.debug("DataMinerWorkArea: "+dataMinerWorkArea); + return dataMinerWorkArea; + + } + +} diff --git a/src/main/java/org/gcube/portlets/user/dataminerexecutor/server/util/TableReader.java b/src/main/java/org/gcube/portlets/user/dataminerexecutor/server/util/TableReader.java new file mode 100644 index 0000000..2466481 --- /dev/null +++ b/src/main/java/org/gcube/portlets/user/dataminerexecutor/server/util/TableReader.java @@ -0,0 +1,75 @@ +package org.gcube.portlets.user.dataminerexecutor.server.util; + +import java.io.InputStream; +import java.io.InputStreamReader; +import java.io.Reader; +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; + +import org.gcube.data.analysis.dataminermanagercl.server.util.ServiceCredentials; +import org.gcube.data.analysis.dataminermanagercl.shared.data.ColumnItem; +import org.gcube.data.analysis.dataminermanagercl.shared.data.TableItemSimple; +import org.gcube.data.analysis.dataminermanagercl.shared.workspace.ItemDescription; +import org.gcube.portlets.user.dataminerexecutor.server.storage.StorageUtil; +import org.gcube.portlets.user.dataminerexecutor.shared.exception.ServiceException; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import net.sf.csv4j.CSVReader; + +/** + * + * @author Giancarlo Panichi + * + * + */ +public class TableReader { + private static Logger logger = LoggerFactory.getLogger(TableReader.class); + + private ServiceCredentials serviceCredentials; + private ItemDescription item; + + public TableReader(ServiceCredentials serviceCredentials, ItemDescription item) { + this.serviceCredentials = serviceCredentials; + this.item= item; + } + + public TableItemSimple getTableItemSimple() throws ServiceException { + StorageUtil storageUtil=new StorageUtil(); + InputStream is = storageUtil.getFileOnWorkspace( + serviceCredentials.getUserName(), item.getId()); + Reader fileReader = new InputStreamReader(is); + CSVReader csvReader = new CSVReader(fileReader); + List firstLine = getFirstLine(csvReader, false); + ArrayList columns = new ArrayList(firstLine); + + String publicLink=storageUtil.getPublicLink(serviceCredentials.getUserName(), item.getId()); + + TableItemSimple tableItemSimple=new TableItemSimple(publicLink,item.getName(), item.getType()); + ArrayList columnItemList=new ArrayList(); + for(int i=0; i getFirstLine(CSVReader csvReader, boolean includeComment) + throws ServiceException { + try { + logger.trace("getFirstLine includeComment: " + includeComment); + + List header = csvReader.readLine(includeComment); + return header == null ? Collections. emptyList() : header; + + } catch (Throwable e) { + logger.error("Error reading csv file: " + e.getLocalizedMessage()); + e.printStackTrace(); + throw new ServiceException(e.getLocalizedMessage()); + } + } + +} diff --git a/src/main/java/org/gcube/portlets/user/dataminerexecutor/shared/Constants.java b/src/main/java/org/gcube/portlets/user/dataminerexecutor/shared/Constants.java new file mode 100644 index 0000000..f17c89a --- /dev/null +++ b/src/main/java/org/gcube/portlets/user/dataminerexecutor/shared/Constants.java @@ -0,0 +1,47 @@ +package org.gcube.portlets.user.dataminerexecutor.shared; + +/** + * + * @author Giancarlo Panichi + * + * + */ +public class Constants { + public static final boolean DEBUG_MODE = false; + public static final boolean TEST_ENABLE = false; + + public static final String APPLICATION_ID = "org.gcube.portlets.user.dataminerexecutor.portlet.DataMinerExecutor"; + public static final String DATA_MINER_EXECUTOR_ID = "DataMinerExecutorId"; + public static final String DATA_MINER_EXECUTOR_LANG_COOKIE = "DataMinerLangCookie"; + public static final String DATA_MINER_EXECUTOR_LANG = "DataMinerLang"; + public static final String DATA_MINER_EXECUTOR_OPERATOR_ID = "OperatorId"; + public static final String DATA_MINER_EXECUTOR_INVOCATION_MODEL = "dim"; + + public static final String DEFAULT_USER = "giancarlo.panichi"; + public final static String DEFAULT_SCOPE = "/gcube/devNext/NextNext"; + public final static String DEFAULT_TOKEN = ""; + + public static final String DEFAULT_ROLE = "OrganizationMember"; + + public static final String SClientMap = "DataMinerClientMap"; + public static final String DATA_MINER_SERVICE_NAME = "DataMiner"; + public static final String DATAMINER_SERVICE_CATEGORY = "DataAnalysis"; + + public static final String TD_DATASOURCE_FACTORY_ID = "DataMinerManager"; + + public static final int TIME_UPDATE_COMPUTATION_STATUS_PANEL = 5 * 1000;// 7*1000; + + // WPS Data Miner + public static final String WPSServiceURL = "http://dataminer-d-d4s.d4science.org:80/wps/"; + public static final String WPSWebProcessingService = "WebProcessingService"; + public static final String WPSCancelComputationServlet = "CancelComputationServlet"; + public static final String WPSToken = ""; + public static final String WPSUser = "giancarlo.panichi"; + public static final String WPSLanguage = "en-US"; + + // Session + public static final String CURR_GROUP_ID = "CURR_GROUP_ID"; + + // Download + public static final String DOWNLOAD_SERVLET = "DownloadServlet"; +} diff --git a/src/main/java/org/gcube/portlets/user/dataminerexecutor/shared/StringUtil.java b/src/main/java/org/gcube/portlets/user/dataminerexecutor/shared/StringUtil.java new file mode 100644 index 0000000..69ef8a3 --- /dev/null +++ b/src/main/java/org/gcube/portlets/user/dataminerexecutor/shared/StringUtil.java @@ -0,0 +1,36 @@ +/** + * + */ +package org.gcube.portlets.user.dataminerexecutor.shared; + +/** + * + * @author Giancarlo Panichi + * + * + */ +public class StringUtil { + + public static String getCapitalWords(String string) { + String ris = ""; + + boolean precUnderscore = true; + for (int i=0; i + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/main/webapp/DataMinerExecutor.css b/src/main/webapp/DataMinerExecutor.css new file mode 100644 index 0000000..50644de --- /dev/null +++ b/src/main/webapp/DataMinerExecutor.css @@ -0,0 +1,485 @@ +/* FIX FOR Portal Theme */ +/* OpenLayer Form fix */ +#wkt-geometry-text-area { + width: 400px !important; +} + +#combo-geometry-type { + width: 406px !important; +} + +.aui body { + color: #000; + font-weight: normal !important; +} + +.aui input[type="text"], .aui select, .aui textarea, .aui .uneditable-input + { + margin-bottom: 1px !important; + padding: 0px !important; +} + +.aui input[type="radio"], .aui input[type="checkbox"] { + margin: 0px !important; + width: 10px !important; +} + +.aui input, .aui textarea, .aui .uneditable-input { + width: 100% !important; +} + +.aui p { + margin: 0px !important; +} + +.aui img { + vertical-align: baseline !important; +} + +.aui fieldset { + padding: 9px !important; + /* margin: 0; */ + border: 1px solid rgb(181, 184, 200) !important; +} + +.aui legend { + margin-bottom: 0px !important; + width: auto !important; + border-bottom: none !important; +} + +.aui ul, .aui ol { + margin: 0px !important; +} + +/* Data Miner */ +.smLayoutContainer { + /* Blue + box-shadow: inset 0 0 50px rgba(0, 0, 0, 0.11), 0 0 0 + rgba(255, 255, 255, 1), 0 0 5px rgba(0, 28, 121, 1), 0px 0 40px + rgba(0, 28, 121, 0.15); + -moz-box-shadow: inset 0 0 50px rgba(0, 0, 0, 0.11), 0 0 0 + rgba(255, 255, 255, 1), 0 0 5px rgba(0, 28, 121, 1), 0px 0 40px + rgba(0, 28, 121, 0.15); + -webkit-box-shadow: inset 0 0 50px rgba(0, 0, 0, 0.11), 0 0 0 + rgba(255, 255, 255, 1), 0 0 5px rgba(0, 28, 121, 1), 0px 0 40px + rgba(0, 28, 121, 0.15); + -o-box-shadow: inset 0 0 50px rgba(0, 0, 0, 0.11), 0 0 0 + rgba(255, 255, 255, 1), 0 0 5px rgba(0, 28, 121, 1), 71px 0 27px + rgba(0, 28, 121, 0.15);*/ + box-shadow: inset 0 0 50px rgba(0, 0, 0, 0.11), 0 0 0 + rgba(255, 255, 255, 1), 0 0 5px rgba(196, 196, 196, 1), 0px 0 27px + rgba(0, 0, 0, 0.15); + -moz-box-shadow: inset 0 0 50px rgba(0, 0, 0, 0.11), 0 0 0 + rgba(255, 255, 255, 1), 0 0 5px rgba(196, 196, 196, 1), 0px 0 27px + rgba(0, 0, 0, 0.15); + -webkit-box-shadow: inset 0 0 50px rgba(0, 0, 0, 0.11), 0 0 0 + rgba(255, 255, 255, 1), 0 0 5px rgba(196, 196, 196, 1), 0px 0 27px + rgba(0, 0, 0, 0.15); + -o-box-shadow: inset 0 0 50px rgba(0, 0, 0, 0.11), 0 0 0 + rgba(255, 255, 255, 1), 0 0 5px rgba(196, 196, 196, 1), 71px 0 27px + rgba(0, 0, 0, 0.15); + border-radius: 0; + -moz-border-radius: 0; + -webkit-border-radius: 0; + -o-border-radius: 0; +} + +.smMenu { + /*width: 720px !important;*/ /*height: 570px !important;*/ + /*overflow: auto; + margin: auto; + margin-bottom: 20px;*/ + +} + +.layoutContainerArea { + margin-right: 20px; +} + +.smMenuItem { + box-shadow: inset 0 0 99px rgba(0, 0, 0, 0.11), 0 0 0 + rgba(255, 255, 255, 1), 0 0 5px rgba(196, 196, 196, 1), 0px 0 27px + rgba(0, 0, 0, 0.15); + -moz-box-shadow: inset 0 0 99px rgba(0, 0, 0, 0.11), 0 0 0 + rgba(255, 255, 255, 1), 0 0 5px rgba(196, 196, 196, 1), 0px 0 27px + rgba(0, 0, 0, 0.15); + -webkit-box-shadow: inset 0 0 99px rgba(0, 0, 0, 0.11), 0 0 0 + rgba(255, 255, 255, 1), 0 0 5px rgba(196, 196, 196, 1), 0px 0 27px + rgba(0, 0, 0, 0.15); + -o-box-shadow: inset 0 0 99px rgba(0, 0, 0, 0.11), 0 0 0 + rgba(255, 255, 255, 1), 0 0 5px rgba(196, 196, 196, 1), 71px 0 27px + rgba(0, 0, 0, 0.15); + border-radius: 0; + -moz-border-radius: 0; + -webkit-border-radius: 0; + -o-border-radius: 0; + /*padding: 10px;*/ +/*margin-bottom: 30px; + margin-left: 200px; + width: 480px;*/ +} + +.smMenuItem:HOVER { + cursor: pointer; + opacity: 0.7; +} + +.smMenuItem img { + border: 1px solid #C0C0C0; + display: inline; +} + +.smMenuItemText b { + display: block; + color: #225f97; + font-size: 20px; +} + +.smMenuItemText { + font: 12px/1.5 "Lucida Grande", "Lucida Sans Unicode", Arial, Verdana, + sans-serif; + display: block; + color: #606060; + /*margin-right: 10px;*/ +} + +/* OPERATORS PANEL */ +.opePanel { + +} + +.opePanel:hover { + cursor: pointer; +} + +.categoryItem { + margin-top: 10px; + margin-left: 5px; + font-size: 15px; + font-variant: small-caps; + font-weight: bolder; + border-bottom: 2px solid #505050; + margin-bottom: 5px; + background-image: url(images/triangle-right.png); + background-repeat: no-repeat; + background-position: right; +} + +.categoryItem-Collapsed { + background-image: url(images/triangle-right.png); +} + +.categoryItem-Expanded { + background-image: url(images/triangle-down.png); +} + +.categoryItem:hover { + color: #3087d6; + cursor: pointer; +} + +.filterResultText { + margin-top: 10px; + margin-left: 5px; + font-size: 15px; + font-variant: small-caps; + font-weight: bolder; + border-bottom: 2px solid #505050; + margin-bottom: 5px; +} + +.categoryItem .counter, .filterResultText .counter { + font-size: 10px; + color: #555555; +} + +.operatorPanel { + box-shadow: inset 0 0 28px rgba(0, 0, 0, 0.11), 0 0 0 + rgba(255, 255, 255, 1), 0 0 1px rgba(196, 196, 196, 1), inset 0 0 1px + rgba(77, 77, 77, 1); + -moz-box-shadow: inset 0 0 28px rgba(0, 0, 0, 0.11), 0 0 0 + rgba(255, 255, 255, 1), 0 0 1px rgba(196, 196, 196, 1), inset 0 0 1px + rgba(77, 77, 77, 1); + -webkit-box-shadow: inset 0 0 28px rgba(0, 0, 0, 0.11), 0 0 0 + rgba(255, 255, 255, 1), 0 0 1px rgba(196, 196, 196, 1), inset 0 0 1px + rgba(77, 77, 77, 1); + -o-box-shadow: inset 0 0 28px rgba(0, 0, 0, 0.11), 0 0 0 + rgba(255, 255, 255, 1), 0 0 1px rgba(196, 196, 196, 1), inset 0 0 1px + rgba(77, 77, 77, 1); + border-radius: 5px; + -moz-border-radius: 5px; + -webkit-border-radius: 5px; + -o-border-radius: 5px; + margin: 0px 5px 5px 10px; /* top right bottom left*/ + padding: 5px; + overflow: hidden; + height: 78px; +} + +.operatorPanel-selected { + background-color: #e0e7f7; +} + +.operatorPanel-title { + font-size: 13px; + font-weight: bolder; + color: #225f97; +} + +.operatorPanel-title-selected { + color: #770000; +} + +.operatorPanel-briefDescription { + font-size: 10px; + color: #505050; +} + +.operatorPanel img { + float: right; +} + +.operatorPanel img:hover { + cursor: pointer; + opacity: 0.6; +} + +.tableImporter, .uploadMonitor { + box-shadow: inset 0 0 28px rgba(0, 0, 0, 0.11), 0 0 0 + rgba(255, 255, 255, 1), 0 0 1px rgba(196, 196, 196, 1), inset 0 0 1px + rgba(77, 77, 77, 1); + -moz-box-shadow: inset 0 0 28px rgba(0, 0, 0, 0.11), 0 0 0 + rgba(255, 255, 255, 1), 0 0 1px rgba(196, 196, 196, 1), inset 0 0 1px + rgba(77, 77, 77, 1); + -webkit-box-shadow: inset 0 0 28px rgba(0, 0, 0, 0.11), 0 0 0 + rgba(255, 255, 255, 1), 0 0 1px rgba(196, 196, 196, 1), inset 0 0 1px + rgba(77, 77, 77, 1); + -o-box-shadow: inset 0 0 28px rgba(0, 0, 0, 0.11), 0 0 0 + rgba(255, 255, 255, 1), 0 0 1px rgba(196, 196, 196, 1), inset 0 0 1px + rgba(77, 77, 77, 1); + border-radius: 5px; + -moz-border-radius: 5px; + -webkit-border-radius: 5px; + -o-border-radius: 5px; + padding: 5px; + border: 1px solid black; + margin-left: 5px; + margin-right: 5px; +} + +/* WORKFLOW PANEL */ +.workflow { + box-shadow: inset 0 0 28px rgba(0, 0, 0, 0.11), 0 0 0 + rgba(255, 255, 255, 1), 0 0 1px rgba(196, 196, 196, 1), inset 0 0 1px + rgba(77, 77, 77, 1); + -moz-box-shadow: inset 0 0 28px rgba(0, 0, 0, 0.11), 0 0 0 + rgba(255, 255, 255, 1), 0 0 1px rgba(196, 196, 196, 1), inset 0 0 1px + rgba(77, 77, 77, 1); + -webkit-box-shadow: inset 0 0 28px rgba(0, 0, 0, 0.11), 0 0 0 + rgba(255, 255, 255, 1), 0 0 1px rgba(196, 196, 196, 1), inset 0 0 1px + rgba(77, 77, 77, 1); + -o-box-shadow: inset 0 0 28px rgba(0, 0, 0, 0.11), 0 0 0 + rgba(255, 255, 255, 1), 0 0 1px rgba(196, 196, 196, 1), inset 0 0 1px + rgba(77, 77, 77, 1); + border-radius: 5px; + -moz-border-radius: 5px; + -webkit-border-radius: 5px; + -o-border-radius: 5px; + /*padding: 5px;*/ + border: 1px solid black; + /*margin-left: 5px; + margin-right: 5px;*/ +} + +.workflow-icon { + border: 1px solid black; + float: left; + position: relative; + left: 10px; + top: -20px; +} + +.workflow-title { + text-align: center; + font-size: 16px; + font-weight: bold; + color: #225f97; +} + +.workflow-description { + font-size: 13px; + color: #505050; +} + +.workflow-computation-title { + padding-left: 5px; + padding-right: 5px; + padding-top: 8px; +} + +.workflow-fieldDescription { + font-size: 12px; + color: #505050; +} + +.workflow-fieldValue { + border: 1px solid lightgray; + max-width: 490px; + padding: 2px; +} + +.workflow-templatesList { + font-size: 9px; + color: #505050; + margin-top: 4px; +} + +.workflow-parameters-description { + font-size: 10px; + color: #505050; + margin-top: 4px; +} + +.workflow-parameters-tableDescription { + font-size: 12px; + /* border: 1px solid gray;*/ + color: white; + margin-right: 5px; + padding-right: 4px; + padding-left: 4px; + background-color: gray; +} + +.workflow-parameters-preload { + display: block; + background: url('ajax-loader-big.gif') no-repeat; + width: 400px; + height: 180px; +} + +/* TOOLTIP */ +.x-tip-mc { + padding: 6px; +} + +.categoryItemTooltip { + height: 80px; +} + +.categoryItemTooltip img { + border: 1px solid black; + float: left; + margin-right: 5px; +} + +/* TABLE EXPLORER */ +.tableSelector-details { + margin-top: 20px; + margin-left: 5px; + margin-right: 5px; +} + +.tableSelector-details img { + display: block; + margin-left: auto; + margin-right: auto; + margin-bottom: 10px; +} + +#computationGrid .x-grid3-cell { + vertical-align: middle; +} + +.menuImgLogo:HOVER { + /* cursor: pointer;*/ + +} + +.menuItemImage { + opacity: 0.5; +} + +.menuItemImage:HOVER { + cursor: pointer; + opacity: 1; +} + +.menuItemImage-selected { + opacity: 1; +} + +.menuItemImage-selected:HOVER { + cursor: auto; +} + +/* +* Computation Execution +*/ +.computationExcecutionPanel { + font-size: 12px; + color: black; +} + +.computationStatusPanel { + border: 1px solid black; + padding: 10px; +} + +.computationStatusTitle { + +} + +.computationStatusDate { + +} + +/** +* Field +*/ +.dataminer-textarea textarea { + height: 160px !important; + width: 360px !important; +} + +/** +* Computation Output +*/ +.computation-output-outputType { + background-color: #EEEEEE; + border: 1px solid #BDBDBD; + /*font-weight: bold;*/ + padding: 5px; + text-align: center; + margin-top: 20px; + margin-bottom: 10px; +} + +.computation-output-groupTitle { + font-style: italic; + font-weight: bold; + margin-top: 5px; + margin-bottom: 5px; +} + +.computation-output-separator { + border-top: 2px solid #AAAAAA; + margin-top: 8px; + margin-bootm: 8px; + + /* height: 30px; + margin: 8px auto auto; + width: 400px; + */ +} + +.computation-output-fileName { + margin-top: 2px; + margin-bottom: 2px; +} + +#netcdfSampleTextArea { + height: 318px; + width: 616px !important; + resize: none; +} \ No newline at end of file diff --git a/src/main/webapp/DataMinerExecutor.html b/src/main/webapp/DataMinerExecutor.html new file mode 100644 index 0000000..a40cde2 --- /dev/null +++ b/src/main/webapp/DataMinerExecutor.html @@ -0,0 +1,38 @@ + + + + + + + + + + + +Data Miner Manager + + + + + + + + + + + + + + + + diff --git a/src/main/webapp/WEB-INF/jsp/DataMinerExecutor_view.jsp b/src/main/webapp/WEB-INF/jsp/DataMinerExecutor_view.jsp new file mode 100644 index 0000000..a915b3f --- /dev/null +++ b/src/main/webapp/WEB-INF/jsp/DataMinerExecutor_view.jsp @@ -0,0 +1,29 @@ +<%@page contentType="text/html"%> +<%@page pageEncoding="UTF-8"%> + + + + + + + + + + + + + + + +
diff --git a/src/main/webapp/WEB-INF/liferay-display.xml b/src/main/webapp/WEB-INF/liferay-display.xml new file mode 100644 index 0000000..50f9730 --- /dev/null +++ b/src/main/webapp/WEB-INF/liferay-display.xml @@ -0,0 +1,9 @@ + + + + + + + + \ No newline at end of file diff --git a/src/main/webapp/WEB-INF/liferay-plugin-package.properties b/src/main/webapp/WEB-INF/liferay-plugin-package.properties new file mode 100644 index 0000000..ab5f089 --- /dev/null +++ b/src/main/webapp/WEB-INF/liferay-plugin-package.properties @@ -0,0 +1,9 @@ +name=DataMinerExecutor +module-group-id=liferay +module-incremental-version=1 +tags= +short-description= +change-log= +page-url=http://www.d4science.eu +author=D4Science EU +licenses= \ No newline at end of file diff --git a/src/main/webapp/WEB-INF/liferay-portlet.xml b/src/main/webapp/WEB-INF/liferay-portlet.xml new file mode 100644 index 0000000..335c4ef --- /dev/null +++ b/src/main/webapp/WEB-INF/liferay-portlet.xml @@ -0,0 +1,13 @@ + + + + + + DataMinerExecutor + false + false + false + DataMinerExecutorCSS + + \ No newline at end of file diff --git a/src/main/webapp/WEB-INF/portlet.xml b/src/main/webapp/WEB-INF/portlet.xml new file mode 100644 index 0000000..7f73261 --- /dev/null +++ b/src/main/webapp/WEB-INF/portlet.xml @@ -0,0 +1,27 @@ + + + + DataMinerExecutor + DataMinerExecutor + DataMinerExecutor + org.gcube.portlets.user.dataminerexecutor.portlet.DataMinerExecutor + 0 + + text/html + VIEW + + + DataMinerExecutor + DataMinerExecutor + + + + portletSetupShowBorders + false + + + + diff --git a/src/main/webapp/WEB-INF/web.xml b/src/main/webapp/WEB-INF/web.xml new file mode 100644 index 0000000..c0b3a90 --- /dev/null +++ b/src/main/webapp/WEB-INF/web.xml @@ -0,0 +1,78 @@ + + + + + DataMinerExecutorServlet + org.gcube.portlets.user.dataminerexecutor.server.DataMinerExecutorServiceImpl + + + jUnitHostImpl + com.google.gwt.junit.server.JUnitHostImpl + + + + + DownloadServlet + org.gcube.portlets.user.dataminerexecutor.server.DownloadServlet + + + + workspaceExplorer + org.gcube.portlets.widgets.wsexplorer.server.WorkspaceExplorerServiceImpl + + + workspaceUploaderService + org.gcube.portlets.widgets.workspaceuploader.server.WorkspaceUploaderServiceImpl + + + workspaceUploadServletStream + org.gcube.portlets.widgets.workspaceuploader.server.WorkspaceUploadServletStream + + + NetCDFBasicWidgetService + org.gcube.portlets.widgets.netcdfbasicwidgets.server.NetCDFBasicWidgetServiceImpl + + + + + DataMinerExecutorServlet + /dataminerexecutor/dataminerex + + + jUnitHostImpl + /dataminerexecutor/junithost/* + + + + + DownloadServlet + /dataminerexecutor/DownloadServlet/* + + + + + workspaceExplorer + /dataminerexecutor/WorkspaceExplorerService + + + workspaceUploaderService + /dataminerexecutor/workspaceUploaderService + + + workspaceUploadServletStream + /dataminerexecutor/workspaceUploadServletStream + + + NetCDFBasicWidgetService + /dataminerexecutor/netcdfservice + + + + + + DataMinerExecutor.html + + \ No newline at end of file diff --git a/src/main/webapp/gxt/css/gxt-all.css b/src/main/webapp/gxt/css/gxt-all.css new file mode 100644 index 0000000..47dc215 --- /dev/null +++ b/src/main/webapp/gxt/css/gxt-all.css @@ -0,0 +1,7451 @@ +html,body,div,dl,dt,dd,ul,ol,li,h1,h2,h3,h4,h5,h6,pre,form,fieldset,input,p,blockquote,th,td{margin:0;padding:0;}img,body,html{border:0;}address,caption,cite,code,dfn,em,strong,th,var{font-style:normal;font-weight:normal;}ol,ul {list-style:none;}caption,th {text-align:left;}h1,h2,h3,h4,h5,h6{font-size:100%;}q:before,q:after{content:'';} +.x-contrast-test { + background: url(../images/default/s.gif); + visibility: hidden; + position: relative; + left: -1000px; + top: -1000px; +} +.ext-el-mask { + z-index: 100; + position: absolute; + top: 0; + left: 0; + -moz-opacity: 0.5; + opacity: .50; + filter: alpha(opacity = 50); + width: 100%; + height: 100%; + zoom: 1; +} + +.ext-el-mask-msg { + z-index: 101; + position: absolute; + top: 0; + left: 0; + border: 1px solid; + background: repeat-x 0 -16px; + padding: 2px; +} + +.ext-el-mask-msg div { + padding: 5px 10px 5px 10px; + border: 1px solid; + cursor: wait; +} + +.ext-webkit *:focus { + outline: none !important; +} + +.ext-webkit .x-form-check-wrap input:focus { + outline: auto !important; +} + +.ext-shim { + position: absolute; + visibility: hidden; + left: 0; + top: 0; + overflow: hidden; +} + +.ext-ie .ext-shim { + filter: alpha(opacity = 0); +} + +.ext-ie6 .ext-shim { + margin-left: 5px; + margin-top: 3px; +} + +.x-mask-loading div { + padding: 5px 10px 5px 25px; + background: no-repeat 5px 5px; + line-height: 16px; +} + +.x-hidden,.x-hide-offsets { + position: absolute !important; + left: -10000px !important; + top: -10000px !important; + visibility: hidden !important; +} + +.x-hide-display { + display: none !important; +} + +.x-hide-visibility { + visibility: hidden !important; +} + +.x-masked { + overflow: hidden !important; +} + +.x-masked-relative { + position: relative !important; +} + +.x-masked select,.x-masked object,.x-masked embed { + visibility: hidden; +} + +.x-layer { + visibility: hidden; +} + +.x-unselectable,.x-unselectable * { + -moz-user-select: none; + -khtml-user-select: none; + -webkit-user-select: ignore; +} + +.x-unselectable-single { + -moz-user-select: none; + -khtml-user-select: none; + -webkit-user-select: ignore; +} + +.x-selectable,.x-selectable * { + -moz-user-select: text !important; + -webkit-user-select: auto; +} + +.x-repaint { + zoom: 1; + background-color: transparent; + -moz-outline: none; + outline: 0 none; +} + +.x-item-disabled { + cursor: default; + opacity: .6; + -moz-opacity: .6; + filter: alpha(opacity = 60); +} + +.ext-ie .x-item-disabled { + filter: none !important; +} + +.x-item-disabled * { + cursor: default !important; +} + +.x-splitbar-proxy { + position: absolute; + visibility: hidden; + z-index: 20001; + zoom: 1; + line-height: 1px; + font-size: 1px; + overflow: hidden; +} + +.x-splitbar-h,.x-splitbar-proxy-h { + cursor: e-resize; + cursor: col-resize; +} + +.x-splitbar-v,.x-splitbar-proxy-v { + cursor: s-resize; + cursor: row-resize; +} + +.x-color-palette { + width: 150px; + height: 92px; + cursor: pointer; + -moz-outline: 0 none; + outline: 0 none; +} + +.x-color-palette a { + border: 1px solid; + float: left; + padding: 2px; + text-decoration: none; + -moz-outline: 0 none; + outline: 0 none; + cursor: pointer; +} + +.x-color-palette a.x-color-palette-hover,.x-color-palette a.x-color-palette-sel { + border: 1px solid; +} + +.x-color-palette em { + display: block; + border: 1px solid; +} + +.x-color-palette em span { + cursor: pointer; + display: block; + height: 10px; + line-height: 10px; + width: 10px; +} + +.x-ie-shadow { + display: none; + position: absolute; + overflow: hidden; + left: 0; + top: 0; + zoom: 1; +} + +.x-shadow { + display: none; + position: absolute; + overflow: hidden; + left: 0; + top: 0; +} + +.x-shadow * { + overflow: hidden; +} + +.x-shadow * { + padding: 0; + border: 0; + margin: 0; + clear: none; + zoom: 1; +} + +.x-shadow .xstc,.x-shadow .xsbc { + height: 6px; + float: left; +} + +.x-shadow .xstl,.x-shadow .xstr,.x-shadow .xsbl,.x-shadow .xsbr { + width: 6px; + height: 6px; + float: left; +} + +.x-shadow .xsc { + width: 100%; +} + +.x-shadow .xsml,.x-shadow .xsmr { + width: 6px; + float: left; + height: 100%; +} + +.x-shadow .xsmc { + float: left; + height: 100%; + background: transparent; +} + +.x-shadow .xst,.x-shadow .xsb { + height: 6px; + overflow: hidden; + width: 100%; +} + +.x-shadow .xsml { + background: transparent repeat-y 0 0; +} + +.x-shadow .xsmr { + background: transparent repeat-y -6px 0; +} + +.x-shadow .xstl { + background: transparent no-repeat 0 0; +} + +.x-shadow .xstc { + background: transparent repeat-x 0 -30px; +} + +.x-shadow .xstr { + background: transparent repeat-x 0 -18px; +} + +.x-shadow .xsbl { + background: transparent no-repeat 0 -12px; +} + +.x-shadow .xsbc { + background: transparent repeat-x 0 -36px; +} + +.x-shadow .xsbr { + background: transparent repeat-x 0 -6px; +} + +.loading-indicator { + background: no-repeat left; + padding-left: 20px; + line-height: 16px; + margin: 3px; +} + +.x-text-resize { + position: absolute; + left: -1000px; + top: -1000px; + visibility: hidden; + zoom: 1; +} + +.x-drag-overlay { + width: 100%; + height: 100%; + display: none; + position: absolute; + left: 0; + top: 0; + background-image: url(../images/default/s.gif); + z-index: 20000; +} + +.x-clear { + clear: both; + overflow: hidden; + line-height: 0; + font-size: 0; +} + +.x-spotlight { + z-index: 8999; + position: absolute; + top: 0; + left: 0; + -moz-opacity: 0.5; + opacity: .50; + filter: alpha(opacity = 50); + width: 0; + height: 0; + zoom: 1; +} + +#x-history-frame { + position: absolute; + top: -1px; + left: 0; + width: 1px; + height: 1px; + visibility: hidden; +} + +#x-history-field { + position: absolute; + top: 0; + left: -1px; + width: 1px; + height: 1px; + visibility: hidden; +} + +.x-portlet { + margin-bottom: 10px; +} + +.x-portlet .x-panel-body { + background-color: white !important; +} + +.ext-ie .x-btn-icon .x-btn-center .x-btn-text { + height: auto; +} + +.x-portal-insert div { + height: 4px; + font-size: 0px; + border: 2px dotted blue; +} + +.icon-wait { + background: url(../images/gxt/icons/wait.gif) no-repeat !important; +} + +.x-panel-icon { + padding-left: 20px !important; +} + +.x-icon-btn { + width: 16px; + height: 16px; + overflow: hidden; + background-repeat: no-repeat; + cursor: pointer; +} + +.x-panel-inline-icon { + margin-top: 0; +} + +.x-modal { + position: absolute; + z-index: 10; + background-color: #CEDFF5; + filter: alpha(opacity = 10); + opacity: .4; + left: 0px; + top: 0px; +} + +.x-progress { + font-family: tahoma, arial, helvetica, sans-serif; +} + +.x-float-right { + float: right; +} + +.x-toolbar .x-float-right { + margin-right: 4px; +} + +.x-border { + border: 1px solid #99BBE8; +} + +.x-border-top { + border-top: 1px solid #99BBE8; +} + +.x-layout-popup { + background-color: #DFE8F6; + border: 1px solid #7CA4D9; +} + +.x-panel-popup-body { + border-top: 1px solid #99BBE8; +} + +.x-layout-collapsed .x-panel-header { + border-left: none; + border-right: none; + border-top: none; +} + +.x-layout-collapsed .x-panel-header .x-tool { + margin: 0 0 0 -4px; + padding: 0px; +} + +.x-layout-collapsed { + position: absolute; + visibility: hidden; + background-color: #d2e0f2; + width: 20px; + height: 20px; + overflow: hidden; + border: 1px solid #98c0f4; + z-index: 20; +} + +.ext-border-box .x-layout-collapsed { + width: 22px; + height: 22px; +} + +.x-layout-collapsed-over { + cursor: pointer; + background-color: #d9e8fb; +} + +.x-layout-collapsed-west .x-layout-collapsed-tools,.x-layout-collapsed-east .x-layout-collapsed-tools { + position: absolute; + top: 0; + left: 0; + width: 20px; + height: 20px; +} + +.x-panel-toolbar { + float: right; +} + +.x-cursor-row-resize { + cursor: n-resize; + cursor: row-resize; +} + +.x-date-picker,.x-date-picker a { + font-size: 11px; +} + +.x-date-days { + table-layout: fixed; + width: 100%; +} + +.x-date-days td { + width: 25px; + border: none; +} + +.x-date-days td span { + display: block; + padding: 2px 7px 2px 2px; +} + +.x-date-days td { + background: #DFECFB url(../images/default/shared/glass-bg.gif) repeat-x scroll left top; + border-bottom: 1px solid #A3BAD9; + border-collapse: separate; + color: #233D6D; + cursor: default; + font-family: arial, helvetica, tahoma, sans-serif; + font-size: 10px; + font-size-adjust: none; + font-stretch: normal; + font-style: normal; + font-variant: normal; + font-weight: normal; + line-height: normal; + padding: 0pt; + text-align: right !important; +} + +.x-date-picker .x-date-header { + background: url(../images/default/shared/hd-sprite.gif) repeat-x 0 -83px; + height: 22px; + left: 10px; + top: 10px; + width: 157px; +} + +.x-date-header .x-btn .x-btn-text { + color: #fff; +} + +.x-date-picker-footer { + width: 100%; +} + +.x-date-picker-footer td { + text-align: center; +} + +.x-date-left { + background: transparent url(../images/default/shared/hd-sprite.gif) repeat-x scroll 0pt -83px; + color: #FFFFFF; + font-family: "sans serif", tahoma, verdana, helvetica; + font-size: 11px; + font-size-adjust: none; + font-stretch: normal; + font-style: normal; + font-variant: normal; + font-weight: bold; + line-height: normal; + overflow: hidden; +} + +.x-modal { + position: absolute; + z-index: 10; + background-color: black; + filter: alpha(opacity = 10); + opacity: .1; + left: 0px; + top: 0px; +} + +.x-progress { + font-family: tahoma, arial, helvetica, sans-serif; +} + +.x-float-right { + float: right; +} + +.x-layout-popup { + background-color: #DFE8F6; + border: 1px solid #7CA4D9; +} + +.x-layout-collapsed .x-panel-header .x-tool { + margin: 0 0 0 -4px; + padding: 0px; +} + +.ext-border-box .x-layout-collapsed { + width: 22px; + height: 22px; +} + +.x-layout-collapsed-over { + cursor: pointer; + background-color: #d9e8fb; +} + +.x-layout-collapsed-west .x-layout-collapsed-tools,.x-layout-collapsed-east .x-layout-collapsed-tools { + position: absolute; + top: 0; + left: 0; + width: 20px; + height: 20px; +} + +.x-panel-toolbar { + float: right; +} + +.x-cursor-col-resize { + cursor: e-resize; + cursor: col-resize; +} + +.x-cursor-row-resize { + cursor: n-resize; + cursor: row-resize; +} + +.x-drag-proxy { + border: 1px dashed #3b5a82; + background-color: #EDEDED; + filter: alpha(opacity = 50); + opacity: .5; + background-color: #c3daf9; + z-index: 20000; + overflow: hidden; + position: absolute; + left: 0;; + top: 0; + cursor: move; +}.x-tab-panel { + overflow: hidden; + -moz-outline: none; + outline: 0 none; +} + +.x-tab-panel-header,.x-tab-panel-footer { + border: 1px solid; + overflow: hidden; + zoom: 1; +} + +.x-tab-panel-header { + border: 1px solid; + padding-bottom: 2px; +} + +.x-tab-panel-footer { + border: 1px solid; + padding-top: 2px; +} + +.x-tab-strip-wrap { + width: 100%; + overflow: hidden; + position: relative; + zoom: 1; +} + +ul.x-tab-strip { + display: block; + width: 7000px; + zoom: 1; +} + +ul.x-tab-strip-top { + padding-top: 1px; + background: repeat-x bottom; + border-bottom: 1px solid; +} + +ul.x-tab-strip-bottom { + padding-bottom: 1px; + background: repeat-x top; + border-top: 1px solid; + border-bottom: 0 none; +} + +.x-tab-panel-header-plain .x-tab-strip-top { + background: transparent !important; + padding-top: 0 !important; +} + +.x-tab-panel-header-plain { + background: transparent !important; + border-width: 0 !important; + padding-bottom: 0 !important; +} + +.x-tab-panel-header-plain .x-tab-strip-spacer,.x-tab-panel-footer-plain .x-tab-strip-spacer + { + border: 1px solid; + height: 2px; + font-size: 1px; + line-height: 1px; +} + +.x-tab-panel-header-plain .x-tab-strip-spacer { + border-top: 0 none; +} + +.x-tab-panel-footer-plain .x-tab-strip-spacer { + border-bottom: 0 none; +} + +.x-tab-panel-footer-plain .x-tab-strip-bottom { + background: transparent !important; + padding-bottom: 0 !important; +} + +.x-tab-panel-footer-plain { + background: transparent !important; + border-width: 0 !important; + padding-top: 0 !important; +} + +.ext-border-box .x-tab-panel-header-plain .x-tab-strip-spacer,.ext-border-box .x-tab-panel-footer-plain .x-tab-strip-spacer + { + height: 3px; +} + +ul.x-tab-strip li { + float: left; + position: relative; + margin-left: 2px; +} + +ul.x-tab-strip li.x-tab-edge { + float: left; + margin: 0 !important; + padding: 0 !important; + border: 0 none !important; + font-size: 1px !important; + line-height: 1px !important; + overflow: hidden; + zoom: 1; + background: transparent !important; + width: 1px; +} + +.x-tab-strip a,.x-tab-strip span,.x-tab-strip em { + display: block; +} + +.x-tab-strip a { + text-decoration: none !important; + -moz-outline: none; + outline: none; + cursor: pointer; +} + +.x-tab-strip-inner { + overflow: hidden; + text-overflow: ellipsis; +} + +.x-tab-strip span.x-tab-strip-text { + white-space: nowrap; + cursor: pointer; + padding: 4px 0; +} + +.x-tab-strip-top .x-tab-with-icon .x-tab-right { + padding-left: 6px; +} + +.x-tab-strip .x-tab-with-icon span.x-tab-strip-text { + padding-left: 20px; + background-position: 0 3px; + background-repeat: no-repeat; +} + +.x-tab-strip-active,.x-tab-strip-active a.x-tab-right { + cursor: default; +} + +.x-tab-strip-active span.x-tab-strip-text { + cursor: default; +} + +.x-tab-strip-disabled .x-tabs-text { + cursor: default; +} + +.x-tab-panel-body { + overflow: hidden; +} + +.x-tab-panel-bwrap { + overflow: hidden; +} + +.ext-ie .x-tab-strip .x-tab-right { + position: relative; +} + +.x-tab-strip-top .x-tab-strip-active .x-tab-right { + margin-bottom: -1px; +} + +.x-tab-strip-top .x-tab-strip-active .x-tab-right span.x-tab-strip-text + { + padding-bottom: 5px; +} + +.x-tab-strip-bottom .x-tab-strip-active .x-tab-right { + margin-top: -1px; +} + +.x-tab-strip-bottom .x-tab-strip-active .x-tab-right span.x-tab-strip-text + { + padding-top: 5px; +} + +.x-tab-strip-top .x-tab-right { + background: transparent no-repeat 0 -51px; + padding-left: 10px; +} + +.x-tab-strip-top .x-tab-left { + background: transparent no-repeat right -351px; + padding-right: 10px; +} + +.x-tab-strip-top .x-tab-strip-inner { + background: transparent repeat-x 0 -201px; +} + +.x-tab-strip-top .x-tab-strip-over .x-tab-right { + background-position: 0 -101px; +} + +.x-tab-strip-top .x-tab-strip-over .x-tab-left { + background-position: right -401px; +} + +.x-tab-strip-top .x-tab-strip-over .x-tab-strip-inner { + background-position: 0 -251px; +} + +.x-tab-strip-top .x-tab-strip-active .x-tab-right { + background-position: 0 0; +} + +.x-tab-strip-top .x-tab-strip-active .x-tab-left { + background-position: right -301px; +} + +.x-tab-strip-top .x-tab-strip-active .x-tab-strip-inner { + background-position: 0 -151px; +} + +.x-tab-strip-bottom .x-tab-right { + background: no-repeat bottom right; +} + +.x-tab-strip-bottom .x-tab-left { + background: no-repeat bottom left; +} + +.x-tab-strip-bottom .x-tab-strip-active .x-tab-right { + background: no-repeat bottom left; +} + +.x-tab-strip-bottom .x-tab-strip-active .x-tab-left { + background: no-repeat bottom right; +} + +.x-tab-strip-bottom .x-tab-left { + padding: 0 10px; +} + +.x-tab-strip-bottom .x-tab-right { + padding: 0; +} + +.x-tab-strip .x-tab-strip-close { + display: none; +} + +.x-tab-strip-closable { + position: relative; +} + +.x-tab-strip-closable .x-tab-left { + padding-right: 19px; +} + +.x-tab-strip .x-tab-strip-closable a.x-tab-strip-close { + opacity: .6; + -moz-opacity: .6; + background-repeat: no-repeat; + display: block; + width: 11px; + height: 11px; + position: absolute; + top: 3px; + right: 3px; + cursor: pointer; + z-index: 2; +} + +.x-tab-strip .x-tab-strip-active a.x-tab-strip-close { + opacity: .8; + -moz-opacity: .8; +} + +.x-tab-strip .x-tab-strip-closable a.x-tab-strip-close:hover { + opacity: 1; + -moz-opacity: 1; +} + +.x-tab-panel-body { + border: 1px solid; +} + +.x-tab-panel-body-top { + border-top: 0 none; +} + +.x-tab-panel-body-bottom { + border-bottom: 0 none; +} + +.x-tab-scroller-left { + background: transparent no-repeat -18px 0; + border-bottom: 1px solid; + width: 18px; + position: absolute; + left: 0; + top: 0; + z-index: 10; + cursor: pointer; +} + +.x-tab-scroller-left-over { + background-position: 0 0; +} + +.x-tab-scroller-left-disabled { + background-position: -18px 0; + opacity: .5; + -moz-opacity: .5; + filter: alpha(opacity = 50); + cursor: default; +} + +.x-tab-scroller-right { + background: transparent no-repeat 0 0; + border-bottom: 1px solid; + width: 18px; + position: absolute; + right: 0; + top: 0; + z-index: 10; + cursor: pointer; +} + +.x-tab-scroller-right-over { + background-position: -18px 0; +} + +.x-tab-scroller-right-disabled { + background-position: 0 0; + opacity: .5; + -moz-opacity: .5; + filter: alpha(opacity = 50); + cursor: default; +} + +.x-tab-scrolling-bottom .x-tab-scroller-left,.x-tab-scrolling-bottom .x-tab-scroller-right + { + margin-top: 1px; +} + +.x-tab-scrolling .x-tab-strip-wrap { + margin-left: 18px; + margin-right: 18px; +} + +.x-tab-scrolling { + position: relative; +} + +.x-tab-panel-bbar .x-toolbar { + border: 1px solid; + border-top: 0 none; + overflow: hidden; + padding: 2px; +} + +.x-tab-panel-tbar .x-toolbar { + border: 1px solid; + border-top: 0 none; + overflow: hidden; + padding: 2px; +} + +.x-tab-strip li .x-tab-image { + position: absolute; + top: 3px; + left: 5px; +} + +.ext-ie8 .x-tab-strip li .x-tab-image,.ext-ie8-compatibility .x-tab-strip li .x-tab-image { + top: 4px; + left: 6px; +} + +.ext-ie8 .x-tab-strip-top .x-tab-right,.ext-ie8-compatibility .x-tab-strip-top .x-tab-right + { + top: 1px; +} + +.ext-strict .ext-ie8 .x-tab-strip-top .x-tab-right,.ext-ie8 .x-tab-panel-header-plain .x-tab-strip-top .x-tab-right,.ext-ie8-compatibility .x-tab-panel-header-plain .x-tab-strip-top .x-tab-right + { + top: 0; +} +.ext-strict .ext-ie7 .x-panel-body { + position: relative !important; +} + +.x-form-field { + margin: 0; +} + +.foo { + padding: 1px; +} + +.foo { + margin: 4px; +} + +.x-form-text,textarea.x-form-field { + padding: 1px 3px; + background: repeat-x 0 0; + border: 1px solid; +} + +.ext-gecko textarea.x-form-field { + padding: 0; +} + +.x-form-text,.ext-ie .x-form-file { + height: 22px; + line-height: 18px; + vertical-align: middle; +} + +.ext-ie6 .x-form-text,.ext-ie7 .x-form-text { + margin: -1px 0; + height: 22px; /* ie quirks */ + line-height: 18px; +} + +.ext-ie8-compatibility .x-form-text { + margin: 0; +} + +.ext-ie textarea.x-form-field { + margin: -1px 0; /* ie bogus margin bug */ +} + +.ext-strict .ext-ie8 textarea.x-form-field,.ext-strict .ext-ie8-compatibility textarea.x-form-field { + margin: 0; +} + +.x-form-field-wrap .x-form-text { + position: relative; +} + +.ext-strict .x-form-text { + height: 18px; +} + +.ext-safari.ext-mac textarea.x-form-field { + margin-bottom: -2px; +} + +.ext-gecko .x-form-text,.ext-ie8 .x-form-text { + padding-top: 2px; + padding-bottom: 0; +} + +textarea { + resize: none; +} + +.x-form-select-one { + height: 20px; + line-height: 18px; + vertical-align: middle; + border: 1px solid; +} + +.x-form-check-wrap { + line-height: 18px; + height: 22px; + white-space: nowrap; +} + +.x-editor .x-form-check-wrap { + border: 1px solid; + padding: 2px; + height: 14px; +} + +.x-editor .x-form-checkbox { + height: 13px; +} + +.x-form-check-group-label { + border-bottom: 1px solid; + margin-bottom: 5px; + padding-left: 3px !important; + float: none !important; +} + +.x-form-field-wrap .x-form-trigger { + width: 17px; + height: 21px; + border: 0; + background: transparent no-repeat 0 0; + cursor: pointer; + border-bottom: 1px solid; + position: absolute; + top: 0; +} + +.ext-safari .x-form-field-wrap .x-form-trigger { + height: 21px; +} + +.ext-strict .ext-safari .x-form-field-wrap .x-form-trigger { + height: 23px; +} + +.ext-strict .ext-safari .x-small-editor .x-form-field-wrap .x-form-trigger { + height: 19px; +} + +.ext-strict .ext-ie8 .x-small-editor .x-form-field-wrap .x-form-trigger { + height: 20px !important; +} + +.ext-strict .ext-gecko .x-small-editor .x-form-field-wrap .x-form-trigger { + height: 21px !important; +} + +.x-form-field-wrap .x-form-date-trigger,.x-form-field-wrap .x-form-clear-trigger,.x-form-field-wrap .x-form-search-trigger + { + cursor: pointer; +} + +.ext-safari .x-form-field-wrap .x-form-trigger,.ext-gecko .x-form-field-wrap .x-form-trigger { + right: 0; +} + +.x-form-field-wrap .x-form-twin-triggers .x-form-trigger { + position: static; + top: auto; + vertical-align: top; +} + +.x-form-field-wrap { + position: relative; + left: 0; + top: 0; + zoom: 1; + white-space: nowrap; + text-align: left; +} + +.x-form-field-wrap .x-form-trigger-over { + background-position: -17px 0; +} + +.x-form-field-wrap .x-form-trigger-click { + background-position: -34px 0; +} + +.x-trigger-wrap-focus .x-form-trigger { + background-position: -51px 0; +} + +.x-trigger-wrap-focus .x-form-trigger-over { + background-position: -68px 0; +} + +.x-trigger-wrap-focus .x-form-trigger-click { + background-position: -85px 0; +} + +.x-trigger-wrap-focus .x-form-trigger { + border-bottom: 1px solid; +} + +.x-item-disabled .x-form-trigger-over { + background-position: 0 0 !important; + border-bottom: 1px solid; +} + +.x-item-disabled .x-form-trigger-click { + background-position: 0 0 !important; + border-bottom: 1px solid; +} + +.x-form-focus,textarea.x-form-focus { + border: 1px solid; +} + +.x-form-invalid,textarea.x-form-invalid { + background: repeat-x bottom; + border: 1px solid; +} + +.ext-safari .x-form-invalid { + border: 1px solid; +} + +.x-form-inner-invalid,textarea.x-form-inner-invalid { + background: repeat-x bottom; +} + +.x-editor { + padding: 0; + margin: 0; +} + +.x-form-grow-sizer { + left: -10000px; + padding: 8px 3px; + position: absolute; + visibility: hidden; + top: -10000px; + white-space: pre-wrap; + white-space: -moz-pre-wrap; + white-space: -pre-wrap; + white-space: -o-pre-wrap; + word-wrap: break-word; + zoom: 1; +} + +.x-form-grow-sizer p { + margin: 0 !important; + border: 0 none !important; + padding: 0 !important; +} + +.x-form-item { + display: block; + margin-bottom: 4px; +} + +.x-form-item .x-form-item-label { + display: block; + float: left; + width: 100px; + padding: 3px; + padding-left: 0; + clear: left; + z-index: 2; + position: relative; +} + +.x-form-element { + padding-left: 105px; + position: relative; +} + +.x-form-invalid-msg { + padding: 2px; + padding-left: 18px; + background: transparent no-repeat 0 2px; + line-height: 16px; + width: 200px; +} + +.x-form-label-left .x-form-item-label { + text-align: left; +} + +.x-form-label-right .x-form-item-label { + text-align: right; +} + +.x-form-label-top .x-form-item .x-form-item-label { + width: auto; + float: none; + clear: none; + display: inline; + margin-bottom: 4px; + position: static; +} + +.x-form-label-top .x-form-element { + padding-left: 0; + padding-top: 4px; +} + +.x-form-label-top .x-form-item { + padding-bottom: 4px; +} + +.x-small-editor .x-form-text { + height: 20px; + line-height: 16px; + vertical-align: middle; +} + +.ext-ie6 .x-small-editor .x-form-text,.ext-ie7 .x-small-editor .x-form-text { + height: 20px !important; + line-height: 16px !important; +} + +.ext-strict .x-small-editor .x-form-text { + height: 16px !important; +} + +.ext-strict .ext-ie8 .x-small-editor .x-form-text { + height: 17px !important; +} + +.ext-strict .ext-webkit .x-small-editor .x-form-text { + height: 18px !important; + padding: 0px 3px; +} + +.ext-strict .ext-gecko .x-small-editor .x-form-text { + height: 18px !important; +} + +.ext-strict .ext-gecko .x-edit-grid .x-small-editor .x-form-text { + height:17px !important; +} + +.ext-border-box .x-small-editor .x-form-text { + height: 20px; +} + +.x-small-editor .x-form-select-one { + height: 20px; + line-height: 16px; + vertical-align: middle; +} + +.x-small-editor .x-form-num-field { + text-align: right; +} + +.x-small-editor .x-form-field-wrap .x-form-trigger { + height: 19px; +} + +.x-form-clear { + clear: both; + overflow: hidden; + line-height: 0; + font-size: 0; + height: 0; +} + +.x-form-clear-left { + clear: left; + overflow: hidden; + line-height: 0; + font-size: 0; + height: 0; +} + +.x-form-cb-label { + width: auto !important; + float: none !important; + clear: none !important; + display: inline !important; + margin-left: 4px; +} + +.x-form-column { + float: left; + padding: 0; + margin: 0; + width: 48%; + overflow: hidden; + zoom: 1; +} + +.x-form .x-form-btns-ct .x-btn { + float: right; + clear: none; +} + +.x-form .x-form-btns-ct .x-form-btns td { + border: 0; + padding: 0; +} + +.x-form .x-form-btns-ct .x-form-btns-right table { + float: right; + clear: none; +} + +.x-form .x-form-btns-ct .x-form-btns-left table { + float: left; + clear: none; +} + +.x-form .x-form-btns-ct .x-form-btns-center { + text-align: center; +} + +.x-form .x-form-btns-ct .x-form-btns-center table { + margin: 0 auto; +} + +.x-form .x-form-btns-ct table td.x-form-btn-td { + padding: 3px; +} + +.x-form .x-form-btns-ct .x-btn-focus .x-btn-left { + background-position: 0 -147px; +} + +.x-form .x-form-btns-ct .x-btn-focus .x-btn-right { + background-position: 0 -168px; +} + +.x-form .x-form-btns-ct .x-btn-focus .x-btn-center { + background-position: 0 -189px; +} + +.x-form .x-form-btns-ct .x-btn-click .x-btn-center { + background-position: 0 -126px; +} + +.x-form .x-form-btns-ct .x-btn-click .x-btn-right { + background-position: 0 -84px; +} + +.x-form .x-form-btns-ct .x-btn-click .x-btn-left { + background-position: 0 -63px; +} + +.x-form-invalid-icon { + width: 16px; + height: 18px; + position: absolute; + left: 0; + top: 0; + display: block; + background: transparent no-repeat 0 2px; +} + +.x-fieldset { + border: 1px solid; + padding: 10px; + margin-bottom: 10px; + display: block; +} + +.ext-ie .x-fieldset legend { + margin-bottom: 10px; +} + +.ext-ie .x-fieldset { + padding-top: 0; + padding-bottom: 10px; +} + +.x-fieldset legend .x-tool-toggle { + margin-right: 3px; + margin-left: 0; + float: left !important; +} + +.x-fieldset legend input { + margin-right: 3px; + float: left !important; + height: 13px; + width: 13px; +} + +fieldset.x-panel-collapsed { + padding-bottom: 0 !important; + border-width: 1px 1px 0 1px !important; + border-left-color: transparent; + border-right-color: transparent; +} + +.ext-ie6 fieldset.x-panel-collapsed { + padding-bottom: 0 !important; + border-width: 1px 0 0 0 !important; + margin-left: 1px; + margin-right: 1px; +} + +fieldset.x-panel-collapsed .x-fieldset-bwrap { + visibility: hidden; + position: absolute; + left: -1000px; + top: -1000px; +} + +.ext-ie .x-fieldset-bwrap { + zoom: 1; +} + +.x-fieldset-noborder { + border: 0px none transparent; +} + +.x-fieldset-noborder legend { + margin-left: -3px; +} + +.ext-ie .x-fieldset-noborder legend { + position: relative; + margin-bottom: 23px; +} + +.ext-ie .x-fieldset-noborder legend span { + position: absolute; + left: 16px; +} + +.ext-gecko .x-form-item { + -moz-outline: none; + outline: 0 none; +} + +.x-hide-label label.x-form-item-label { + display: none !important; +} + +.x-hide-label .x-form-element { + padding-left: 0 !important; +} + +.x-fieldset { + overflow: hidden; +} + +/* make top of checkbox/tools visible in webkit */ +.ext-webkit .x-fieldset-header { + padding-top: 1px; +} + +.x-fieldset-bwrap { + overflow: hidden; + zoom: 1; +} + +.x-fieldset-body { + overflow: hidden; +} + +.x-combo-list .x-combo-selected { + border-color: #a3bae9 !important; +} + +.x-combo-list { + background-color: white !important; +} + +.ext-gecko .x-form-file { + height: inherit !important; +} + +.x-form-check { + background: none !important +} + +.x-form-radio { + background: none !important +} + +.x-form-label { + padding: 2px 3px 3px 0px; + font-size: 12px; +} + +.x-form-label-top .x-form-item { + padding-bottom: 0px; + margin-bottom: 2px; +} + +.ext-safari .x-form-text { + height: 22px; /* safari always same size */ + padding: 0 3px; + /* remove extra top/bottom padding */ +} + +.ext-safari .x-small-editor .x-form-text { + height: 20px; +} + +.x-form-group-label,.x-form-cb-label { + font: normal 12px tahoma, arial, helvetica, sans-serif; + padding-right: 10px; +} + +.x-form-list { + background: #FFFFFF url(../images/default/form/text-bg.gif) repeat-x scroll 0 0; + border: 1px solid #B5B8C8; +} + +/* + * FileUploadField component styles + */ +.x-form-file-wrap { + height: 22px; +} + +.x-form-file-wrap .x-form-file { + position: absolute; + right: 0; + -moz-opacity: 0; + filter: alpha(opacity : 0); + opacity: 0; + z-index: 2; + height: 22px; + top: 0; +} + +.x-form-file-wrap .x-form-file-btn { + position: absolute; + right: 0; + z-index: 1; + top: 0; +} + +.x-form-file-wrap .x-form-file-text { + z-index: 3; + color: #777; +} + +.x-form-invalid-icon { + background-position: 0 0 !important; +} + +.x-triggerfield-noedit { + cursor: pointer; +} + +.ext-webkit .x-form-checkbox:focus { + outline: auto !important; +} + +.x-spinner-field .x-form-twin-triggers .x-form-spinner-up, .x-spinner-field .x-form-twin-triggers .x-form-spinner-down { + height: 10px; + position: absolute; +} + +.ext-strict .ext-safari .x-form-field-wrap .x-form-spinner-up { + height: 10px; +} + +.ext-strict .ext-safari .x-form-field-wrap .x-form-spinner-down { + height: 12px; +} + +.x-spinner-field .x-form-twin-triggers .x-form-spinner-up { + top:0px; +} + +.x-spinner-field .x-form-twin-triggers .x-form-spinner-down { + top:11px; +} + +.x-spinner-field .x-form-twin-triggers { + width: 17px; +} + +.x-spinner-field .x-form-spinner-down { + background-position:0 -12px; +} + +.x-trigger-wrap-focus .x-form-spinner-up { + background-position:-85px 0; +} + +.x-trigger-wrap-focus .x-form-spinner-down { + background-position:-85px -12px; +} + +.x-form-field-wrap .x-form-spinner-overup{ + background-position:-17px 0; +} +.x-form-field-wrap .x-form-spinner-clickup{ + background-position:-34px 0; +} + +.x-trigger-wrap-focus .x-form-spinner-overup{ + background-position:-102px 0; +} + +.x-trigger-wrap-focus .x-form-spinner-clickup{ + background-position:-119px 0; +} + +.x-form-field-wrap .x-form-spinner-overdown{ + background-position:-51px -12px; +} +.x-form-field-wrap .x-form-spinner-clickdown{ + background-position:-68px -12px; +} +.x-trigger-wrap-focus .x-form-spinner-overdown{ + background-position:-136px -12px; +} +.x-trigger-wrap-focus .x-form-spinner-clickdown{ + background-position:-153px -12px; +}.x-btn{ + cursor:pointer; + white-space: nowrap; +} +.x-btn button{ + border:0 none; + background:transparent; + padding-left:3px; + padding-right:3px; + cursor:pointer; + margin:0; + overflow:hidden; + width:auto; + -moz-outline:0 none; + outline:0 none; +} +* html .ext-ie .x-btn button { + width:1px; +} +.ext-ie .x-item-disabled .x-btn-mc img { + filter: alpha(opacity=60); +} +.ext-gecko .x-btn button,.ext-webkit .x-btn button { + padding-left:0; + padding-right:0; +} +.ext-gecko .x-btn button::-moz-focus-inner { + padding:0; +} +.ext-ie .x-btn button { + padding-top:2px; +} +.x-btn td { + padding:0 !important; +} +.x-btn-text { + cursor:pointer; + white-space: nowrap; + padding:0; +} +.x-btn-noicon .x-btn-small .x-btn-text{ + height: 16px; +} +.x-btn-noicon .x-btn-medium .x-btn-text{ + height: 24px; +} +.x-btn-noicon .x-btn-large .x-btn-text{ + height: 32px; +} +.x-btn-icon .x-btn-text{ + background-position: center; + background-repeat: no-repeat; +} +.x-btn-icon .x-btn-small .x-btn-text{ + height: 16px; + width: 16px; +} +.x-btn-icon .x-btn-medium .x-btn-text{ + height: 24px; + width: 24px; +} +.x-btn-icon .x-btn-large .x-btn-text{ + height: 32px; + width: 32px; +} +.x-btn-text-icon .x-btn-icon-small-left .x-btn-text{ + background-position: 0 center; + background-repeat: no-repeat; + padding-left:18px; + height:16px; +} +.x-btn-text-icon .x-btn-icon-medium-left .x-btn-text{ + background-position: 0 center; + background-repeat: no-repeat; + padding-left:26px; + height:24px; +} +.x-btn-text-icon .x-btn-icon-large-left .x-btn-text{ + background-position: 0 center; + background-repeat: no-repeat; + padding-left:34px; + height:32px; +} +.x-btn-text-icon .x-btn-icon-small-top .x-btn-text{ + background-position: center 0; + background-repeat: no-repeat; + padding-top:18px; +} +.x-btn-text-icon .x-btn-icon-medium-top .x-btn-text{ + background-position: center 0; + background-repeat: no-repeat; + padding-top:26px; +} +.x-btn-text-icon .x-btn-icon-large-top .x-btn-text{ + background-position: center 0; + background-repeat: no-repeat; + padding-top:34px; +} +.x-btn-text-icon .x-btn-icon-small-right .x-btn-text{ + background-position: right center; + background-repeat: no-repeat; + padding-right:18px; + height:16px; +} +.x-btn-text-icon .x-btn-icon-medium-right .x-btn-text{ + background-position: right center; + background-repeat: no-repeat; + padding-right:26px; + height:24px; +} +.x-btn-text-icon .x-btn-icon-large-right .x-btn-text{ + background-position: right center; + background-repeat: no-repeat; + padding-right:34px; + height:32px; +} +.x-btn-text-icon .x-btn-icon-small-bottom .x-btn-text{ + background-position: center bottom; + background-repeat: no-repeat; + padding-bottom:18px; +} +.x-btn-text-icon .x-btn-icon-medium-bottom .x-btn-text{ + background-position: center bottom; + background-repeat: no-repeat; + padding-bottom:26px; +} +.x-btn-text-icon .x-btn-icon-large-bottom .x-btn-text{ + background-position: center bottom; + background-repeat: no-repeat; + padding-bottom:34px; +} +.x-btn-tr i, .x-btn-tl i, .x-btn-mr i, .x-btn-ml i, .x-btn-br i, .x-btn-bl i{ + font-size:1px; + line-height:1px; + width:3px; + display:block; + overflow:hidden; +} +.x-btn-tr i, .x-btn-tl i, .x-btn-br i, .x-btn-bl i{ + height:3px; +} +.x-btn-tl{ + width:3px; + height:3px; + background:no-repeat 0 0; +} +.x-btn-tr{ + width:3px; + height:3px; + background:no-repeat -3px 0; +} +.x-btn-tc{ + height:3px; + background:repeat-x 0 -6px; +} +.x-btn-ml{ + width:3px; + background:no-repeat 0 -24px; +} +.x-btn-mr{ + width:3px; + background:no-repeat -3px -24px; +} +.x-btn-mc{ + background:repeat-x 0 -1096px; + vertical-align: middle; + text-align:center; + padding:0 5px; + cursor:pointer; + white-space:nowrap; +} +.x-btn-bl{ + width:3px; + height:3px; + background:no-repeat 0 -3px; +} +.x-btn-br{ + width:3px; + height:3px; + background:no-repeat -3px -3px; +} +.x-btn-bc{ + height:3px; + background:repeat-x 0 -15px; +} +.x-btn-over .x-btn-tl{ + background-position: -6px 0; +} +.x-btn-over .x-btn-tr{ + background-position: -9px 0; +} +.x-btn-over .x-btn-tc{ + background-position: 0 -9px; +} +.x-btn-over .x-btn-ml{ + background-position: -6px -24px; +} +.x-btn-over .x-btn-mr{ + background-position: -9px -24px; +} +.x-btn-over .x-btn-mc{ + background-position: 0 -2168px; +} +.x-btn-over .x-btn-bl{ + background-position: -6px -3px; +} +.x-btn-over .x-btn-br{ + background-position: -9px -3px; +} +.x-btn-over .x-btn-bc{ + background-position: 0 -18px; +} +.ext-webkit .x-btn-focus .x-btn-tl{ + background-position: -6px 0; +} +.ext-webkit .x-btn-focus .x-btn-tr{ + background-position: -9px 0; +} +.ext-webkit .x-btn-focus .x-btn-tc{ + background-position: 0 -9px; +} +.ext-webkit .x-btn-focus .x-btn-ml{ + background-position: -6px -24px; +} +.ext-webkit .x-btn-focus .x-btn-mr{ + background-position: -9px -24px; +} +.ext-webkit .x-btn-focus .x-btn-mc{ + background-position: 0 -2168px; +} +.ext-webkit .x-btn-focus .x-btn-bl{ + background-position: -6px -3px; +} +.ext-webkit .x-btn-focus .x-btn-br{ + background-position: -9px -3px; +} +.ext-webkit .x-btn-focus .x-btn-bc{ + background-position: 0 -18px; +} +.x-btn-click .x-btn-tl, .x-btn-menu-active .x-btn-tl, .x-btn-pressed .x-btn-tl{ + background-position: -12px 0 !important; +} +.x-btn-click .x-btn-tr, .x-btn-menu-active .x-btn-tr, .x-btn-pressed .x-btn-tr{ + background-position: -15px 0 !important; +} +.x-btn-click .x-btn-tc, .x-btn-menu-active .x-btn-tc, .x-btn-pressed .x-btn-tc{ + background-position: 0 -12px !important; +} +.x-btn-click .x-btn-ml, .x-btn-menu-active .x-btn-ml, .x-btn-pressed .x-btn-ml{ + background-position: -12px -24px !important; +} +.x-btn-click .x-btn-mr, .x-btn-menu-active .x-btn-mr, .x-btn-pressed .x-btn-mr{ + background-position: -15px -24px !important; +} +.x-btn-click .x-btn-mc, .x-btn-menu-active .x-btn-mc, .x-btn-pressed .x-btn-mc{ + background-position: 0 -3240px !important; +} +.x-btn-click .x-btn-bl, .x-btn-menu-active .x-btn-bl, .x-btn-pressed .x-btn-bl{ + background-position: -12px -3px !important; +} +.x-btn-click .x-btn-br, .x-btn-menu-active .x-btn-br, .x-btn-pressed .x-btn-br{ + background-position: -15px -3px !important; +} +.x-btn-click .x-btn-bc, .x-btn-menu-active .x-btn-bc, .x-btn-pressed .x-btn-bc{ + background-position: 0 -21px !important; +} +.x-btn-disabled *{ + cursor:default !important; +} +.x-btn-mc em.x-btn-arrow { + display:block; + background:transparent no-repeat right center; + padding-right:10px; +} +.x-btn-mc em.x-btn-split { + display:block; + background:transparent no-repeat right center; + padding-right:14px; +} +.x-btn-mc em.x-btn-arrow-bottom { + display:block; + background:transparent no-repeat center bottom; + padding-bottom:14px; +} +.x-btn-mc em.x-btn-split-bottom { + display:block; + background:transparent no-repeat center bottom; + padding-bottom:14px; +} +.x-btn-as-arrow .x-btn-mc em { + display:block; + background:transparent; + padding-bottom:14px; +} +.x-btn-group { + padding:1px; +} +.x-btn-group-header { + padding:2px; + text-align:center; +} +.x-btn-group-tc { + background: transparent repeat-x 0 0; + overflow:hidden; +} +.x-btn-group-tl { + background: transparent no-repeat 0 0; + padding-left:3px; + zoom:1; +} +.x-btn-group-tr { + background: transparent no-repeat right 0; + zoom:1; + padding-right:3px; +} +.x-btn-group-bc { + background: transparent repeat-x 0 bottom; + zoom:1; +} +.x-btn-group-bc .x-panel-footer { + zoom:1; +} +.x-btn-group-bl { + background: transparent no-repeat 0 bottom; + padding-left:3px; + zoom:1; +} +.x-btn-group-br { + background: transparent no-repeat right bottom; + padding-right:3px; + zoom:1; +} +.x-btn-group-mc { + border:0 none; + padding:1px 0 0 0; + margin:0; +} +.x-btn-group-mc .x-btn-group-body { + background:transparent; + border: 0 none; +} +.x-btn-group-ml { + background: transparent repeat-y 0 0; + padding-left:3px; + zoom:1; +} +.x-btn-group-mr { + background: transparent repeat-y right 0; + padding-right:3px; + zoom:1; +} +.x-btn-group-bc .x-btn-group-footer { + padding-bottom:6px; +} +.x-panel-nofooter .x-btn-group-bc { + height:3px; + font-size:0; + line-height:0; +} +.x-btn-group-bwrap { + overflow:hidden; + zoom:1; +} +.x-btn-group-body { + overflow:hidden; + zoom:1; +} +.x-btn-group-notitle .x-btn-group-tc { + background: transparent repeat-x 0 0; + overflow:hidden; + height:2px; +} +.x-toolbar{ + border-style:solid; + border-width:0 0 1px 0; + display: block; + padding:2px; + background:repeat-x top left; + position:relative; + left:0; + top:0; + zoom:1; + overflow:hidden; +} +.x-toolbar .x-item-disabled .x-btn-icon { + opacity: .35; + -moz-opacity: .35; + filter: alpha(opacity=35); +} +.x-toolbar td { + vertical-align:middle; +} +.x-toolbar td,.x-toolbar span,.x-toolbar input,.x-toolbar div,.x-toolbar select,.x-toolbar label{ + white-space: nowrap; +} +.x-toolbar .x-item-disabled { + cursor:default; + opacity:.6; + -moz-opacity:.6; + filter:alpha(opacity=60); +} + +.x-toolbar .x-item-disabled *{ + cursor:default; +} + +.x-toolbar .x-toolbar-cell { + vertical-align:middle; +} +.x-toolbar .x-btn-tl, .x-toolbar .x-btn-tr, .x-toolbar .x-btn-tc, .x-toolbar .x-btn-ml, .x-toolbar .x-btn-mr, +.x-toolbar .x-btn-mc, .x-toolbar .x-btn-bl, .x-toolbar .x-btn-br, .x-toolbar .x-btn-bc +{ + background-position: 500px 500px; +} +.x-toolbar .x-btn-over .x-btn-tl{ + background-position: -6px 0; +} +.x-toolbar .x-btn-over .x-btn-tr{ + background-position: -9px 0; +} +.x-toolbar .x-btn-over .x-btn-tc{ + background-position: 0 -9px; +} +.x-toolbar .x-btn-over .x-btn-ml{ + background-position: -6px -24px; +} +.x-toolbar .x-btn-over .x-btn-mr{ + background-position: -9px -24px; +} +.x-toolbar .x-btn-over .x-btn-mc{ + background-position: 0 -2168px; +} +.x-toolbar .x-btn-over .x-btn-bl{ + background-position: -6px -3px; +} +.x-toolbar .x-btn-over .x-btn-br{ + background-position: -9px -3px; +} +.x-toolbar .x-btn-over .x-btn-bc{ + background-position: 0 -18px; +} +.x-toolbar .x-btn-click .x-btn-tl, .x-toolbar .x-btn-menu-active .x-btn-tl, .x-toolbar .x-btn-pressed .x-btn-tl{ + background-position: -12px 0; +} +.x-toolbar .x-btn-click .x-btn-tr, .x-toolbar .x-btn-menu-active .x-btn-tr, .x-toolbar .x-btn-pressed .x-btn-tr{ + background-position: -15px 0; +} +.x-toolbar .x-btn-click .x-btn-tc, .x-toolbar .x-btn-menu-active .x-btn-tc, .x-toolbar .x-btn-pressed .x-btn-tc{ + background-position: 0 -12px; +} +.x-toolbar .x-btn-click .x-btn-ml, .x-toolbar .x-btn-menu-active .x-btn-ml, .x-toolbar .x-btn-pressed .x-btn-ml{ + background-position: -12px -24px; +} +.x-toolbar .x-btn-click .x-btn-mr, .x-toolbar .x-btn-menu-active .x-btn-mr, .x-toolbar .x-btn-pressed .x-btn-mr{ + background-position: -15px -24px; +} +.x-toolbar .x-btn-click .x-btn-mc, .x-toolbar .x-btn-menu-active .x-btn-mc, .x-toolbar .x-btn-pressed .x-btn-mc{ + background-position: 0 -3240px; +} +.x-toolbar .x-btn-click .x-btn-bl, .x-toolbar .x-btn-menu-active .x-btn-bl, .x-toolbar .x-btn-pressed .x-btn-bl{ + background-position: -12px -3px; +} +.x-toolbar .x-btn-click .x-btn-br, .x-toolbar .x-btn-menu-active .x-btn-br, .x-toolbar .x-btn-pressed .x-btn-br{ + background-position: -15px -3px; +} +.x-toolbar .x-btn-click .x-btn-bc, .x-toolbar .x-btn-menu-active .x-btn-bc, .x-toolbar .x-btn-pressed .x-btn-bc{ + background-position: 0 -21px; +} +.x-toolbar div.xtb-text{ + padding:2px 2px 0; + line-height:16px; + display:block; +} +.x-toolbar .xtb-sep { + background-position: center; + background-repeat: no-repeat; + display: block; + font-size: 1px; + height: 16px; + width:4px; + overflow: hidden; + cursor:default; + margin: 0 2px 0; + border:0; +} +.x-toolbar .xtb-spacer { + width:2px; +} +.x-tbar-page-number{ + width:24px; + height:14px; +} +.x-paging-info { + position:absolute; + top:5px; + right: 8px; +} +.x-toolbar-ct { + width:100%; +} +.x-panel-tbar, .x-panel-bbar, .x-window-tbar, .x-window-bbar, .x-tab-panel-tbar, .x-tab-panel-bbar, .x-plain-tbar, .x-plain-bbar { + overflow:hidden; + zoom:1; +} +.x-toolbar-more .x-btn-small .x-btn-text{ + height: 16px; + width: 12px; +} +.x-toolbar-more em.x-btn-arrow { + display:inline; + background:transparent; + padding-right:0; +} +.x-toolbar-more .x-btn-mc em.x-btn-arrow { + background-image: none; +} +div.x-toolbar-no-items { + color:gray !important; + padding:5px 10px !important; +}.x-resizable-handle { + position:absolute; + z-index:100; + font-size:1px; + line-height:6px; + overflow:hidden; + filter:alpha(opacity=0); + opacity:0; + zoom:1; +} +.x-resizable-handle-east{ + width:6px; + cursor:e-resize; + right:0; + top:0; + height:100%; +} +.ext-ie .x-resizable-handle-east { + margin-right:-1px; +} +.x-resizable-handle-south{ + width:100%; + cursor:s-resize; + left:0; + bottom:0; + height:6px; +} +.ext-ie .x-resizable-handle-south { + margin-bottom:-1px; +} +.x-resizable-handle-west{ + width:6px; + cursor:w-resize; + left:0; + top:0; + height:100%; +} +.x-resizable-handle-north{ + width:100%; + cursor:n-resize; + left:0; + top:0; + height:6px; +} +.x-resizable-handle-southeast{ + width:6px; + cursor:se-resize; + right:0; + bottom:0; + height:6px; + z-index:101; +} +.x-resizable-handle-northwest{ + width:6px; + cursor:nw-resize; + left:0; + top:0; + height:6px; + z-index:101; +} +.x-resizable-handle-northeast{ + width:6px; + cursor:ne-resize; + right:0; + top:0; + height:6px; + z-index:101; +} +.x-resizable-handle-southwest{ + width:6px; + cursor:sw-resize; + left:0; + bottom:0; + height:6px; + z-index:101; +} +.x-resizable-over .x-resizable-handle, .x-resizable-pinned .x-resizable-handle{ + filter:alpha(opacity=100); + opacity:1; +} +.x-resizable-over .x-resizable-handle-east, .x-resizable-pinned .x-resizable-handle-east, +.x-resizable-over .x-resizable-handle-west, .x-resizable-pinned .x-resizable-handle-west +{ + background-position: left; +} +.x-resizable-over .x-resizable-handle-south, .x-resizable-pinned .x-resizable-handle-south, +.x-resizable-over .x-resizable-handle-north, .x-resizable-pinned .x-resizable-handle-north +{ + background-position: top; +} +.x-resizable-over .x-resizable-handle-southeast, .x-resizable-pinned .x-resizable-handle-southeast{ + background-position: top left; +} +.x-resizable-over .x-resizable-handle-northwest, .x-resizable-pinned .x-resizable-handle-northwest{ + background-position:bottom right; +} +.x-resizable-over .x-resizable-handle-northeast, .x-resizable-pinned .x-resizable-handle-northeast{ + background-position: bottom left; +} +.x-resizable-over .x-resizable-handle-southwest, .x-resizable-pinned .x-resizable-handle-southwest{ + background-position: top right; +} +.x-resizable-proxy{ + border: 1px dashed; + position:absolute; + overflow:hidden; + display:none; + left:0; + top:0; + z-index:50000; +} +.x-resizable-overlay{ + width:100%; + height:100%; + display:none; + position:absolute; + left:0; + top:0; + z-index:200000; + -moz-opacity: 0; + opacity:0; + filter: alpha(opacity=0); +} +.x-grid3 { + position: relative; + overflow: hidden; +} + +.x-grid-panel { + -moz-outline: none; + -moz-user-focus: normal; + outline: 0 none; +} + +.x-grid-panel .x-panel-body { + overflow: hidden !important; +} + +.x-grid-panel .x-panel-mc .x-panel-body { + border: 1px solid; +} + +.x-grid3 .x-grid3-row-table, .x-grid3 .x-grid3-summary-table { + table-layout: fixed; +} + +.x-grid3-viewport { + overflow: hidden; +} + +.x-grid3-hd-row .x-grid3-hd,.x-grid3-row .x-grid3-hd,.x-grid3-summary-row .x-grid3-hd { + -moz-outline: none; + -moz-user-focus: normal; + outline: 0 none; +} + +.x-grid3-summary-row { + -moz-user-select: none; + -khtml-user-select: none; + -webkit-user-select: ignore; + outline: 0 none; +} + +.x-grid3-row td.x-grid3-cell,.x-grid3-summary-row td.x-grid3-cell { + line-height: 14px; + vertical-align: top; + padding-left: 1px; + padding-right: 1px; + -moz-outline: none; + outline: 0 none; +} + +.x-grid3-hd-row .x-grid3-hd { + line-height: 15px; + vertical-align: middle; + border-left: 1px solid; + border-right: 1px solid; +} + +.x-grid3-hd-row .x-grid3-marker-hd { + padding: 3px; +} + +.x-grid3-row .x-grid3-marker { + padding: 3px; +} + +.x-grid3-cell-inner,.x-grid3-hd-inner { + overflow: hidden; + -o-text-overflow: ellipsis; + text-overflow: ellipsis; + padding: 3px 3px 3px 5px; + white-space: nowrap; +} + +.x-grid3-hd-inner { + position: relative; + cursor: inherit; + padding: 4px 3px 4px 5px; + vertical-align: middle; +} + +.x-grid3-row-body { + white-space: normal; + font-size: 11px; +} + +.x-grid3-body-cell { + -moz-outline: 0 none; + outline: 0 none; +} + +.ext-ie .x-grid3-cell-inner,.ext-ie .x-grid3-hd-inner { + width: 100%; +} + +.ext-strict .x-grid3-cell-inner,.ext-strict .x-grid3-hd-inner { + width: auto; +} + +.x-grid-row-loading { + background: no-repeat center center; +} + +.x-grid-page { + overflow: hidden; +} + +.x-grid3-row { + cursor: default; + border: 1px solid; + width: 100%; +} + +.x-grid3-row-over { + border: 1px solid; + background: repeat-x left top; +} + +.x-grid3-resize-proxy { + width: 1px; + left: 0; + cursor: e-resize; + cursor: col-resize; + position: absolute; + top: 0; + height: 100px; + overflow: hidden; + visibility: hidden; + border: 0 none; + z-index: 7; +} + +.x-grid3-resize-marker { + width: 1px; + left: 0; + position: absolute; + top: 0; + height: 100px; + overflow: hidden; + visibility: hidden; + border: 0 none; + z-index: 7; +} + +.x-grid3-focus { + position: absolute; + left: 0; + top: 0; + width: 1px; + height: 1px; + line-height: 1px; + font-size: 1px; + -moz-outline: 0 none; + outline: 0 none; + -moz-user-select: text; + -khtml-user-select: text; + -webkit-user-select: ignore; +} + +.x-grid3-header { + background: repeat-x 0 bottom; + cursor: default; + zoom: 1; + padding: 0px 0 0 0; +} + +.x-grid3-header-pop { + border-left: 1px solid; + float: right; + clear: none; +} + +.x-grid3-header-pop-inner { + border-left: 1px solid; + width: 14px; + height: 19px; + background: transparent no-repeat center center; +} + +.ext-ie .x-grid3-header-pop-inner { + width: 15px; +} + +.ext-strict .x-grid3-header-pop-inner { + width: 14px; +} + +.x-grid3-header-inner { + overflow: hidden; + zoom: 1; + float: left; +} + +.x-grid3-header-offset { + padding-left: 1px; +} + +td.x-grid3-hd-over,td.sort-desc,td.sort-asc,td.x-grid3-hd-menu-open { + border-left: 1px solid; + border-right: 1px solid; +} + +td.x-grid3-hd-over .x-grid3-hd-inner,td.sort-desc .x-grid3-hd-inner,td.sort-asc .x-grid3-hd-inner,td.x-grid3-hd-menu-open .x-grid3-hd-inner + { + background: repeat-x left bottom; +} + +.x-grid3-sort-icon { + background-repeat: no-repeat; + display: none; + height: 4px; + width: 13px; + margin-left: 3px; + vertical-align: middle; +} + +.sort-asc .x-grid3-sort-icon,.sort-desc .x-grid3-sort-icon { + display: inline; +} + +.ext-strict .ext-ie .x-grid3-header-inner,.ext-strict .ext-ie6 .x-grid3-hd { + position: relative; +} + +.ext-strict .ext-ie6 .x-grid3-hd-inner { + position: static; +} + +.x-grid3-body { + zoom: 1; +} + +.x-grid3-scroller { + overflow: auto; + zoom: 1; + position: relative; +} + +.x-grid3-cell-text,.x-grid3-hd-text { + display: block; + padding: 3px 5px 3px 5px; +} + +.x-grid3-split { + background-position: center; + background-repeat: no-repeat; + cursor: e-resize; + cursor: col-resize; + display: block; + font-size: 1px; + height: 16px; + overflow: hidden; + position: absolute; + top: 2px; + width: 6px; + z-index: 3; +} + +.x-dd-drag-proxy .x-grid3-hd-inner { + background: repeat-x left bottom; + width: 120px; + padding: 3px; + border: 1px solid; + overflow: hidden; +} + +.col-move-top,.col-move-bottom { + width: 9px; + height: 9px; + position: absolute; + top: 0; + line-height: 1px; + font-size: 1px; + overflow: hidden; + visibility: hidden; + z-index: 20000; + background: transparent no-repeat left top; +} + +.x-grid3-row-selected { + border: 1px dotted; +} + +.x-grid3-locked td.x-grid3-row-marker,.x-grid3-locked .x-grid3-row-selected td.x-grid3-row-marker { + background: repeat-x 0 bottom !important; + vertical-align: middle !important; + padding: 0; + border-top: 1px solid; + border-bottom: none !important; + border-right: 1px solid !important; + text-align: center; +} + +.x-grid3-locked td.x-grid3-row-marker div,.x-grid3-locked .x-grid3-row-selected td.x-grid3-row-marker div { + padding: 0 4px; + text-align: center; +} + +.x-grid3-dirty-cell { + background: transparent no-repeat 0 0; +} + +.x-grid3-invalid-cell { + background: repeat-x bottom; +} + +.x-grid3-topbar,.x-grid3-bottombar { + overflow: hidden; + display: none; + zoom: 1; + position: relative; +} + +.x-grid3-topbar .x-toolbar { + border-right: 0 none; +} + +.x-grid3-bottombar .x-toolbar { + border-right: 0 none; + border-bottom: 0 none; + border-top: 1px solid; +} + +.x-props-grid .x-grid3-cell { + padding: 1px; +} + +.x-props-grid .x-grid3-td-name .x-grid3-cell-inner { + background: transparent repeat-y -16px !important; + padding-left: 12px; +} + +.x-props-grid .x-grid3-body .x-grid3-td-name { + padding: 1px; + padding-right: 0; + border: 0 none; + border-right: 1px solid; +} + +.x-grid3-col-dd { + border: 0 none; + padding: 0; + background: transparent; +} + +.x-dd-drag-ghost .x-grid3-dd-wrap { + padding: 1px 3px 3px 1px; +} + +.x-grid3-hd { + -moz-user-select: none; + -khtml-user-select: none; + -webkit-user-select: ignore; +} + +.x-grid3-hd-btn { + display: none; + position: absolute; + width: 14px; + background: no-repeat left center; + right: 0; + top: 0; + z-index: 2; + cursor: pointer; + outline: none; +} + +.x-grid3-hd-over .x-grid3-hd-btn,.x-grid3-hd-menu-open .x-grid3-hd-btn { + display: block; +} + +a.x-grid3-hd-btn:hover { + background-position: -14px center; +} + +.x-grid3-body .x-grid3-td-expander { + background: transparent repeat-y right; +} + +.x-grid3-body .x-grid3-td-expander .x-grid3-cell-inner { + padding: 0 !important; + height: 100%; +} + +.x-grid3-row-expander { + width: 100%; + height: 18px; + background-position: 4px 2px; + background-repeat: no-repeat; + background-color: transparent; +} + +.x-grid3-row-collapsed .x-grid3-row-expander { + background-position: 4px 2px; +} + +.x-grid3-row-expanded .x-grid3-row-expander { + background-position: -21px 2px; +} + +.x-grid3-row-collapsed .x-grid3-row-body { + display: none !important; +} + +.x-grid3-row-expanded .x-grid3-row-body { + display: block !important; +} + +.x-grid3-body .x-grid3-td-checker { + background: transparent repeat-y right; +} + +.x-grid3-body .x-grid3-td-checker .x-grid3-cell-inner,.x-grid3-header .x-grid3-td-checker .x-grid3-hd-inner { + padding: 0 !important; + height: 100%; +} + +.x-grid3-group-checker { + float: left; +} + +.x-grid3-row-checker,.x-grid3-hd-checker { + width: 100%; + height: 18px; + background-position: 2px 2px; + background-repeat: no-repeat; + background-color: transparent; +} + +.x-grid3-hd-checker { + padding-bottom: 0px !important; +} + +.x-grid3-row .x-grid3-row-checker { + background-position: 2px 2px; +} + +.x-grid3-row-selected .x-grid3-row-checker,.x-grid3-hd-checker-on .x-grid3-hd-checker,.x-grid3-row-checked .x-grid3-row-checker + { + background-position: -23px 2px; +} + +.x-grid3-hd-checker { + background-position: 2px 3px; +} + +.x-grid3-hd-checker-on .x-grid3-hd-checker { + background-position: -23px 3px; +} + +.x-grid3-body .x-grid3-td-numberer { + background: transparent repeat-y right; +} + +.x-grid3-body .x-grid3-td-numberer .x-grid3-cell-inner { + padding: 3px 5px 0 0 !important; + text-align: right; +} + +.x-grid3-body .x-grid3-td-row-icon { + background: transparent repeat-y right; + vertical-align: top; + text-align: center; +} + +.x-grid3-body .x-grid3-td-row-icon .x-grid3-cell-inner { + padding: 0 !important; + background-position: center center; + background-repeat: no-repeat; + width: 16px; + height: 16px; + margin-left: 2px; + margin-top: 3px; +} + +.x-grid3-body .x-grid3-row-selected .x-grid3-td-numberer,.x-grid3-body .x-grid3-row-selected .x-grid3-td-checker,.x-grid3-body .x-grid3-row-selected .x-grid3-td-expander + { + background: transparent repeat-y right; +} + +.x-grid3-body .x-grid3-check-col-td .x-grid3-cell-inner { + padding: 1px 0 0 0 !important; +} + +.x-grid3-check-col { + width: 100%; + height: 16px; + background-position: center center; + background-repeat: no-repeat; + background-color: transparent; +} + +.x-grid3-check-col-on { + width: 100%; + height: 16px; + background-position: center center; + background-repeat: no-repeat; + background-color: transparent; +} + +.x-grid-group,.x-grid-group-body,.x-grid-group-hd { + zoom: 1; +} + +.x-grid-group-hd { + border-bottom: 2px solid; + cursor: pointer; + padding-top: 6px; +} + +.x-grid-group-hd .x-grid-group-div { + background: transparent no-repeat 3px -47px; + padding: 4px 4px 4px 17px; +} + +.x-grid-group-collapsed .x-grid-group-hd .x-grid-group-div { + background-position: 3px 3px; +} + +.x-grid-group-collapsed .x-grid-group-body { + display: none; +} + +.x-grid-empty { + padding: 10px; +} + +.ext-ie7 .x-grid-panel .x-panel-bbar { + position: relative; +} + +.x-grid-with-col-lines .x-grid3-row td.x-grid3-cell { + padding-right: 0; + border-right: 1px solid; +} + +.ext-ie6 .x-grid3-header { + position: relative; +} + +.x-grid3-check-col-disabled { + width: 100%; + height: 16px; + background-position: center center; + background-repeat: no-repeat; +} + +.x-row-editor-header { + height: 2px; + overflow: hidden; +} + +.x-row-editor-footer { + height: 2px; + overflow: hidden; +} + +.ext-ie .x-row-editor-footer { + margin-top: -1px; +} + +.x-row-editor-body { + overflow: hidden; + zoom: 1; + padding-top: 2px; +} + +.x-row-editor .x-btns { + position: absolute; + top: 28px; + left: 20px; + padding-left: 5px; +} + +.x-row-editor .x-btns .x-plain-bwrap { + padding-right: 5px; +} + +.x-row-editor .x-btns .x-plain-body { + height: 31px; +} + +.x-row-editor .x-btns .x-table-layout-cell { + padding: 3px; +} + +.x-grid3-footer { + background: #f7f7f7 none repeat scroll 0 0; + border-top: 1px solid #DDDDDD; + border-bottom: 1px solid #DDDDDD; + display: block; + overflow: hidden; + position: relative; +} + +.x-grid3-footer-row { + border: 1px solid #EEEEEE; + background-color: #f7f7f7; + -moz-user-select: none; + -khtml-user-select: none; + -webkit-user-select: ignore; + cursor: default; +} + +.x-grid3-footer-row td { + line-height: 13px; + vertical-align: top; + padding-left: 1px; + padding-right: 1px; + font: normal 11px arial, tahoma, helvetica, sans-serif; +} + +.ext-ie6 .x-grid3 .x-editor .x-form-text,.ext-ie7 .x-grid3 .x-editor .x-form-text { + top: -1px; +} + +.ext-ie8-compatibility .x-grid3 .x-editor .x-form-text { + top: 0; +} + +.x-grid-panel .x-livegrid-scroller { + z-index: 1; + position: absolute; + right: 0px; + width: 18px; + overflow-y: scroll; + overflow-x: hidden; +} + +.x-grid3-group-checker div { + width: 14px; + height: 18px; + background-position: -1 -2px; + background-repeat: no-repeat; + background-color: transparent; +} + +.x-grid-group-hd .x-grid3-group-check { + background-image: url(../images/default/menu/checked.gif); +} + +.x-grid-group-hd .x-grid3-group-uncheck { + background-image: url(../images/default/menu/unchecked.gif); +} + +.x-grid3-hd-row .x-filtered-column { + font-style: italic !important; + font-weight: bold !important; +} + +.ext-strict .ext-gecko .x-inline-editor .x-small-editor .x-form-text { + height: 18px !important; +} +.x-dd-drag-proxy{ + position:absolute; + left:0; + top:0; + visibility:hidden; + z-index:15000; +} +.x-dd-drag-ghost{ + -moz-opacity: 0.85; + opacity:.85; + filter: alpha(opacity=85); + border: 1px solid; + padding:3px; + padding-left:20px; + white-space:nowrap; +} +.x-dd-drag-repair .x-dd-drag-ghost{ + -moz-opacity: 0.4; + opacity:.4; + filter: alpha(opacity=40); + border:0 none; + padding:0; + background-color:transparent; +} +.x-dd-drag-repair .x-dd-drop-icon{ + visibility:hidden; +} +.x-dd-drop-icon{ + position:absolute; + top:3px; + left:3px; + display:block; + width:16px; + height:16px; + background-color:transparent; + background-position: center; + background-repeat: no-repeat; + z-index:1; +} +.x-view-selector { + position:absolute; + left:0; + top:0; + width:0; + border:1px dotted; + opacity: .5; + -moz-opacity: .5; + filter:alpha(opacity=50); + zoom:1; +} + +.x-dd-cursor { + cursor: default !important; +} + +.x-insert-bar { + position: absolute; + + z-index: 99999; +} + +.x-insert-bar td { + line-height: 1px; + font-size: 1px; +} + +.x-insert-left { + background: url(../images/gxt/dd/insert-bg.gif) no-repeat; +} + +.x-insert-mid { + background: url(../images/gxt/dd/insert-bg.gif) repeat-x 0 -12px; +} + +.x-insert-right { + background: url(../images/gxt/dd/insert-bg.gif) no-repeat 0px -6px; +} +.tree-folder { + background: url(../images/gxt/icons/folder-closed.gif) no-repeat center + left !important; +} + +.tree-folder-open { + background: url(../images/gxt/icons/folder.gif) no-repeat center left + !important; +} + +.my-tree { + cursor: default; + font-size: 11px; + -moz-outline: none; + -moz-user-focus: none; +} + +.my-root-item { + padding: 4px; +} + +.my-tree-item,.my-tree-item table,.my-tree-item table td { + -moz-outline: none; + -moz-user-focus: normal; + outline: 0 none; + font-size: 11px; +} + +.my-tree-item td { + height: 19px; +} + +.my-tree-indent { + line-height: 1px; + font-size: 1px; +} + +.my-tree-joint div { + width: 15px; + height: 19px; + line-height: 1px; + font-size: 1px; +} + +.my-tree-left,.my-tree-left div,.my-tree-right { + line-height: 1px; + font-size: 1px; + width: 3px; +} + +.my-tree-left div,.my-tree-right div { + width: 3px; +} + +.my-tree-item,.my-treeitem-wrap { + -moz-outline: none; + -moz-user-focus: normal; + outline: 0 none; +} + +.my-tree-check div { + width: 17px; + height: 17px; + line-height: 1px; + font-size: 1px; +} + +.my-tree-icon div { + width: 16px; + height: 17px; + cursor: pointer; + background-repeat: no-repeat; + background-position: center; +} + +.my-tree-item-text span { + font-family: arial, tahoma, helvetica, sans-serif; + font-size: 12px; + white-space: nowrap; + padding-left: 3px; + padding-right: 3px; + display: block; + height: 15px; + cursor: pointer; +} + +.my-tree-over .my-tree-left { + background: url(../images/gxt/shared/select-19-bg.gif) no-repeat left + -57px; +} + +.my-tree-over .my-tree-right { + background: url(../images/gxt/shared/select-19-bg.gif) no-repeat right + -76px; +} + +.my-tree-over .my-tree-check,.my-tree-over .my-tree-icon,.my-tree-over .my-tree-item-text + { + background: url(../images/gxt/shared/select-19-bg.gif) left -95px; +} + +.my-tree-sel .my-tree-left { + background: url(../images/gxt/shared/select-19-bg.gif) no-repeat left + 0px; +} + +.my-tree-sel .my-tree-right { + background: url(../images/gxt/shared/select-19-bg.gif) no-repeat right + -19px; +} + +.my-tree-sel .my-tree-check,.my-tree-sel .my-tree-icon,.my-tree-sel .my-tree-item-text + { + background: url(../images/gxt/shared/select-19-bg.gif) left -38px; +} + +.my-tree-drop .my-tree-left { + background: url(../images/gxt/shared/select-19-bg.gif) no-repeat left + -115px; +} + +.my-tree-drop .my-tree-right { + background: url(../images/gxt/shared/select-19-bg.gif) no-repeat right + -133px; +} + +.my-tree-drop .my-tree-check,.my-tree-drop .my-tree-icon,.my-tree-drop .my-tree-item-text + { + background: url(../images/gxt/shared/select-19-bg.gif) left -152px; +} + +.my-tree-close { + background: url(../images/gxt/tree/vnode_transparent.gif) no-repeat 0px + 1px; +} + +.my-tree-open { + background: url(../images/gxt/tree/vnode_transparent.gif) no-repeat 0px + -32px; +} + +.my-tree-joint-over .my-tree-open { + background: url(../images/gxt/tree/vnode_transparent.gif) no-repeat 0px + -48px; +} + +.my-tree-joint-over .my-tree-close { + background: url(../images/gxt/tree/vnode_transparent.gif) no-repeat 0px + -15px; +} + +.my-tree-notchecked { + background: url(../images/gxt/tree/notchecked.gif) no-repeat 0px 50%; +} + +.my-tree-checked { + background: url(../images/gxt/tree/checked.gif) no-repeat 0px 50%; +} + +.my-tree-loading .tree-folder { + background: url(../images/gxt/icons/wait.gif) no-repeat 0px -1px + !important; +} + +.my-tree-loading .my-tree-item-text span { + font-style: italic; +} + +.x-ftree-selected .x-ftree-text { + background-color: #d9e8fb; +} + +.x-ftree-node-over .x-ftree-text { + background-color: #eee; +} + +.x-ftree-item { + line-height: 18px; +} + +.x-ftree-joint,.x-ftree-icon { + border: 0 none; + height: 18px; + margin: 0; + padding: 0; + vertical-align: top; + width: 16px; + background-position: center; + background-repeat: no-repeat; +} + +.x-ftree-text { + color: black; + font: normal 11px arial, tahoma, helvetica, sans-serif; + white-space: nowrap; + text-decoration: none; + color: black; + padding-left: 4px; + vertical-align: middle; + line-height: 18px; + padding: 2px 4px 4px 4px; +} + +/* some default icons for leaf/folder */ +.x-ftree-expanded .x-ftree-icon { + background-image: url(../images/default/tree/folder-open.gif); +} + +.x-ftree-leaf .x-ftree-icon { + background-image: url(../images/default/tree/leaf.gif); +} + +.x-ftree-collapsed .x-ftree-icon { + background-image: url(../images/gxt/icons/folder-closed.gif); +} + +/* Arrows */ +.x-ftree-arrows .x-ftree-joint { + background: transparent; +} + +.x-ftree-arrows .x-ftree-joint-plus { + background: transparent url(../images/default/tree/arrows.gif) no-repeat + 0 0; +} + +.x-ftree-arrows .x-ftree-joint-minus { + background: transparent url(../images/default/tree/arrows.gif) no-repeat + -16px 0; +} + +.x-ftree-arrows .x-ftree-ec-over .x-ftree-joint-plus { + background-position: -32px 0; +} + +.x-ftree-arrows .x-ftree-ec-over .x-ftree-joint-minus { + background-position: -48px 0; +} + +.x-ftree2-highlightrow { + border: 1px dotted #545352; +} + +.x-ftree2-selected { + background-color: #d9e8fb !important; +} + +.x-ftree2-node-over { + background-color: #eee; +} + +.x-ftree2-node-drop { + background-color: #defadc; +} + +.x-ftree2-joint,.x-ftree2-icon { + border: 0 none; + height: 18px; + margin: 0; + padding: 0; + vertical-align: top; + width: 16px; + background-position: center; + background-repeat: no-repeat; +} + +.x-ftree2-joint div { + width: 16px; +} + +.x-ftree2-el-ct { + display: none; +} + +.x-ftree2-node { + padding-bottom: 1px; +} + +.x-ftree2-text { + vertical-align: middle !important; + white-space: nowrap !important; +} + +.x-ftree2-text span { + color: black; + font: normal 11px arial, tahoma, helvetica, sans-serif; + white-space: nowrap; + text-decoration: none; + color: black; + padding: 2px 4px 2px 1px; + display: block; +} + +.ext-ie .x-ftree2-text span { + padding-left: 3px; +} + +.x-ftree2-check { + width: 17px; +} + +.x-ftree2-check div { + width: 17px; + height: 17px; +} + +/* some default icons for leaf/folder */ +.x-ftree2-expanded .x-ftree2-icon { + background-image: url(../images/default/tree/folder-open.gif); +} + +.x-ftree2-leaf .x-ftree2-icon { + background-image: url(../images/default/tree/leaf.gif); +} + +.x-ftree2-collapsed .x-ftree2-icon { + background-image: url(../images/gxt/icons/folder-closed.gif); +} + +/* Arrows */ +.x-ftree2-arrows .x-ftree2-joint { + background: transparent; +} + +.x-ftree2-arrows .x-ftree2-joint-plus { + background: transparent url(../images/default/tree/arrows.gif) no-repeat + 0 0; +} + +.x-ftree2-arrows .x-ftree2-joint-minus { + background: transparent url(../images/default/tree/arrows.gif) no-repeat + -16px 0; +} + +.x-ftree2-arrows .x-ftree2-ec-over .x-ftree2-joint-plus { + background-position: -32px 0; +} + +.x-ftree2-arrows .x-ftree2-ec-over .x-ftree2-joint-minus { + background-position: -48px 0; +} + +.x-treegrid { + -moz-outline: none; + -moz-user-focus: none; + outline: 0 none; +} + +.x-treegrid .x-treegrid-column .x-grid3-cell-inner { + padding: 0px !important; +} + +.x-tree3 { + cursor: default; + -moz-outline: none; + -moz-user-focus: none; + outline: 0 none; +} + +.ext-strict .ext-gecko .x-tree3, .ext-strict .ext-webkit .x-tree3 { + padding-bottom: 1px; +} + +.x-tree3-node { + cursor: default; +} + +.x-tree3-el { + white-space: nowrap; + height: 21px; + position: relative; +} + +.x-tree3-node-text { + white-space: nowrap; + line-height: 11px; + text-decoration: none; + padding: 0 0 0 3px; + position: relative; + top: -4px; +} + +.x-tree3-node-ct { + display: none; +} + +.x-tree3-node-text-widget { + position: static !important; + padding: 0px !important; +}.x-date-picker { + border: 1px solid; + border-top:0 none; + position:relative; + -moz-outline:0 none; + outline:0 none; +} +.x-date-picker a { + -moz-outline:0 none; + outline:0 none; +} +.x-date-inner, .x-date-inner td, .x-date-inner th{ + border-collapse:separate; +} +.x-date-middle,.x-date-left,.x-date-right { + background: repeat-x 0 -83px; + overflow:hidden; +} +.x-date-middle .x-btn-tc,.x-date-middle .x-btn-tl,.x-date-middle .x-btn-tr, +.x-date-middle .x-btn-mc,.x-date-middle .x-btn-ml,.x-date-middle .x-btn-mr, +.x-date-middle .x-btn-bc,.x-date-middle .x-btn-bl,.x-date-middle .x-btn-br{ + background:transparent !important; + vertical-align:middle; +} +.x-date-middle .x-btn-mc em.x-btn-arrow { + background:transparent no-repeat right 0; +} +.x-date-right, .x-date-left { + width:18px; +} +.x-date-right{ + text-align:right; +} +.x-date-middle { + padding-top:2px; + padding-bottom:2px; + width:130px; +} +.x-date-right a, .x-date-left a{ + display:block; + width:16px; + height:16px; + background-position: center; + background-repeat: no-repeat; + cursor:pointer; + -moz-opacity: 0.6; + opacity:.6; + filter: alpha(opacity=60); +} +.x-date-right a:hover, .x-date-left a:hover{ + -moz-opacity: 1; + opacity:1; + filter: alpha(opacity=100); +} +.x-date-right a { + margin-right:2px; + text-decoration:none !important; +} +.x-date-left a{ + margin-left:2px; + text-decoration:none !important; +} +table.x-date-inner { + width:100%; + table-layout:fixed; +} +.x-date-inner th { + width:25px; +} +.x-date-inner th { + background: repeat-x left top; + text-align:right !important; + border-bottom: 1px solid; + cursor:default; + padding:0; + border-collapse:separate; +} +.x-date-inner th span { + display:block; + padding:2px; + padding-right:7px; +} +.x-date-inner td { + border: 1px solid; + text-align:right; + padding:0; +} +.x-date-inner a { + padding:2px 5px; + display:block; + text-decoration:none; + text-align:right; + zoom:1; +} +.x-date-inner .x-date-active{ + cursor:pointer; + color:black; +} +.x-date-inner .x-date-selected a{ + background: repeat-x left top; + border:1px solid; + padding:1px 4px; +} +.x-date-inner .x-date-today a{ + border: 1px solid; + padding:1px 4px; +} +.x-date-inner .x-date-prevday a,.x-date-inner .x-date-nextday a { + text-decoration:none !important; +} +.x-date-bottom { + padding:4px; + border-top: 1px solid; + background: repeat-x left top; +} +.x-date-inner a:hover, .x-date-inner .x-date-disabled a:hover{ + text-decoration:none !important; +} +.x-date-inner .x-date-disabled a { + cursor:default; +} +.x-date-mmenu .x-menu-item { + padding:1px 24px 1px 4px; + white-space: nowrap; +} +.x-date-mmenu .x-menu-item .x-menu-item-icon { + width:10px; + height:10px; + margin-right:5px; + background-position:center -4px !important; +} +.x-date-mp { + position:absolute; + left:0; + top:0; + display:none; +} +.x-date-mp td { + padding:2px; + font:normal 11px arial, helvetica,tahoma,sans-serif; +} +td.x-date-mp-month,td.x-date-mp-year,td.x-date-mp-ybtn { + border: 0 none; + text-align:center; + vertical-align: middle; + width:25%; +} +.x-date-mp-ok { + margin-right:3px; +} +.x-date-mp-btns button { + text-decoration:none; + text-align:center; + text-decoration:none !important; + border:1px solid; + padding:1px 3px 1px; + cursor:pointer; +} +.x-date-mp-btns { + background: repeat-x left top; +} +.x-date-mp-btns td { + border-top: 1px solid; + text-align:center; +} +td.x-date-mp-month a,td.x-date-mp-year a { + display:block; + padding:2px 4px; + text-decoration:none; + text-align:center; +} +td.x-date-mp-month a:hover,td.x-date-mp-year a:hover { + text-decoration:none; + cursor:pointer; +} +td.x-date-mp-sel a { + padding:1px 3px; + background: repeat-x left top; + border:1px solid; +} +.x-date-mp-ybtn a { + overflow:hidden; + width:15px; + height:15px; + cursor:pointer; + background:transparent no-repeat; + display:block; + margin:0 auto; +} +.x-date-mp-ybtn a.x-date-mp-next { + background-position:0 -120px; +} +.x-date-mp-ybtn a.x-date-mp-next:hover { + background-position:-15px -120px; +} +.x-date-mp-ybtn a.x-date-mp-prev { + background-position:0 -105px; +} +.x-date-mp-ybtn a.x-date-mp-prev:hover { + background-position:-15px -105px; +} +.x-date-mp-ybtn { + text-align:center; +} +td.x-date-mp-sep { + border-right:1px solid; +} + +.x-date-picker, .x-date-picker a { + font-size: 11px; +} + +.x-date-right-icon { + background-image: url(../images/default/shared/right-btn.gif); + margin-right: 2px; + text-decoration: none !important; +} + +.x-date-left-icon { + background-image: url(../images/default/shared/left-btn.gif); + margin-left: 4px; + text-decoration: none !important; +} + +.x-date-days { + table-layout: fixed; + width: 100%; +} + +.x-date-days td { + width: 25px; + border: none; +} + +.x-date-days td span { + display: block; + padding: 2px 7px 2px 2px; +} + +.x-date-days td { + background: #DFECFB url(../images/default/shared/glass-bg.gif) repeat-x scroll left top; + border-bottom: 1px solid #A3BAD9; + border-collapse: separate; + color: #233D6D; + cursor: default; + font-family: arial, helvetica, tahoma, sans-serif; + font-size: 10px; + font-size-adjust: none; + font-stretch: normal; + font-style: normal; + font-variant: normal; + font-weight: normal; + line-height: normal; + padding: 0pt; + text-align: right !important; +} + +.x-date-picker .x-date-header { + background: url(../images/default/shared/hd-sprite.gif) repeat-x 0 -83px; + height: 22px; + left: 10px; + top: 10px; + width: 157px; +} + +.x-date-header .x-btn .x-btn-text { + color: #fff; +} + +.x-date-picker-footer { + width: 100%; +} + +.x-date-picker-footer td { + text-align: center; +} + +.x-date-left { + background: transparent url(../images/default/shared/hd-sprite.gif) repeat-x scroll 0pt -83px; + color: #FFFFFF; + font-family: "sans serif", tahoma, verdana, helvetica; + font-size: 11px; + font-size-adjust: none; + font-stretch: normal; + font-style: normal; + font-variant: normal; + font-weight: bold; + line-height: normal; + overflow: hidden; +} + +.x-date-inner .x-date-active-hover { + background: #ddecfe !important; +}.x-tip{ + position: absolute; + top: 0; + left:0; + visibility: hidden; + z-index: 20000; + border:0 none; +} +.x-tip .x-tip-close{ + height: 15px; + float:right; + width: 15px; + margin:0 0 2px 2px; + cursor:pointer; + display:none; +} +.x-tip .x-tip-tc { + background: transparent no-repeat 0 -62px; + padding-top:3px; + overflow:hidden; + zoom:1; +} +.x-tip .x-tip-tl { + background: transparent no-repeat 0 0; + padding-left:6px; + overflow:hidden; + zoom:1; +} +.x-tip .x-tip-tr { + background: transparent no-repeat right 0; + padding-right:6px; + overflow:hidden; + zoom:1; +} +.x-tip .x-tip-bc { + background: transparent no-repeat 0 -121px; + height:3px; + overflow:hidden; +} +.x-tip .x-tip-bl { + background: transparent no-repeat 0 -59px; + padding-left:6px; + zoom:1; +} +.x-tip .x-tip-br { + background: transparent no-repeat right -59px; + padding-right:6px; + zoom:1; +} +.x-tip .x-tip-mc { + border:0 none; +} +.x-tip .x-tip-ml { + background: no-repeat 0 -124px; + padding-left:6px; + zoom:1; +} +.x-tip .x-tip-mr { + background: transparent no-repeat right -124px; + padding-right:6px; + zoom:1; +} +.ext-ie .x-tip .x-tip-header,.ext-ie .x-tip .x-tip-tc { + font-size:0; + line-height:0; +} +.ext-border-box .x-tip .x-tip-header,.ext-border-box .ext-ie .x-tip .x-tip-tc { + line-height:1px; +} +.x-tip .x-tip-header-text { + padding:0; + margin:0 0 2px 0; +} +.x-tip .x-tip-body { + margin:0 !important; + line-height:14px; + padding:0; +} +.x-tip .x-tip-body .loading-indicator { + margin:0; +} +.x-tip-draggable .x-tip-header,.x-tip-draggable .x-tip-header-text { + cursor:move; +} +.x-form-invalid-tip .x-tip-tc { + background: repeat-x 0 -12px; + padding-top:6px; +} +.x-form-invalid-tip .x-tip-bc { + background: repeat-x 0 -18px; + height:6px; +} +.x-form-invalid-tip .x-tip-bl { + background: no-repeat 0 -6px; +} +.x-form-invalid-tip .x-tip-br { + background: no-repeat right -6px; +} +.x-form-invalid-tip .x-tip-body { + padding:2px; +} +.x-form-invalid-tip .x-tip-body { + padding-left:24px; + background:transparent no-repeat 2px 2px; +} +.x-tip-anchor { + position: absolute; + width: 9px; + height: 10px; + overflow:hidden; + background: transparent no-repeat 0 0; + zoom:1; +} +.x-tip-anchor-bottom { + background-position: -9px 0; +} +.x-tip-anchor-right { + background-position: -18px 0; + width: 10px; +} +.x-tip-anchor-left { + background-position: -28px 0; + width: 10px; +} +.x-menu { + border: 1px solid; + z-index: 15000; + zoom: 1; + background: repeat-y; + -moz-outline: none; + outline: 0 none; +} + +.x-menu a { + text-decoration: none !important; +} + +.ext-ie .x-menu { + zoom: 1; + overflow: hidden; +} + +.x-menu-list { + padding: 2px; + background: transparent; + border: 0 none; + overflow: hidden; + overflow-y: hidden; +} + +.ext-strict .ext-ie .x-menu-list { + position: relative; +} + +.x-menu x-menu-sep-li { + font-size: 1px; + line-height: 1px; +} + +.x-menu-list-item { + white-space: nowrap; + display: block; + padding: 1px; +} + +.x-menu-item { + -moz-user-select: none; + -khtml-user-select: none; + -webkit-user-select: ignore +} + +.x-menu-item-arrow { + background: transparent no-repeat right; +} + +.x-menu-sep { + display: block; + font-size: 1px; + line-height: 1px; + margin: 2px 3px; + border-bottom: 1px solid; + overflow: hidden; +} + +.x-menu-focus { + position: absolute; + left: -1px; + top: -1px; + width: 1px; + height: 1px; + line-height: 1px; + font-size: 1px; + -moz-outline: 0 none; + outline: 0 none; + -moz-user-select: none; + -khtml-user-select: none; + -webkit-user-select: ignore + overflow: hidden; + display: block; +} + +a.x-menu-item { + cursor: pointer; + display: block; + line-height: 16px; + outline-color: -moz-use-text-color; + outline-style: none; + outline-width: 0; + padding: 3px 21px 3px 27px; + position: relative; + text-decoration: none; + white-space: nowrap; +} + +.x-menu-item-active { + border-style: solid; + border-width: 1px; + padding: 0; +} + +.x-menu-item-icon { + border: 0 none; + height: 16px; + padding: 0; + vertical-align: top; + width: 16px; + position: absolute; + left: 3px; + top: 3px; + margin: 0; + background-position: center; +} + +.ext-ie .x-menu-item-icon { + left: -24px; +} + +.ext-strict .x-menu-item-icon { + left: 3px; +} + +.ext-ie6 .x-menu-item-icon { + left: -24px; +} + +.ext-ie .x-menu-item-icon { + vertical-align: middle; +} + +.x-date-menu .x-menu-list { + padding: 0; +} + +.x-menu-date-item { + padding: 0; +} + +.x-menu .x-color-palette,.x-menu .x-date-picker { + margin-left: 26px; + margin-right: 4px; +} + +.x-menu .x-date-picker { + border: 1px solid; + margin-top: 2px; + margin-bottom: 2px; +} + +.x-menu-plain .x-color-palette,.x-menu-plain .x-date-picker { + margin: 0; + border: 0 none; +} + +.x-date-menu { + padding: 0 !important; +} + +.x-cycle-menu .x-menu-item-checked { + border: 1px dotted !important; + padding: 0; +} + +.x-menu .x-menu-scroller { + width: 100%; + background-repeat: no-repeat; + background-position: center; + height: 8px; + line-height: 8px; + cursor: pointer; + margin: 0; + padding: 0; +} + +.x-menu .x-menu-scroller-active { + height: 6px; + line-height: 6px; +} + +.x-menu-list-item-indent { + padding-left: 27px !important; +} + +.x-menu-text { + + border-style: solid; + background: #D6E3F2; + border-color:#DAE6F4 #99bbe8 #99bbe8 #DAE6F4; + border-width: 1px; + margin:-2px -2px 0; + color:#15428b; + font:bold 10px tahoma,arial,verdana,sans-serif; + display:block; + padding:3px; +} + +.x-menubar { + padding: 3px; + border-style: solid; + border-width: 0 0 1px 0; + cursor: default; + border-color: #a9bfd3; + background-color: #d0def0; + padding: 3px; + background-image: url(../images/default/toolbar/bg.gif); +} + +.x-menubar-item { + padding: 1px 8px; + font: 12px arial, verdana, sans-serif; +} + +.x-menubar-item-over { + background-color: #98c5f5; +} + +.x-menubar-item-active { + background-color: #98c5f5; +}.x-box-tl { + background: transparent no-repeat 0 0; + zoom:1; +} +.x-box-tc { + height: 8px; + background: transparent repeat-x 0 0; + overflow: hidden; +} +.x-box-tr { + background: transparent no-repeat right -8px; +} +.x-box-ml { + background: transparent repeat-y 0; + padding-left: 4px; + overflow: hidden; + zoom:1; +} +.x-box-mc { + background: repeat-x 0 -16px; + padding: 4px 10px; +} +.x-box-mc h3 { + margin: 0 0 4px 0; + zoom:1; +} +.x-box-mr { + background: transparent repeat-y right; + padding-right: 4px; + overflow: hidden; +} +.x-box-bl { + background: transparent no-repeat 0 -16px; + zoom:1; +} +.x-box-bc { + background: transparent repeat-x 0 -8px; + height: 8px; + overflow: hidden; +} +.x-box-br { + background: transparent no-repeat right -24px; +} +.x-box-tl, .x-box-bl { + padding-left: 8px; + overflow: hidden; +} +.x-box-tr, .x-box-br { + padding-right: 8px; + overflow: hidden; +} +.x-combo-list { + border:1px solid; + zoom:1; + overflow:hidden; + position: absolute; +} +.x-combo-list-inner { + overflow:auto; + position:relative; + zoom:1; + overflow-x:hidden; +} +.x-combo-list-hd { + border-bottom:1px solid; + padding:3px; +} +.x-resizable-pinned .x-combo-list-inner { + border-bottom:1px solid; +} +.x-combo-list-item { + padding:2px; + border:1px solid; + white-space: nowrap; + overflow:hidden; + text-overflow: ellipsis; +} +.x-combo-list .x-combo-selected{ + border:1px dotted !important; + cursor:pointer; +} +.x-combo-list .x-toolbar { + border-top:1px solid; + border-bottom:0 none; +} +.x-panel { + border-style: solid; + border-width:0; + outline: 0 none; +} +.x-panel-header { + overflow:hidden; + zoom:1; + padding:5px 3px 4px 5px; + border:1px solid; + line-height: 15px; + background: transparent repeat-x 0 -1px; +} +.x-panel-body { + border:1px solid; + border-top:0 none; + overflow:hidden; + position: relative; +} +.x-panel-bbar .x-toolbar, .x-panel-tbar .x-toolbar { + border:1px solid; + border-top:0 none; + overflow:hidden; + padding:2px; +} +.x-panel-tbar-noheader .x-toolbar, .x-panel-mc .x-panel-tbar .x-toolbar { + border-top:1px solid; + border-bottom: 0 none; +} +.x-panel-body-noheader, .x-panel-mc .x-panel-body { + border-top:1px solid; +} +.x-panel-header { + overflow:hidden; + zoom:1; +} +.x-panel-tl .x-panel-header { + padding:5px 0 4px 0; + border:0 none; + background:transparent; + line-height: 15px; +} +.x-panel-tl .x-panel-icon, .x-window-tl .x-panel-icon { + padding-left:20px !important; + background-repeat:no-repeat; + background-position:0 4px; + zoom:1; +} +.x-panel-inline-icon { + width:16px; + height:16px; + background-repeat:no-repeat; + background-position:0 0; + vertical-align:middle; + margin-right:4px; + margin-top:-1px; + margin-bottom:-1px; +} +.x-panel-tc { + background: transparent repeat-x 0 0; + overflow:hidden; +} +.ext-strict .ext-ie7 .x-panel-tc { + overflow: visible; +} +.x-panel-tl { + background: transparent no-repeat 0 0; + padding-left:6px; + zoom:1; + border-bottom:1px solid; +} +.x-panel-tr { + background: transparent no-repeat right 0; + zoom:1; + padding-right:6px; +} +.x-panel-bc { + background: transparent repeat-x 0 bottom; + zoom:1; +} +.x-panel-bc .x-panel-footer { + zoom:1; +} +.x-panel-bl { + background: transparent no-repeat 0 bottom; + padding-left:6px; + zoom:1; +} +.x-panel-br { + background: transparent no-repeat right bottom; + padding-right:6px; + zoom:1; +} +.x-panel-mc { + border:0 none; + padding:0; + margin:0; + padding-top:6px; +} +.x-panel-mc .x-panel-body { + background:transparent; + border: 0 none; +} +.x-panel-ml { + background: repeat-y 0 0; + padding-left:6px; + zoom:1; +} +.x-panel-mr { + background: transparent repeat-y right 0; + padding-right:6px; + zoom:1; +} +.x-panel-bc .x-panel-footer { + padding-bottom:6px; +} +.x-panel-nofooter .x-panel-bc, .x-panel-nofooter .x-window-bc { + height:6px; + font-size:0; + line-height:0; +} +.x-panel-bwrap { + overflow:hidden; + zoom:1; + left:0; + top:0; +} +.x-panel-body { + overflow:hidden; + zoom:1; +} +.x-panel-collapsed .x-resizable-handle{ + display:none; +} +.ext-gecko .x-panel-animated * { + overflow:hidden !important; +} +.x-plain-body { + overflow:hidden; +} +.x-plain-bbar .x-toolbar { + overflow:hidden; + padding:2px; +} +.x-plain-tbar .x-toolbar { + overflow:hidden; + padding:2px; +} +.x-plain-bwrap { + overflow:hidden; + zoom:1; +} +.x-plain { + overflow:hidden; +} +.x-tool { + overflow:hidden; + width:15px; + height:15px; + float:right; + cursor:pointer; + background:transparent no-repeat; + margin-left:2px; +} +.x-tool-toggle { + background-position:0 -60px; +} +.x-tool-toggle-over { + background-position:-15px -60px; +} +.x-panel-collapsed .x-tool-toggle { + background-position:0 -75px; +} +.x-panel-collapsed .x-tool-toggle-over { + background-position:-15px -75px; +} +.x-tool-close { + background-position:0 -0; +} +.x-tool-close-over { + background-position:-15px 0; +} +.x-tool-minimize { + background-position:0 -15px; +} +.x-tool-minimize-over { + background-position:-15px -15px; +} +.x-tool-maximize { + background-position:0 -30px; +} +.x-tool-maximize-over { + background-position:-15px -30px; +} +.x-tool-restore { + background-position:0 -45px; +} +.x-tool-restore-over { + background-position:-15px -45px; +} +.x-tool-gear { + background-position:0 -90px; +} +.x-tool-gear-over { + background-position:-15px -90px; +} +.x-tool-pin { + background-position:0 -135px; +} +.x-tool-pin-over { + background-position:-15px -135px; +} +.x-tool-unpin { + background-position:0 -150px; +} +.x-tool-unpin-over { + background-position:-15px -150px; +} +.x-tool-right { + background-position:0 -165px; +} +.x-tool-right-over { + background-position:-15px -165px; +} +.x-tool-left { + background-position:0 -180px; +} +.x-tool-left-over { + background-position:-15px -180px; +} +.x-tool-up { + background-position:0 -210px; +} +.x-tool-up-over { + background-position:-15px -210px; +} +.x-tool-down { + background-position:0 -195px; +} +.x-tool-down-over { + background-position:-15px -195px; +} +.x-tool-refresh { + background-position:0 -225px; +} +.x-tool-refresh-over { + background-position:-15px -225px; +} +.x-tool-minus { + background-position:0 -255px; +} +.x-tool-minus-over { + background-position:-15px -255px; +} +.x-tool-plus { + background-position:0 -240px; +} +.x-tool-plus-over { + background-position:-15px -240px; +} +.x-tool-search { + background-position:0 -270px; +} +.x-tool-search-over { + background-position:-15px -270px; +} +.x-tool-save { + background-position:0 -285px; +} +.x-tool-save-over { + background-position:-15px -285px; +} +.x-tool-help { + background-position:0 -300px; +} +.x-tool-help-over { + background-position:-15px -300px; +} +.x-tool-print { + background-position:0 -315px; +} +.x-tool-print-over { + background-position:-15px -315px; +} +.x-panel-ghost { + z-index:12000; + overflow:hidden; + position:absolute; + left:0;top:0; + opacity:.65; + -moz-opacity:.65; + filter:alpha(opacity=65); +} +.x-panel-ghost ul { + margin:0; + padding:0; + overflow:hidden; + font-size:0; + line-height:0; + border:1px solid; + border-top:0 none; + display:block; +} +.x-panel-ghost * { + cursor:move !important; +} +.x-panel-dd-spacer { + border:2px dashed; +} +.x-panel-btns { + padding:5px; + overflow:hidden; +} +.x-panel-btns-left .x-buttonbar { + clear:none; +} +.x-panel-btns-center{ + text-align:center; +} +.x-panel-btns-center .x-toolbar-ct { + margin:0 auto; + text-align:left; + width:auto; +} +.x-panel-fbar td.x-toolbar-cell{ + padding:0px; +} +.x-panel-fbar { + display: block; + padding:2px; + position:relative; + left:0; + top:0; + zoom:1; + overflow:hidden; +} + +.x-panel-fbar .x-toolbar-cell { + vertical-align:middle; +} + +.x-panel-fbar td { + vertical-align:middle; +} +.x-panel-btns .x-btn-focus .x-btn-left{ + background-position:0 -147px; +} +.x-panel-btns .x-btn-focus .x-btn-right{ + background-position:0 -168px; +} +.x-panel-btns .x-btn-focus .x-btn-center{ + background-position:0 -189px; +} +.x-panel-btns .x-btn-over .x-btn-left{ + background-position:0 -63px; +} +.x-panel-btns .x-btn-over .x-btn-right{ + background-position:0 -84px; +} +.x-panel-btns .x-btn-over .x-btn-center{ + background-position:0 -105px; +} +.x-panel-btns .x-btn-click .x-btn-center{ + background-position:0 -126px; +} +.x-panel-btns .x-btn-click .x-btn-right{ + background-position:0 -84px; +} +.x-panel-btns .x-btn-click .x-btn-left{ + background-position:0 -63px; +} +.x-panel-fbar td,.x-panel-fbar span,.x-panel-fbar input,.x-panel-fbar div,.x-panel-fbar select,.x-panel-fbar label{ + white-space: nowrap; +} +.x-window { + zoom:1; + -moz-outline: none; + outline: 0 none; +} +.x-window .x-resizable-handle { + opacity:0; + -moz-opacity:0; + filter:alpha(opacity=0); +} +.x-window-proxy { + border:1px solid; + z-index:12000; + overflow:hidden; + position:absolute; + left:0;top:0; + display:none; + opacity:.5; + -moz-opacity:.5; + filter:alpha(opacity=50); +} +.x-window-header { + overflow:hidden; + zoom:1; +} +.x-window-bwrap { + z-index:1; + position:relative; + zoom:1; + left:0;top:0; +} +.x-window-tl .x-window-header { + padding:5px 0 4px 0; +} +.x-window-header-text { + cursor:pointer; +} +.x-window-tc { + background: transparent repeat-x 0 0; + overflow:hidden; + zoom:1; +} +.x-window-tl { + background: transparent no-repeat 0 0; + padding-left:6px; + zoom:1; + z-index:1; + position:relative; +} +.x-window-tr { + background: transparent no-repeat right 0; + padding-right:6px; +} +.x-window-bc { + background: transparent repeat-x 0 bottom; + zoom:1; +} +.x-window-bc .x-window-footer { + padding-bottom:6px; + zoom:1; + font-size:0; + line-height:0; +} +.x-window-bl { + background: transparent no-repeat 0 bottom; + padding-left:6px; + zoom:1; +} +.x-window-br { + background: transparent no-repeat right bottom; + padding-right:6px; + zoom:1; +} +.x-window-mc { + border:1px solid; + padding:0; + margin:0; +} +.x-window-ml { + background: transparent repeat-y 0 0; + padding-left:6px; + zoom:1; +} +.x-window-mr { + background: transparent repeat-y right 0; + padding-right:6px; + zoom:1; +} +.x-window-body { + overflow:hidden; +} +.x-window-bwrap { + overflow:hidden; +} +.x-window-maximized .x-window-bl, .x-window-maximized .x-window-br, + .x-window-maximized .x-window-ml, .x-window-maximized .x-window-mr, + .x-window-maximized .x-window-tl, .x-window-maximized .x-window-tr { + padding:0; +} +.x-window-maximized .x-window-footer { + padding-bottom:0; +} +.x-window-maximized .x-window-tc { + padding-left:3px; + padding-right:3px; +} +.x-window-maximized .x-window-mc { + border-left:0 none; + border-right:0 none; +} +.x-window-tbar .x-toolbar, .x-window-bbar .x-toolbar { + border-left:0 none; + border-right: 0 none; +} +.x-window-bbar .x-toolbar { + border-top:1px solid; + border-bottom:0 none; +} +.x-window-draggable, .x-window-draggable .x-window-header-text { + cursor:move; +} +.x-window-maximized .x-window-draggable, .x-window-maximized .x-window-draggable .x-window-header-text { + cursor:default; +} +.x-window-body { + background:transparent; +} +.x-panel-ghost .x-window-tl { + border-bottom:1px solid; +} +.x-panel-collapsed .x-window-tl { + border-bottom:1px solid; +} +.x-window-maximized-ct { + overflow:hidden; +} +.x-window-sizing-ghost ul { + border:0 none !important; +} +.x-dlg-focus{ + -moz-outline:0 none; + outline:0 none; + width:0; + height:0; + overflow:hidden; + position:absolute; + top:0; + left:0; +} +.x-dlg-mask{ + z-index:10000; + display:none; + position:absolute; + top:0; + left:0; + -moz-opacity: 0.5; + opacity:.50; + filter: alpha(opacity=50); +} +body.ext-ie6.x-body-masked select { + visibility:hidden; +} +body.ext-ie6.x-body-masked .x-window select { + visibility:visible; +} +.x-window-plain .x-window-mc { + border: 1px solid; +} +.x-window-plain .x-window-body { + border: 1px solid; + background:transparent !important; +} +.x-html-editor-wrap { + border:1px solid; +} + +.x-html-editor-tb .x-btn-text { + background:transparent no-repeat; +} + +.x-html-editor-tip .x-tip-bd .x-tip-bd-inner { + padding:5px; + padding-bottom:1px; +} + +.x-html-editor-tb .x-toolbar { + position:static !important; +}.x-panel-noborder .x-panel-body-noborder { + border-width:0; +} +.x-panel-noborder .x-panel-header-noborder { + border-width:0 0 1px; + border-style:solid; +} +.x-panel-noborder .x-panel-tbar-noborder .x-toolbar { + border-width:0 0 1px; + border-style:solid; +} +.x-panel-noborder .x-panel-bbar-noborder .x-toolbar { + border-width:1px 0 0 0; + border-style:solid; +} +.x-window-noborder .x-window-mc { + border-width:0; +} +.x-window-plain .x-window-body-noborder { + border-width:0; +} +.x-tab-panel-noborder .x-tab-panel-body-noborder { + border-width:0; +} +.x-tab-panel-noborder .x-tab-panel-header-noborder { + border-width: 0 0 1px 0; +} +.x-tab-panel-noborder .x-tab-panel-footer-noborder { + border-width: 1px 0 0 0; +} +.x-tab-panel-bbar-noborder .x-toolbar { + border-width: 1px 0 0 0; + border-style:solid; +} +.x-tab-panel-tbar-noborder .x-toolbar { + border-width:0 0 1px; + border-style:solid; +} +.x-border-panel { + position:absolute !important; + left:0; + top:0; +} +.x-tool-collapse-south { + background-position:0 -195px; +} +.x-tool-collapse-south-over { + background-position:-15px -195px; +} +.x-tool-collapse-north { + background-position:0 -210px; +} +.x-tool-collapse-north-over { + background-position:-15px -210px; +} +.x-tool-collapse-west { + background-position:0 -180px; +} +.x-tool-collapse-west-over { + background-position:-15px -180px; +} +.x-tool-collapse-east { + background-position:0 -165px; +} +.x-tool-collapse-east-over { + background-position:-15px -165px; +} +.x-tool-expand-south { + background-position:0 -210px; +} +.x-tool-expand-south-over { + background-position:-15px -210px; +} +.x-tool-expand-north { + background-position:0 -195px; +} +.x-tool-expand-north-over { + background-position:-15px -195px; +} +.x-tool-expand-west { + background-position:0 -165px; +} +.x-tool-expand-west-over { + background-position:-15px -165px; +} +.x-tool-expand-east { + background-position:0 -180px; +} +.x-tool-expand-east-over { + background-position:-15px -180px; +} +.x-tool-expand-north, .x-tool-expand-south { + float:right; + margin:3px; +} +.x-tool-expand-east, .x-tool-expand-west { + float:none; + margin:3px auto; +} +.x-accordion-hd .x-tool-toggle { + background-position:0 -255px; +} +.x-accordion-hd .x-tool-toggle-over { + background-position:-15px -255px; +} +.x-panel-collapsed .x-accordion-hd .x-tool-toggle { + background-position:0 -240px; +} +.x-panel-collapsed .x-accordion-hd .x-tool-toggle-over { + background-position:-15px -240px; +} +.x-accordion-hd { + padding-top:4px; + padding-bottom:3px; + border-top:0 none; + background: transparent repeat-x 0 -9px; +} +.x-layout-collapsed{ + position:absolute; + left:-10000px; + top:-10000px; + visibility:hidden; + width:20px; + height:20px; + overflow:hidden; + border:1px solid; + z-index:20; +} +.ext-border-box .x-layout-collapsed{ + width:22px; + height:22px; +} +.x-layout-collapsed-over{ + cursor:pointer; +} +.x-layout-collapsed-west .x-layout-collapsed-tools, .x-layout-collapsed-east .x-layout-collapsed-tools{ + position:absolute; + top:0; + left:0; + width:20px; + height:20px; +} +.x-layout-split{ + position:absolute; + height:5px; + width:5px; + line-height:1px; + font-size:1px; + z-index:3; + background-color:transparent; +} +.ext-strict .ext-ie6 .x-layout-split{ + background-color: #fff !important; + filter: alpha(opacity=1); +} +.x-layout-split-h{ + background-image:url(../images/default/s.gif); + background-position: left; +} +.x-layout-split-v{ + background-image:url(../images/default/s.gif); + background-position: top; +} +.x-column-layout-ct { + overflow:hidden; + zoom:1; +} +.x-column { + float:left; + padding:0; + margin:0; + overflow:hidden; + zoom:1; +} +.x-column-inner { + overflow:hidden; + zoom:1; +} +.x-layout-mini { + position:absolute; + top:0; + left:0; + display:block; + width:5px; + height:35px; + cursor:pointer; + opacity:.5; + -moz-opacity:.5; + filter:alpha(opacity=50); +} +.x-layout-mini-over, .x-layout-collapsed-over .x-layout-mini{ + opacity:1; + -moz-opacity:1; + filter:none; +} +.x-layout-split-west .x-layout-mini { + top:48%; +} +.x-layout-split-east .x-layout-mini { + top:48%; +} +.x-layout-split-north .x-layout-mini { + left:48%; + height:5px; + width:35px; +} +.x-layout-split-south .x-layout-mini { + left:48%; + height:5px; + width:35px; +} +.x-layout-cmini-west .x-layout-mini { + top:48%; +} +.x-layout-cmini-east .x-layout-mini { + top:48%; +} +.x-layout-cmini-north .x-layout-mini { + left:48%; + height:5px; + width:35px; +} +.x-layout-cmini-south .x-layout-mini { + left:48%; + height:5px; + width:35px; +} +.x-layout-cmini-west, .x-layout-cmini-east { + border:0 none; + width:5px !important; + padding:0; + background:transparent; +} +.x-layout-cmini-north, .x-layout-cmini-south { + border:0 none; + height:5px !important; + padding:0; + background:transparent; +} +.x-viewport, .x-viewport body { + margin: 0; + padding: 0; + border: 0 none; + overflow: hidden; + height: 100%; +} +.x-abs-layout-item { + position:absolute !important; + left:0; + top:0; +} +.x-abs-layout-container { + position:relative; +} +.ext-ie input.x-abs-layout-item, .ext-ie textarea.x-abs-layout-item { + margin:0; +} +.x-box-layout-ct { + overflow:hidden; + zoom:1; +} +.x-box-inner { + overflow:hidden; + zoom:1; + position:relative; + left:0; + top:0; +} +.x-box-item { + position:absolute !important; + left:0; + top:0; +} +.x-border-layout-ct { + position: relative; +} +.x-progress-wrap { + border:1px solid; + overflow:hidden; +} +.x-progress-inner { + height:18px; + background:repeat-x; + position:relative; +} +.x-progress-bar { + height:18px; + float:left; + width:0; + background: repeat-x left center; + border-top:1px solid; + border-bottom:1px solid; + border-right:1px solid; +} +.x-progress-text { + padding:1px 5px; + overflow:hidden; + position:absolute; + left:0; + text-align:center; +} +.x-progress-text-back { + line-height:16px; +} +.ext-ie .x-progress-text-back { + line-height:15px; +} +.x-slider { + zoom:1; + -moz-outline: none; + outline: 0 none; +} +.x-slider-thumb { + line-height: 0px; + font-size: 0px; + position: absolute; + background:transparent no-repeat 0 0; +} +.x-slider-inner { + position:relative; + left:0; + top:0; + overflow:visible; + zoom:1; +} +.x-slider-focus { + position:absolute; + left:0; + top:0; + width:1px; + height:1px; + line-height:1px; + font-size:1px; + -moz-outline:0 none; + outline:0 none; + -moz-user-select: none; + -khtml-user-select: none; + -webkit-user-select: ignore + display:block; + overflow:hidden; +} +.x-slider-horz { + padding-left:7px; + background:transparent no-repeat 0 -22px; +} +.x-slider-horz .x-slider-end { + padding-right:7px; + zoom:1; + background:transparent no-repeat right -44px; +} +.x-slider-horz .x-slider-inner { + background:transparent repeat-x 0 0; + height:22px; +} +.x-slider-horz .x-slider-thumb { + width:14px; + height:15px; + left:0; + top:3px; +} +.x-slider-horz .x-slider-thumb-over { + background-position: -14px -15px; +} +.x-slider-horz .x-slider-thumb-drag { + background-position: -28px -30px; +} +.x-slider-vert { + padding-top:7px; + background:transparent no-repeat -44px 0; + width:22px; +} +.x-slider-vert .x-slider-end { + padding-bottom:7px; + zoom:1; + background:transparent no-repeat -22px bottom; +} +.x-slider-vert .x-slider-inner { + background:transparent repeat-y 0 0; +} +.x-slider-vert .x-slider-thumb { + width:15px; + height:14px; + left:3px; + bottom:0; +} +.x-slider-vert .x-slider-thumb-over { + background-position: -15px -14px; +} +.x-slider-vert .x-slider-thumb-drag { + background-position: -30px -28px; +} +.x-window-dlg .x-window-body { + border:0 none !important; + padding:5px 10px; + overflow:hidden !important; +} +.x-window-dlg .x-window-mc { + border:0 none !important; +} +.x-window-dlg .ext-mb-input { + margin-top:4px; + width:95%; +} +.x-window-dlg .ext-mb-textarea { + margin-top:4px; +} +.x-window-dlg .x-progress-wrap { + margin-top:4px; +} +.ext-ie .x-window-dlg .x-progress-wrap { + margin-top:6px; +} +.x-window-dlg .x-msg-box-wait { + background:transparent no-repeat left; + display:block; + width:300px; + padding-left:18px; + line-height:18px; +} +.x-window-dlg .ext-mb-icon { + float:left; + width:47px; + height:32px; +} +.ext-ie .x-window-dlg .ext-mb-icon { + width:44px; +} +.x-window-dlg .x-dlg-icon .ext-mb-content{ + zoom: 1; margin-left: 47px; +} +.x-window-dlg .ext-mb-info, .x-window-dlg .ext-mb-warning, .x-window-dlg .ext-mb-question, .x-window-dlg .ext-mb-error { + background:transparent no-repeat top left; +} +.ext-gecko2 .ext-mb-fix-cursor { + overflow:auto; +} +.arrow-top { + background: url(../images/gxt/icons/top2.gif) no-repeat center left !important; +} +.arrow-bottom { + background: url(../images/gxt/icons/bottom2.gif) no-repeat center left !important; +} +.arrow-up { + background: url(../images/gxt/icons/up2.gif) no-repeat center left !important; +} +.arrow-down { + background: url(../images/gxt/icons/down2.gif) no-repeat center left !important; +} +.arrow-left { + background: url(../images/gxt/icons/left2.gif) no-repeat center left !important; +} +.arrow-double-left { + background: url(../images/gxt/icons/doubleleft2.gif) no-repeat center left !important; +} +.arrow-right { + background: url(../images/gxt/icons/right2.gif) no-repeat center left !important; +} +.arrow-double-right { + background: url(../images/gxt/icons/doubleright2.gif) no-repeat center left !important; +} +.x-info { + border-style: solid; + border-color: #99bbe8; + border-width: 0; + z-index: 99999999; +} + +.x-info-header { + overflow: hidden; + zoom: 1; + color: black; + font: bold 13px tahoma, arial, verdana, sans-serif; + padding: 5px 3px 4px 5px; + line-height: 15px; + background: transparent url(../images/default/panel/white-top-bottom.gif) repeat-x 0 -1px; +} + +.x-info-body { + border-top: 0 none; + overflow: hidden; + background: white; + position: relative; /* added for item scroll positioning */ +} + +.x-info-header { + overflow: hidden; + zoom: 1; +} + +.x-info-tl .x-info-header { + color: #555555; + font-family: tahoma, arial, sans-serif; + font-size: 13px; + font-size-adjust: none; + font-stretch: normal; + font-style: normal; + font-variant: normal; + font-weight: bold; + line-height: normal; + padding: 5px 0 4px 0; + border: 0 none; + background: transparent; +} + +.x-info-tl .x-info-icon,.x-window-tl .x-info-icon { + padding-left: 20px !important; + background-repeat: no-repeat; + background-position: 0 4px; + zoom: 1; +} + +.x-info-inline-icon { + width: 16px; + height: 16px; + background-repeat: no-repeat; + background-position: 0 0; + vertical-align: middle; + margin-right: 4px; + margin-top: -1px; + margin-bottom: -1px; +} + +.x-info-tc { + background: transparent url(../images/gxt/info/top-bottom.gif) repeat-x 0 0; + overflow: hidden; +} + +/* fix ie7 strict mode bug */ +.ext-ie7 .x-info-tc { + overflow: visible; +} + +.x-info-tl { + background: transparent url(../images/gxt/info/corners-sprite.gif) no-repeat 0 0; + padding-left: 6px; + zoom: 1; +} + +.x-info-tr { + background: transparent url(../images/gxt/info/corners-sprite.gif) no-repeat right 0; + zoom: 1; + padding-right: 6px; +} + +.x-info-bc { + background: transparent url(../images/default/panel/top-bottom.gif) repeat-x 0 bottom; + zoom: 1; + font-size: 0px; +} + +.x-info-bc .x-info-footer { + zoom: 1; +} + +.x-info-bl { + background: transparent url(../images/default/panel/corners-sprite.gif) no-repeat 0 bottom; + padding-left: 6px; + zoom: 1; +} + +.x-info-br { + background: transparent url(../images/default/panel/corners-sprite.gif) no-repeat right bottom; + padding-right: 6px; + zoom: 1; +} + +.x-info-mc { + border: 0 none; + padding: 0; + margin: 0; + font: normal 11px tahoma, arial, helvetica, sans-serif; + background: #dfe8f6; +} + +.x-info-mc .x-info-body { + background: transparent; + border: 0 none; +} + +.x-info-ml { + background: #fff url(../images/default/panel/left-right.gif) repeat-y 0 0; + padding-left: 6px; + zoom: 1; +} + +.x-info-mr { + background: transparent url(../images/default/panel/left-right.gif) repeat-y right 0; + padding-right: 6px; + zoom: 1; +} + +.x-info-bc .x-info-footer { + padding-bottom: 6px; +} + +.x-info-nofooter .x-info-bc,.x-panel-nofooter .x-info-bc { + height: 6px; + font-size: 0; + line-height: 0; +} + +.x-info-bwrap { + overflow: hidden; + zoom: 1; +} + +.x-info-body { + overflow: hidden; + zoom: 1; + color: #555555; + font-family: tahoma, arial, sans-serif; + font-size: 12px; + font-size-adjust: none; + font-style: normal; + font-variant: normal; + font-weight: normal; +}.x-combo-over { + border: 1px dotted #B5B4B4 !important; + background: #F1F1F1; + cursor: pointer; +} + +.my-list { + border: 1px solid #99BBE8; + -moz-outline: none; + outline: 0 none; + -moz-user-focus: normal; + background-color: white; + font-family: "Myriad Pro", "Myriad Web", "Tahoma", "Helvetica", "Arial", sans-serif; +} + +.my-list-notchecked { + background: url(../images/gxt/tree/notchecked.gif) no-repeat 0px 0px !important; + margin: 3px 0pt 0pt 0px; +} + +.my-list-checked { + background: url(../images/gxt/tree/checked.gif) no-repeat 0px 0px !important; + margin: 3px 0pt 0pt 0px; +} + +.ext-ie .my-list-notchecked { + margin: 2px 0pt 0pt 0px; +} + +.ext-ie .my-list-checked { + margin: 2px 0pt 0pt 0px; +} + +.my-list-flat { + border: 1px solid #6593cf; + -moz-outline: none; + outline: 0 none; + -moz-user-focus: normal; + background-color: white; + cursor: default; +} + +.my-list-item { + cursor: pointer; + -moz-outline: none; + outline: 0 none; + -moz-user-focus: normal; +} + +.my-list-flat .my-list-item { + height: 19px; + border: 1px solid white; +} + +.my-list-flat .my-list-item-over { + background-color: #F1F1F1; + border: 1px dotted #B5B4B4; +} + +.my-list-flat .my-list-item-sel { + background-color: #DFE8F6; + border: 1px dotted #9EB8ED; +} + +.my-list-flat .my-list-item-over .my-list-item-l { + background: none; +} + +.my-list-flat .my-list-item-over .my-list-item-icon,.my-list-flat .my-list-item-over .my-list-item-ml,.my-list-flat .my-list-item-over .my-list-item-c + { + background: none; +} + +.my-list-flat .my-list-item-over .my-list-item-r { + background: none; +} + +.my-list-flat .my-list-item-sel .my-list-item-l { + background: none; +} + +.my-list-flat .my-list-item-sel .my-list-item-icon,.my-list-flat .my-list-item-sel .my-list-item-ml,.my-list-flat .my-list-item-sel .my-list-item-c + { + background: none; +} + +.my-list-flat .my-list-item-sel .my-list-item-r { + background: none; +} + +.my-list-item-text { + font-size: 11px; + padding-top: 3px; + padding-left: 2px; + white-space: nowrap; + overflow: hidden; + line-height: 19px; +} + +.my-list-item-l div { + width: 5px; +} + +.my-list-item-ml { + width: 18px; +} + +.my-list-item-c { + width: 100%; +} + +.my-list-item-r div { + width: 3px; +} + +.my-list-item-over .my-list-item-l { + background: url(../images/gxt/shared/select-19-bg.gif) no-repeat left -57px; +} + +.my-list-item-over .my-list-item-icon,.my-list-item-over .my-list-item-check,.my-list-item-over .my-list-item-c + { + background: url(../images/gxt/shared/select-19-bg.gif) repeat-x left -95px; +} + +.my-list-item-over .my-list-item-r { + background: url(../images/gxt/shared/select-19-bg.gif) no-repeat right -76px; +} + +.my-list-item-sel .my-list-item-l { + background: url(../images/gxt/shared/select-19-bg.gif) no-repeat left 0px; +} + +.my-list-item-sel .my-list-item-icon,.my-list-item-sel .my-list-item-check,.my-list-item-sel .my-list-item-c + { + background: url(../images/gxt/shared/select-19-bg.gif) left -38px; +} + +.my-list-item-sel .my-list-item-r { + background: url(../images/gxt/shared/select-19-bg.gif) no-repeat right -19px; +}.x-view { + -moz-outline: none; + -moz-user-focus: normal; + outline: 0 none; + background-color: white; + cursor: default; + border: 1px solid #98C0F4; + overflow: auto; + padding: 0px; + zoom: 1; +} + +.x-view-item { + border: 1px solid #FFFFFF; + font-family: tahoma, arial, helvetica, sans-serif; + font-size: 12px; + font-size-adjust: none; + font-stretch: normal; + font-style: normal; + font-variant: normal; + font-weight: normal; + line-height: normal; + overflow: hidden; + padding: 2px; + white-space: nowrap; +} + +.x-view-highlightrow { + border: 1px dotted #545352 !important; +} + +.x-view-item-over { + background: #efefef url(../images/default/grid/row-over.gif) repeat-x left top; + border: 1px dotted #dddddd !important; + cursor: pointer; +} + +.x-view-item-sel { + background: #DFE8F6 none repeat scroll 0%; + border: 1px dotted #A3BAE9 !important; + cursor: pointer; +} +.x-view-item-check { + padding: 0px; +} +.x-view-item-check td { + font-family: tahoma, arial, helvetica, sans-serif; + font-size: 12px; + font-size-adjust: none; + font-stretch: normal; + font-style: normal; + font-variant: normal; + font-weight: normal; + line-height: normal; + white-space: nowrap; + vertical-align: middle; + padding-left: 1px; +} + +.x-splitbar-shim { + filter: alpha(opacity = 1); + opacity: 0; + position: absolute; + width: 100%; + height: 100%; + z-index: 10; + background-color: white; + -moz-user-select: none; + -khtml-user-select: none; + user-select: none; + -moz-outline: none; + -moz-user-focus: normal; + outline: 0 none; +} + +.x-vsplitbar { + background: url(../images/default/s.gif); + position: absolute; + z-index: 3; + cursor: e-resize; + cursor: col-resize; +} + +.x-hsplitbar { + background: url(../images/default/s.gif); + position: absolute; + font-size: 1px; + line-height: 1px; + z-index: 3; + cursor: s-resize; + cursor: row-resize; +} + +.x-splitbar-proxy { + position: absolute; + background-color: #929090; + font-size: 1px; + line-height: 1px; + z-index: 200; +} + +.my-splitbar-shim { + filter: alpha(opacity = 1); + opacity: 0; + position: absolute; + width: 100%; + height: 100%; + z-index: 10; + background-color: white; + -moz-user-select: none; + -khtml-user-select: none; + user-select: none; + -moz-outline: none; + -moz-user-focus: normal; + outline: 0 none; +} + +.my-splitbar-transparent { + background: none; + font-size: 1px; + line-height: 1px; + z-index: 2000; +} + +.my-splitbar-proxy { + position: absolute; + background-color: #929090; + font-size: 1px; + line-height: 1px; + z-index: 200; +}.x-status { + padding: 0 4px; + height: 21px; + line-height: 21px !important; + cursor: default; +} +.x-status .x-status-text{ + padding: 2px; + line-height: 21px !important; +} +.x-status-icon { + padding-left: 25px !important; + background: transparent no-repeat left center; +} +.x-status-busy { + background-image: url(../images/default/grid/loading.gif); +} +.x-status-text-panel { + border: 1px solid; + border-color: #99bbe8 #fff #fff #99bbe8; +} +.my-tbl { + border: 1px solid #99BBE8; + cursor: default; + background-color: white; + overflow: hidden; + -moz-outline: none; + -moz-user-focus: normal; + outline: 0 none; + font-family: arial, tahoma, helvetica, sans-serif; + font-size: 11px; + table-layout: fixed; +} + +.my-tbl-col-overflow { + overflow: hidden; +} + +.ext-ie .my-tbl-col-overflow { + +} + +.my-tbl-col-text { + color: black; + padding: 5px 4px 0 4px; + display: block; + white-space: nowrap; + font-family: arial, tahoma, helvetica, sans-serif; + font-size: 11px; +} + +.my-tbl-col { + border-right: 1px solid #D5D5D5; + background: url(../images/gxt/table/vs-column-bg.gif) repeat-x; +} + +.my-tbl-col-splitter { + position: absolute; + top: 0; + width: 6px; + z-index: 100; + height: 100%; + right: 0px; +} + +.my-tbl-col-over { + background: url(../images/gxt/table/vs-column-bg.gif) repeat-x 0px -24px; +} + +.my-tbl-col-sort { + background-position: 0px -48px; +} + +.my-icon-asc { + background-image: url(../images/gxt/icons/hmenu-asc.gif) !important; +} + +.my-icon-desc { + background-image: url(../images/gxt/icons/hmenu-desc.gif) !important; +} + +.my-tbl-col-asc { + background: url(../images/gxt/table/vsort-asc.gif) no-repeat 50% top; +} + +.my-tbl-col-desc { + background: url(../images/gxt/table/vsort-desc.gif) no-repeat 50% top; +} + +.my-tbl-col-splitter { + background: none; +} + +.my-tbl-data { + background-color: white; + overflow: hidden; + -moz-outline: none; + -moz-user-focus: normal; + outline: 0 none; +} + +.my-tbl-item { + border-top: 1px solid white; + border-bottom: 1px solid white; + border-bottom: 1px solid #EDEDED; + cursor: default; + -moz-outline: none; + -moz-user-focus: normal; + outline: 0 none; +} + +.my-tbl-item table { + -moz-outline: none; + -moz-user-focus: normal; + table-layout: fixed; + outline: 0 none; +} + +.my-tbl-data .my-tbl-item-cell { + -moz-outline: none; + -moz-user-focus: normal; + outline: 0 none; +} + +.my-tbl-item td { + -moz-user-select: none; + -moz-outline: none; + -moz-user-focus: normal; + outline: 0 none; +} + +.my-tbl-vlines .my-tbl-data .my-tbl-item-cell-overflow { + border-right: 1px solid #EDEDED; +} + +.my-tbl-data .my-tbl-item-cell-overflow { + white-space: nowrap; + overflow: hidden; + -moz-outline: none; + -moz-user-focus: normal; + outline: 0 none; +} + +.my-tbl-data .my-tbl-item-cell-text { + padding: 3px 4px; + font-family: arial, tahoma, helvetica, sans-serif; + font-size: 11px; + -moz-outline: none; + -moz-user-focus: normal; + outline: 0 none; +} + +.my-tbl-data .my-tbl-item-cell-widget { + padding: 1px 4px; +} + +.my-tbl-data tr { + overflow: hidden; +} + +.my-tbl-item-over { + border-top: 1px solid #dddddd; + border-bottom: 1px solid #dddddd; + background: #efefef url(../images/default/grid/row-over.gif) repeat-x left top; +} + +.my-tbl-item-sel { + background-image: none !important; + background-color: #D9E1ED !important; + border-top: 1px dotted #9EB8ED !important; + border-bottom: 1px dotted #9EB8ED !important; +} + +.ext-ie .my-tbl TD .x-form-text { + POSITION: static; + TOP: 0px; +}.tree-folder { + background: url(../images/gxt/icons/folder-closed.gif) no-repeat -1px -1px; +} + +.tree-folder-open { + background: url(../images/gxt/icons/folder.gif) no-repeat -1px -1px; +} + +.my-treetbl-tree { + cursor: default; +} + +.my-treetblitem,.my-treetblitem table,.my-treetblitem table td { + -moz-outline: none; + -moz-user-focus: normal; + outline: 0 none; +} + +.my-treetblitem td { + height: 19px; +} + +.my-treetbl-indent { + line-height: 1px; + font-size: 1px; +} + +.my-treetbl-joint div { + width: 15px; + height: 19px; + line-height: 1px; + font-size: 1px; +} + +.my-treetbl-left,.my-treetbl-left div,.my-treetbl-right { + line-height: 1px; + font-size: 1px; + width: 3px; +} + +.my-treetbl-left div,.my-treetbl-right div { + width: 3px; +} + +.my-treetbl-check div { + width: 17px; + height: 19px; + line-height: 1px; + font-size: 1px; + display: block; +} + +.my-treetbl-icon div { + width: 16px; + height: 16px; + margin-top: 1px; + cursor: pointer; + background-repeat: no-repeat; + background-position: center; +} + +.my-ie .my-treetbl-icon { + padding-top: 2px; +} + +.my-ie .my-treetbl-icon div { + position: static; +} + +.my-treetbl-item-text span { + font-family: arial, tahoma, helvetica, sans-serif; + font-size: 12px; + white-space: nowrap; + padding-left: 3px; + padding-right: 3px; + display: block; + height: 15px; + cursor: pointer; +} + +.my-treetbl-over .my-treetbl-left { + background: url(../images/gxt/shared/select-19-bg.gif) no-repeat left -57px; +} + +.my-treetbl-over .my-treetbl-right { + background: url(../images/gxt/shared/select-19-bg.gif) no-repeat right -76px; +} + +.my-treetbl-over .my-treetbl-check,.my-treetbl-over .my-treetbl-icon,.my-treetbl-over .my-treetbl-item-text + { + background: url(../images/gxt/shared/select-19-bg.gif) left -95px; +} + +.my-treetbl-sel .my-treetbl-left { + background: url(../images/gxt/shared/select-19-bg.gif) no-repeat left 0px; +} + +.my-treetbl-sel .my-treetbl-right { + background: url(../images/gxt/shared/select-19-bg.gif) no-repeat right -19px; +} + +.my-treetbl-sel .my-treetbl-check,.my-treetbl-sel .my-treetbl-icon,.my-treetbl-sel .my-treetbl-item-text + { + background: url(../images/gxt/shared/select-19-bg.gif) left -38px; +} + +.my-treetbl-close { + background: url(../images/gxt/tree/vnode_transparent.gif) no-repeat 0px 1px; +} + +.my-treetbl-open { + background: url(../images/gxt/tree/vnode_transparent.gif) no-repeat 0px -32px; +} + +.my-treetbl-joint-over .my-treetbl-open { + background: url(../images/gxt/tree/vnode_transparent.gif) no-repeat 0px -48px; +} + +.my-treetbl-joint-over .my-treetbl-close { + background: url(../images/gxt/tree/vnode_transparent.gif) no-repeat 0px -15px; +} + +.my-treetbl-notchecked { + background: url(../images/gxt/tree/notchecked.gif) no-repeat 0px 50%; +} + +.my-treetbl-checked { + background: url(../images/gxt/tree/checked.gif) no-repeat 0px 50%; +} + +.my-treetbl-loading .tree-folder { + background: url(../images/gxt/icons/wait.gif) no-repeat 0px -1px; +} + +.my-treetbl-loading .my-treetbl-item-text span { + font-style: italic; +} + +.my-treetbl { + border: 1px solid #99BBE8; + cursor: default; + background-color: white; + overflow: hidden; + -moz-outline: none; + -moz-user-focus: normal; + outline: 0 none; +} + +.my-treetbl-col-overflow { + overflow: hidden; + -moz-outline: none; + -moz-user-focus: normal; + outline: 0 none; +} + +.my-treetbl-col-text { + color: black; + padding: 5px 4px 0 4px; + display: block; + white-space: nowrap; + font-family: arial, tahoma, helvetica, sans-serif; + font-size: 12px; +} + +.my-treetbl-col { + border-right: 1px solid #D5D5D5; + background: url(../images/gxt/table/vs-column-bg.gif) repeat-x; +} + +.my-treetbl-col-splitter { + position: absolute; + top: 0; + width: 6px; + z-index: 100; + height: 100%; + right: 0px; +} + +.my-treetbl-col-over { + background: url(../images/gxt/table/vs-column-bg.gif) repeat-x 0px -24px; +} + +.my-treetbl-col-sort { + background-position: 0px -48px; +} + +.my-treetbl-col-asc { + background: url(../images/gxt/table/vsort-asc.gif) no-repeat 50% top; +} + +.my-treetbl-col-desc { + background: url(../images/gxt/table/vsort-desc.gif) no-repeat 50% top; +} + +.my-treetbl-col-splitter { + background: none; +} + +.my-treetbl-data { + background-color: white; + overflow: hidden; +} + +.my-treetbl-data .my-treetbl-cell { + height: 20px; + -moz-outline: none; + -moz-user-focus: normal; + outline: 0 none; +} + +.my-treetbl-data .my-treetbl-cell-overflow { + white-space: nowrap; + overflow: hidden; +} + +.my-treetbl-data .my-treetbl-cell-text { + padding: 0px 0px; + font-family: arial, tahoma, helvetica, sans-serif; + font-size: 12px; +} + +.my-treetbl-data tr { + overflow: hidden; +} + +.my-treetbl-item { + border-top: 1px solid white; + border-bottom: 1px solid white; + border-bottom: 1px solid #EDEDED; + cursor: default; + -moz-outline: none; + -moz-user-focus: normal; + outline: 0 none; +} + +.my-treetbl-item-over { + border-top: 1px solid #dddddd; + border-bottom: 1px solid #dddddd; + background: #efefef url(../images/default/grid/row-over.gif) repeat-x left top; +} + +.my-treetbl-item-sel { + background-image: none; + background-color: #D9E1ED; + border-top: 1px dotted #9EB8ED; + border-bottom: 1px dotted #9EB8ED; +} + +.my-treetbl .x-grid3-td-numberer { + background: transparent url(../images/gxt/tree/tree-table-special-col.gif) repeat-y + scroll left center; + height: 19px; + line-height: normal; + padding-left: 0px; + margin-left: 0px; +} + +.x-grid3-td-numberer div { + font-size: 11px; + font-family: "segoe ui", tahoma, arial, sans-serif; + color: #444444; + padding: 3px 0px 0 5px !important; +} + +.ext-ie .my-treetbl .x-grid3-td-numberer { + height: 20px; +} + +.my-treetbl-item-sel .x-grid3-td-numberer { + background: transparent url(../images/gxt/tree/tree-table-special-col-sel.gif) repeat-y + scroll left center; +}.ext-el-mask { + background-color: #ccc; +} +.ext-el-mask-msg { + border-color:#6593cf; + background-color:#c3daf9; + background-image:url(../images/default/box/tb-blue.gif); +} +.ext-el-mask-msg div { + background-color: white; + border-color:#a3bad9; + color:#222; + font:normal 11px tahoma, arial, helvetica, sans-serif; +} +.x-mask-loading div { + background-color:#fbfbfb; + background-image:url(../images/default/grid/loading.gif); +} +.x-item-disabled { + color: gray; +} +.x-item-disabled * { + color: gray !important; +} +.x-splitbar-proxy { + background-color: #aaa; +} +.x-color-palette a { + border-color:#fff; +} +.x-color-palette a.x-color-palette-hover, .x-color-palette a.x-color-palette-sel { + border-color:#8bb8f3; + background-color: #deecfd; +} +.x-color-palette em { + border-color:#aca899; +} +.x-ie-shadow { + background-color:#777; +} +.x-shadow .xsmc { + background-image: url(../images/default/shadow-c.png); +} +.x-shadow .xsml, .x-shadow .xsmr { + background-image: url(../images/default/shadow-lr.png); +} +.x-shadow .xstl, .x-shadow .xstc, .x-shadow .xstr, .x-shadow .xsbl, .x-shadow .xsbc, .x-shadow .xsbr{ + background-image: url(../images/default/shadow.png); +} +.loading-indicator { + font-size: 11px; + background-image: url(../images/default/grid/loading.gif); +} +.x-spotlight { + background-color: #ccc; +} +.x-aria-focusframe-side { + background-color: #15428B; + line-height: 2px; + font-size: 2px; +} +.x-tab-panel-header, .x-tab-panel-footer { + background-color: #deecfd; + border-color:#8db2e3; + overflow:hidden; + zoom:1; +} +.x-tab-panel-header, .x-tab-panel-footer { + border-color:#8db2e3; +} +ul.x-tab-strip-top{ + background-color:#cedff5; + background-image: url(../images/default/tabs/tab-strip-bg.gif); + border-bottom-color:#8db2e3; +} +ul.x-tab-strip-bottom{ + background-color:#cedff5; + background-image: url(../images/default/tabs/tab-strip-btm-bg.gif); + border-top-color:#8db2e3; +} +.x-tab-panel-header-plain .x-tab-strip-spacer, +.x-tab-panel-footer-plain .x-tab-strip-spacer { + border-color:#8db2e3; + background-color: #deecfd; +} +.x-tab-strip span.x-tab-strip-text { + font:normal 11px tahoma,arial,helvetica; + color:#416aa3; +} +.x-tab-strip-over span.x-tab-strip-text { + color:#15428b; +} +.x-tab-strip-active span.x-tab-strip-text { + color:#15428b; + font-weight:bold; +} +.x-tab-strip-disabled .x-tabs-text { + color:#aaaaaa; +} +.x-tab-strip-top .x-tab-right, .x-tab-strip-top .x-tab-left, .x-tab-strip-top .x-tab-strip-inner{ + background-image: url(../images/default/tabs/tabs-sprite.gif); +} +.x-tab-strip-bottom .x-tab-right { + background-image: url(../images/default/tabs/tab-btm-inactive-right-bg.gif); +} +.x-tab-strip-bottom .x-tab-left { + background-image: url(../images/default/tabs/tab-btm-inactive-left-bg.gif); +} +.x-tab-strip-bottom .x-tab-strip-active .x-tab-right { + background-image: url(../images/default/tabs/tab-btm-right-bg.gif); +} +.x-tab-strip-bottom .x-tab-strip-active .x-tab-left { + background-image: url(../images/default/tabs/tab-btm-left-bg.gif); +} +.x-tab-strip .x-tab-strip-closable a.x-tab-strip-close { + background-image:url(../images/default/tabs/tab-close.gif); +} +.x-tab-strip .x-tab-strip-closable a.x-tab-strip-close:hover{ + background-image:url(../images/default/tabs/tab-close.gif); +} +.x-tab-panel-body { + border-color:#8db2e3; + background-color:#fff; +} +.x-tab-panel-body-top { + border-top: 0 none; +} +.x-tab-panel-body-bottom { + border-bottom: 0 none; +} +.x-tab-scroller-left { + background-image:url(../images/default/tabs/scroll-left.gif); + border-bottom-color:#8db2e3; +} +.x-tab-scroller-left-over { + background-position: 0 0; +} +.x-tab-scroller-left-disabled { + background-position: -18px 0; + opacity:.5; + -moz-opacity:.5; + filter:alpha(opacity=50); + cursor:default; +} +.x-tab-scroller-right { + background-image:url(../images/default/tabs/scroll-right.gif); + border-bottom-color:#8db2e3; +} +.x-tab-panel-bbar .x-toolbar, .x-tab-panel-tbar .x-toolbar { + border-color:#99bbe8; +} +.x-form-field { + font: normal 12px tahoma, arial, helvetica, sans-serif; +} + +.x-form-text,textarea.x-form-field { + background-color: #fff; + background-image: url(../images/default/form/text-bg.gif); + border-color: #b5b8c8; +} + +.x-form-select-one { + background-color: #fff; + border-color: #b5b8c8; +} + +.x-form-check-group-label { + border-bottom: 1px solid #99bbe8; + color: #15428b; +} + +.x-editor .x-form-check-wrap { + background-color: #fff; +} + +.x-form-field-wrap .x-form-trigger { + background-image: url(../images/default/form/trigger.gif); + border-bottom-color: #b5b8c8; +} + +.x-form-field-wrap .x-form-date-trigger { + background-image: url(../images/default/form/date-trigger.gif); +} + +.x-form-field-wrap .x-form-clear-trigger { + background-image: url(../images/default/form/clear-trigger.gif); +} + +.x-form-field-wrap .x-form-search-trigger { + background-image: url(../images/default/form/search-trigger.gif); +} + +.x-trigger-wrap-focus .x-form-trigger { + border-bottom-color: #7eadd9; +} + +.x-item-disabled .x-form-trigger-over { + border-bottom-color: #b5b8c8; +} + +.x-item-disabled .x-form-trigger-click { + border-bottom-color: #b5b8c8; +} + +.x-form-focus,textarea.x-form-focus { + border-color: #7eadd9; +} + +.x-form-invalid,textarea.x-form-invalid { + background-color: #fff; + background-image: url(../images/default/grid/invalid_line.gif); + border-color: #c30; +} + +.ext-safari .x-form-invalid { + background-color: #fee; + border-color: #ff7870; +} + +.x-form-inner-invalid,textarea.x-form-inner-invalid { + background-color: #fff; + background-image: url(../images/default/grid/invalid_line.gif); +} + +.x-form-grow-sizer { + font: normal 12px tahoma, arial, helvetica, sans-serif; +} + +.x-form-item { + font: normal 12px tahoma, arial, helvetica, sans-serif; +} + +.x-form-invalid-msg { + color: #c0272b; + font: normal 11px tahoma, arial, helvetica, sans-serif; + background-image: url(../images/default/shared/warning.gif); +} + +.x-form-empty-field { + color: gray; +} + +.x-small-editor .x-form-field { + font: normal 11px arial, tahoma, helvetica, sans-serif; +} + +.ext-safari .x-small-editor .x-form-field { + font: normal 12px arial, tahoma, helvetica, sans-serif; +} + +.x-form-invalid-icon { + background-image: url(../images/default/form/exclamation.gif); +} + +.x-fieldset { + border-color: #b5b8c8; +} + +.x-fieldset legend { + font: bold 11px tahoma, arial, helvetica, sans-serif; + color: #15428b; +} + +.x-editor .x-form-check-wrap { + border-color: #7eadd9; +} + +.x-spinner-field .x-form-spinner-up { + background-image: url('../images/default/form/spinner.gif'); +} +.x-spinner-field .x-form-spinner-down { + background-image: url('../images/default/form/spinner.gif'); +}.x-btn{ + font:normal 11px tahoma, verdana, helvetica; +} +.x-btn button{ + font:normal 11px arial,tahoma,verdana,helvetica; + color:#333; +} +.x-btn em { + font-style:normal; + font-weight:normal; +} +.x-btn-tl, .x-btn-tr, .x-btn-tc, .x-btn-ml, .x-btn-mr, .x-btn-mc, .x-btn-bl, .x-btn-br, .x-btn-bc{ + background-image:url(../images/default/button/btn.gif); +} +.x-btn-click .x-btn-text, .x-btn-menu-active .x-btn-text, .x-btn-pressed .x-btn-text{ + color:#000; +} +.x-btn-disabled *{ + color:gray !important; +} +.x-btn-mc em.x-btn-arrow { + background-image:url(../images/default/button/arrow.gif); +} +.x-btn-mc em.x-btn-split { + background-image:url(../images/default/button/s-arrow.gif); +} +.x-btn-over .x-btn-mc em.x-btn-split, .x-btn-click .x-btn-mc em.x-btn-split, .x-btn-menu-active .x-btn-mc em.x-btn-split, .x-btn-pressed .x-btn-mc em.x-btn-split { + background-image:url(../images/default/button/s-arrow-o.gif); +} +.x-btn-mc em.x-btn-arrow-bottom { + background-image:url(../images/default/button/s-arrow-b-noline.gif); +} +.x-btn-mc em.x-btn-split-bottom { + background-image:url(../images/default/button/s-arrow-b.gif); +} +.x-btn-over .x-btn-mc em.x-btn-split-bottom, .x-btn-click .x-btn-mc em.x-btn-split-bottom, .x-btn-menu-active .x-btn-mc em.x-btn-split-bottom, .x-btn-pressed .x-btn-mc em.x-btn-split-bottom { + background-image:url(../images/default/button/s-arrow-bo.gif); +} +.x-btn-group-header { + color: #3e6aaa; +} +.x-btn-group-tc { + background-image: url(../images/default/button/group-tb.gif); +} +.x-btn-group-tl { + background-image: url(../images/default/button/group-cs.gif); +} +.x-btn-group-tr { + background-image: url(../images/default/button/group-cs.gif); +} +.x-btn-group-bc { + background-image: url(../images/default/button/group-tb.gif); +} +.x-btn-group-bl { + background-image: url(../images/default/button/group-cs.gif); +} +.x-btn-group-br { + background-image: url(../images/default/button/group-cs.gif); +} +.x-btn-group-ml { + background-image: url(../images/default/button/group-lr.gif); +} +.x-btn-group-mr { + background-image: url(../images/default/button/group-lr.gif); +} +.x-btn-group-notitle .x-btn-group-tc { + background-image: url(../images/default/button/group-tb.gif); +} +.x-toolbar { + border-color: #a9bfd3; + background-color: #d0def0; + background-image: url(../images/default/toolbar/bg.gif); +} + +.x-toolbar td,.x-toolbar span,.x-toolbar input,.x-toolbar div,.x-toolbar select,.x-toolbar label { + font: normal 11px arial, tahoma, helvetica, sans-serif; +} + +.x-toolbar .x-item-disabled { + color: gray; +} + +.x-toolbar .x-item-disabled * { + color: gray; +} + +.x-toolbar .x-btn-mc em.x-btn-split { + background-image: url(../images/default/button/s-arrow-noline.gif); +} + +.x-toolbar .x-btn-over .x-btn-mc em.x-btn-split,.x-toolbar .x-btn-click .x-btn-mc em.x-btn-split,.x-toolbar .x-btn-menu-active .x-btn-mc em.x-btn-split,.x-toolbar .x-btn-pressed .x-btn-mc em.x-btn-split + { + background-image: url(../images/default/button/s-arrow-o.gif); +} + +.x-toolbar .x-btn-mc em.x-btn-split-bottom { + background-image: url(../images/default/button/s-arrow-b-noline.gif); +} + +.x-toolbar .x-btn-over .x-btn-mc em.x-btn-split-bottom,.x-toolbar .x-btn-click .x-btn-mc em.x-btn-split-bottom,.x-toolbar .x-btn-menu-active .x-btn-mc em.x-btn-split-bottom,.x-toolbar .x-btn-pressed .x-btn-mc em.x-btn-split-bottom + { + background-image: url(../images/default/button/s-arrow-bo.gif); +} + +.x-toolbar .xtb-sep { + background-image: url(../images/default/grid/grid-blue-split.gif); +} + +.x-tbar-page-first { + background-image: url(../images/default/grid/page-first.gif) !important; +} + +.x-tbar-refresh { + background-image: url(../images/default/grid/refresh.gif) !important; +} + +.x-tbar-page-last { + background-image: url(../images/default/grid/page-last.gif) !important; +} + +.x-tbar-page-next { + background-image: url(../images/default/grid/page-next.gif) !important; +} + +.x-tbar-page-prev { + background-image: url(../images/default/grid/page-prev.gif) !important; +} + +.x-tbar-loading { + background-image: url(../images/default/grid/loading.gif) !important; +} + +.x-item-disabled .x-tbar-page-first { + background-image: url(../images/default/grid/page-first-disabled.gif) !important; +} + +.x-item-disabled .x-tbar-page-last { + background-image: url(../images/default/grid/page-last-disabled.gif) !important; +} + +.x-item-disabled .x-tbar-page-next { + background-image: url(../images/default/grid/page-next-disabled.gif) !important; +} + +.x-item-disabled .x-tbar-page-prev { + background-image: url(../images/default/grid/page-prev-disabled.gif) !important; +} + +.x-paging-info { + color: #444; +} + +.x-toolbar-more-icon { + background-image: url(../images/default/toolbar/more.gif) !important; +}.x-resizable-handle { + background-color:#fff; +} +.x-resizable-over .x-resizable-handle-east, .x-resizable-pinned .x-resizable-handle-east, +.x-resizable-over .x-resizable-handle-west, .x-resizable-pinned .x-resizable-handle-west +{ + background-image:url(../images/default/sizer/e-handle.gif); +} +.x-resizable-over .x-resizable-handle-south, .x-resizable-pinned .x-resizable-handle-south, +.x-resizable-over .x-resizable-handle-north, .x-resizable-pinned .x-resizable-handle-north +{ + background-image:url(../images/default/sizer/s-handle.gif); +} +.x-resizable-over .x-resizable-handle-north, .x-resizable-pinned .x-resizable-handle-north{ + background-image:url(../images/default/sizer/s-handle.gif); +} +.x-resizable-over .x-resizable-handle-southeast, .x-resizable-pinned .x-resizable-handle-southeast{ + background-image:url(../images/default/sizer/se-handle.gif); +} +.x-resizable-over .x-resizable-handle-northwest, .x-resizable-pinned .x-resizable-handle-northwest{ + background-image:url(../images/default/sizer/nw-handle.gif); +} +.x-resizable-over .x-resizable-handle-northeast, .x-resizable-pinned .x-resizable-handle-northeast{ + background-image:url(../images/default/sizer/ne-handle.gif); +} +.x-resizable-over .x-resizable-handle-southwest, .x-resizable-pinned .x-resizable-handle-southwest{ + background-image:url(../images/default/sizer/sw-handle.gif); +} +.x-resizable-proxy{ + border-color:#3b5a82; +} +.x-resizable-overlay{ + background-color:#fff; +} +.x-grid3 { + background-color: #fff; +} + +.x-grid-panel .x-panel-mc .x-panel-body { + border-color: #99bbe8; +} + +.x-grid3-hd-row .x-grid3-hd,.x-grid3-row .x-grid3-cell,.x-grid3-summary-row .x-grid3-cell { + font: normal 11px arial, tahoma, helvetica, sans-serif; +} + +.x-grid3-hd-row .x-grid3-hd { + border-left-color: #eee; + border-right-color: #d0d0d0; +} + +.x-grid-row-loading { + background-color: #fff; + background-image: url(../images/default/shared/loading-balls.gif); +} + +.x-grid3-row { + border-color: #ededed; + border-top-color: #fff; +} + +.x-grid3-row-alt { + background-color: #fafafa; +} + +.x-grid3-row-over { + border-color: #ddd; + background-color: #efefef; + background-image: url(../images/default/grid/row-over.gif); +} + +.x-grid3-resize-proxy { + background-color: #777; +} + +.x-grid3-resize-marker { + background-color: #777; +} + +.x-grid3-header { + background-color: #f9f9f9; + background-image: url(../images/default/grid/grid3-hrow.gif); +} + +.x-grid3-header-pop { + border-left-color: #d0d0d0; +} + +.x-grid3-header-pop-inner { + border-left-color: #eee; + background-image: url(../images/default/grid/hd-pop.gif); +} + +td.x-grid3-hd-over,td.sort-desc,td.sort-asc,td.x-grid3-hd-menu-open { + border-left-color: #aaccf6; + border-right-color: #aaccf6; +} + +td.x-grid3-hd-over .x-grid3-hd-inner,td.sort-desc .x-grid3-hd-inner,td.sort-asc .x-grid3-hd-inner,td.x-grid3-hd-menu-open .x-grid3-hd-inner + { + background-color: #ebf3fd; + background-image: url(../images/default/grid/grid3-hrow-over.gif); +} + +.sort-asc .x-grid3-sort-icon { + background-image: url(../images/default/grid/sort_asc.gif); +} + +.sort-desc .x-grid3-sort-icon { + background-image: url(../images/default/grid/sort_desc.gif); +} + +.x-grid3-cell-text,.x-grid3-hd-text { + color: #000; +} + +.x-grid3-split { + background-image: url(../images/default/grid/grid-split.gif); +} + +.x-grid3-hd-text { + color: #15428b; +} + +.x-dd-drag-proxy .x-grid3-hd-inner { + background-color: #ebf3fd; + background-image: url(../images/default/grid/grid3-hrow-over.gif); + border-color: #aaccf6; +} + +.col-move-top { + background-image: url(../images/default/grid/col-move-top.gif); +} + +.col-move-bottom { + background-image: url(../images/default/grid/col-move-bottom.gif); +} + +.x-grid3-highlightrow { + border: 1px dotted #545352; +} + +.x-grid3-row-selected { + background-image: none !important; + background-color: #dfe8f6 !important; + border-color: #a3bae9; +} + +.x-grid3-cell-selected { + background-color: #b8cfee !important; + color: #000; +} + +.x-grid3-group-selected { + background-color: #b8cfee !important; +} + +.x-grid3-cell-selected span { + color: #000 !important; +} + +.x-grid3-cell-selected .x-grid3-cell-text { + color: #000; +} + +.x-grid3-locked td.x-grid3-row-marker,.x-grid3-locked .x-grid3-row-selected td.x-grid3-row-marker { + background-color: #ebeadb !important; + background-image: url(../images/default/grid/grid-hrow.gif) !important; + color: #000; + border-top-color: #fff; + border-right-color: #6fa0df !important; +} + +.x-grid3-locked td.x-grid3-row-marker div,.x-grid3-locked .x-grid3-row-selected td.x-grid3-row-marker div { + color: #15428b !important; +} + +.x-grid3-dirty-cell { + background-image: url(../images/default/grid/dirty.gif); +} + +.x-grid3-invalid-cell { + background-image: url(../images/default/grid/invalid_line.gif); +} + +.x-grid3-topbar,.x-grid3-bottombar { + font: normal 11px arial, tahoma, helvetica, sans-serif; +} + +.x-grid3-bottombar .x-toolbar { + border-top-color: #a9bfd3; +} + +.x-props-grid .x-grid3-td-name .x-grid3-cell-inner { + background-image: url(../images/default/grid/grid3-special-col-bg.gif) !important; + color: #000 !important; +} + +.x-props-grid .x-grid3-body .x-grid3-td-name { + background-color: #fff !important; + border-right-color: #eee; +} + +.xg-hmenu-sort-asc .x-menu-item-icon { + background-image: url(../images/default/grid/hmenu-asc.gif); +} + +.xg-hmenu-sort-desc .x-menu-item-icon { + background-image: url(../images/default/grid/hmenu-desc.gif); +} + +.xg-hmenu-lock .x-menu-item-icon { + background-image: url(../images/default/grid/hmenu-lock.gif); +} + +.xg-hmenu-unlock .x-menu-item-icon { + background-image: url(../images/default/grid/hmenu-unlock.gif); +} + +.x-grid3-hd-btn { + background-color: #c3daf9; + background-image: url(../images/default/grid/grid3-hd-btn.gif); +} + +.x-grid3-body .x-grid3-td-expander { + background-image: url(../images/default/grid/grid3-special-col-bg.gif); +} + +.x-grid3-row-expander { + background-image: url(../images/default/grid/row-expand-sprite.gif); +} + +.x-grid3-body .x-grid3-td-checker { + background-image: url(../images/default/grid/grid3-special-col-bg.gif); +} + +.x-grid3-row-checker,.x-grid3-hd-checker { + background-image: url(../images/default/grid/row-check-sprite.gif); +} + +.x-grid3-body .x-grid3-td-numberer { + background-image: url(../images/default/grid/grid3-special-col-bg.gif); +} + +.x-grid3-body .x-grid3-td-numberer .x-grid3-cell-inner { + color: #444; +} + +.x-grid3-body .x-grid3-td-row-icon { + background-image: url(../images/default/grid/grid3-special-col-bg.gif); +} + +.x-grid3-body .x-grid3-row-selected .x-grid3-td-numberer,.x-grid3-body .x-grid3-row-selected .x-grid3-td-checker,.x-grid3-body .x-grid3-row-selected .x-grid3-td-expander + { + background-image: url(../images/default/grid/grid3-special-col-sel-bg.gif); +} + +.x-grid3-check-col { + background-image: url(../images/default/menu/unchecked.gif); +} + +.x-grid3-check-col-on { + background-image: url(../images/default/menu/checked.gif); +} + +.x-grid-group,.x-grid-group-body,.x-grid-group-hd { + zoom: 1; +} + +.x-grid-group-hd { + border-bottom-color: #99bbe8; +} + +.x-grid-group-hd .x-grid-group-div { + background-image: url(../images/default/grid/group-expand-sprite.gif); + color: #3764a0; + font: bold 11px tahoma, arial, helvetica, sans-serif; +} + +.x-group-by-icon { + background-image: url(../images/default/grid/group-by.gif); +} + +.x-cols-icon { + background-image: url(../images/default/grid/columns.gif); +} + +.x-show-groups-icon { + background-image: url(../images/default/grid/group-by.gif); +} + +.x-grid-empty { + color: gray; + font: normal 11px tahoma, arial, helvetica, sans-serif; +} + +.x-grid-with-col-lines .x-grid3-row td.x-grid3-cell { + border-right-color: #ededed; +} + +.x-grid-with-col-lines .x-grid3-row-selected { + border-top-color: #a3bae9; +} + +.x-grid3-check-col-disabled { + background-color: transparent; + background-image: url(../images/gxt/menu/disabledcheck.gif); +} + +.x-row-editor-header { + background: transparent url(../images/gxt/grid/row-editor-bg.gif) repeat-x 0 0; +} + +.x-row-editor-footer { + background: transparent url(../images/gxt/grid/row-editor-bg.gif) repeat-x 0 -2px; +} + +.x-row-editor-body { + background: #ebf2fb; +} + +.x-row-editor .x-btns { + background: transparent url(../images/gxt/grid/row-editor-btns.gif) no-repeat 0 0; +} + +.x-row-editor .x-btns .x-plain-bwrap { + background: transparent url(../images/gxt/grid/row-editor-btns.gif) no-repeat right -31px; +} + +.x-row-editor .x-btns .x-plain-body { + background: transparent url(../images/gxt/grid/row-editor-btns.gif) repeat-x 0 -62px; +} + +.x-inserted-row { + background-color: #f7f9cc +}.x-dd-drag-ghost{ + color:#000; + font: normal 11px arial, helvetica, sans-serif; + border-color: #ddd #bbb #bbb #ddd; + background-color:#fff; +} +.x-dd-drop-nodrop .x-dd-drop-icon{ + background-image: url(../images/default/dd/drop-no.gif); +} +.x-dd-drop-ok .x-dd-drop-icon{ + background-image: url(../images/default/dd/drop-yes.gif); +} +.x-dd-drop-ok-add .x-dd-drop-icon{ + background-image: url(../images/default/dd/drop-add.gif); +} +.x-view-selector { + background-color:#c3daf9; + border-color:#3399bb; +} +.x-tree-drop-ok-append .x-dd-drop-icon { + background-image: url(../images/default/tree/drop-add.gif); +} + +.x-tree-drop-ok-above .x-dd-drop-icon { + background-image: url(../images/default/tree/drop-over.gif); +} + +.x-tree-drop-ok-below .x-dd-drop-icon { + background-image: url(../images/default/tree/drop-under.gif); +} + +.x-tree-drop-ok-between .x-dd-drop-icon { + background-image: url(../images/default/tree/drop-between.gif); +} + +.x-tree3-loading { + background-image: url(../images/default/tree/loading.gif); +} + +.x-tree3-node-text { + font: normal 11px arial, tahoma, helvetica, sans-serif; + color: black; +}.x-date-picker { + border-color: #1b376c; + background-color:#fff; +} +.x-date-middle,.x-date-left,.x-date-right { + background-image: url(../images/default/shared/hd-sprite.gif); + color:#fff; + font:bold 11px "sans serif", tahoma, verdana, helvetica; +} +.x-date-middle .x-btn .x-btn-text { + color:#fff; +} +.x-date-middle .x-btn-mc em.x-btn-arrow { + background-image:url(../images/default/toolbar/btn-arrow-light.gif); +} +.x-date-right a { + background-image: url(../images/default/shared/right-btn.gif); +} +.x-date-left a{ + background-image: url(../images/default/shared/left-btn.gif); +} +.x-date-inner th { + background-color:#dfecfb; + background-image:url(../images/default/shared/glass-bg.gif); + border-bottom-color:#a3bad9; + font:normal 10px arial, helvetica,tahoma,sans-serif; + color:#233d6d; +} +.x-date-inner td { + border-color:#fff; +} +.x-date-inner a { + font:normal 11px arial, helvetica,tahoma,sans-serif; + color:#000; +} +.x-date-inner .x-date-active{ + color:#000; +} +.x-date-inner .x-date-selected a{ + background-color:#dfecfb; + background-image:url(../images/default/shared/glass-bg.gif); + border-color:#8db2e3; +} +.x-date-inner .x-date-today a{ + border-color:darkred; +} +.x-date-inner .x-date-selected span{ + font-weight:bold; +} +.x-date-inner .x-date-prevday a,.x-date-inner .x-date-nextday a { + color:#aaa; +} +.x-date-bottom { + border-top-color:#a3bad9; + background-color:#dfecfb; + background-image:url(../images/default/shared/glass-bg.gif); +} +.x-date-inner .x-date-disabled a { + background-color:#eee; + color:#bbb; +} +.x-date-mmenu{ + background-color:#eee !important; +} +.x-date-mmenu .x-menu-item { + font-size:10px; + color:#000; +} +.x-date-mp { + background-color:#fff; +} +.x-date-mp td { + font:normal 11px arial, helvetica,tahoma,sans-serif; +} +.x-date-mp-btns button { + background-color:#083772; + color:#fff; + border-color: #3366cc #000055 #000055 #3366cc; + font:normal 11px arial, helvetica,tahoma,sans-serif; +} +.x-date-mp-btns { + background-color: #dfecfb; + background-image: url(../images/default/shared/glass-bg.gif); +} +.x-date-mp-btns td { + border-top-color: #c5d2df; +} +td.x-date-mp-month a,td.x-date-mp-year a { + color:#15428b; +} +td.x-date-mp-sel a { + background-color: #dfecfb; + background-image: url(../images/default/shared/glass-bg.gif); + border-color:#8db2e3; +} +.x-date-mp-ybtn a { + background-image:url(../images/default/panel/tool-sprites.gif); +} +td.x-date-mp-sep { + border-right-color:#c5d2df; +} +.x-tip .x-tip-close{ + background-image: url(../images/default/qtip/close.gif); +} +.x-tip .x-tip-tc, .x-tip .x-tip-tl, .x-tip .x-tip-tr, .x-tip .x-tip-bc, .x-tip .x-tip-bl, .x-tip .x-tip-br, .x-tip .x-tip-ml, .x-tip .x-tip-mr { + background-image: url(../images/default/qtip/tip-sprite.gif); +} +.x-tip .x-tip-mc { + font: normal 11px tahoma,arial,helvetica,sans-serif; +} +.x-tip .x-tip-ml { + background-color: #fff; +} +.x-tip .x-tip-header-text { + font: bold 11px tahoma,arial,helvetica,sans-serif; + color:#444; +} +.x-tip .x-tip-body { + font: normal 11px tahoma,arial,helvetica,sans-serif; + color:#444; +} +.x-form-invalid-tip .x-tip-tc, .x-form-invalid-tip .x-tip-tl, .x-form-invalid-tip .x-tip-tr, .x-form-invalid-tip .x-tip-bc, +.x-form-invalid-tip .x-tip-bl, .x-form-invalid-tip .x-tip-br, .x-form-invalid-tip .x-tip-ml, .x-form-invalid-tip .x-tip-mr +{ + background-image: url(../images/default/form/error-tip-corners.gif); +} +.x-form-invalid-tip .x-tip-body { + background-image:url(../images/default/form/exclamation.gif); +} +.x-tip-anchor { + background-image:url(../images/default/qtip/tip-anchor-sprite.gif); +} +.x-menu { + border-color:#718bb7; + background-color:#f0f0f0; + background-image:url(../images/default/menu/menu.gif); +} +.x-menu-nosep { + background-image:none; +} +.x-menu-list-item{ + font:normal 11px tahoma,arial, sans-serif; +} +.x-menu-item-arrow{ + background-image:url(../images/default/menu/menu-parent.gif); +} +.x-menu-sep { + background-color:#e0e0e0; + border-bottom-color:#fff; +} +a.x-menu-item { + color:#222; +} +.x-menu-item-active { + background:#ebf3fd url(../images/default/menu/item-over.gif) repeat-x left bottom; + border:1px solid #aaccf6; + padding:0; +} +.x-menu-item-active a.x-menu-item { + color:#233d6d; +} + +.x-menu-plain { + background-color:#fff !important; +} +.x-menu .x-date-picker{ + border-color:#a3bad9; +} +.x-cycle-menu .x-menu-item-checked { + border-color:#a3bae9 !important; + background-color:#def8f6; +} +.x-menu-scroller-top { + background-image:url(../images/default/layout/mini-top.gif); +} +.x-menu-scroller-bottom { + background-image:url(../images/default/layout/mini-bottom.gif); +} + +.x-menu-scroller{ + border-width: 1px 0; +} +.x-box-tl { + background-image: url(../images/default/box/corners.gif); +} +.x-box-tc { + background-image: url(../images/default/box/tb.gif); +} +.x-box-tr { + background-image: url(../images/default/box/corners.gif); +} +.x-box-ml { + background-image: url(../images/default/box/l.gif); +} +.x-box-mc { + background-color: #eee; + background-image: url(../images/default/box/tb.gif); + font-family: "Myriad Pro","Myriad Web","Tahoma","Helvetica","Arial",sans-serif; + color: #393939; + font-size: 12px; +} +.x-box-mc h3 { + font-size: 14px; + font-weight: bold; +} +.x-box-mr { + background-image: url(../images/default/box/r.gif); +} +.x-box-bl { + background-image: url(../images/default/box/corners.gif); +} +.x-box-bc { + background-image: url(../images/default/box/tb.gif); +} +.x-box-br { + background-image: url(../images/default/box/corners.gif); +} +.x-box-blue .x-box-bl, .x-box-blue .x-box-br, .x-box-blue .x-box-tl, .x-box-blue .x-box-tr { + background-image: url(../images/default/box/corners-blue.gif); +} +.x-box-blue .x-box-bc, .x-box-blue .x-box-mc, .x-box-blue .x-box-tc { + background-image: url(../images/default/box/tb-blue.gif); +} +.x-box-blue .x-box-mc { + background-color: #c3daf9; +} +.x-box-blue .x-box-mc h3 { + color: #17385b; +} +.x-box-blue .x-box-ml { + background-image: url(../images/default/box/l-blue.gif); +} +.x-box-blue .x-box-mr { + background-image: url(../images/default/box/r-blue.gif); +} +.x-combo-list { + border-color:#98c0f4; + background-color:#ddecfe; + font:normal 12px tahoma, arial, helvetica, sans-serif; +} +.x-combo-list-inner { + background-color:#fff; +} +.x-combo-list-hd { + font:bold 11px tahoma, arial, helvetica, sans-serif; + color:#15428b; + background-image: url(../images/default/layout/panel-title-light-bg.gif); + border-bottom-color:#98c0f4; +} +.x-resizable-pinned .x-combo-list-inner { + border-bottom-color:#98c0f4; +} +.x-combo-list-item { + border-color:#fff; +} +.x-combo-list .x-combo-selected{ + border-color:#a3bae9 !important; + background-color:#dfe8f6; +} +.x-combo-list .x-toolbar { + border-top-color:#98c0f4; +} +.x-combo-list-small { + font:normal 11px tahoma, arial, helvetica, sans-serif; +} +.x-panel { + border-color: #99bbe8; +} +.x-panel-header { + color:#15428b; + font-weight:bold; + font-size: 11px; + font-family: tahoma,arial,verdana,sans-serif; + border-color:#99bbe8; + background-image: url(../images/default/panel/white-top-bottom.gif); +} +.x-panel-body { + border-color:#99bbe8; + background-color:#fff; +} +.x-panel-bbar .x-toolbar, .x-panel-tbar .x-toolbar { + border-color:#99bbe8; +} +.x-panel-tbar-noheader .x-toolbar, .x-panel-mc .x-panel-tbar .x-toolbar { + border-top-color:#99bbe8; +} +.x-panel-body-noheader, .x-panel-mc .x-panel-body { + border-top-color:#99bbe8; +} +.x-panel-tl .x-panel-header { + color:#15428b; + font-weight:bold; + font-size: 11px; + font-family: tahoma,arial,verdana,sans-serif; +} +.x-panel-tc { + background-image: url(../images/default/panel/top-bottom.gif); +} +.x-panel-tl, .x-panel-tr, .x-panel-bl, .x-panel-br{ + background-image: url(../images/default/panel/corners-sprite.gif); + border-bottom-color:#99bbe8; +} +.x-panel-bc { + background-image: url(../images/default/panel/top-bottom.gif); +} +.x-panel-mc { + font: normal 11px tahoma,arial,helvetica,sans-serif; + background-color:#dfe8f6; +} +.x-panel-ml { + background-color: #fff; + background-image:url(../images/default/panel/left-right.gif); +} +.x-panel-mr { + background-image: url(../images/default/panel/left-right.gif); +} +.x-tool { + background-image:url(../images/default/panel/tool-sprites.gif); +} +.x-panel-ghost { + background-color:#cbddf3; +} +.x-panel-ghost ul { + border-color:#99bbe8; +} +.x-panel-dd-spacer { + border-color:#99bbe8; +} +.x-panel-fbar td,.x-panel-fbar span,.x-panel-fbar input,.x-panel-fbar div,.x-panel-fbar select,.x-panel-fbar label{ + font:normal 11px arial,tahoma, helvetica, sans-serif; +} +.x-window-proxy { + background-color:#c7dffc; + border-color:#99bbe8; +} +.x-window-tl .x-window-header { + color:#15428b; + font:bold 11px tahoma,arial,verdana,sans-serif; +} +.x-window-tc { + background-image: url(../images/default/window/top-bottom.png); +} +.x-window-tl { + background-image: url(../images/default/window/left-corners.png); +} +.x-window-tr { + background-image: url(../images/default/window/right-corners.png); +} +.x-window-bc { + background-image: url(../images/default/window/top-bottom.png); +} +.x-window-bl { + background-image: url(../images/default/window/left-corners.png); +} +.x-window-br { + background-image: url(../images/default/window/right-corners.png); +} +.x-window-mc { + border-color:#99bbe8; + font: normal 11px tahoma,arial,helvetica,sans-serif; + background-color:#dfe8f6; +} +.x-window-ml { + background-image: url(../images/default/window/left-right.png); +} +.x-window-mr { + background-image: url(../images/default/window/left-right.png); +} +.x-window-maximized .x-window-tc { + background-color:#fff; +} +.x-window-bbar .x-toolbar { + border-top-color:#99bbe8; +} +.x-panel-ghost .x-window-tl { + border-bottom-color:#99bbe8; +} +.x-panel-collapsed .x-window-tl { + border-bottom-color:#84a0c4; +} +.x-dlg-mask{ + background-color:#ccc; +} +.x-window-plain .x-window-mc { + background-color: #ccd9e8; + border-color: #a3bae9 #dfe8f6 #dfe8f6 #a3bae9; +} +.ext-ie .x-window-plain .x-window-mc { + background-color: #c9d5e4; +} +.x-window-plain .x-window-body { + border-color: #dfe8f6 #a3bae9 #a3bae9 #dfe8f6; +} +body.x-body-masked .x-window-plain .x-window-mc { + background-color: #ccd9e8; +} +.x-html-editor-wrap { + border-color:#a9bfd3; + background-color:#fff; +} + +.x-html-editor-tb .x-edit-bold, .x-menu-item .x-edit-bold { + background-position:0 0; + background-image:url(../images/default/editor/tb-sprite.gif); +} + +.x-html-editor-tb .x-edit-italic, .x-menu-item .x-edit-italic { + background-position:-16px 0; + background-image:url(../images/default/editor/tb-sprite.gif); +} + +.x-html-editor-tb .x-edit-underline, .x-menu-item .x-edit-underline { + background-position:-32px 0; + background-image:url(../images/default/editor/tb-sprite.gif); +} + +.x-html-editor-tb .x-edit-forecolor, .x-menu-item .x-edit-forecolor { + background-position:-160px 0; + background-image:url(../images/default/editor/tb-sprite.gif); +} + +.x-html-editor-tb .x-edit-backcolor, .x-menu-item .x-edit-backcolor { + background-position:-176px 0; + background-image:url(../images/default/editor/tb-sprite.gif); +} + +.x-html-editor-tb .x-edit-justifyleft, .x-menu-item .x-edit-justifyleft { + background-position:-112px 0; + background-image:url(../images/default/editor/tb-sprite.gif); +} + +.x-html-editor-tb .x-edit-justifycenter, .x-menu-item .x-edit-justifycenter { + background-position:-128px 0; + background-image:url(../images/default/editor/tb-sprite.gif); +} + +.x-html-editor-tb .x-edit-justifyright, .x-menu-item .x-edit-justifyright { + background-position:-144px 0; + background-image:url(../images/default/editor/tb-sprite.gif); +} + +.x-html-editor-tb .x-edit-insertorderedlist, .x-menu-item .x-edit-insertorderedlist { + background-position:-80px 0; + background-image:url(../images/default/editor/tb-sprite.gif); +} + +.x-html-editor-tb .x-edit-insertunorderedlist, .x-menu-item .x-edit-insertunorderedlist { + background-position:-96px 0; + background-image:url(../images/default/editor/tb-sprite.gif); +} + +.x-html-editor-tb .x-edit-increasefontsize, .x-menu-item .x-edit-increasefontsize { + background-position:-48px 0; + background-image:url(../images/default/editor/tb-sprite.gif); +} + +.x-html-editor-tb .x-edit-decreasefontsize, .x-menu-item .x-edit-decreasefontsize { + background-position:-64px 0; + background-image:url(../images/default/editor/tb-sprite.gif); +} + +.x-html-editor-tb .x-edit-sourceedit, .x-menu-item .x-edit-sourceedit { + background-position:-192px 0; + background-image:url(../images/default/editor/tb-sprite.gif); +} + +.x-html-editor-tb .x-edit-createlink, .x-menu-item .x-edit-createlink { + background-position:-208px 0; + background-image:url(../images/default/editor/tb-sprite.gif); +}.x-panel-noborder .x-panel-header-noborder { + border-bottom-color:#99bbe8; +} +.x-panel-noborder .x-panel-tbar-noborder .x-toolbar { + border-bottom-color:#99bbe8; +} +.x-panel-noborder .x-panel-bbar-noborder .x-toolbar { + border-top-color:#99bbe8; +} +.x-tab-panel-bbar-noborder .x-toolbar { + border-top-color:#99bbe8; +} +.x-tab-panel-tbar-noborder .x-toolbar { + border-bottom-color:#99bbe8; +} +.x-border-layout-ct { + background-color:#dfe8f6; +} +.x-accordion-hd { + color:#222; + font-weight:normal; + background-image: url(../images/default/panel/light-hd.gif); +} +.x-layout-collapsed{ + background-color:#d2e0f2; + border-color:#98c0f4; +} +.x-layout-collapsed-over{ + background-color:#d9e8fb; +} +.x-layout-split-west .x-layout-mini { + background-image:url(../images/default/layout/mini-left.gif); +} +.x-layout-split-east .x-layout-mini { + background-image:url(../images/default/layout/mini-right.gif); +} +.x-layout-split-north .x-layout-mini { + background-image:url(../images/default/layout/mini-top.gif); +} +.x-layout-split-south .x-layout-mini { + background-image:url(../images/default/layout/mini-bottom.gif); +} +.x-layout-cmini-west .x-layout-mini { + background-image:url(../images/default/layout/mini-right.gif); +} +.x-layout-cmini-east .x-layout-mini { + background-image:url(../images/default/layout/mini-left.gif); +} +.x-layout-cmini-north .x-layout-mini { + background-image:url(../images/default/layout/mini-bottom.gif); +} +.x-layout-cmini-south .x-layout-mini { + background-image:url(../images/default/layout/mini-top.gif); +} +.x-progress-wrap { + border-color:#6593cf; +} +.x-progress-inner { + background-color:#e0e8f3; + background-image:url(../images/default/qtip/bg.gif); +} +.x-progress-bar { + background-color:#9cbfee; + background-image:url(../images/default/progress/progress-bg.gif); + border-top-color:#d1e4fd; + border-bottom-color:#7fa9e4; + border-right-color:#7fa9e4; +} +.x-progress-text { + font-size:11px; + font-weight:bold; + color:#fff; +} +.x-progress-text-back { + color:#396095; +} +.x-slider-horz, .x-slider-horz .x-slider-end, .x-slider-horz .x-slider-inner { + background-image:url(../images/default/slider/slider-bg.png); +} +.x-slider-horz .x-slider-thumb { + background-image:url(../images/default/slider/slider-thumb.png); +} +.x-slider-vert, .x-slider-vert .x-slider-end, .x-slider-vert .x-slider-inner { + background-image:url(../images/default/slider/slider-v-bg.png); +} +.x-slider-vert .x-slider-thumb { + background-image:url(../images/default/slider/slider-v-thumb.png); +} +.x-window-dlg .ext-mb-text, +.x-window-dlg .x-window-header-text { + font-size:12px; +} +.x-window-dlg .ext-mb-textarea { + font:normal 12px tahoma,arial,helvetica,sans-serif; +} +.x-window-dlg .x-msg-box-wait { + background-image:url(../images/default/grid/loading.gif); +} +.x-window-dlg .ext-mb-info { + background-image:url(../images/default/window/icon-info.gif); +} +.x-window-dlg .ext-mb-warning { + background-image:url(../images/default/window/icon-warning.gif); +} +.x-window-dlg .ext-mb-question { + background-image:url(../images/default/window/icon-question.gif); +} +.x-window-dlg .ext-mb-error { + background-image:url(../images/default/window/icon-error.gif); +} diff --git a/src/main/webapp/gxt/css/gxt-gray.css b/src/main/webapp/gxt/css/gxt-gray.css new file mode 100644 index 0000000..bc31336 --- /dev/null +++ b/src/main/webapp/gxt/css/gxt-gray.css @@ -0,0 +1,493 @@ +.x-panel { + border-style: solid; + border-color: #d0d0d0; +} +.x-panel-header { + color:#333; + border:1px solid #d0d0d0; + background-image:url(../images/gray/panel/white-top-bottom.gif); +} + +.x-panel-body { + border-color:#d0d0d0; +} + +.x-panel-bbar .x-toolbar { + border-color:#d0d0d0; +} + +.x-panel-tbar .x-toolbar { + border-color:#d0d0d0; +} + +.x-panel-tbar-noheader .x-toolbar, .x-panel-mc .x-panel-tbar .x-toolbar { + border-color:#d0d0d0; +} +.x-panel-body-noheader, .x-panel-mc .x-panel-body { + border-color:#d0d0d0; +} +.x-panel-tl .x-panel-header { + color:#333; +} +.x-panel-tc { + background-image:url(../images/gray/panel/top-bottom.gif); +} +.x-panel-tl { + background-image:url(../images/gray/panel/corners-sprite.gif); + border-color:#d0d0d0; +} +.x-panel-tr { + background-image:url(../images/gray/panel/corners-sprite.gif); +} +.x-panel-bc { + background-image:url(../images/gray/panel/top-bottom.gif); +} +.x-panel-bl { + background-image:url(../images/gray/panel/corners-sprite.gif); +} +.x-panel-br { + background-image:url(../images/gray/panel/corners-sprite.gif); +} +.x-panel-mc { + background:#f1f1f1; +} +.x-panel-mc .x-panel-body { + background:transparent; + border: 0 none; +} +.x-panel-ml { + background-image:url(../images/gray/panel/left-right.gif); +} +.x-panel-mr { + background-image:url(../images/gray/panel/left-right.gif); +} + +/* Tools */ +.x-tool { + background-image:url(../images/gray/panel/tool-sprites.gif); +} + +/* Ghosting */ +.x-panel-ghost { + background:#e0e0e0; +} + +.x-panel-ghost ul { + border-color:#b0b0b0; +} + +.x-grid-panel .x-panel-mc .x-panel-body { + border:1px solid #d0d0d0; +} + +/* Buttons */ + +.x-btn-left{ + background-image:url(../images/gray/button/btn-sprite.gif); +} +.x-btn-right{ + background-image:url(../images/gray/button/btn-sprite.gif); +} +.x-btn-center{ + background-image:url(../images/gray/button/btn-sprite.gif); +} + +.x-btn-group-header { + color: #333333; +} +.x-btn-group-tc { + background-image: url(../images/gray/button/group-tb.gif); +} +.x-btn-group-tl { + background-image: url(../images/gray/button/group-cs.gif); +} +.x-btn-group-tr { + background-image: url(../images/gray/button/group-cs.gif); +} +.x-btn-group-bc { + background-image: url(../images/gray/button/group-tb.gif); +} +.x-btn-group-bl { + background-image: url(../images/gray/button/group-cs.gif); +} +.x-btn-group-br { + background-image: url(../images/gray/button/group-cs.gif); +} +.x-btn-group-ml { + background-image: url(../images/gray/button/group-lr.gif); +} +.x-btn-group-mr { + background-image: url(../images/gray/button/group-lr.gif); +} +.x-btn-group-notitle .x-btn-group-tc { + background-image: url(../images/gray/button/group-tb.gif); +} + +/* Layout classes */ + +.x-border-layout-ct { + background:#f0f0f0; +} + +.x-accordion-hd { + background-image:url(../images/gray/panel/light-hd.gif); +} + +.x-layout-collapsed{ + background-color:#eee; + border-color:#e0e0e0; +} +.x-layout-collapsed-over{ + background-color:#fbfbfb; +} + + +/* qtips */ +.x-tip .x-tip-top { + background-image:url(../images/gray/qtip/tip-sprite.gif); +} +.x-tip .x-tip-top-left { + background-image:url(../images/gray/qtip/tip-sprite.gif); +} +.x-tip .x-tip-top-right { + background-image:url(../images/gray/qtip/tip-sprite.gif); +} +.x-tip .x-tip-ft { + background-image:url(../images/gray/qtip/tip-sprite.gif); +} +.x-tip .x-tip-ft-left { + background-image:url(../images/gray/qtip/tip-sprite.gif); +} +.x-tip .x-tip-ft-right { + background-image:url(../images/gray/qtip/tip-sprite.gif); +} +.x-tip .x-tip-bd-left { + background-image:url(../images/gray/qtip/tip-sprite.gif); +} +.x-tip .x-tip-bd-right { + background-image:url(../images/gray/qtip/tip-sprite.gif); +} + +/* Toolbars */ + +.x-toolbar{ + border-color:#d0d0d0; + background:#f0f4f5 url(../images/gray/toolbar/bg.gif) repeat-x top left; +} +.x-toolbar button { + color:#444; +} +.x-toolbar .x-btn-menu-arrow-wrap .x-btn-center button { + background-image:url(../images/gray/toolbar/btn-arrow.gif); +} +.x-toolbar .x-btn-text-icon .x-btn-menu-arrow-wrap .x-btn-center button { + background-image:url(../images/gray/toolbar/btn-arrow.gif); +} +.x-toolbar .x-btn-over .x-btn-left{ + background-image:url(../images/gray/toolbar/tb-btn-sprite.gif); +} +.x-toolbar .x-btn-over .x-btn-right{ + background-image:url(../images/gray/toolbar/tb-btn-sprite.gif); +} +.x-toolbar .x-btn-over .x-btn-center{ + background-image:url(../images/gray/toolbar/tb-btn-sprite.gif); +} +.x-toolbar .x-btn-over button { + color:#111; +} +.x-toolbar .x-btn-click .x-btn-left, .x-toolbar .x-btn-pressed .x-btn-left, .x-toolbar .x-btn-menu-active .x-btn-left{ + background-image:url(../images/gray/toolbar/tb-btn-sprite.gif); +} +.x-toolbar .x-btn-click .x-btn-right, .x-toolbar .x-btn-pressed .x-btn-right, .x-toolbar .x-btn-menu-active .x-btn-right{ + background-image:url(../images/gray/toolbar/tb-btn-sprite.gif); +} + +.x-toolbar .x-btn-click .x-btn-center, .x-toolbar .x-btn-pressed .x-btn-center, .x-toolbar .x-btn-menu-active .x-btn-center{ + background-image:url(../images/gray/toolbar/tb-btn-sprite.gif); +} +.x-toolbar .xtb-sep { + background-image: url(../images/gray/grid/grid-split.gif); +} + +/* Tabs */ + +.x-tab-panel-header, .x-tab-panel-footer { + background: #EAEAEA; + border-color:#d0d0d0; +} + + +.x-tab-panel-header { + border-color:#d0d0d0; +} + +.x-tab-panel-footer { + border-color:#d0d0d0; +} + +ul.x-tab-strip-top{ + background:#dbdbdb url(../images/gray/tabs/tab-strip-bg.gif) repeat-x left top; + border-color:#d0d0d0; + padding-top: 2px; +} + +ul.x-tab-strip-bottom{ + background-image:url(../images/gray/tabs/tab-strip-btm-bg.gif); + border-color:#d0d0d0; +} + +.x-tab-strip span.x-tab-strip-text { + color:#333; +} +.x-tab-strip-over span.x-tab-strip-text { + color:#111; +} + +.x-tab-strip-active span.x-tab-strip-text { + color:#333; +} + +.x-tab-strip-disabled .x-tabs-text { + color:#aaaaaa; +} + +.x-tab-strip-top .x-tab-right { + background-image:url(../images/gray/tabs/tabs-sprite.gif); +} + +.x-tab-strip-top .x-tab-left { + background-image:url(../images/gray/tabs/tabs-sprite.gif); +} +.x-tab-strip-top .x-tab-strip-inner { + background-image:url(../images/gray/tabs/tabs-sprite.gif); +} + +.x-tab-strip-bottom .x-tab-right { + background-image:url(../images/gray/tabs/tab-btm-inactive-right-bg.gif); +} + +.x-tab-strip-bottom .x-tab-left { + background-image:url(../images/gray/tabs/tab-btm-inactive-left-bg.gif); +} + +.x-tab-strip-bottom .x-tab-strip-active .x-tab-right { + background-image:url(../images/gray/tabs/tab-btm-right-bg.gif); +} + +.x-tab-strip-bottom .x-tab-strip-active .x-tab-left { + background-image:url(../images/gray/tabs/tab-btm-left-bg.gif); +} + +.x-tab-strip .x-tab-strip-closable a.x-tab-strip-close { + background-image:url(../images/gray/tabs/tab-close.gif); +} +.x-tab-strip .x-tab-strip-closable a.x-tab-strip-close:hover{ + background-image:url(../images/gray/tabs/tab-close.gif); +} + +.x-tab-panel-body { + border-color:#d0d0d0; + background:#fff; +} +.x-tab-panel-bbar .x-toolbar { + border-color: #d0d0d0; +} + +.x-tab-panel-tbar .x-toolbar { + border-color: #d0d0d0; +} + +.x-tab-panel-header-plain .x-tab-strip-spacer { + border-color:#d0d0d0; + background: #eaeaea; +} + +.x-tab-scroller-left { + background-image: url(../images/gray/tabs/scroll-left.gif); + border-color:#aeaeae; +} +.x-tab-scroller-right { + background-image: url(../images/gray/tabs/scroll-right.gif); + border-color:#aeaeae; +} + +/* Window */ + +.x-window-proxy { + background:#e0e0e0; + border-color:#b0b0b0; +} + +.x-window-tl .x-window-header { + color:#555; +} +.x-window-tc { + background-image:url(../images/gray/window/top-bottom.png); +} +.x-window-tl { + background-image:url(../images/gray/window/left-corners.png); +} +.x-window-tr { + background-image:url(../images/gray/window/right-corners.png); +} +.x-window-bc { + background-image:url(../images/gray/window/top-bottom.png); +} +.x-window-bl { + background-image:url(../images/gray/window/left-corners.png); +} +.x-window-br { + background-image:url(../images/gray/window/right-corners.png); +} +.x-window-mc { + border:1px solid #d0d0d0; + background:#e8e8e8; +} +.ext-ie .x-window-plain .x-window-mc { + background-color: #e3e3e3; +} + +.x-window-ml { + background-image:url(../images/gray/window/left-right.png); +} +.x-window-mr { + background-image:url(../images/gray/window/left-right.png); +} +.x-panel-ghost .x-window-tl { + border-color:#d0d0d0; +} +.x-panel-collapsed .x-window-tl { + border-color:#d0d0d0; +} + +.x-window-plain .x-window-mc { + background: #e8e8e8; + border-right:1px solid #eee; + border-bottom:1px solid #eee; + border-top:1px solid #d0d0d0; + border-left:1px solid #d0d0d0; +} + +.x-window-plain .x-window-body { + border-left:1px solid #eee; + border-top:1px solid #eee; + border-bottom:1px solid #d0d0d0; + border-right:1px solid #d0d0d0; + background:transparent !important; +} + +body.x-body-masked .x-window-mc, body.x-body-masked .x-window-plain .x-window-mc { + background-color: #e4e4e4; +} + + +/* misc */ +.x-html-editor-wrap { + border-color:#d0d0d0; +} + +/* Borders go last for specificity */ +.x-panel-noborder .x-panel-body-noborder { + border-width:0; +} + +.x-panel-noborder .x-panel-header-noborder { + border-width:0; + border-bottom:1px solid #d0d0d0; +} + +.x-panel-noborder .x-panel-tbar-noborder .x-toolbar { + border-width:0; + border-bottom:1px solid #d0d0d0; +} + +.x-panel-noborder .x-panel-bbar-noborder .x-toolbar { + border-width:0; + border-top:1px solid #d0d0d0; +} + +.x-window-noborder .x-window-mc { + border-width:0; +} +.x-window-plain .x-window-body-noborder { + border-width:0; +} + +.x-tab-panel-noborder .x-tab-panel-body-noborder { + border-width:0; +} + +.x-tab-panel-noborder .x-tab-panel-header-noborder { + border-top-width:0; + border-left-width:0; + border-right-width:0; +} + +.x-tab-panel-noborder .x-tab-panel-footer-noborder { + border-bottom-width:0; + border-left-width:0; + border-right-width:0; +} + + +.x-tab-panel-bbar-noborder .x-toolbar { + border-width:0; + border-top:1px solid #d0d0d0; +} + +.x-tab-panel-tbar-noborder .x-toolbar { + border-width:0; + border-bottom:1px solid #d0d0d0; +} + +.x-spinner-field .x-form-spinner-up { + background-image: url('../images/gray/form/spinner.gif'); +} +.x-spinner-field .x-form-spinner-down { + background-image: url('../images/gray/form/spinner.gif'); +}.x-accordion-hd { + background-color: #e5e5e5; +}.x-border { + border: 1px solid #D0D0D0; +} + +.x-layout-popup { + background-color: #F0F0F0; + border: 1px solid #D0D0D0; +} + +.my-list { + border: 1px solid #D0D0D0; +} + +.x-view { + border:1px solid #D0D0D0; +} + +.x-menubar { + border-color: #D0D0D0; + background-color: #F0F0F0; + background-image: url(../images/gray/toolbar/bg.gif); +} + +.x-menubar-item-active { + background-color: #D9E8FB; +} + +.x-menubar-item-active { + background-color: #D9E8FB; +}.x-date-right-icon { + background-image: url(../images/default/shared/right-btn.gif); + margin-right: 2px; + text-decoration: none !important; +} + +.x-date-left-icon { + background-image: url(../images/default/shared/left-btn.gif); + margin-right: 2px; + text-decoration: none !important; +}.my-tbl { + border: 1px solid #C6C5C5; +}.my-treetbl { + border: 1px solid #C6C5C5; +} \ No newline at end of file diff --git a/src/main/webapp/gxt/desktop/css/desktop.css b/src/main/webapp/gxt/desktop/css/desktop.css new file mode 100644 index 0000000..0013ed9 --- /dev/null +++ b/src/main/webapp/gxt/desktop/css/desktop.css @@ -0,0 +1,638 @@ +/* + * Ext JS Library 2.1 + * Copyright(c) 2006-2008, Ext JS, LLC. + * licensing@extjs.com + * + * http://extjs.com/license + */ +html,body { + background: #3d71b8 url(../wallpapers/desktop.jpg) no-repeat left top; + font: normal 12px tahoma, arial, verdana, sans-serif; + margin: 0; + padding: 0; + border: 0 none; + overflow: hidden; + height: 100%; +} + +.start { + background-image: url( ../images/taskbar/black/startbutton-icon.gif ) !important; +} + +.bogus { + background-image: url( ../images/bogus.png ) !important; +} + +.logout { + background-image: url( ../images/logout.gif ) !important; +} + +.settings { + background-image: url( ../images/gears.gif ) !important; +} + +#dpanels { + width: 250px; + float: right; +} + +#dpanels .x-panel { + margin: 15px; +} + +#dpanels .x-date-picker { + border: 0 none; + border-top: 0 none; + background: transparent; +} + +#dpanels .x-date-picker td.x-date-active { + background: #ffffff; +} + +#dpanels .x-date-picker { + width: 100% !important; +} + +#x-desktop { + width: 100%; + height: 100%; + border: 0 none; + position: relative; + overflow: hidden; + zoom: 1; +} + +#ux-taskbar .x-btn { + float: left; + margin: 1px 0 0 1px; + position: relative; +} + +#ux-taskbar-start .x-btn { + float: left; + margin: 0; + position: relative; +} + +#ux-taskbar button { /* width: 150px; + overflow: hidden; */ + text-align: left; + color: #ffffff; +} + +#title-bar-wrapper { + height: 35px; +} + +#title-bar { + color: #225599; + padding: 9px 7px; + font: bold 16px tahoma, arial, verdana, sans-serif; + float: left; +} + +#x-logout { + float: right; + padding: 6px 7px; +} + +.x-btn-text-icon .x-btn-center .logout { + background-position: 0pt 3px; + background-repeat: no-repeat; + padding: 3px 0pt 3px 18px; +} + +#ux-taskbar { + background: transparent none; + height: 30px; + margin: 0; + padding: 0; + position: relative; + z-index: 12001; +} + +.x-btn-icon .ux-taskbutton-center .x-btn-text { + background-position: center; + background-repeat: no-repeat; + height: 16px; + width: 16px; + cursor: pointer; + white-space: nowrap; + padding: 0; +} + +.x-btn-icon .ux-taskbutton-center { + padding: 1px; +} + +.ux-startbutton-center .x-btn-text { + color: #000000 !important; + font-weight: bold; +} + +.ux-taskbutton-left,.ux-taskbutton-right { + font-size: 1px; + line-height: 1px; +} + +.ux-taskbutton-left { + width: 4px; + height: 28px; + background: url( ../images/taskbar/black/taskbutton.gif ) no-repeat 0 0; +} + +.ux-taskbutton-right { + width: 4px; + height: 28px; + background: url( ../images/taskbar/black/taskbutton.gif ) no-repeat 0 -28px; +} + +.ux-taskbutton-left i,.ux-taskbutton-right i { + display: block; + width: 4px; + overflow: hidden; + font-size: 1px; + line-height: 1px; +} + +.ux-taskbutton-center { + background: url( ../images/taskbar/black/taskbutton.gif ) repeat-x 0 -56px; + vertical-align: middle; + text-align: center; + padding: 0 5px; + cursor: pointer; + white-space: nowrap; +} + +#ux-taskbar .ux-taskbutton-left { + background-position: 0 0; +} + +#ux-taskbar .ux-taskbutton-right { + background-position: 0 -28px; +} + +#ux-taskbar .ux-taskbutton-center { + background-position: 0 -56px; +} + +#ux-taskbar .x-btn-over .ux-taskbutton-left { + background-position: 0 -252px; +} + +#ux-taskbar .x-btn-over .ux-taskbutton-right { + background-position: 0 -280px; +} + +#ux-taskbar .x-btn-over .ux-taskbutton-center { + background-position: 0 -308px; +} + +#ux-taskbar .x-btn-click .ux-taskbutton-left { + background-position: 0 -168px; +} + +#ux-taskbar .x-btn-click .ux-taskbutton-right { + background-position: 0 -196px; +} + +#ux-taskbar .x-btn-click .ux-taskbutton-center { + background-position: 0 -224px; +} + +#ux-taskbar .active-win .ux-taskbutton-left { + background-position: 0 -84px; +} + +#ux-taskbar .active-win .ux-taskbutton-right { + background: url( ../images/taskbar/black/taskbutton.gif ) no-repeat 0 -112px; +} + +#ux-taskbar .active-win .ux-taskbutton-center { + background: url( ../images/taskbar/black/taskbutton.gif ) repeat-x 0 -140px; +} + +#ux-taskbar .active-win .ux-taskbutton-center button { + color: #fff; +} + +#spacer { + height: 25px; + float: left; + width: 0; + overflow: hidden; + margin-top: 2px; +} + +.x-window-body p,.x-panel-body p { + padding: 10px; + margin: 0; +} + +.x-window-maximized .x-window-bc { + height: 0; +} + +.add { + background-image: url(../../shared/icons/fam/add.gif) !important; +} + +.option { + background-image: url(../../shared/icons/fam/plugin.gif) !important; +} + +.remove { + background-image: url(../../shared/icons/fam/delete.gif) !important; +} + +.tabs { + background-image: url(../images/tabs.gif) !important; +} + +.ux-start-menu { + background: transparent none; + border: 0px none; + padding: 0; +} + +.ux-start-menu-tl .x-window-header { + color: #f1f1f1; + font: bold 11px tahoma, arial, verdana, sans-serif; + padding: 5px 0 4px 0; +} + +.x-panel-tl .x-panel-icon,.ux-start-menu-tl .x-panel-icon { + background-position: 0pt 4px; + background-repeat: no-repeat; + padding-left: 20px !important; +} + +.ux-start-menu-tl { + background: transparent url( ../images/taskbar/black/start-menu-left-corners.png ) no-repeat 0 0; + padding-left: 6px; + zoom: 1; + z-index: 1; + position: relative; +} + +.ux-start-menu-tr { + background: transparent url( ../images/taskbar/black/start-menu-right-corners.png ) no-repeat right + 0; + padding-right: 6px; +} + +.ux-start-menu-tc { + background: transparent url( ../images/taskbar/black/start-menu-top-bottom.png ) repeat-x 0 0; + overflow: hidden; + zoom: 1; +} + +.ux-start-menu-ml { + background: transparent url( ../images/taskbar/black/start-menu-left-right.png ) repeat-y 0 0; + padding-left: 6px; + zoom: 1; +} + +.ux-start-menu-bc { + background: transparent url( ../images/taskbar/black/start-menu-top-bottom.png ) repeat-x 0 bottom; + zoom: 1; +} + +.ux-start-menu-bc .x-window-footer { + padding-bottom: 6px; + zoom: 1; + font-size: 0; + line-height: 0; +} + +.ux-start-menu-bl { + background: transparent url( ../images/taskbar/black/start-menu-left-corners.png ) no-repeat 0 + bottom; + padding-left: 6px; + zoom: 1; +} + +.ux-start-menu-br { + background: transparent url( ../images/taskbar/black/start-menu-right-corners.png ) no-repeat right + bottom; + padding-right: 6px; + zoom: 1; +} + +.x-panel-nofooter .ux-start-menu-bc { + height: 6px; +} + +.ux-start-menu-splitbar-h { + background-color: #d0d0d0; +} + +.ux-start-menu-bwrap { + background: transparent none; + border: 0px none; +} + +.ux-start-menu-body { + background: transparent none; + border: 0px none; +} + +.ux-start-menu-apps-panel { + background: #ffffff none; + border: 1px solid #1e2124; +} + +.ux-start-menu-tools-panel { + border: 0px none; + background: transparent url( ../images/taskbar/black/start-menu-right.png ) repeat-y scroll right + 0pt; +} + +#ux-taskbar-start { + background: #000000 url( ../images/taskbar/black/taskbar-start-panel-bg.gif ) repeat-x left top; + left: 0px; + padding: 0; + position: absolute; +} + +#ux-taskbar-start .x-toolbar { + background: none; + padding: 0px; + border: 0px none; +} + +#ux-taskbuttons-panel { + background: #000000 url( ../images/taskbar/black/taskbuttons-panel-bg.gif ) repeat-x left top; + padding-top: 0; + position: relative; +} + +.ux-taskbuttons-strip-wrap { /* overflow:hidden; + position:relative; + width:100%; */ + width: 100%; + overflow: hidden; + position: relative; + zoom: 1; +} + +ul.ux-taskbuttons-strip { + display: block; + width: 5000px; + zoom: 1; +} + +ul.ux-taskbuttons-strip li { + float: left; + margin-left: 2px; +} + +ul.ux-taskbuttons-strip li.ux-taskbuttons-edge { + float: left; + margin: 0 !important; + padding: 0 !important; + border: 0 none !important; + font-size: 1px !important; + line-height: 1px !important; + overflow: hidden; + zoom: 1; + background: transparent !important; + width: 1px; +} + +.x-clear { + clear: both; + height: 0; + overflow: hidden; + line-height: 0; + font-size: 0; +} + +.x-taskbuttons-scrolling { + position: relative; +} + +.x-taskbuttons-scrolling .ux-taskbuttons-strip-wrap { + margin-left: 18px; + margin-right: 18px; +} + +td.ux-taskButtons-edge { /*float:left;*/ + margin: 0 !important; + padding: 0 !important; + border: 0 none !important; + font-size: 1px !important; + line-height: 1px !important; + overflow: hidden; + zoom: 1; + background: transparent !important; + width: 1px; +} + +.ux-taskbuttons-scroller-left { + background: transparent url( ../images/taskbar/black/scroll-left.gif ) no-repeat -18px 0; + width: 18px; + position: absolute; + left: 1px; + top: 0px; + z-index: 10; + cursor: pointer; +} + +.ux-taskbuttons-scroller-left-over { + background-position: 0 0; +} + +.ux-taskbuttons-scroller-left-disabled { + background-position: -18px 0; + opacity: .5; + -moz-opacity: .5; + filter: alpha(opacity = 50); + cursor: default; +} + +.ux-taskbuttons-scroller-right { + background: transparent url( ../images/taskbar/black/scroll-right.gif ) no-repeat 0 0; + width: 18px; + position: absolute; + right: 0; + top: 0px; + z-index: 10; + cursor: pointer; +} + +.ux-taskbuttons-scroller-right-over { + background-position: -18px 0; +} + +.ux-taskbuttons-scroller-right-disabled { + background-position: 0 0; + opacity: .5; + -moz-opacity: .5; + filter: alpha(opacity = 50); + cursor: default; +} + +.ux-toolmenu-sep { + background-color: #18191a; + border-bottom: 1px solid #858789; + display: block; + font-size: 1px; + line-height: 1px; + margin: 2px 3px; +} + +.ux-start-menu-tools-panel ul.x-menu-list li.x-menu-list-item a.x-menu-item { + color: #ffffff; +} + +.ux-start-menu-tools-panel ul.x-menu-list li.x-menu-list-item .x-menu-item-active a.x-menu-item { + color: #000000; +} + +.ux-start-menu-tools-panel .x-menu-item-active { + background: #525456 url( ../images/taskbar/black/item-over.gif ) repeat-x left bottom; + border: 1px solid #000000; + padding: 0; +} + +#ux-taskbar .x-splitbar-h { + background: #000000 url( ../images/taskbar/black/taskbar-split-h.gif ) no-repeat 0 0; + width: 8px; +} + +.x-window-header-text { + cursor: default; +} + +/* + * Begin Start button + */ +.ux-startbutton-left,.ux-startbutton-right { + font-size: 1px; + line-height: 1px; +} + +.ux-startbutton-left { + width: 10px; + height: 28px; + background: url( ../images/taskbar/black/startbutton.gif ) no-repeat 0 0; +} + +.ux-startbutton-right { + width: 10px; + height: 30px; + background: url( ../images/taskbar/black/startbutton.gif ) no-repeat 0 -28px; +} + +.ux-startbutton-left i,.ux-startbutton-right i { + display: block; + width: 10px; + overflow: hidden; + font-size: 1px; + line-height: 1px; +} + +.ux-startbutton-center { + background: url( ../images/taskbar/black/startbutton.gif ) repeat-x 0 -56px; + vertical-align: middle; + text-align: center; + padding: 0; + cursor: pointer; + white-space: nowrap; +} + +#ux-taskbar .ux-startbutton-left { + background-position: 0 0; +} + +#ux-taskbar .ux-startbutton-right { + background-position: 0 -30px; +} + +#ux-taskbar .ux-startbutton-center { + background-position: 0 -60px; +} + +#ux-taskbar .x-btn-over .ux-startbutton-left { + background-position: 0 -270px; +} + +#ux-taskbar .x-btn-over .ux-startbutton-right { + background-position: 0 -300px; +} + +#ux-taskbar .x-btn-over .ux-startbutton-center { + background-position: 0 -330px; +} + +#ux-taskbar .x-btn-click .ux-startbutton-left { + background-position: 0 -180px; +} + +#ux-taskbar .x-btn-click .ux-startbutton-right { + background-position: 0 -210px; +} + +#ux-taskbar .x-btn-click .ux-startbutton-center { + background-position: 0 -240px; +} + +#ux-taskbar .active-win .ux-startbutton-left { + background-position: 0 -90px; +} + +#ux-taskbar .active-win .ux-startbutton-right { + background: url( ../images/taskbar/black/startbutton.gif ) no-repeat 0 -120px; +} + +#ux-taskbar .active-win .ux-startbutton-center { + background: url( ../images/taskbar/black/startbutton.gif ) repeat-x 0 -150px; +} + +#ux-taskbar .active-win .ux-startbutton-center button { + color: #fff; +} + +/* + * End Start button + */ +.x-resizable-proxy { + background: #C7DFFC; + opacity: .5; + -moz-opacity: .5; + filter: alpha(opacity = 50); + border: 1px solid #3b5a82; +} + +/* Desktop Shortcuts */ +#x-shortcuts dt { + float: left; + margin: 15px 0 0 15px; + clear: left; + width: 64px; + font: normal 10px tahoma, arial, verdana, sans-serif; + text-align: center; + zoom: 1; + display: block; +} + +#x-shortcuts dt a { + width: 64px; + display: block; + color: white; + text-decoration: none; +} + +#x-shortcuts dt div { + width: 100%; + color: white; + overflow: hidden; + text-overflow: ellipsis; + cursor: pointer; +} + +#x-shortcuts dt a:hover { + text-decoration: underline; +} diff --git a/src/main/webapp/gxt/desktop/images/desktop.gif b/src/main/webapp/gxt/desktop/images/desktop.gif new file mode 100644 index 0000000000000000000000000000000000000000..f305cb643378b5cfc5f447f3003d0b904d23fc30 GIT binary patch literal 63601 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 EI~KPF_W%F@ literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..daca8bc5eeda549ea4240df77ac164986bbfcad9 GIT binary patch literal 158508 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 z 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 literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..2bf6bd70d1b128eace0a50b610df5b7a30c5778e GIT binary patch literal 996 zcmZ?wbhEHb6krfwXlGzBvobcau(hOmwsW+xbF_5Vv~;qtcCfQ?v6hW0Rq~J1 z@QyKb^t5zvw|8>2cXqdM@wD)Zu=0A|YbawM{cK3Glba3(Tb@lLZ@$z#D2=z;H z5Y6b4O=*)$Zxha3DOR>Xv~rb1$v%_1`HE#*e2QD0>$U}SX~eXe6|U2&+^gd;J-B>p zLd8*Yjh3}4v-avt*<;nX(R#u<`Q8H(6AnwyIwLptq{zZMQj4$3F1;?X?wZ`*XDW>c zwE7MyPCRKj<&5>D3u>z_>aD(`wBf$xniJ+rt}E<&st44}U6L{cLpXgZ;6u zN)LXjy!`LdzR0O#se8}f+_`&8*KYP&blQ2v&A=50A~xUj-}WJ3&9l(8PjY4)DqnQM z>FodL!|$UW{ZG97zv$45+5=B2ul#MfsMLQ|t>=zj?=7qOk8GCTmt6TlzxlXl%aNeo z8y-`R`cJvyI{Rqt#=DujzLg*T?=W%ml^KWH*4_EF?eeQFw?9ArKk@bdc?_d~1|gvM zlZBaqL7PDbWHu;IFmN1X2Y%2Ns^3i7Z{S%~LX#7#@D^w@`qoP-J3Z zMxc_b<&>C<7Y|=(7ZrK6VCTU$k5;qbtRD;?4mdQ5YUoLMXxvEf=u!5aV{mX$qauq~`lAB@2JOtwjbb@25rz#1 M(i_$N*jX5?0UH(+od5s; literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..6acdc989ca7e6bab78a2eb41bf136cedee9191ec GIT binary patch literal 967 zcmV;&133JNP)D6Yd#Te{PSeVs1O=rjQOA1i2-zNe{bTy^`t-Bh}~qil11 zZJ9Stq#-oSqvhnygN9a-g=Yh{SFgp`j#m?r(W&D?RA6>3 zbF5s)6Ug_*ap6`zbg~;++DrTkb(brq=X7i=-wIht*@ykn4i1z;)#w-H;YX{&!3cM} zz8v0?LZpcWFG>PVpZyj7R6eG-IKmzFbosL!<@r8-UcK*H_%06b9C5F5@^2@mlCawr z;Yw;T+S;$pJm~!;yuR_sbMlfraDx+Y6n(DtetK(f=OnKFSi>F|>85Q91T1=k($L&A znX~3rJ4)RQ>nXrc>*=PLb8@GBN%hfecY#%m$B;?9LTqrnB_%u<&MW46rpL9%hIoU( z;i9%vA9gPqiye}RT(;RF8#1zsOEOlzyvORzTcKM`5FXE<^!3era&R6j)*jC z2g$VmEeo7!nlS%`8wbB+0gm@OikVOmaP?UVd7@@Li4{B^Unv?Vm)-@#BR47 p>bp)D2CT{4WK6&Fw7@+PU;r&Dbx5XGi$?$e002ovPDHLkV1jdt(?tLP literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..c4da495db39a9a876e89e67371fab75f3f7ae504 GIT binary patch literal 513 zcmV+c0{;DpP)t9vP*jK+QU@{Ievw`G5`|G9UAhK!5(Ei42tkL`K(N5b zXoH1F$XnnsJb3k#yXx-DH1q8y2wn8j2gApkW#4<>n;C%ruCdrrZhtW-U$hM7V~p=m z3XCs83GWOj$KMp3m|jgL>kwr!Y^=ip7(`Z&0}0#D_8U_1xHb5Ilo zGeQEusAs#dG0*z5IRc0K_5>vJE6S0hj=77&XSkH>)$ z$2lakpKO$hpO(G%DvdG%CXb2`Xbcx7DP2o^je4ts5nTf#~05I1Ur~m)} literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..f35a53f82493ea6239432ab719ff25150b5a8444 GIT binary patch literal 992 zcmZ?wbhEHbWMOb)XlG!Uw)WiSV-GeTf3W4)gDuA&Y(4RC+lhzUPd?m!>fw%44|kq^ zxa;(z-KQV#I`eop5S@Lz``qI_XCCi4_joT5oqxRV+~fV{pX|Nxc;AI5`z}7&4?<7( zJ^Xaw{F4KhpB}jU?9hd$hc7-obmjSx%g>Hpes=iEizC-w9=-nR*v;3+Z@fEp`^||v zZ%^KNd+P4{)A!z=x&QwB{SS}d|792jqai?-5K#Qd0<`BpgAT|xP@Z7m*vsI_p<=k` zL5Bc`b3+8jqUOVVVoFgf95xnV521bV;9GJ=6aGoKk!%uK=NlycVH2^_X&&~h< literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..f800edb1060ccf85319d181f7af402d5520b3fd9 GIT binary patch literal 808 zcmZ?wbhEHbWMp7sXlGzpyZiX18}}GS!DtAK$PiHc$pZBEe+C_p??HKjfrFKSk%fbU G!5RRz*$@j#Hy$CV15?!~RM130>0j)7aSVyb z4~n92q-)u+@8@%`6~WBtBhdtK9H)_L+qP&0WXbv#c>QGLJ$NsNC}W9M^OaV zb!!eR%YyIwCCIRPC{M25l)*C>RSnQng@f0}6J5(aq?BeoeK_UeAT@JIdwRSplBUiv zpWAa$>OlrLyPARI5}-uK7EEii$9l~w2Fnm4dBe-oEiP{sqSgc2%^*LYLFwZA=GF2i zLdfL9%#SXvu?c0r9;7Sv2SD3y6L06b9Bu~WHFwefJ)>L`=zRici#c^ai_rlv8Uu&p u7QjZC=SdRC#}q}WS5eO=kFvx)Gja?~dsYXAyy z7I;J!Gcd><1YyR*nIXYIL6&q!Uq=Rpjs4tz5?O(KKTj9OkcwN$8Ic7~*bYB`zdzrg z_Rpu;jh&1fGwS}QHf&P3^WWf_y})bz2`vTxn`0p@x|LuAEZ_ht)d%=O*iw@pia_G*|!*`Y+zO(YkomEHg ztT}dP-LX6CkKfsN;_jxCcek9pyY1B7?WgbVJac#VnY(+=-raZZ-tMa}c3*vY;QYOV z=kFc9aPP>)dq*$bKXBvy@f&Z?-FklF=G&7u-<`Vk?)2?2ee~(t<4@P0e7f=E^UbH9Z$0~b``MQ}&%Zo-`|UXp zy#u1}FW!B7@g9i2zkL7w)raq|f#~D+Hy?kz{q%!j6pV%dDIuWvlZ6?iUI#>g@&p4% zF9YKe2L`4_eio+=1qP-A3C^;-g)VbC9FmT28IHG26ld@iBi6&N>&Ch4Vdj#J1eB|B8xx2 wglWQ-hCn7ab_w1Gjtu@hyn+&69wx82y}jV^skz?U*TwEM|HO4eT7bbC0EYhGKmY&$ literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..a9a72d7c979c0a2ae137f4c4485ad011b1e3917a GIT binary patch literal 1247 zcmZ?wbhEHbWM;M z|KQ8T2Olp!{CxT0$IFjCU48uV+QSdmAAh*@i69L6V3p(dm zJ0=VKP1wXNswJ_;?d+E$!NM#_=l86uwQk5`+{?~jZXnb6k>#YgL4Lv^-I$%l#xKOr zCVt|0qqRm&fotvDf|;BfJsobdY!6%z&AK;|;STHJ(u6teCu!zEs&i77%}S{t7T`50YHne2Gs=+(>q{4Ay+f$pkXLxTNXO+!P& zQ@4hO$G4h>MW!#^dW|=Cujus{!IZM=+?6{wh;uV=MLcMfSh6ynO=`=|gR}oMDx`Ci Q{0f)kWKVmR=)hnN09lAN8~^|S literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..a4f3738f95d10d7f5b03e994bc7c843ad73b0543 GIT binary patch literal 920 zcmZ?wbhEHb6krfwXlGz>_3-(-nc?p~hUeSOZ!B|vzRT&^{)oR96n|c``+Lp$?@N{E zhXbA;E&Ka6?)T%uzaMunjDpb+7)BwW_>+YZ5$9Hk7594ZbQ5*!;j7zGkO zEO^Mw&LJbAFd-n3nU$MMDq})Jk`oh?RK*sJgeM1Bc-4eV7A#11W#Uw@n$fAyc)Fic z=~79;0B91o=dBt38P&tK$vz8#h^R}lwOL1{c90>2K^x(; z1AV1|(S095-^+-YL3R$V2Q8e+i&_2Goxj`I(LMnK41@!3iG!$S5VDpC$N-1jL5@2psHe+TUJwx}1ot{m vUtn<=8KeVcXBh&fe5FKmMlwoD_z_?L$jQ0&rodZ500000NkvXXu0mjfF-6sh literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..216c8397f09fa0b92bfe801f38a6e13ac50664f5 GIT binary patch literal 972 zcmZ?wbhEHb6krfwXlG!kNH(v|vZyGtbocUh_3&}^^l|m_ck}Xb_x5%3_V@Jj^YQU? z^A2$H33Lzi@(c9z3J3}da}Nyl4GZ;(j_`_!@CbfTssc6Yt~y)`yZ=Zij{ zFZy8~>x%_~ub0cbUoHP>p~R<^l3&-!|J)$^bEE95rK&F%YrR;d^l-D)yGW6jO-?!@h+^YI>tNPEanqRk?eBEXIZMVs{J*NM+8~omB_G_or?_HLEcUqlY z6L@c<+ubehx3~D;*%kA0tJ~Xs&Tsd*zT4;WZJXPly-t7jx&7Q7@b!qt*P|Z)54iq0 z;QRl8@4rJn{}1{6Js9x+NYLNI(SMIb{W}u#?`YirWATrVWW6|*{ql6ytFzg!&g6W( z)&BWrFT*Gp&=64k$->CMz`~#das?<)FmSA7;N+0mp}^9`!7Qw1a^TQ;d3_-fEf&R= zvr=lRDrzc@PdX+l8JO_hnc&(t+g#g)YmdU?o>?k#A!RodpKH6>x!~eH-?r*U zgQT)UQm>rlsR@S3X(xG9_=UncoFBJM)ehgF(P^me;KXGX#j;Sz^^}OZUID`di$z{i zdQlg0DiwoVrdXA{xbbq4(~}nY+;eR@6%GGKq>MOD3ziF1yMdxWPyoBg&5<)opEW5x^U%2V`8E)(YO)OjmE?U zxX_IWCMJk68jZgoC_z4{givTpDJ}iC@6B^sftKn?Zr;3^d(S=h%zH%BG$e8GdLP!H zLd2Qa<)X?edQr|b8$HC=D^=G|Vl{UShuWX<%vC6wfb^Q?)YjF!tZ(aVW10+?{r$;l zLRu-I4rF1S;9TkR^-ZSHTQ=RVHY^fQ-qe)vlofuPf2ep|M?pxsdT$1S%|Eoh&y{uv z1u{g>7=KAJQWUaqhntFo*K7Y(FcND9Ql|te!)UY7*~ARhoJ@tB^d&MkjO8C1*Mv-p zb%Iz!7s$#YYIIJ_`b|ak;ST{qE3|MkbVkW<|-`voS1=R^Ar~RU7-7FOfBWF8{ zKM&H{BXA}Fhu?#^wG%d)cb{qMHNxj3>~CyPka8cwu@>XlgQb89Q)K~{Z{)#6^M-L> z6xI6Ns|!Iyxs5mfQJ@kDUBZi=xNDlb5P`5V0WmNEImn-W9$El_h40v};D$<2tdT4N zo4bFHwX(_*Nl1_)9_SS>a#TO`st(m*WUl@pfb;KmVjl3sN?Cfvb* zPuNm!DiRan)KF`E3Wyq0KL*C-;6-*a9tsn|>Tn#g7lsW^3(>_!wjmX)YO$3$G&-H5T- zY5dIe;L*-k7!K9pOStJy%ry?GEP`W50cV-^@U7Zl0Onj*N)k4SRmsUESeRkE2mX4o^4mzj!Iz1DUcop=u0E+m81= zovQuRt-ft6lr<^0qT-!3;usGM^hox`UGZ={7TaOnnsib7BftPct~8qV;yMxl0000< KMNUMnLSTZX33?g; literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..8ce74b8685a44f9249ef375299eee77377bdf7c4 GIT binary patch literal 2291 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 c>AxcV8}W=ub3z|un;N;@AVBumPzkrCSnD~UG z@W|--3l`-U7R4tf<>cijBqnEO=X7@WL`BECxOq4_yV^N8l~-1!XJ&bL`9#OWMMlTk z+B-6Uf#OdVFs%b3L3T2*Dl1${n33!dG>y^mi_YO~g(7$F-Ytzhk{Bx5s}`8RVbOI` Ig@wTy0E*)@@c;k- literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..94fea4821e92d335128bc3400cda17e9b78ba098 GIT binary patch literal 1405 zcmZ?wbhEHbRAJC&_&$|^iH(zmoy))>dBy5A1;u6SHf-#lICzi6_9h@|^^%RxWvhxZjO_}E8 z;^yq;WnpdG($=Y}uGKeTl7W$luD(%vR<5bJWm#p7qqFOqx9_Yxyx1i)Tf6%BWR00c zRNR97Q}fG`b4$3S446gKdZtWj@0qaY;M$bD{DH>RIO`M=< zZj)D0wQBw1rp|6YIqj7E;?lZ?C9CGQ_I8M?nb)-y=U3E3B*#i=8e4gIa7gM_Hnp-# zsMoYMNoktZwl)`5)rzSZb@Wb*&noDfGC3kS+buXwP{A~(EHk61q^v$KIyE;qF1@V2 zpuC~Et+%(TsWmb+YvuX{Vrm9*y4Lj_&D_$Ovlh0AsTr#pTd_-M#b)GY6<6@d=`L9{ zcgpNZeo@I;C8e<$aZ;M5zLCkQCJuJqK6w>&b*&xqmdtha@Nstc?&#`ubar9po9ln71c zB_0ySSywnTn~(M?7?+)CC~P=6S;IH!OUK8i)6)%N*Qw0h^z5XE4)=>YCnu}>iRmhE z$a+o5;1+X`)QCMb^b4XI>6exS%uQ-8e}8Fz{r~&>l-TB&c`RAIT;v)5A_?tN z{WI*7_I~;KA$x^F$ccSlY)V%wbmILrF=0XdPDzUg$_y_)9uegDcc7J@!RF8d6$!s4 zg*H(mj$^X1I~4EAMM`{fmJbfdP-Kuy(unPrS!Z#CFZG3hdtQ#lr6Y=sZwy@8bq>vt z?wQOW>BLd@Vc}sh%NGjACI&EhK2fn0;9SBUQPt?GjuFE5|ZuP@7BWNH!1TCq?pB7<>3&###;l*N1$ zUM`su^y|fAq-5?-&} z@yJSh^~P_%UaeEGPdBy5A1;u6SHf-#lICzi6_9h@|^^%RxWvhxZjO_}E8 z;^yq;WnpdG($=Y}uGKeTl7W$luD(%vR<5bJWm#p7qqFOqx9_Yxyx1i)Tf6%BWR00c zRNR97Q}fG`b4$3S446gKdZtWj@0qaY;M$bD{DH>RIO`M=< zZj)D0wQBw1rp|6YIqj7E;?lZ?C9CGQ_I8M?nb)-y=U3E3B*#i=8e4gIa7gM_Hnp-# zsMoYMNoktZwl)`5)rzSZb@Wb*&noDfGC3kS+buXwP{A~(EHk61q^v$KIyE;qF1@V2 zpuC~Et+%(TsWmb+YvuX{Vrm9*y4Lj_&D_$Ovlh0AsTr#pTd_-M#b)GY6<6@d=`L9{ zcgpNZeo@I;C8e<$aZ;M5zLCkQCJuJqK6w>&b*&xqmdtha@Nstc?&#`ubar9po9ln71c zB_0ySSywnTn~(M?7?+)C_}FxEvW9QcmyW`Q)6)%N*QrDM33(o zg#$Z_`_3&$pK(EFQOQevmm(7-rS!nei{=>#Gkj+YsovU>d8b2`g+sw8bW+4d+0;%k z1;-L$kBtj=7T=yS$K3y*rRyx?fOR~Zl38{wFbugD@IPKK`3T307n(E8<&#+}UFr`l zY42OYJLj8e$OHvL`CoNHT305_mnwa7aei*AfY1YF1|Or7jeJ%d2b6h!9XQI*F88rT zPS{8yvE@Rog=ag%4+B?udx=R$fZ z&)KBu!k_&`!DY7W1dWq(E1u0%@8tUO^7;JwvW&)gEsru8Tg4O>yjav@RP{o+SH>|y>`bV zEA7>MUtYalzyBSV)4C(~cCA)sR9XFI(`hRw?M-LgX0O>i)gtNb)*ETBI~;D6Rp&ZA pXw!bT3VtQ&&YGO)d;mK4RprQm%7srr_TW@Y2p|26lkz4o^RQY`6?zK#qG>ra@ocD)4hB}-f* zN`mv#O3D+9QW+dm@{>{(JaZG%Q-e|yQz{EjrrH1%DSEm%hE&{2ni3rHGbBFz^oEL) oMr<_-W@=pvH?Ew?sBnPc@?rMyE%zCg02MQMy85}Sb4q9e09f)XiU0rr literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..b6833018582b1a2a9633494b97791823b89af727 GIT binary patch literal 224 zcmeAS@N?(olHy`uVBq!ia0vp^Yzz#HIvhZf;X%)#H9(3b-O<;Pfnog#bJnhxK)z&& zYeY$Kep*R+Vo@rCV@iHfs)A>3VtQ&&YGO)d;mK4RprRsA7srr_TW@YUaybNuI9&Xm zlEdj0*jCJ&EB_}F>7W1OgknX22Kx&%a7WPgg^>CUHx3vIVCg! E0J-l+KL7v# literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..e5fa2b8c24f31dde305ae002465dc6657c11ee6f GIT binary patch literal 141 zcmeAS@N?(olHy`uVBq!ia0vp^CxDodgAGW|-v96skYY)9^mSxlSbxHtwd*C2FInOm zQ4*Y=R#Ki=l*-_klAn~S;F+74o*I;zm{M7IGSvpCNZ!-MF{I*FQb|GC|04!mZU;3S l7&jUQ^7Q(iC#}q*&4&eH|GX)}JtE?Rp91OP07s zlmzFem6RtIr7}3ChDJ|&5vDKKe@gsNL-V3LQ>M#DfJo&`y=3I`YpZFtPMbQbIc>SgeB^>bP0l+XkK D2|F)$ literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..8dcd2d18113e09c9f86e9a4509456cadbe1ac172 GIT binary patch literal 748 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 N*C=k-xWSRZ8USbmP;3AI literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..9794880da17d4597bed347cb956cb11d3b52346d GIT binary patch literal 890 zcmZ?wbhEHbWMzEZ3~;S=EK;^E=#JAcs5@RI_mMvvBdVaPl#Xg3%BdQX!!D zlLhQv9S{l16AT>T4B{Ly2@Z{ptn6|cAsGu3o!JBw-DX%6Ho10-8l_D+Fj2XsU!Jjp zN1%bBk%gI!L!e=SLnE6(V$cjr;pVfmEsCG*Ik0*8`T6$79I{?pR$N@{B&!iBCBR?} E0Q!(RH~;_u literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..df13974b11ed2cf774b9097659374b741de42c47 GIT binary patch literal 1894 zcmV-s2buUsNk%w1VFUnB0r&p^H8wacJ5-yVp>T6{2pTh4Wo-r)Dn39$fP;pDh>df0 zc}`JPM_YZBmzf|VC9STnFflWAczbw&g@=iXgocT0ZgC$nRh^)se}aWePErI02|z(Y zGC*C7j*&-HUlAih2?`5{ij5T+9zjDzDl9K3J!32_E+Z!^DK$!Ye1EI2v8k)9Ph4hQ zU}Kh=otc`Oc7KK?Cn*F95JE&oKtxC_J4hNWPCGn40|W*P9ywZDT_GVNFfufppP`nU zo&p95EICFtI64LxEh;xoY<7M=LPjPkF9Q@MLqhb9v>wpCzqL=jgOL+PNae7TzV^3RTeuj)GH%N_; zk~KtNB`PjhV{4n7o>5g;QdCuwm6%CffUmK#cY1v$C@Uo}M4O$TQd3nRB`G5=Ly?k{ zdVPS7kdvaPsiUZ>FhFBuZg>X?3@b1+EiyJII$&&ed~J7pe}RN!ZFFOAb|NGvLq|&k z1qT2C00000A^8LW00930EC2ui00aO~0RRa90RR1arR85A9mqmdDh5f~2uQ=+%oxWe z(uhQx_#AL0iGq|K(JHwcLJ)}fK6D|*i0fKm>D1*z-oE9kn4cNjcMuiME%TS@GVHXuF z8Z=Rv7n;g34g9EBLQTaAYbUIYpoT&Tb*x*cvC1nVVhIx`lbF!>r^JasEy%UlS#GC} z^Ez>&$ALo~j+*Og+GuaHru!N+;L!~K7(bwl`7$lix7fmdONRFuWXPXSzrGAA`19-E zPX&tq{{Z@T!hk1eU?6JzBq)$61+lTn9UZg+%M^Nu5k(k!fN)0`efaam7p(Zh1s5Io zBZe4!_yYg{qWI&57Z~^h0R*b}(?u5%_+x?z3ityC7-RU;Pd`BpStOA{A~_@(Niw-) zlTBuULqDV}kw!m(oZwFy|13a@1_H@4iWY1L#Kjy9{If$EgiN5w4q|+g2PzcZYU-$`W>HE%X~=^}8vdOBP>4K+obeASnH-m#KfLO=qX`=XyFnPlhVkKtBaV3D zi7T%7;)^rRc;k(~n(*U~LuRY(w%m5>?YG+Y>dzVE+WOBSFZ|;mgc4F{A%+@q=pl$A zl4v4|DzfMzj55+_BaXiI_~VfTCt2{52>0Wp!ck6H<&{}(+2xmEj#=hEXQsJkn{UQB zXPtNExo4k$20Cb=hbFqHKaD;b>7yuqWjMTsce7%IL>&p$_Boy z;07M2Tp-B|D)=DC0q@ZNvBnM1yn#Rv&p5)47tP#5P7(<)GXM!N6i`7qdt3v|KGk?& z#u7DLv3cj4PviL#(-^QhH9~Bj3jv!4ki+J+5VQFg; z<5)K^NM;QYmU$4*O-BIn13&ri-#`D^*q;Fc$PXc)V1EP{!v1m)fc<@-7W=aS2T%hK zb?gQOvG~m-9DoF`SVC9G!Gj3#@PG%r;uRN2;RSjifEN0|1u&$8443hS8ot31IF!I1 zcDRQ@_)s4O2x0+4SU^M;c;JX0xPlU^pu{Uwp$Y~t02GBl#VQJc09YhI4z`$s4|wqd gPYB}^EI>vJ)T0DwWPmuEZ3~;S=EK;^E=#JAcs5@RI_mMvvBdVaPl!=0L7myU@;vK z39^%c)!~7XUR#pZ@x`mcZW|fMoc)|~J9M764gX*J1_J>F0iotbhXxH1sQ`^stD_O? aZ{&PC^tNjM{hkURz1ioJ+M{Hd7_0#pA~@#& literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..45295a6a674c22f557c96ac3de4c357f030ffd5d GIT binary patch literal 888 zcmZ?wbhEHbWMNQcXlG!Uw)WiSV-GeTf3W4)gDuA&Y(4RC+lhzUPd?m!>fw%44|kq^ zxcl_uJ!c;8J@FJ(jXZlv0>0f!aYsH10RhK8MIyY(c`N?Z8Ojvhi z;<{^7*It~q{^GPPw`Od(G;`zSncHs9+x4*bz}Lx#zs@}Nb^gh(OV4~=eeT z&))xX{=t`v4?bRe`1$gqPgfs*eE8<)^AFz{M!{$ZkQD-oKUo+-8g)PfC{HkO{AXZX z!eM0KFoD6I@0Z1m#}E3Nt@xfW)KQW>U1m+;1-7G2Ow9r;2?j^` zo9%eM8SFT`fUnt-=TSyxK+qhNKHthKL_ynT{_YNC}&5h@{9LyzR4{l+Tkqc_^V036H-IfyjX6?gr_XqE- zc%J|F=t=&_aa=`d`huKCpE%EISnX%vO)lZNY;vOghW-V2E_p774u%F!h8+wIJPbb= z8Uz?57#oBbEEpR^7%CVWBp7BeHpnpCU~G_Q;5byz_2s#|_di8}1SUp30R?78I{^h2 zMmK>4ER22v3apHA0t#%5X#xuDjAa53*cqDy5*q#ori;dKxXe5-g*)WrfvNl{oCl`~ zmS`TFF5KdIaEADl&Vw^0mz+E}OLoi8gR>QmtUNF$?CW>=P(}v9$@41Ty-c6q@JaK< z{AM<<7jxBu+(Wq>0ZUu5U^?% zvTYN#?+|tB7I)}W4x90B6AT>E42%vH4GazpjLaM& W1_cU@O{_dp7Bf6HK04CCU=0Ai6B!8r literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..8e1fcb0d1a8b8dd170b02502ed19a148d0160da3 GIT binary patch literal 84237 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

SqIyFY+Z2YM&w{N35MlCz>Y?q;k=6tda0vwLC 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 literal 0 HcmV?d00001 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("