diff --git a/.classpath b/.classpath new file mode 100644 index 0000000..e68d666 --- /dev/null +++ b/.classpath @@ -0,0 +1,36 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/.project b/.project new file mode 100644 index 0000000..39b0165 --- /dev/null +++ b/.project @@ -0,0 +1,59 @@ + + + reports + reports project + + + + + org.eclipse.wst.jsdt.core.javascriptValidator + + + + + org.eclipse.wst.common.project.facet.core.builder + + + + + org.eclipse.jdt.core.javabuilder + + + + + org.eclipse.wst.validation.validationbuilder + + + + + org.maven.ide.eclipse.maven2Builder + + + + + com.google.gdt.eclipse.core.webAppProjectValidator + + + + + com.google.gwt.eclipse.core.gwtProjectValidator + + + + + org.eclipse.m2e.core.maven2Builder + + + + + + org.eclipse.m2e.core.maven2Nature + org.eclipse.jem.workbench.JavaEMFNature + org.eclipse.wst.common.modulecore.ModuleCoreNature + org.maven.ide.eclipse.maven2Nature + org.eclipse.jdt.core.javanature + org.eclipse.wst.common.project.facet.core.nature + org.eclipse.wst.jsdt.core.jsNature + com.google.gwt.eclipse.core.gwtNature + + diff --git a/.settings/.jsdtscope b/.settings/.jsdtscope new file mode 100644 index 0000000..ba3c245 --- /dev/null +++ b/.settings/.jsdtscope @@ -0,0 +1,15 @@ + + + + + + + + + + + + diff --git a/.settings/com.google.appengine.eclipse.core.prefs b/.settings/com.google.appengine.eclipse.core.prefs new file mode 100644 index 0000000..a60576c --- /dev/null +++ b/.settings/com.google.appengine.eclipse.core.prefs @@ -0,0 +1,3 @@ +#Thu Jun 16 10:18:26 CEST 2011 +eclipse.preferences.version=1 +filesCopiedToWebInfLib= diff --git a/.settings/com.google.gdt.eclipse.core.prefs b/.settings/com.google.gdt.eclipse.core.prefs new file mode 100644 index 0000000..c8ef83a --- /dev/null +++ b/.settings/com.google.gdt.eclipse.core.prefs @@ -0,0 +1,6 @@ +#Wed Feb 06 12:30:01 CET 2013 +eclipse.preferences.version=1 +jarsExcludedFromWebInfLib= +lastWarOutDir=/Users/massi/Documents/workspace/reports/target/reports-4.0.0-SNAPSHOT +warSrcDir=src/main/webapp +warSrcDirIsOutput=false diff --git a/.settings/com.google.gwt.eclipse.core.prefs b/.settings/com.google.gwt.eclipse.core.prefs new file mode 100644 index 0000000..c803c44 --- /dev/null +++ b/.settings/com.google.gwt.eclipse.core.prefs @@ -0,0 +1,5 @@ +#Thu Jun 16 11:14:17 CEST 2011 +eclipse.preferences.version=1 +entryPointModules= +filesCopiedToWebInfLib=gwt-servlet.jar +gwtCompileSettings=PGd3dC1jb21waWxlLXNldHRpbmdzPjxsb2ctbGV2ZWw+SU5GTzwvbG9nLWxldmVsPjxvdXRwdXQtc3R5bGU+T0JGVVNDQVRFRDwvb3V0cHV0LXN0eWxlPjxleHRyYS1hcmdzPjwhW0NEQVRBWy13YXIgc3JjL21haW4vd2ViYXBwXV0+PC9leHRyYS1hcmdzPjx2bS1hcmdzPjwhW0NEQVRBWy1YbXg1MTJtXV0+PC92bS1hcmdzPjxlbnRyeS1wb2ludC1tb2R1bGU+Y29tLmNvbXBhbnkuU29tZU1vZHVsZTwvZW50cnktcG9pbnQtbW9kdWxlPjwvZ3d0LWNvbXBpbGUtc2V0dGluZ3M+ diff --git a/.settings/org.eclipse.core.resources.prefs b/.settings/org.eclipse.core.resources.prefs new file mode 100644 index 0000000..0a6af5e --- /dev/null +++ b/.settings/org.eclipse.core.resources.prefs @@ -0,0 +1,7 @@ +#Wed Feb 06 12:30:01 CET 2013 +eclipse.preferences.version=1 +encoding//src/main/java=UTF-8 +encoding//src/main/resources=UTF-8 +encoding//src/test/java=UTF-8 +encoding//src/test/resources=UTF-8 +encoding/=UTF-8 diff --git a/.settings/org.eclipse.jdt.core.prefs b/.settings/org.eclipse.jdt.core.prefs new file mode 100644 index 0000000..649e327 --- /dev/null +++ b/.settings/org.eclipse.jdt.core.prefs @@ -0,0 +1,9 @@ +#Wed Feb 06 16:46:46 CET 2013 +eclipse.preferences.version=1 +org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled +org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.6 +org.eclipse.jdt.core.compiler.compliance=1.6 +org.eclipse.jdt.core.compiler.problem.assertIdentifier=error +org.eclipse.jdt.core.compiler.problem.enumIdentifier=error +org.eclipse.jdt.core.compiler.problem.forbiddenReference=warning +org.eclipse.jdt.core.compiler.source=1.6 diff --git a/.settings/org.eclipse.m2e.core.prefs b/.settings/org.eclipse.m2e.core.prefs new file mode 100644 index 0000000..226ace2 --- /dev/null +++ b/.settings/org.eclipse.m2e.core.prefs @@ -0,0 +1,5 @@ +#Wed Feb 06 12:30:01 CET 2013 +activeProfiles= +eclipse.preferences.version=1 +resolveWorkspaceProjects=true +version=1 diff --git a/.settings/org.eclipse.wst.common.component b/.settings/org.eclipse.wst.common.component new file mode 100644 index 0000000..3fa2417 --- /dev/null +++ b/.settings/org.eclipse.wst.common.component @@ -0,0 +1,14 @@ + + + + + + + + + uses + + + + + diff --git a/.settings/org.eclipse.wst.common.project.facet.core.xml b/.settings/org.eclipse.wst.common.project.facet.core.xml new file mode 100644 index 0000000..5e7f92e --- /dev/null +++ b/.settings/org.eclipse.wst.common.project.facet.core.xml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/.settings/org.eclipse.wst.jsdt.ui.superType.container b/.settings/org.eclipse.wst.jsdt.ui.superType.container new file mode 100644 index 0000000..3bd5d0a --- /dev/null +++ b/.settings/org.eclipse.wst.jsdt.ui.superType.container @@ -0,0 +1 @@ +org.eclipse.wst.jsdt.launching.baseBrowserLibrary \ No newline at end of file diff --git a/.settings/org.maven.ide.eclipse.prefs b/.settings/org.maven.ide.eclipse.prefs new file mode 100644 index 0000000..c74c58e --- /dev/null +++ b/.settings/org.maven.ide.eclipse.prefs @@ -0,0 +1,9 @@ +#Thu Sep 02 10:42:12 CEST 2010 +activeProfiles= +eclipse.preferences.version=1 +fullBuildGoals=process-test-resources +includeModules=false +resolveWorkspaceProjects=true +resourceFilterGoals=process-resources resources\:testResources +skipCompilerPlugin=true +version=1 diff --git a/ReportGeneratorTest-dev.launch b/ReportGeneratorTest-dev.launch new file mode 100644 index 0000000..04c6d1d --- /dev/null +++ b/ReportGeneratorTest-dev.launch @@ -0,0 +1,22 @@ + + + + + + + + + + + + + + + + + + + + + + diff --git a/ReportGeneratorTest-prod.launch b/ReportGeneratorTest-prod.launch new file mode 100644 index 0000000..b9f63f9 --- /dev/null +++ b/ReportGeneratorTest-prod.launch @@ -0,0 +1,22 @@ + + + + + + + + + + + + + + + + + + + + + + diff --git a/distro/INSTALL b/distro/INSTALL new file mode 100644 index 0000000..50f1ea7 --- /dev/null +++ b/distro/INSTALL @@ -0,0 +1,8 @@ +To install the Template Creator portlet you need the following requirements: + + * The Portlet WAR. + * The Dependecies JARs as declared in the Service Profile. + +First of all you need a Portal properly configured and running. + + diff --git a/distro/LICENSE b/distro/LICENSE new file mode 100644 index 0000000..630ba97 --- /dev/null +++ b/distro/LICENSE @@ -0,0 +1,6 @@ +gCube System - License +------------------------------------------------------------ + +The gCube/gCore software is licensed as Free Open Source software conveying to the EUPL (http://ec.europa.eu/idabc/eupl). +The software and documentation is provided by its authors/distributors "as is" and no expressed or +implied warranty is given for its use, quality or fitness for a particular case. diff --git a/distro/MAINTAINERS b/distro/MAINTAINERS new file mode 100644 index 0000000..ffed162 --- /dev/null +++ b/distro/MAINTAINERS @@ -0,0 +1,5 @@ +Mantainers +------- + +* Massimiliano Assante (massimiliano.assante@isti.cnr.it), CNR Pisa, + Istituto di Scienza e Tecnologie dell'Informazione "A. Faedo". diff --git a/distro/README b/distro/README new file mode 100644 index 0000000..4da1049 --- /dev/null +++ b/distro/README @@ -0,0 +1,55 @@ +The gCube System - Template Creator portlet +------------------------------------------------------------ + +This work has been partially supported by the following European projects: +DILIGENT (FP6-2003-IST-2), D4Science (FP7-INFRA-2007-1.2.2), D4Science-II (FP7-INFRA-2008-1.2.2), +iMarine (FP7-INFRASTRUCTURES-2011-2), and EUBrazilOpenBio (FP7-ICT-2011-EU-Brazil). + + + +Authors +------- + +* Massimiliano Assante (massimiliano.assante@isti.cnr.it), CNR Pisa, + Istituto di Scienza e Tecnologie dell'Informazione "A. Faedo". + + +Version and Release Date +------------------------ + +v. 1.0.0, 15/12/2008 + + +Description +----------- + + + +Download information +-------------------- + +Source code is available from SVN: +http://svn.research-infrastructures.eu/public/d4science/gcube/trunk/portlets/user/ReportGenerator-portlet + + +Binaries can be downloaded from: +http://software.d4science.research-infrastructures.eu/ + + +Documentation +------------- + +Documentation is available on-line from the Projects Documentation Wiki: + +https://gcube.wiki.gcube-system.org/gcube/index.php/Common_Functionality#Report_Generation + + + +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..02a19d2 --- /dev/null +++ b/distro/changelog.xml @@ -0,0 +1,7 @@ + + +Top menu restyled +adapted to new Workspace Tree +adapted to new Home Library + + \ No newline at end of file diff --git a/distro/descriptor.xml b/distro/descriptor.xml new file mode 100644 index 0000000..4efc827 --- /dev/null +++ b/distro/descriptor.xml @@ -0,0 +1,48 @@ + + servicearchive + + tar.gz + + / + + + ${distroDirectory} + / + true + + README + LICENSE + INSTALL + MAINTAINERS + changelog.xml + + 755 + true + + + target/apidocs + /${artifactId}/doc/api + true + 755 + + + + + ${distroDirectory}/profile.xml + ./ + true + + + target/${build.finalName}.war + /${artifactId} + + + ${distroDirectory}/svnpath.txt + /${artifactId} + true + + + \ No newline at end of file diff --git a/distro/profile.xml b/distro/profile.xml new file mode 100644 index 0000000..51c3b6b --- /dev/null +++ b/distro/profile.xml @@ -0,0 +1,25 @@ + + + + Service + + ${description} + PortletUser + ${artifactId} + ${version} + + + ${artifactId} + ${version} + + ${groupId} + ${artifactId} + ${version} + + + target/${build.finalName}.war + + + + + diff --git a/distro/svnpath.txt b/distro/svnpath.txt new file mode 100644 index 0000000..edacb04 --- /dev/null +++ b/distro/svnpath.txt @@ -0,0 +1 @@ +${scm.url} \ No newline at end of file diff --git a/pom.xml b/pom.xml new file mode 100644 index 0000000..fb128b8 --- /dev/null +++ b/pom.xml @@ -0,0 +1,309 @@ + + + + 4.0.0 + + maven-parent + org.gcube.tools + 1.0.0 + + + + org.gcube.portlets.user + reports + war + 4.0.0-SNAPSHOT + gCube Reports Portlet + + gCube Reports Portlet. + + + scm:svn:http://svn.d4science.research-infrastructures.eu/gcube/trunk/portlets/user/${project.artifactId} + scm:https://svn.d4science.research-infrastructures.eu/gcube/trunk/portlets/user/${project.artifactId} + http://svn.d4science.research-infrastructures.eu/gcube/trunk/portlets/user/${project.artifactId} + + + + 2.4.0 + distro + + 1.6 + 1.6 + ${project.build.directory}/${project.build.finalName} + + UTF-8 + UTF-8 + + + + + + xerces + xercesImpl + 2.9.1 + provided + + + com.google.gwt + gwt-user + ${gwtVersion} + provided + + + com.google.gwt + gwt-servlet + ${gwtVersion} + provided + + + org.gcube.applicationsupportlayer + aslsocial + [0.1.0-SNAPSHOT, 1.0.0-SNAPSHOT) + provided + + + org.gcube.portlets.user + gcube-widgets + [1.4.0-SNAPSHOT, 2.0.0-SNAPSHOT) + provided + + + org.gcube.portlets.user + guided-tour-widget + [1.2.0-SNAPSHOT, 2.0.0-SNAPSHOT) + provided + + + org.gcube.portal + custom-portal-handler + [1.2.0-SNAPSHOT, 2.0.0-SNAPSHOT) + provided + + + com.sencha.gxt + gxt + 2.2.5 + provided + + + org.gcube.common + csv4j + 1.2.0-SNAPSHOT + provided + + + org.gcube.portlets.user + workspace-light-tree + [2.9.0-SNAPSHOT, 3.0.0-SNAPSHOT) + provided + + + org.gcube.portlets.admin + document-workflow-library + [1.2.0-SNAPSHOT, 2.0.0-SNAPSHOT) + provided + + + org.gcube.portlets.user + gcube-docx-generator + [1.0.0-SNAPSHOT, 2.0.0-SNAPSHOT) + + + org.gcube.portal + gcube-reporting-library + [3.0.0-SNAPSHOT, 4.0.0-SNAPSHOT) + provided + + + org.gcube.portlets.user + workspace-tree-widget + [6.0.0-SNAPSHOT, 7.0.0-SNAPSHOT) + provided + + + org.gcube.portlets.user + home-library + [4.3.0-SNAPSHOT, 5.0.0-SNAPSHOT) + provided + + + org.gcube.portlets.user + home-library-jcr + [1.3.0-SNAPSHOT, 2.0.0-SNAPSHOT) + provided + + + org.gcube.applicationsupportlayer + accesslogger + [1.2.0-SNAPSHOT, 2.0.0-SNAPSHOT) + provided + + + org.apache.derby + derby + 10.8.2.2 + provided + + + com.liferay.portal + portal-service + 6.0.6 + provided + + + log4j + log4j + 1.2.16 + runtime + + + org.slf4j + slf4j-log4j12 + 1.6.4 + runtime + + + org.slf4j + slf4j-api + 1.6.4 + runtime + + + com.allen-sauer.gwt.log + gwt-log + 3.1.8 + provided + + + javax.portlet + portlet-api + 2.0 + provided + + + junit + junit + 4.7 + test + + + javax.validation + validation-api + 1.0.0.GA + test + + + javax.validation + validation-api + 1.0.0.GA + sources + test + + + + + + ${webappDirectory}/WEB-INF/classes + + + + + + org.codehaus.mojo + gwt-maven-plugin + 2.4.0 + + + + compile + + + + + + + Messages.html + ${webappDirectory} + + + + + + org.apache.maven.plugins + maven-war-plugin + 2.1.1 + + + compile + + exploded + + + + + ${webappDirectory} + + + + org.apache.maven.plugins + maven-compiler-plugin + 2.3.2 + + 1.6 + 1.6 + + + + + org.apache.maven.plugins + maven-assembly-plugin + 2.2 + + + ${distroDirectory}/descriptor.xml + + + + + servicearchive + install + + single + + + + + + org.apache.maven.plugins + maven-resources-plugin + 2.5 + + + copy-profile + install + + copy-resources + + + target + + + ${distroDirectory} + true + + profile.xml + + + + + + + + + + + + \ No newline at end of file diff --git a/src/main/java/org/gcube/portlets/user/reportgenerator/client/Headerbar.java b/src/main/java/org/gcube/portlets/user/reportgenerator/client/Headerbar.java new file mode 100644 index 0000000..4772ba9 --- /dev/null +++ b/src/main/java/org/gcube/portlets/user/reportgenerator/client/Headerbar.java @@ -0,0 +1,695 @@ +package org.gcube.portlets.user.reportgenerator.client; + + +import java.util.List; + +import org.gcube.portlets.d4sreporting.common.shared.Metadata; +import org.gcube.portlets.user.gcubewidgets.client.popup.GCubeDialog; +import org.gcube.portlets.user.reportgenerator.client.Presenter.CommonCommands; +import org.gcube.portlets.user.reportgenerator.client.Presenter.Presenter; +import org.gcube.portlets.user.reportgenerator.client.dialog.ImporterDialog; +import org.gcube.portlets.user.reportgenerator.client.dialog.PagePropertiesDialog; +import org.gcube.portlets.user.reportgenerator.client.model.ExportManifestationType; +import org.gcube.portlets.user.reportgenerator.client.model.TemplateModel; +import org.gcube.portlets.user.workspace.lighttree.client.ItemType; +import org.gcube.portlets.user.workspace.lighttree.client.event.PopupEvent; +import org.gcube.portlets.user.workspace.lighttree.client.event.PopupHandler; +import org.gcube.portlets.user.workspace.lighttree.client.load.WorkspaceLightTreeLoadPopup; + +import com.extjs.gxt.ui.client.widget.MessageBox; +import com.google.gwt.core.client.GWT; +import com.google.gwt.core.client.RunAsyncCallback; +import com.google.gwt.user.client.Command; +import com.google.gwt.user.client.Window; +import com.google.gwt.user.client.ui.CellPanel; +import com.google.gwt.user.client.ui.Composite; +import com.google.gwt.user.client.ui.Grid; +import com.google.gwt.user.client.ui.HTML; +import com.google.gwt.user.client.ui.HasHorizontalAlignment; +import com.google.gwt.user.client.ui.HasVerticalAlignment; +import com.google.gwt.user.client.ui.HorizontalPanel; +import com.google.gwt.user.client.ui.MenuBar; +import com.google.gwt.user.client.ui.MenuItem; +import com.google.gwt.user.client.ui.MenuItemSeparator; +import com.google.gwt.user.client.ui.RichTextArea; + + + +/** + * Headerbar class is the top bar component of the UI + * + * @author Massimiliano Assante, ISTI-CNR - massimiliano.assante@isti.cnr.it + * + * @version July 2011 (3.0) + */ +public class Headerbar extends Composite{ + + private static final String ADD_BIBLIO_ENTRY = "Add citation"; + private static final String VIEW_BIBLIO = "View Bibliography"; + private static final String MANAGE_BIBLIO = "Delete citation(s)"; + private static final String EXPORT_OPENXML = "Export to OpenXML (docx)"; + private static final String EXPORT_HTML = "Export to HTML"; + private static final String EXPORT_FIMES = "Export to FiMES XML"; + + private static final String VIEW_USER_COMMENTS = "View user comments"; + + String location; + + private Presenter presenter; + + /** + * the template Model + */ + private TemplateModel templateModel; + + /** + * mainLayout Panel + */ + private CellPanel mainLayout = new HorizontalPanel(); + + + //private MenuItem optionPDF; + + private MenuItem importModel; + + private MenuItem addBiblioEntry; + + private MenuItem viewBiblio; + + private MenuItem manageBiblio; + + private MenuItem optionHTML; + + private MenuItem optionDOCX; + + private MenuItem optionFimes; + + private MenuItem viewMetadata; + + private MenuItem viewComments; + + private MenuItem discardSection; + + + + MenuBar menuBar = new MenuBar(); + + MenuItem fileMenu; + MenuItem viewMenu; + MenuItem sectionsMenu; + MenuItem biblioMenu; + MenuItem exportMenu; + MenuItemSeparator separator1; + MenuItemSeparator separator2; + MenuItemSeparator separator3; + MenuItemSeparator separator4; + + /** + * Constructor + * @param c the controller instance for this UI component + */ + public Headerbar(Presenter c) { + this.presenter = c; + this.templateModel = presenter.getModel(); + + menuBar.setAutoOpen(false); + // menuBar.setWidth("100px"); + menuBar.setAnimationEnabled(true); + fileMenu = getFileMenu(); + menuBar.addItem(fileMenu); + separator1 = menuBar.addSeparator(); + viewMenu = getViewMenu(); + menuBar.addItem(viewMenu); + separator2 = menuBar.addSeparator(); + sectionsMenu = getSectionMenu(); + menuBar.addItem(sectionsMenu); + separator3 = menuBar.addSeparator(); + biblioMenu = getBiblioMenu(); + menuBar.addItem(biblioMenu); + separator4 = menuBar.addSeparator(); + exportMenu = getExportsMenu(); + menuBar.addItem(exportMenu); + + mainLayout.setSize("100%", "24px"); + mainLayout.setStyleName("menubar"); + + mainLayout.add(menuBar); + + //design the part for the template name and the pages handling + + HorizontalPanel captionPanel = new HorizontalPanel(); + captionPanel.setWidth("100%"); + + HorizontalPanel pageHandlerPanel = new HorizontalPanel(); + pageHandlerPanel.setHeight("24"); + pageHandlerPanel.setVerticalAlignment(HasVerticalAlignment.ALIGN_MIDDLE); + + captionPanel.setHorizontalAlignment(HasHorizontalAlignment.ALIGN_CENTER); + mainLayout.add(captionPanel); + mainLayout.add(pageHandlerPanel); + mainLayout.setCellHorizontalAlignment(menuBar, HasHorizontalAlignment.ALIGN_LEFT); + mainLayout.setCellHorizontalAlignment(captionPanel, HasHorizontalAlignment.ALIGN_LEFT); + mainLayout.setCellWidth(menuBar, "200"); + mainLayout.setCellWidth(pageHandlerPanel, "200"); + initWidget(mainLayout); + } + + public void setMenuForWorkflowDocument(boolean canUpdate) { + presenter.setMenuForWorkflowDocument(true); + menuBar.removeItem(fileMenu); + menuBar.removeItem(viewMenu); + menuBar.removeItem(sectionsMenu); + menuBar.removeItem(biblioMenu); + menuBar.removeSeparator(separator1); + menuBar.removeSeparator(separator2); + menuBar.removeItem(exportMenu); + + MenuBar workflowMenu = new MenuBar(true); + workflowMenu.setAnimationEnabled(true); + + MenuItem menu = new MenuItem("Workflow Document Options", true, workflowMenu); + menu.setWidth("400px"); + Command updateWfDocument = new Command() { + public void execute() { + presenter.updateWorkflowDocument(true); + } + }; + Command backCommand = new Command() { + public void execute() { + presenter.updateWorkflowDocument(false); + } + }; + + Command showChanges = new Command() { + public void execute() { + presenter.showLastChangesPopup(); + } + }; + + if (canUpdate) + workflowMenu.addItem("Update this document", updateWfDocument); + //workflowMenu.addItem("Show previous changes", showChanges); + workflowMenu.addSeparator(); + workflowMenu.addItem("Back to My Workflow Documents", backCommand); + + menuBar.addItem(menu); + separator1 = menuBar.addSeparator(); + viewMenu = getViewMenu(); + menuBar.addItem(viewMenu); + separator2 = menuBar.addSeparator(); + sectionsMenu = getSectionMenu(); + menuBar.addItem(sectionsMenu); + separator3 = menuBar.addSeparator(); + biblioMenu = getBiblioMenu(); + menuBar.addItem(biblioMenu); + separator4 = menuBar.addSeparator(); + exportMenu = getExportsMenu(); + menuBar.addItem(exportMenu); + ReportGenerator.get().getToolbarPanel().clear(); + ReportGenerator.get().getToolbarPanel().add(new HTML("  ", true)); + enableExports(); + } + /** + * Redirect to VRE Deployer Portlet + */ + private void loadWorkflowLibraryApp(){ + getUrl(); + location += "/../my-workflow-documents"; + Window.open(location, "_self", ""); + } + /** + * Get URL from browser + */ + public native void getUrl()/*-{ + this.@org.gcube.portlets.user.reportgenerator.client.Headerbar::location = $wnd.location.href; + }-*/; + + /** + * temporary command + * @return the command instance + */ + public Command getNullCommand() { + Command openNothing = new Command() { + + public void execute() { } + }; + + return openNothing; + } + /** + * temporary command + * @return the command instance + */ + public Command getBiblioCommand() { + Command openNothing = new Command() { + public void execute() { + MessageBox.alert("Warning ","A textarea must be selected to add an entry", null); + } + }; + return openNothing; + } + + + Command addCitationCmd = new Command() { + public void execute() { + presenter.openAddCitationDialog(); + } + }; + + Command viewBiblioCmd = new Command() { + public void execute() { + if (presenter.hasBibliography()) { + presenter.seekLastPage(); + } + else { + MessageBox.alert("Warning", "No bibliography found, to add bibliography start adding citations:
Bibliography > Add citation (from within a text area)", null); + } + } + }; + + Command manageBiblioCmd = new Command() { + public void execute() { + if (presenter.hasBibliography()) { + presenter.openManageCitationsDialog(); + } + else { + MessageBox.alert("Warning", "No bibliography found, to add bibliography start adding citations:
Bibliography > Add citation (from within a text area)", null); + } + } + }; + + /** + * + * @return + */ + private MenuItem getBiblioMenu() { + // Create the Options menu + MenuBar biblioMenu = new MenuBar(true); + MenuItem toReturn = new MenuItem("Bibliography", biblioMenu); + biblioMenu.setAnimationEnabled(true); + addBiblioEntry = new MenuItem(""+ ADD_BIBLIO_ENTRY +"", true, getBiblioCommand()); + biblioMenu.addItem(addBiblioEntry); + viewBiblio = new MenuItem(VIEW_BIBLIO, true, viewBiblioCmd); + manageBiblio = new MenuItem(MANAGE_BIBLIO, true, manageBiblioCmd); + biblioMenu.addSeparator(); + biblioMenu.addItem(manageBiblio); + biblioMenu.addItem(viewBiblio); + return toReturn; + } + /** + * + * @return + */ + private MenuItem getSectionMenu() { + // Create the Options menu + MenuBar insertsMenu = new MenuBar(true); + MenuItem toReturn = new MenuItem("Section", insertsMenu); + insertsMenu.setAnimationEnabled(true); + importModel = new MenuItem("Import from Template or Report", true, getNullCommand()); + insertsMenu.addItem(importModel); + viewMetadata = new MenuItem("View Metadata", true, getNullCommand()); + discardSection = new MenuItem("Discard current", true, getNullCommand()); + viewComments = new MenuItem(""+ VIEW_USER_COMMENTS+"", true, getNullCommand()); + insertsMenu.addItem(discardSection); + insertsMenu.addSeparator(); + insertsMenu.addItem(viewMetadata); + insertsMenu.addItem(viewComments); + return toReturn; + } + + + private MenuItem getExportsMenu() { + MenuBar exportsMenu = new MenuBar(true); + + exportsMenu.setAnimationEnabled(true); + MenuItem toReturn = new MenuItem("Export", exportsMenu); + + optionDOCX = new MenuItem(""+ EXPORT_OPENXML +"", true, getNullCommand()); + // optionPDF = new MenuItem("Export to PDF", true, getNullCommand()); + optionHTML = new MenuItem(""+ EXPORT_HTML +"", true, getNullCommand()); + optionFimes = new MenuItem(""+ EXPORT_FIMES +"", true, getNullCommand()); + + exportsMenu.addItem(optionDOCX); + exportsMenu.addItem(optionHTML); + + //optionsMenu.addItem(optionPDF); + //exportsMenu.addItem(optionFimes); + + return toReturn; + } + + private MenuItem getViewMenu() { + Command openPageProperties = new Command() { + public void execute() { + int left = mainLayout.getAbsoluteLeft() + 50; + int top = mainLayout.getAbsoluteTop() + 25; + PagePropertiesDialog dlg = new PagePropertiesDialog(templateModel, presenter); + dlg.setPopupPosition(left, top); + dlg.setAnimationEnabled(true); + dlg.show(); + } + }; + + Command showReportStructure = new Command() { + public void execute() { + presenter.showReportStructure(); + } + }; + + // Create the Options menu + MenuBar optionsMenu = new MenuBar(true); + + optionsMenu.setAnimationEnabled(true); + MenuItem toReturn = new MenuItem("View", optionsMenu); + + optionsMenu.addItem("View Properties", openPageProperties); + optionsMenu.addItem("View Structure", showReportStructure); + optionsMenu.addSeparator(); + + return toReturn; + } + + /** + * rewrite with setHTML to remove the gray color + */ + public void enableExports() { + + optionDOCX.setHTML(EXPORT_OPENXML); + optionDOCX.setCommand(generateDOCX); + + // optionPDF.setHTML("Export to PDF"); + // optionPDF.setCommand(generatePDF); + + optionHTML.setHTML(EXPORT_HTML); + optionHTML.setCommand(generateHTML); + + optionFimes.setHTML(EXPORT_FIMES); + optionFimes.setCommand(generateFimes); + // + importModel.setHTML("Import from Template or Report"); + importModel.setCommand(importModelOrReport); + + viewMetadata.setHTML("View Metadata"); + viewMetadata.setCommand(openMetadata); + + viewComments.setHTML(VIEW_USER_COMMENTS); + viewComments.setCommand(showUserComments); + + discardSection.setHTML("Discard current"); + discardSection.setCommand(discardSectionCom); + + } + /** + * + */ + Command showUserComments = new Command() { + public void execute() { + presenter.showSectionUserCommentsTooltips(); + } + }; + /** + * rewrite with setHTML to remove the gray color + * @param d4sArea + */ + public void enableBiblioEntry(RichTextArea d4sArea) { + addBiblioEntry.setHTML(ADD_BIBLIO_ENTRY); + addBiblioEntry.setCommand(addBiblioEntryCommand); + presenter.setAreaForBiblio(d4sArea); + } + + /** + * build the File Menu + * @return + */ + + private MenuItem getFileMenu() { + Command newTemplate = new Command() { + public void execute() { + presenter.changeTemplateName(TemplateModel.DEFAULT_NAME); + presenter.cleanAll(); + } + }; + Command openTemplate = new Command() { + public void execute() { + GWT.runAsync(WorkspaceLightTreeLoadPopup.class, new RunAsyncCallback() { + public void onSuccess() { + + int left = mainLayout.getAbsoluteLeft() + 50; + int top = mainLayout.getAbsoluteTop() + 25; + + WorkspaceLightTreeLoadPopup wpTreepopup = new WorkspaceLightTreeLoadPopup("Open Template", true, true); + wpTreepopup.setShowableTypes(ItemType.REPORT_TEMPLATE); + wpTreepopup.setSelectableTypes(ItemType.REPORT_TEMPLATE); + + wpTreepopup.addPopupHandler(new PopupHandler() { + public void onPopup(PopupEvent event) { + if (! event.isCanceled()) { + if (event.getSelectedItem() != null) { + presenter.openTemplate(event.getSelectedItem().getName(), event.getSelectedItem().getId(), true); + } + presenter.getHeader().enableExports(); + } + } + }); + wpTreepopup.setPopupPosition(left, top); + wpTreepopup.show(); + } + + public void onFailure(Throwable reason) { + Window.alert("There are networks problem, please check your connection."); + } + }); + + + + } + }; + + Command openHelp = new Command() { + + public void execute() { + if (! ReportConstants.isDeployed) { + presenter.openTemplate("", "", true); + enableExports(); + } + else { + String url = "https://gcube.wiki.gcube-system.org/gcube/index.php/Common_Functionality#Report_Management"; + int width = Window.getClientWidth(); + int height = Window.getClientHeight(); + int winWidth = (int) (Window.getClientWidth() * 0.8); + int winHeight = (int) (Window.getClientHeight() * 0.7); + int left = (width - winWidth) / 2; + int top = (height - winHeight) / 2; + Window.open(url, null,"left=" + left + "top" + top + ", width=" + winWidth + ", height=" + winHeight + ", resizable=yes, scrollbars=yes, status=yes"); + } + + } + + }; + + Command openReport = new Command() { + public void execute() { + + GWT.runAsync(WorkspaceLightTreeLoadPopup.class, new RunAsyncCallback() { + public void onSuccess() { + int left = mainLayout.getAbsoluteLeft() + 50; + int top = mainLayout.getAbsoluteTop() + 25; + + WorkspaceLightTreeLoadPopup wpTreepopup = new WorkspaceLightTreeLoadPopup("Open Report", true, true); + wpTreepopup.setShowableTypes(ItemType.REPORT); + wpTreepopup.setSelectableTypes(ItemType.REPORT); + wpTreepopup.addPopupHandler(new PopupHandler() { + public void onPopup(PopupEvent event) { + if (! event.isCanceled()) { + if (event.getSelectedItem() != null) { + presenter.openTemplate(event.getSelectedItem().getName(), event.getSelectedItem().getId(), false); + } + presenter.getHeader().enableExports(); + } + + } + }); + wpTreepopup.setPopupPosition(left, top); + wpTreepopup.show(); + } + + public void onFailure(Throwable reason) { + Window.alert("There are networks problem, please check your connection."); + } + }); + } + }; + + Command saveReportAs = new Command() { + public void execute() { + CommonCommands cmd = new CommonCommands(presenter); + cmd.saveReportAsDialog(); + } + }; + + + + Command saveReport = new Command() { + public void execute() { + if (templateModel.getTemplateName().endsWith("d4sR")) + presenter.saveReport(); + else { + CommonCommands cmd = new CommonCommands(presenter); + cmd.saveReportAsDialog(); + } + } + }; + + Command importFimes = new Command() { + public void execute() { + presenter.showImportPopup(); + } + }; + + + + // Create the file menu + MenuBar fileMenu = new MenuBar(true); + fileMenu.setAnimationEnabled(true); + + MenuItem toReturn = new MenuItem("File", fileMenu); + fileMenu.addItem("Open template...", openTemplate); + // fileMenu.addSeparator(); + + // fileMenu.addItem("Open saved Report", getNullCommand()); + fileMenu.addSeparator(); + fileMenu.addItem("Open Report", openReport); + fileMenu.addItem("Save", saveReport); + fileMenu.addItem("Save As ..", saveReportAs); + fileMenu.addSeparator(); +// fileMenu.addItem("Import from FiMES XML", importFimes); + fileMenu.addItem("Close Report", newTemplate); + fileMenu.addSeparator(); + fileMenu.addItem("? Open User's Guide", openHelp); + return toReturn; + } + + /** + * + * @param model . + */ + public void setModel(TemplateModel model ) { + this.templateModel = model; + } + + //************** COMMANDS ********************************//// + + Command generateFimes = new Command() { + public void execute() { + presenter.generateFiMES(templateModel); + } + }; + + Command generateDOCX = new Command() { + public void execute() { + presenter.generateManifestation(templateModel, ExportManifestationType.DOCX); + } + }; + + Command generatePDF = new Command() { + public void execute() { + Window.alert("PDF Exporting may not be fully working, you can also generate a PDF using your Word Processor application starting from the docx exported file"); + presenter.generateManifestation(templateModel, ExportManifestationType.PDF); + } + }; + + Command generateHTML = new Command() { + public void execute() { + presenter.generateManifestation(templateModel, ExportManifestationType.HTML); + } + }; + + + Command discardSectionCom = new Command() { + public void execute() { + presenter.discardCurrentSection(); + } + }; + + //************** COMMANDS ********************************//// + Command addBiblioEntryCommand = new Command() { + public void execute() { + presenter.openAddCitationDialog(); + } + }; + + /** + * + */ + Command openMetadata = new Command() { + public void execute() { + int left = mainLayout.getAbsoluteLeft() + 50; + int top = mainLayout.getAbsoluteTop() + 25; + GCubeDialog dlg = new GCubeDialog(true); + dlg.setText("Report Metadata:"); + int pageNo = presenter.getModel().getCurrentPage(); + List metadatas = presenter.getModel().getSection(pageNo).getAllMetadata(); + int nRows = metadatas.size(); + Grid metadataGrid = new Grid(nRows, 2); + int i = 0; + for (Metadata md : metadatas) { + metadataGrid.setWidget(i, 0, new HTML("" + md.getAttribute() + ": ")); + metadataGrid.setWidget(i, 1, new HTML(md.getValue())); + i++; + } + + dlg.setWidget(metadataGrid); + dlg.setPopupPosition(left, top); + dlg.setAnimationEnabled(true); + dlg.show(); + } + }; + + Command importModelOrReport = new Command() { + public void execute() { + if (! ReportConstants.isDeployed) { + int left = mainLayout.getAbsoluteLeft() + 50; + int top = mainLayout.getAbsoluteTop() + 25; + ImporterDialog dlg = new ImporterDialog(null, presenter); + dlg.setPopupPosition(left, top); + dlg.setAnimationEnabled(true); + dlg.show(); + } + else { + + int left = mainLayout.getAbsoluteLeft() + 50; + int top = mainLayout.getAbsoluteTop() + 25; + WorkspaceLightTreeLoadPopup wpTreepopup = new WorkspaceLightTreeLoadPopup("Pick the item you want to import from", true, true); + wpTreepopup.setShowableTypes(ItemType.REPORT_TEMPLATE, ItemType.REPORT); + + wpTreepopup.addPopupHandler(new PopupHandler() { + public void onPopup(PopupEvent event) { + if (! event.isCanceled()) { + if (event.getSelectedItem() != null) { + int left = mainLayout.getAbsoluteLeft() + 50; + int top = mainLayout.getAbsoluteTop() + 25; + ImporterDialog dlg = new ImporterDialog(event.getSelectedItem(), presenter); + dlg.setPopupPosition(left, top); + dlg.setAnimationEnabled(true); + dlg.show(); + } + presenter.getHeader().enableExports(); + } + + } + }); + + + wpTreepopup.setPopupPosition(left, top); + wpTreepopup.show(); + } + } + }; + /** + * + * @return . + */ + public CellPanel getMainLayout() { + return mainLayout; + } +} diff --git a/src/main/java/org/gcube/portlets/user/reportgenerator/client/Presenter/CommonCommands.java b/src/main/java/org/gcube/portlets/user/reportgenerator/client/Presenter/CommonCommands.java new file mode 100644 index 0000000..2047785 --- /dev/null +++ b/src/main/java/org/gcube/portlets/user/reportgenerator/client/Presenter/CommonCommands.java @@ -0,0 +1,225 @@ +package org.gcube.portlets.user.reportgenerator.client.Presenter; + +import org.gcube.portlets.user.reportgenerator.client.ReportConstants; +import org.gcube.portlets.user.reportgenerator.client.dialog.ImageUploaderDialog; +import org.gcube.portlets.user.reportgenerator.client.dialog.ImporterDialog; +import org.gcube.portlets.user.workspace.lighttree.client.ItemType; +import org.gcube.portlets.user.workspace.lighttree.client.event.PopupEvent; +import org.gcube.portlets.user.workspace.lighttree.client.event.PopupHandler; +import org.gcube.portlets.user.workspace.lighttree.client.load.WorkspaceLightTreeLoadPopup; +import org.gcube.portlets.user.workspace.lighttree.client.save.WorkspaceLightTreeSavePopup; + +import com.extjs.gxt.ui.client.event.ColorPaletteEvent; +import com.extjs.gxt.ui.client.event.Events; +import com.extjs.gxt.ui.client.event.Listener; +import com.extjs.gxt.ui.client.widget.ColorPalette; +import com.google.gwt.core.client.GWT; +import com.google.gwt.core.client.RunAsyncCallback; +import com.google.gwt.user.client.Command; +import com.google.gwt.user.client.Window; +import com.google.gwt.user.client.ui.PopupPanel; + + + +/** + * * + * /** + * CommonCommands class contains the menu commands for the UI + * + * @author Massimiliano Assante, ISTI-CNR - massimiliano.assante@isti.cnr.it + * + * @version December 2012 (2.7) + */ +public class CommonCommands { + /** + * + */ + public Command openTemplate; + /** + * + */ + public Command importTemplateCommand; + /** + * + */ + public Command insertImage; + /** + * + */ + public Command saveTemplate; + /** + * + */ + public Command pickColor; + + private Presenter presenter; + + /** + * + * @param presenter . + */ + public CommonCommands(final Presenter presenter) { + this.presenter = presenter; + openTemplate = new Command() { + public void execute() { + final int left = presenter.getHeader().getMainLayout().getAbsoluteLeft() + 50; + final int top = presenter.getHeader().getMainLayout().getAbsoluteTop() + 25; + + GWT.runAsync(WorkspaceLightTreeLoadPopup.class, new RunAsyncCallback() { + public void onSuccess() { + WorkspaceLightTreeLoadPopup wpTreepopup = new WorkspaceLightTreeLoadPopup("Open Template", true, true); + wpTreepopup.setShowableTypes(ItemType.REPORT_TEMPLATE); + wpTreepopup.setSelectableTypes(ItemType.REPORT_TEMPLATE); + + + wpTreepopup.addPopupHandler(new PopupHandler() { + public void onPopup(PopupEvent event) { + if (! event.isCanceled()) { + if (event.getSelectedItem() != null) { + presenter.openTemplate(event.getSelectedItem().getName(), event.getSelectedItem().getId(), true); + } + } + + } + }); + + wpTreepopup.setPopupPosition(left, top); + wpTreepopup.show(); + } + + public void onFailure(Throwable reason) { + Window.alert("There are networks problem, please check your connection."); + } + }); + } + }; + + + insertImage = new Command() { + public void execute() { + int left = presenter.getHeader().getMainLayout().getAbsoluteLeft() + 50; + int top = presenter.getHeader().getMainLayout().getAbsoluteTop() + 25; + ImageUploaderDialog dlg = new ImageUploaderDialog(presenter); + dlg.setAnimationEnabled(true); + dlg.setPopupPosition(left, top); + dlg.show(); + } + }; + + pickColor = new Command() { + public void execute() { + int left = presenter.getHeader().getMainLayout().getAbsoluteLeft() + 600; + int top = presenter.getHeader().getMainLayout().getAbsoluteTop() + 50; + final PopupPanel pp = new PopupPanel(true); + + ColorPalette colorPalette = new ColorPalette(); + colorPalette.addListener(Events.Select, new Listener() { + @SuppressWarnings("deprecation") + public void handleEvent(ColorPaletteEvent be) { + presenter.getCurrentSelected().getExtendedFormatter().setForeColor(be.getColor()); + pp.hide(); + } + }); + pp.add(colorPalette); + pp.setAnimationEnabled(false); + pp.setPopupPosition(left, top); + pp.show(); + } + }; + + + + importTemplateCommand = new Command() { + public void execute() { + if (! ReportConstants.isDeployed) { + int left = presenter.getHeader().getMainLayout().getAbsoluteLeft() + 50; + int top = presenter.getHeader().getMainLayout().getAbsoluteTop() + 25; + ImporterDialog dlg = new ImporterDialog(null, presenter); + dlg.setPopupPosition(left, top); + dlg.setAnimationEnabled(true); + dlg.show(); + } + else { + GWT.runAsync(WorkspaceLightTreeLoadPopup.class, new RunAsyncCallback() { + public void onSuccess() { + WorkspaceLightTreeLoadPopup wpTreepopup = new WorkspaceLightTreeLoadPopup("Pick the item you want to import from", true, true); + wpTreepopup.setShowableTypes(ItemType.REPORT_TEMPLATE); + + + wpTreepopup.addPopupHandler(new PopupHandler() { + public void onPopup(PopupEvent event) { + if (! event.isCanceled()) { + if (event.getSelectedItem() != null) { + int left = presenter.getHeader().getMainLayout().getAbsoluteLeft() + 50; + int top = presenter.getHeader().getMainLayout().getAbsoluteTop() + 25; + ImporterDialog dlg = new ImporterDialog(event.getSelectedItem(), presenter); + dlg.setPopupPosition(left, top); + dlg.setAnimationEnabled(true); + dlg.show(); + } + } + + } + }); + int left = presenter.getHeader().getMainLayout().getAbsoluteLeft() + 50; + int top = presenter.getHeader().getMainLayout().getAbsoluteTop() + 25; + wpTreepopup.setPopupPosition(left, top); + wpTreepopup.show(); + + } + + public void onFailure(Throwable reason) { + Window.alert("There are networks problem, please check your connection."); + } + }); + } + } + }; + + saveTemplate = new Command() { + public void execute() { + if (presenter.getModel().getTemplateName().endsWith("d4sR")) + presenter.saveReport(); + else + saveReportAsDialog(); + } + }; + + } //end constructor + + public void saveReportAsDialog() { + final int left = presenter.getHeader().getMainLayout().getAbsoluteLeft() + 50; + final int top = presenter.getHeader().getMainLayout().getAbsoluteTop() + 25; + + GWT.runAsync(WorkspaceLightTreeSavePopup.class, new RunAsyncCallback() { + public void onSuccess() { + WorkspaceLightTreeSavePopup wpTreepopup = new WorkspaceLightTreeSavePopup("Save Template, choose folder please:", true); + wpTreepopup.setSelectableTypes( ItemType.FOLDER, ItemType.ROOT); + wpTreepopup.setShowEmptyFolders(true); + + wpTreepopup.addPopupHandler(new PopupHandler() { + public void onPopup(PopupEvent event) { + + //checking user input + String inputUser = event.getName(); + String newTemplateName = inputUser; + if (presenter.getModel().getTemplateName().compareTo(newTemplateName) != 0) { + newTemplateName = newTemplateName.trim(); + presenter.getModel().setTemplateName(newTemplateName+".d4sR"); + } + presenter.changeTemplateName(newTemplateName); + presenter.saveReport(event.getSelectedItem().getId(), newTemplateName); + } + }); + wpTreepopup.setPopupPosition(left, top); + wpTreepopup.show(); + } + + public void onFailure(Throwable reason) { + Window.alert("There are networks problem, please check your connection."); + } + }); + + + } +} diff --git a/src/main/java/org/gcube/portlets/user/reportgenerator/client/Presenter/Presenter.java b/src/main/java/org/gcube/portlets/user/reportgenerator/client/Presenter/Presenter.java new file mode 100644 index 0000000..667184e --- /dev/null +++ b/src/main/java/org/gcube/portlets/user/reportgenerator/client/Presenter/Presenter.java @@ -0,0 +1,1168 @@ +package org.gcube.portlets.user.reportgenerator.client.Presenter; + +import java.util.HashMap; +import java.util.List; + +import org.gcube.portlets.d4sreporting.common.client.ComponentType; +import org.gcube.portlets.d4sreporting.common.client.uicomponents.richtext.RichTextToolbar; +import org.gcube.portlets.d4sreporting.common.shared.Metadata; +import org.gcube.portlets.d4sreporting.common.shared.SerializableModel; +import org.gcube.portlets.user.gcubewidgets.client.popup.GCubeDialog; +import org.gcube.portlets.user.reportgenerator.client.Headerbar; +import org.gcube.portlets.user.reportgenerator.client.ReportGenerator; +import org.gcube.portlets.user.reportgenerator.client.TitleBar; +import org.gcube.portlets.user.reportgenerator.client.ToolboxPanel; +import org.gcube.portlets.user.reportgenerator.client.WorkspacePanel; +import org.gcube.portlets.user.reportgenerator.client.dialog.AddBiblioEntryDialog; +import org.gcube.portlets.user.reportgenerator.client.dialog.DeleteCitationsDialog; +import org.gcube.portlets.user.reportgenerator.client.dialog.FimesReportTreePanel; +import org.gcube.portlets.user.reportgenerator.client.dialog.LoadingPopup; +import org.gcube.portlets.user.reportgenerator.client.events.AddBiblioEvent; +import org.gcube.portlets.user.reportgenerator.client.events.AddBiblioEventHandler; +import org.gcube.portlets.user.reportgenerator.client.events.AddCommentEvent; +import org.gcube.portlets.user.reportgenerator.client.events.AddCommentEventHandler; +import org.gcube.portlets.user.reportgenerator.client.events.ItemSelectionEvent; +import org.gcube.portlets.user.reportgenerator.client.events.ItemSelectionEventHandler; +import org.gcube.portlets.user.reportgenerator.client.events.RemovedCitationEvent; +import org.gcube.portlets.user.reportgenerator.client.events.RemovedCitationEventHandler; +import org.gcube.portlets.user.reportgenerator.client.events.RemovedUserCommentEvent; +import org.gcube.portlets.user.reportgenerator.client.events.RemovedUserCommentEventHandler; +import org.gcube.portlets.user.reportgenerator.client.model.ExportManifestationType; +import org.gcube.portlets.user.reportgenerator.client.model.TemplateComponent; +import org.gcube.portlets.user.reportgenerator.client.model.TemplateModel; +import org.gcube.portlets.user.reportgenerator.client.model.TemplateSection; +import org.gcube.portlets.user.reportgenerator.client.targets.AttributeArea; +import org.gcube.portlets.user.reportgenerator.client.targets.BasicTextArea; +import org.gcube.portlets.user.reportgenerator.client.targets.Coords; +import org.gcube.portlets.user.reportgenerator.client.targets.D4sRichTextarea; +import org.gcube.portlets.user.reportgenerator.client.targets.DroppingArea; +import org.gcube.portlets.user.reportgenerator.client.targets.GenericTable; +import org.gcube.portlets.user.reportgenerator.client.targets.ImageArea; +import org.gcube.portlets.user.reportgenerator.client.targets.ReportTextArea; +import org.gcube.portlets.user.reportgenerator.client.targets.TSArea; +import org.gcube.portlets.user.reportgenerator.shared.SessionInfo; + +import com.extjs.gxt.ui.client.widget.MessageBox; +import com.extjs.gxt.ui.client.widget.layout.FitLayout; +import com.google.gwt.core.client.GWT; +import com.google.gwt.event.dom.client.ClickEvent; +import com.google.gwt.event.dom.client.ClickHandler; +import com.google.gwt.event.shared.HandlerManager; +import com.google.gwt.user.client.Command; +import com.google.gwt.user.client.Timer; +import com.google.gwt.user.client.Window; +import com.google.gwt.user.client.rpc.AsyncCallback; +import com.google.gwt.user.client.ui.Button; +import com.google.gwt.user.client.ui.CellPanel; +import com.google.gwt.user.client.ui.HTML; +import com.google.gwt.user.client.ui.HasHorizontalAlignment; +import com.google.gwt.user.client.ui.HorizontalPanel; +import com.google.gwt.user.client.ui.RichTextArea; +import com.google.gwt.user.client.ui.SimplePanel; +import com.google.gwt.user.client.ui.VerticalPanel; +import com.google.gwt.user.client.ui.Widget; + + + +/** + * + * @author Massimiliano Assante, ISTI-CNR - massimiliano.assante@isti.cnr.it + * + * @version July 2011 (3.0) + */ + +public class Presenter { + /** + * View part + */ + private WorkspacePanel wp; + + private Headerbar header; + + private ToolboxPanel toolBoxPanel; + +// private FimesFileUploadWindow importDlg; + + private TitleBar titleBar; + + + private String currentUser; + private String currentScope; + /** + * Model + */ + private TemplateModel model; + + private int currFocus; + + RichTextToolbar currentSelectedToolbar; + + RichTextArea areaForBiblio; + + /** + * + */ + private CommonCommands commonCommands; + + private boolean menuForWorkflowDocument = false; + /** + * eventbus events handler + */ + HandlerManager eventBus = new HandlerManager(null); + + public HandlerManager getEventBus() { + return eventBus; + } + + + private void handleEvents() { + eventBus.addHandler(AddBiblioEvent.TYPE, new AddBiblioEventHandler() { + public void onAddCitation(AddBiblioEvent event) { + addCitation(event.getCitekey(), event.getCitetext()); + String keyToAdd = " (" + event.getCitekey() +") "; + String currHTML = areaForBiblio.getHTML(); + if (currHTML.endsWith("
")) + currHTML = currHTML.substring(0, currHTML.length()-4); + areaForBiblio.setHTML(currHTML+keyToAdd); + } + }); + + eventBus.addHandler(RemovedCitationEvent.TYPE, new RemovedCitationEventHandler() { + public void onRemovedCitation(RemovedCitationEvent event) { + removeCitation(event.getCitekey()); + } + }); + +// eventBus.addHandler(ExportFinishedEvent.TYPE, new EsportFinishedEventHandler() { +// public void onFinishedExport(ExportFinishedEvent event) { +// refreshWorkspace(); +// } +// }); + + eventBus.addHandler(AddCommentEvent.TYPE, new AddCommentEventHandler() { + public void onAddComment(AddCommentEvent event) { + model.addCommentToComponent(event.getSourceComponent(), event.getComment(), event.getAreaHeight()); + } + }); + + eventBus.addHandler(RemovedUserCommentEvent.TYPE, new RemovedUserCommentEventHandler() { + public void onRemovedComment(RemovedUserCommentEvent event) { + model.removeComment(event.getSourceComponent()); + } + }); + +// eventBus.addHandler(ImportFinishedEvent.TYPE, new ImportFinishedEventHandler(){ +// public void onFinishedImport(ImportFinishedEvent event) { +// importDlg.hide(); +// openImportedFimesXML(event.getPathFile()); +// } +// +// }); + + eventBus.addHandler(ItemSelectionEvent.TYPE, new ItemSelectionEventHandler() { + public void onItemSelected(ItemSelectionEvent event) { + // TODO Auto-generated method stub + HashMap map = event.getItemSelected(); + int sectionIndex = 0, compIndex = 0; + if (map != null) { + if (map.get("item").equals("Section")) { + sectionIndex = Integer.parseInt((String) map.get("index")); + seekSection(sectionIndex+1); + } else { + compIndex = Integer.parseInt((String) map.get("index")); + sectionIndex = Integer.parseInt((String) ((HashMap) map.get("parent")).get("index")); + seekSection(sectionIndex+1); + int top = getModel().getSectionComponent(sectionIndex+1).get(compIndex).getContent().getAbsoluteTop(); + ReportGenerator.get().getScrollerPanel().setScrollPosition(top); + } + } + + } + }); + } + + + /** + * constructor + */ + public Presenter() { + model = new TemplateModel(this); + + titleBar = ReportGenerator.get().getTitleHeader(); + + handleEvents(); + + AsyncCallback callback = new AsyncCallback() { + public void onFailure(Throwable caught) {} + + public void onSuccess(final SessionInfo sessionInfo) { + currentUser = sessionInfo.getUsername(); + currentScope = sessionInfo.getScope(); + if (sessionInfo.isWorkflowDocument()) { + model.getModelService().getWorkflowDocumentFromDocumentLibrary(new AsyncCallback() { + + public void onFailure(Throwable caught) { } + + public void onSuccess(SerializableModel wfReport) { + loadModel(wfReport); + header.setMenuForWorkflowDocument(sessionInfo.isEditable()); + pollServiceForLockRenewal(); + } + }); + } + else { + model.getModelService().readTemplateFromSession(new AsyncCallback() { + public void onFailure(Throwable caught) { } + public void onSuccess(SerializableModel result) { + if (result != null) { + loadModel(result); + header.enableExports(); + } + } + }); + } + } + }; + + model.getModelService().getSessionInfo(getHost(), callback); + commonCommands = new CommonCommands(this); + //importDlg = new FimesFileUploadWindow(eventBus); + } + + + public void showImportPopup() { +// importDlg.setVisible(true); +// importDlg.show(); + } + + public void showLastChangesPopup() { + + } + + public void showSectionUserCommentsTooltips() { + TemplateSection currSection = model.getSection(model.getCurrentPage()); + for (TemplateComponent tc : currSection.getAllComponents()) { + if (tc.getContent() instanceof ReportTextArea && tc.getUserComments() != null) { + ReportTextArea rpta = (ReportTextArea) tc.getContent(); + rpta.showComment(tc.getUserComments()); + } + } + } + /** + * called when a citation is added + * @param citekey . + * @param text . + */ + public void addCitation(String citekey, String text) { + if (! hasBibliography()) { + MessageBox.alert("Warning", "Bibliography will be added as last section of this report", null); + model.insertBiblioSection(); + } + model.addCitation(citekey, text); + titleBar.setPageDisplayer(model.getCurrentPage(), model.getTotalPages()); + } + + public boolean removeCitation(String citekey) { + boolean toReturn = model.removeCitation(citekey); + if (toReturn) { //if has been removed from the model + if (model.getCurrentPage() == model.getTotalPages()) { //if the view is displaying the bibliography, need to refresh it + GWT.log("SEI in BIBLIO"); + seekSection(model.getTotalPages()); + } + } + return toReturn; + } + /** + * look if a section with a specific metadata (that indicate sit is a biblio section) + * exists in the current report model: + * check whether the last section has Metadata "isBiblio" = "true" or false + * @return true if bibliography is present yet false otherwise + */ + public boolean hasBibliography() { + for (Metadata metadata : model.getSection(model.getTotalPages()).getAllMetadata()) + if (metadata.getAttribute().equals(TemplateModel.BIBLIO_SECTION)) return true; + return false; + } + /** + * look if a comment with a specific metadata (that indicate sit is a comment) + * exists in the current report model: + * @return true if comment is present yet false otherwise + */ + public boolean hasComments(Widget toCheck) { + TemplateSection currSection = model.getSection(model.getCurrentPage()); + return currSection.hasComments(toCheck); + } + /** + * look if a comment with a specific metadata (that indicate sit is a comment) + * exists in the current report model: + * @return true if comment is present yet false otherwise + */ + public AddCommentEvent getComponentComments(Widget toCheck) { + TemplateSection currSection = model.getSection(model.getCurrentPage()); + return currSection.getComponentComments(toCheck); + } + /** + * + */ + private void pollServiceForLockRenewal() { + final int fourteenMinutes = 840000; + final Timer t = new Timer() { + public void run() { + model.getModelService().renewLock(new AsyncCallback() { + public void onFailure(Throwable caught) { + } + public void onSuccess(Void result) { + schedule(fourteenMinutes); + } + }); + } + }; + t.schedule(fourteenMinutes); + } + /** + * put the commands in the hashmap + */ + private HashMap getCommands() { + /** + * commands to pass to the toolbar + */ + HashMap toReturn = new HashMap(); + + Command newTemplate= new Command() { + public void execute() { + changeTemplateName(TemplateModel.DEFAULT_NAME); + cleanAll(); + } + }; + + toReturn.put("save", commonCommands.saveTemplate); + toReturn.put("newdoc", newTemplate); + toReturn.put("open_template", commonCommands.openTemplate); + toReturn.put("importing", commonCommands.importTemplateCommand); + toReturn.put("insertImage", commonCommands.insertImage); + toReturn.put("pickColor", commonCommands.pickColor); + + return toReturn; + + } + + /** + * to remove the current displayed section + */ + public void discardCurrentSection() { + if (model.getTotalPages() == 1) + Window.alert("Cannot discard section, need ad least 2"); + else { + boolean result = Window.confirm("Are you sure you want to discard section number " + model.getCurrentPage() + "?"); + if (result) { + TemplateSection removed = model.discardSection(model.getCurrentPage()); + if (removed == null) + GWT.log("REMOVED NOTHING", null); + else + GWT.log("REMOVED " + removed.getAllComponents().size(), null); + loadFirstSection(); + } + } + } + /** + * + * @param titleBar , + */ + public void setTitleBar(TitleBar titleBar) { + this.titleBar = titleBar; + } + /** + * + * @return . + */ + public String getHost() { + return GWT.getHostPageBaseURL() + "../../"; + } + + /** + * + */ + public void addTextToolBar() { + + RichTextToolbar rtbar = new RichTextToolbar(new RichTextArea(), false, getCommands() ); + SimplePanel deco = new SimplePanel(); + rtbar.setEnabled(false); + deco.add(rtbar); + deco.setSize("100%", "25"); + rtbar.setWidth("100%"); + ReportGenerator.get().getToolbarPanel().clear(); + ReportGenerator.get().getToolbarPanel().add(deco); + } + /** + * remove the user-added components from the workspace, and from the model + * + */ + public void cleanAll() { + // reset the model + model = new TemplateModel(this); + + //reset the UI + + //give the new model instance + header.setModel(model); + wp.setModel(model); + + cleanWorkspace(); + titleBar.hideNextButton(); + titleBar.hidePrevButton(); + titleBar.setTemplateName(model.getTemplateName()); + titleBar.setPageDisplayer(model.getCurrentPage(), model.getTotalPages()); + resizeWorkingArea(model.getPageWidth(), model.getPageHeight()); + + //persists the change in the session + model.storeInSession(); + } + + /** + * just clean the page + */ + public void cleanAllNotSession() { + // reset the model + model = new TemplateModel(this); + + //reset the UI + + //give the new model instance + header.setModel(model); + wp.setModel(model); + + cleanWorkspace(); + titleBar.hideNextButton(); + titleBar.hidePrevButton(); + titleBar.setTemplateName(model.getTemplateName()); + titleBar.setPageDisplayer(model.getCurrentPage(), model.getTotalPages()); + resizeWorkingArea(model.getPageWidth(), model.getPageHeight()); + } + + /** + * Save the current report + * @param folderid the id where to save the report + * + */ + public void saveReport(String folderid, String name) { + model.storeInSession(); + model.saveReport(folderid, name); + } + + + /** + * Save the current report in a given folder + * + */ + public void saveReport() { + model.storeInSession(); + model.saveReport(); + } + + /** + * Save the current report in a given folder + * + */ + public void updateWorkflowDocument(boolean update) { + model.storeInSession(); + model.updateWorkflowDocument(update); + } + + /** + * + *@param templateName . + */ + public void changeTemplateName(String templateName) { + //initialize the template + titleBar.setTemplateName(templateName); + } + + /** + * remove the user-added components from the workspace (in the current page) but not from the model + * + */ + public void cleanWorkspace() { + wp.getMainLayout().clear(); + ReportGenerator.get().getScrollerPanel().setScrollPosition(0); + } + + /** + * + * @param toChange . + */ + public void storeChangeInSession(Widget toChange) { + model.storeInSession(); + } + + /** + * + * @param area . + */ + public void disaableTextToolBar(RichTextArea area) { + + } + /** + * used when the resizing textAreas depending on the content + * @param myY a + * @param pixel a + */ + public void shiftComponentsByTextArea(int myY, int pixel) { + int section = model.getCurrentPage(); + List comps = model.getSectionComponent(section); + + if (comps != null) { + for (TemplateComponent tc : comps) { + if (tc.getType() != ComponentType.FAKE_TEXTAREA) { + if (tc.getY() > myY) { + GWT.log("FOUND " + tc.getX() + ", " + tc.getY(), null); + GWT.log("pixel " + pixel , null); + int newY = tc.getY()+pixel;// : tc.getY()-pixel; + // + tc.setY(newY); + GWT.log("moveWidget " + tc.getX() + ", " + tc.getY(), null); + moveWidget(tc.getContent(), tc.getX(),newY); + GWT.log("MOVED " + tc.getX() + ", " + tc.getY(), null); + } + } + //Window.alert("myY - tc.getY() " + myY + ", " + tc.getY()); + + } + } + + } + + /** + * + * @param toMove . + * @param left . + * @param top . + */ + public void moveWidget(Widget toMove, int left, int top) { + //wp.getMainLayout().add(toMove); + wp.moveWidget(toMove, left, top); + } + + + /** + * Import a Section in the View and in the Model + * @param toLoad the SerializableModel instance where toget the section + * @param sectionNoToimport section to import 0 -> n-1 + * @param beforeSection say where to import this section (before) + * @param asLastSection say to import this section as last section in the curren template / report + */ + public void importSection(SerializableModel toLoad, int sectionNoToimport, int beforeSection, boolean asLastSection) { + model.importSectionInModel(toLoad, sectionNoToimport, beforeSection, asLastSection); + if (asLastSection) + seekLastPage(); + else + seekSection(beforeSection); + Window.alert("Importing Complete"); + } + + /** + * in case someone imported a new section + */ + public void seekLastPage() { + while (! (model.getCurrentPage() == model.getTotalPages()) ) + nextPageButtonClicked(); + } + + /** + * in case someone imported a new section + * @param sect2Seek . + */ + public void seekSection(int sect2Seek) { + loadFirstSection(); + while (! ( model.getCurrentPage() == sect2Seek) ) + nextPageButtonClicked(); + } + + /** + * enable the format text toolbar for the given Rich Textarea passed as argument + * @param d4sArea the enabled text area + */ + public void enableTextToolBar(RichTextArea d4sArea) { + + RichTextToolbar rtbar = new RichTextToolbar(d4sArea, false, getCommands() ); + if (menuForWorkflowDocument) //disable open and save buttons from the toolbar + rtbar.enableCommands(false); + currentSelectedToolbar = rtbar; + rtbar.setEnabled(true); + ReportGenerator.get().getToolbarPanel().clear(); + SimplePanel deco = new SimplePanel(); + deco.add(rtbar); + deco.setSize("100%", "25"); + rtbar.setWidth("100%"); + ReportGenerator.get().getToolbarPanel().add(deco); + } + + /** + * enable the format text toolbar for the given Rich Textarea passed as argument + * @param d4sArea the enabled text area + */ + public void enableBiblioEntry(RichTextArea d4sArea) { + ReportGenerator.get().getHeader().enableBiblioEntry(d4sArea); + } + + /** + * generate the docx to be passed to the fimesExporter + * @param model + */ + public void generateFiMES(final TemplateModel model) { +// GWT.log("generateFiMES"); +// MessageBox.show(new MessageBoxConfig() { { +// setMsg("Processing report, please wait ..."); +// setProgressText("pre-processining phase"); +// setWidth(300); +// setWait(true); +// setWaitConfig(new WaitConfig() { +// { +// setInterval(500); +// } +// }); +// } +// }); +// final SerializableModel toSend = model.getSerializableModel(); +// +// model.getModelService().generateTempDocx(toSend, new AsyncCallback() { +// public void onFailure(Throwable caught) { +// MessageBox.hide(); +// MessageBox.alert("There were problems on Server: " + caught.getMessage()); +// } +// +// public void onSuccess(String result) { +// MessageBox.hide(); +// if (result.compareTo("ERROR") == 0) +// MessageBox.alert("There were problems on Server, conversion failed"); +// else { +// MessageBox.hide(); +// String filename = toSend.getTemplateName().replaceAll(".d4sR", ""); +// GWT.log("____>>>>>"+filename); +// final FimesExporterPopup pp = new FimesExporterPopup(eventBus, result, filename); +// GWT.log("____>>>>>pp.isFinished()="+pp.isFinished()); +// } +// } +// }); + } + /** + * + * @param model . + * @param type . + */ + public void generateManifestation(final TemplateModel model, final ExportManifestationType type) { + boolean cont = true; + if (type == ExportManifestationType.HTML && model.containsLargeTS()) { + cont = Window.confirm("Exporting Large Time Series in HTML format can take up to minutes. (about 30 secs for 500 rows)\ndo you want to continue?"); + } + + //continue after warning the user on exporting large TSs + if (cont) { + final int left = Window.getClientWidth() / 2 - 200; + final int top = Window.getClientHeight() / 2 + 100; + final LoadingPopup loading = new LoadingPopup(true); + loading.setPopupPosition(left, top); + //loading.setStyleName("none"); + + + AsyncCallback callback = new AsyncCallback() { + + public void onFailure(Throwable caught) { + //MessageBox + MessageBox.alert("", "Failed to export: " + caught.getMessage(), null); + + } + + public void onSuccess(Boolean result) { + //MessageBox.hide(); + if (result) { + refreshWorkspace(); + + + + final GCubeDialog popupPanel = new GCubeDialog(); + popupPanel.setText("Exporting result"); + String exportedName = model.getTemplateName(); + exportedName = exportedName.replaceAll(".d4sR", ""); + exportedName = exportedName.replaceAll(".d4sT", ""); + + final String urlToOpen = model.getExportedFileURL(type, exportedName); + + VerticalPanel dlgPanel = new VerticalPanel(); + dlgPanel.setSpacing(5); + dlgPanel.add(new HTML("The Report " + exportedName + " (" + type +") has been successfully saved
in your workspace root folder", true)); + CellPanel bPanel = new HorizontalPanel(); + Button close = new Button("close"); + Button preview = new Button("Open"); + bPanel.add(close); + bPanel.add(preview); + bPanel.setWidth("100%"); + + bPanel.setSpacing(5); + bPanel.setCellWidth(close, "50%"); + bPanel.setCellWidth(preview, "50%"); + bPanel.setCellHorizontalAlignment(close, HasHorizontalAlignment.ALIGN_CENTER); + bPanel.setCellHorizontalAlignment(preview, HasHorizontalAlignment.ALIGN_CENTER); + + close.addClickHandler(new ClickHandler() { + public void onClick(ClickEvent event) { + popupPanel.hide(); + } + }); + preview.addClickHandler(new ClickHandler() { + public void onClick(ClickEvent event) { + Window.open(urlToOpen, model.getTemplateName(), ""); + } + }); + dlgPanel.add(bPanel); + + popupPanel.setAnimationEnabled(true); + popupPanel.setPopupPosition(left, top); + popupPanel.setWidget(dlgPanel); + popupPanel.show(); + } + else { + MessageBox.alert("", "Server reported errors on exporting Format", null); + } + } + + }; + + SerializableModel toSend = model.getSerializableModel(); + model.getModelService().generateManifestation(toSend, type, callback); +//TODO: +// MessageBox.show(new MessageBoxConfig() { +// { +// setMsg("Processing report, please wait ..."); +// setProgressText("exporting ..."); +// setWidth(300); +// setWait(true); +// setWaitConfig(new WaitConfig() { +// { +// setInterval(1000); +// } +// }); +// } +// }); + } + } + + public void openAddCitationDialog() { + AddBiblioEntryDialog dlg = new AddBiblioEntryDialog(eventBus); + dlg.show(); + } + + public void openManageCitationsDialog() { + DeleteCitationsDialog dlg = new DeleteCitationsDialog(eventBus, model.getSection(model.getTotalPages())); + dlg.show(); + } + + /** + * + * @return . + */ + public Headerbar getHeader() { + return header; + } + + + /** + * + * @return . + */ + public TemplateModel getModel() { + return model; + } + + /** + * + * @return . + */ + public ToolboxPanel getToolBoxPanel() { + return toolBoxPanel; + } + + /** + * + * @return . + */ + public WorkspacePanel getWp() { + return wp; + } + + /** + * called when nextPage Button is Clicked + */ + public void nextPageButtonClicked() { + cleanWorkspace(); + //refresh the current page in the model + model.setCurrentPage(model.getCurrentPage() + 1); + + //refresh the current page in the UI + titleBar.setPageDisplayer(model.getCurrentPage(), model.getTotalPages()); + + //read the previous user added elements to the template page from the model and place them back in the UI + placeTemplatePageElements(model.getCurrentPage()); + + if (model.getCurrentPage() == model.getTotalPages()) + titleBar.hideNextButton(); + else + titleBar.showNextButton(); + + if (model.getCurrentPage() == 1) + titleBar.hidePrevButton(); + else + titleBar.showPrevButton(); + } + + /** + * load the template to edit in the MODEL and in the VIEW + * @param templateToOpen the name of the template to open without extension nor path + * @param templateObjectID the id in the folder of the template to open + * @param isTemplate true if you are opening a template false if you are opening a report + */ + public void openTemplate(String templateToOpen, String templateObjectID, final boolean isTemplate) { + AsyncCallback callback = new AsyncCallback() { + + public void onFailure(Throwable caught) { + Window.alert("Could not Load template, please try again later: " + caught.getMessage()); + + } + + public void onSuccess(SerializableModel toLoad) { + if (toLoad.getPageWidth() == TemplateModel.OLD_TEMPLATE_WIDTH) { + if (isTemplate) + Window.alert("OPS! we think you are trying to open a previuos version template, only gCube Templates 1.5+ are supported"); + else + Window.alert("OPS! we think you are trying to open a previuos version Report, only gCube Reports 1.5+ are supported"); + } + else + loadModel(toLoad); + } + }; + + //will asyncrously return a SerializableModel instance read from disk + model.getModelService().readModel(templateToOpen, templateObjectID, isTemplate, false, callback); + } + /** + * load the template to edit in the MODEL and in the VIEW + * @param serializedpath the temp file to open + */ + public void openImportedFimesXML(String serializedpath) { + model.getModelService().readImportedModel(serializedpath, new AsyncCallback() { + public void onFailure(Throwable caught) { + Window.alert("Could not Load report, please try again later: " + caught.getMessage()); + } + public void onSuccess(SerializableModel toLoad) { + loadModel(toLoad); + } + }); + } + + /** + * + * @param toLoad + */ + private void loadModel(SerializableModel toLoad) { + //reset the UI + cleanAllNotSession(); + + //load the serializable model in my Model + model.loadModel(toLoad, this); + + wp.setModel(model); + + titleBar.setTemplateName(model.getTemplateName()); + titleBar.setPageDisplayer(model.getCurrentPage(), model.getTotalPages()); + resizeWorkingArea(model.getPageWidth(), model.getPageHeight()); + + addTextToolBar(); + int currPage = model.getCurrentPage(); + //load the UI components of the current page + GWT.log("READ CURR PAGE"+currPage, null); + placeTemplatePageElements(currPage); + + //if there is more than one page place in the UI the next page button + if (currPage < model.getTotalPages()) { + titleBar.showNextButton(); + } + if (currPage > 1) + titleBar.showPrevButton(); + + } + + private void loadFirstSection() { + //reset the UI + cleanWorkspace(); + titleBar.hideNextButton(); + titleBar.hidePrevButton(); + model.setCurrentPage(1); + + + titleBar.setTemplateName(model.getTemplateName()); + titleBar.setPageDisplayer(model.getCurrentPage(), model.getTotalPages()); + + addTextToolBar(); + int currPage = model.getCurrentPage(); + //load the UI components of the current page + GWT.log("READ CURR PAGE"+currPage, null); + placeTemplatePageElements(currPage); + + //if there is more than one page place in the UI the next page button + if (currPage < model.getTotalPages()) { + titleBar.showNextButton(); + } + if (currPage > 1) + titleBar.showPrevButton(); + + } + + /** + * It places back the user added widgets (TemplateComponents) in the page + * + * @param section . the section number of the wanted TemplateComponent(s) + */ + + public void placeTemplatePageElements(int section) { + if (! (model.getSectionComponent(section) == null)) { + List pageElems = model.getSectionComponent(section); + + for (TemplateComponent component : pageElems) { + GWT.log("Reading component.. " + component.getType(), null); + + int uiX = component.getX(); + int uiY= component.getY(); + switch (component.getType()) { + case HEADING_1: + case HEADING_2: + case HEADING_3: + case TITLE: + if (component.isLocked()) { + HTML text = (HTML) component.getContent(); + wp.addComponentToLayout(text, component.isDoubleColLayout()); + } + else { + BasicTextArea textArea = (BasicTextArea) component.getContent(); + textArea.getMyInstance().setTop(uiY); + textArea.getMyInstance().setLeft(uiX); + wp.addComponentToLayout(textArea, component.isDoubleColLayout()); + } + + break; + case BODY: + if (component.isLocked()) { + HTML text = (HTML) component.getContent(); + wp.addComponentToLayout(text, component.isDoubleColLayout()); + } + else { + D4sRichTextarea textArea = (D4sRichTextarea) component.getContent(); + textArea.getMyInstance().setTop(uiY); + textArea.getMyInstance().setLeft(uiX); + wp.addComponentToLayout(textArea, component.isDoubleColLayout()); + } + + break; + case STATIC_IMAGE: + ImageArea imgToPlace = (ImageArea) component.getContent(); + wp.addComponentToLayout(imgToPlace, component.isDoubleColLayout()); + break; + case DYNA_IMAGE: + DroppingArea imageDropping = (DroppingArea) component.getContent(); + wp.addComponentToLayout(imageDropping, component.isDoubleColLayout()); + break; + case FAKE_TEXTAREA: + break; + case TOC: + ReportTextArea dp = (ReportTextArea) component.getContent(); + wp.addComponentToLayout(dp, component.isDoubleColLayout()); + setCurrCursorPos(uiY); + break; + case BIBLIO: + ReportTextArea dp2 = (ReportTextArea) component.getContent(); + wp.addComponentToLayout(dp2, component.isDoubleColLayout()); + setCurrCursorPos(uiY); + break; + case PAGEBREAK: + ReportTextArea dp3 = (ReportTextArea) component.getContent(); + wp.addComponentToLayout(dp3, component.isDoubleColLayout()); + setCurrCursorPos(uiY); + break; + case TIME_SERIES: + TSArea dp5 = (TSArea) component.getContent(); + wp.addComponentToLayout(dp5, component.isDoubleColLayout()); + setCurrCursorPos(uiY); + break; + case FLEX_TABLE: + GenericTable gt = (GenericTable) component.getContent(); + GWT.log("Reading TABLE rows: " + gt.getRowsNo() + " cols: " + gt.getCols()); + wp.addComponentToLayout(gt, component.isDoubleColLayout()); + break; + case ATTRIBUTE: + AttributeArea at = (AttributeArea) component.getContent(); + wp.addComponentToLayout(at, component.isDoubleColLayout()); + setCurrCursorPos(uiY); + break; + case COMMENT: + HTML text = (HTML) component.getContent(); + wp.addComponentToLayout(text, component.isDoubleColLayout()); + break; + case INSTRUCTION: + HTML instr = (HTML) component.getContent(); + wp.addComponentToLayout(instr, component.isDoubleColLayout()); + break; + } + } + } + } + + /** + * + * @param y . + */ + public void setCurrCursorPos(int y) { + this.currFocus = y; + } + public Coords getInsertionPoint() { + int y = getSelectedIndex(); + return new Coords(25, y); + } + public int getSelectedIndex() { + return currFocus; + } + /** + * called when prevPage Button is Clicked + */ + + public void prevPageButtonClicked() { + cleanWorkspace(); + //refresh the current page in the model + model.setCurrentPage(model.getCurrentPage() - 1); + + //refresh the current page in the UI + titleBar.setPageDisplayer(model.getCurrentPage(), model.getTotalPages()); + + //read the previous user added elements to the template page from the model and place them back in the UI + placeTemplatePageElements(model.getCurrentPage()); + + if (model.getCurrentPage() == model.getTotalPages()) + titleBar.hideNextButton(); + else + titleBar.showNextButton(); + + if (model.getCurrentPage() == 1) + titleBar.hidePrevButton(); + else + titleBar.showPrevButton(); + } + + /** + * Resize the template componet just the model + * + * @param toResize . + * @param newWidth . + * @param newHeight . + */ + public void resizeTemplateComponentInModel(Widget toResize, int newWidth, int newHeight) { + model.resizeModelComponent(toResize, newWidth, newHeight); + } + + /** + * @param width . + * @param height . + */ + public void resizeWorkingArea(int width, int height) { + //save the new state ---> TO MODEL + model.setPageWidth(width); + model.setPageHeight(height); + + //apply the change ---> TO VIEW + wp.resizeWorkspace(width, height); + } + /** + * + * @param header . + */ + public void setHeader(Headerbar header) { + this.header = header; + } + /** + * + * @param toolBoxPanel It's the tool box panel + */ + public void setToolBoxPanel(ToolboxPanel toolBoxPanel) { + this.toolBoxPanel = toolBoxPanel; + } + /** + * + * @param wp . + */ + public void setWp(WorkspacePanel wp) { + this.wp = wp; + } + /** + * + * @return the scope in which the application is running on + */ + public String getCurrentScope() { + return currentScope; + } + + /** + * + * @return the user username who is using the application + */ + public String getCurrentUser() { + return currentUser; + } + + /** + * + * @return . + */ + public TitleBar getTitleBar() { + return titleBar; + } + /** + * refresh the root in the workspace + */ + public void refreshWorkspace() { + toolBoxPanel.refreshRoot(); + } + /** + * + * @return the current selected rich text area + */ + public RichTextToolbar getCurrentSelected() { + return currentSelectedToolbar; + } + + public void setMenuForWorkflowDocument(boolean enable) { + menuForWorkflowDocument = enable; + } + + public boolean getMenuForWorkflowDocument() { + return menuForWorkflowDocument; + } + + public void setAreaForBiblio(RichTextArea d4sArea) { + areaForBiblio = d4sArea; + } + + + public void showReportStructure() { + FimesReportTreePanel panel = new FimesReportTreePanel(eventBus, model.getSerializableModel(), ToolboxPanel.TOOLBOX_WIDTH+"px", ToolboxPanel.TOOLBOX_HEIGHT+"px"); + final com.extjs.gxt.ui.client.widget.Window window = new com.extjs.gxt.ui.client.widget.Window(); + window.setTitle("Report Structure"); + window.setClosable(true); + window.setResizable(false); + window.setWidth(ToolboxPanel.TOOLBOX_WIDTH); + window.setHeight(ToolboxPanel.TOOLBOX_HEIGHT); + window.setPlain(true); + window.setLayout(new FitLayout()); + window.add(panel); + panel.getElement().getStyle().setBackgroundColor("#FFF"); + window.setPosition(0, this.getToolBoxPanel().getAbsoluteTop()); + window.show(); + } + + +} diff --git a/src/main/java/org/gcube/portlets/user/reportgenerator/client/ReportConstants.java b/src/main/java/org/gcube/portlets/user/reportgenerator/client/ReportConstants.java new file mode 100644 index 0000000..c648288 --- /dev/null +++ b/src/main/java/org/gcube/portlets/user/reportgenerator/client/ReportConstants.java @@ -0,0 +1,32 @@ +package org.gcube.portlets.user.reportgenerator.client; + +import com.google.gwt.core.client.GWT; +/** + * Simply a class containing Static Constants + * @author Massimiliano Assante, ISTI-CNR - massimiliano.assante@isti.cnr.it + * @version november 2008 (0.1) + */ +public class ReportConstants { + + /** + * tell if you running in eclipse or not + */ + public static final boolean isDeployed = true; + + /** + * + */ + public static final String LOADING_BAR = GWT.getModuleBaseURL() + "../images/loading-bar.gif"; + + /** + * + */ + public static final String IMAGE_NEXT_PAGE = GWT.getModuleBaseURL() + "../images/next_p.gif"; + /** + * + */ + public static final String IMAGE_PREV_PAGE = GWT.getModuleBaseURL() + "../images/prev_p.gif"; + + + +} diff --git a/src/main/java/org/gcube/portlets/user/reportgenerator/client/ReportGenerator.java b/src/main/java/org/gcube/portlets/user/reportgenerator/client/ReportGenerator.java new file mode 100644 index 0000000..e6e9fbf --- /dev/null +++ b/src/main/java/org/gcube/portlets/user/reportgenerator/client/ReportGenerator.java @@ -0,0 +1,403 @@ +package org.gcube.portlets.user.reportgenerator.client; + +import org.gcube.portlets.user.guidedtour.client.GCUBEGuidedTour; +import org.gcube.portlets.user.guidedtour.client.steps.GCUBETemplate1Text1Image; +import org.gcube.portlets.user.guidedtour.client.steps.GCUBETemplate2Text2Image; +import org.gcube.portlets.user.guidedtour.client.steps.TourStep; +import org.gcube.portlets.user.guidedtour.client.types.ThemeColor; +import org.gcube.portlets.user.guidedtour.client.types.VerticalAlignment; +import org.gcube.portlets.user.reportgenerator.client.Presenter.Presenter; +import org.gcube.portlets.user.reportgenerator.client.toursteps.Intro; +import org.gcube.portlets.user.workspace.client.AppControllerExplorer; +import org.gcube.portlets.user.workspace.client.rpc.GWTWorkspaceServiceAsync; +import org.gcube.portlets.user.workspace.lighttree.client.ItemType; +import org.gcube.portlets.user.workspace.lighttree.client.event.PopupEvent; +import org.gcube.portlets.user.workspace.lighttree.client.event.PopupHandler; +import org.gcube.portlets.user.workspace.lighttree.client.load.WorkspaceLightTreeLoadPopup; + +import com.google.gwt.core.client.EntryPoint; +import com.google.gwt.core.client.GWT; +import com.google.gwt.core.client.RunAsyncCallback; +import com.google.gwt.event.logical.shared.ResizeEvent; +import com.google.gwt.event.logical.shared.ResizeHandler; +import com.google.gwt.user.client.Window; +import com.google.gwt.user.client.ui.CellPanel; +import com.google.gwt.user.client.ui.HTML; +import com.google.gwt.user.client.ui.HorizontalPanel; +import com.google.gwt.user.client.ui.RootPanel; +import com.google.gwt.user.client.ui.ScrollPanel; +import com.google.gwt.user.client.ui.VerticalPanel; + + + +/** + * Entry point classes define onModuleLoad(). + * + * + * ReportGen class is the Entry point class, defines the main layout of the UI + * + * @author Massimiliano Assante, ISTI-CNR - massimiliano.assante@isti.cnr.it + * + * @version June 2011 (3.0) + */ +public class ReportGenerator implements EntryPoint { + + /** + * + */ + public static final int HEADER_HEIGHT = 25; + /** + * + */ + public static final int PAGE_LEFT = 5; + /** + * + */ + public static final int TOOLBOX_LEFT = 15; + /** + * + */ + public static final int TEMPLATE_LEFT = 230; + /** + * + */ + public static final int TEMPLATE_TOP = HEADER_HEIGHT + 60; + /** + * + */ + public static ReportGenerator singleton = null; + /** + * + * @return . + */ + public static ReportGenerator get() { + return singleton; + } + /** + * the controller + */ + private Presenter presenter; + + private VerticalPanel mainLayout = new VerticalPanel(); + + private ToolboxPanel toolBoxPanel; + + private Headerbar header; + + private TitleBar titlebar; + + private WorkspacePanel workSpacePanel; + + private VerticalPanel eastPanel = new VerticalPanel(); + + private VerticalPanel toolbarPanel = new VerticalPanel(); + + private ScrollPanel bottomScrollerPanel = new ScrollPanel(); + + private AppControllerExplorer treeController; + + private HTML divHidden = new HTML(); + /** + * This is the entry point method. + */ + public void onModuleLoad() { + singleton = this; + presenter = new Presenter(); + treeController = new AppControllerExplorer(); + mainLayout.setWidth("100%"); + mainLayout.setHeight("100%"); + // + workSpacePanel = new WorkspacePanel(presenter); + titlebar = new TitleBar(presenter); + header = new Headerbar(presenter); + toolBoxPanel = new ToolboxPanel(treeController); + + presenter.setHeader(header); + presenter.setTitleBar(titlebar); + presenter.setWp(workSpacePanel); + presenter.setToolBoxPanel(toolBoxPanel); + + mainLayout.add(titlebar); + mainLayout.add(header); + mainLayout.add(toolbarPanel); + + toolbarPanel.setWidth("100%"); + toolbarPanel.setHeight("40"); + + + CellPanel cellPanel = new HorizontalPanel(); + cellPanel.setStyleName("cella"); + cellPanel.add(toolBoxPanel); + cellPanel.add(bottomScrollerPanel); + + cellPanel.setCellWidth(toolBoxPanel, "230"); + + mainLayout.add(cellPanel); + + divHidden.setStyleName("d4sFrame"); + divHidden.setWidth("500"); + divHidden.setStyleName("d4sRichTextArea"); + divHidden.addStyleName("setVisibilityOff"); + divHidden.addStyleName("hasRichTextToolbar"); + + eastPanel.add(workSpacePanel); + eastPanel.add(divHidden); + bottomScrollerPanel.add(eastPanel); + presenter.addTextToolBar(); + + // Add image and button to the RootPanel + RootPanel.get("ReportGeneratorDIV").add(mainLayout); + + int scrollerWidth = Window.getClientWidth()- TEMPLATE_LEFT - 30; + bottomScrollerPanel.setPixelSize(scrollerWidth, 1000); + + if ( Window.getClientWidth() < 1070 ) { + int scrollerWidth2 = Window.getClientWidth()- TEMPLATE_LEFT; + bottomScrollerPanel.setPixelSize(scrollerWidth2, 1000); + } + + Window.addResizeHandler(new ResizeHandler() { + public void onResize(ResizeEvent event) { + int scrollerHeight = event.getHeight() - bottomScrollerPanel.getAbsoluteTop(); + if (scrollerHeight < toolBoxPanel.getTreePanelHeight()) + scrollerHeight = toolBoxPanel.getTreePanelHeight(); + int scrollerWidth = Window.getClientWidth()- TEMPLATE_LEFT - 30; + bottomScrollerPanel.setPixelSize(scrollerWidth , 1000); + + + if ( Window.getClientWidth() < 1060 ) { + int scrollerWidth2 = Window.getClientWidth()- TEMPLATE_LEFT; + bottomScrollerPanel.setPixelSize(scrollerWidth2, 1000); + } + } + + }); + + showGuidedTour() ; + + } + private void showGuidedTour() { + + GWT.runAsync(GCUBEGuidedTour.class, new RunAsyncCallback() { + public void onSuccess() { + TourStep step1 = new GCUBETemplate1Text1Image(true) { + + @Override + public String setStepTitle() { + return "gCube Reporting"; + } + + @Override + public String setStepImage() { + return "images/tour/tour1.jpg"; + } + + @Override + public String setStepBody() { + return new Intro().getHTML(); + } + }; + + TourStep step2 = new GCUBETemplate1Text1Image(false) { + + @Override + public String setStepTitle() { + return "Structure View"; + } + + @Override + public String setStepImage() { + return "images/tour/tour2.jpg"; + } + @Override + public String setStepBody() { + return "
" + + "
" + + "Use the Report Structure View to see your report structure. (View > Structure)" + + "
" + + "
" + + "Use the Report Structure View to navigate through your report." + + "
" + + "
"; + } + }; + TourStep step3 = new GCUBETemplate2Text2Image(false) { + + @Override + public String setStepTitle() { + return "User Comments"; + } + + @Override + public String setStepImage() { + return "images/tour/tourComment.jpg"; + } + + @Override + public String setStepBody() { + return "
" + + "
" + + "Use comments to collaborate with your colleagues." + + "
" + + "
"; + } + + @Override + public String setStepOtherImage() { + return "images/tour/tourFormat.jpg"; + } + + @Override + public String setStepOtherBody() { + return "
" + + "
" + + "Format text as you would in a word processor using the Formatting Bar." + + "
" + + "
"; + } + }; + TourStep step4 = new GCUBETemplate1Text1Image(false) { + + @Override + public String setStepTitle() { + return "Bibliography"; + } + + @Override + public String setStepImage() { + return "images/tour/tourBiblio.jpg"; + } + + @Override + public String setStepBody() { + return "
" + + "
" + + "Use the Bibliography to add references" + + "
" + + "
"; + } + }; + + TourStep step5 = new GCUBETemplate1Text1Image(false) { + + @Override + public String setStepTitle() { + return "Export"; + } + + @Override + public String setStepImage() { + return "images/tour/tourExports.jpg"; + } + + @Override + public String setStepBody() { + return "
" + + "
" + + "Generate different export formats such as OpenXML (docx) or HTML." + + "
" + + "
"; + } + }; + //step1.setTextVerticalAlignment(VerticalAlignment.ALIGN_MIDDLE); + step2.setTextVerticalAlignment(VerticalAlignment.ALIGN_MIDDLE); + step3.setTextVerticalAlignment(VerticalAlignment.ALIGN_MIDDLE); + step4.setTextVerticalAlignment(VerticalAlignment.ALIGN_MIDDLE); + step5.setTextVerticalAlignment(VerticalAlignment.ALIGN_MIDDLE); + String guideUrl = "https://gcube.wiki.gcube-system.org/gcube/index.php/Common_Functionality#Report_Generation"; + GCUBEGuidedTour gt = new GCUBEGuidedTour("gCube Reports Generator", ReportGenerator.class.getName(), guideUrl, 780, 450, false); + gt.addStep(step1); + gt.addStep(step2); + gt.addStep(step3); + gt.addStep(step4); + gt.addStep(step5); + gt.openTour(); + } + + public void onFailure(Throwable reason) { + Window.alert("There are networks problem, please check your connection."); + } + }); + + } + + /** + * + * @return . + */ + public VerticalPanel getMainLayout() { + return mainLayout; + } + + /** + * + * @return . + */ + public Headerbar getHeader() { + return header; + } + /** + * + * @return . + */ + public WorkspacePanel getWorkSpacePanel() { + return workSpacePanel; + } + + /** + * + * @return . + */ + public ToolboxPanel getToolBoxPanel() { + return toolBoxPanel; + } + + public GWTWorkspaceServiceAsync getWSTreeService() { + return treeController.getRpcWorkspaceService(); + } + + + /** + * + * @return . + */ + public VerticalPanel getToolbarPanel() { + return toolbarPanel; + } + + /** + * + * @param toolbarPanel . + */ + public void setToolbarPanel(VerticalPanel toolbarPanel) { + this.toolbarPanel = toolbarPanel; + } + + /** + * + * @return . + */ + public TitleBar getTitleHeader() { + return titlebar; + } + + /** + * + * @return . + */ + public HTML getDivHidden() { + return divHidden; + } + + /** + * + * @param divHidden . + */ + public void setDivHidden(HTML divHidden) { + this.divHidden = divHidden; + } + + public ScrollPanel getScrollerPanel() { + return bottomScrollerPanel; + } +} diff --git a/src/main/java/org/gcube/portlets/user/reportgenerator/client/ReportService.java b/src/main/java/org/gcube/portlets/user/reportgenerator/client/ReportService.java new file mode 100644 index 0000000..62a748e --- /dev/null +++ b/src/main/java/org/gcube/portlets/user/reportgenerator/client/ReportService.java @@ -0,0 +1,91 @@ +package org.gcube.portlets.user.reportgenerator.client; + +import org.gcube.portlets.d4sreporting.common.shared.SerializableModel; +import org.gcube.portlets.d4sreporting.common.shared.SerializableTable; +import org.gcube.portlets.d4sreporting.common.shared.SerializableTimeSeries; +import org.gcube.portlets.user.reportgenerator.client.model.ExportManifestationType; +import org.gcube.portlets.user.reportgenerator.shared.SessionInfo; + +import com.google.gwt.user.client.rpc.RemoteService; +/** + * Service interface for server communication + * @author Massimiliano Assante, ISTI-CNR - massimiliano.assante@isti.cnr.it + * @version november 2008 (0.1) + */ + +public interface ReportService extends RemoteService{ + /** + * return the first ten records of the timeseries having id as param + * @param sTS . + * @return . + */ + SerializableTable getSampleTimeSeries(SerializableTimeSeries sTS); + /** + * + * @return . + */ + String[] getUserTemplateNames(); + /** + * @param templateName . + * @param templateObjectID . + * @param isTemplate says if you're opening a template or a report + * @param isImporting says if your importing or youre loading a template in the UI + * @return . + */ + SerializableModel readModel(String templateName, String templateObjectID, boolean isTemplate, boolean isImporting); + + + /** + * + * @param model . + * @param type . + * @return . + */ + boolean generateManifestation(SerializableModel model, ExportManifestationType type); + + /** + * each portlet instance runs in a scope + * each portlet instance is used by a unique username from within the portal + * @param currentHost . + * @return a SessionInfo bean containing the username the scope andis opening a workflow document or not + */ + SessionInfo getSessionInfo(String currentHost); + + /** + * + * @param model . + */ + void storeTemplateInSession(SerializableModel model); + + + /** + * + * @return the model previously stored in the session + */ + SerializableModel readTemplateFromSession(); + + /** + * the report model is taken from the session + * @param folderid the basket id where to save the report + */ + void saveReport(String folderid, String newname); + + /** + * the report model is taken from the session, the id also + */ + void saveReport(); + + SerializableModel getWorkflowDocumentFromDocumentLibrary(); + + void updateWorkflowDocument(boolean update); + + void renewLock(); + + String generateTempDocx(SerializableModel model); + /** + * + * @param tempPath + * @return + */ + SerializableModel readImportedModel(String tempPath); +} diff --git a/src/main/java/org/gcube/portlets/user/reportgenerator/client/ReportServiceAsync.java b/src/main/java/org/gcube/portlets/user/reportgenerator/client/ReportServiceAsync.java new file mode 100644 index 0000000..6643e4d --- /dev/null +++ b/src/main/java/org/gcube/portlets/user/reportgenerator/client/ReportServiceAsync.java @@ -0,0 +1,87 @@ +package org.gcube.portlets.user.reportgenerator.client; + +import org.gcube.portlets.d4sreporting.common.shared.SerializableModel; +import org.gcube.portlets.d4sreporting.common.shared.SerializableTable; +import org.gcube.portlets.d4sreporting.common.shared.SerializableTimeSeries; +import org.gcube.portlets.user.reportgenerator.client.model.ExportManifestationType; +import org.gcube.portlets.user.reportgenerator.shared.SessionInfo; + +import com.google.gwt.user.client.rpc.AsyncCallback; +/** + * * Service interface for server Async communication + * @author Massimiliano Assante, ISTI-CNR - massimiliano.assante@isti.cnr.it + * + * @version november 2011 (3.0) + */ + +public interface ReportServiceAsync { + /** + * return the first ten records of the timeseries having id as param + * @param sTS . + * @param callback . + */ + void getSampleTimeSeries(SerializableTimeSeries sTS, AsyncCallback callback); + /** + * + * @param callback . + */ + void getUserTemplateNames(AsyncCallback callback); + + /** + * + * @param templateName . + * @param templateObjectID . + * @param isTemplate says if you're opening a template or a report + * @param isImporting says if your importing or youre loading a template in the UI + * @param callback . + */ + void readModel(String templateName, String templateObjectID, boolean isTemplate, boolean isImporting, AsyncCallback callback); + + + + /** + * @param model . + * @param type . + * @param callback . + */ + void generateManifestation(SerializableModel model, ExportManifestationType type, AsyncCallback callback); + + /** + * + * @param model . + * @param callback . + */ + void storeTemplateInSession(SerializableModel model, AsyncCallback callback); + /** + * + * call for the model previously stored in the session + * @param callback . + */ + void readTemplateFromSession( AsyncCallback callback); + + /** + * @param callback . + * @param folderid . + */ + void saveReport(String folderid, String newname, AsyncCallback callback); + + /** + * + * @param callback . + */ + void saveReport(AsyncCallback callback); + /** + * + * @param currentHost + * @param callback + */ + void getSessionInfo(String currentHost, AsyncCallback callback); + void getWorkflowDocumentFromDocumentLibrary( + AsyncCallback callback); + void updateWorkflowDocument(boolean update, AsyncCallback callback); + void renewLock(AsyncCallback callback); + void generateTempDocx(SerializableModel model, + AsyncCallback callback); + void readImportedModel(String tempPath, + AsyncCallback callback); +} diff --git a/src/main/java/org/gcube/portlets/user/reportgenerator/client/TitleBar.java b/src/main/java/org/gcube/portlets/user/reportgenerator/client/TitleBar.java new file mode 100644 index 0000000..c6617e3 --- /dev/null +++ b/src/main/java/org/gcube/portlets/user/reportgenerator/client/TitleBar.java @@ -0,0 +1,202 @@ +package org.gcube.portlets.user.reportgenerator.client; + +import java.util.Date; + +import org.gcube.portlets.user.reportgenerator.client.Presenter.Presenter; +import org.gcube.portlets.user.reportgenerator.client.model.TemplateModel; + +import com.google.gwt.event.dom.client.ClickEvent; +import com.google.gwt.event.dom.client.ClickHandler; +import com.google.gwt.i18n.client.DateTimeFormat; +import com.google.gwt.user.client.Command; +import com.google.gwt.user.client.Window; +import com.google.gwt.user.client.ui.CellPanel; +import com.google.gwt.user.client.ui.Composite; +import com.google.gwt.user.client.ui.HTML; +import com.google.gwt.user.client.ui.HasAlignment; +import com.google.gwt.user.client.ui.HasHorizontalAlignment; +import com.google.gwt.user.client.ui.HasVerticalAlignment; +import com.google.gwt.user.client.ui.HorizontalPanel; + + /** + * TitleBar class is the top top bar component of the UI + * + * @author Massimiliano Assante, ISTI-CNR - massimiliano.assante@isti.cnr.it + * + * @version July 2011 (3.0) + */ + public class TitleBar extends Composite{ + + + private Presenter presenter; + + /** + * the template Model + */ + private TemplateModel templateModel; + + /** + * mainLayout Panel + */ + private CellPanel mainLayout = new HorizontalPanel(); + + /** + * contains the current template name + */ + private HTML templateNameBox = new HTML(); + + /** + * contains the last edit date and the the last edit person username + */ + private HTML editedOn = new HTML(); + /** + * contains the page displayer + */ + private HTML pageDisplayer = new HTML(); + + + private HTML prevButton = new HTML(" ", true); + private HTML nextButton = new HTML("    ", true); + + + /** + * Constructor + * @param c the controller instance for this UI component + */ + public TitleBar(Presenter c) { + this.presenter = c; + this.templateModel = presenter.getModel(); + + + //initialize the template + setTemplateName(templateModel.getTemplateName()); + + setPageDisplayer(1, 1); + + + mainLayout.setSize("90%", "24px"); +// mainLayout.setStyleName("newresultset-header"); + + + + //design the part for the template name and the pages handling + + HorizontalPanel captionPanel = new HorizontalPanel(); + HorizontalPanel innerCaptionPanel = new HorizontalPanel(); + captionPanel.setWidth("100%"); + + //hide the buttons at the beginning + nextButton.addStyleName("setVisibilityOff"); + prevButton.addStyleName("setVisibilityOff"); + + HorizontalPanel pageHandlerPanel = new HorizontalPanel(); + pageHandlerPanel.setHeight("24"); + pageHandlerPanel.setVerticalAlignment(HasVerticalAlignment.ALIGN_MIDDLE); + + pageHandlerPanel.add(prevButton); + pageHandlerPanel.add(pageDisplayer); + pageHandlerPanel.add(nextButton); + pageHandlerPanel.setWidth("100%"); + + templateNameBox.setStyleName("menubar-font"); + + captionPanel.setHorizontalAlignment(HasHorizontalAlignment.ALIGN_LEFT); + innerCaptionPanel.setHorizontalAlignment(HasHorizontalAlignment.ALIGN_LEFT); + innerCaptionPanel.setVerticalAlignment(HasAlignment.ALIGN_BOTTOM); + innerCaptionPanel.add(templateNameBox); + innerCaptionPanel.add(editedOn); + captionPanel.add(innerCaptionPanel); + mainLayout.add(captionPanel); + mainLayout.add(pageHandlerPanel); + editedOn.setStyleName("docEditedBy"); + mainLayout.setCellHorizontalAlignment(captionPanel, HasHorizontalAlignment.ALIGN_LEFT); + + mainLayout.setCellWidth(pageHandlerPanel, "200"); + initWidget(mainLayout); + + nextButton.addClickHandler(new ClickHandler() { + public void onClick(ClickEvent event) { presenter.nextPageButtonClicked(); + } + }); + + prevButton.addClickHandler(new ClickHandler() { + public void onClick(ClickEvent event) { presenter.prevPageButtonClicked(); } + }); + } + + /** + * changes the pages label in the UI : e.g. Page x of y + * @param currentPage . + * @param totalPages . + */ + public void setPageDisplayer(int currentPage, int totalPages) { + pageDisplayer.setHTML("Section "+ currentPage + " of " + totalPages); + } + + /** + * changes the template name label in the UI + * @param name . + */ + public void setTemplateName(String name) { + templateNameBox.setHTML("  " + name); + } + + /** + * changes the template name label in the UI + * @param username . + * @param date . + */ + public void setEditedOnBy(Date date, String username) { + String dt = DateTimeFormat.getShortDateFormat().format(date); + + editedOn.setHTML("  edited on " + dt + "  by " + username); + } + /** + * Shows the previous botton in the UI + */ + public void showPrevButton() { + prevButton.removeStyleName("setVisibilityOff"); + prevButton.addStyleName("setVisibilityOn"); + } + /** + * Shows the next botton in the UI + */ + public void showNextButton() { + nextButton.removeStyleName("setVisibilityOff"); + nextButton.addStyleName("setVisibilityOn"); + } + + /** + * Hide the previous botton in the UI + */ + public void hidePrevButton() { + prevButton.removeStyleName("setVisibilityOn"); + prevButton.addStyleName("setVisibilityOff"); + } + /** + * Hide the next botton in the UI + */ + public void hideNextButton() { + nextButton.removeStyleName("setVisibilityOn"); + nextButton.addStyleName("setVisibilityOff"); + } + /** + * temporary command + * @return the command instance + */ + public Command getNullCommand() { + Command openNothing = new Command() { + + public void execute() { + Window.alert("Feature not supported yet"); + + } + }; + + return openNothing; + } + + + } + + diff --git a/src/main/java/org/gcube/portlets/user/reportgenerator/client/ToolboxPanel.java b/src/main/java/org/gcube/portlets/user/reportgenerator/client/ToolboxPanel.java new file mode 100644 index 0000000..2837cd9 --- /dev/null +++ b/src/main/java/org/gcube/portlets/user/reportgenerator/client/ToolboxPanel.java @@ -0,0 +1,53 @@ +package org.gcube.portlets.user.reportgenerator.client; + +// +//import org.gcube.portlets.user.workspace.client.tree.WorkspaceTreePanel; +//import org.gcube.portlets.user.workspace.client.workspace.GWTWorkspace; + +import org.gcube.portlets.user.workspace.client.AppControllerExplorer; +import org.gcube.portlets.user.workspace.client.view.tree.AsyncTreePanel; + +import com.google.gwt.user.client.ui.HTML; +import com.google.gwt.user.client.ui.SimplePanel; + +/** + * + * @author Massimiliano Assante, ISTI-CNR - massimiliano.assante@isti.cnr.it + * + * @version April 2012 (1.1) + */ + +public class ToolboxPanel extends SimplePanel { + private AppControllerExplorer appController; + /** + * + */ + public static final int TOOLBOX_WIDTH = 235; + /** + * + */ + public static final int TOOLBOX_HEIGHT= 800; + + /** + * constructor + */ + public ToolboxPanel(AppControllerExplorer appController) { + this.appController = appController; + AsyncTreePanel tp = appController.getTree(TOOLBOX_WIDTH, TOOLBOX_HEIGHT); + add(tp); + } + + /** + * refresh the root + */ + public void refreshRoot() { + appController.refreshRoot(); + } + /** + * lalala + * @return the toolbox height + */ + public int getTreePanelHeight() { + return TOOLBOX_HEIGHT; + } +} diff --git a/src/main/java/org/gcube/portlets/user/reportgenerator/client/WorkspacePanel.java b/src/main/java/org/gcube/portlets/user/reportgenerator/client/WorkspacePanel.java new file mode 100644 index 0000000..1f38199 --- /dev/null +++ b/src/main/java/org/gcube/portlets/user/reportgenerator/client/WorkspacePanel.java @@ -0,0 +1,160 @@ +package org.gcube.portlets.user.reportgenerator.client; + + + +import org.gcube.portlets.user.reportgenerator.client.Presenter.Presenter; +import org.gcube.portlets.user.reportgenerator.client.model.TemplateModel; +import org.gcube.portlets.user.reportgenerator.client.targets.DoubleColumnPanel; + +import com.google.gwt.user.client.ui.Composite; +import com.google.gwt.user.client.ui.FlowPanel; +import com.google.gwt.user.client.ui.Widget; + + +/** + * WorkspacePanel class is the UI Component for displaying the template + * + * @author Massimiliano Assante, ISTI-CNR - massimiliano.assante@isti.cnr.it + * @version October 2008 (0.2) + */ + +public class WorkspacePanel extends Composite { + /** + * the model + */ + private TemplateModel templateModel; + + /** + * the controller + */ + private Presenter presenter; + /** + * + */ + public static WorkspacePanel singleton = null; + + + /** + * used to place two compoenents on the same Y + */ + private boolean waitForNextOne = false; + + /** + * elements arrive one by one, to place two on the same Y this bufferedWidget is used; + */ + private Widget bufferedWidget; + /** + * + * @return . + */ + public static WorkspacePanel get() { + return singleton; + } + + /** + * the panel for the layout of the working space + */ + private FlowPanel mainLayout = new FlowPanel(); + + /** + * + * @param c the controller instance + */ + public WorkspacePanel(Presenter c) { + singleton = this; + presenter = c; + + templateModel = presenter.getModel(); + + mainLayout.setSize(""+templateModel.getPageWidth(), ""+templateModel.getPageHeight()); + + //mainLayout.setStyleName("wpFlow"); + //mainLayout.addStyleName("position-relative"); + + + initWidget(mainLayout); + + + } + + /** + * + * @param w . + * @param isDoubleColumnLayout . + */ + public void addComponentToLayout(Widget w, boolean isDoubleColumnLayout) { + waitForNextOne = isDoubleColumnLayout; + + if (! waitForNextOne) { + mainLayout.add(w); + bufferedWidget = null; + } + else { + if (bufferedWidget == null) + bufferedWidget = w; + else { + DoubleColumnPanel toAdd = new DoubleColumnPanel(bufferedWidget, w); + mainLayout.add(toAdd); + bufferedWidget = null; + } + } + //mainLayout.add(w, x, y); + } + + /** + * + * @param w the widget to remove + * @return true if the romove is successfull + */ + public boolean removeComponentFromLayout(Widget w) { + return mainLayout.remove(w); + } + + /** + * + * @param model . + */ + public void setModel(TemplateModel model ) { + this.templateModel = model; + } + + /** + * resizes the workspace panel + * @param width . + * @param height . + */ + public void resizeWorkspace(int width, int height) { + mainLayout.setPixelSize(width, height); + } + + /** + * + * @param toMove . + * @param left . + * @param top . + */ + public void moveWidget(Widget toMove, int left, int top) { + // mainLayout.setWidgetPosition(toMove, left, top); +// GWT.log("MOVED? " + top, null); + } + + /** + * + * @param toResize the widget to resize + * @param newWidth . + * @param newHeight . + */ + public void resizeWidget(Widget toResize, int newWidth, int newHeight) { + toResize.setPixelSize(newWidth, newHeight); + } + + /** + * + * @return . + */ + public FlowPanel getMainLayout() { + return mainLayout; + } + +} + diff --git a/src/main/java/org/gcube/portlets/user/reportgenerator/client/components/FancyFileUpload.java b/src/main/java/org/gcube/portlets/user/reportgenerator/client/components/FancyFileUpload.java new file mode 100644 index 0000000..115f9fa --- /dev/null +++ b/src/main/java/org/gcube/portlets/user/reportgenerator/client/components/FancyFileUpload.java @@ -0,0 +1,492 @@ +package org.gcube.portlets.user.reportgenerator.client.components; + +import org.gcube.portlets.user.reportgenerator.client.dialog.ImageUploaderDialog; + +import com.google.gwt.core.client.GWT; +import com.google.gwt.user.client.Timer; +import com.google.gwt.user.client.Window; +import com.google.gwt.user.client.ui.Button; +import com.google.gwt.user.client.ui.ChangeListener; +import com.google.gwt.user.client.ui.ChangeListenerCollection; +import com.google.gwt.user.client.ui.ClickListener; +import com.google.gwt.user.client.ui.Composite; +import com.google.gwt.user.client.ui.FileUpload; +import com.google.gwt.user.client.ui.FlowPanel; +import com.google.gwt.user.client.ui.FormHandler; +import com.google.gwt.user.client.ui.FormPanel; +import com.google.gwt.user.client.ui.FormSubmitCompleteEvent; +import com.google.gwt.user.client.ui.FormSubmitEvent; +import com.google.gwt.user.client.ui.HasText; +import com.google.gwt.user.client.ui.HasWordWrap; +import com.google.gwt.user.client.ui.HorizontalPanel; +import com.google.gwt.user.client.ui.Label; +import com.google.gwt.user.client.ui.SourcesChangeEvents; +import com.google.gwt.user.client.ui.VerticalPanel; +import com.google.gwt.user.client.ui.Widget; + +/** + * FancyFileUpload class is use to upload images from client in the UI + * + * @author Massimiliano Assante, ISTI-CNR - massimiliano.assante@isti.cnr.it + * @version October 2008 (0.2) + */ +public class FancyFileUpload extends Composite implements HasText, HasWordWrap, SourcesChangeEvents{ + + /** + * State definitions + */ + public final int EMPTY_STATE = 1; + /** + * + */ + public final int PENDING_STATE = 2; + /** + * + */ + public final int UPLOADING_STATE = 3; + /** + * + */ + public final int UPLOADED_STATE = 4; + /** + * + */ + public final int DELETED_STATE = 5; + /** + * + */ + public final int FAILED_STATE = 6; + + /** + * Initial State of the widget. + */ + private int widgetState = EMPTY_STATE; + + /** + * Default delay to check an empty FileUpload widget for + * arrival of a filename. + * + */ + private int searchUpdateDelay = 500; + + /** + * Default delay for pending state, when delay over the form is +submitted. + */ + private int pendingUpdateDelay = 5000; + + /** + * the panel where this widget is in + */ + private ImageUploaderDialog theOwner; + + + /** + * OK message expected from file upload servlet to indicate successful +upload. + */ + //private String retursOKMessage = "
OK
"; + + private FormPanel uploadForm = new FormPanel(); + private VerticalPanel mainPanel = new VerticalPanel(); + + /** + * Internal timer for checking fileupload text for a value. + */ + private Timer t; + + /** + * Internal timer for checking if pending delay is over. + */ + private Timer p; + + /** + * Widget representing file to be uploaded. + */ + private UploadDisplay uploadItem; + + /** + * FileName to be uploaded + */ + String fileName = ""; + + + /** + * Class used for the display of filename to be uploaded, + * and handling the update of the display states. + * + * + */ + protected class UploadDisplay extends Composite{ + + /** + * FileUpload Widget + */ + FileUpload uploadFileWidget = new FileUpload(); + + /** + * Label to display after file widget is filled with a filename + */ + Label uploadFileName = new Label(); + + + /** + * Panel to hold the widget + */ + FlowPanel mainPanel = new FlowPanel(); + + /** + * Panel to hold pending, loading, loaded or failed state details. + */ + HorizontalPanel pendingPanel = new HorizontalPanel(); + + /** + * Constructor + * + */ + public UploadDisplay(){ + + mainPanel.add(uploadFileWidget); + pendingPanel.add(uploadFileName); + uploadFileName.setStyleName("HTMLObjectStyle-font"); + uploadFileName.setWordWrap(true); + uploadFileWidget.setWidth("100%"); + + mainPanel.add(pendingPanel); + pendingPanel.setVisible(false); + initWidget(mainPanel); + } + + /** + * Set the widget into pending mode by altering style + * of pending panel and displaying it. Hide the FileUpload + * widget and finally set the state to Pending. + * + */ + private void setPending(){ + uploadFileName.setText("Please wait, fetching image from your file system.. ");//uploadFileWidget.getFilename()); + uploadFileWidget.setVisible(false); + pendingPanel.setVisible(true); + pendingPanel.setStyleName("fancyfileupload-pending"); + widgetState = PENDING_STATE; + } + + /** + * Set the widget into Loading mode by changing the style name + * and updating the widget State to Uploading. + * + */ + private void setLoading(){ + pendingPanel.setStyleName("fancyfileupload-loading"); + widgetState = UPLOADING_STATE; + } + + /** + * Set the widget to Loaded mode by changing the style name + * and updating the widget State to Loaded. + * + */ + private void setLoaded(){ + pendingPanel.setStyleName("fancyfileupload-loaded"); + uploadFileName.setText("Image Successfully uploaded"); + widgetState = UPLOADED_STATE; + } + + + /** + * Set the widget to Failed mode by changing the style name + * and updating the widget State to Failed. + * Additionally, hide the pending panel and display the FileUpload + * widget. + * + */ + private void setFailed(){ + widgetState = FAILED_STATE; + uploadFileName.setText("Operation Failed"); + } + + } + + /** + * Perform the uploading of a file by changing state of display widget + * and then calling form.submit() method. + * + */ + private void uploadFiles(){ + fileName = uploadItem.uploadFileWidget.getFilename(); + + uploadItem.setLoading(); + uploadForm.submit(); + + } + + + /** + * Put the widget into a Pending state, set the Pending delay timer + * to call the upload file method when ran out. + * + */ + private void pendingUpload(){ + // Fire an onChange event to anyone who is listening + uploadItem.setPending(); + p = new Timer(){ + public void run() { + uploadFiles(); + } + }; + p.schedule(pendingUpdateDelay); + } + + /** + * Method to check if FileUpload Widget has a filename within it. + * If so, cancel the timer that was set to call this method and then + * call the pendingUpload() method. + * If not, do nothing. + * + */ + private void checkForFileName(){ +// GWT.log(uploadItem.uploadFileWidget.getFilename()+" :"+fileName,null); +// if (!uploadItem.uploadFileWidget.getFilename().equals("")){ +// if (!uploadItem.uploadFileWidget.getFilename().equals(fileName)){ +// t.cancel(); +// pendingUpload(); +// } +// } + } + + /** + * This method sets up a repeating schedule to call the +checkforfilename + * method to see if the FileUpload widget has any text in it. + * + */ + private void startWaiting(){ + t = null; + t = new Timer(){ + public void run() { + checkForFileName(); + } + }; + t.scheduleRepeating(searchUpdateDelay); + } + + /** + * + * @param owner the caller + * @param templateName . + */ + public FancyFileUpload(ImageUploaderDialog owner, String templateName){ + + this.theOwner = owner; + // Set Form details + // Set the action to call on submit + + uploadForm.setAction(GWT.getModuleBaseURL() + "ImagesUploadServlet?currTemplateName=" + templateName); + + + // Set the form encoding to multipart to indicate a file upload + uploadForm.setEncoding(FormPanel.ENCODING_MULTIPART); + // Set the method to Post + uploadForm.setMethod(FormPanel.METHOD_POST); + uploadForm.setWidget(mainPanel); + + // Create a new upload display widget + uploadItem = new UploadDisplay(); + // Set the name of the upload file form element + uploadItem.uploadFileWidget.setName("uploadFormElement"); + // Add the new widget to the panel. + mainPanel.add(uploadItem); + HorizontalPanel wrapper = new HorizontalPanel(); + wrapper.setSpacing(4); + // Add a 'submit' button. + wrapper.add(new Button("Submit", new ClickListener() { + public void onClick(Widget sender) { + String fName = uploadItem.uploadFileWidget.getFilename(); + + + int slashPosition = fName.lastIndexOf("/"); + + String fileNameToCheck = "" ; + + if (slashPosition == -1) //it is windows + slashPosition = fName.lastIndexOf("\\"); + + if (slashPosition != -1) + fileNameToCheck = fName.substring(slashPosition+1, fName.length()); + + if (fName.equals("")) { + Window.alert("The text box must not be empty"); + } + else if (fileNameToCheck.indexOf(" ") > -1) { + Window.alert("File name cannot contain empty spaces"); + + } + else { + t.cancel(); + pendingUpload(); + } + } + })); + + // Add a 'close' button. + wrapper.add(new Button("Cancel", new ClickListener() { + public void onClick(Widget sender) { + theOwner.hide(); + } + })); + mainPanel.add(wrapper); + + // Start the waiting for a name to appear in the file upload widget. + startWaiting(); + // Initialise the widget. + initWidget(uploadForm); + + // Add an event handler to the form. + uploadForm.addFormHandler(new FormHandler() { + public void onSubmitComplete(FormSubmitCompleteEvent event) { + // Fire an onChange Event + fireChangeEvent(); + // Cancel all timers to be absolutely sure nothing is going on. + t.cancel(); + p.cancel(); + // Ensure that the form encoding is set correctly. + uploadForm.setEncoding(FormPanel.ENCODING_MULTIPART); + // Check the result to see if an OK message is returned from the server. + + if(event.getResults().toString().contains("OK") || event.getResults().toString().startsWith("OK")) { + uploadItem.setLoaded(); + String fName = uploadItem.uploadFileWidget.getFilename(); + + String nameToPass = ""; + if (fName.lastIndexOf("/") == -1) //windows + nameToPass = fName.substring(fName.lastIndexOf("\\")+1); + else + nameToPass = fName.substring(fName.lastIndexOf("/")+1); + + theOwner.insertImage(nameToPass); + theOwner.hide(); + + } else { + // If no, set the widget to failed state. + uploadItem.setFailed(); + Window.alert("There were some errors during File Uploading processing,Please try again"); + } + } + + public void onSubmit(FormSubmitEvent event) { + //No validation in this version. + } + }); + } + + /** + * Fire a change event to anyone listening to us. + * + */ + private void fireChangeEvent(){ + if (changeListeners != null) + changeListeners.fireChange(this); + } + + /** + * Get the text from the widget - which in reality will be retrieving any + * value set in the Label element of the display widget. + * @return . + */ + public String getText() { + return uploadItem.uploadFileName.getText(); + } + + /** + * Cannot set the text of a File Upload Widget, so raise an exception. + * @param text . + */ + public void setText(String text) { + throw new RuntimeException("Cannot set text of a FileUpload Widget"); + } + + /** + * Retrieve the status of the upload widget. + * @return Status of upload widget. + * + */ + public int getUploadState(){ + return widgetState; + } + + /** + * Set the delay for checking for a filename to appear in the FileUpload widget + * Might be useful if there are performance issues. + * @param newDelay . + */ + public void setCheckForFileNameDelay(int newDelay){ + searchUpdateDelay = newDelay; + } + + /** + * Set the delay value indicating how long a file will remain in +pending mode + * prior to the upload action taking place. + * @param newDelay . + */ + public void setPendingDelay(int newDelay){ + pendingUpdateDelay = newDelay; + } + + /** + * Return the delay value set for checking a file. + * @return . + */ + public int getCheckForFileNameDelay(){ + return searchUpdateDelay; + } + + /** + * Return value set for pending delay. + * @return . + */ + public int getPendingDelay(){ + return pendingUpdateDelay; + } + + /** + * Return if the label in the display widget is wordwrapped or not. + * @return . + */ + public boolean getWordWrap() { + return uploadItem.uploadFileName.getWordWrap(); + } + + /** + * Set the word wrap value of the label in the display widget. + * @param wrap . + */ + public void setWordWrap(boolean wrap) { + uploadItem.uploadFileName.setWordWrap(wrap); + } + + /** + * + */ + private ChangeListenerCollection changeListeners; + + /** + * Add a change listener + * @param listener , + */ + public void addChangeListener(ChangeListener listener) { + if (changeListeners == null) + changeListeners = new ChangeListenerCollection(); + changeListeners.add(listener); + } + + /** + * Remove a change listener + * @param listener . + */ + public void removeChangeListener(ChangeListener listener) { + if (changeListeners != null) + changeListeners.remove(listener); + } + +} \ No newline at end of file diff --git a/src/main/java/org/gcube/portlets/user/reportgenerator/client/dialog/AddBiblioEntryDialog.java b/src/main/java/org/gcube/portlets/user/reportgenerator/client/dialog/AddBiblioEntryDialog.java new file mode 100644 index 0000000..b39f9bd --- /dev/null +++ b/src/main/java/org/gcube/portlets/user/reportgenerator/client/dialog/AddBiblioEntryDialog.java @@ -0,0 +1,70 @@ +package org.gcube.portlets.user.reportgenerator.client.dialog; + +import org.gcube.portlets.user.reportgenerator.client.events.AddBiblioEvent; + +import com.extjs.gxt.ui.client.event.ComponentEvent; +import com.extjs.gxt.ui.client.widget.Dialog; +import com.extjs.gxt.ui.client.widget.Window; +import com.extjs.gxt.ui.client.widget.button.Button; +import com.extjs.gxt.ui.client.widget.form.FormPanel; +import com.extjs.gxt.ui.client.widget.form.TextArea; +import com.extjs.gxt.ui.client.widget.form.TextField; +import com.extjs.gxt.ui.client.widget.layout.FitLayout; +import com.extjs.gxt.ui.client.widget.layout.FormData; +import com.google.gwt.event.shared.HandlerManager; +/** + * The AddBiblioEntryDialog class + * + * @author Massimiliano Assante, ISTI-CNR - massimiliano.assante@isti.cnr.it + * @version July 2011 (3.0) + */ +public class AddBiblioEntryDialog extends Window { + + public AddBiblioEntryDialog(final HandlerManager eventBus) { + setHeading("Add Citation"); + setClosable(true); + setWidth(400); + setHeight(250); + setPlain(true); + setLayout(new FitLayout()); + + final TextField citekey = new TextField(); + citekey.setFieldLabel("Cite key"); + citekey.setAllowBlank(false); + final TextArea textArea = new TextArea(); + textArea.setFieldLabel("Citation"); + textArea.setAllowBlank(false); + textArea.setHeight(130); + Button addButton = new Button("Add") { + @Override + protected void onClick(final ComponentEvent ce) { + if (citekey.isValid()) { + eventBus.fireEvent(new AddBiblioEvent(citekey.getValue(), textArea.getValue())); + close(); + } + } + }; + + Button cancelButton = new Button("Cancel") { + @Override + protected void onClick(final ComponentEvent ce) { + close(); + } + }; + + addButton(addButton); + addButton(cancelButton); + + FormData formData = new FormData("-10"); + FormPanel formPanel = new FormPanel(); + formPanel.setAutoWidth(true); + formPanel.getHeader().setStyleName("x-hide-panel-header"); + formPanel.setHeaderVisible(false); + formPanel.setLabelWidth(55); + formPanel.setWidth(400); + formPanel.setHeight(250); + formPanel.add(citekey, formData); + formPanel.add(textArea, formData); + add(formPanel); + } +} diff --git a/src/main/java/org/gcube/portlets/user/reportgenerator/client/dialog/CommentDialog.java b/src/main/java/org/gcube/portlets/user/reportgenerator/client/dialog/CommentDialog.java new file mode 100644 index 0000000..33eed62 --- /dev/null +++ b/src/main/java/org/gcube/portlets/user/reportgenerator/client/dialog/CommentDialog.java @@ -0,0 +1,86 @@ +package org.gcube.portlets.user.reportgenerator.client.dialog; + +import org.gcube.portlets.d4sreporting.common.client.ImageConstants; +import org.gcube.portlets.user.reportgenerator.client.events.AddCommentEvent; +import org.gcube.portlets.user.reportgenerator.client.events.RemovedUserCommentEvent; +import org.gcube.portlets.user.reportgenerator.client.targets.ReportTextArea; + +import com.google.gwt.event.dom.client.ClickEvent; +import com.google.gwt.event.dom.client.ClickHandler; +import com.google.gwt.event.shared.HandlerManager; +import com.google.gwt.user.client.Window; +import com.google.gwt.user.client.ui.AbsolutePanel; +import com.google.gwt.user.client.ui.DialogBox; +import com.google.gwt.user.client.ui.Image; +import com.google.gwt.user.client.ui.TextArea; +import com.google.gwt.user.client.ui.VerticalPanel; + +public class CommentDialog extends DialogBox { + private static final int PANEL_WIDTH = 200; + + VerticalPanel mainPanel = new VerticalPanel(); + AbsolutePanel header = new AbsolutePanel(); + TextArea area; + + public CommentDialog(final HandlerManager eventBus, final ReportTextArea source, final String username, final String previousComment, int areaHeight) { + super(true); + setStyleName("comment-popup"); + area = new TextArea(); + if (previousComment != null && !(previousComment.compareTo("") == 0)) { + area.setText(previousComment); + } else { + area.setText(" - " + username+":\n"); + } + if (areaHeight > 0) { + area.setPixelSize(PANEL_WIDTH, areaHeight); + } else { + area.setPixelSize(PANEL_WIDTH, 85); + } + setSize(PANEL_WIDTH+"px", "100px"); + header.setPixelSize(PANEL_WIDTH, 15); + final Image enterImage = new Image(ImageConstants.IMAGE_ARROW_ENTER); + final Image closeImage = new Image(ImageConstants.IMAGE_CLOSE_15x15); + final Image binImage = new Image(ImageConstants.IMAGE_BIN); + closeImage.setStyleName("selectable"); + binImage.setStyleName("selectable"); + enterImage.setStyleName("selectable"); + header.add(enterImage, PANEL_WIDTH-46, -2); + header.add(binImage, PANEL_WIDTH-27, 0); + header.add(closeImage, PANEL_WIDTH-12, 3); + binImage.setTitle("Discard this comment"); + closeImage.setTitle("Close and save"); + enterImage.setTitle("Add another comment"); + + area.setStyleName("comment-popup-textarea"); + + header.setStyleName("comment-popup-header"); + mainPanel.add(header); + mainPanel.add(area); + add(mainPanel); + + enterImage.addClickHandler(new ClickHandler() { + public void onClick(ClickEvent event) { + area.setText(area.getText() + "\n______\n"+username+":\n"); + area.setPixelSize(PANEL_WIDTH, area.getOffsetHeight()+70); + } + }); + + closeImage.addClickHandler(new ClickHandler() { + public void onClick(ClickEvent event) { + eventBus.fireEvent(new AddCommentEvent(source, area.getText(), area.getOffsetHeight())); + source.addCommentView(); + hide(); + } + }); + + binImage.addClickHandler(new ClickHandler() { + public void onClick(ClickEvent event) { + eventBus.fireEvent(new RemovedUserCommentEvent(source)); + source.removeCommentView(); + hide(); + } + }); + + } + +} diff --git a/src/main/java/org/gcube/portlets/user/reportgenerator/client/dialog/DeleteCitationsDialog.java b/src/main/java/org/gcube/portlets/user/reportgenerator/client/dialog/DeleteCitationsDialog.java new file mode 100644 index 0000000..97bb365 --- /dev/null +++ b/src/main/java/org/gcube/portlets/user/reportgenerator/client/dialog/DeleteCitationsDialog.java @@ -0,0 +1,92 @@ +package org.gcube.portlets.user.reportgenerator.client.dialog; + +import java.util.ArrayList; + +import org.gcube.portlets.d4sreporting.common.client.ComponentType; +import org.gcube.portlets.d4sreporting.common.shared.SerializableComponent; +import org.gcube.portlets.user.reportgenerator.client.events.RemovedCitationEvent; +import org.gcube.portlets.user.reportgenerator.client.model.TemplateComponent; +import org.gcube.portlets.user.reportgenerator.client.model.TemplateSection; + +import com.extjs.gxt.ui.client.event.ComponentEvent; +import com.extjs.gxt.ui.client.widget.Component; +import com.extjs.gxt.ui.client.widget.MessageBox; +import com.extjs.gxt.ui.client.widget.TabItem; +import com.extjs.gxt.ui.client.widget.TabPanel; +import com.extjs.gxt.ui.client.widget.Window; +import com.extjs.gxt.ui.client.widget.layout.FitLayout; +import com.google.gwt.event.shared.HandlerManager; +import com.google.gwt.user.client.ui.HTML; +import com.extjs.gxt.ui.client.widget.button.Button; +/** + * The ManageBiblioDialog class + * + * @author Massimiliano Assante, ISTI-CNR - massimiliano.assante@isti.cnr.it + * @version July 2011 (3.0) + */ +public class DeleteCitationsDialog extends Window { + + TabPanel tabPanel = new TabPanel(); +// + public DeleteCitationsDialog(final HandlerManager eventBus, TemplateSection bibliosection) { + setTitle("Delete Citations"); + setClosable(true); + setWidth(400); + setHeight(250); + setPlain(true); + setLayout(new FitLayout()); + + Button deleteButton = new Button("Delete") { + @Override + protected void onClick(final ComponentEvent ce) { + if (tabPanel.getItemCount() > 1) { + eventBus.fireEvent(new RemovedCitationEvent(tabPanel.getSelectedItem().getTitle())); + tabPanel.remove(tabPanel.getSelectedItem()); + } + else { + MessageBox.alert("","You cannot have a Bibliography with no citations, if you want to remove it use Section > Discard current", null); + } + } + }; +// + Button cancelButton = new Button("Close") { + @Override + protected void onClick(final ComponentEvent ce) { + close(); + } + }; + + addButton(deleteButton); + addButton(cancelButton); +// + ArrayList citations = new ArrayList(); + for (TemplateComponent tc : bibliosection.getAllComponents()) { + if (tc.getType() == ComponentType.BODY) { + SerializableComponent sc = tc.getSerializable(); + citations.add(sc.getPossibleContent().toString()); + } + } + + + for (String cite : citations) { + TabItem tabI = new TabItem(); + HTML html = new HTML(cite.split(" ")[0], true); + String citekey = html.getText(); + if (citekey.endsWith(".")) //remove dot + citekey = citekey.substring(0, citekey.length()-1); + + tabI.setTitle(citekey); + String citation = cite.split(" ")[1]; + tabI.setText(citekey); + tabI.add(new HTML(citation)); + tabI.setClosable(false); + tabPanel.add(tabI); + + //TODO: + + } + add(tabPanel); + } + + +} diff --git a/src/main/java/org/gcube/portlets/user/reportgenerator/client/dialog/FimesReportTreePanel.java b/src/main/java/org/gcube/portlets/user/reportgenerator/client/dialog/FimesReportTreePanel.java new file mode 100644 index 0000000..693f27d --- /dev/null +++ b/src/main/java/org/gcube/portlets/user/reportgenerator/client/dialog/FimesReportTreePanel.java @@ -0,0 +1,195 @@ +package org.gcube.portlets.user.reportgenerator.client.dialog; + +import java.util.HashMap; +import java.util.List; +import java.util.Vector; + +import org.gcube.portlets.d4sreporting.common.shared.SerializableComponent; +import org.gcube.portlets.d4sreporting.common.shared.SerializableModel; +import org.gcube.portlets.d4sreporting.common.shared.SerializableSection; +import org.gcube.portlets.user.reportgenerator.client.events.ItemSelectionEvent; +import org.gcube.portlets.user.reportgenerator.client.resources.FimesReportTreeStructureResources; + +import com.google.gwt.event.logical.shared.SelectionEvent; +import com.google.gwt.event.logical.shared.SelectionHandler; +import com.google.gwt.event.shared.HandlerManager; +import com.google.gwt.resources.client.ImageResource; +import com.google.gwt.user.client.ui.HorizontalPanel; +import com.google.gwt.user.client.ui.Image; +import com.google.gwt.user.client.ui.Label; +import com.google.gwt.user.client.ui.ScrollPanel; +import com.google.gwt.user.client.ui.Tree; +import com.google.gwt.user.client.ui.TreeItem; +import com.google.gwt.user.client.ui.Widget; + + +public class FimesReportTreePanel extends ScrollPanel{ + + public FimesReportTreePanel(final HandlerManager eventBus, final SerializableModel report, + final String height, final String width) { + + this.setWidth(width); + this.setHeight(height); + + Tree t = new Tree(); + t.setAnimationEnabled(true); + t.addItem(loadReportRootTree(report)); + t.addSelectionHandler(new SelectionHandler() { + + @SuppressWarnings("unchecked") + public void onSelection(SelectionEvent event) { + // TODO Auto-generated method stub + TreeItem item = event.getSelectedItem(); + HashMap map = (HashMap)item.getUserObject(); + eventBus.fireEvent(new ItemSelectionEvent(map)); + } + }); + + this.add(t); + } + + private TreeItem loadReportRootTree(final SerializableModel report) { + // Add root node + ImageResource image = FimesReportTreeStructureResources.INSTANCE.root(); + HorizontalPanel node = createNodeWidget(image, report.getTemplateName(),"gwt-label-rootTree"); + TreeItem root = new TreeItem(node); + + Vector sections = report.getSections(); + for(int i = 1; i <= sections.size(); i++) { + SerializableSection s = sections.get(i - 1); + // Add section item + image = FimesReportTreeStructureResources.INSTANCE.section(); + node = createNodeWidget(image, "Section" + i,"gwt-label-sectionTree"); + + TreeItem sectionItem = addChildItemToParentItem(root, "Section", Integer.toString(i -1), node); + addItemsComponent(sectionItem, s); + + } + + return root; + } + + private void addItemsComponent(final TreeItem sectionItem,final SerializableSection sectionModel) { + + List components = sectionModel.getComponents(); + for(int i = 0; i < components.size(); i++) { + SerializableComponent c = components.get(i); + + HorizontalPanel node = null; + switch (c.getType()) { + case TITLE: { + ImageResource image = FimesReportTreeStructureResources.INSTANCE.heading1(); + node = createNodeWidget(image, (String)c.getPossibleContent(),"gwt-label-componentTree"); + break; + } + case HEADING_1: { + ImageResource image = FimesReportTreeStructureResources.INSTANCE.heading1(); + node = createNodeWidget(image, (String)c.getPossibleContent(),"gwt-label-componentTree"); + break; + } + case HEADING_2: { + ImageResource image = FimesReportTreeStructureResources.INSTANCE.heading2(); + node = createNodeWidget(image, (String)c.getPossibleContent(),"gwt-label-componentTree"); + break; + } + case HEADING_3: { + ImageResource image = FimesReportTreeStructureResources.INSTANCE.heading3(); + node = createNodeWidget(image, (String)c.getPossibleContent(),"gwt-label-componentTree"); + break; + } + case HEADING_4: { + ImageResource image = FimesReportTreeStructureResources.INSTANCE.heading4(); + node = createNodeWidget(image, (String)c.getPossibleContent(),"gwt-label-componentTree"); + break; + } + case INSTRUCTION: { + ImageResource image = FimesReportTreeStructureResources.INSTANCE.instructions(); + node = createNodeWidget(image, "Instruction","gwt-label-componentTree"); + break; + } + case COMMENT: { + ImageResource image = FimesReportTreeStructureResources.INSTANCE.comments(); + node = createNodeWidget(image, "Comment","gwt-label-componentTree"); + break; + } + case BODY: { + ImageResource image = FimesReportTreeStructureResources.INSTANCE.text(); + node = createNodeWidget(image, "Text","gwt-label-componentTree"); + break; + } + case DYNA_IMAGE: { + ImageResource image = FimesReportTreeStructureResources.INSTANCE.image(); + node = createNodeWidget(image, "Image","gwt-label-componentTree"); + break; + } + case FLEX_TABLE: { + ImageResource image = FimesReportTreeStructureResources.INSTANCE.table(); + node = createNodeWidget(image, "Table","gwt-label-componentTree"); + break; + } + case ATTRIBUTE: { + // TODO + ImageResource image = FimesReportTreeStructureResources.INSTANCE.comments(); + node = createNodeWidget(image, "Attribute","gwt-label-componentTree"); + break; + } + case TOC: + // TODO + // componentItem = new TreeItem("TOC"); + break; + case PAGEBREAK: + // TODO + // componentItem = new TreeItem("Pagebreak"); + break; + case TIME_SERIES: + // TODO + //componentItem = new TreeItem("Time_Series"); + break; + } + + if (node != null) + addChildItemToParentItem(sectionItem, "Component", + Integer.toString(i), node); + + } + } + + private TreeItem addChildItemToParentItem(final TreeItem root, final String typeItem, + final String indexList, final Widget content) { + + TreeItem item = new TreeItem(content); + // Create userObjet + HashMap map = new HashMap(); + map.put("item",typeItem ); + map.put("index", indexList); + map.put("parent", root.getUserObject()); + item.setUserObject(map); + root.addItem(item); + return item; + } + + /** + * Generates HTML for a tree item with an attached icon. + * @param imageResource the image resource to use + * @param title the title of the item + * @return the resultant HTML + */ + private HorizontalPanel createNodeWidget(ImageResource imageResource, String title, + String cssStyle) { + HorizontalPanel node = new HorizontalPanel(); + + node.setSpacing(0); + Image image = new Image(imageResource); + image.setPixelSize(image.getWidth() + 5, image.getHeight()); + node.add(image); + + String shortTitle = title; + if (shortTitle.length() > 25) + shortTitle = shortTitle.substring(0,25) + "..."; + + Label text = new Label(shortTitle); + text.setStyleName(cssStyle); + node.add(text); + return node; + } +} diff --git a/src/main/java/org/gcube/portlets/user/reportgenerator/client/dialog/ImageUploaderDialog.java b/src/main/java/org/gcube/portlets/user/reportgenerator/client/dialog/ImageUploaderDialog.java new file mode 100644 index 0000000..838b304 --- /dev/null +++ b/src/main/java/org/gcube/portlets/user/reportgenerator/client/dialog/ImageUploaderDialog.java @@ -0,0 +1,210 @@ +package org.gcube.portlets.user.reportgenerator.client.dialog; + +import org.gcube.portlets.user.reportgenerator.client.Presenter.Presenter; +import org.gcube.portlets.user.reportgenerator.client.components.FancyFileUpload; + +import com.google.gwt.core.client.GWT; +import com.google.gwt.user.client.ui.Button; +import com.google.gwt.user.client.ui.ChangeListener; +import com.google.gwt.user.client.ui.ClickListener; +import com.google.gwt.user.client.ui.DialogBox; +import com.google.gwt.user.client.ui.HTML; +import com.google.gwt.user.client.ui.HorizontalPanel; +import com.google.gwt.user.client.ui.RadioButton; +import com.google.gwt.user.client.ui.TextBox; +import com.google.gwt.user.client.ui.VerticalPanel; +import com.google.gwt.user.client.ui.Widget; + +/** + * ImageUploaderDialog class is the Dialog for uploading images + * + * @author Massimiliano Assante, ISTI-CNR - massimiliano.assante@isti.cnr.it + * @version October 2008 (0.2) + */ +public class ImageUploaderDialog extends DialogBox { + + private int width; + private int height; + + private Presenter presenter; + + + private String currTemplateName = ""; + + private HorizontalPanel topLabel = new HorizontalPanel(); + + private EventListener listener = new EventListener(); + private RadioButton local = new RadioButton(""); + private RadioButton web = new RadioButton(""); + + /** + * the container panel + */ + private VerticalPanel mainLayout = new VerticalPanel(); + private VerticalPanel dialogPanel = new VerticalPanel(); + + + + /** + * Creates the dialog + * @param presenter my controller + */ + public ImageUploaderDialog(Presenter presenter) { + + + // Create a dialog box and set the caption text + this.width = 400; + this.height = 200; + this.presenter = presenter; + setText("Insert Image"); + + local.setHTML(" From this computer"); + topLabel.add(local); + local.setChecked(true); + + web.setHTML(" From the web (URL)"); + topLabel.add(web); + web.addClickListener(listener); + local.addClickListener(listener); + + currTemplateName = presenter.getModel().getTemplateName(); + + + + dialogPanel.add(getFromLocalPanel()); + dialogPanel.setPixelSize(this.width, this.height); + + mainLayout.add(topLabel); + mainLayout.add(dialogPanel); + setWidget(mainLayout); + + } + + private VerticalPanel getFromLocalPanel() { + VerticalPanel toReturn = new VerticalPanel(); + FancyFileUpload uploader = new FancyFileUpload(this, currTemplateName); + HTML theLabel = new HTML("Browse your computer for the image file to upload:"); + toReturn.add(theLabel); + toReturn.add(uploader); + toReturn.setSpacing(4); + toReturn.setStyleName("uploadDialog"); + toReturn.setPixelSize(this.width, this.height); + + return toReturn; + } + + private VerticalPanel getFromURLPanel() { + VerticalPanel toReturn = new VerticalPanel(); + + toReturn.setSpacing(5); + + HTML theLabel = new HTML("Enter image web address:"); + final TextBox urlTextbox = new TextBox(); + urlTextbox.setWidth("90%"); + + final HTML previewBox = new HTML("

Image preview will be displayed here.

*Remember: Using others' images on the web without their permission may be bad manners, or worse, copyright infringement.

", true); + previewBox.setStyleName("imagePreviewBox"); + + toReturn.add(theLabel); + toReturn.add(urlTextbox); + toReturn.add(previewBox); + + urlTextbox.addChangeListener(new ChangeListener() { + + public void onChange(Widget sender) { + previewBox.setHTML(""); + previewBox.removeStyleName("imagePreviewBox"); + } + + }); + + HorizontalPanel buttonsPanel = new HorizontalPanel(); + + + + buttonsPanel.add(new Button("Insert", new ClickListener() { + public void onClick(Widget sender) { + hide(); + presenter.getCurrentSelected().getExtendedFormatter().insertImage(urlTextbox.getText()); + presenter.getModel().storeInSession(); + } + })); + + buttonsPanel.add(new Button("Cancel", new ClickListener() { + public void onClick(Widget sender) { + hide(); + } + })); + + buttonsPanel.setSpacing(5); + toReturn.add(buttonsPanel); + + return toReturn; + } + + /** + * + * @param imageName . + */ + public void insertImage(String imageName) { + String imgURL = getImageURL(imageName, "CURRENT_OPEN"); + presenter.getCurrentSelected().getExtendedFormatter().insertImage(imgURL); + presenter.getModel().storeInSession(); + } + + + + + + + /** + * use an inner EventListener class to avoid exposing event methods on the dialog class itself. + */ + + private class EventListener implements ClickListener { + + public void onClick(Widget sender) { + if (sender == web && web.isChecked()) { + dialogPanel.clear(); + dialogPanel.add(getFromURLPanel()); + } else if (sender == local && local.isChecked()) { + dialogPanel.clear(); + dialogPanel.add(getFromLocalPanel()); + } + + } + + } + + /** + * return a URL which is lookable for on the web + * @param imageName . + * @param templateName . + * @return . + */ + public String getImageURL(String imageName, String templateName) { + String currentUser = presenter.getCurrentUser(); + String currentScope = presenter.getCurrentScope(); + /** + * Images will be stored under webapps/usersArea... + * GWT.getModuleBaseURL() returns * e.g. http://dlib28.isti.cnr.it/templatecreator/html/ + * need to get just http://dlib28.isti.cnr.it/ + */ + //remove "/html/" and get e.g. http://dlib28.isti.cnr.it/templatecreator + String host = GWT.getModuleBaseURL().substring(0, GWT.getModuleBaseURL().length()-6); + + //loog for last slash + int lastSlash = host.lastIndexOf("/"); + + //get what i need : e.g. http://dlib28.isti.cnr.it/ or host = "http://localhost:8080/"; + host = host.substring(0, lastSlash +1 ); + //host = "http://localhost:8080/"; + + String imgURL = host + "usersArea/" + currentScope + "/templates/" + + currentUser + "/" + "CURRENT_OPEN" + "/images/" + imageName; + + return imgURL; + } +} + + diff --git a/src/main/java/org/gcube/portlets/user/reportgenerator/client/dialog/ImporterDialog.java b/src/main/java/org/gcube/portlets/user/reportgenerator/client/dialog/ImporterDialog.java new file mode 100644 index 0000000..9152090 --- /dev/null +++ b/src/main/java/org/gcube/portlets/user/reportgenerator/client/dialog/ImporterDialog.java @@ -0,0 +1,180 @@ +package org.gcube.portlets.user.reportgenerator.client.dialog; + +import org.gcube.portlets.d4sreporting.common.shared.SerializableModel; +import org.gcube.portlets.user.reportgenerator.client.ReportConstants; +import org.gcube.portlets.user.reportgenerator.client.Presenter.Presenter; +import org.gcube.portlets.user.workspace.lighttree.client.Item; +import org.gcube.portlets.user.workspace.lighttree.client.ItemType; + +import com.google.gwt.user.client.Window; +import com.google.gwt.user.client.rpc.AsyncCallback; +import com.google.gwt.user.client.ui.Button; +import com.google.gwt.user.client.ui.CheckBox; +import com.google.gwt.user.client.ui.ClickListener; +import com.google.gwt.user.client.ui.DialogBox; +import com.google.gwt.user.client.ui.Grid; +import com.google.gwt.user.client.ui.HTML; +import com.google.gwt.user.client.ui.HasHorizontalAlignment; +import com.google.gwt.user.client.ui.HorizontalPanel; +import com.google.gwt.user.client.ui.Image; +import com.google.gwt.user.client.ui.ListBox; +import com.google.gwt.user.client.ui.VerticalPanel; +import com.google.gwt.user.client.ui.Widget; + +/** + * ImporterDialog class is is the Dialog for importing template or report sections + * + * @author Massimiliano Assante, ISTI-CNR - massimiliano.assante@isti.cnr.it + * @version October 2009 (1.4) + */ +public class ImporterDialog extends DialogBox { + + /** + * this layout panel + */ + private VerticalPanel dialogPanel = new VerticalPanel(); + Image loading = new Image(ReportConstants.LOADING_BAR); + + VerticalPanel toReplace = new VerticalPanel(); + SerializableModel toimportFrom = null; + ListBox listbox = new ListBox(); + + ListBox listboxCurr = new ListBox(); + CheckBox lastSection = new CheckBox(); + + Presenter presenter; + + /** + * + * @param item the item to import + * @param presenter the c + */ + public ImporterDialog(Item item, final Presenter presenter) { + this.presenter = presenter; + + dialogPanel.setSpacing(4); + setText("Import from Template or Report"); + toReplace.setWidth("100%"); + + HTML templateNameLabel = new HTML("Importing Template, please hold ..."); + toReplace.add(templateNameLabel); + toReplace.add(loading); + + + HorizontalPanel buttonsPanel = new HorizontalPanel(); + HorizontalPanel buttonsContainer = new HorizontalPanel(); + + // Add a cancel button at the bottom of the dialog + Button cancelButton = new Button("Close",new ClickListener() { + public void onClick(Widget sender) { hide(); } + }); + + Button applyButton = new Button("Import",new ClickListener() { + public void onClick(Widget sender) { + boolean result = false; + if (lastSection.isChecked()) + result = Window.confirm("You are about to import section " + (listbox.getSelectedIndex()+1) + " as last section in the current document"); + else + result = Window.confirm("You are about to import section " + (listbox.getSelectedIndex()+1) + " before section " + (listboxCurr.getSelectedIndex()+1) + " of the current document"); + + if (result) + presenter.importSection(toimportFrom, listbox.getSelectedIndex()+1, listboxCurr.getSelectedIndex()+1, lastSection.isChecked()); + hide(); + } + }); + + buttonsPanel.setWidth("100%"); + buttonsPanel.setHorizontalAlignment(HasHorizontalAlignment.ALIGN_RIGHT); + buttonsContainer.setSpacing(10); + buttonsContainer.add(applyButton); + buttonsContainer.add(cancelButton); + buttonsPanel.add(buttonsContainer); + + dialogPanel.add(toReplace); + + + dialogPanel.add(buttonsPanel); + dialogPanel.setPixelSize(350, 275); + setWidget(dialogPanel); + + + AsyncCallback callback = new AsyncCallback() { + + public void onFailure(Throwable caught) { + Window.alert("Could not Import template, please try again later: " + caught.getMessage()); + } + public void onSuccess(SerializableModel toLoad) { + importFinished(toLoad); + } + }; + + //then is not deployed mode + if (item == null) { + presenter.getModel().getModelService().readModel("", "", true, true, callback); + } + else { + boolean isTemplate = (item.getType() == ItemType.REPORT_TEMPLATE) ? true : false; + //will asyncrously return a SerializableModel instance read from disk + presenter.getModel().getModelService().readModel(item.getName(), item.getId(), isTemplate, true, callback); + } + } + + + private void importFinished(SerializableModel toLoad) { + HTML label = new HTML("Importing Complete..."); + + Grid grid = new Grid(4, 2); + grid.setWidget(0, 0, new HTML("Name: ")); + grid.setWidget(0, 1, new HTML(toLoad.getTemplateName())); + grid.setWidget(1, 0, new HTML("Author: ")); + grid.setWidget(1, 1, new HTML(toLoad.getAuthor())); + grid.setWidget(2, 0, new HTML("Last Edit: ")); + grid.setWidget(2, 1, new HTML(""+toLoad.getLastEdit())); + grid.setWidget(3, 0, new HTML("Total Sections: ")); + grid.setWidget(3, 1, new HTML(""+toLoad.getTotalPages())); + + toReplace.clear(); + toReplace.add(label); + toReplace.add(grid); + toReplace.add(new HTML("
")); + + + for (int i = 1; i <= toLoad.getTotalPages(); i++) { + listbox.addItem("Section " + i, ""+(i-1)); + } + Grid grid2 = new Grid(1, 2); + grid2.setWidget(0, 0, new HTML("Choose the section to import:   ")); + grid2.setWidget(0, 1, listbox); + grid2.setCellPadding(5); + + + for (int i = 1; i <= presenter.getModel().getTotalPages(); i++) { + listboxCurr.addItem("Section " + i, ""+(i-1)); + } + + + lastSection.addClickListener(new ClickListener() { + + public void onClick(Widget sender) { + CheckBox cb = (CheckBox) sender; + listboxCurr.setEnabled(! cb.isChecked()); + } + + }); + + Grid grid3 = new Grid(2, 2); + grid3.setWidget(0, 0, new HTML("Import Section before:   ")); + grid3.setWidget(0, 1, listboxCurr); + grid3.setWidget(1, 0, new HTML("As last section:   ")); + grid3.setWidget(1, 1, lastSection); + grid3.setCellPadding(5); + + toReplace.add(grid2); + toReplace.add(new HTML("
")); + toReplace.add(grid3); + toimportFrom = toLoad; + + } +} + + diff --git a/src/main/java/org/gcube/portlets/user/reportgenerator/client/dialog/LoadingPopup.java b/src/main/java/org/gcube/portlets/user/reportgenerator/client/dialog/LoadingPopup.java new file mode 100644 index 0000000..c1a0fa2 --- /dev/null +++ b/src/main/java/org/gcube/portlets/user/reportgenerator/client/dialog/LoadingPopup.java @@ -0,0 +1,45 @@ +package org.gcube.portlets.user.reportgenerator.client.dialog; + +import com.google.gwt.core.client.GWT; +import com.google.gwt.event.dom.client.ClickEvent; +import com.google.gwt.event.dom.client.ClickHandler; +import com.google.gwt.user.client.ui.ClickListener; +import com.google.gwt.user.client.ui.DialogBox; +import com.google.gwt.user.client.ui.HTML; +import com.google.gwt.user.client.ui.Widget; + + +/** + * @author massimiliano.assante@isti.cnr.it + * + */ +public class LoadingPopup extends DialogBox implements ClickHandler { + + /** + * @param autoHide auto hide + */ + public LoadingPopup(boolean autoHide) { + super(false); + HTML msg = new HTML(setToDisplay(), true); + setWidget(msg); + } + + + /** + * @return inner html + */ + protected static String setToDisplay() { + return + "
"+ + ""+ + ""+ + "
"+ + ""+ + "
" ; + } + + public void onClick(ClickEvent event) { + hide(); + + } +} \ No newline at end of file diff --git a/src/main/java/org/gcube/portlets/user/reportgenerator/client/dialog/PagePropertiesDialog.java b/src/main/java/org/gcube/portlets/user/reportgenerator/client/dialog/PagePropertiesDialog.java new file mode 100644 index 0000000..03c448e --- /dev/null +++ b/src/main/java/org/gcube/portlets/user/reportgenerator/client/dialog/PagePropertiesDialog.java @@ -0,0 +1,110 @@ +package org.gcube.portlets.user.reportgenerator.client.dialog; + + + +import java.util.List; + +import org.gcube.portlets.d4sreporting.common.shared.Metadata; +import org.gcube.portlets.user.gcubewidgets.client.popup.GCubeDialog; +import org.gcube.portlets.user.reportgenerator.client.Presenter.Presenter; +import org.gcube.portlets.user.reportgenerator.client.model.TemplateModel; + +import com.google.gwt.event.dom.client.ClickEvent; +import com.google.gwt.event.dom.client.ClickHandler; +import com.google.gwt.user.client.ui.Button; +import com.google.gwt.user.client.ui.CellPanel; +import com.google.gwt.user.client.ui.Grid; +import com.google.gwt.user.client.ui.HTML; +import com.google.gwt.user.client.ui.HasHorizontalAlignment; +import com.google.gwt.user.client.ui.HorizontalPanel; +import com.google.gwt.user.client.ui.TextBox; +import com.google.gwt.user.client.ui.VerticalPanel; + +/** + * OpenTemplateDialog class is is the Dialog for showing template properties + * + * @author Massimiliano Assante, ISTI-CNR - massimiliano.assante@isti.cnr.it + * @version October 2008 (0.2) + */ +public class PagePropertiesDialog extends GCubeDialog { + + /** + * this layout panel + */ + private VerticalPanel dialogPanel = new VerticalPanel(); + + private TextBox templateNameLabelBox = new TextBox(); + + + /** + * + * @param templateModel . + * @param presenter . + */ + public PagePropertiesDialog(final TemplateModel templateModel, final Presenter presenter) { + setText("Report Properties"); + dialogPanel.setSpacing(4); + + HTML spacer = new HTML("
"); + spacer.setHeight("30"); + + /* + * template name part + */ + HTML templateNameLabel = new HTML("Template Name: "); + + + templateNameLabelBox.setText(templateModel.getTemplateName()); + templateNameLabelBox.setReadOnly(true); + + templateNameLabelBox.setWidth("200"); + CellPanel templateNamaPanel = new HorizontalPanel(); + templateNamaPanel.add(templateNameLabel); + templateNamaPanel.add(templateNameLabelBox); + templateNamaPanel.setCellWidth(templateNameLabel, "120"); + + + + dialogPanel.add(templateNamaPanel); + + dialogPanel.add(new HTML("
")); + + List metadatas = presenter.getModel().getMetadata(); + int nRows = metadatas.size(); + Grid metadataGrid = new Grid(nRows, 2); + int i = 0; + for (Metadata md : metadatas) { + metadataGrid.setWidget(i, 0, new HTML("" + md.getAttribute() + ": ")); + metadataGrid.setWidget(i, 1, new HTML(md.getValue())); + i++; + } + + dialogPanel.add(templateNamaPanel); + + dialogPanel.add(new HTML("
")); + + dialogPanel.add(metadataGrid); + + HorizontalPanel buttonsPanel = new HorizontalPanel(); + HorizontalPanel buttonsContainer = new HorizontalPanel(); + + // Add a cancel button at the bottom of the dialog + Button cancelButton = new Button("Close",new ClickHandler() { + public void onClick(ClickEvent event) { + hide(); + } + }); + + buttonsPanel.setWidth("100%"); + buttonsPanel.setHorizontalAlignment(HasHorizontalAlignment.ALIGN_RIGHT); + buttonsContainer.setSpacing(10); + buttonsContainer.add(cancelButton); + buttonsPanel.add(buttonsContainer); + + + dialogPanel.add(buttonsPanel); + dialogPanel.setPixelSize(350, 275); + setWidget(dialogPanel); + + } +} diff --git a/src/main/java/org/gcube/portlets/user/reportgenerator/client/dialog/TSHeader.java b/src/main/java/org/gcube/portlets/user/reportgenerator/client/dialog/TSHeader.java new file mode 100644 index 0000000..d2d9661 --- /dev/null +++ b/src/main/java/org/gcube/portlets/user/reportgenerator/client/dialog/TSHeader.java @@ -0,0 +1,112 @@ +package org.gcube.portlets.user.reportgenerator.client.dialog; + +import com.google.gwt.user.client.ui.CheckBox; +import com.google.gwt.user.client.ui.ClickListener; +import com.google.gwt.user.client.ui.FlexTable; +import com.google.gwt.user.client.ui.HTML; +import com.google.gwt.user.client.ui.HorizontalPanel; +import com.google.gwt.user.client.ui.Widget; + + +/** + * + * @author massi + * + */ +public class TSHeader extends HorizontalPanel { + + private CheckBox myCB; + private HTML myHeader; + private int myColNo; + private FlexTable myTable; + TimeSeriesFilter caller; + TSHeader myinstance; + + /** + * @param tsf - + * @param myTable . + * @param cb . + * @param myColNo . + * @param myHeader . + */ + public TSHeader(TimeSeriesFilter tsf, FlexTable myTable, CheckBox cb, int myColNo, HTML myHeader) { + super(); + myinstance = this; + caller = tsf; + this.myTable = myTable; + this.myCB = cb; + + this.myColNo = myColNo; + this.myHeader = myHeader; + setVerticalAlignment(ALIGN_MIDDLE); + myHeader.setStyleName("timeSeries_header_font"); + add(myHeader); + add(myCB); + + myCB.addClickListener(cbListener); + } + + private void removeEmptyHeaders( FlexTable myTable) { + + for (int i = 0; i < myTable.getCellCount(0); i++) { + if (myTable.getWidget(0, i) == null) { + myTable.removeCell(0, i); + myTable.removeCell(1, i); + } + } + + } + + ClickListener cbListener = new ClickListener() { + public void onClick(Widget sender) { + caller.removeHeader(myinstance); + myTable.remove(sender.getParent()); + removeEmptyHeaders(myTable); + } + }; + /** + * + * @return . + */ + public CheckBox getMyCB() { + return myCB; + } + /** + * + * @param myCB . + */ + public void setMyCB(CheckBox myCB) { + this.myCB = myCB; + } + /** + * + * @return . + * */ + public HTML getMyHeader() { + return myHeader; + } + /** + * + * @param myHeader . + */ + public void setMyHeader(HTML myHeader) { + this.myHeader = myHeader; + } + /** + * + * @return . + */ + public int getMyColNo() { + return myColNo; + } + + /** + * + * @param myColNo . + */ + public void setMyColNo(int myColNo) { + this.myColNo = myColNo; + } + + +} diff --git a/src/main/java/org/gcube/portlets/user/reportgenerator/client/dialog/TimeSeriesDialog.java b/src/main/java/org/gcube/portlets/user/reportgenerator/client/dialog/TimeSeriesDialog.java new file mode 100644 index 0000000..03e4133 --- /dev/null +++ b/src/main/java/org/gcube/portlets/user/reportgenerator/client/dialog/TimeSeriesDialog.java @@ -0,0 +1,81 @@ +package org.gcube.portlets.user.reportgenerator.client.dialog; + +import org.gcube.portlets.d4sreporting.common.shared.SerializableTSinfo; + +import com.google.gwt.user.client.ui.Button; +import com.google.gwt.user.client.ui.ClickListener; +import com.google.gwt.user.client.ui.DialogBox; +import com.google.gwt.user.client.ui.Grid; +import com.google.gwt.user.client.ui.HTML; +import com.google.gwt.user.client.ui.ScrollPanel; +import com.google.gwt.user.client.ui.VerticalPanel; +import com.google.gwt.user.client.ui.Widget; + +/** + * + * @author massi + * + */ +public class TimeSeriesDialog extends DialogBox { + + /** + * + * @param droppedTS . + */ + public TimeSeriesDialog(SerializableTSinfo droppedTS) { + setText(droppedTS.getTitle() + " Details"); + String name = droppedTS.getTitle(); + String description = droppedTS.getTimeSeriesDescription(); + String creator = droppedTS.getCreator(); + String date = droppedTS.getTimeSeriesCreationDate(); + long rowsNo = droppedTS.getDimension(); + String publisher = droppedTS.getPublisher(); + String rights = droppedTS.getRights(); + + Grid metadata = new Grid(7, 2); + metadata.setWidget(0, 0, new HTML("Name:", true)); + metadata.setWidget(0, 1, new HTML(name)); + metadata.setWidget(1, 0, new HTML("Creation Date: ", true)); + metadata.setWidget(1, 1, new HTML(date)); + metadata.setWidget(2, 0, new HTML("Total rows number: ", true)); + metadata.setWidget(2, 1, new HTML(""+rowsNo)); + metadata.setWidget(3, 0, new HTML("Description:", true)); + metadata.setWidget(3, 1, new HTML(description)); + metadata.setWidget(4, 0, new HTML("Creator: ", true)); + metadata.setWidget(4, 1, new HTML(creator)); + metadata.setWidget(5, 0, new HTML("publisher: ", true)); + metadata.setWidget(5, 1, new HTML(""+publisher)); + metadata.setWidget(5, 0, new HTML("rights: ", true)); + metadata.setWidget(5, 1, new HTML(""+rights)); + + ScrollPanel scroller = new ScrollPanel(); + VerticalPanel main_panel = null; + main_panel = new VerticalPanel(); + main_panel.addStyleName("bgBlank p8 font_family font_12"); + + scroller.add(metadata); + + // PopupPanel is a SimplePanel, so you have to set it's widget property to + // whatever you want its contents to be. + Button close = new Button("Close"); + close.addClickListener(new ClickListener() { + public void onClick(Widget arg0) { + hide(); + } + }); + main_panel.add(scroller); + main_panel.add(new HTML("
")); + main_panel.add(close); + scroller.setPixelSize(350, 200); + main_panel.setPixelSize(350, 200); + setWidget(main_panel); + } + + /** + * + */ + public void show() { + super.show(); + center(); + } +} diff --git a/src/main/java/org/gcube/portlets/user/reportgenerator/client/dialog/TimeSeriesFilter.java b/src/main/java/org/gcube/portlets/user/reportgenerator/client/dialog/TimeSeriesFilter.java new file mode 100644 index 0000000..b77c444 --- /dev/null +++ b/src/main/java/org/gcube/portlets/user/reportgenerator/client/dialog/TimeSeriesFilter.java @@ -0,0 +1,217 @@ +package org.gcube.portlets.user.reportgenerator.client.dialog; + +import java.util.LinkedList; +import java.util.List; + +import org.gcube.portlets.d4sreporting.common.client.CommonConstants; +import org.gcube.portlets.d4sreporting.common.shared.SerializableTSFilter; +import org.gcube.portlets.d4sreporting.common.shared.SerializableTSinfo; +import org.gcube.portlets.d4sreporting.common.shared.SerializableTimeSeries; +import org.gcube.portlets.user.reportgenerator.client.targets.TSArea; + +import com.google.gwt.user.client.Window; +import com.google.gwt.user.client.ui.Button; +import com.google.gwt.user.client.ui.ChangeListener; +import com.google.gwt.user.client.ui.CheckBox; +import com.google.gwt.user.client.ui.ClickListener; +import com.google.gwt.user.client.ui.DialogBox; +import com.google.gwt.user.client.ui.FlexTable; +import com.google.gwt.user.client.ui.Grid; +import com.google.gwt.user.client.ui.HTML; +import com.google.gwt.user.client.ui.HorizontalPanel; +import com.google.gwt.user.client.ui.ScrollPanel; +import com.google.gwt.user.client.ui.TextBox; +import com.google.gwt.user.client.ui.VerticalPanel; +import com.google.gwt.user.client.ui.Widget; + +/** + * + * @author massi + * + */ +public class TimeSeriesFilter extends DialogBox { + ScrollPanel scroller = new ScrollPanel(); + TextBox from = new TextBox(); + TextBox to = new TextBox(); + FlexTable flexTable = new FlexTable(); + + List compoundHeaders = new LinkedList(); + /** + * + * @param sts a ts + * @param caller . + */ + public TimeSeriesFilter(final TSArea caller, final SerializableTimeSeries sts) { + + final SerializableTSinfo droppedTS = sts.getTsMetadata(); + + setText(droppedTS.getTitle() + " Filter"); + String name = droppedTS.getTitle(); + long rowsNo = droppedTS.getDimension(); + + + Grid metadata = new Grid(2, 2); + metadata.setWidget(0, 0, new HTML("Name:", true)); + metadata.setWidget(0, 1, new HTML(name)); + metadata.setWidget(1, 0, new HTML("Total rows : ", true)); + metadata.setWidget(1, 1, new HTML(""+rowsNo)); + + + final VerticalPanel main_panel = new VerticalPanel(); + main_panel.addStyleName("bgBlank p8 font_family font_12"); + + main_panel.add(metadata); + + List headersString = droppedTS.getHeaderLabels(); + + /** + */ + for (int i = 0; i < headersString.size(); i++) { + CheckBox toAdd = new CheckBox(); + toAdd.setChecked(true); + compoundHeaders.add(new TSHeader(this, flexTable, toAdd, i, new HTML(headersString.get(i) ))); + } + + + main_panel.add(new HTML("Selected fields: (click to remove)")); + + flexTable = getTableHeader(compoundHeaders); + main_panel.add(flexTable); + + main_panel.add(new HTML("Select rows interval:")); + + from.setText("1"); + to.setText("10"); + to.setMaxLength(6); + from.setMaxLength(6); + from.addChangeListener(textBoxListener); + to.addChangeListener(textBoxListener); + + + Grid rowsInterval = new Grid(1, 4); + rowsInterval.setWidget(0, 0, new HTML("From row:")); + rowsInterval.setWidget(0, 1, from); + rowsInterval.setWidget(0, 2, new HTML("  To row:")); + rowsInterval.setWidget(0, 3, to); + + main_panel.add(rowsInterval); + + main_panel.add(new HTML("
")); + HorizontalPanel buttonspanel = new HorizontalPanel(); + buttonspanel.setHeight("50"); + buttonspanel.setSpacing(3); + + + + + // PopupPanel is a SimplePanel, so you have to set it's widget property to + // whatever you want its contents to be. + Button close = new Button("Close"); + close.addClickListener(new ClickListener() { + public void onClick(Widget arg0) { + hide(); + } + }); + + Button apply = new Button("Apply"); + apply.addClickListener(new ClickListener() { + public void onClick(Widget arg0) { + List selectedCols = compoundHeaders; + + List colsToShow = new LinkedList(); + + for (TSHeader head : selectedCols) { + colsToShow.add(new Integer(head.getMyColNo())); + } + int fromInt = Integer.parseInt(from.getText()); + int toInt = Integer.parseInt(to.getText()); + + SerializableTSFilter toSet = new SerializableTSFilter(colsToShow, null, null, fromInt, toInt); + caller.setNewFilter(toSet); + caller.refreshHeaders(); + hide(); + } + }); + +// Button reset = new Button("Reset"); +// close.addClickListener(new ClickListener() { +// public void onClick(Widget arg0) { +// hide(); +// show(); +// } +// }); + + //buttonspanel.add(reset); + buttonspanel.add(close); + buttonspanel.add(apply); + main_panel.add(buttonspanel); + + scroller.setPixelSize(550, 280); + main_panel.setPixelSize(550, 260); + + scroller.add(main_panel); + setWidget(scroller); + } + + + /** + * + * @param toRemove . + * @return . + */ + public boolean removeHeader(TSHeader toRemove) { + return compoundHeaders.remove(toRemove); + } + + + /** + * display the header of the ts + * @param droppedTS + * @return + */ + private FlexTable getTableHeader(List headers) { + flexTable.clear(); + int n = headers.size(); + + for (int i = 0; i < n ; i++) { + flexTable.getCellFormatter().setStyleName(0, i, "timeSeries_header"); + flexTable.setWidget(0, i, headers.get(i)); + flexTable.getCellFormatter().setStyleName(1, i, "timeSeries_td"); + flexTable.setWidget(1, i, new HTML("...")); + } + + return flexTable; + } + + ChangeListener textBoxListener = new ChangeListener() { + + public void onChange(Widget sender) { + TextBox tb = (TextBox) sender; + String text = tb.getText(); + String checkedText = text; + text = text.replaceAll(CommonConstants.ACCEPTED_CHARS_JUST_NUM, ""); + if (! text.equals(checkedText) ) { + Window.alert("Only numbers are accepted"); + tb.setText(text); + } + int start = Integer.parseInt(from.getText()); + int end = Integer.parseInt(to.getText()); + + if (start >= end) { + Window.alert("From must be greater than to"); + to.setText(""+(start+10)); + } + + } + + + }; + /** + * + */ + public void show() { + super.show(); + center(); + } + +} diff --git a/src/main/java/org/gcube/portlets/user/reportgenerator/client/dialog/TimeSeriesSampleDialog.java b/src/main/java/org/gcube/portlets/user/reportgenerator/client/dialog/TimeSeriesSampleDialog.java new file mode 100644 index 0000000..dd61af7 --- /dev/null +++ b/src/main/java/org/gcube/portlets/user/reportgenerator/client/dialog/TimeSeriesSampleDialog.java @@ -0,0 +1,75 @@ +package org.gcube.portlets.user.reportgenerator.client.dialog; + +import org.gcube.portlets.d4sreporting.common.shared.SerializableTable; + +import com.google.gwt.event.dom.client.ClickEvent; +import com.google.gwt.event.dom.client.ClickHandler; +import com.google.gwt.user.client.ui.Button; +import com.google.gwt.user.client.ui.ClickListener; +import com.google.gwt.user.client.ui.DialogBox; +import com.google.gwt.user.client.ui.FlexTable; +import com.google.gwt.user.client.ui.HTML; +import com.google.gwt.user.client.ui.ScrollPanel; +import com.google.gwt.user.client.ui.VerticalPanel; +import com.google.gwt.user.client.ui.Widget; + +/** + * + * @author massi + * + */ +public class TimeSeriesSampleDialog extends DialogBox { + /** + * + * @param table . + */ + public TimeSeriesSampleDialog(SerializableTable table) { + super(true); + setText("TS Sample"); + FlexTable flexTable = new FlexTable(); + + VerticalPanel main_panel = null; + main_panel = new VerticalPanel(); + main_panel.addStyleName("bgBlank p8 font_family font_12"); + + for (int i = 0; i < table.getRowCount(); i++) { + for (int j= 0; j < table.getColsNo(); j++){ + if (i == 0) { + flexTable.getCellFormatter().setStyleName(i, j, "timeSeries_header"); + flexTable.setWidget(i, j, new HTML(table.getValue(i, j).getContent())); + } + else { + flexTable.getCellFormatter().setStyleName(i, j, "timeSeries_td"); + flexTable.setWidget(i, j, new HTML(table.getValue(i, j).getContent())); + } + } + } + + main_panel.add(flexTable); + + // PopupPanel is a SimplePanel, so you have to set it's widget property to + // whatever you want its contents to be. + Button close = new Button("Close"); + close.addClickHandler(new ClickHandler() { + public void onClick(ClickEvent event) { + hide(); + } + }); + + main_panel.add(new HTML("
")); + main_panel.add(close); + ScrollPanel scroller = new ScrollPanel(); + main_panel.setPixelSize(550, 340); + scroller.setPixelSize(550, 360); + scroller.add(main_panel); + setWidget(scroller); + } + + /** + * + */ + public void show() { + super.show(); + center(); + } +} diff --git a/src/main/java/org/gcube/portlets/user/reportgenerator/client/events/AddBiblioEvent.java b/src/main/java/org/gcube/portlets/user/reportgenerator/client/events/AddBiblioEvent.java new file mode 100644 index 0000000..a583ecb --- /dev/null +++ b/src/main/java/org/gcube/portlets/user/reportgenerator/client/events/AddBiblioEvent.java @@ -0,0 +1,32 @@ +package org.gcube.portlets.user.reportgenerator.client.events; + +import com.google.gwt.event.shared.GwtEvent; + +public class AddBiblioEvent extends GwtEvent{ + public static Type TYPE = new Type(); + private final String citekey; + private final String citetext; + + public AddBiblioEvent(String key, String text) { + citekey = key; + citetext = text; + } + + public String getCitekey() { + return citekey; + } + + public String getCitetext() { + return citetext; + } + + @Override + public Type getAssociatedType() { + return TYPE; + } + + @Override + protected void dispatch(AddBiblioEventHandler handler) { + handler.onAddCitation(this); + } +} diff --git a/src/main/java/org/gcube/portlets/user/reportgenerator/client/events/AddBiblioEventHandler.java b/src/main/java/org/gcube/portlets/user/reportgenerator/client/events/AddBiblioEventHandler.java new file mode 100644 index 0000000..4eeedf9 --- /dev/null +++ b/src/main/java/org/gcube/portlets/user/reportgenerator/client/events/AddBiblioEventHandler.java @@ -0,0 +1,7 @@ +package org.gcube.portlets.user.reportgenerator.client.events; + +import com.google.gwt.event.shared.EventHandler; + +public interface AddBiblioEventHandler extends EventHandler { + void onAddCitation(AddBiblioEvent event); +} diff --git a/src/main/java/org/gcube/portlets/user/reportgenerator/client/events/AddCommentEvent.java b/src/main/java/org/gcube/portlets/user/reportgenerator/client/events/AddCommentEvent.java new file mode 100644 index 0000000..4bd9faf --- /dev/null +++ b/src/main/java/org/gcube/portlets/user/reportgenerator/client/events/AddCommentEvent.java @@ -0,0 +1,43 @@ +package org.gcube.portlets.user.reportgenerator.client.events; + +import org.gcube.portlets.user.reportgenerator.client.targets.ReportTextArea; + +import com.google.gwt.event.shared.GwtEvent; + +public class AddCommentEvent extends GwtEvent{ + public static Type TYPE = new Type(); + private final ReportTextArea source; + private final String comment; + private final int areaHeight; + + + + public AddCommentEvent(ReportTextArea sourceComponent, String comment, int areaHeight) { + super(); + this.source = sourceComponent; + this.comment = comment; + this.areaHeight = areaHeight; + } + + public int getAreaHeight() { + return areaHeight; + } + + public ReportTextArea getSourceComponent() { + return source; + } + + public String getComment() { + return comment; + } + + @Override + public Type getAssociatedType() { + return TYPE; + } + + @Override + protected void dispatch(AddCommentEventHandler handler) { + handler.onAddComment(this); + } +} diff --git a/src/main/java/org/gcube/portlets/user/reportgenerator/client/events/AddCommentEventHandler.java b/src/main/java/org/gcube/portlets/user/reportgenerator/client/events/AddCommentEventHandler.java new file mode 100644 index 0000000..b2d1d08 --- /dev/null +++ b/src/main/java/org/gcube/portlets/user/reportgenerator/client/events/AddCommentEventHandler.java @@ -0,0 +1,7 @@ +package org.gcube.portlets.user.reportgenerator.client.events; + +import com.google.gwt.event.shared.EventHandler; + +public interface AddCommentEventHandler extends EventHandler { + void onAddComment(AddCommentEvent event); +} diff --git a/src/main/java/org/gcube/portlets/user/reportgenerator/client/events/ItemSelectionEvent.java b/src/main/java/org/gcube/portlets/user/reportgenerator/client/events/ItemSelectionEvent.java new file mode 100644 index 0000000..67ecc70 --- /dev/null +++ b/src/main/java/org/gcube/portlets/user/reportgenerator/client/events/ItemSelectionEvent.java @@ -0,0 +1,34 @@ +package org.gcube.portlets.user.reportgenerator.client.events; + +import java.util.HashMap; + +import com.google.gwt.event.shared.GwtEvent; + + +public class ItemSelectionEvent extends GwtEvent{ + + private HashMap map; + + public static Type TYPE = new Type(); + public ItemSelectionEvent(HashMap map) { + this.map = map; + } + + public HashMap getItemSelected() { + return this.map; + } + + @Override + protected void dispatch(ItemSelectionEventHandler handler) { + // TODO Auto-generated method stub + handler.onItemSelected(this); + } + + @Override + public Type getAssociatedType() { + // TODO Auto-generated method stub + return TYPE; + } + + +} diff --git a/src/main/java/org/gcube/portlets/user/reportgenerator/client/events/ItemSelectionEventHandler.java b/src/main/java/org/gcube/portlets/user/reportgenerator/client/events/ItemSelectionEventHandler.java new file mode 100644 index 0000000..eff99bf --- /dev/null +++ b/src/main/java/org/gcube/portlets/user/reportgenerator/client/events/ItemSelectionEventHandler.java @@ -0,0 +1,8 @@ +package org.gcube.portlets.user.reportgenerator.client.events; + +import com.google.gwt.event.shared.EventHandler; + +public interface ItemSelectionEventHandler extends EventHandler { + + void onItemSelected(ItemSelectionEvent event); +} diff --git a/src/main/java/org/gcube/portlets/user/reportgenerator/client/events/RemovedCitationEvent.java b/src/main/java/org/gcube/portlets/user/reportgenerator/client/events/RemovedCitationEvent.java new file mode 100644 index 0000000..07f2a95 --- /dev/null +++ b/src/main/java/org/gcube/portlets/user/reportgenerator/client/events/RemovedCitationEvent.java @@ -0,0 +1,26 @@ +package org.gcube.portlets.user.reportgenerator.client.events; + +import com.google.gwt.event.shared.GwtEvent; + +public class RemovedCitationEvent extends GwtEvent{ + public static Type TYPE = new Type(); + private final String citekey; + + public RemovedCitationEvent(String citekey) { + this.citekey = citekey; + } + + public String getCitekey() { + return citekey; + } + + @Override + public Type getAssociatedType() { + return TYPE; + } + + @Override + protected void dispatch(RemovedCitationEventHandler handler) { + handler.onRemovedCitation(this); + } +} diff --git a/src/main/java/org/gcube/portlets/user/reportgenerator/client/events/RemovedCitationEventHandler.java b/src/main/java/org/gcube/portlets/user/reportgenerator/client/events/RemovedCitationEventHandler.java new file mode 100644 index 0000000..304ce9a --- /dev/null +++ b/src/main/java/org/gcube/portlets/user/reportgenerator/client/events/RemovedCitationEventHandler.java @@ -0,0 +1,7 @@ +package org.gcube.portlets.user.reportgenerator.client.events; + +import com.google.gwt.event.shared.EventHandler; + +public interface RemovedCitationEventHandler extends EventHandler { + void onRemovedCitation(RemovedCitationEvent event); +} diff --git a/src/main/java/org/gcube/portlets/user/reportgenerator/client/events/RemovedUserCommentEvent.java b/src/main/java/org/gcube/portlets/user/reportgenerator/client/events/RemovedUserCommentEvent.java new file mode 100644 index 0000000..7c7bb34 --- /dev/null +++ b/src/main/java/org/gcube/portlets/user/reportgenerator/client/events/RemovedUserCommentEvent.java @@ -0,0 +1,30 @@ +package org.gcube.portlets.user.reportgenerator.client.events; + +import org.gcube.portlets.user.reportgenerator.client.targets.ReportTextArea; + +import com.google.gwt.event.shared.GwtEvent; + +public class RemovedUserCommentEvent extends GwtEvent{ + public static Type TYPE = new Type(); + private final ReportTextArea source; + + + public RemovedUserCommentEvent(ReportTextArea source) { + super(); + this.source = source; + } + + public ReportTextArea getSourceComponent() { + return source; + } + + @Override + public Type getAssociatedType() { + return TYPE; + } + + @Override + protected void dispatch(RemovedUserCommentEventHandler handler) { + handler.onRemovedComment(this); + } +} diff --git a/src/main/java/org/gcube/portlets/user/reportgenerator/client/events/RemovedUserCommentEventHandler.java b/src/main/java/org/gcube/portlets/user/reportgenerator/client/events/RemovedUserCommentEventHandler.java new file mode 100644 index 0000000..8da9c57 --- /dev/null +++ b/src/main/java/org/gcube/portlets/user/reportgenerator/client/events/RemovedUserCommentEventHandler.java @@ -0,0 +1,7 @@ +package org.gcube.portlets.user.reportgenerator.client.events; + +import com.google.gwt.event.shared.EventHandler; + +public interface RemovedUserCommentEventHandler extends EventHandler { + void onRemovedComment(RemovedUserCommentEvent event); +} diff --git a/src/main/java/org/gcube/portlets/user/reportgenerator/client/model/ExportManifestationType.java b/src/main/java/org/gcube/portlets/user/reportgenerator/client/model/ExportManifestationType.java new file mode 100644 index 0000000..cfbdda3 --- /dev/null +++ b/src/main/java/org/gcube/portlets/user/reportgenerator/client/model/ExportManifestationType.java @@ -0,0 +1,31 @@ +package org.gcube.portlets.user.reportgenerator.client.model; + + +/** + * + * @author massi + * + */ +public enum ExportManifestationType { + /** + * DOCX + */ + DOCX, + /** + * PDF + */ + PDF, + /** + * XML + */ + XML, + /** + * HTML + */ + HTML, + /** + * FiMES FAO Schema + */ + FIMES; + +} diff --git a/src/main/java/org/gcube/portlets/user/reportgenerator/client/model/TemplateComponent.java b/src/main/java/org/gcube/portlets/user/reportgenerator/client/model/TemplateComponent.java new file mode 100644 index 0000000..5ffb28c --- /dev/null +++ b/src/main/java/org/gcube/portlets/user/reportgenerator/client/model/TemplateComponent.java @@ -0,0 +1,534 @@ +package org.gcube.portlets.user.reportgenerator.client.model; + +import java.io.Serializable; +import java.util.ArrayList; +import java.util.LinkedList; +import java.util.List; + +import org.gcube.portlets.d4sreporting.common.client.ComponentType; +import org.gcube.portlets.d4sreporting.common.shared.Metadata; +import org.gcube.portlets.d4sreporting.common.shared.SerializableAttribute; +import org.gcube.portlets.d4sreporting.common.shared.SerializableAttributeArea; +import org.gcube.portlets.d4sreporting.common.shared.SerializableComponent; +import org.gcube.portlets.d4sreporting.common.shared.SerializableTable; +import org.gcube.portlets.d4sreporting.common.shared.SerializableTimeSeries; +import org.gcube.portlets.user.reportgenerator.client.Presenter.Presenter; +import org.gcube.portlets.user.reportgenerator.client.targets.AttributeArea; +import org.gcube.portlets.user.reportgenerator.client.targets.BasicTextArea; +import org.gcube.portlets.user.reportgenerator.client.targets.D4sRichTextarea; +import org.gcube.portlets.user.reportgenerator.client.targets.DropImageListener; +import org.gcube.portlets.user.reportgenerator.client.targets.DropTSListener; +import org.gcube.portlets.user.reportgenerator.client.targets.DroppingArea; +import org.gcube.portlets.user.reportgenerator.client.targets.GenericTable; +import org.gcube.portlets.user.reportgenerator.client.targets.ImageArea; +import org.gcube.portlets.user.reportgenerator.client.targets.ReportTextArea; +import org.gcube.portlets.user.reportgenerator.client.targets.TSArea; + +import com.google.gwt.core.client.GWT; +import com.google.gwt.dom.client.Style.Unit; +import com.google.gwt.user.client.ui.CheckBox; +import com.google.gwt.user.client.ui.HTML; +import com.google.gwt.user.client.ui.Image; +import com.google.gwt.user.client.ui.Widget; + + + +/** + * + * This class represent all the possible template components IN THE MODEL + * @author Massimiliano Assante, ISTI-CNR - massimiliano.assante@isti.cnr.it + * @version July 2011 (3.0) + */ +public class TemplateComponent { + + /** + * + */ + public final static String DEFAULT_IMAGE_PATH= GWT.getModuleBaseURL() + "../images/organization_logo.jpg"; + + private int x; + private int y; + private int width; + private int height; + private TemplateModel myModel; + private int templatePage; + private String idInBasket = null; + + + private ComponentType type; + + private boolean locked; + + private boolean doubleColLayout; + + /** + * holds the metadata(s) for the sections + */ + private List metadata; + /** + * the paramName for assigning it a value when exporting to pdf, valid only for Dynamic Content + */ + private String paramName; + + //what is in the template component may vary depending on its type + private Widget content; + + + /** + * Creates a empty TemplateComponent + */ + public TemplateComponent() { + super(); + } + + + + /** + * Creates a TemplateComponent with the given charactheristics in double column + * + * @param myModel . + * @param x . + * @param y . + * @param width . + * @param height . + * @param templatePage . + * @param content the inserted widget + * @param type the type of the inserted widget + * @param paramName for assigning it a value when exporting to pdf, valid only for Dynamic Content + * @param doubleColLayout to specify that its layout is double columned + */ + public TemplateComponent(TemplateModel myModel, int x, int y, int width, int height, int templatePage, ComponentType type, String paramName, Widget content, boolean doubleColLayout) { + this.myModel = myModel; + this.x = x; + this.y = y; + this.width = width; + this.height = height; + this.templatePage = templatePage; + this.content = content; + this.type = type; + this.paramName = paramName; + this.doubleColLayout = doubleColLayout; + this.metadata = new LinkedList(); + } + + /** + * + * Creates a TemplateComponent with the given charactheristics and single column + * + * @param myModel . + * @param x . + * @param y . + * @param width . + * @param height . + * @param templatePage . + * @param content the inserted widget + * @param type the type of the inserted widget + * @param paramName for assigning it a value when exporting to pdf, valid only for Dynamic Content + */ + public TemplateComponent(TemplateModel myModel, int x, int y, int width, int height, int templatePage, ComponentType type, String paramName, Widget content) { + this.myModel = myModel; + this.x = x; + this.y = y; + this.width = width; + this.height = height; + this.templatePage = templatePage; + this.content = content; + this.type = type; + this.paramName = paramName; + this.doubleColLayout = false; + this.metadata = new LinkedList(); + } + + /** + * create a template component which is displayable (create an actual Widget in the content field) + * @param myModel the model + * @param sc the serialiazble to convert + * @param presenter . + */ + public TemplateComponent(TemplateModel myModel, SerializableComponent sc, Presenter presenter) { + this.myModel = myModel; + // + //Coords start = new Coords(x, y); + int width = sc.getWidth(); + int height = sc.getHeight(); + this.x = sc.getX(); + this.y = sc.getY(); + this.width = sc.getWidth(); + this.height = sc.getHeight(); + this.templatePage = sc.getTemplatePage(); + this.type = sc.getType(); + this.paramName = sc.getParamName(); + this.doubleColLayout = sc.isDoubleColLayout(); + this.locked = sc.isLocked(); + this.metadata = sc.getMetadata(); + + switch (sc.getType()) { + case DYNA_IMAGE: + DroppingArea dp; + String possibelContent = ((String) sc.getPossibleContent()); + if (possibelContent.startsWith("http")) { + dp = new DroppingArea(presenter, width, height,possibelContent); + + dp.showImage(new Image(possibelContent)); + } + else if (possibelContent.startsWith("/")) + dp = new DroppingArea(presenter, width, height, ""); + else if (sc.getPossibleContent().equals(DEFAULT_IMAGE_PATH)) { + dp = new DroppingArea(presenter, width, height, ""); + } else { + dp = new DroppingArea(presenter, width, height, possibelContent); + } + dp.setPixelSize(width, height); + + + @SuppressWarnings("unused") + DropImageListener dropListener = new DropImageListener(dp); + + this.content = dp; + break; + case STATIC_IMAGE: + String imagePath = (String) sc.getPossibleContent(); + + ImageArea img = new ImageArea(presenter, imagePath, myModel.getTemplateName(), true, width, height); + img.setPixelSize(width, height); + this.content = img; + break; + case HEADING_1: + case HEADING_2: + case HEADING_3: + case TITLE: + if (sc.isLocked()) { + HTML area = new HTML(); + area.setStyleName(getStyle(sc.getType())); + area.getElement().getStyle().setMarginLeft(25, Unit.PX); + area.getElement().getStyle().setMarginTop(15, Unit.PX); + area.setPixelSize(width, height); + area.setText((String) sc.getPossibleContent()); + this.content = area; + } + else { + BasicTextArea bToAdd = new BasicTextArea(sc.getType(), presenter, sc.getX(), sc.getY(), width, height, getUserComments() != null); + bToAdd.setText((String) sc.getPossibleContent()); + this.content = bToAdd; + } + break; + case BODY: + if (sc.isLocked()) { + HTML area = new HTML(); + area.setStyleName("d4sFrame"); + area.addStyleName("fixedTextArea"); + area.addStyleName("hasRichTextToolbar"); + area.setPixelSize(width, height); + area.setHTML((String) sc.getPossibleContent()); + this.content = area; + } + else { + D4sRichTextarea ta = new D4sRichTextarea(sc.getType(), presenter, sc.getX(), sc.getY(),width, height, getUserComments() != null); + ta.setHTML((String) sc.getPossibleContent()); + //ta.setStyleName("cw-RichText"); + ta.setPixelSize(width, height); + this.content = ta; + } + this.setLocked(sc.isLocked()); + break; + case TOC: + ReportTextArea dp2 = new ReportTextArea(sc.getType(), presenter, sc.getX(), sc.getY(), width, height, getUserComments() != null); + dp2.addStyleName("tocArea"); + this.content = dp2; + break; + case BIBLIO: + ReportTextArea dp3 = new ReportTextArea(sc.getType(), presenter, sc.getX(), sc.getY(), width, height, getUserComments() != null); + dp3.addStyleName("biblioArea"); + this.content = dp3; + break; + case PAGEBREAK: + ReportTextArea dp4 = new ReportTextArea(sc.getType(), presenter, sc.getX(), sc.getY(), width, height, getUserComments() != null); + dp4.addStyleName("pagebreak"); + this.content = dp4; + break; + case FLEX_TABLE: + SerializableTable st = (SerializableTable) sc.getPossibleContent(); + GenericTable table = new GenericTable(st, presenter, sc.getX(), sc.getY(), TemplateModel.TEMPLATE_WIDTH - 50, 200); + this.content = table; + break; + case ATTRIBUTE: + AttributeArea ta = null; + if (sc.getPossibleContent() instanceof SerializableAttributeArea) { + SerializableAttributeArea sata = (SerializableAttributeArea) sc.getPossibleContent(); + ta = new AttributeArea(presenter, sc.getX(), sc.getY(), width, height, sata); + } + else { + ta = new AttributeArea(presenter, sc.getX(), sc.getY(), width, height, sc.getPossibleContent().toString()); + } + this.content = ta; + break; + case COMMENT: + HTML comment = new HTML(); + comment.setStyleName("commentArea"); + comment.setHTML((String) sc.getPossibleContent()); + this.content = comment; + break; + case INSTRUCTION: + HTML instr = new HTML(); + instr.setStyleName("instructionArea"); + instr.setHTML((String) sc.getPossibleContent()); + this.content = instr; + break; + case TIME_SERIES: + TSArea tsa; + SerializableTimeSeries sts = null; + try { + sts = ((SerializableTimeSeries) sc.getPossibleContent()); + } catch (ClassCastException e) { + + } + //need to reset the filter when loading a TS + sts.setFilter(null); + tsa = new TSArea(presenter, width, 155, sts); + + tsa.setPixelSize(width, 155); + + + @SuppressWarnings("unused") + DropTSListener dropTSListener = new DropTSListener(tsa); + + this.content = tsa; + break; + } + } + /** + * + * @param type + * @return + */ + private String getStyle(ComponentType type) { + switch (type) { + case TITLE: + return "titleArea"; + case HEADING_1: + return "headgin1Area"; + case HEADING_2: + return "headgin2Area"; + case HEADING_3: + return "headgin3Area"; + default: + return ""; + } + } + /** + * return a template Component which is serializable + * @return . + */ + public SerializableComponent getSerializable() { + Serializable content = ""; + String id = ""; + switch (this.getType()) { + case DYNA_IMAGE: + DroppingArea da = (DroppingArea) this.content; + content = da.getDroppedImage().getUrl(); + id = da.getIdInBasket(); + idInBasket = id; + if (((String) content).compareTo("") == 0) + content = DEFAULT_IMAGE_PATH; + break; + case STATIC_IMAGE: + ImageArea tmp = ((ImageArea) this.content); + String imageName = tmp.getImageName(); + content = tmp.getUrl(); + break; + case BODY: + if (this.isLocked()) { + content = ((HTML) this.content).getHTML(); + } + else { + content = ((D4sRichTextarea) this.content).getHTML(); + } + break; + case HEADING_1: + case HEADING_2: + case HEADING_3: + case TITLE: + if (this.isLocked()) { + content = ((HTML) this.content).getText(); + } + else + content = ((BasicTextArea) this.content).getText(); + break; + case TIME_SERIES: + GWT.log("Found Time Series", null); + TSArea tsa = (TSArea) this.content; + content = tsa.getSts(); + break; + case FLEX_TABLE: + GenericTable gt = (GenericTable) this.content; + SerializableTable st = gt.getSerializable(); + content = st; + break; + case ATTRIBUTE: + AttributeArea att = (AttributeArea) this.content; + ArrayList values = new ArrayList(); + for (CheckBox box : att.getBoxes()) { + values.add(new SerializableAttribute(box.getText().trim(), box.getValue())); + } + SerializableAttributeArea sat= new SerializableAttributeArea(att.getAttrName().trim(), values); + content = sat; + break; + case COMMENT: + content = ((HTML) this.content).getHTML(); + break; + case INSTRUCTION: + content = ((HTML) this.content).getHTML(); + break; + } + return new SerializableComponent(x, y, width, height, templatePage, type, idInBasket, "param empty", content, this.doubleColLayout, isLocked(), metadata); + } + + + + /** + * @return . + */ + public int getHeight() {return height;} + /** + * @param height . + */ + public void setHeight(int height) { this.height = height; } + /** + * @return . + */ + public ComponentType getType() {return type;} + /** + * @param type . + */ + public void setType(ComponentType type) { this.type = type;} + /** + * @return . + */ + public int getWidth() { return width;} + /** + * @param width . + */ + public void setWidth(int width) {this.width = width;} + /** + * @return . + */ + public int getX() { return x;} + /** + * @param x . + */ + public void setX(int x) {this.x = x;} + /** + * @return . + */ + public int getY() {return y;} + /** + * @param y . + */ + public void setY(int y) {this.y = y;} + /** + * @return . + */ + public int getTemplatePage() { return templatePage; } + /** + * @param templatePage . + */ + public void setTemplatePage(int templatePage) { this.templatePage = templatePage;} + /** + * @return . + */ + public Widget getContent() {return content; } + /** + * @param content . + */ + public void setContent(Widget content) { + this.content = content; + } + + /** + * + * @return . + */ + public String getParamName() { + return paramName; + } + /** + * + * @param paramName . + */ + public void setParamName(String paramName) { + this.paramName = paramName; + } + + /** + * + * @return . + */ + public boolean isLocked() { + return locked; + } + /** + * + * @param locked . + */ + public void setLocked(boolean locked) { + this.locked = locked; + } + /** + * + * @param attr . + * @param value . + */ + public void addMetadata(String attr, String value) { + if (attr != null && value != null) { + metadata.add(new Metadata(attr, value)); + } + else + throw new NullPointerException(); + } + + /** + * + * @return . + */ + public List getAllMetadata() { + if (metadata == null) { + new LinkedList(); + } + return metadata; + } + /** + * + * @return + */ + public String getUserComments() { + if (metadata == null) return null; + for (Metadata md : metadata) { + if (md.getAttribute().equals(TemplateModel.USER_COMMENT)) + return md.getValue(); + } + return null; + } + /** + * + * @return . + */ + public String getIdInBasket() { + return idInBasket; + } + /** + * + * @param idInBasket . + */ + public void setIdInBasket(String idInBasket) { + this.idInBasket = idInBasket; + } + /** + * + * @return . + */ + public boolean isDoubleColLayout() { + return doubleColLayout; + } + + +} diff --git a/src/main/java/org/gcube/portlets/user/reportgenerator/client/model/TemplateModel.java b/src/main/java/org/gcube/portlets/user/reportgenerator/client/model/TemplateModel.java new file mode 100644 index 0000000..d598c59 --- /dev/null +++ b/src/main/java/org/gcube/portlets/user/reportgenerator/client/model/TemplateModel.java @@ -0,0 +1,697 @@ +package org.gcube.portlets.user.reportgenerator.client.model; + +import java.util.Date; +import java.util.HashMap; +import java.util.LinkedList; +import java.util.List; +import java.util.Vector; +import java.util.Map.Entry; + +import org.gcube.portlets.d4sreporting.common.client.ComponentType; +import org.gcube.portlets.d4sreporting.common.shared.Metadata; +import org.gcube.portlets.d4sreporting.common.shared.SerializableComponent; +import org.gcube.portlets.d4sreporting.common.shared.SerializableModel; +import org.gcube.portlets.d4sreporting.common.shared.SerializableSection; +import org.gcube.portlets.d4sreporting.common.shared.SerializableTimeSeries; +import org.gcube.portlets.user.reportgenerator.client.ReportService; +import org.gcube.portlets.user.reportgenerator.client.ReportServiceAsync; +import org.gcube.portlets.user.reportgenerator.client.Presenter.Presenter; + +import com.extjs.gxt.ui.client.widget.MessageBox; +import com.google.gwt.core.client.GWT; +import com.google.gwt.user.client.Window; +import com.google.gwt.user.client.rpc.AsyncCallback; +import com.google.gwt.user.client.rpc.ServiceDefTarget; +import com.google.gwt.user.client.ui.HTML; +import com.google.gwt.user.client.ui.Widget; + + +/** + * The TemplateModel class represents the current Template state, the model in the the MVC pattern + * + * @author Massimiliano Assante, ISTI-CNR - massimiliano.assante@isti.cnr.it + * @version July 2011 (3.0) + */ +public class TemplateModel { + + private ReportServiceAsync modelService = (ReportServiceAsync) GWT.create(ReportService.class); + private ServiceDefTarget endpoint = (ServiceDefTarget) modelService; + /** + * default w and h + */ + + public static final int OLD_TEMPLATE_WIDTH = 950; + /** + * + */ + public static final int TEMPLATE_WIDTH = 750; + /** + * TEMPLATE_HEIGHT + */ + public static final int TEMPLATE_HEIGHT= 1000; + /** + * DEFAULT_NAME + */ + public static final String DEFAULT_NAME = "No template loaded"; + public static final String BIBLIO_SECTION = "isBibliography"; + public static final String USER_COMMENT = "isComment"; + public static final String USER_COMMENT_HEIGHT = "isCommentHeight"; + + /** + * The name of the template + */ + private String templateName; + /** + * + */ + private int pageWidth; + + /** + * + */ + private int pageHeight; + + /** + * + */ + private int currentPage; + + /** + * Total number of template pages + */ + private int totalPages; + + /** + * Template left margin + */ + private int marginLeft; + /** + * Template right margin + */ + private int marginRight; + /** + * Template top margin + */ + private int marginTop; + /** + * Template bottom margin + */ + private int marginBottom; + + /** + * columnWidth is the actual page width without margins, when columns is equal to 1 (which is always true in my case, since UI doesn't allow multi columns) + */ + private int columnWidth; + + /** + * each object of this Hahsmap its a TemplateSection containing all the TemplateComponent of a template section + * + * object: a TemplateSection of Component containing all the TemplateComponent of the section + */ + + private HashMap sections; + /** + * holds the metadata(s) for the model + */ + private List metadata; + + /** + * The name of the author + */ + private String author; + /** + * The name of the author + */ + private String lastEditBy; + /** + * The name of the author + */ + private Date dateCreated; + /** + * The name of the author + */ + private Date lastEdit; + + private Presenter presenter; + /** + * Constructs a Default Template Model + * @param presenter . + */ + + public TemplateModel(Presenter presenter) { + super(); + this.templateName = DEFAULT_NAME; + this.pageWidth = TEMPLATE_WIDTH; + this.pageHeight = TEMPLATE_HEIGHT; + this.currentPage = 1; + this.totalPages = 1; + this.marginLeft = 25; + this.marginRight = 25; + this.marginTop = 20; + this.marginBottom = 20; + this.columnWidth = pageWidth - (marginLeft + marginRight); + this.author = ""; + this.lastEdit = null; + this.lastEditBy = ""; + this.dateCreated = null; + + this.sections = new HashMap(); + this.metadata = new LinkedList(); + + this.presenter = presenter; + String moduleRelativeURL = GWT.getModuleBaseURL() + "ReportServiceImpl"; + endpoint.setServiceEntryPoint(moduleRelativeURL); + } + + /** + * @param pageNo . + * @return . + */ + public List getSectionComponent(int pageNo) { + List toReturn = new LinkedList(); + + toReturn = sections.get(""+pageNo).getAllComponents(); + + return toReturn; + } + /** + * look for the model in the current page and edits its size + * @param toResize . + * @param newWidth . + * @param newHeight . + */ + public void addCommentToComponent(Widget component, String comment2Add, int visibleHeight) { + String tcPage = ""+currentPage; + TemplateSection singleSection = sections.get(tcPage); + singleSection.addCommentToComponent(component, comment2Add, visibleHeight); + storeInSession(); + } + + public void removeComment(Widget toRemove) { + String tcPage = ""+currentPage; + TemplateSection singleSection = sections.get(tcPage); + singleSection.discardComments(toRemove); + storeInSession(); + } + /** + * + */ + public void insertBiblioSection() { + totalPages++; + + TemplateSection singleSection = new TemplateSection(); + singleSection.addMetadata(BIBLIO_SECTION, "true"); + + SerializableComponent references = new SerializableComponent(0, 0,TEMPLATE_WIDTH - 50, 35, + totalPages, ComponentType.HEADING_2, "", "REFERENCES", false, true, singleSection.getAllMetadata()); + TemplateComponent referencesTC = new TemplateComponent(this, references, presenter); + + singleSection.addComponent(referencesTC); + sections.put(""+totalPages, singleSection); + storeInSession(); + } + /** + * + * @param citeKey - + * @param citeText - + */ + public void addCitation(String citeKey, String citeText) { + String citation ="" + citeKey + ". " + citeText; + TemplateSection singleSection = getSection(totalPages); + SerializableComponent entry = new SerializableComponent(0, 0,TEMPLATE_WIDTH - 50, 35, + totalPages, ComponentType.HEADING_2, "", "Bibliographic Entry", false, true, singleSection.getAllMetadata()); + TemplateComponent entryTC = new TemplateComponent(this, entry, presenter); + singleSection.addComponent(entryTC); + SerializableComponent entryText = new SerializableComponent(0, 0,TEMPLATE_WIDTH - 50, 35, + totalPages, ComponentType.BODY, "", citation, false, false, singleSection.getAllMetadata()); + TemplateComponent entryTextTC = new TemplateComponent(this, entryText, presenter); + singleSection.addComponent(entryTextTC); + storeInSession(); + } + /** + * remove a Citation from the model + * @param citeKey . + */ + public boolean removeCitation(String citeKey) { + TemplateSection singleSection = getSection(totalPages); + List components = singleSection.getAllComponents(); + for (int i = 0; i < components.size(); i++) { + TemplateComponent tc = components.get(i); + if (tc.getType() == ComponentType.BODY) { + SerializableComponent sc = tc.getSerializable(); + HTML citationHTML = new HTML(sc.getPossibleContent().toString(), true); ///to clean the HTML + String citation = citationHTML.getText(); + if (citation.startsWith(citeKey)) { + if (singleSection.removeComponent(tc)) { //removes also the previous heading 2 + TemplateComponent h2 = components.get(i-1); + singleSection.removeComponent(h2); + storeInSession(); + return true; + } + + } + } + } + return false; + } + /** + * @param pageNo . + * @return . + */ + public TemplateSection getSection(int pageNo) { + return sections.get(""+pageNo); + } + /** + * generally used when reaing a model form disk + * @param toLoad the SerializableModel instance to load in the model + * @param presenter . + */ + public void loadModel(SerializableModel toLoad, Presenter presenter) { + //loading template from disk + + this.author = toLoad.getAuthor(); + this.dateCreated = toLoad.getDateCreated(); + this.lastEdit = toLoad.getLastEdit(); + this.lastEditBy = toLoad.getLastEditBy(); + this.templateName = toLoad.getTemplateName(); + this.pageWidth = toLoad.getPageWidth(); + this.pageHeight = toLoad.getPageHeight(); + this.currentPage = toLoad.getCurrPage(); + this.totalPages = toLoad.getTotalPages(); + this.marginLeft = toLoad.getMarginLeft(); + this.marginRight = toLoad.getMarginRight(); + this.marginTop = toLoad.getMarginTop(); + this.marginBottom = toLoad.getMarginBottom(); + this.metadata = toLoad.getMetadata(); + this.columnWidth = pageWidth - (marginLeft + marginRight); + + + + //the sections to be transferred + Vector sectionsSerialized = toLoad.getSections(); + + //reset current sections container + this.sections = new HashMap(); + + //page Number, this model uses a HashMap for each page, the key is the page number + int pageNo = 1; + for (SerializableSection serialazableSection : sectionsSerialized) { //for each section + + List myTemplateSection = new Vector(); + for (SerializableComponent sc : serialazableSection.getComponents()) { //for each page component + myTemplateSection.add(new TemplateComponent(this, sc, presenter)); + } + //TODO: load also metadata + GWT.log("Section Metadata:"+serialazableSection.getMetadata().size(), null); + this.sections.put(""+pageNo, new TemplateSection(myTemplateSection, serialazableSection.getMetadata())); + pageNo++; + } + + } + + + /** + * generally used when reaing a model form disk + * @param toLoad the SerializableModel instance where toget the section + * @param sectionNoToimport section to import 0 -> n-1 + * @param beforeSection say where to import this section (before) + * @param asLastSection say to import this section as last section in the curren template / report + */ + public void importSectionInModel(SerializableModel toLoad, int sectionNoToimport, int beforeSection, boolean asLastSection) { + + int pageNo = totalPages+1; + + //the section to be imported -1 beacuse it stays in a vector + SerializableSection toImport = toLoad.getSections().get(sectionNoToimport-1); + List myTemplateSection = new Vector(); + for (SerializableComponent sc : toImport.getComponents()) { //for each page component + myTemplateSection.add(new TemplateComponent(this, sc, presenter)); + } + //TODO: load also metadata + GWT.log("Section Metadata:"+toImport.getMetadata().size(), null); + if (asLastSection) + this.sections.put(""+pageNo, new TemplateSection(myTemplateSection, toImport.getMetadata())); + else { + //insertin gnew section + HashMap newSections = new HashMap(); + boolean isAdded = false; + for (int i = 1; i <= totalPages+1; i++) { + if (beforeSection == i) { + newSections.put(""+i, new TemplateSection(myTemplateSection, toImport.getMetadata())); + isAdded = true; + } + else { + int insertIn = (isAdded) ? (i-1): i; + newSections.put(""+i, sections.get(""+insertIn)); + GWT.log("Inserting " + insertIn + " into section " + i + " isAdded =" + (isAdded) , null); + } + } + this.sections = newSections; + GWT.log("NEW SECTION SIZE"+sections.size(), null); + } + + totalPages++; + } + + /** + * + * @param sectNo the section to discard + * @return the removed element + */ + public TemplateSection discardSection(int sectNo) { + + TemplateSection toRemove = sections.remove(""+sectNo); + for (int i = sectNo+1; i <= totalPages; i++) { + sections.put(""+(i-1), sections.get(""+i)); + } + totalPages--; + return toRemove; + } + + /** + * + * @return a serialized version od the model + */ + public SerializableModel getSerializableModel() { + Vector serializedsections = new Vector(); + + for (int i = 1; i <= sections.size(); i++) { + //the pages + String pageNo = ""+i; + if (sections.get(pageNo) != null) { + + TemplateSection singleSection = sections.get(pageNo); + List templateElements = singleSection.getAllComponents(); + List serialazableComponents = new LinkedList(); + //construct the serialized section + SerializableSection aSection = new SerializableSection(); + //copy the components + for (TemplateComponent tc : templateElements) + serialazableComponents.add(tc.getSerializable()); + + aSection.setComponents(serialazableComponents); + aSection.setMetadata(singleSection.getAllMetadata()); + + //add the serialized section + serializedsections.add(aSection); + } + + + } + SerializableModel toReturn = + new SerializableModel("UniqueID", author, dateCreated, lastEdit, lastEditBy, templateName, columnWidth, currentPage, marginBottom, marginLeft, marginRight, marginTop, + pageHeight, pageWidth, serializedsections, totalPages, metadata); + + return toReturn; + } + + + + + /** + * + * @param folderid . + * @param name . + */ + public void saveReport (String folderid, String name) { + modelService.saveReport(folderid, name, new AsyncCallback() { + public void onFailure(Throwable caught) { + Window.alert("Report Not Saved: " + caught.getMessage()); + } + public void onSuccess(Void result) { + Window.alert("Report Saved Successfully"); + presenter.refreshWorkspace(); + } + }); + + } + + /** + * + * + */ + public void saveReport () { + modelService.saveReport(new AsyncCallback() { + public void onFailure(Throwable caught) { + MessageBox.alert("Warning","Report Not Saved: " + caught.getMessage(), null); + } + public void onSuccess(Void result) { + MessageBox.alert("Warning","Report Saved Successfully", null); + presenter.refreshWorkspace(); + } + }); + } + + + /** + * look for the model in the current page and edits its size + * @param toResize . + * @param newWidth . + * @param newHeight . + */ + public void resizeModelComponent(Widget toResize, int newWidth, int newHeight) { + GWT.log("LOOKING CORRESPONDANCE", null); + + String tcPage = ""+currentPage; + TemplateSection singleSection = sections.get(tcPage); + singleSection.resizeModelComponent(toResize, newWidth, newHeight); + + storeInSession(); + } + + + + /** + * + * @param type a + * @param templateName a + * return a URL which is lookable for on the web + * + * @return . + */ + public String getExportedFileURL(ExportManifestationType type, String templateName) { + /** + * PDFs will be stored under webapps/usersArea... + */ + // get e.g. http://dlib28.isti.cnr.it:9090/ + String host = Window.Location.getProtocol()+"//"+Window.Location.getHost()+"/"; + String exportedURL = ""; + + switch (type) { + case DOCX: + exportedURL = host + "usersArea/" + presenter.getCurrentScope() + "/templates/" + + presenter.getCurrentUser() + "/EXPORTS/" + templateName + ".docx"; + break; + case PDF: + exportedURL = host + "usersArea/" + presenter.getCurrentScope() + "/templates/" + + presenter.getCurrentUser() + "/EXPORTS/" + templateName + ".pdf"; + break; + case HTML: + exportedURL = host + "usersArea/" + presenter.getCurrentScope() + "/templates/" + + presenter.getCurrentUser() + "/EXPORTS/" + templateName + ".html"; + + } + return exportedURL; + } + + /** + * stores the current model in the session + */ + public void storeInSession() { + AsyncCallback callback = new AsyncCallback() { + public void onFailure(Throwable caught) { } + public void onSuccess(Object result) { } + }; + + SerializableModel modelToSend = getSerializableModel(); + + GWT.log("Storing in session: currpage = " + modelToSend.getCurrPage(), null); + + modelService.storeTemplateInSession(modelToSend, callback); + } + + //****** GETTERS n SETTERS + /** + * @return . + */ + public int getCurrentPage() {return currentPage;} + /** + * @param currentPage . + */ + public void setCurrentPage(int currentPage) { + this.currentPage = currentPage; + storeInSession(); + } + /** + * @return . + */ + public int getMarginBottom() {return marginBottom;} + /** + * @param marginBottom . + */ + public void setMarginBottom(int marginBottom) {this.marginBottom = marginBottom;} + /** + * @return . + */ + public int getMarginLeft() {return marginLeft; } + /** + * @param marginLeft . + */ + public void setMarginLeft(int marginLeft) { + this.marginLeft = marginLeft; + this.columnWidth = pageWidth - (marginLeft + marginRight); + } + /** + * @return . + */ + public int getMarginRight() {return marginRight;} + /** + * @param marginRight . + */ + public void setMarginRight(int marginRight) { + this.marginRight = marginRight; + this.columnWidth = pageWidth - (marginLeft + marginRight); + } + /** + * @return . + */ + public int getMarginTop() {return marginTop;} + /** + * @param marginTop . + */ + public void setMarginTop(int marginTop) {this.marginTop = marginTop;} + /** + * @return . + */ + public int getPageHeight() {return pageHeight; } + /** + * @param pageHeight . + */ + public void setPageHeight(int pageHeight) { this.pageHeight = pageHeight;} + /** + * @return . + */ + public int getPageWidth() { return pageWidth;} + /** + * @param pageWidth . + */ + public void setPageWidth(int pageWidth) { + this.pageWidth = pageWidth; + this.columnWidth = pageWidth - (marginLeft + marginRight); + } + /** + * @return . + */ + public String getTemplateName() {return templateName;} + /** + * @param templateName . + */ + public void setTemplateName(String templateName) { + this.templateName = templateName; + storeInSession(); + } + + /** + * @return totalPages . + */ + public int getTotalPages() {return totalPages; } + + /** + * @param totalPages . + */ + public void setTotalPages(int totalPages) { this.totalPages = totalPages;} + /** + * @return . + */ + public int getColumnWidth() {return columnWidth;} + /** + * @param columnWidth . + */ + public void setColumnWidth(int columnWidth) {this.columnWidth = columnWidth;} + /** + * @return . + */ + public ReportServiceAsync getModelService() {return modelService;} + + + /** + * metadata . + * @return . + */ + public List getMetadata() { + return metadata; + } + + /** + * + * @return . + * + */ + public String getLastEditBy() { + return lastEditBy; + } + + + /** + * + * @param lastEditBy . + */ + public void setLastEditBy(String lastEditBy) { + this.lastEditBy = lastEditBy; + } + + /** + * + * @return . + */ + public boolean containsLargeTS() { + sections.entrySet(); + for (Entry entry : sections.entrySet()) { + TemplateSection section = (TemplateSection) entry.getValue(); + for (TemplateComponent tc : section.getAllComponents()) { + if (tc.getType() == ComponentType.TIME_SERIES) { + SerializableComponent sc = tc.getSerializable(); + SerializableTimeSeries sts = (SerializableTimeSeries) sc.getPossibleContent(); + if (sts.getFilter() != null) { + int from = sts.getFilter().getFrom(); + int to = sts.getFilter().getTo(); + if (to - from > 200) + return true; + } + } + } + } + return false; + } + + public void updateWorkflowDocument(boolean update) { + modelService.updateWorkflowDocument(update, new AsyncCallback() { + + public void onFailure(Throwable caught) { + Window.alert("failed to update workflow document"); + + } + public void onSuccess(Void result) { + loadWorkflowLibraryApp(); + } + }); + + } + private String location; + /** + * Redirect to VRE Deployer Portlet + */ + private void loadWorkflowLibraryApp(){ + getUrl(); + location += "/../my-workflow-documents"; + Window.open(location, "_self", ""); + } + /** + * Get URL from browser + */ + public native void getUrl()/*-{ + this.@org.gcube.portlets.user.reportgenerator.client.model.TemplateModel::location = $wnd.location.href; + }-*/; + +} + diff --git a/src/main/java/org/gcube/portlets/user/reportgenerator/client/model/TemplateSection.java b/src/main/java/org/gcube/portlets/user/reportgenerator/client/model/TemplateSection.java new file mode 100644 index 0000000..f7bd04b --- /dev/null +++ b/src/main/java/org/gcube/portlets/user/reportgenerator/client/model/TemplateSection.java @@ -0,0 +1,254 @@ +package org.gcube.portlets.user.reportgenerator.client.model; + +import java.util.ArrayList; +import java.util.LinkedList; +import java.util.List; + +import org.gcube.portlets.d4sreporting.common.shared.Metadata; +import org.gcube.portlets.user.reportgenerator.client.events.AddCommentEvent; + +import com.google.gwt.core.client.GWT; +import com.google.gwt.user.client.ui.Widget; + +/** + * The TemplateSection class represents a Template Section that can be associated to any Template + * + * @author Massimiliano Assante, ISTI-CNR - massimiliano.assante@isti.cnr.it + * @version October 2009 (1.4) + */ + +public class TemplateSection { + + /** + * holds the metadata(s) for the sections + */ + private List metadata; + /** + * holds the TemplateComponents for the sections + */ + private List components; + + /** + * + * @param components + * @param metadata + */ + public TemplateSection() { + this.components = new LinkedList(); + this.metadata = new LinkedList(); + } + + /** + * + * @param components . + * @param metadata . + */ + public TemplateSection(List components, List metadata) { + this.components = components; + this.metadata = metadata; + } + + ///*** GETTERS N SETTERS + /** + * enqueue a component + */ + public void addComponent(TemplateComponent tc) { + if (tc != null) + components.add(tc); + else { + throw new NullPointerException(); + } + } + + public boolean removeComponent(TemplateComponent tc) { + if (tc != null) + return components.remove(tc); + else { + throw new NullPointerException(); + } + } + + public ArrayList getSectionComments() { + ArrayList toRet = new ArrayList(); + for (int i = 0; i < components.size(); i++) { + TemplateComponent tc = components.get(i); + if (tc.getUserComments() != null) { + //toRet. + } + } + return toRet; + } + /** + * look for the model in the current page and edits its size + * @param toResize . + * @param newWidth . + * @param newHeight . + */ + public void resizeModelComponent(Widget toResize, int newWidth, int newHeight) { + + for (int i = 0; i < components.size(); i++) { + TemplateComponent tc = components.get(i); + + if (tc.getContent() != null && tc.getContent().equals(toResize)) { + GWT.log("FOUND CORRESPONDANCE"); + tc.setWidth(newWidth); + tc.setHeight(newHeight); + tc.setContent(toResize); + break; + } + } + } + + public void discardComments(Widget component) { + for (int i = 0; i < components.size(); i++) { + TemplateComponent tc = components.get(i); + if (tc.getContent() != null && tc.getContent().equals(component)) { + //removes previous comment is exists + for (Metadata metadata : tc.getAllMetadata()) { + if (metadata.getAttribute().equals(TemplateModel.USER_COMMENT)) { + tc.getAllMetadata().remove(metadata); + GWT.log("FOUND and REMOVED"); + break; + } + } + for (Metadata metadata : tc.getAllMetadata()) { + if (metadata.getAttribute().equals(TemplateModel.USER_COMMENT_HEIGHT)) { + tc.getAllMetadata().remove(metadata); + break; + } + } + } + } + } + /** + * look for the model in the current page and edits its size + */ + public void addCommentToComponent(Widget component, String comment2Add, int visibleHeight) { + + for (int i = 0; i < components.size(); i++) { + TemplateComponent tc = components.get(i); + if (tc.getContent() != null && tc.getContent().equals(component)) { + //removes previous comment is exists + for (Metadata metadata : tc.getAllMetadata()) { + if (metadata.getAttribute().equals(TemplateModel.USER_COMMENT)) { + tc.getAllMetadata().remove(metadata); + break; + } + } + for (Metadata metadata : tc.getAllMetadata()) { + if (metadata.getAttribute().equals(TemplateModel.USER_COMMENT_HEIGHT)) { + tc.getAllMetadata().remove(metadata); + break; + } + } + //add the comment + tc.addMetadata(TemplateModel.USER_COMMENT, comment2Add); + tc.addMetadata(TemplateModel.USER_COMMENT_HEIGHT, ""+visibleHeight); + GWT.log("Comment Added: " + comment2Add); + break; + } + } + } + /** + * look if a comment with a specific metadata (that indicate sit is a comment) + * exists in the current report model: + * @return true if comment is present yet false otherwise + */ + public boolean hasComments(Widget component) { + for (int i = 0; i < components.size(); i++) { + TemplateComponent tc = components.get(i); + if (tc.getContent() != null && tc.getContent().equals(component)) { + for (Metadata metadata : tc.getAllMetadata()) + if (metadata.getAttribute().equals(TemplateModel.USER_COMMENT)) return true; + } + } + return false; + } + + /** + * look if a comment with a specific metadata (that indicate sit is a comment) + * exists in the current report model: + * @return true if comment is present yet false otherwise + */ + public AddCommentEvent getComponentComments(Widget component) { + String commentText = ""; + int commentHeight = -1; + for (int i = 0; i < components.size(); i++) { + TemplateComponent tc = components.get(i); + if (tc.getContent() != null && tc.getContent().equals(component)) { + for (Metadata metadata : tc.getAllMetadata()) { + if (metadata.getAttribute().equals(TemplateModel.USER_COMMENT)) + commentText = metadata.getValue(); + if (metadata.getAttribute().equals(TemplateModel.USER_COMMENT_HEIGHT)) + commentHeight = Integer.parseInt(metadata.getValue()); + } + } + } + return new AddCommentEvent(null, commentText, commentHeight); + } + + /** + * look for the model in the current section and edits its position + * @param toRepos . + * @param newX . + * @param newY . + */ + public void repositionModelComponent(Widget toRepos, int newX, int newY) { + + for (int i = 0; i < components.size(); i++) { + TemplateComponent tc = components.get(i); + if (tc.getContent().equals(toRepos)) { + GWT.log("FOUND CORRESPONDANCE", null); + tc.setX(newX); + tc.setY(newY); + tc.setContent(toRepos); + break; + } + } + } + /** + * + * @param index . + * @return . + */ + public TemplateComponent getComponent(int index) { + return components.get(index); + } + + /** + * + * @param attr . + * @param value . + */ + public void addMetadata(String attr, String value) { + if (attr != null && value != null) { + metadata.add(new Metadata(attr, value)); + } + else + throw new NullPointerException(); + } + + /** + * + * @return . + */ + public List getAllMetadata() { + if (metadata == null) { + new LinkedList(); + } + return metadata; + } + + /** + * + * @return . + */ + public List getAllComponents() { + if (components == null) { + new TemplateSection(); + } + return components; + } + + +} diff --git a/src/main/java/org/gcube/portlets/user/reportgenerator/client/resources/FimesReportTreeStructureResources.java b/src/main/java/org/gcube/portlets/user/reportgenerator/client/resources/FimesReportTreeStructureResources.java new file mode 100644 index 0000000..64f7a2e --- /dev/null +++ b/src/main/java/org/gcube/portlets/user/reportgenerator/client/resources/FimesReportTreeStructureResources.java @@ -0,0 +1,45 @@ +package org.gcube.portlets.user.reportgenerator.client.resources; + +import com.google.gwt.core.client.GWT; +import com.google.gwt.resources.client.ClientBundle; +import com.google.gwt.resources.client.ImageResource; +import com.google.gwt.resources.client.ClientBundle.Source; + +public interface FimesReportTreeStructureResources extends ClientBundle { +public static final FimesReportTreeStructureResources INSTANCE = GWT.create(FimesReportTreeStructureResources.class); + + @Source("report.png") + ImageResource root(); + + @Source("page.png") + ImageResource section(); + + @Source("text_heading_1.png") + ImageResource heading1(); + + @Source("text_heading_2.png") + ImageResource heading2(); + + @Source("text_heading_3.png") + ImageResource heading3(); + + @Source("text_heading_4.png") + ImageResource heading4(); + + @Source("text_dropcaps.png") + ImageResource text(); + + @Source("table.png") + ImageResource table(); + + @Source("image.png") + ImageResource image(); + + @Source("information.png") + ImageResource instructions(); + + @Source("comments.png") + ImageResource comments(); + +} + diff --git a/src/main/java/org/gcube/portlets/user/reportgenerator/client/resources/comments.png b/src/main/java/org/gcube/portlets/user/reportgenerator/client/resources/comments.png new file mode 100644 index 0000000..39433cf Binary files /dev/null and b/src/main/java/org/gcube/portlets/user/reportgenerator/client/resources/comments.png differ diff --git a/src/main/java/org/gcube/portlets/user/reportgenerator/client/resources/image.png b/src/main/java/org/gcube/portlets/user/reportgenerator/client/resources/image.png new file mode 100644 index 0000000..fc3c393 Binary files /dev/null and b/src/main/java/org/gcube/portlets/user/reportgenerator/client/resources/image.png differ diff --git a/src/main/java/org/gcube/portlets/user/reportgenerator/client/resources/information.png b/src/main/java/org/gcube/portlets/user/reportgenerator/client/resources/information.png new file mode 100644 index 0000000..12cd1ae Binary files /dev/null and b/src/main/java/org/gcube/portlets/user/reportgenerator/client/resources/information.png differ diff --git a/src/main/java/org/gcube/portlets/user/reportgenerator/client/resources/page.png b/src/main/java/org/gcube/portlets/user/reportgenerator/client/resources/page.png new file mode 100644 index 0000000..03ddd79 Binary files /dev/null and b/src/main/java/org/gcube/portlets/user/reportgenerator/client/resources/page.png differ diff --git a/src/main/java/org/gcube/portlets/user/reportgenerator/client/resources/report.png b/src/main/java/org/gcube/portlets/user/reportgenerator/client/resources/report.png new file mode 100644 index 0000000..779ad58 Binary files /dev/null and b/src/main/java/org/gcube/portlets/user/reportgenerator/client/resources/report.png differ diff --git a/src/main/java/org/gcube/portlets/user/reportgenerator/client/resources/table.png b/src/main/java/org/gcube/portlets/user/reportgenerator/client/resources/table.png new file mode 100644 index 0000000..abcd936 Binary files /dev/null and b/src/main/java/org/gcube/portlets/user/reportgenerator/client/resources/table.png differ diff --git a/src/main/java/org/gcube/portlets/user/reportgenerator/client/resources/text_dropcaps.png b/src/main/java/org/gcube/portlets/user/reportgenerator/client/resources/text_dropcaps.png new file mode 100644 index 0000000..dd65786 Binary files /dev/null and b/src/main/java/org/gcube/portlets/user/reportgenerator/client/resources/text_dropcaps.png differ diff --git a/src/main/java/org/gcube/portlets/user/reportgenerator/client/resources/text_heading_1.png b/src/main/java/org/gcube/portlets/user/reportgenerator/client/resources/text_heading_1.png new file mode 100644 index 0000000..9c122e9 Binary files /dev/null and b/src/main/java/org/gcube/portlets/user/reportgenerator/client/resources/text_heading_1.png differ diff --git a/src/main/java/org/gcube/portlets/user/reportgenerator/client/resources/text_heading_2.png b/src/main/java/org/gcube/portlets/user/reportgenerator/client/resources/text_heading_2.png new file mode 100644 index 0000000..fbd8765 Binary files /dev/null and b/src/main/java/org/gcube/portlets/user/reportgenerator/client/resources/text_heading_2.png differ diff --git a/src/main/java/org/gcube/portlets/user/reportgenerator/client/resources/text_heading_3.png b/src/main/java/org/gcube/portlets/user/reportgenerator/client/resources/text_heading_3.png new file mode 100644 index 0000000..c7836cf Binary files /dev/null and b/src/main/java/org/gcube/portlets/user/reportgenerator/client/resources/text_heading_3.png differ diff --git a/src/main/java/org/gcube/portlets/user/reportgenerator/client/resources/text_heading_4.png b/src/main/java/org/gcube/portlets/user/reportgenerator/client/resources/text_heading_4.png new file mode 100644 index 0000000..4e929ea Binary files /dev/null and b/src/main/java/org/gcube/portlets/user/reportgenerator/client/resources/text_heading_4.png differ diff --git a/src/main/java/org/gcube/portlets/user/reportgenerator/client/targets/AttributeArea.java b/src/main/java/org/gcube/portlets/user/reportgenerator/client/targets/AttributeArea.java new file mode 100644 index 0000000..3ae77a3 --- /dev/null +++ b/src/main/java/org/gcube/portlets/user/reportgenerator/client/targets/AttributeArea.java @@ -0,0 +1,142 @@ +package org.gcube.portlets.user.reportgenerator.client.targets; +import org.gcube.portlets.d4sreporting.common.client.ComponentType; +import org.gcube.portlets.d4sreporting.common.shared.SerializableAttribute; +import org.gcube.portlets.d4sreporting.common.shared.SerializableAttributeArea; +import org.gcube.portlets.user.reportgenerator.client.Presenter.Presenter; + +import com.google.gwt.core.client.GWT; +import com.google.gwt.dom.client.Style.Unit; +import com.google.gwt.user.client.ui.CheckBox; +import com.google.gwt.user.client.ui.Composite; +import com.google.gwt.user.client.ui.HTML; +import com.google.gwt.user.client.ui.HasHorizontalAlignment; +import com.google.gwt.user.client.ui.HasVerticalAlignment; +import com.google.gwt.user.client.ui.HorizontalPanel; +/** + * AttributeArea class + * + * @author Massimiliano Assante, ISTI-CNR - massimiliano.assante@isti.cnr.it + * @version April 2011 (1.0) + */ +public class AttributeArea extends Composite { + + private HorizontalPanel myPanel; + private HTML attrName; + private CheckBox[] boxes; + + /** + * Coming form a template constructor + */ + public AttributeArea(final Presenter presenter, int left, int top, int width, final int height, String textToDisplay) { + myPanel = new HorizontalPanel(); + myPanel.setTitle("Attribute Area"); + myPanel.setVerticalAlignment(HasVerticalAlignment.ALIGN_BOTTOM); + myPanel.setPixelSize(width, 20); + myPanel.addStyleName("attributeArea"); + + attrName = new HTML(getAttributeName(textToDisplay)); + attrName.getElement().getStyle().setMarginLeft(10, Unit.PX); + attrName.getElement().getStyle().setMarginRight(5, Unit.PX); + HorizontalPanel boxesPanel = new HorizontalPanel(); + boxesPanel.add(attrName); + myPanel.add(boxesPanel); + myPanel.setHorizontalAlignment(HasHorizontalAlignment.ALIGN_LEFT); + boxes = getCheckboxes(textToDisplay); + for (int i = 0; i < boxes.length; i++) { + boxesPanel.add(boxes[i]); + } + initWidget(myPanel); + } + /** + * Coming form a report constructor + */ + public AttributeArea(final Presenter presenter, int left, int top, int width, final int height, SerializableAttributeArea sata) { + myPanel = new HorizontalPanel(); + myPanel.setTitle("Attribute Area"); + myPanel.setVerticalAlignment(HasVerticalAlignment.ALIGN_BOTTOM); + myPanel.setPixelSize(width, 20); + myPanel.addStyleName("attributeArea"); + + attrName = new HTML(sata.getAttrName(), true); + attrName.getElement().getStyle().setMarginLeft(10, Unit.PX); + attrName.getElement().getStyle().setMarginRight(5, Unit.PX); + HorizontalPanel boxesPanel = new HorizontalPanel(); + boxesPanel.add(attrName); + myPanel.add(boxesPanel); + myPanel.setHorizontalAlignment(HasHorizontalAlignment.ALIGN_LEFT); + int values = sata.getValues().size(); + boxes = new CheckBox[values]; + int j = 0; + for (SerializableAttribute attr: sata.getValues()) { + CheckBox toAdd = new CheckBox(attr.getName()); + toAdd.setStyleName("checkAttribute"); + toAdd.setValue(attr.getValue()); + boxes[j] = toAdd; + j++; + } + + //adding it to the panel + for (int i = 0; i < boxes.length; i++) { + boxesPanel.add(boxes[i]); + } + initWidget(myPanel); + } + /** + * + * @param toParse + * @return + */ + private String getAttributeName(String toParse) { + if (toParse == null) + return ""; + String toReturn = ""; + try { + toReturn = toParse.substring(0, toParse.indexOf(":")); + } catch (StringIndexOutOfBoundsException e) { + GWT.log("Could not find : returning empty"); + } + return toReturn; + } + /** + * + * @param toParse + * @return + */ + private CheckBox[] getCheckboxes(String toParse) { + String toSplit = toParse.substring(toParse.indexOf(":")+1, toParse.length()); + String[] values = toSplit.split("\\|"); + GWT.log("toSplit" + toSplit); + GWT.log("values" + values.length); + CheckBox[] boxes = new CheckBox[values.length]; + for (int i = 0; i < values.length; i++) { + boxes[i] = new CheckBox(); + boxes[i].setStyleName("checkAttribute"); + boxes[i].setText(" " + values[i].trim()); + } + return boxes; + } + /** + * + * @return + */ + public ComponentType getType() { + return ComponentType.ATTRIBUTE; + } + /** + * + * @return + */ + public CheckBox[] getBoxes() { + return boxes; + } + /** + * + * @return + */ + public String getAttrName() { + return attrName.getText(); + } + + +} + diff --git a/src/main/java/org/gcube/portlets/user/reportgenerator/client/targets/BasicTextArea.java b/src/main/java/org/gcube/portlets/user/reportgenerator/client/targets/BasicTextArea.java new file mode 100644 index 0000000..1762722 --- /dev/null +++ b/src/main/java/org/gcube/portlets/user/reportgenerator/client/targets/BasicTextArea.java @@ -0,0 +1,111 @@ +package org.gcube.portlets.user.reportgenerator.client.targets; + +import org.gcube.portlets.d4sreporting.common.client.ComponentType; +import org.gcube.portlets.user.reportgenerator.client.ReportGenerator; +import org.gcube.portlets.user.reportgenerator.client.Presenter.Presenter; + +import com.google.gwt.core.client.GWT; +import com.google.gwt.event.dom.client.KeyUpEvent; +import com.google.gwt.event.dom.client.KeyUpHandler; +import com.google.gwt.event.dom.client.MouseOutEvent; +import com.google.gwt.event.dom.client.MouseOutHandler; +import com.google.gwt.user.client.ui.HTML; +import com.google.gwt.user.client.ui.HasVerticalAlignment; +import com.google.gwt.user.client.ui.TextArea; +import com.google.gwt.user.client.ui.VerticalPanel; +import com.google.gwt.user.client.ui.Widget; +/** + * BasicTextArea + * + * @author Massimiliano Assante, ISTI-CNR - massimiliano.assante@isti.cnr.it + * @version July 2011 (3.0) + */ +public class BasicTextArea extends ReportTextArea { + private TextArea textArea = new TextArea(); + private VerticalPanel myPanel; + private Presenter presenter; + + int currHeight = 0; + + + public BasicTextArea(ComponentType type, final Presenter presenter, int left, int top, int width, final int height, boolean hasComments) { + super(type, presenter, left, top, width, height, hasComments); + this.presenter = presenter; + myPanel = getResizablePanel(); + + textArea.setPixelSize(width, height); + + textArea.addMouseOutHandler(new MouseOutHandler() { + + public void onMouseOut(MouseOutEvent event) { + presenter.storeChangeInSession((Widget) event.getSource()); + } + }); + switch (type) { + case TITLE: + textArea.setStyleName("titleArea"); + myPanel.setTitle("Title"); + break; + case HEADING_1: + textArea.setStyleName("headgin1Area"); + myPanel.setTitle("Heading: Level 1"); + break; + case HEADING_2: + textArea.setStyleName("headgin2Area"); + myPanel.setTitle("Heading Level 2"); + break; + case HEADING_3: + textArea.setStyleName("headgin3Area"); + myPanel.setTitle("Heading: Level 3"); + break; + default: + break; + } + myPanel.add(textArea); + myPanel.setVerticalAlignment(HasVerticalAlignment.ALIGN_BOTTOM); + myPanel.setPixelSize(width, height); + + textArea.addMouseOutHandler(new MouseOutHandler() { + + public void onMouseOut(MouseOutEvent event) { + presenter.storeChangeInSession((Widget) event.getSource()); + + } + }); + + textArea.addKeyUpHandler(new KeyUpHandler() { + + public void onKeyUp(KeyUpEvent event) { + HTML div = ReportGenerator.get().getDivHidden(); + GWT.log("element.getHTML():\n" + textArea.getText(), null); + div.setHTML(textArea.getText()); + int newHeight = div.getOffsetHeight(); + if (newHeight > height-10 && newHeight != currHeight) { + resizeMe(myPanel.getOffsetWidth(), newHeight); + } + + } + }); + + + } + /** + * resize the panel + * @param w + * @param h + */ + private void resizeMe(int w, int h) { + resizePanel(w, h); + //Window.alert("myInstance.top: " + myInstance.top); + presenter.resizeTemplateComponentInModel(this, myPanel.getOffsetWidth(), h+5); + } + + public String getText() { + return textArea.getText(); + } + public void setText(String text) { + textArea.setText(text); + } + + +} diff --git a/src/main/java/org/gcube/portlets/user/reportgenerator/client/targets/Coords.java b/src/main/java/org/gcube/portlets/user/reportgenerator/client/targets/Coords.java new file mode 100644 index 0000000..ad1ebd3 --- /dev/null +++ b/src/main/java/org/gcube/portlets/user/reportgenerator/client/targets/Coords.java @@ -0,0 +1,26 @@ +package org.gcube.portlets.user.reportgenerator.client.targets; + +public class Coords { + + private int X; + private int Y; + public Coords(int x, int y) { + super(); + X = x; + Y = y; + } + public int getX() { + return X; + } + public void setX(int x) { + X = x; + } + public int getY() { + return Y; + } + public void setY(int y) { + Y = y; + } + + +} diff --git a/src/main/java/org/gcube/portlets/user/reportgenerator/client/targets/D4sRichTextarea.java b/src/main/java/org/gcube/portlets/user/reportgenerator/client/targets/D4sRichTextarea.java new file mode 100644 index 0000000..dd61df4 --- /dev/null +++ b/src/main/java/org/gcube/portlets/user/reportgenerator/client/targets/D4sRichTextarea.java @@ -0,0 +1,227 @@ +package org.gcube.portlets.user.reportgenerator.client.targets; + +import org.gcube.portlets.d4sreporting.common.client.ComponentType; +import org.gcube.portlets.user.reportgenerator.client.ReportGenerator; +import org.gcube.portlets.user.reportgenerator.client.Presenter.Presenter; + +import com.extjs.gxt.ui.client.widget.MessageBox; +import com.google.gwt.event.dom.client.KeyDownEvent; +import com.google.gwt.event.dom.client.KeyDownHandler; +import com.google.gwt.event.dom.client.KeyUpEvent; +import com.google.gwt.event.dom.client.KeyUpHandler; +import com.google.gwt.event.dom.client.MouseDownEvent; +import com.google.gwt.event.dom.client.MouseDownHandler; +import com.google.gwt.event.dom.client.MouseOutEvent; +import com.google.gwt.event.dom.client.MouseOutHandler; +import com.google.gwt.user.client.Event; +import com.google.gwt.user.client.ui.HTML; +import com.google.gwt.user.client.ui.HasVerticalAlignment; +import com.google.gwt.user.client.ui.RichTextArea; +import com.google.gwt.user.client.ui.TextArea; +import com.google.gwt.user.client.ui.VerticalPanel; +import com.google.gwt.user.client.ui.Widget; + + +/** + * D4sRichTextArea class is a template component that goes into the workspace + * + * @author Massimiliano Assante, ISTI-CNR - massimiliano.assante@isti.cnr.it + * @version October 2008 (0.2) + */ +public class D4sRichTextarea extends ReportTextArea { + + /** + * the text area + */ + private RichTextArea area = new RichTextArea(); + + + TextArea text = new TextArea(); + /** + * a flag + */ + boolean firstClick = true; + + int currHeight = 0; + + VerticalPanel myPanel; + /** + * + * + */ + public D4sRichTextarea() {} + + /** + * + * @param presenter . + * @param left left + * @param top top + * @param width . + * @param height . + * @param type . + */ + public D4sRichTextarea(ComponentType type, final Presenter presenter, int left, int top, int width, final int height, boolean hasComments) { + super(type, presenter, left, top, width, height, hasComments); + currHeight = height; + myPanel = getResizablePanel(); + + area.setPixelSize(width-6, height-2); + area.setStyleName("d4sRichTextArea"); + + + switch (type) { + case TITLE: + area.addStyleName(""); + break; + case HEADING_1: + area.addStyleName(""); + break; + case HEADING_2: + area.addStyleName(""); + break; + case HEADING_3: + area.addStyleName(""); + break; + case BODY: + area.addStyleName("bodyArea"); + break; + default: + break; + } + + + myPanel.add(area); + //repositionMyPanel(0, 15); + myPanel.setVerticalAlignment(HasVerticalAlignment.ALIGN_BOTTOM); + myPanel.setPixelSize(width, height-15); + setStyleName("d4sFrame"); + + area.addMouseDownHandler(new MouseDownHandler() { + public void onMouseDown(MouseDownEvent event) { + if (event.getNativeButton() == Event.BUTTON_RIGHT) { + event.preventDefault(); + event.stopPropagation(); + MessageBox.alert("Warning","Please, use CTRL+V (CMD+V) for pasting into this area", null); + } + if (firstClick) { + presenter.enableTextToolBar(area); + presenter.enableBiblioEntry(area); + firstClick = false; + ReportGenerator.get().getDivHidden().setPixelSize(area.getOffsetWidth(), -1); + } + HTML div = ReportGenerator.get().getDivHidden(); + div.setHTML(area.getHTML()); + int newHeight = div.getOffsetHeight()+20 ; + if (newHeight > height-10 && newHeight != currHeight) { + presenter.shiftComponentsByTextArea(myInstance.top, newHeight - currHeight); + resizePanel(myPanel.getOffsetWidth(), div.getOffsetHeight()); + //Window.alert("myInstance.top: " + myInstance.top); + presenter.resizeTemplateComponentInModel(myInstance, myPanel.getOffsetWidth(), newHeight); + } + } + }); + + area.addMouseOutHandler(new MouseOutHandler() { + public void onMouseOut(MouseOutEvent event) { + firstClick = true; + presenter.storeChangeInSession((Widget) event.getSource()); + } + + }); + //TODO: aggiorna +// area.addKeyDownHandler(new KeyDownHandler() { +// public void onKeyDown(KeyDownEvent event) { +//// if (event.isAnyModifierKeyDown() && event.getNativeKeyCode() == 86) { //event.getNativeKeyCode() == 86 is the V (to avoid ctrl V or cmd V) +//// MessageBox.show(new MessageBoxConfig() { +//// { +//// setTitle("Paste operation"); +//// setMsg("Please enter your text here (PLAIN)"); +//// setWidth(500); +//// setButtons(MessageBox.OKCANCEL); +//// setMultiline(true); +//// setCallback(new MessageBox.PromptCallback() { +//// public void execute(String btnID, String text) { +//// if (btnID.compareTo("ok") == 0) { +//// area.setText(text); +//// +//// //resize if needed +//// HTML div = ReportGenerator.get().getDivHidden(); +//// //GWT.log("element.getHTML():\n" + area.getHTML(), null); +//// div.setHTML(area.getHTML()); +//// int newHeight = div.getOffsetHeight()+20 ; +//// if (newHeight > height-10 && newHeight != currHeight) { +//// resizePanel(myPanel.getOffsetWidth(), div.getOffsetHeight()); +//// } +//// } +//// +//// } +//// }); +//// } +//// }); +// event.stopPropagation(); +// event.preventDefault(); +// } +// +// } +// }); + area.addKeyUpHandler(new KeyUpHandler() { + public void onKeyUp(KeyUpEvent event) { + HTML div = ReportGenerator.get().getDivHidden(); + div.setHTML(area.getHTML()); + int newHeight = div.getOffsetHeight()+20 ; + if (newHeight > height-10 && newHeight != currHeight) { + presenter.shiftComponentsByTextArea(myInstance.top, newHeight - currHeight); + resizePanel(myPanel.getOffsetWidth(), div.getOffsetHeight()); + //Window.alert("myInstance.top: " + myInstance.top); + presenter.resizeTemplateComponentInModel(myInstance, myPanel.getOffsetWidth(), newHeight); + } + } + }); + } + + /** + * used to resize the panel + * @param width w + * @param height h + */ + @Override + public void resizePanel(int width, int height) { + if (height > 15 && width > 15) { + mainPanel.setPixelSize(width, height+20); + resizablePanel.setPixelSize(width, height+20); + mainPanel.setWidgetPosition(topPanel, width-30 , 0); + area.setPixelSize(width-4, height+20); + currHeight = height + 20; + } + } + + /** + * + * @return . + */ + public String getHTML() { + return area.getHTML(); + } + + /** + * @param html the html + */ + public void setHTML(String html) { + area.setHTML(html); + } + /** + * + * @return . + */ + public RichTextArea getArea() { + return area; + } + + /** + * + * @param firstClick . + */ + public void setFirstClick(boolean firstClick) { + this.firstClick = firstClick; + } +} diff --git a/src/main/java/org/gcube/portlets/user/reportgenerator/client/targets/DoubleColumnPanel.java b/src/main/java/org/gcube/portlets/user/reportgenerator/client/targets/DoubleColumnPanel.java new file mode 100644 index 0000000..361f996 --- /dev/null +++ b/src/main/java/org/gcube/portlets/user/reportgenerator/client/targets/DoubleColumnPanel.java @@ -0,0 +1,42 @@ +package org.gcube.portlets.user.reportgenerator.client.targets; + +import com.google.gwt.user.client.ui.Composite; +import com.google.gwt.user.client.ui.HorizontalPanel; +import com.google.gwt.user.client.ui.Widget; + + +/** + * DoubleColumnPanel class is a Widget that places to widget in the same y + * + * @author Massimiliano Assante, ISTI-CNR - massimiliano.assante@isti.cnr.it + * @version October 2009 (1.4) + */ +public class DoubleColumnPanel extends Composite { + + private Widget left; + private Widget right; + + private HorizontalPanel mainPanel = new HorizontalPanel(); + + + /** + * + * @param left . + * @param right . + */ + public DoubleColumnPanel(Widget left, Widget right) { + super(); + + this.left = left; + this.right = right; + + mainPanel.add(left); + mainPanel.add(right); + mainPanel.setWidth("800"); + initWidget(mainPanel); + + } + + + +} diff --git a/src/main/java/org/gcube/portlets/user/reportgenerator/client/targets/DropImageListener.java b/src/main/java/org/gcube/portlets/user/reportgenerator/client/targets/DropImageListener.java new file mode 100644 index 0000000..99ef935 --- /dev/null +++ b/src/main/java/org/gcube/portlets/user/reportgenerator/client/targets/DropImageListener.java @@ -0,0 +1,122 @@ +/** + * + */ +package org.gcube.portlets.user.reportgenerator.client.targets; + + + +import java.util.List; + +import org.gcube.portlets.user.workspace.client.interfaces.GXTFolderItemTypeEnum; +import org.gcube.portlets.user.workspace.client.model.FileModel; +import org.gcube.portlets.user.workspace.client.workspace.GWTWorkspaceItem; +import org.gcube.portlets.user.workspace.client.workspace.GWTWorkspaceItemType; +import org.gcube.portlets.user.workspace.client.workspace.folder.GWTFolderItem; +import org.gcube.portlets.user.workspace.client.workspace.folder.GWTFolderItemType; +import org.gcube.portlets.user.workspace.client.workspace.folder.item.GWTExternalImage; +import org.gcube.portlets.user.workspace.client.workspace.folder.item.gcube.GWTImageDocument; + +import com.extjs.gxt.ui.client.dnd.DropTarget; +import com.extjs.gxt.ui.client.dnd.Insert; +import com.extjs.gxt.ui.client.dnd.DND.Operation; +import com.extjs.gxt.ui.client.event.DNDEvent; +import com.extjs.gxt.ui.client.store.TreeStoreModel; +import com.extjs.gxt.ui.client.widget.Html; +import com.extjs.gxt.ui.client.widget.treepanel.TreePanel; +import com.google.gwt.core.client.GWT; + + + +/** + * @author Massimiliano Assante assante@isti.cnr.it + * + */ +public class DropImageListener extends DropTarget { + /** + * + */ + public static final String TIFF = "image/tiff"; + + protected DroppingArea panel; + + /** + * + * @param panel . + * @param config . + */ + public DropImageListener(DroppingArea panel) { + super(panel); + this.panel = panel; + //IMPORTANT + setOperation(Operation.COPY); + } + @Override + protected void showFeedback(DNDEvent event) { + if (!isValidDropTarget(event)) { + Insert.get().hide(); + event.getStatus().setStatus(false); + return; + } + super.showFeedback(event); + } + + + @SuppressWarnings("unchecked") + private boolean isValidDropTarget(DNDEvent event) { + GWT.log("isValidDropTarget"); + TreePanel source = (TreePanel) event.getDragSource().getComponent(); + List selection = source.getSelectionModel().getSelection(); + + for (FileModel model : selection) { + GWT.log("selection: " + model.getGXTFolderItemType()); + if(model.getGXTFolderItemType()!=null){ + + if (model.getGXTFolderItemType().equals(GXTFolderItemTypeEnum.EXTERNAL_IMAGE) || model.getGXTFolderItemType().equals(GXTFolderItemTypeEnum.IMAGE_DOCUMENT)) + return true; + // + // if (model.getGXTFolderItemType().equals(GXTFolderItemTypeEnum.TIME_SERIES)) + // return true; + + // if(source.getStore().getParent(model) == target.getModel()) + // return false; + } + } + + return false; + } + + /** + * @param source . + * @param e . + * @param data . + * @return . + */ + protected void onDragDrop(DNDEvent event) { + + super.onDragDrop(event); + + if(event.getData() != null){ + List listItemsSource = event.getData(); + GWT.log("Number of move " + listItemsSource.size()); + + FileModel sourceFileModel = null; //for print + + for(TreeStoreModel itemSource : listItemsSource){ + + sourceFileModel = (FileModel) itemSource.getModel(); + + if(sourceFileModel.getParentFileModel()!=null) + GWT.log("Source Name " + sourceFileModel.getName() + " id " + sourceFileModel.getIdentifier() + " end drag " + " Parent Name: " + sourceFileModel.getParentFileModel().getName() + "id " + sourceFileModel.getParentFileModel().getIdentifier()); + else + GWT.log("Source Name " + sourceFileModel.getName() + " id " + sourceFileModel.getIdentifier() + " end drag "); + + GWT.log("Child count: " + itemSource.getChildCount()); + + panel.fetchImage(sourceFileModel.getIdentifier(), false , true); + + } + } + + } + +} diff --git a/src/main/java/org/gcube/portlets/user/reportgenerator/client/targets/DropTSListener.java b/src/main/java/org/gcube/portlets/user/reportgenerator/client/targets/DropTSListener.java new file mode 100644 index 0000000..90ffd44 --- /dev/null +++ b/src/main/java/org/gcube/portlets/user/reportgenerator/client/targets/DropTSListener.java @@ -0,0 +1,115 @@ +/** + * + */ +package org.gcube.portlets.user.reportgenerator.client.targets; + + + + +import java.util.List; + +import org.gcube.portlets.user.workspace.client.interfaces.GXTFolderItemTypeEnum; +import org.gcube.portlets.user.workspace.client.model.FileModel; + +import com.extjs.gxt.ui.client.dnd.DND.Operation; +import com.extjs.gxt.ui.client.dnd.DropTarget; +import com.extjs.gxt.ui.client.dnd.Insert; +import com.extjs.gxt.ui.client.event.DNDEvent; +import com.extjs.gxt.ui.client.store.TreeStoreModel; +import com.extjs.gxt.ui.client.widget.treepanel.TreePanel; +import com.google.gwt.core.client.GWT; + +/** + * @author Federico De Faveri defaveri@isti.cnr.it + * + */ +public class DropTSListener extends DropTarget { + /** + * + */ + public static final String NO_DROP = "x-dd-drop-nodrop"; + /** + * + */ + public static final String OK_DROP = "x-dd-drop-ok"; + /** + * + */ + public static final String OK_DROP_ADD = "x-dd-drop-ok-add"; + + protected TSArea panel; + + /** + * + * @param panel . + * @param config . + */ + public DropTSListener(TSArea panel) { + super(panel); + this.panel = panel; + //IMPORTANT + setOperation(Operation.COPY); + } + + @Override + protected void showFeedback(DNDEvent event) { + if (!isValidDropTarget(event)) { + Insert.get().hide(); + event.getStatus().setStatus(false); + return; + } + super.showFeedback(event); + } + + + @SuppressWarnings("unchecked") + private boolean isValidDropTarget(DNDEvent event) { + GWT.log("isValidDropTarget"); + TreePanel source = (TreePanel) event.getDragSource().getComponent(); + List selection = source.getSelectionModel().getSelection(); + + for (FileModel model : selection) { + GWT.log("selection: " + model.getGXTFolderItemType()); + if(model.getGXTFolderItemType()!=null){ + if (model.getGXTFolderItemType().equals(GXTFolderItemTypeEnum.TIME_SERIES)) + return true; + } + } + return false; + } + + /** + * @param source . + * @param e . + * @param data . + * @return . + */ + protected void onDragDrop(DNDEvent event) { + + super.onDragDrop(event); + + if(event.getData() != null){ + List listItemsSource = event.getData(); + GWT.log("Number of move " + listItemsSource.size()); + + FileModel sourceFileModel = null; //for print + + for(TreeStoreModel itemSource : listItemsSource){ + + sourceFileModel = (FileModel) itemSource.getModel(); + + if(sourceFileModel.getParentFileModel()!=null) + GWT.log("Source Name " + sourceFileModel.getName() + " id " + sourceFileModel.getIdentifier() + " end drag " + " Parent Name: " + sourceFileModel.getParentFileModel().getName() + "id " + sourceFileModel.getParentFileModel().getIdentifier()); + else + GWT.log("Source Name " + sourceFileModel.getName() + " id " + sourceFileModel.getIdentifier() + " end drag "); + + GWT.log("Child count: " + itemSource.getChildCount()); + + panel.fetchTS(sourceFileModel.getIdentifier(), false , true); + + } + } + + } + +} diff --git a/src/main/java/org/gcube/portlets/user/reportgenerator/client/targets/DroppingArea.java b/src/main/java/org/gcube/portlets/user/reportgenerator/client/targets/DroppingArea.java new file mode 100644 index 0000000..362d59d --- /dev/null +++ b/src/main/java/org/gcube/portlets/user/reportgenerator/client/targets/DroppingArea.java @@ -0,0 +1,214 @@ +package org.gcube.portlets.user.reportgenerator.client.targets; + +import org.gcube.portlets.user.reportgenerator.client.ReportGenerator; +import org.gcube.portlets.user.reportgenerator.client.Presenter.Presenter; +import org.gcube.portlets.user.workspace.client.workspace.GWTWorkspaceItem; +import org.gcube.portlets.user.workspace.client.workspace.folder.item.GWTExternalImage; + +import com.extjs.gxt.ui.client.widget.Component; +import com.google.gwt.core.client.GWT; +import com.google.gwt.user.client.Window; +import com.google.gwt.user.client.rpc.AsyncCallback; +import com.google.gwt.user.client.ui.Composite; +import com.google.gwt.user.client.ui.HasAlignment; +import com.google.gwt.user.client.ui.HasVerticalAlignment; +import com.google.gwt.user.client.ui.Image; +import com.google.gwt.user.client.ui.Label; +import com.google.gwt.user.client.ui.VerticalPanel; +import com.google.gwt.user.client.ui.Widget; + + +/** + * DroppingArea class is a Widget you can drop image on + * + * @author Massimiliano Assante, ISTI-CNR - massimiliano.assante@isti.cnr.it + * @version May 20012 (3.5) + */ +public class DroppingArea extends Component { + + private String expectedContent = ""; + + private VerticalPanel mainPanel; + private Image droppedImage; + private Presenter presenter; + + private String idInBasket; + + private String currentUser; + private String currentScope; + + Label label; + + private int width, height; + + /** + * @param presenter . + * @param width . + * @param height . + * @param tag the label to display + */ + public DroppingArea(Presenter presenter, int width, int height, String tag) { + if (tag.equals("")) { + tag = "No suggestions available"; + } + this.width = width; + this.height = height; + this.presenter = presenter; + mainPanel = new VerticalPanel(); + super.setWidth(width+"px"); + super.setHeight(height+"px"); + mainPanel.setWidth(width+"px"); + mainPanel.setHeight(height+"px"); + setElement(mainPanel.getElement()); + + addStyleName("droppingArea-Image"); + + mainPanel.setHorizontalAlignment(HasAlignment.ALIGN_CENTER); + mainPanel.setVerticalAlignment(HasVerticalAlignment.ALIGN_MIDDLE); + + label = new Label(tag); + label.addStyleName("label"); + mainPanel.add(label); + + droppedImage = null; + } + + public void add(Widget w) { + mainPanel.add(w); + } + /** + * called when dropped an image on the area + * @param toShow the image to show + */ + public void showImage(Image toShow) { + + //mainPanel.remove(label); + mainPanel.clear(); + this.droppedImage = toShow; + toShow.setPixelSize(width, height); + + mainPanel.add(toShow); + presenter.storeChangeInSession(this); + + } + + /** + * + * @param url . + * @param id the id in the folder + */ + public void dropImage(String url, String id) + { + GWT.log("URL:" + url, null); + idInBasket = id; + showImage(new Image(url)); + } + + public void fetchImage(String identifier, boolean isInteralImage, boolean fullDetails) { + this.mask("fetching image, pleas wait", "loading-indicator"); + ReportGenerator.get().getWSTreeService().getImageById(identifier, isInteralImage, fullDetails, new AsyncCallback() { + + public void onSuccess(GWTWorkspaceItem result) { + unmask(); + GWTExternalImage image = (GWTExternalImage) result; + dropImage(image.getImageUrl(), image.getId()); + } + public void onFailure(Throwable caught) { + unmask(); + Window.alert("Could not fetch image from infrastructure " + caught.getCause()); + } + }); + } + + /** + * + * @return the image + */ + public Image getDroppedImage() { + if (droppedImage == null) + return new Image(); + return droppedImage; + } + + /** + * + * @return the possible content + */ + public Label getLabel() { + return label; + } + + /** + * + * @param label set the label + */ + public void setLabel(Label label) { + this.label = label; + } + + + /** + * return a URL which is lookable for on the web + * @param imageName . + * @param templateName . + * @return . + */ + public String getImageURL(String imageName, String templateName) { + currentUser = presenter.getCurrentUser(); + currentScope = presenter.getCurrentScope(); + /** + * Images will be stored under webapps/usersArea... + * GWT.getModuleBaseURL() returns * e.g. http://dlib28.isti.cnr.it/templatecreator/html/ + * need to get just http://dlib28.isti.cnr.it/ + */ + //remove "/html/" and get e.g. http://dlib28.isti.cnr.it/templatecreator + String host = GWT.getModuleBaseURL().substring(0, GWT.getModuleBaseURL().length()-6); + + //loog for last slash + int lastSlash = host.lastIndexOf("/"); + + //get what i need : e.g. http://dlib28.isti.cnr.it/ or host = "http://localhost:8080/"; + host = host.substring(0, lastSlash +1 ); + //host = "http://localhost:8080/"; + + String imgURL = host + "usersArea/" + currentScope + "/templates/" + + currentUser + "/CURRENT_OPEN/images/" + imageName; + + return imgURL; + } + + /** + * + * @return . + */ + public String getIdInBasket() { + return idInBasket; + } + + /** + * + * @param idInBasket . + */ + public void setIdInBasket(String idInBasket) { + this.idInBasket = idInBasket; + } + /** + * + * @return expectedContent + */ + public String getExpectedContent() { + return expectedContent; + } + + /** + * + * @param expectedContent . + */ + public void setExpectedContent(String expectedContent) { + this.expectedContent = expectedContent; + if (expectedContent.compareTo("") != 0) + label.setText(expectedContent); + } + + +} diff --git a/src/main/java/org/gcube/portlets/user/reportgenerator/client/targets/GenTableCell.java b/src/main/java/org/gcube/portlets/user/reportgenerator/client/targets/GenTableCell.java new file mode 100644 index 0000000..c296de6 --- /dev/null +++ b/src/main/java/org/gcube/portlets/user/reportgenerator/client/targets/GenTableCell.java @@ -0,0 +1,158 @@ +package org.gcube.portlets.user.reportgenerator.client.targets; + +import com.google.gwt.user.client.ui.TextArea; +/** + * + * @author massi + * + */ +public class GenTableCell extends TextArea { + + /** + * + */ + private int cellWidth; + /** + * + */ + private int cellHeight; + /** + * + */ + private int rowindex; + /** + * + */ + private int colindex; + /** + * + */ + private int colspan; + /** + * + */ + boolean selected = false; + /** + * + * @param rowindex + * @param colindex + */ + public GenTableCell() { + super(); + this.rowindex = 0; + this.colindex = 0; + this.colspan = 1; + + } + /** + * + * @param rowindex + * @param colindex + */ + public GenTableCell(int rowindex, int colindex, int cellWidth, int colspan) { + super(); + this.rowindex = rowindex; + this.colindex = colindex; + this.colspan = colspan; + this.cellWidth = cellWidth; + } + /** + * + * @return + */ + public int getWidth() { + return cellWidth; + } + /** + * + * @param width + */ + public void setWidth(int width) { + this.cellWidth = width; + } + /** + * + * @return + */ + public int getHeight() { + return cellHeight; + } + /** + * + * @param height + */ + public void setHeight(int height) { + this.cellHeight = height; + } + /** + * + * @return + */ + public int getRowindex() { + return rowindex; + } + /** + * + * @param rowindex + */ + public void setRowindex(int rowindex) { + this.rowindex = rowindex; + } + /** + * + * @return + */ + public int getColindex() { + return colindex; + } + /** + * + * @param colindex + */ + public void setColindex(int colindex) { + this.colindex = colindex; + } + /** + * + * @return + */ + public boolean isSelected() { + return selected; + } + /** + * + * @param selected + */ + public void setSelected(boolean selected) { + this.selected = selected; + } + /** + * + * @return + */ + public int getColspan() { + return colspan; + } + /** + * + * @param colspan + */ + public void setColspan(int colspan) { + this.colspan = colspan; + } + public int getCellWidth() { + return cellWidth; + } + public void setCellWidth(int cellWidth) { + this.cellWidth = cellWidth; + } + public int getCellHeight() { + return cellHeight; + } + public void setCellHeight(int cellHeight) { + this.cellHeight = cellHeight; + } + +} + + diff --git a/src/main/java/org/gcube/portlets/user/reportgenerator/client/targets/GenericTable.java b/src/main/java/org/gcube/portlets/user/reportgenerator/client/targets/GenericTable.java new file mode 100644 index 0000000..10e2d78 --- /dev/null +++ b/src/main/java/org/gcube/portlets/user/reportgenerator/client/targets/GenericTable.java @@ -0,0 +1,145 @@ +package org.gcube.portlets.user.reportgenerator.client.targets; + +import java.util.ArrayList; + +import org.gcube.portlets.d4sreporting.common.shared.SerializableTable; +import org.gcube.portlets.d4sreporting.common.shared.TableCell; +import org.gcube.portlets.user.reportgenerator.client.Presenter.Presenter; + +import com.google.gwt.user.client.ui.Button; +import com.google.gwt.user.client.ui.Composite; +import com.google.gwt.user.client.ui.FlexTable; +import com.google.gwt.user.client.ui.VerticalPanel; + +/** + * + * @author Massimiliano Assante ISTI-CNR + * @version 1.0 + * + */ +public class GenericTable extends Composite { + private VerticalPanel myPanel; + private FlexTable myTable; + + Presenter presenter; + + private int rows; + private int cols; + + private int cellWidth; + private int cellSpacing = 1; + private int cellPadding = 0; + + private GenTableCell selectedCell = null; + + /** + * constructor called when reading the model + * @param sTable + */ + public GenericTable(SerializableTable sTable, Presenter presenter, int top, int left, int width, int height) { + + commonConstructorCode(presenter); + this.rows = sTable.getRowCount(); + this.cols = sTable.getColsNo(); + + /** + * construct the table + */ + for (int i = 0; i < rows; i++) { + for (int j = 0; j < sTable.getCellCount(i); j++) { + TableCell toPut = sTable.getValue(i, j); + int cellWidth = toPut.getCellWidth(); + int cellHeight = toPut.getCellHeight(); + int colspan = toPut.getColspan(); + GenTableCell toAdd = new GenTableCell(i, j, cellWidth, colspan); + toAdd.setText(toPut.getContent()); + toAdd.setStyleName("tableBorder"); + toAdd.setWidth(""+cellWidth+"px"); + myTable.setWidget(i, j, toAdd); + myTable.getFlexCellFormatter().setColSpan(i, j, colspan); + } + } + + myPanel = new VerticalPanel(); + myPanel.setWidth(width+"px"); + myPanel.setStyleName("d4sFrame"); + myPanel.add(myTable); + initWidget(myPanel); + } + /** + * common Constructors Code + */ + private void commonConstructorCode(Presenter presenter) { + this.presenter = presenter; + myTable= new FlexTable(); + myTable.setWidth("90%"); + myTable.setCellSpacing(cellSpacing); + myTable.setCellPadding(cellPadding); + + } + + + public FlexTable getMyTable() { + return myTable; + } + + public void setMyTable(FlexTable myTable) { + this.myTable = myTable; + } + + public int getRowsNo() { + return rows; + } + + public void setRows(int rows) { + this.rows = rows; + } + + public int getCols() { + return cols; + } + + public void setCols(int cols) { + this.cols = cols; + } + + /** + * + * @return + */ + public SerializableTable getSerializable() { + SerializableTable toReturn = new SerializableTable(this.cols); + for (int i = 0; i < myTable.getRowCount(); i++) { + toReturn.addRow(getRow(i)); + } + + return toReturn; + } + + public ArrayList getRow(int i) { + ArrayList toReturn = new ArrayList(); + for (int j = 0; j < myTable.getCellCount(i); j++) { + GenTableCell tb = (GenTableCell) myTable.getWidget(i, j); + int colspan = tb.getColspan(); + + toReturn.add(new TableCell(tb.getText(), colspan, tb.getWidth(), tb.getHeight())); + } + return toReturn; + } + + + public GenTableCell getSelectedCell() { + return selectedCell; + } + + /** + * adda a column at the left of the selected cell of the selected table + * TODO: next version + */ + public void addColumnLeft(int colindex) { + // myTable.insertCell(beforeRow, beforeColumn) + } + + + +} diff --git a/src/main/java/org/gcube/portlets/user/reportgenerator/client/targets/ImageArea.java b/src/main/java/org/gcube/portlets/user/reportgenerator/client/targets/ImageArea.java new file mode 100644 index 0000000..f4b6702 --- /dev/null +++ b/src/main/java/org/gcube/portlets/user/reportgenerator/client/targets/ImageArea.java @@ -0,0 +1,158 @@ +package org.gcube.portlets.user.reportgenerator.client.targets; + + +import org.gcube.portlets.user.reportgenerator.client.Presenter.Presenter; + +import com.google.gwt.core.client.GWT; +import com.google.gwt.user.client.Window; +import com.google.gwt.user.client.ui.Composite; +import com.google.gwt.user.client.ui.Image; +import com.google.gwt.user.client.ui.VerticalPanel; +/** + * ImageArea class is the Widget that goes into the workspace + * + * @author Massimiliano Assante, ISTI-CNR - massimiliano.assante@isti.cnr.it + * @version October 2008 (0.2) + */ +public class ImageArea extends Composite { + + private String templateName; + private String imageName; + + private String currentUser; + private String currentScope; + + VerticalPanel myPanel; + Image myImage = new Image(); + + /** + * Creates an image with a specified URL. The load event will be fired once + * the image at the given URL has been retrieved by the browser. + * + * @param presenter . + * @param param the imageName of the image to be displayed or the URL to be displayed depending on the isURL param + * @param myTemplate the template name that owns the image, useful when template it's saved with another name + * to eventually copy the images in the new template images folder + * @param isURL true if passing a URL, false is passing image name + * @param w width + * @param h height + */ + public ImageArea(Presenter presenter, String param, String myTemplate, boolean isURL, int w, int h) { + myPanel = new VerticalPanel(); + currentUser = presenter.getCurrentUser(); + currentScope = presenter.getCurrentScope(); + //Window.alert("Image Area"); + + if (isURL) { + //need to get the name from the URL + int lastSlash = param.lastIndexOf("/"); + if (lastSlash > -1) { + imageName = param.substring(lastSlash+1, param.length()); + } + else + imageName = param; + this.templateName = "CURRENT_OPEN"; + //Window.alert(param); + myImage.setUrl(param); + + } else { + imageName = param; + this.templateName = myTemplate; + + String imgURL = getImageURL(imageName, "CURRENT_OPEN"); + + + myImage.setUrl(imgURL); + } + myImage.setPixelSize(w, h); + myPanel.setStyleName("d4sFrame"); + myPanel.add(myImage); + initWidget(myPanel); + } + + /** + * + * @return . + */ + public String getUrl() { + return myImage.getUrl(); + } + + /** + * return a URL which is lookable for on the web + * @param imageName . + * @param templateName . + * @return . + */ + public String getImageURL(String imageName, String templateName) { + + + /** + * Images will be stored under webapps/usersArea... + * GWT.getModuleBaseURL() returns * e.g. http://dlib28.isti.cnr.it/templatecreator/html/ + * need to get just http://dlib28.isti.cnr.it/ + */ + //remove "/html/" and get e.g. http://dlib28.isti.cnr.it/templatecreator + String host = GWT.getModuleBaseURL().substring(0, GWT.getModuleBaseURL().length()-6); + + //loog for last slash + int lastSlash = host.lastIndexOf("/"); + + //get what i need : e.g. http://dlib28.isti.cnr.it/ or host = "http://localhost:8080/"; + host = host.substring(0, lastSlash +1 ); + //host = "http://localhost:8080/"; + + String imgURL = host + "usersArea/" + currentScope + "/templates/" + + currentUser + "/" + "CURRENT_OPEN" + "/images/" + imageName; + GWT.log(imgURL); + return imgURL; + } + /** + * + * @return a string containing the owner template name + */ + public String getTemplateName() { + return templateName; + } + + /** + * + * @param myTemplate the template owner + */ + public void setTemplateName(String myTemplate) { + this.templateName = myTemplate; + } + + /** + * + * @return . + */ + public String getImageName() { + return imageName; + } + + /** + * + * @param imageName . + */ + public void setImageName(String imageName) { + this.imageName = imageName; + } + /** + * + * @return the scope in which the application is running on + */ + public String getCurrentScope() { + return currentScope; + } + + /** + * + * @return the user username who is using the application + */ + public String getCurrentUser() { + return currentUser; + } + + +} diff --git a/src/main/java/org/gcube/portlets/user/reportgenerator/client/targets/ReportTextArea.java b/src/main/java/org/gcube/portlets/user/reportgenerator/client/targets/ReportTextArea.java new file mode 100644 index 0000000..6683054 --- /dev/null +++ b/src/main/java/org/gcube/portlets/user/reportgenerator/client/targets/ReportTextArea.java @@ -0,0 +1,260 @@ +package org.gcube.portlets.user.reportgenerator.client.targets; + +import org.gcube.portlets.d4sreporting.common.client.ComponentType; +import org.gcube.portlets.d4sreporting.common.client.ImageConstants; +import org.gcube.portlets.user.reportgenerator.client.Presenter.Presenter; +import org.gcube.portlets.user.reportgenerator.client.dialog.CommentDialog; + +import com.google.gwt.event.dom.client.ClickEvent; +import com.google.gwt.event.dom.client.ClickHandler; +import com.google.gwt.user.client.ui.AbsolutePanel; +import com.google.gwt.user.client.ui.Composite; +import com.google.gwt.user.client.ui.HasHorizontalAlignment; +import com.google.gwt.user.client.ui.HorizontalPanel; +import com.google.gwt.user.client.ui.Image; +import com.google.gwt.user.client.ui.VerticalPanel; + + +/** + * ReportTextArea class represent the generic Widget that can be placed in the UI Component + * + * @author Massimiliano Assante, ISTI-CNR - massimiliano.assante@isti.cnr.it + * @version July 2011 (3.0) + */ +public class ReportTextArea extends Composite { + + /** + * the allowance when mouse cursor is on borders + */ + public final int DELTA = 7; + + + /** + * variables of the components + */ + protected int left, top, width, height; + + /** + * the controller instance of the widget + */ + private Presenter presenter; + + private ComponentType type; + + protected AbsolutePanel mainPanel; + + protected HorizontalPanel topPanel; + + protected VerticalPanel resizablePanel; + + protected Image commentImage; + /** + * + * @return . + */ + public VerticalPanel getResizablePanel() { + return resizablePanel; + } + protected ReportTextArea myInstance; + + /** + * default constructor + * + */ + public ReportTextArea() { + super(); + } + + /** + * + * @param presenter . + * @param left left + * @param top top + * @param width . + * @param height . + * @param type a + */ + public ReportTextArea(ComponentType type, final Presenter presenter, int left, int top, int width, int height, boolean hasComments) { + myInstance = this; + + + this.type = type; + this.presenter = presenter; + this.left = left; + this.top = top; + this.width = width; + this.height = height; + + mainPanel = new AbsolutePanel(); + + topPanel = new HorizontalPanel(); + resizablePanel = new VerticalPanel(); + + mainPanel.setPixelSize(width, height); + + topPanel.setPixelSize(30, 15); + resizablePanel.setPixelSize(width, height); + + commentImage = new Image((hasComments) ? ImageConstants.IMAGE_COMMENTS : ImageConstants.IMAGE_COMMENTS_GRAY); + commentImage.setTitle("Show user comments"); + topPanel.add(commentImage); + + commentImage.setStyleName("selectable"); + commentImage.addClickHandler(new ClickHandler() { + public void onClick(ClickEvent event) { + String previousComments = ""; + int commentHeight = -1; + previousComments = presenter.getComponentComments(myInstance).getComment(); + commentHeight = presenter.getComponentComments(myInstance).getAreaHeight(); + CommentDialog dlg = new CommentDialog(presenter.getEventBus(), myInstance, presenter.getCurrentUser(), previousComments, commentHeight); + dlg.setPopupPosition(commentImage.getAbsoluteLeft()+20, commentImage.getAbsoluteTop()); + dlg.show(); + } + }); + + topPanel.setHorizontalAlignment(HasHorizontalAlignment.ALIGN_RIGHT); + + mainPanel.add(resizablePanel, 0, 0); + mainPanel.add(topPanel, width-18, 0); + mainPanel.setStyleName("d4sFrame"); + initWidget(mainPanel); + } + + + /** + * + * @return . + */ + public ComponentType getType() { + return type; + } + + /** + * + * @param type . + */ + public void setType(ComponentType type) { + this.type = type; + } + + + /** + * used to resize the panel + * @param width w + * @param height h + */ + public void resizePanel(int width, int height) { + if (height > 15 && width > 15) { + mainPanel.setPixelSize(width, height); + resizablePanel.setPixelSize(width, height); + mainPanel.setWidgetPosition(topPanel, width-15, 0); + } + } + + + /*** + * + * @param height g + */ + public void setHeight(int height) { + + if (height > this.height) { + mainPanel.setHeight(""+(height+20)); + resizablePanel.setHeight(""+(height+20)); + mainPanel.setWidgetPosition(topPanel, width-15, 0); + } + + } + /** + * + * @param left . + * @param top . + */ + public void repositionMyPanel(int left, int top) { + //mainPanel.setWidgetPosition(resizablePanel, left, top); + } + + + /** + * @return . + */ + public int getLeft() { + return left; + } + + + /** + * + * @param left . + */ + public void setLeft(int left) { + this.left = left; + } + + /** + * + * @return -. + */ + public int getTop() { + return top; + } + + /** + * + * @param top . + */ + public void setTop(int top) { + this.top = top; + } + + /** + * + * @return the controller instance of the widget + */ + public Presenter getController() { + return presenter; + } + + + /** + * + * @return . + */ + public ReportTextArea getMyInstance() { + return myInstance; + } + + /** + * + * @param myInstance . + */ + public void setMyInstance(ReportTextArea myInstance) { + this.myInstance = myInstance; + } + + public void removeCommentView() { + commentImage.setUrl(ImageConstants.IMAGE_COMMENTS_GRAY); + } + public void addCommentView() { + commentImage.setUrl(ImageConstants.IMAGE_COMMENTS); + } + + public void showComment(String comment) { +// final Window window = new Window(); +// window.setTitle(""); +// window.setMaximizable(true); +// window.setResizable(true); +// window.setLayout(new FitLayout()); +// window.setWidth(200); +// window.setHeight(100); +// window.setModal(false); +// +// Panel windowPanel = new Panel(); +// windowPanel.setBaseCls("comment-popup"); +// windowPanel.setHtml(comment); +// windowPanel.setShadow(true); +// window.add(windowPanel); +// window.setPosition(commentImage.getAbsoluteLeft()+25, commentImage.getAbsoluteTop()); +// window.show(); + } +} diff --git a/src/main/java/org/gcube/portlets/user/reportgenerator/client/targets/TSArea.java b/src/main/java/org/gcube/portlets/user/reportgenerator/client/targets/TSArea.java new file mode 100644 index 0000000..aad5dc5 --- /dev/null +++ b/src/main/java/org/gcube/portlets/user/reportgenerator/client/targets/TSArea.java @@ -0,0 +1,314 @@ +package org.gcube.portlets.user.reportgenerator.client.targets; + +import java.util.LinkedList; +import java.util.List; + +import org.gcube.portlets.d4sreporting.common.shared.SerializableTSFilter; +import org.gcube.portlets.d4sreporting.common.shared.SerializableTSinfo; +import org.gcube.portlets.d4sreporting.common.shared.SerializableTable; +import org.gcube.portlets.d4sreporting.common.shared.SerializableTimeSeries; +import org.gcube.portlets.user.reportgenerator.client.ReportGenerator; +import org.gcube.portlets.user.reportgenerator.client.Presenter.Presenter; +import org.gcube.portlets.user.reportgenerator.client.dialog.TimeSeriesDialog; +import org.gcube.portlets.user.reportgenerator.client.dialog.TimeSeriesFilter; +import org.gcube.portlets.user.reportgenerator.client.dialog.TimeSeriesSampleDialog; +import org.gcube.portlets.user.workspace.client.workspace.GWTWorkspaceItem; +import org.gcube.portlets.user.workspace.client.workspace.folder.item.GWTTimeSeries; + +import com.extjs.gxt.ui.client.widget.Composite; +import com.extjs.gxt.ui.client.widget.VerticalPanel; +import com.google.gwt.core.client.GWT; +import com.google.gwt.event.dom.client.ClickEvent; +import com.google.gwt.event.dom.client.ClickHandler; +import com.google.gwt.user.client.Window; +import com.google.gwt.user.client.rpc.AsyncCallback; +import com.google.gwt.user.client.ui.Button; +import com.google.gwt.user.client.ui.FlexTable; +import com.google.gwt.user.client.ui.Grid; +import com.google.gwt.user.client.ui.HTML; +import com.google.gwt.user.client.ui.HorizontalPanel; +import com.google.gwt.user.client.ui.Label; + + + +/** + * TSArea class is a Widget you can drop a Workspace Time Series on + * + * @author Massimiliano Assante, ISTI-CNR - massimiliano.assante@isti.cnr.it + * @version July 2011 (3.0) + */ +public class TSArea extends Composite { + + private VerticalPanel mainPanel; + private SerializableTimeSeries sts = new SerializableTimeSeries(); + private String idInBasket; + private Presenter presenter; + private FlexTable flexTable; + private TSArea singleton; + + VerticalPanel tableContainer = new VerticalPanel(); + Grid metadata = new Grid(3, 2); + + Label label; + /** + * @param presenter . + * @param width . + * @param height . + * @param sts the time series + */ + public TSArea(Presenter presenter, int width, int height, SerializableTimeSeries sts) { + singleton = this; + this.presenter = presenter; + mainPanel = new VerticalPanel(); + //setElement(mainPanel.getElement()); + + mainPanel.setStyleName("timeseriesArea"); + mainPanel.addStyleName("timeseriesArea_bg"); + mainPanel.setWidth(width); + mainPanel.setHeight(height); + + mainPanel.add(new HTML(" ", true)); + this.sts = sts; + if (sts != null) { + if (sts.getTsMetadata() != null) { + showTS(sts.getTsMetadata()); + } + } + initComponent(mainPanel); + mainPanel.layout(true); + } + + + /** + * called when dropped a TS on the area + * @param toShow the TS to show + */ + public void showTS(SerializableTSinfo toShow) { + mainPanel.removeAll(); + mainPanel.removeStyleName("timeseriesArea_bg"); + tableContainer.removeAll(); + + metadata.setWidget(0, 0, new HTML("TS name:", true)); + metadata.setWidget(0, 1, new HTML(toShow.getTitle())); + metadata.setWidget(1, 0, new HTML("Creation Date: ", true)); + metadata.setWidget(1, 1, new HTML(toShow.getTimeSeriesCreationDate())); + metadata.setWidget(2, 0, new HTML("Total rows:", true)); + metadata.setWidget(2, 1, new HTML(""+toShow.getDimension())); + + + List headers = toShow.getHeaderLabels(); + flexTable = new FlexTable(); + + int n = (headers.size() > 10) ? 10 : headers.size(); + + for (int i = 0; i < n ; i++) { + flexTable.getCellFormatter().setStyleName(0, i, "timeSeries_header"); + flexTable.setWidget(0, i, new HTML(headers.get(i))); + flexTable.setWidget(1, i, new HTML("..")); + flexTable.getCellFormatter().setStyleName(1, i, "timeSeries_td"); + } + if (headers.size() > 10) { + flexTable.setWidget(0, 11, new HTML(" more ..")); + flexTable.setWidget(1, 11, new HTML("..")); + flexTable.getCellFormatter().setStyleName(0, 11, "timeSeries_header"); + flexTable.getCellFormatter().setStyleName(1, 11, "timeSeries_td"); + } + + tableContainer.add(flexTable); + + mainPanel.add(metadata); + mainPanel.add(tableContainer); + + Button moreDetails = new Button("View Timeseries Metadata"); + Button filter = new Button("Filter Table"); + Button showSample = new Button("Show Sample"); + + HorizontalPanel buttonsPanel = new HorizontalPanel(); + buttonsPanel.setSpacing(5); + buttonsPanel.add(moreDetails); + buttonsPanel.add(filter); + buttonsPanel.add(showSample); + + mainPanel.add(buttonsPanel); + + moreDetails.addClickHandler(viewMetadataTS); + showSample.addClickHandler(showTSSample); + filter.addClickHandler(applyFilterTs); + + //TODO: check this + presenter.storeChangeInSession(this); + mainPanel.layout(true); + } + + ClickHandler viewMetadataTS = new ClickHandler() { + public void onClick(ClickEvent event) { + TimeSeriesDialog dlg = new TimeSeriesDialog(sts.getTsMetadata()); + dlg.setAnimationEnabled(true); + dlg.show(); + } + + }; + + ClickHandler applyFilterTs = new ClickHandler() { + + public void onClick(ClickEvent event) { + TimeSeriesFilter dlg = new TimeSeriesFilter(singleton, sts); + //dlg.setPopupPosition(sender.getAbsoluteLeft(), sender.getAbsoluteTop()); + dlg.setAnimationEnabled(true); + dlg.show(); + } + + }; + + ClickHandler showTSSample = new ClickHandler() { + public void onClick(ClickEvent event) { + presenter.getModel().getModelService().getSampleTimeSeries(sts, new AsyncCallback() { + public void onFailure(Throwable caught) { Window.alert("There were Problem contacting Server, please try later");} + + public void onSuccess(SerializableTable result) { + SerializableTable toPass = result; + TimeSeriesSampleDialog dlg = new TimeSeriesSampleDialog(toPass); + dlg.setAnimationEnabled(true); + dlg.show(); + } + }); + } + }; + /** + * + * @param droppedTS the dropped timeseries + */ + public void dropTS(GWTTimeSeries droppedTS) { + idInBasket = droppedTS.getId(); + SerializableTSinfo tsMetadata = convertWSTS2SerialazableTS(droppedTS); + sts = new SerializableTimeSeries(null, tsMetadata); + GWT.log("showTS TS"); + showTS(tsMetadata); + } + + public void fetchTS(String identifier, boolean isInteralImage, boolean fullDetails) { + GWT.log("FETCH TS"); + this.mask("fetching TimeSeries, pleas wait", "loading-indicator"); + + ReportGenerator.get().getWSTreeService().getTimeSeriesById(identifier, new AsyncCallback() { + public void onSuccess(GWTWorkspaceItem result) { + unmask(); + GWTTimeSeries ts = (GWTTimeSeries) result; + dropTS(ts); + } + public void onFailure(Throwable caught) { + unmask(); + Window.alert("Could not fetch Time Series from infrastructure " + caught.getCause()); + } + }); + } + + /** + * converts the WorkSpace TS Object into a Report TS Object + * @param md the TS metadata to convert + * @return + */ + private SerializableTSinfo convertWSTS2SerialazableTS(GWTTimeSeries md) { + SerializableTSinfo tsMetadata = new SerializableTSinfo(md.getId(), md.getName(), md.getDescription(), md.getOwner(), + md.getCreationTime(), md.getLastModificationTime(), md.getTimeSeriesId(), md.getTitle(), md.getCreator(), + md.getTimeSeriesDescription(), md.getTimeSeriesCreationDate(), + md.getPublisher(), md.getSourceId(), md.getSourceName(), md.getRights(), md.getDimension(), md.getHeaderLabels()); + + return tsMetadata; + } + + /** + * refresh the headers once the TS has been filtered + */ + public void refreshHeaders() { + tableContainer.removeAll(); + flexTable = new FlexTable(); + + List filteredHeaders = new LinkedList(); + SerializableTSFilter tf = sts.getFilter(); + + for (Integer colNo : tf.getColsNumberToShow()) { + String toAdd = sts.getTsMetadata().getHeaderLabels().get(colNo); + filteredHeaders.add(toAdd); + } + + + int n = (filteredHeaders.size() > 10) ? 10 : filteredHeaders.size(); + + for (int i = 0; i < n ; i++) { + flexTable.getCellFormatter().setStyleName(0, i, "timeSeries_header"); + flexTable.setWidget(0, i, new HTML(filteredHeaders.get(i))); + flexTable.setWidget(1, i, new HTML("..")); + flexTable.getCellFormatter().setStyleName(1, i, "timeSeries_td"); + } + if (filteredHeaders.size() > 10) { + flexTable.setWidget(0, 11, new HTML(" more ..")); + flexTable.setWidget(1, 11, new HTML("..")); + flexTable.getCellFormatter().setStyleName(0, 11, "timeSeries_header"); + flexTable.getCellFormatter().setStyleName(1, 11, "timeSeries_td"); + } + + tableContainer.add(flexTable); + Grid newGrid = new Grid(1, 2); + newGrid.setWidget(0, 0, new HTML("Selected Interval: ", true)); + newGrid.setWidget(0, 1, new HTML(tf.getFrom() + " - " + tf.getTo() )); + tableContainer.add(newGrid); + + } + /** + * + * @return the possible content + */ + public Label getLabel() { + return label; + } + + /** + * + * @param label set the label + */ + public void setLabel(Label label) { + this.label = label; + } + + + /** + * + * @return . + */ + public String getIdInBasket() { + return idInBasket; + } + + /** + * + * @param idInBasket . + */ + public void setIdInBasket(String idInBasket) { + this.idInBasket = idInBasket; + } + + /** + * + * @return . + */ + public SerializableTimeSeries getSts() { + return sts; + } + + /** + * + * @param sts . + */ + public void setSts(SerializableTimeSeries sts) { + this.sts = sts; + } + + /** + * + * @param tsf the new ts filter + */ + public void setNewFilter(SerializableTSFilter tsf) { + this.sts.setFilter(tsf); + } +} diff --git a/src/main/java/org/gcube/portlets/user/reportgenerator/client/toursteps/Intro.java b/src/main/java/org/gcube/portlets/user/reportgenerator/client/toursteps/Intro.java new file mode 100644 index 0000000..01a2c47 --- /dev/null +++ b/src/main/java/org/gcube/portlets/user/reportgenerator/client/toursteps/Intro.java @@ -0,0 +1,26 @@ +/** + * + */ +package org.gcube.portlets.user.reportgenerator.client.toursteps; + +import com.google.gwt.core.client.GWT; +import com.google.gwt.dom.client.Element; +import com.google.gwt.uibinder.client.UiBinder; +import com.google.gwt.user.client.ui.HTML; + +/** + * @author massi + * + */ +public class Intro extends HTML { + + private static IntroUiBinder uiBinder = GWT.create(IntroUiBinder.class); + + interface IntroUiBinder extends UiBinder { + } + + public Intro() { + setHTML(uiBinder.createAndBindUi(this).getInnerHTML()); + } + +} diff --git a/src/main/java/org/gcube/portlets/user/reportgenerator/client/toursteps/Intro.ui.xml b/src/main/java/org/gcube/portlets/user/reportgenerator/client/toursteps/Intro.ui.xml new file mode 100644 index 0000000..9df30c6 --- /dev/null +++ b/src/main/java/org/gcube/portlets/user/reportgenerator/client/toursteps/Intro.ui.xml @@ -0,0 +1,31 @@ + + + + /* Add CSS here. See the GWT docs on UI Binder for more details */ + .important { + font-weight: bold; + } + +
+ +
+
+ gCube Reporting + allows users to create Reports and generate different + export formats + (OpenXML, HTML, PDF) based on results retrieved from the + infrastructure. +
+
+ gCube Templates are loaded by this + gCube Report Generator + to produce actual reports. +
+
+ Discover + gCube Reporting features through this quick tour. +
+
+
+
\ No newline at end of file diff --git a/src/main/java/org/gcube/portlets/user/reportgenerator/server/portlet/ReportGeneratorPortlet.java b/src/main/java/org/gcube/portlets/user/reportgenerator/server/portlet/ReportGeneratorPortlet.java new file mode 100644 index 0000000..e9d3052 --- /dev/null +++ b/src/main/java/org/gcube/portlets/user/reportgenerator/server/portlet/ReportGeneratorPortlet.java @@ -0,0 +1,44 @@ + +package org.gcube.portlets.user.reportgenerator.server.portlet; + +import javax.portlet.GenericPortlet; +import javax.portlet.ActionRequest; +import javax.portlet.PortletSession; +import javax.portlet.RenderRequest; +import javax.portlet.ActionResponse; +import javax.portlet.RenderResponse; +import javax.portlet.PortletException; +import java.io.IOException; +import javax.portlet.PortletRequestDispatcher; + +import org.gcube.portal.custom.scopemanager.scopehelper.ScopeHelper; + +import com.liferay.portal.PortalException; +import com.liferay.portal.SystemException; +import com.liferay.portal.model.User; +import com.liferay.portal.service.UserLocalServiceUtil; + +/** + * ReportGeneratorPortlet Portlet Class + * @author massi + */ +public class ReportGeneratorPortlet extends GenericPortlet { + + public void doView(RenderRequest request, RenderResponse response) + throws PortletException, IOException { + + ScopeHelper.setContext(request); + + PortletRequestDispatcher dispatcher = + getPortletContext().getRequestDispatcher("/WEB-INF/jsp/ReportGeneratorPortlet_view.jsp"); + dispatcher.include(request, response); + + } + + + public void processAction(ActionRequest request, ActionResponse response) + throws PortletException, IOException { + + } + +} diff --git a/src/main/java/org/gcube/portlets/user/reportgenerator/server/servlet/DocLibraryUtil.java b/src/main/java/org/gcube/portlets/user/reportgenerator/server/servlet/DocLibraryUtil.java new file mode 100644 index 0000000..bfd8e54 --- /dev/null +++ b/src/main/java/org/gcube/portlets/user/reportgenerator/server/servlet/DocLibraryUtil.java @@ -0,0 +1,311 @@ +package org.gcube.portlets.user.reportgenerator.server.servlet; + +import java.io.InputStream; +import java.util.ArrayList; +import java.util.List; + +import org.gcube.application.framework.core.session.ASLSession; +import org.gcube.common.core.utils.logging.GCUBELog; +import org.gcube.portal.custom.communitymanager.OrganizationsUtil; +import org.gcube.portlets.admin.wfdocslibrary.shared.PermissionType; +import org.gcube.portlets.admin.wfdocslibrary.shared.Step; +import org.gcube.portlets.admin.wfdocslibrary.shared.WfRole; + +import com.liferay.portal.kernel.exception.PortalException; +import com.liferay.portal.kernel.exception.SystemException; +import com.liferay.portal.model.Organization; +import com.liferay.portal.model.ResourceConstants; +import com.liferay.portal.model.Role; +import com.liferay.portal.model.User; +import com.liferay.portal.service.CompanyLocalServiceUtil; +import com.liferay.portal.service.OrganizationLocalServiceUtil; +import com.liferay.portal.service.PermissionLocalServiceUtil; +import com.liferay.portal.service.ResourceLocalServiceUtil; +import com.liferay.portal.service.ServiceContext; +import com.liferay.portal.service.UserLocalServiceUtil; +import com.liferay.portlet.documentlibrary.NoSuchFolderException; +import com.liferay.portlet.documentlibrary.model.DLFileEntry; +import com.liferay.portlet.documentlibrary.model.DLFolder; +import com.liferay.portlet.documentlibrary.service.DLFileEntryLocalServiceUtil; +import com.liferay.portlet.documentlibrary.service.DLFolderLocalServiceUtil; + +public class DocLibraryUtil { + + public static final String WORKFLOWS_FOLDER = "Workflow Documents"; + /** + * + */ + private static GCUBELog log = new GCUBELog(DocLibraryUtil.class); + + /** + * write the Report File (payload) into Liferay DocLibrary in the workflowdocs folder + * @param roles + * @param start each Step contains a Map> that is needed in the writeFileIntoDocLibrary + * @param fileName + * @param buffer the payload as byte array + */ + public static boolean writeFileIntoDocLibrary(ASLSession session, List roles, Step start, String fileName, byte[] buffer) { + long docfolderid = -1; + try { + docfolderid = getWfFolder(session); + long userId = getUserId(session); + //write the file into doclib + DLFileEntry fileEntry = DLFileEntryLocalServiceUtil.addFileEntry( + userId, + getGroupID(session), + docfolderid, + fileName, + fileName, + "workflow document", + "", + "", + buffer, + new ServiceContext()); + log.debug("Wrote file into DocumentLibrary"); + + + + //get the file entry resource id + long resourceId = ResourceLocalServiceUtil.getResource(fileEntry.getCompanyId(), + DLFileEntry.class.getName(), ResourceConstants.SCOPE_INDIVIDUAL, String.valueOf(fileEntry.getFileEntryId())).getResourceId(); + + //set the permission on the file for each role + for (Role role : roles) { + String[] actionIds = getPermissionsFromWfStep(role, start); + PermissionLocalServiceUtil.setRolePermissions(role.getRoleId(), actionIds, resourceId); + log.debug("set the permissions for Role: " + role.getName()); + } + } catch (Exception e) { + e.printStackTrace(); + return false; + } + log.debug(" WROTE INTO DOCsLib and ADDING permissions for name: " + fileName); + return true; + } + + public static DLFileEntry updateFileIntoDocLibrary(ASLSession session, String workflowid, byte[] buffer) { + long docfolderid = -1; + DLFileEntry fileEntry = null; + try { + fileEntry = getFileEntry(session, workflowid); + docfolderid = getWfFolder(session); + long userId = getUserId(session); + + String fileName = fileEntry.getTitle(); + log.debug("Update file into DocumentLibrary with Name: " + fileName); + + DLFileEntryLocalServiceUtil.updateFileEntry( + userId, + getGroupID(session), + docfolderid, + fileEntry.getName(), + fileEntry.getName(), + fileName, + fileEntry.getDescription(), + "", + true, + "", + buffer, + new ServiceContext()); + + log.debug("Update file into DocumentLibrary"); + } catch (Exception e) { + e.printStackTrace(); + return null; + } + return fileEntry; + } + + public static boolean deleteFileFromDocLibrary(ASLSession session, String workflowid) { + DLFileEntry fileEntry = null; + try { + fileEntry = getFileEntry(session, workflowid); + DLFileEntryLocalServiceUtil.deleteDLFileEntry(fileEntry); + log.debug("Deleted"); + } catch (Exception e) { + e.printStackTrace(); + return false; + } + return true; + } + /** + * + * @param session + * @param workflowid + * @return + * @throws Exception + * @throws SystemException + * @throws PortalException + */ + public static InputStream getFileEntryAsStream(ASLSession session, String workflowid) throws Exception { + String titleWithExtension = workflowid+".zip"; + + DLFileEntry fileEntry = DLFileEntryLocalServiceUtil.getFileEntryByTitle(getGroupID(session), getWfFolder(session), + titleWithExtension); + + return DLFileEntryLocalServiceUtil.getFileAsStream(fileEntry.getCompanyId(), + getUserId(session), getGroupID(session), getWfFolder(session), fileEntry.getName()); + + } + + public static DLFileEntry getFileEntry(ASLSession session, String workflowid) throws PortalException, SystemException, Exception { + String titleWithExtension = workflowid+".zip"; + + return DLFileEntryLocalServiceUtil.getFileEntryByTitle(getGroupID(session), getWfFolder(session), + titleWithExtension); + + } + + /** + * + * @param role is the liferay role, for convention is created as ROLENAME_WFID e.g. EDITOR_123 + * @param step containts the permissions attached to each role (just the name, e.g. EDITOR) + * @return the permissions to apply + */ + public static String[] getPermissionsFromWfStep(Role role, Step step) { + ArrayList toConvert = new ArrayList(); + for (WfRole steprole : step.getPermissions().keySet()) { + System.out.println("Steprole: "+ steprole.getRolename()); + String name = role.getName().split("_")[0]; //e.g. EDITOR <- EDITOR_123 + System.out.println("role Name: "+ name); + if (steprole.getRolename().equals(name)) { + toConvert = step.getPermissions().get(steprole); + } + } + String[] toReturn = new String[toConvert.size()]; + int i = 0; + for (PermissionType p : toConvert) { + toReturn[i] = getLRActionIdFromWfPermissionType(p); + i++; + } + return toReturn; + } + /** + * check the existence of the WFFolder or create it if not exists + * @param session + * @return true is everything goes ok + * @throws PortalException + * @throws SystemException + */ + public static long getWfFolder(ASLSession session) throws Exception { + long parentFolderId = 0; + DLFolder folder = null; + if (! wfFolderExists(session)) { + folder = DLFolderLocalServiceUtil.addFolder(getUserId(session), getGroupID(session), parentFolderId, WORKFLOWS_FOLDER, "Folder for Workflow Documents", new ServiceContext()); + log.debug("Folder for WorkflowDocs created: /" + WORKFLOWS_FOLDER); + } else + folder = DLFolderLocalServiceUtil.getFolder( getGroupID(session), parentFolderId, WORKFLOWS_FOLDER); + return folder.getFolderId(); + } + /** + * + * @param session the ASL Session instance + * @return true if the workflow docs exists + */ + public static boolean wfFolderExists(ASLSession session) { + try { + long groupid = getGroupID(session); + long parentfolder = 0; + if (DLFolderLocalServiceUtil.getFolder(groupid, parentfolder, "Workflow Documents") != null) + return true; + else + return false; + } + catch (NoSuchFolderException ex) { + log.debug("Folder does not exists"); + return false; + } + catch (Exception e) { + e.printStackTrace(); + return false; + } + } + /** + * + * @param session + * @return + * @throws PortalException + * @throws SystemException + */ + public static long getGroupID(ASLSession session) throws PortalException, SystemException { + long organizationid = session.getGroupId(); + Organization myOrg = OrganizationLocalServiceUtil.getOrganization(organizationid); + return myOrg.getGroup().getGroupId(); + } + /** + * + * @return the company webid + * @throws PortalException + * @throws SystemException + */ + public static long getCompanyID() throws PortalException, SystemException { + return OrganizationsUtil.getCompany().getCompanyId(); + } + /** + * + * @param session the ASL Session instance + * @return the list of the root folders + * @throws SystemException . + * @throws PortalException . + */ + public static List getFolders(ASLSession session) throws SystemException, PortalException { + long companyid = getCompanyID(); + List folders = null; + folders = DLFolderLocalServiceUtil.getFolders(companyid); + for (DLFolder folder : folders) { + log.debug("Folder name: " + folder.getName() + " ID: " + folder.getFolderId() + " Parent: " + folder.getParentFolderId() + " Groupid: " + folder.getGroupId()); + } + return folders; + } + + /** + * + * @param session the ASL Session instance + * @return the userid in the liferay system + */ + public static long getUserId(ASLSession session) { + List users = null; + long userId = 0; + try { + users = UserLocalServiceUtil.getUsers(0, UserLocalServiceUtil.getUsersCount()); + } catch (SystemException e) { + e.printStackTrace(); + } + for(User user: users){ + if(user.getScreenName().equalsIgnoreCase(session.getUsername())){ + userId = user.getUserId(); + break; + } + } + return userId; + } + + + /** + * needed to convert Workflows permission into Lifearay permissions (ActionIDs) + * @param type + * @return + */ + private static String getLRActionIdFromWfPermissionType(PermissionType type) { + switch (type) { + case EDIT_PERMISSIONS: + return "PERMISSIONS"; + case VIEW: + return "VIEW"; + case UPDATE: + return "UPDATE"; + case DELETE: + return "DELETE"; + case ADD_DISCUSSION: + return "ADD_DISCUSSION"; + case DELETE_DISCUSSION: + return "DELETE_DISCUSSION"; + case UPDATE_DISCUSSION: + return "UPDATE_DISCUSSION"; + default: + return ""; + } + } + + +} diff --git a/src/main/java/org/gcube/portlets/user/reportgenerator/server/servlet/ImagesUploadServlet.java b/src/main/java/org/gcube/portlets/user/reportgenerator/server/servlet/ImagesUploadServlet.java new file mode 100644 index 0000000..b2d9414 --- /dev/null +++ b/src/main/java/org/gcube/portlets/user/reportgenerator/server/servlet/ImagesUploadServlet.java @@ -0,0 +1,181 @@ +package org.gcube.portlets.user.reportgenerator.server.servlet; + + + + +import java.io.File; +import java.io.IOException; + +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.application.framework.core.session.ASLSession; +import org.gcube.application.framework.core.session.SessionManager; +import org.gcube.common.core.utils.logging.GCUBEClientLog; + +/** + * ImagesUploadServlet class is the server code delgated to receinve the byte stream and store i + * + * @author Massimiliano Assante, ISTI-CNR - massimiliano.assante@isti.cnr.it + * @version October 2008 (0.2) + */ + +public class ImagesUploadServlet extends HttpServlet { + + static GCUBEClientLog _log = new GCUBEClientLog(ImagesUploadServlet.class); + + final String returnOKMessage = "OK"; + + private static final long serialVersionUID = 1L; + + private String currentUser; + + private String currentScope; + + /** + * + * @param message the msg + */ + public static void logger (String message) { + System.out.println("***" + message); + } + /** + * return the user template folder + * @param templateName + * @param currentDL . + * @param currentUser . + * @return . + */ + private String getTemplateFolder(String currentDL, String currentUser) { + _log.debug("getTemplateFolder Method called"); + // platform indipendent slash + String sl = File.separator; + //e.g. /home/massi/workspace/templategen/tomcat/webapps/ROOT + String path = System.getenv("CATALINA_HOME"); + path += sl + "webapps" + sl +"usersArea" + sl + currentDL + + sl + "templates" + sl + currentUser + sl ; + _log.debug("Returning Path= " + path); + return path; + + } + /** + * file upload handler + * @param request . + * @param response . + * @throws ServletException . + * @throws IOException . + */ + + public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { + +// logger("ImagesUploadServlet received:"); +// +// currentUser = getUsername(request); +// currentScope = getVreName(request); +// +// String currTemplateName = request.getParameter("currTemplateName"); +// +// logger("currentUser: "+currentUser); +// logger("currentVRE: "+currentScope); +// logger("currTemplateName: "+currTemplateName); +// logger("CALLING :getTemplateFolder "); +// logger("RETURNED :getTemplateFolder "); +// //platform indipendent slash +// String sl = File.separator; +// String startDirectory = getTemplateFolder(currentScope, currentUser); //e.g. /home/massi/workspace/templategen/tomcat/webapps/ROOT +// int lastSlash = startDirectory.lastIndexOf(sl); +// startDirectory = startDirectory.substring(0, lastSlash); +// +// startDirectory += sl + "CURRENT_OPEN" + sl + "images"; +// +// logger("RETURNED : " + startDirectory); +// logger("WRITING... :"); +// +// String fileName = ""; +// PrintWriter out = response.getWriter(); +// +// if (!ServletFileUpload.isMultipartContent(request)) +// return; +// +// FileItemFactory factory = new DiskFileItemFactory(); +// ServletFileUpload upload = new ServletFileUpload(factory); +// +// List items = null; +// try { +// items = upload.parseRequest(request); +// } +// catch (FileUploadException e) { +// e.printStackTrace(); +// return; +// } +// File uploadedFile = null; +// for (Iterator i = items.iterator(); i.hasNext();) { +// FileItem item = (FileItem) i.next(); +// +// if (item.isFormField()) +// continue; +// fileName = item.getName(); +// if (fileName != null && fileName.compareTo("")!=0) { +// fileName = FilenameUtils.getName(fileName); +// +// uploadedFile = new File(startDirectory + File.separator + fileName); +// try { +// if(!uploadedFile.exists()){ +// File toCreate = new File(startDirectory); +// boolean success = toCreate.mkdirs(); +// if (success) +// Logger.debug("New file \"" + uploadedFile + "\" has been created "); +// } +// item.write(uploadedFile); +// } +// catch (Exception e) { e.printStackTrace(); } +// +// } +// } +// +// out.print(returnOKMessage); +// out.close(); + + } //end service + + /** + * + * @param httpServletRequest . + * @return . + */ + public String getUsername(HttpServletRequest httpServletRequest) { + + HttpSession session = httpServletRequest.getSession(); + String user = (String) session.getAttribute("username"); + if(session.getAttribute("username")== null) + { + user = "massi"; + logger("D4ScienceSession user NULL set to: " + user); + } + logger("D4ScienceSession user: " + user); + + ASLSession d4session = SessionManager.getInstance().getASLSession(session.getId(), user); + d4session.setAttribute("username", user); + return user; + } + + /** + * @param httpServletRequest . + * @return the shared session + */ + public String getVreName(HttpServletRequest httpServletRequest) { + HttpSession session = httpServletRequest.getSession(); + + ASLSession d4session = SessionManager.getInstance().getASLSession(session.getId(), getUsername(httpServletRequest)); + String scope = d4session.getScopeName(); + //need to remove the initial / of the scope + if (scope.charAt(0) == '/') + scope = scope.substring(1, scope.length()); + logger("ImagesUploadServlet SCOPE: " + scope); + //String scope = "gcube/devsec"; + return scope; + } +} diff --git a/src/main/java/org/gcube/portlets/user/reportgenerator/server/servlet/ReportServiceImpl.java b/src/main/java/org/gcube/portlets/user/reportgenerator/server/servlet/ReportServiceImpl.java new file mode 100644 index 0000000..f39eab1 --- /dev/null +++ b/src/main/java/org/gcube/portlets/user/reportgenerator/server/servlet/ReportServiceImpl.java @@ -0,0 +1,1751 @@ +package org.gcube.portlets.user.reportgenerator.server.servlet; + +import java.io.BufferedInputStream; +import java.io.ByteArrayOutputStream; +import java.io.File; +import java.io.FileInputStream; +import java.io.FileNotFoundException; +import java.io.FileOutputStream; +import java.io.IOException; +import java.io.InputStream; +import java.io.ObjectInputStream; +import java.io.OutputStream; +import java.util.ArrayList; +import java.util.Calendar; +import java.util.Date; +import java.util.List; +import java.util.UUID; +import java.util.Vector; + +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpSession; + +import net.sf.csv4j.CSVFileProcessor; +import net.sf.csv4j.CSVLineProcessor; +import net.sf.csv4j.ParseException; +import net.sf.csv4j.ProcessingException; + +import org.apache.commons.io.IOUtils; +import org.gcube.application.framework.accesslogger.library.impl.AccessLogger; +import org.gcube.application.framework.core.session.ASLSession; +import org.gcube.application.framework.core.session.SessionManager; +import org.gcube.applicationsupportlayer.social.ApplicationNotificationsManager; +import org.gcube.applicationsupportlayer.social.NotificationsManager; +import org.gcube.common.core.scope.GCUBEScope.MalformedScopeExpressionException; +import org.gcube.common.core.utils.logging.GCUBEClientLog; +import org.gcube.portal.custom.scopemanager.scopehelper.ScopeHelper; +import org.gcube.portlets.admin.wfdocslibrary.client.WfDocsLibrary; +import org.gcube.portlets.admin.wfdocslibrary.server.db.MyDerbyStore; +import org.gcube.portlets.admin.wfdocslibrary.server.db.Store; +import org.gcube.portlets.d4sreporting.common.client.ComponentType; +import org.gcube.portlets.d4sreporting.common.server.ServiceUtil; +import org.gcube.portlets.d4sreporting.common.shared.SerializableComponent; +import org.gcube.portlets.d4sreporting.common.shared.SerializableModel; +import org.gcube.portlets.d4sreporting.common.shared.SerializableSection; +import org.gcube.portlets.d4sreporting.common.shared.SerializableTable; +import org.gcube.portlets.d4sreporting.common.shared.SerializableTimeSeries; +import org.gcube.portlets.d4sreporting.common.shared.TableCell; +import org.gcube.portlets.docxgenerator.DocxGenerator; +import org.gcube.portlets.user.homelibrary.home.HomeLibrary; +import org.gcube.portlets.user.homelibrary.home.exceptions.HomeNotFoundException; +import org.gcube.portlets.user.homelibrary.home.exceptions.InternalErrorException; +import org.gcube.portlets.user.homelibrary.home.workspace.Workspace; +import org.gcube.portlets.user.homelibrary.home.workspace.WorkspaceFolder; +import org.gcube.portlets.user.homelibrary.home.workspace.WorkspaceItem; +import org.gcube.portlets.user.homelibrary.home.workspace.WorkspaceItemType; +import org.gcube.portlets.user.homelibrary.home.workspace.exceptions.InsufficientPrivilegesException; +import org.gcube.portlets.user.homelibrary.home.workspace.exceptions.ItemAlreadyExistException; +import org.gcube.portlets.user.homelibrary.home.workspace.exceptions.ItemNotFoundException; +import org.gcube.portlets.user.homelibrary.home.workspace.exceptions.WorkspaceFolderNotFoundException; +import org.gcube.portlets.user.homelibrary.home.workspace.folder.FolderItem; +import org.gcube.portlets.user.homelibrary.home.workspace.folder.FolderItemType; +import org.gcube.portlets.user.homelibrary.home.workspace.folder.items.ExternalImage; +import org.gcube.portlets.user.homelibrary.home.workspace.folder.items.Report; +import org.gcube.portlets.user.homelibrary.home.workspace.folder.items.ReportTemplate; +import org.gcube.portlets.user.homelibrary.home.workspace.folder.items.gcube.ImageDocument; +import org.gcube.portlets.user.homelibrary.home.workspace.folder.items.ts.TimeSeries; +import org.gcube.portlets.user.reportgenerator.client.ReportConstants; +import org.gcube.portlets.user.reportgenerator.client.ReportService; +import org.gcube.portlets.user.reportgenerator.client.model.ExportManifestationType; +import org.gcube.portlets.user.reportgenerator.server.servlet.loggers.CreateReportLogEntry; +import org.gcube.portlets.user.reportgenerator.server.servlet.loggers.GenerateReportLogEntry; +import org.gcube.portlets.user.reportgenerator.server.servlet.loggers.OpenReportLogEntry; +import org.gcube.portlets.user.reportgenerator.server.servlet.loggers.OpenWorkflowLogEntry; +import org.gcube.portlets.user.reportgenerator.server.servlet.loggers.SaveWorkflowLogEntry; +import org.gcube.portlets.user.reportgenerator.shared.SessionInfo; + +import com.google.gwt.user.server.rpc.RemoteServiceServlet; +import com.liferay.portal.service.LockLocalServiceUtil; +import com.liferay.portlet.documentlibrary.model.DLFileEntry; + + + +/** + * + * class implementing services + * @author Massimiliano Assante, ISTI-CNR - massimiliano.assante@isti.cnr.it + * @version Feb 2012 (3.3) + */ +@SuppressWarnings("serial") +public class ReportServiceImpl extends RemoteServiceServlet implements ReportService { + + public static GCUBEClientLog logger = new GCUBEClientLog(ReportServiceImpl.class); + /** + * EXPORT DIR + */ + private static final String EXPORTS_DIR = "EXPORTS"; + + /** + * + */ + public static final String USERNAME_ATTRIBUTE = "user"; + /** + * + */ + public static final String GIF = "image/gif"; + /** + * + */ + public static final String PNG = "image/png"; + /** + * + */ + public static final String JPEG = "image/jpeg"; + /** + * + */ + public static final String JPG = "image/jpg"; + /** + * + */ + public static final String TIFF = "image/tiff"; + /** + * + */ + public static final String BMP = "image/bmp"; + + /** + * + */ + public static final String CURRENT_REPORT_ID_ATTRIBUTE = "CURRENT_REPORT_ID_ATTRIBUTE"; + /** + * + */ + public static final String CURRENT_REPORT_INSTANCE = "myReport"; + /** + * + */ + public static final String PREVIOUS_REPORT_INSTANCE = "myPreviousReport"; + + + private String currentHost = ""; + + /** + * the WF DB Store + */ + private Store store; + + + //set to true if wanna test workflow menu mode + boolean testWorkflow = false; + + /** + * Called then servlet is intialized + */ + public void init() { + logger.info("Initializing Servlet ReportServiceImpl..."); + store = new MyDerbyStore(); + } + + /** + * the current ASLSession + * @return . + */ + private ASLSession getASLSession() { + String sessionID = this.getThreadLocalRequest().getSession().getId(); + String user = (String) this.getThreadLocalRequest().getSession().getAttribute(ScopeHelper.USERNAME_ATTRIBUTE); + + + logger.error("Report PORTLET SessionID= " + sessionID); + + if (user == null) { + user = "massimiliano.assante"; + this.getThreadLocalRequest().getSession().setAttribute(ScopeHelper.USERNAME_ATTRIBUTE, user); + SessionManager.getInstance().getASLSession(sessionID, user).setScope("/gcube/devsec"); + } + return SessionManager.getInstance().getASLSession(sessionID, user); + } + /** + * Retrieve the user saved template names + * + * @return a String[] containing the template names + */ + public String[] getUserTemplateNames() { + ServiceUtil myUtil = new ServiceUtil(getASLSession()); + Vector tmp = new Vector(); + String userDir = myUtil.getTemplateFolder(getVreName(), getUsername()); + + logger.debug("userDir: " + userDir); + + File f = new File(userDir); + //checking if dir exists + if (! f.exists()) { + try { + f.mkdirs(); + return new String[0]; + } catch (SecurityException ex) { + return new String[0]; + } + } + else { + File []f2 = f.listFiles(); + for(int i = 0; i < f2.length; i++){ + if(f2[i].isDirectory()) { + tmp.add(f2[i].getName()); + } + } + return tmp.toArray(new String[0]); + } + } + + + /** + * @return a SerializableModel instance of the imported fimes xml + */ + public SerializableModel readImportedModel(String tempPath) { + SerializableModel toConvert = null; + + FileInputStream fis = null; + ObjectInputStream in = null; + + try { + + fis = new FileInputStream(tempPath); + in = new ObjectInputStream(fis); + toConvert = (SerializableModel) in.readObject(); + in.close(); + } catch (IOException ex) { + ex.printStackTrace(); + } catch (ClassNotFoundException ex) { + ex.printStackTrace(); + } + logger.debug("Converting Imported Fimes to Serializable object, num sectionss: " + toConvert.getSections().size()); + return (toConvert); + } + + /** + * @return a SerializableModel instance of the templatename passed as parameter + * @param templateName : the template to read from disk + * @param templateObjectID the id in the basket + * @param isTemplate says if you're opening a template or a report + * @param isImporting says if your importing or youre loading a template in the UI + * + */ + public SerializableModel readModel(String templateName, String templateObjectID, boolean isTemplate, boolean isImporting) { + ServiceUtil myUtil = new ServiceUtil(getASLSession()); + logger.debug("Reading " + templateName); + if (! ReportConstants.isDeployed) { + + SerializableModel toConvert = null; + + FileInputStream fis = null; + ObjectInputStream in = null; + try { + String path = myUtil.getTemplateFolder(getVreName(), getUsername()); + fis = new FileInputStream(path + "CURRENT_OPEN/CURRENT_OPEN.d4st"); + in = new ObjectInputStream(fis); + toConvert = (SerializableModel) in.readObject(); + in.close(); + } catch (IOException ex) { + ex.printStackTrace(); + } catch (ClassNotFoundException ex) { + ex.printStackTrace(); + } + logger.debug("Converting fileToRead to Serializable object"); + return toConvert; + + } else { + + Workspace root = null; + + try { + root = getWorkspaceArea(); + } catch (WorkspaceFolderNotFoundException e) { + e.printStackTrace(); + } catch (InternalErrorException e) { + e.printStackTrace(); + } catch (HomeNotFoundException e) { + e.printStackTrace(); + } + + + + WorkspaceItem item = null; + try { + item = root.getItem(templateObjectID); + if (! isImporting) + storeReportItemIDInSession(templateObjectID); + } catch (ItemNotFoundException e) { + e.printStackTrace(); + } + + logger.debug("getItem: " + templateObjectID); + String zipToExtract = ""; + + if (item.getType() == WorkspaceItemType.FOLDER_ITEM) { + + logger.debug("\nItem is a BASKET_ITEM"); + + FolderItem bi = (FolderItem) item; + boolean fromBasket = false; + + if (isTemplate) { + if (bi.getFolderItemType() == FolderItemType.REPORT_TEMPLATE) { + ReportTemplate zippedTemplate = (ReportTemplate) bi; + String zipFilename = ""; + if (! isTemplate) {//then is a report + zipFilename = templateName + "-report.zip"; //gCube report + logger.debug("********************** Reading report -----------------"); + } + else + zipFilename = templateName + ".zip"; //gCube template + + String zipPath = myUtil.getTemplatePath(templateName, getVreName(), getUsername()); + fromBasket = getTemplateFromBasket(zippedTemplate, zipPath, zipFilename); + zipToExtract = zipPath + zipFilename; + } + } + + if (bi.getFolderItemType() == FolderItemType.REPORT) { + + logger.debug("Item is a REPORT"); + Report zippedTemplate = (Report) bi; + + String zipFilename = ""; + if (! isTemplate) {//then is a report + zipFilename = templateName + "-report.zip"; //d4science template + logger.debug("********************** Reading report -----------------"); + } + else + zipFilename = templateName + ".zip"; //d4science template + + File toDelete = new File(zipFilename); + toDelete.delete(); + + String zipPath = myUtil.getTemplatePath(templateName, getVreName(), getUsername()); + fromBasket = getReportFromBasket(zippedTemplate, zipPath, zipFilename); + zipToExtract = zipPath + zipFilename; + } + + if (bi.getFolderItemType() == FolderItemType.REPORT || bi.getFolderItemType() == FolderItemType.REPORT_TEMPLATE) { + + if (fromBasket) { + File toExtract = new File(zipToExtract); + File outputDir = new File( myUtil.getTemplatePath(templateName, getVreName(), getUsername()) ); + ZipUtil.unzipArchive(toExtract, outputDir); + + String templatePath = myUtil.getTemplatePath(templateName, getVreName(), getUsername()); + + String modelFilename = ""; + try { + modelFilename = seekModel(templatePath, templateName); + } catch (FileNotFoundException e) { e.printStackTrace(); } + + String fileToRead = templatePath + modelFilename + ".d4st" ; + + //TODO: check + // String fileToCheck = templatePath + "gCube-label.d4s" ; //lo deve anche cancellare + // File file2Check = new File(fileToCheck); + // Logger.debug("Checking: " + fileToCheck); + // if (! file2Check.exists()) { + // Logger.debug("Not Found: " + fileToCheck); + // return new SerializableModel(950); + // } else { + // file2Check.delete(); + // } + + + logger.debug("Loading fileToRead from Disk"); + + SerializableModel toReturn = null; + SerializableModel toConvert = null; + + FileInputStream fis = null; + ObjectInputStream in = null; + try { + fis = new FileInputStream(fileToRead); + in = new ObjectInputStream(fis); + toConvert = (SerializableModel) in.readObject(); + in.close(); + } catch (IOException ex) { + ex.printStackTrace(); + } catch (ClassNotFoundException ex) { + ex.printStackTrace(); + } + logger.debug("Converting fileToRead to Serializable object"); + toReturn = (toConvert); + + // changes the template name model + toReturn.setTemplateName(templateName); + + File toDelete1 = new File( myUtil.getTemplatePath(templateName, getVreName(), getUsername())); + boolean deleted1 = toDelete1.delete(); + + + File toDelete2 = new File(zipToExtract); + boolean deleted2 = toDelete2.delete(); + + logger.debug("dirToDelete: " + toDelete1 + " result: " + deleted1 + " \n\n\n"); + + logger.debug("dirToDelete: " + toDelete2 + " result: " + deleted2 + " \n\n\n"); + + //**** IMPORTANT **** + if (! isImporting) { + storeTemplateInSession(toReturn); + logger.debug("storeTemplateInSession DONE"); + } + + AccessLogger log = AccessLogger.getAccessLogger(); + OpenReportLogEntry logEntry = new OpenReportLogEntry(toReturn.getTemplateName(), templateObjectID); + log.logEntry(getASLSession().getUsername(), getASLSession().getScopeName(), logEntry); + + return toReturn; + } + } + logger.error("FAILED TO READ RETURING EMPTY Serializable Template"); + return new SerializableModel(); + } + logger.error("FAILED TO READ FROM BASKET RETURING EMPTY Serializable Template"); + return new SerializableModel(); + } + } + + + + + /** + * handles the case that the user has changed the template name in the basket + * @param templatePath + * @param templateName + * @return + * @throws FileNotFoundException + */ + private String seekModel(String templatePath, String templateName) throws FileNotFoundException { + logger.debug("seekModel: tPath=" + templatePath); + String fileToSeek = templatePath + templateName + ".d4st"; + + File toSeek = new File(fileToSeek); + if (toSeek.exists()) { + logger.debug("seekModel: modelName is the SAME returning"); + return templateName; + } + else { + logger.debug("seekModel: modelName DIFFERENT upgrading"); + File dirToLookIn = new File(templatePath); + File[] innerFiles = dirToLookIn.listFiles(); + for (int i = 0; i < innerFiles.length; i++) + if (innerFiles[i].getName().endsWith(".d4st")) { + String toReturn = innerFiles[i].getName(); + toReturn = toReturn.substring(0, toReturn.length()-5); + logger.debug("seekModel: returning.. =" + toReturn); + return toReturn; + } + } + throw new FileNotFoundException(); + } + + + /** + * get the template instance from the Basket + * @param repTmp + * @return + */ + private boolean getTemplateFromBasket(ReportTemplate repTmp, String pathToFile, String filename) { + try { + File dir = new File(pathToFile); + logger.debug("DIR: " + pathToFile); + if (! dir.exists() ) + dir.mkdirs(); + + File f = new File(pathToFile+filename); + InputStream inputStream = null; + try { + inputStream = repTmp.getData(); + } catch (InternalErrorException e) { + e.printStackTrace(); + return false; + } + + OutputStream out = new FileOutputStream(f); + + byte buf[] = new byte[1024]; + int len; + while((len = inputStream.read(buf))>0) + out.write(buf,0,len); + out.close(); + inputStream.close(); + logger.info("Successfully got ReportTemplate from Basket: " + pathToFile); + return true; + } + catch (IOException e){ + e.printStackTrace(); + return false; + } + } + + + /** + * get the report instance from the Basket + * @param repTmp . + * @param pathToFile the directory where to save the file + * @param filename the filename to give to the newly created file + * @return + */ + private boolean getReportFromBasket(Report repTmp, String pathToFile, String filename) { + try { + File dir = new File(pathToFile); + logger.debug("DIR: " + pathToFile); + if (! dir.exists() ) + dir.mkdirs(); + + File f = new File(pathToFile+filename); + InputStream inputStream = null; + try { + inputStream = repTmp.getData(); + } catch (InternalErrorException e) { + e.printStackTrace(); + return false; + } + + OutputStream out = new FileOutputStream(f); + + byte buf[] = new byte[1024]; + int len; + while((len = inputStream.read(buf))>0) + out.write(buf,0,len); + out.close(); + inputStream.close(); + logger.info("Successfully got ReportTemplate from Basket: " + pathToFile); + return true; + } + catch (IOException e){ + e.printStackTrace(); + return false; + } + } + /** + * + */ + public String generateTempDocx(SerializableModel model) { + + logger.info("Generating docx file"); + DocxGenerator docxGenerator = new DocxGenerator(model); + logger.debug("DocxGenerator instanciated:"); + boolean result = docxGenerator.exportInDocx(model); + logger.trace("RESULT:" + result); + if (! result) + return "ERROR"; + + File docx = null; + try { + docx = docxGenerator.writeOutputTempFile(model.getTemplateName()); + } catch (Exception e) { + e.printStackTrace(); + return "ERROR"; + } + logger.info("Generated docx file: " + docx.getAbsolutePath()); + return docx.getAbsolutePath(); + } + /** + * @param model the model + * @param type the type + * @return true if the generatePDF is successful + */ + public boolean generateManifestation(SerializableModel model, ExportManifestationType type) { + + //in case there are dynamic images need to get the from the HL + importDynamicImagesFromHL(model); + + + //in case there are dynamic TS need to get the CSV from HL and add it to the component + for (SerializableSection section : model.getSections()) { + for (SerializableComponent tc : section.getComponents()) { + if (tc.getType() == ComponentType.TIME_SERIES) { + SerializableTimeSeries sts = (SerializableTimeSeries) tc.getPossibleContent(); + File toPass = getTimeSeriesFromWorkspace(sts); + if (toPass == null) + tc.setPossibleContent(null); + else { + sts.setCsvFile(toPass.getAbsolutePath()); + tc.setPossibleContent(sts); + } + } + } + } + + boolean result = false; + ServiceUtil myUtil = new ServiceUtil(getASLSession()); + logger.info("Generating docx file"); + logger.debug("Model Converted"); + DocxGenerator docxGenerator = new DocxGenerator(model); + logger.info("DocxGenerator instanciated:"); + result = docxGenerator.exportInDocx(model); + logger.trace("RESULT:" + result); + //remove the extension + String exportName = model.getTemplateName(); + if (exportName.endsWith(".d4sT") || exportName.endsWith(".d4sR") ) + exportName = model.getTemplateName().substring(0, model.getTemplateName().length() - 5); + + + if (result) { + switch (type) { + case DOCX: + try { + File docx = docxGenerator.writeOutputTempFile(exportName); + logger.debug("Generated docx file: " + docx.getAbsolutePath()); + + + File toMoveTo = new File(myUtil.getTemplateFolder(getVreName(), getUsername()) + EXPORTS_DIR + File.separator + exportName + ".docx"); + String folder = (myUtil.getTemplateFolder(getVreName(), getUsername()) + EXPORTS_DIR + File.separator); + myUtil.copyFile(docx, toMoveTo, folder); + logger.trace("1 File Copied to " + toMoveTo.getAbsolutePath()); + + String name = exportName+".docx"; + String desc = name; + String mimeType = "application/vnd.openxmlformats-officedocument.wordprocessingml.document"; + saveInWorkSpace(name, desc, mimeType, toMoveTo, type); + + } catch (Exception e) { + e.printStackTrace(); + } + break; + case HTML: + try { + File html = docxGenerator.createHTML(); + logger.info("Generated HTML file: " + html.getAbsolutePath()); + + File toMoveTo = new File(myUtil.getTemplateFolder(getVreName(), getUsername()) + EXPORTS_DIR + File.separator + exportName + ".html"); + String folder = (myUtil.getTemplateFolder(getVreName(), getUsername()) + EXPORTS_DIR + File.separator); + myUtil.copyFile(html, toMoveTo, folder); + logger.trace("1 File Copied to " + toMoveTo.getAbsolutePath()); + + String name = exportName+".html"; + String desc = name; + String mimeType = "text/html"; + saveInWorkSpace(name, desc, mimeType, toMoveTo, type); + + } catch (Exception e) { + e.printStackTrace(); + } + break; + default: + break; + } + } + + + return result; + } + + + /** + * save the manifestation in default folder, overwrites if the file name exists already + * + * @param name the name in the Workspace + * @param desc the desc + * @param mimeType its mimetype + * @param payLoad a File instance + */ + private boolean saveInWorkSpace(String name, String desc, String mimeType, File payLoad, ExportManifestationType type ) { + try { + String defaultBasketID = getDefaultBasket(); + + // Read the pdf input stream + InputStream inputStream = new BufferedInputStream(new FileInputStream(payLoad)); + Workspace wp = getWorkspaceArea(); + WorkspaceFolder toSaveIn = wp.getRoot(); + + if (toSaveIn.exists(name)) { + logger.warn("Item exists already, deleting and creating new one"); + toSaveIn.removeChild(toSaveIn.find(name)); + } + + if (type == ExportManifestationType.PDF) { + wp.createExternalPDFFile(name, name, mimeType, inputStream, defaultBasketID); + } else + wp.createExternalFile(name, name, mimeType, inputStream, defaultBasketID); + + + AccessLogger log = AccessLogger.getAccessLogger(); + GenerateReportLogEntry logEntry = new GenerateReportLogEntry(name, mimeType, type.toString()); + log.logEntry(getASLSession().getUsername(), getASLSession().getScopeName(), logEntry); + + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + + } + + + + /** + * + * @return the shared session + */ + public String getUsername() { + if (! ReportConstants.isDeployed) { + return "massimiliano.assante"; + } else { + HttpServletRequest httpServletRequest = this.getThreadLocalRequest(); + HttpSession session = httpServletRequest.getSession(); + String user = (String) session.getAttribute(ScopeHelper.USERNAME_ATTRIBUTE); + if(session.getAttribute(ScopeHelper.USERNAME_ATTRIBUTE)== null) + { + user = "massimiliano.assante"; + logger.warn("D4ScienceSession user NULL set to: " + user); + } + logger.warn("ASLSession user: " + user); + + ASLSession d4session = SessionManager.getInstance().getASLSession(session.getId(), user); + d4session.setAttribute(ScopeHelper.USERNAME_ATTRIBUTE, user); + return user; + } + } + + /** + * + * @return the current scope + */ + public String getVreName() { + if (! ReportConstants.isDeployed) { + return "d4science.research-infrastructures.eu/FARM/FCPPS"; + } else { + HttpServletRequest httpServletRequest = this.getThreadLocalRequest(); + HttpSession session = httpServletRequest.getSession(); + + ASLSession d4session = SessionManager.getInstance().getASLSession(session.getId(), getUsername()); + String scope = d4session.getScopeName(); + + if(scope == null) { + scope = "gcube/devsec"; + logger.warn("ASL Session scope NULL set to: " + scope); + } + + //need to remove the initial / of the scope + if (scope.charAt(0) == '/') + scope = scope.substring(1, scope.length()); + logger.info("SCOPE: " + scope); + return scope; + } + + } + + + + /** + * + * @return an instance of the user WorkspaceArea + * @throws HomeNotFoundException + * @throws InternalErrorException + * @throws WorkspaceFolderNotFoundException + * @throws WorkspaceNotFoundException + * @throws InternalErrorException + * @throws HomeNotFoundException + */ + protected Workspace getWorkspaceArea() throws WorkspaceFolderNotFoundException, InternalErrorException, HomeNotFoundException { + return HomeLibrary.getUserWorkspace(getASLSession()); + } + + + /** + * reads from the file system and returns the user workspace as TreeNode object + * + * @return the Default basket if if there is no basket in session, else the basket in session id + */ + public String getDefaultBasket() { + logger.info("getDefaultBasket()"); + + try { + Workspace workspaceArea = getWorkspaceArea(); + WorkspaceFolder basket = workspaceArea.getRoot(); + return basket.getId(); + } catch (MalformedScopeExpressionException e) { e.printStackTrace(); + } catch (InternalErrorException e) {e.printStackTrace(); + } catch (HomeNotFoundException e) { e.printStackTrace(); + } catch (WorkspaceFolderNotFoundException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + + return "Coud not open default basket"; + } + + /** + * + * @return the model previously stored in the session + */ + public SerializableModel readTemplateFromSession() { + ASLSession d4Session = getASLSession(); + + String templateid = (String) d4Session.getAttribute("idreport"); + + Object workflowid = getASLSession().getAttribute(WfDocsLibrary.LAST_WORKFLOW_ID); + logger.debug(" (templateid != null && workflowid != null) = " + (templateid != null) + " - " + (workflowid != null)); + if (workflowid != null) { + getASLSession().setAttribute(WfDocsLibrary.LAST_WORKFLOW_ID, null); + return null; + } + + String templateName = ""; + logger.debug("TEMPLATE ID==NULL " + (templateid == null)); + if (templateid != null) { + if (! templateid.equals("")) { + logger.debug("READING SESSION VARIABLE FOR REPORT ID... " + templateid); + //reset the value + d4Session.setAttribute("idreport", ""); + Workspace root = null; + WorkspaceItem item = null; + try { + root = getWorkspaceArea(); + + item = root.getItem(templateid); + logger.info("READ REPORT FROM WP... " + item.getName()); + templateName = item.getName(); + } catch (WorkspaceFolderNotFoundException e) {e.printStackTrace(); + } catch (InternalErrorException e) { e.printStackTrace(); + } catch (HomeNotFoundException e) { e.printStackTrace(); + } catch (ItemNotFoundException e) { e.printStackTrace();} + + SerializableModel toReturn = readModel(templateName, templateid, false, false); + return toReturn; + } + if (d4Session.getAttribute(CURRENT_REPORT_INSTANCE) != null) + return (SerializableModel) d4Session.getAttribute(CURRENT_REPORT_INSTANCE) ; + return null; + } + else { + if (d4Session.getAttribute(CURRENT_REPORT_INSTANCE) != null) { + logger.debug("getAttribute(\"CURRENT_REPORT_INSTANCE\")..."); + SerializableModel model = (SerializableModel) d4Session.getAttribute(CURRENT_REPORT_INSTANCE) ; + logger.debug(model.getTemplateName()); + + return model; + } + } + ServiceUtil myUtil = new ServiceUtil(getASLSession()); + String dirToClean = myUtil.getTemplateFolder(getVreName(), getUsername()); + logger.info("RETURNING NULL, going to clean user template area: " + dirToClean); + if (ReportConstants.isDeployed) + delTemplateDir(new File(dirToClean)); + return null; + } + + + /** + * recurdively delete the templates folder of the dir dir + * @param dir the dir to delete + */ + public void delTemplateDir(File dir) { + try { + File[] files = dir.listFiles(); + for (int i = 0; i < files.length; i++) { + if (files[i].isDirectory()) + delTemplateDir(files[i]); + files[i].delete(); + } + } catch (Exception e) { + System.out.println("WARNING: Could not cleaning temp dir: reason unknown"); + } + } + + + /** + * @param model to store in the session + */ + public void storeTemplateInSession(SerializableModel model) { + ASLSession d4Session = getASLSession(); + d4Session.setAttribute(CURRENT_REPORT_INSTANCE, model); + // Vector sections = model.getSections(); + // for (SerialazableSection section : sections) { + // for (SerializableComponent component : section.getComponents()) { + // if (component.getType() == ComponentType.DYNA_IMAGE) { + // Logger.debug("\n\n****FOUND DYNA IMAGE ID In Basket: " + component.getIdInBasket()); + // } + // } + // } + } + + + private void importDynamicImagesFromHL(SerializableModel model) { + ServiceUtil myUtil = new ServiceUtil(getASLSession()); + logger.debug("model == NULL " + (model == null)); + Vector sections = model.getSections(); + for (SerializableSection section : sections) { + logger.debug("\n\n****section.getComponents() == NULL " + (section.getComponents() == null)); + for (SerializableComponent component : section.getComponents()) { + if (component.getType() == ComponentType.DYNA_IMAGE) { + logger.debug("Found DP: " + component.getPossibleContent()); + + logger.debug("ID In Basket null?: " + (component.getIdInBasket() == null)); + + if (component.getIdInBasket() != null) { + + String imageID = component.getIdInBasket(); + String imageNameFile = getRandom(12); + + String imageTargetDIR = myUtil.getTemplatePath(model.getTemplateName(), getVreName(), getUsername()) + "images" + File.separator; + imageNameFile = copyImageFromBasket(imageID, imageTargetDIR, imageNameFile); + + component.setPossibleContent(getImageURL(imageNameFile, model.getTemplateName())); + logger.trace("NEW setPossibleContent: " + component.getPossibleContent()); + } + } + } + } + } + + /** + * + * @param imageName + * @param templateName + * @return + */ + private String getImageURL(String imageName, String templateName) { + String toReturn = currentHost + "usersArea/" + getVreName() + "/templates/" + getUsername() + "/CURRENT_OPEN/images/" + imageName; + logger.info("getImageURL" + toReturn); + return toReturn; + + } + + /** + * + * @param imageIDinBasket . + * @param pathToFile the directory where to save the file + * @param filename the filename to give to the newly created file + * @return the file imagename with its extension + */ + private String copyImageFromBasket(String imageIDinBasket, String pathToFile, String filename) { + + Workspace root = null; + try { + root = getWorkspaceArea(); + } catch (WorkspaceFolderNotFoundException e) {e.printStackTrace(); + } catch (InternalErrorException e) { e.printStackTrace(); + } catch (HomeNotFoundException e) { e.printStackTrace(); + } + + WorkspaceItem item = null; + try { + item = root.getItem(imageIDinBasket); + } catch (ItemNotFoundException e) { + e.printStackTrace(); + } + + logger.debug("pathToFile: " + pathToFile); + File f = null; + String toReturn =""; + if (item.getType() == WorkspaceItemType.FOLDER_ITEM) { + logger.debug("\nItem is a BASKET_ITEM"); + FolderItem bi = (FolderItem) item; + try { + File dir = new File(pathToFile); + logger.debug("DIR: " + pathToFile); + if (! dir.exists() ) + dir.mkdirs(); + + + + InputStream data = null; + + if (bi.getFolderItemType()==FolderItemType.EXTERNAL_IMAGE){ + logger.debug("EXTERNAL_IMAGE -|- " + item.getType()); + ExternalImage image = (ExternalImage)item; + data = image.getData(); + } + + if (bi.getFolderItemType()==FolderItemType.IMAGE_DOCUMENT){ + ImageDocument image = (ImageDocument)item; + if (image.getMimeType().equals("image/tiff")) + data = image.getThumbnail(); + else + data = image.getData(); + } + toReturn = filename + "." + getImageExtension(bi); + f = new File(pathToFile+toReturn); + OutputStream out = new FileOutputStream(f); + + byte buf[] = new byte[1024]; + int len; + while((len = data.read(buf))>0) + out.write(buf,0,len); + out.close(); + data.close(); + } + catch (IOException e){ + e.printStackTrace(); + } catch (InternalErrorException e) { + e.printStackTrace(); + } + } + logger.info("RETURNING: " + f.getAbsolutePath()); + return toReturn; + } + + + /** + * return a string for the file extension given a mimetype + * + * @param bi the basketItem + * @return a string for the file extension given a mimetype + */ + public static String getImageExtension(FolderItem bi) { + + String mimetype = ""; + if (bi.getFolderItemType()==FolderItemType.EXTERNAL_IMAGE){ + ExternalImage image = (ExternalImage) bi; + mimetype = image.getMimeType(); + } + + if (bi.getFolderItemType()==FolderItemType.IMAGE_DOCUMENT){ + ImageDocument image = (ImageDocument) bi; + mimetype = image.getMimeType(); + } + + if (mimetype.equals(GIF)) + return "gif"; + else if (mimetype.equals(PNG)) + return "png"; + else if (mimetype.equals(JPG)) + return "jpg"; + else if (mimetype.equals(JPEG)) + return "jpg"; + else if (mimetype.equals(TIFF)) + return "png"; + else if (mimetype.equals(BMP)) + return "bmp"; + else + return "jpg"; + } + + + + /** + * generate a random uid + * @param length + * @return + */ + private String getRandom(int length) { + UUID uuid = UUID.randomUUID(); + String myRandom = uuid.toString(); + return myRandom.substring(length); + } + + /** + * Copies a image from fromTemplate/images/imageNameFile to toTemplate/images/imageNameFile + * @param fromTemplate the origin template + * @param toTemplate the target template + * @param imageNameFile . + * @return true if the copy went fine + */ + public boolean copyImage(String fromTemplate, String toTemplate, String imageNameFile) { + ServiceUtil myUtil = new ServiceUtil(getASLSession()); + String imageFrom = myUtil.getTemplatePath(fromTemplate, getVreName(), getUsername()) + "images" + File.separator + imageNameFile; + String imageTarget = myUtil.getTemplatePath(toTemplate, getVreName(), getUsername()) + "images" + File.separator + imageNameFile; + + String imageNewFolder = myUtil.getTemplatePath(toTemplate, getVreName(), getUsername()) + "images" + File.separator; + + logger.debug("Copying:\n" + imageFrom + "\nto: " + imageTarget); + + File from = new File(imageFrom); + File to = new File(imageTarget); + + try { + myUtil.copyFile(from, to, imageNewFolder); + } catch (Exception e) { + logger.error("Error While Copying: " + e.getMessage()); + return false; + } + logger.debug("Copying Success\n"); + return true; + } + + + + /** + * @param reportItemid the report itemd id in basket to store in the session + */ + public void storeReportItemIDInSession(String reportItemid) { + ASLSession d4Session = getASLSession(); + d4Session.setAttribute(CURRENT_REPORT_ID_ATTRIBUTE, reportItemid); + logger.debug("WROTE REPORT ID IN SESSION: " + reportItemid); + } + + /** + * @return the report item id in basket, or "" if doesn't exist + */ + public String getReportItemIDFromSession() { + ASLSession d4Session = getASLSession(); + if (d4Session.getAttribute(CURRENT_REPORT_ID_ATTRIBUTE) == null) + return ""; + else + return d4Session.getAttribute(CURRENT_REPORT_ID_ATTRIBUTE).toString(); + } + /** + * used to save the report in the same basket * + */ + public void saveReport() { + Workspace root = null; + try { + root = getWorkspaceArea(); + } catch (WorkspaceFolderNotFoundException e) {e.printStackTrace(); + } catch (InternalErrorException e) { e.printStackTrace(); + } catch (HomeNotFoundException e) { e.printStackTrace(); + } + + WorkspaceItem item = null; + String folderid = ""; + String itemName = ""; + try { + if (getReportItemIDFromSession().equals("")) { + folderid = getDefaultBasket(); + + } + + else { + logger.debug("getReportItemIDFromSession RETURNS -> " + getReportItemIDFromSession() + ""); + + item = root.getItem(getReportItemIDFromSession()); + folderid = item.getParent().getId(); + itemName = item.getName(); + } + } catch (ItemNotFoundException e) { + logger.error("ITEM NOT FOUND -> " + getReportItemIDFromSession()); + + } catch (InternalErrorException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + + logger.debug("folderid -> " + folderid); + + saveReport(folderid, itemName); + } + + + /** + * @param basketidToSaveIn . + * + */ + public void saveReport(String folderid, String newname) { + + SerializableModel model = readTemplateFromSession(); + //raplacing " " with _ + logger.info("Serializing Model basketidToSaveIn: " + folderid ); + + logger.info("Trying to convert dynamic images ... "); + importDynamicImagesFromHL(model); + + ServiceUtil myUtil = new ServiceUtil(getASLSession()); + boolean result = myUtil.writeModel(model, "CURRENT_OPEN", getVreName(), getUsername()); + + + + if (!result) { + logger.debug("Could not save report, serializing failed"); + } + else { + String templatePath = myUtil.getTemplateFolder(getVreName(), getUsername()) + "CURRENT_OPEN"; + try { + Thread.sleep(1000); + } catch (InterruptedException e) { + e.printStackTrace(); + } + + logger.debug("Trying to zip folder: " + templatePath); + + String folderToZip = templatePath; + String outZip = templatePath+"-report.zip"; + + try { + ZipUtil.zipDir(outZip, folderToZip); + } catch (IOException e) { + logger.error("Could not zip template, serializing failed"); + e.printStackTrace(); + } + logger.info("Folder zipped, result: "+ outZip); + + InputStream isZip = null; + + WorkspaceFolder toSaveIn = null; + try { + isZip = new BufferedInputStream(new FileInputStream(outZip)); + + toSaveIn = getBasketInstance(folderid); + String templateName = newname; + + if (templateName.endsWith("d4sR") ) { + if (toSaveIn.exists(templateName)) { + logger.warn("Item exists already, deleting and creating new one"); + toSaveIn.removeChild(toSaveIn.find(templateName)); + } + } + + if (toSaveIn.exists(templateName + ".d4sR")) { + logger.warn("Item exists already, deleting and creating new one"); + toSaveIn.removeChild(toSaveIn.find(templateName + ".d4sR")); + } + + //remove the template extension + String templateToInsert = templateName.replace(".d4sT", ""); + if (! templateToInsert.endsWith(".d4sR")) + templateToInsert+=".d4sR"; + + + /** + * Create a Report into this basket. + * @param name the report name. + * @param description the report description. + * @param created the report creation time. + * @param lastEdit the last edit time. + * @param author the report author. + * @param lastEditBy the last report editor. + * @param templateName the source template name. + * @param numberOfSections the number of sections. + * @param status the report status. + * @param reportData the report data. + * @return the report. + * @throws InsufficientPrivilegesException if the user don't have sufficient privileges to perform this operation. + * @throws InternalErrorException if an internal error occurs. + * @throws ItemAlreadyExistException if an item with the specified name already exists. + */ + + Calendar dateCreated = Calendar.getInstance(); + dateCreated.setTime(model.getDateCreated()); + + Calendar lastEdit = Calendar.getInstance(); + lastEdit.setTime(model.getLastEdit()); + + Report rep = toSaveIn.createReportItem(templateToInsert, templateToInsert, dateCreated, lastEdit, + model.getAuthor(), model.getLastEditBy(), templateToInsert, model.getSections().size(), "no-status", isZip); + + + //Report rep = toSaveIn.createReportItem(templateToInsert, templateToInsert, isZip); + storeReportItemIDInSession(rep.getId()); + + AccessLogger log = AccessLogger.getAccessLogger(); + CreateReportLogEntry logEntry = new CreateReportLogEntry(model.getTemplateName(), rep.getId()); + log.logEntry(getASLSession().getUsername(), getASLSession().getScopeName(), logEntry); + + } catch (InsufficientPrivilegesException e) { + e.printStackTrace(); + } catch (InternalErrorException e) { + e.printStackTrace(); + } catch (ItemAlreadyExistException e) { + } + catch (FileNotFoundException e) { + e.printStackTrace(); + } catch (ItemNotFoundException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + + } + } + + private boolean removeIfExist(String name2Check, WorkspaceFolder basket) throws InternalErrorException, InsufficientPrivilegesException { + List items = basket.getChildren(); + for (WorkspaceItem item : items) + if (item.getName().equals(name2Check)) { + item.remove(); + logger.info("ITEM REMOVED: "+ name2Check); + return true; + } + return false; + } + + /** + * Return an instance of + * @param basketId + * @return + * @throws ItemNotFoundException + */ + private WorkspaceFolder getBasketInstance(String basketId) throws ItemNotFoundException { + Workspace root = null; + try { + root = getWorkspaceArea(); + } catch (WorkspaceFolderNotFoundException e) {e.printStackTrace(); + } catch (InternalErrorException e) { e.printStackTrace(); + } catch (HomeNotFoundException e) { e.printStackTrace(); + } + + WorkspaceItem item = null; + try { + item = root.getItem(basketId); + } catch (ItemNotFoundException e) { + logger.info("BASKET : " + basketId + " NOT FOUND RETURNING DEFAULT ONE"); + return(WorkspaceFolder)root.getItem(getDefaultBasket()); + + + } + logger.debug("Item Type: "+item.getType()); + if (item.getType() != WorkspaceItemType.FOLDER) { + logger.error("The item id does not belong to a basket id:" + basketId); + return null; + } + return (WorkspaceFolder) item; + } + + + /** + * return a sample of the given TS to the client + * @param sTS . + * @return . + */ + public SerializableTable getSampleTimeSeries(SerializableTimeSeries sTS) { + + File csvTS = getTimeSeriesFromWorkspace(sTS); + SerializableTable toReturn = null; + try { + toReturn = parseCSV(csvTS, sTS); + } catch (ParseException e) { e.printStackTrace(); + } catch (IOException e) { e.printStackTrace(); + } catch (ProcessingException e) { e.printStackTrace(); + } + + return toReturn; + } + + /** + * retrieve the given TS csv representation and writes it into /tmp returning the File + * @param sTS serializable TS + * @return a File csv + */ + private File getTimeSeriesFromWorkspace(SerializableTimeSeries sTS) { + try { + String timeSeriesBasketID = sTS.getTsMetadata().getId(); + + Workspace root = null; + try { + root = getWorkspaceArea(); + } catch (WorkspaceFolderNotFoundException e) {e.printStackTrace(); + } catch (InternalErrorException e) { e.printStackTrace(); + } catch (HomeNotFoundException e) { e.printStackTrace(); + } + WorkspaceItem item = null; + try { + item = root.getItem(timeSeriesBasketID); + } catch (ItemNotFoundException e) { + e.printStackTrace(); + } + logger.debug("Got Item TS From HL, Item Type: "+item.getType()); + + if (item.getType() != WorkspaceItemType.FOLDER_ITEM) { + logger.debug("The item id does not belong to a timeseries, id:" + timeSeriesBasketID); + return null; + } + FolderItem bItem = (FolderItem) item; + if (bItem.getFolderItemType() != FolderItemType.TIME_SERIES) { + logger.debug("The basket item does not belong to a timeseries, id:" + timeSeriesBasketID); + return null; + } + + TimeSeries ts = (TimeSeries) bItem; + return getTSFromBasket(ts); + } + catch (NullPointerException e) { + logger.error("No TS was dragged in the Area returning NULL"); + return null; + } + } + + /** + * + * @param toParse the csv to parse + * @throws ProcessingException . + * @throws IOException . + * @throws ParseException . + */ + private SerializableTable parseCSV(File toParse, final SerializableTimeSeries sTS) throws ParseException , IOException, ProcessingException { + + final SerializableTable toReturn; + final boolean isFiltered; + final int fromLine; + final int toLine; + + //if there is no filter + if ( sTS.getFilter() == null) { + toReturn = new SerializableTable(sTS.getTsMetadata().getHeaderLabels().size()); + isFiltered = false; + fromLine = 1; + toLine = 10; + } + else { + int headers = sTS.getFilter().getColsNumberToShow().size(); + toReturn = new SerializableTable(headers); + isFiltered = true; + fromLine = sTS.getFilter().getFrom(); + toLine = fromLine + 10; + } + + + final CSVFileProcessor fp = new CSVFileProcessor(); + fp.processFile(toParse.getAbsolutePath() , new CSVLineProcessor() { + boolean keepGoing = true; + + public void processHeaderLine( final int linenumber, final List fieldNames ) { + ArrayList toInsert = new ArrayList(); + for (String field : fieldNames) { + toInsert.add(new TableCell(field)); + } + if (! isFiltered) + toReturn.addRow((ArrayList) toInsert); + else { + ArrayList filteredHeaders = new ArrayList(); + for (Integer colNo : sTS.getFilter().getColsNumberToShow()) { + String toAdd = sTS.getTsMetadata().getHeaderLabels().get(colNo); + filteredHeaders.add(toAdd); + toInsert = new ArrayList(); + for (String field : filteredHeaders) { + toInsert.add(new TableCell(field)); + } + } + toReturn.addRow(toInsert); + } + } + + + public void processDataLine( final int linenumber, final List fieldValues ) { + if (linenumber > toLine) + keepGoing = false; + if (linenumber >= fromLine && linenumber <= toLine) { + ArrayList toInsert = new ArrayList(); + for (String field : fieldValues) { + toInsert.add(new TableCell(field)); + } + if (! isFiltered) + toReturn.addRow(toInsert); + else { + ArrayList filteredFields = new ArrayList(); + for (Integer colNo : sTS.getFilter().getColsNumberToShow()) { + String toAdd = fieldValues.get(colNo); + filteredFields.add(toAdd); + toInsert = new ArrayList(); + for (String field : filteredFields) { + toInsert.add(new TableCell(field)); + } + } + toReturn.addRow(toInsert); + } + } + } + public boolean continueProcessing() { + return keepGoing; + } + } ); + return toReturn; + } + + + /** + * get the TS from the Basket + * @param ts + * @return a csv file + */ + private File getTSFromBasket(TimeSeries ts) { + try { + File temp = File.createTempFile(ts.getName(), ".csv"); + + InputStream inputStream = null; + try { + inputStream = ts.getData(); + } catch (InternalErrorException e) { + e.printStackTrace(); + return null; + } + + OutputStream out = new FileOutputStream(temp); + + byte buf[] = new byte[1024]; + int len; + while((len = inputStream.read(buf))>0) + out.write(buf,0,len); + out.close(); + inputStream.close(); + logger.debug("Successfully got TimeSeries from Basket: \n" + temp.getAbsolutePath()); + return temp; + } + catch (IOException e){ + e.printStackTrace(); + return null; + } catch (InternalErrorException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + return null; + } + + + /** + * each portlet instance runs in a scope + * each portlet instance is used by a unique username from within the portal + * @param currentHost . + * @return a SessionInfo bean containing the username the scope andis opening a workflow document or not + */ + public SessionInfo getSessionInfo(String currentHost) { + this.currentHost = currentHost; + + if (testWorkflow) { + + getASLSession().setAttribute(WfDocsLibrary.WORKFLOW_ID_ATTRIBUTE, "1"); + getASLSession().setAttribute(WfDocsLibrary.WORKFLOW_GIVEN_NAME, "TEST REPORT"); + getASLSession().setAttribute(WfDocsLibrary.WORKFLOW_READONLY_ATTRIBUTE, true); + return new SessionInfo(getUsername(), getVreName(), true, true); + } + if (getASLSession().getAttribute(WfDocsLibrary.WORKFLOW_ID_ATTRIBUTE) == null) { + logger.debug("WfDocsLibrary.WORKFLOW_ID_ATTRIBUTE is NULL: "); + return new SessionInfo(getUsername(), getVreName(), false, false); + } + else { + logger.debug("FOUND WORKFLOW_ID_ATTRIBUTE ***** "); + //String workflowid = getASLSession().getAttribute(WfDocsLibrary.WORKFLOW_ID_ATTRIBUTE).toString(); + Boolean canEdit = ! (Boolean) getASLSession().getAttribute(WfDocsLibrary.WORKFLOW_READONLY_ATTRIBUTE); + return new SessionInfo(getUsername(), getVreName(), true, canEdit); + } + } + + + public SerializableModel getWorkflowDocumentFromDocumentLibrary() { + ServiceUtil myUtil = new ServiceUtil(getASLSession()); + + if (testWorkflow) { + FileInputStream fis = null; + ObjectInputStream in = null; + SerializableModel toConvert = null; + try { + fis = new FileInputStream("/Users/massi/portal/CURRENT_OPEN.d4st"); + in = new ObjectInputStream(fis); + toConvert = (SerializableModel) in.readObject(); + in.close(); + } catch (IOException ex) { + ex.printStackTrace(); + } catch (ClassNotFoundException ex) { + ex.printStackTrace(); + } + toConvert.setTemplateName("TEST"); + logger.info(" Converting TEST REPORT to Serializable object, model name: \n" + toConvert.getTemplateName()); + return toConvert; + } + else { + String workflowid = getASLSession().getAttribute(WfDocsLibrary.WORKFLOW_ID_ATTRIBUTE).toString(); + Boolean canEdit = ! (Boolean) getASLSession().getAttribute(WfDocsLibrary.WORKFLOW_READONLY_ATTRIBUTE); + String documentName = getASLSession().getAttribute(WfDocsLibrary.WORKFLOW_GIVEN_NAME).toString(); + logger.info("getWorkflowDocumentFromDocumentLibrary() CALLED ***** ID = " + workflowid + " name:\n " + documentName); + + //TODO: check this + //reset the values in session + + logger.info("Reset the values in session ... "); + + getASLSession().setAttribute(WfDocsLibrary.LAST_WORKFLOW_ID, workflowid); + getASLSession().setAttribute(WfDocsLibrary.WORKFLOW_ID_ATTRIBUTE, null); + getASLSession().setAttribute(WfDocsLibrary.WORKFLOW_READONLY_ATTRIBUTE, null); + getASLSession().setAttribute(WfDocsLibrary.WORKFLOW_GIVEN_NAME, null); + + + + try { + InputStream inputStream = DocLibraryUtil.getFileEntryAsStream(getASLSession(), workflowid); + String templatePath = myUtil.getTemplateFolder(getVreName(), getUsername()) + "CURRENT_OPEN/"; + String pathToFile = templatePath; + File toExtract = writeReportToDisk(inputStream, pathToFile, "Workflodoc-report.zip"); + + File outputDir = new File( myUtil.getTemplatePath("", getVreName(), getUsername()) ); + ZipUtil.unzipArchive(toExtract, outputDir); + toExtract.delete(); + + + FileInputStream fis = null; + ObjectInputStream in = null; + SerializableModel toConvert = null; + try { + String path = myUtil.getTemplateFolder(getVreName(), getUsername()); + fis = new FileInputStream(path + "CURRENT_OPEN/CURRENT_OPEN.d4st"); + in = new ObjectInputStream(fis); + toConvert = (SerializableModel) in.readObject(); + in.close(); + } catch (IOException ex) { + ex.printStackTrace(); + } catch (ClassNotFoundException ex) { + ex.printStackTrace(); + } + toConvert.setTemplateName(documentName); + logger.debug("Converting fileToRead to Serializable object, model name: \n" + toConvert.getTemplateName()); + SerializableModel toReturn = (toConvert); + + //saves this model as previous one in session + getASLSession().setAttribute(PREVIOUS_REPORT_INSTANCE, toConvert); + + AccessLogger log = AccessLogger.getAccessLogger(); + OpenWorkflowLogEntry logEntry = new OpenWorkflowLogEntry(toConvert.getTemplateName(), toConvert.getUniqueID(), toConvert.getAuthor()); + log.logEntry(getASLSession().getUsername(), getASLSession().getScopeName(), logEntry); + + return toReturn; + + } catch (Exception e) { + e.printStackTrace(); + } + return null; + } + } + + /** + * get the report instance from the Basket + * @param repTmp . + * @param pathToFile the directory where to save the file + * @param filename the filename to give to the newly created file + * @return + */ + private File writeReportToDisk(InputStream isData, String pathToFile, String filename) { + try { + File dir = new File(pathToFile); + logger.debug("DIR: " + pathToFile); + if (! dir.exists() ) + dir.mkdirs(); + + File f = new File(pathToFile+filename); + OutputStream out = new FileOutputStream(f); + + IOUtils.copy(isData, out); + out.close(); + logger.debug("Successfully WROTE ReportTemplate from DL: " + pathToFile); + return f; + } + catch (IOException e){ + e.printStackTrace(); + return null; + } + } + /** + * update the Workflow Document in session + */ + public void updateWorkflowDocument(boolean update) { + ASLSession session = getASLSession(); + ServiceUtil myUtil = new ServiceUtil(session); + + String workflowid = session.getAttribute(WfDocsLibrary.LAST_WORKFLOW_ID).toString(); + SerializableModel model = null; + String documentWorkflowOwnerId = store.getWorkflowById(workflowid).getAuthor(); + String documentWorkflowName = store.getWorkflowById(workflowid).getName(); + if (update) { + logger.debug("SAVING in WorkflowDocument Library "); + + model = (SerializableModel) session.getAttribute(CURRENT_REPORT_INSTANCE); + + logger.debug("Trying to convert dynamic images ... "); + importDynamicImagesFromHL(model); + + + boolean result = myUtil.writeModel(model, "CURRENT_OPEN", getVreName(), getUsername()); + + if (!result) { + logger.error("Could not save report, serializing failed"); + } + else { + String templatePath = myUtil.getTemplateFolder(getVreName(), getUsername()) + "CURRENT_OPEN"; + try { + Thread.sleep(1000); + } catch (InterruptedException e) { + e.printStackTrace(); + } + + logger.debug("Trying to zip folder: " + templatePath); + + String folderToZip = templatePath; + String outZip = templatePath+"-report.zip"; + + try { + ZipUtil.zipDir(outZip, folderToZip); + logger.debug("Folder zipped, result: "+ outZip); + InputStream isZip = new BufferedInputStream(new FileInputStream(outZip)); + + DocLibraryUtil.updateFileIntoDocLibrary(getASLSession(), workflowid, getBytesFromInputStream(isZip)); + logger.info("Updated in DOC LIB OK"); + store.addWorkflowLogAction(workflowid, getASLSession().getUsername(), "Updated"); + + //send the notification + NotificationsManager nm = new ApplicationNotificationsManager(session, "org.gcube.admin.portlet.wfdocviewer.server.WorkflowDocServiceImpl"); + nm.notifyDocumentWorkflowUpdate(documentWorkflowOwnerId, workflowid, documentWorkflowName); + + AccessLogger log = AccessLogger.getAccessLogger(); + SaveWorkflowLogEntry logEntry = new SaveWorkflowLogEntry(model.getTemplateName(), model.getUniqueID(), model.getAuthor()); + log.logEntry(getASLSession().getUsername(), getASLSession().getScopeName(), logEntry); + + } + catch (Exception e) { + logger.error("Could not zip template, serializing failed"); + e.printStackTrace(); + } + } + } else { + store.addWorkflowLogAction(workflowid, getASLSession().getUsername(), "Viewed"); + //send the notification + NotificationsManager nm = new ApplicationNotificationsManager(session, "org.gcube.admin.portlet.wfdocviewer.server.WorkflowDocServiceImpl"); + nm.notifyDocumentWorkflowView(documentWorkflowOwnerId, workflowid, documentWorkflowName); + } + //unlocks + unlock(workflowid); + getASLSession().setAttribute("idreport", null); + } + + /** + */ + byte[] getBytesFromInputStream(InputStream is) { + ByteArrayOutputStream os = new ByteArrayOutputStream(); + try { + IOUtils.copy(is, os); + } catch (IOException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + return os.toByteArray(); + } + /** + * + * @param workflowid . + */ + private void unlock(String workflowid) { + DLFileEntry fileEntry; + try { + fileEntry = DocLibraryUtil.getFileEntry(getASLSession(), workflowid); + logger.info("Log action saved, trying ot unlock document ..."); + LockLocalServiceUtil.unlock(DLFileEntry.class.getName(), fileEntry.getFileEntryId()); + logger.info("UNLOCK OK!"); + } + catch (Exception e) { + e.printStackTrace(); + } + } + + public void renewLock() { + HttpSession httpSes = this.getThreadLocalRequest().getSession(); + httpSes.setMaxInactiveInterval(-1); //session won't expire + String workflowid = getASLSession().getAttribute(WfDocsLibrary.LAST_WORKFLOW_ID).toString(); + try { + DLFileEntry fileEntry = DocLibraryUtil.getFileEntry(getASLSession(), workflowid); + logger.info("Renewing Lock ..."); + long fifteenMin = 900000; + Date currTimePlus15 = new Date(new Date().getTime() + fifteenMin); + LockLocalServiceUtil.getLock(DLFileEntry.class.getName(), fileEntry.getFileEntryId()).setExpirationDate(currTimePlus15); + logger.info("Lock Renewed, expiring: " + currTimePlus15); + } catch (Exception e) { + e.printStackTrace(); + } + + } + + + + +} diff --git a/src/main/java/org/gcube/portlets/user/reportgenerator/server/servlet/ZipUtil.java b/src/main/java/org/gcube/portlets/user/reportgenerator/server/servlet/ZipUtil.java new file mode 100644 index 0000000..890a676 --- /dev/null +++ b/src/main/java/org/gcube/portlets/user/reportgenerator/server/servlet/ZipUtil.java @@ -0,0 +1,130 @@ +package org.gcube.portlets.user.reportgenerator.server.servlet; + +import java.io.BufferedInputStream; +import java.io.BufferedOutputStream; +import java.io.File; +import java.io.FileInputStream; +import java.io.FileOutputStream; +import java.io.IOException; +import java.util.Enumeration; +import java.util.zip.ZipEntry; +import java.util.zip.ZipFile; +import java.util.zip.ZipOutputStream; + +import org.apache.commons.io.IOUtils; +import org.gcube.common.core.utils.logging.GCUBELog; + +/** + * + * @author massi + * + */ +public class ZipUtil { + + + public static GCUBELog logger = new GCUBELog(ZipUtil.class); + + /** + * @param zipFileName zipFileName + * @param dir the dir to compress + * @throws IOException . + */ + public static void zipDir(String zipFileName, String dir) throws IOException { + + File dirObj = new File(dir); + if(!dirObj.isDirectory()) + { + System.err.println(dir + " is not a directory"); + System.exit(1); + } + + ZipOutputStream out = new ZipOutputStream(new FileOutputStream(zipFileName)); + logger.debug("Creating : " + zipFileName); + addDir(dirObj, out); + // Complete the ZIP file + out.close(); + } + + private static void addDir(File dirObj, ZipOutputStream out) throws IOException + { + File[] files = dirObj.listFiles(); + byte[] tmpBuf = new byte[1024]; + + for (int i=0; i 0) + { + out.write(tmpBuf, 0, len); + } + + // Complete the entry + out.closeEntry(); + in.close(); + } + } + + /** + * + * @param archive . + * @param outputDir . + */ + public static void unzipArchive(File archive, File outputDir) { + try { + ZipFile zipfile = new ZipFile(archive); + for (Enumeration e = zipfile.entries(); e.hasMoreElements(); ) { + ZipEntry entry = (ZipEntry) e.nextElement(); + unzipEntry(zipfile, entry, outputDir); + } + } catch (Exception e) { + logger.error("while extracting file " + archive); + e.printStackTrace(); + } + } + + private static void unzipEntry(ZipFile zipfile, ZipEntry entry, File outputDir) throws IOException { + + if (entry.isDirectory()) { + createDir(new File(outputDir, entry.getName())); + return; + } + + File outputFile = new File(outputDir, entry.getName()); + if (!outputFile.getParentFile().exists()){ + createDir(outputFile.getParentFile()); + } + + logger.debug("Extracting: " + entry); + BufferedInputStream inputStream = new BufferedInputStream(zipfile.getInputStream(entry)); + BufferedOutputStream outputStream = new BufferedOutputStream(new FileOutputStream(outputFile)); + + try { + IOUtils.copy(inputStream, outputStream); + } finally { + outputStream.close(); + inputStream.close(); + } + } + + private static void createDir(File dir) { + logger.info("Creating dir "+dir.getName()); + if(!dir.mkdirs()) throw new RuntimeException("Can not create dir "+dir); + } + +} diff --git a/src/main/java/org/gcube/portlets/user/reportgenerator/server/servlet/loggers/CreateReportLogEntry.java b/src/main/java/org/gcube/portlets/user/reportgenerator/server/servlet/loggers/CreateReportLogEntry.java new file mode 100644 index 0000000..8adc081 --- /dev/null +++ b/src/main/java/org/gcube/portlets/user/reportgenerator/server/servlet/loggers/CreateReportLogEntry.java @@ -0,0 +1,26 @@ +package org.gcube.portlets.user.reportgenerator.server.servlet.loggers; + +import org.gcube.application.framework.accesslogger.model.AccessLogEntry; + +/** + * Represents an access log entry for creating a new Template + */ +public class CreateReportLogEntry extends AccessLogEntry{ + + private String templateName; + + private String templateId; + + public CreateReportLogEntry(String templateName, String templateId) { + super("Create_Report"); + this.templateName = replaceReservedChars(templateName); + this.templateId = replaceReservedChars(templateId); + } + + @Override + public String getLogMessage() { + String message = "Name = " + templateName + "|ID = " + templateId; + return message; + } + +} \ No newline at end of file diff --git a/src/main/java/org/gcube/portlets/user/reportgenerator/server/servlet/loggers/GenerateReportLogEntry.java b/src/main/java/org/gcube/portlets/user/reportgenerator/server/servlet/loggers/GenerateReportLogEntry.java new file mode 100644 index 0000000..dc63b30 --- /dev/null +++ b/src/main/java/org/gcube/portlets/user/reportgenerator/server/servlet/loggers/GenerateReportLogEntry.java @@ -0,0 +1,28 @@ +package org.gcube.portlets.user.reportgenerator.server.servlet.loggers; + +import org.gcube.application.framework.accesslogger.model.AccessLogEntry; + +/** + * Represents an access log entry for creating a new Template + */ +public class GenerateReportLogEntry extends AccessLogEntry{ + + private String name; + + private String mimetype; + + private String type; + + public GenerateReportLogEntry(String name, String mimetype, String type) { + super("Generate_Report_Output"); + this.name = replaceReservedChars(name); + this.mimetype = replaceReservedChars(mimetype); + } + + @Override + public String getLogMessage() { + String message = "Name = " + name + "|MIMETYPE = " + mimetype+ "|TYPE = " + type; + return message; + } + +} \ No newline at end of file diff --git a/src/main/java/org/gcube/portlets/user/reportgenerator/server/servlet/loggers/OpenReportLogEntry.java b/src/main/java/org/gcube/portlets/user/reportgenerator/server/servlet/loggers/OpenReportLogEntry.java new file mode 100644 index 0000000..0e661ac --- /dev/null +++ b/src/main/java/org/gcube/portlets/user/reportgenerator/server/servlet/loggers/OpenReportLogEntry.java @@ -0,0 +1,27 @@ +package org.gcube.portlets.user.reportgenerator.server.servlet.loggers; + +import org.gcube.application.framework.accesslogger.model.AccessLogEntry; + + +/** + * Represents an access log entry for creating a new Template + */ +public class OpenReportLogEntry extends AccessLogEntry{ + + private String templateName; + + private String templateId; + + public OpenReportLogEntry(String templateName, String templateId) { + super("Open_Report"); + this.templateName = replaceReservedChars(templateName); + this.templateId = replaceReservedChars(templateId); + } + + @Override + public String getLogMessage() { + String message = "Name = " + templateName + "|ID = " + templateId; + return message; + } + +} \ No newline at end of file diff --git a/src/main/java/org/gcube/portlets/user/reportgenerator/server/servlet/loggers/OpenWorkflowLogEntry.java b/src/main/java/org/gcube/portlets/user/reportgenerator/server/servlet/loggers/OpenWorkflowLogEntry.java new file mode 100644 index 0000000..9693eee --- /dev/null +++ b/src/main/java/org/gcube/portlets/user/reportgenerator/server/servlet/loggers/OpenWorkflowLogEntry.java @@ -0,0 +1,28 @@ +package org.gcube.portlets.user.reportgenerator.server.servlet.loggers; + +import org.gcube.application.framework.accesslogger.model.AccessLogEntry; + + +/** + * Represents an access log entry for creating a new Template + */ +public class OpenWorkflowLogEntry extends AccessLogEntry{ + + private String templateName; + private String author; + private String templateId; + + public OpenWorkflowLogEntry(String templateName, String templateId, String author) { + super("Open_Workflow_Report"); + this.author = author; + this.templateName = replaceReservedChars(templateName); + this.templateId = replaceReservedChars(templateId); + } + + @Override + public String getLogMessage() { + String message = "Name = " + templateName + "|ID = " + templateId+ "|AUTHOR = " + author; + return message; + } + +} \ No newline at end of file diff --git a/src/main/java/org/gcube/portlets/user/reportgenerator/server/servlet/loggers/SaveWorkflowLogEntry.java b/src/main/java/org/gcube/portlets/user/reportgenerator/server/servlet/loggers/SaveWorkflowLogEntry.java new file mode 100644 index 0000000..7fcefad --- /dev/null +++ b/src/main/java/org/gcube/portlets/user/reportgenerator/server/servlet/loggers/SaveWorkflowLogEntry.java @@ -0,0 +1,28 @@ +package org.gcube.portlets.user.reportgenerator.server.servlet.loggers; + +import org.gcube.application.framework.accesslogger.model.AccessLogEntry; + + +/** + * Represents an access log entry for creating a new Template + */ +public class SaveWorkflowLogEntry extends AccessLogEntry{ + + private String templateName; + private String author; + private String templateId; + + public SaveWorkflowLogEntry(String templateName, String templateId, String author) { + super("Save_Workflow_Report"); + this.author = author; + this.templateName = replaceReservedChars(templateName); + this.templateId = replaceReservedChars(templateId); + } + + @Override + public String getLogMessage() { + String message = "Name = " + templateName + "|ID = " + templateId+ "|AUTHOR = " + author; + return message; + } + +} \ No newline at end of file diff --git a/src/main/java/org/gcube/portlets/user/reportgenerator/shared/SessionInfo.java b/src/main/java/org/gcube/portlets/user/reportgenerator/shared/SessionInfo.java new file mode 100644 index 0000000..a7e1c6a --- /dev/null +++ b/src/main/java/org/gcube/portlets/user/reportgenerator/shared/SessionInfo.java @@ -0,0 +1,57 @@ +package org.gcube.portlets.user.reportgenerator.shared; + +import java.io.Serializable; + +@SuppressWarnings("serial") +public class SessionInfo implements Serializable { + + private String username; + private String scope; + private Boolean isWorkflowDocument; + private Boolean isEditable; + + public SessionInfo() { } + + public SessionInfo(String username, String scope, + Boolean isWorkflowDocument, Boolean canEdit) { + super(); + this.username = username; + this.scope = scope; + this.isWorkflowDocument = isWorkflowDocument; + this.isEditable = canEdit; + } + + public String getUsername() { + return username; + } + + public void setUsername(String username) { + this.username = username; + } + + public String getScope() { + return scope; + } + + public void setScope(String scope) { + this.scope = scope; + } + + public Boolean isWorkflowDocument() { + return isWorkflowDocument; + } + + public void setIsWorkflowDocument(Boolean isWorkflowDocument) { + this.isWorkflowDocument = isWorkflowDocument; + } + + public Boolean isEditable() { + return isEditable; + } + + public void setEditable(Boolean canEdit) { + this.isEditable = canEdit; + } + + +} diff --git a/src/main/resources/org/gcube/portlets/user/reportgenerator/ReportGenerator.gwt.xml b/src/main/resources/org/gcube/portlets/user/reportgenerator/ReportGenerator.gwt.xml new file mode 100644 index 0000000..5304baa --- /dev/null +++ b/src/main/resources/org/gcube/portlets/user/reportgenerator/ReportGenerator.gwt.xml @@ -0,0 +1,25 @@ + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/main/webapp/ReportGenerator.css b/src/main/webapp/ReportGenerator.css new file mode 100644 index 0000000..f8cabfe --- /dev/null +++ b/src/main/webapp/ReportGenerator.css @@ -0,0 +1,595 @@ + +.tableBorder { + border: 1px solid #CCC; + height: 30px; + font-family: Verdana, Geneva, Arial, Helvetica, sans-serif; + font-size: 12px; + color: #333; +} + +.selectable { + cursor: pointer; + cursor: hand; +} + +.comment-popup-header { + background-color: #EEE8BC; + border-color: none; +} + +.comment-popup { + background-color: #FFF8CC; + border-color: #EEE8BC; + border-style: solid; + border-width: 2px; +} + +.comment-popup-textarea { + background-color: #FFF8CC; + border:none; + font-family: Arial, Helvetica, sans-serif; + font-size: 11px; +} + +.selectedCell { + background-color: #e3e8f3 !important; +} + +.dialogText { + font-family: Verdana, Geneva, Arial, Helvetica, sans-serif; + font-size: 12px; +} + +tableBorder td { + border: 2px solid #BBBBBB; + padding: 3px; +} + +.checkAttribute label { + margin-left: 5px; + margin-right: 5px; +} + +.wpFlow { + border: 0px solid gray; +} + +.highlight_background { + background-color: #FFFE00; + /* filter:alpha(opacity=80); + -moz-opacity:0.8; + -khtml-opacity: 0.8; + opacity: 0.8;*/ +} + +.none { + border: none; +} + +.d4sRichTextArea { + background-color: #FFFFFF; + font-family: Times; + font-size: 20px; + border: none; +} + +.d4sFrame { + border: 1px dashed #CCC; + background-color: white; + margin-top: 15px; + margin-left: 15px; +} + +.fixedTextArea { + font-family: Times; + font-size: 20px; +} + +.droppingArea-Image { + border: 1px dashed #CCC; + background-image: url(images/droppingImage_bg.gif); + background-repeat: repeat; + margin-top: 25px; + margin-left: 15px; +} + +.label { + font-family: Verdana, Geneva, Arial, Helvetica, sans-serif; + font-size: 10px; +} + +.docEditedBy { + color: #666666; + font-family: Arial, sans-serif; + font-size: 11px !important; +} + +.menubar { + background: #e3e8f3 url(images/hborder.png) repeat-x 0px -2003px; + border: 1px solid #BBBBBB; + text-align: left; + vertical-align: top; + padding-top: 2px; +} + +.menubar-font { + font-family: Arial, sans-serif; + font-size: 16px; + font-weight: bold; +} + +.reportHeader { + background-color: #CADEF4; + font-family: Verdana, Geneva, Arial, Helvetica, sans-serif; + font-size: 12px; + padding: 1px 4px 1px 4px; + border-top: 1px solid #3366CC; +} + +.timeSeries_header { + background-color: #008080; + font-family: Verdana, Geneva, Arial, Helvetica, sans-serif; + font-size: 10px; + font-weight: bold; + color: #FFFFFF; + border: 1px solid #BBBBBB; + padding: 3px; +} + +.timeSeries_header_font { + background-color: #008080; + font-family: Verdana, Geneva, Arial, Helvetica, sans-serif; + font-size: 10px; + font-weight: bold; + color: #FFFFFF; + padding: 3px; +} + +.timeSeries_td { + background-color: #B7B7FF; + font-family: Verdana, Geneva, Arial, Helvetica, sans-serif; + font-size: 10px; + padding: 3px; +} + +.margins { + border: 1px dashed #CCC; +} + +.pagebreak { + background-image: url(images/pagebreak.gif); + border: 1px dashed #CCC; + background-repeat: repeat-x; +} + +.timeseriesArea { + border: 1px dashed #CCC; + background-repeat: repeat; + margin-top: 25px; + margin-left: 15px; +} + +.d4sRichTextArea { + background-color: #FFFFFF; + font-family: Times; + font-size: 20px; + border: none; +} + +.commentArea { + background-image: url(images/comment_area.gif); + background-repeat: no-repeat; + margin-top: 15px; + margin-left: 20px; + padding-left: 15px; + border: 0px solid gray; + font-family: Verdana, Geneva, Arial, Helvetica, sans-serif; + font-size: 12px; + font-style: italic; + color: #AAA; +} + +.attributeArea { + background-image: url(images/attribute_area.gif); + background-repeat: no-repeat; + margin-top: 15px; + margin-left: 20px; + padding-left: 15px; + border: 1px dashed #CCC; + font-family: Verdana, Geneva, Arial, Helvetica, sans-serif; + font-size: 12px; + color: Blue; +} + +.attributeValue { + padding-right: 5px; + font-family: Verdana, Geneva, Arial, Helvetica, sans-serif; + font-size: 12px; + color: Blue; +} + +.instructionArea { + background-image: url(images/instruction_area.gif); + background-repeat: no-repeat; + margin-top: 15px; + margin-left: 20px; + padding-left: 15px; + border: 0px solid gray; + font-family: Verdana, Geneva, Arial, Helvetica, sans-serif; + font-size: 12px; + font-family: "Courier New", Courier, monospace; + font-size: 11px; + color: #666; +} + +.gridAttribute { + background-color: #FFF; + padding: 3px; +} + +.pagebreak { + background-image: url(images/pagebreak.gif); + border: 1px dashed #CCC; + background-repeat: repeat-x; +} + +.titleArea { + background-image: url(images/title_area.png); + background-repeat: no-repeat; + padding-top: 5px; + padding-left: 20px; + margin-left: 0px; + border: none; + font-family: Times; + font-size: 16pt; + font-family: Verdana; + color: maroon; +} + +.headgin1Area { + background-image: url(images/heading_1.png); + background-repeat: no-repeat; + padding-top: 5px; + padding-left: 20px; + margin-left: 0px; + border: none; + font-family: Times; + font-size: 12pt; + font-family: Verdana; + color: maroon; +} + +.headgin2Area { + background-image: url(images/heading_2.png); + background-repeat: no-repeat; + padding-top: 5px; + padding-left: 20px; + margin-left: 0px; + border: none; + font-family: Times; + font-size: 11pt; + font-family: Verdana; + color: maroon; +} + +.headgin3Area { + background-image: url(images/heading_3.png); + background-repeat: no-repeat; + padding-top: 5px; + padding-left: 20px; + margin-left: 0px; + border: none; + font-family: Times; + font-size: 10pt; + font-family: Verdana; + color: maroon; +} + +.bodyArea { + background-image: none; +} + +.headerArea { + background-image: url(images/header.jpg); +} + +.footerArea { + background-image: url(images/footer.jpg); +} + +.tableArea { + background-image: url(images/table.jpg); +} + +.timeseriesArea_bg { + background-image: url(images/TimeSeries_bg.gif); +} + +.tocArea { + background-image: url(images/toc.jpg); + border: 1px dashed #CCC; + background-repeat: repeat-x; +} + +.biblioArea { + background-image: url(images/biblio.jpg); + border: 1px dashed #CCC; + background-repeat: repeat-x; +} + +.d4sFrame-highlight { + background-color: #e4f2f6; + filter: alpha(opacity = 50); + -moz-opacity: .50; + opacity: .50; + cursor: pointer; + cursor: hand; +} + +.droppingArea-Text { + border: 1px dashed #CCC; + background-image: url(images/droppingText_bg.gif); + background-repeat: repeat; +} + +.droppingArea-Text { + border: 1px dashed #CCC; + background-image: url(images/droppingText_bg.gif); + background-repeat: repeat; +} + +.setVisibilityOff { + visibility: hidden; +} + +.setVisibilityOn { + margin-top: 1px; + visibility: visible; + cursor: pointer; + cursor: hand; +} + +.templateFrame { + border: 1px solid gray; +} + +.toolBoxFrame { + background-color: #FFFFFF; + font-family: Verdana, Geneva, Arial, Helvetica, sans-serif; + font-size: 12px; + /*padding: 1px 4px 1px 4px;*/ + border: 1px solid #CCC; +} + +.toolBoxLabel { + background-color: #CADEF4; + color: gray; + font-weight: bold; + border-bottom: 1px solid #CCC; + font-family: Verdana, Geneva, Arial, Helvetica, sans-serif; + font-size: 12px; + padding: 1px 4px 1px 4px; +} + +.toolFrame { + padding: 4px; + cursor: pointer; + cursor: hand; + border: 1px outset #CCC; +} + +gwt-MenuBar { + cursor: default; + border: none; +} + +.gwt-MenuBar .gwt-MenuItem { + cursor: pointer; + cursor: hand; + border: 0px; + padding: 2px 8px; +} + +.gwt-MenuBar .gwt-MenuItem-selected { + background: #E0EDFE; +} + +.gwt-MenuBar-horizontal { + border: none; +} + +.gwt-MenuBar-horizontal .gwt-MenuItem { + vertical-align: bottom; + color: #3366CC; + font-weight: bold; +} + +.gwt-MenuBar-horizontal .gwt-MenuItemSeparator { + width: 1px; + padding: 0px; + margin: 0px; + border: 0px; + border-left: 1px solid #888888; + background: white; +} + +.gwt-MenuBar-horizontal .gwt-MenuItemSeparator .menuSeparatorInner { + width: 1px; + height: 1px; + background: white; +} + +.gwt-MenuBar-vertical .gwt-MenuItemSeparator .menuSeparatorInner { + margin-top: 0px; + margin-left: 0px; + border-top: 1px solid #888888; + background: white; +} + +.gwt-TextArea { + border: 1px inset #3366CC; + font-family: Verdana, Geneva, Arial, Helvetica, sans-serif; + font-size: 12px; +} + +.gwt-TextBox { + padding: 2px; + border: 1px inset #3366CC; + font-family: Verdana, Geneva, Arial, Helvetica, sans-serif; + font-size: 12px; +} + +.textArea-inserted-highlight { + background-color: #e4f2f6; + cursor: pointer; + cursor: hand; +} + +.crossCursor { + cursor: crosshair; +} + +.widthResizeCursor { + cursor: e-resize; +} + +.heightResizeCursor { + cursor: s-resize; +} + +.seResizeCursor { + cursor: se-resize; +} + +.cursor-move { + cursor: move; +} + +.position-relative { + position: relative; +} + +.gwt-ToggleButton { + cursor: pointer; + cursor: hand; + color: #3366CC; + font-family: Verdana, Geneva, Arial, Helvetica, sans-serif; + /*border: 1px outset navy;*/ +} + +.gwt-ToggleButton-down,.gwt-ToggleButton-down-hovering,.gwt-ToggleButton-down-disabled + { + padding: 4px 4px 2px 6px; + /* background: none; + color:White; + background-color:#3366CC;*/ +} + +.hasRichTextToolbar { + background-color: #FFFFFF; + font-family: Verdana, Geneva, Arial, Helvetica, sans-serif; + font-size: 12px; + border: 1px inset #3366CC; +} + +.gwt-RichTextToolbar { + background: #e3e8f3 url(images/hborder.png) repeat-x 0px -2003px; + border-bottom: 1px solid #BBBBBB; + padding: 3px; + margin: 0px; +} + +.gwt-RichTextToolbar .gwt-PushButton-up { + padding: 0px 1px 0px 0px; + margin-right: 4px; + margin-bottom: 4px; + border-width: 1px; +} + +.gwt-RichTextToolbar .gwt-PushButton-up-hovering { + margin-right: 4px; + margin-bottom: 4px; + padding: 0px 1px 0px 0px; + border-width: 1px; +} + +.gwt-RichTextToolbar .gwt-PushButton-down { + margin-right: 4px; + margin-bottom: 4px; + padding: 0px 0px 0px 1px; + border-width: 1px; +} + +.gwt-RichTextToolbar .gwt-PushButton-down-hovering { + margin-right: 4px; + margin-bottom: 4px; + padding: 0px 0px 0px 1px; + border-width: 1px; +} + +.gwt-RichTextToolbar .gwt-ToggleButton-up { + margin-right: 4px; + margin-bottom: 4px; + padding: 0px 1px 0px 0px; + border-width: 1px; +} + +.gwt-RichTextToolbar .gwt-ToggleButton-up-hovering { + margin-right: 4px; + margin-bottom: 4px; + padding: 0px 1px 0px 0px; + border-width: 1px; +} + +.gwt-RichTextToolbar .gwt-ToggleButton-down { + margin-right: 4px; + margin-bottom: 4px; + padding: 0px 0px 0px 1px; + border-width: 1px; +} + +.gwt-RichTextToolbar .gwt-ToggleButton-down-hovering { + margin-right: 4px; + margin-bottom: 4px; + padding: 0px 0px 0px 1px; + border-width: 1px; +} + +.cw-RichText { + border: 1px solid #BBBBBB; + border-spacing: 0px; +} + +/* *********** FANCY FILE UPLOAD **************/ +.fancyfileupload-pending { + font-family: arial; + font-size: 10px; + background: orange; + width: 200px; +} + +.fancyfileupload-loading { + font-family: arial; + font-size: 10px; + background: orange; + width: 200px; +} + +.fancyfileupload-loaded { + font-family: arial; + font-size: 10px; + background: lightgreen; + width: 200px; +} + +.fancyfileupload-failed { + font-family: arial; + font-size: 10px; + background: blue; + width: 200px; +} + +/* *********** END FANCY FILE UPLOAD **************/ +.droppingArea-Text { + border: 1px inset black; +} \ No newline at end of file diff --git a/src/main/webapp/ReportGenerator.html b/src/main/webapp/ReportGenerator.html new file mode 100644 index 0000000..180d5eb --- /dev/null +++ b/src/main/webapp/ReportGenerator.html @@ -0,0 +1,29 @@ + + + + + + + + + + + + Report Generator + + + + + + + + + + + + + + +
+ + diff --git a/src/main/webapp/WEB-INF/jsp/ReportGeneratorPortlet_edit.jsp b/src/main/webapp/WEB-INF/jsp/ReportGeneratorPortlet_edit.jsp new file mode 100644 index 0000000..0a197a8 --- /dev/null +++ b/src/main/webapp/WEB-INF/jsp/ReportGeneratorPortlet_edit.jsp @@ -0,0 +1,13 @@ +<%@page contentType="text/html"%> +<%@page pageEncoding="UTF-8"%> + +<%-- Uncomment below lines to add portlet taglibs to jsp +<%@ page import="javax.portlet.*"%> +<%@ taglib uri="http://java.sun.com/portlet_2_0" prefix="portlet"%> + + +--%> + + + EDIT MODE + \ No newline at end of file diff --git a/src/main/webapp/WEB-INF/jsp/ReportGeneratorPortlet_help.jsp b/src/main/webapp/WEB-INF/jsp/ReportGeneratorPortlet_help.jsp new file mode 100644 index 0000000..39ed5a1 --- /dev/null +++ b/src/main/webapp/WEB-INF/jsp/ReportGeneratorPortlet_help.jsp @@ -0,0 +1,13 @@ +<%@page contentType="text/html"%> +<%@page pageEncoding="UTF-8"%> + +<%-- Uncomment below lines to add portlet taglibs to jsp +<%@ page import="javax.portlet.*"%> +<%@ taglib uri="http://java.sun.com/portlet_2_0" prefix="portlet"%> + + +--%> + + + HELP MODE + \ No newline at end of file diff --git a/src/main/webapp/WEB-INF/jsp/ReportGeneratorPortlet_view.jsp b/src/main/webapp/WEB-INF/jsp/ReportGeneratorPortlet_view.jsp new file mode 100644 index 0000000..7209bf6 --- /dev/null +++ b/src/main/webapp/WEB-INF/jsp/ReportGeneratorPortlet_view.jsp @@ -0,0 +1,12 @@ +<%@page contentType="text/html"%> +<%@page pageEncoding="UTF-8"%> + +<%-- Uncomment below lines to add portlet taglibs to jsp +<%@ page import="javax.portlet.*"%> +<%@ taglib uri="http://java.sun.com/portlet_2_0" prefix="portlet"%> + + +--%> + + +
\ No newline at end of file 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..ae4c1f4 --- /dev/null +++ b/src/main/webapp/WEB-INF/liferay-display.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/src/main/webapp/WEB-INF/liferay-plugin-package.properties b/src/main/webapp/WEB-INF/liferay-plugin-package.properties new file mode 100644 index 0000000..2898b81 --- /dev/null +++ b/src/main/webapp/WEB-INF/liferay-plugin-package.properties @@ -0,0 +1,9 @@ +name=Report Generator +module-group-id=liferay +module-incremental-version=1 +tags= +short-description= +change-log= +page-url=http://www.liferay.com +author=Liferay, Inc. +licenses=MIT \ 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..fe41288 --- /dev/null +++ b/src/main/webapp/WEB-INF/liferay-portlet.xml @@ -0,0 +1,28 @@ + + + + + + reporting + false + false + false + /ReportGenerator.css + + + administrator + Administrator + + + guest + Guest + + + power-user + Power User + + + user + User + + diff --git a/src/main/webapp/WEB-INF/portlet.xml b/src/main/webapp/WEB-INF/portlet.xml new file mode 100644 index 0000000..20c6017 --- /dev/null +++ b/src/main/webapp/WEB-INF/portlet.xml @@ -0,0 +1,25 @@ + + + + + reporting + Report Generator + org.gcube.portlets.user.reportgenerator.server.portlet.ReportGeneratorPortlet + + view-jsp + /WEB-INF/jsp/ReportGeneratorPortlet_view.jsp + + 0 + + text/html + + + Report Generator + Report Generator + Report Generator + + + administrator + + + diff --git a/src/main/webapp/WEB-INF/web.xml b/src/main/webapp/WEB-INF/web.xml new file mode 100644 index 0000000..ac5168a --- /dev/null +++ b/src/main/webapp/WEB-INF/web.xml @@ -0,0 +1,134 @@ + + + ReportGenerator-portlet + + + ReportServiceImpl + org.gcube.portlets.user.reportgenerator.server.servlet.ReportServiceImpl + + + + ReportServiceImpl + /reports/ReportServiceImpl + + + + + quicktourServlet + org.gcube.portlets.user.guidedtour.server.TourServiceImpl + + + + quicktourServlet + /reports/quicktourServlet + + + + + ImagesUploadServlet + org.gcube.portlets.user.reportgenerator.server.servlet.ImagesUploadServlet + + + + ImagesUploadServlet + /reports/ImagesUploadServlet + + + + WorkspaceLightService + org.gcube.portlets.user.workspace.lighttree.server.WorkspaceServiceImpl + + + + WorkspaceLightService + /reports/WorkspaceLightService + + + + + + remoteLoggerServiceImpl + com.allen_sauer.gwt.log.server.RemoteLoggerServiceImpl + + + + remoteLoggerServiceImpl + /reports/gwt-log + + + + + WorkspaceService + org.gcube.portlets.user.workspace.server.GWTWorkspaceServiceImpl + + + + WorkspaceService + /reports/WorkspaceService + + + + UploadService + org.gcube.portlets.user.workspace.server.UploadServlet + + + + UploadService + /reports/UploadService + + + + DownloadService + org.gcube.portlets.user.workspace.server.DownloadServlet + + + + DownloadService + /reports/DownloadService + + + + ImageService + org.gcube.portlets.user.workspace.server.ImageServlet + + + + ImageService + /reports/ImageService + + + + + + + + + + + DownloadService + /org.gcube.portlets.user.reportgenerator.ReportGeneratorJUnit/DownloadService + + + WorkspaceService + /org.gcube.portlets.user.reportgenerator.ReportGeneratorJUnit/WorkspaceService + + + ImageService + /org.gcube.portlets.user.reportgenerator.ReportGeneratorJUnit/ImageService + + + + UploadService + /org.gcube.portlets.user.reportgenerator.ReportGeneratorJUnit/UploadService + + + + ReportGenerator.html + + 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..608d24b --- /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: black; + filter: alpha(opacity = 10); + opacity: .1; + left: 0px; + top: 0px; +} + +.x-progress { + font-family: tahoma, arial, helvetica, sans-serif; +} + +.x-float-right { + float: right; +} + +.x-toolbar .x-float-right { + margin-right: 4px; +} + +.x-border { + border: 1px solid #99BBE8; +} + +.x-border-top { + border-top: 1px solid #99BBE8; +} + +.x-layout-popup { + background-color: #DFE8F6; + border: 1px solid #7CA4D9; +} + +.x-panel-popup-body { + border-top: 1px solid #99BBE8; +} + +.x-layout-collapsed .x-panel-header { + border-left: none; + border-right: none; + border-top: none; +} + +.x-layout-collapsed .x-panel-header .x-tool { + margin: 0 0 0 -4px; + padding: 0px; +} + +.x-layout-collapsed { + position: absolute; + visibility: hidden; + background-color: #d2e0f2; + width: 20px; + height: 20px; + overflow: hidden; + border: 1px solid #98c0f4; + z-index: 20; +} + +.ext-border-box .x-layout-collapsed { + width: 22px; + height: 22px; +} + +.x-layout-collapsed-over { + cursor: pointer; + background-color: #d9e8fb; +} + +.x-layout-collapsed-west .x-layout-collapsed-tools,.x-layout-collapsed-east .x-layout-collapsed-tools { + position: absolute; + top: 0; + left: 0; + width: 20px; + height: 20px; +} + +.x-panel-toolbar { + float: right; +} + +.x-cursor-row-resize { + cursor: n-resize; + cursor: row-resize; +} + +.x-date-picker,.x-date-picker a { + font-size: 11px; +} + +.x-date-days { + table-layout: fixed; + width: 100%; +} + +.x-date-days td { + width: 25px; + border: none; +} + +.x-date-days td span { + display: block; + padding: 2px 7px 2px 2px; +} + +.x-date-days td { + background: #DFECFB url(../images/default/shared/glass-bg.gif) repeat-x scroll left top; + border-bottom: 1px solid #A3BAD9; + border-collapse: separate; + color: #233D6D; + cursor: default; + font-family: arial, helvetica, tahoma, sans-serif; + font-size: 10px; + font-size-adjust: none; + font-stretch: normal; + font-style: normal; + font-variant: normal; + font-weight: normal; + line-height: normal; + padding: 0pt; + text-align: right !important; +} + +.x-date-picker .x-date-header { + background: url(../images/default/shared/hd-sprite.gif) repeat-x 0 -83px; + height: 22px; + left: 10px; + top: 10px; + width: 157px; +} + +.x-date-header .x-btn .x-btn-text { + color: #fff; +} + +.x-date-picker-footer { + width: 100%; +} + +.x-date-picker-footer td { + text-align: center; +} + +.x-date-left { + background: transparent url(../images/default/shared/hd-sprite.gif) repeat-x scroll 0pt -83px; + color: #FFFFFF; + font-family: "sans serif", tahoma, verdana, helvetica; + font-size: 11px; + font-size-adjust: none; + font-stretch: normal; + font-style: normal; + font-variant: normal; + font-weight: bold; + line-height: normal; + overflow: hidden; +} + +.x-modal { + position: absolute; + z-index: 10; + background-color: black; + filter: alpha(opacity = 10); + opacity: .1; + left: 0px; + top: 0px; +} + +.x-progress { + font-family: tahoma, arial, helvetica, sans-serif; +} + +.x-float-right { + float: right; +} + +.x-layout-popup { + background-color: #DFE8F6; + border: 1px solid #7CA4D9; +} + +.x-layout-collapsed .x-panel-header .x-tool { + margin: 0 0 0 -4px; + padding: 0px; +} + +.ext-border-box .x-layout-collapsed { + width: 22px; + height: 22px; +} + +.x-layout-collapsed-over { + cursor: pointer; + background-color: #d9e8fb; +} + +.x-layout-collapsed-west .x-layout-collapsed-tools,.x-layout-collapsed-east .x-layout-collapsed-tools { + position: absolute; + top: 0; + left: 0; + width: 20px; + height: 20px; +} + +.x-panel-toolbar { + float: right; +} + +.x-cursor-col-resize { + cursor: e-resize; + cursor: col-resize; +} + +.x-cursor-row-resize { + cursor: n-resize; + cursor: row-resize; +} + +.x-drag-proxy { + border: 1px dashed #3b5a82; + background-color: #EDEDED; + filter: alpha(opacity = 50); + opacity: .5; + background-color: #c3daf9; + z-index: 20000; + overflow: hidden; + position: absolute; + left: 0;; + top: 0; + cursor: move; +}.x-tab-panel { + overflow: hidden; + -moz-outline: none; + outline: 0 none; +} + +.x-tab-panel-header,.x-tab-panel-footer { + border: 1px solid; + overflow: hidden; + zoom: 1; +} + +.x-tab-panel-header { + border: 1px solid; + padding-bottom: 2px; +} + +.x-tab-panel-footer { + border: 1px solid; + padding-top: 2px; +} + +.x-tab-strip-wrap { + width: 100%; + overflow: hidden; + position: relative; + zoom: 1; +} + +ul.x-tab-strip { + display: block; + width: 7000px; + zoom: 1; +} + +ul.x-tab-strip-top { + padding-top: 1px; + background: repeat-x bottom; + border-bottom: 1px solid; +} + +ul.x-tab-strip-bottom { + padding-bottom: 1px; + background: repeat-x top; + border-top: 1px solid; + border-bottom: 0 none; +} + +.x-tab-panel-header-plain .x-tab-strip-top { + background: transparent !important; + padding-top: 0 !important; +} + +.x-tab-panel-header-plain { + background: transparent !important; + border-width: 0 !important; + padding-bottom: 0 !important; +} + +.x-tab-panel-header-plain .x-tab-strip-spacer,.x-tab-panel-footer-plain .x-tab-strip-spacer + { + border: 1px solid; + height: 2px; + font-size: 1px; + line-height: 1px; +} + +.x-tab-panel-header-plain .x-tab-strip-spacer { + border-top: 0 none; +} + +.x-tab-panel-footer-plain .x-tab-strip-spacer { + border-bottom: 0 none; +} + +.x-tab-panel-footer-plain .x-tab-strip-bottom { + background: transparent !important; + padding-bottom: 0 !important; +} + +.x-tab-panel-footer-plain { + background: transparent !important; + border-width: 0 !important; + padding-top: 0 !important; +} + +.ext-border-box .x-tab-panel-header-plain .x-tab-strip-spacer,.ext-border-box .x-tab-panel-footer-plain .x-tab-strip-spacer + { + height: 3px; +} + +ul.x-tab-strip li { + float: left; + position: relative; + margin-left: 2px; +} + +ul.x-tab-strip li.x-tab-edge { + float: left; + margin: 0 !important; + padding: 0 !important; + border: 0 none !important; + font-size: 1px !important; + line-height: 1px !important; + overflow: hidden; + zoom: 1; + background: transparent !important; + width: 1px; +} + +.x-tab-strip a,.x-tab-strip span,.x-tab-strip em { + display: block; +} + +.x-tab-strip a { + text-decoration: none !important; + -moz-outline: none; + outline: none; + cursor: pointer; +} + +.x-tab-strip-inner { + overflow: hidden; + text-overflow: ellipsis; +} + +.x-tab-strip span.x-tab-strip-text { + white-space: nowrap; + cursor: pointer; + padding: 4px 0; +} + +.x-tab-strip-top .x-tab-with-icon .x-tab-right { + padding-left: 6px; +} + +.x-tab-strip .x-tab-with-icon span.x-tab-strip-text { + padding-left: 20px; + background-position: 0 3px; + background-repeat: no-repeat; +} + +.x-tab-strip-active,.x-tab-strip-active a.x-tab-right { + cursor: default; +} + +.x-tab-strip-active span.x-tab-strip-text { + cursor: default; +} + +.x-tab-strip-disabled .x-tabs-text { + cursor: default; +} + +.x-tab-panel-body { + overflow: hidden; +} + +.x-tab-panel-bwrap { + overflow: hidden; +} + +.ext-ie .x-tab-strip .x-tab-right { + position: relative; +} + +.x-tab-strip-top .x-tab-strip-active .x-tab-right { + margin-bottom: -1px; +} + +.x-tab-strip-top .x-tab-strip-active .x-tab-right span.x-tab-strip-text + { + padding-bottom: 5px; +} + +.x-tab-strip-bottom .x-tab-strip-active .x-tab-right { + margin-top: -1px; +} + +.x-tab-strip-bottom .x-tab-strip-active .x-tab-right span.x-tab-strip-text + { + padding-top: 5px; +} + +.x-tab-strip-top .x-tab-right { + background: transparent no-repeat 0 -51px; + padding-left: 10px; +} + +.x-tab-strip-top .x-tab-left { + background: transparent no-repeat right -351px; + padding-right: 10px; +} + +.x-tab-strip-top .x-tab-strip-inner { + background: transparent repeat-x 0 -201px; +} + +.x-tab-strip-top .x-tab-strip-over .x-tab-right { + background-position: 0 -101px; +} + +.x-tab-strip-top .x-tab-strip-over .x-tab-left { + background-position: right -401px; +} + +.x-tab-strip-top .x-tab-strip-over .x-tab-strip-inner { + background-position: 0 -251px; +} + +.x-tab-strip-top .x-tab-strip-active .x-tab-right { + background-position: 0 0; +} + +.x-tab-strip-top .x-tab-strip-active .x-tab-left { + background-position: right -301px; +} + +.x-tab-strip-top .x-tab-strip-active .x-tab-strip-inner { + background-position: 0 -151px; +} + +.x-tab-strip-bottom .x-tab-right { + background: no-repeat bottom right; +} + +.x-tab-strip-bottom .x-tab-left { + background: no-repeat bottom left; +} + +.x-tab-strip-bottom .x-tab-strip-active .x-tab-right { + background: no-repeat bottom left; +} + +.x-tab-strip-bottom .x-tab-strip-active .x-tab-left { + background: no-repeat bottom right; +} + +.x-tab-strip-bottom .x-tab-left { + padding: 0 10px; +} + +.x-tab-strip-bottom .x-tab-right { + padding: 0; +} + +.x-tab-strip .x-tab-strip-close { + display: none; +} + +.x-tab-strip-closable { + position: relative; +} + +.x-tab-strip-closable .x-tab-left { + padding-right: 19px; +} + +.x-tab-strip .x-tab-strip-closable a.x-tab-strip-close { + opacity: .6; + -moz-opacity: .6; + background-repeat: no-repeat; + display: block; + width: 11px; + height: 11px; + position: absolute; + top: 3px; + right: 3px; + cursor: pointer; + z-index: 2; +} + +.x-tab-strip .x-tab-strip-active a.x-tab-strip-close { + opacity: .8; + -moz-opacity: .8; +} + +.x-tab-strip .x-tab-strip-closable a.x-tab-strip-close:hover { + opacity: 1; + -moz-opacity: 1; +} + +.x-tab-panel-body { + border: 1px solid; +} + +.x-tab-panel-body-top { + border-top: 0 none; +} + +.x-tab-panel-body-bottom { + border-bottom: 0 none; +} + +.x-tab-scroller-left { + background: transparent no-repeat -18px 0; + border-bottom: 1px solid; + width: 18px; + position: absolute; + left: 0; + top: 0; + z-index: 10; + cursor: pointer; +} + +.x-tab-scroller-left-over { + background-position: 0 0; +} + +.x-tab-scroller-left-disabled { + background-position: -18px 0; + opacity: .5; + -moz-opacity: .5; + filter: alpha(opacity = 50); + cursor: default; +} + +.x-tab-scroller-right { + background: transparent no-repeat 0 0; + border-bottom: 1px solid; + width: 18px; + position: absolute; + right: 0; + top: 0; + z-index: 10; + cursor: pointer; +} + +.x-tab-scroller-right-over { + background-position: -18px 0; +} + +.x-tab-scroller-right-disabled { + background-position: 0 0; + opacity: .5; + -moz-opacity: .5; + filter: alpha(opacity = 50); + cursor: default; +} + +.x-tab-scrolling-bottom .x-tab-scroller-left,.x-tab-scrolling-bottom .x-tab-scroller-right + { + margin-top: 1px; +} + +.x-tab-scrolling .x-tab-strip-wrap { + margin-left: 18px; + margin-right: 18px; +} + +.x-tab-scrolling { + position: relative; +} + +.x-tab-panel-bbar .x-toolbar { + border: 1px solid; + border-top: 0 none; + overflow: hidden; + padding: 2px; +} + +.x-tab-panel-tbar .x-toolbar { + border: 1px solid; + border-top: 0 none; + overflow: hidden; + padding: 2px; +} + +.x-tab-strip li .x-tab-image { + position: absolute; + top: 3px; + left: 5px; +} + +.ext-ie8 .x-tab-strip li .x-tab-image,.ext-ie8-compatibility .x-tab-strip li .x-tab-image { + top: 4px; + left: 6px; +} + +.ext-ie8 .x-tab-strip-top .x-tab-right,.ext-ie8-compatibility .x-tab-strip-top .x-tab-right + { + top: 1px; +} + +.ext-strict .ext-ie8 .x-tab-strip-top .x-tab-right,.ext-ie8 .x-tab-panel-header-plain .x-tab-strip-top .x-tab-right,.ext-ie8-compatibility .x-tab-panel-header-plain .x-tab-strip-top .x-tab-right + { + top: 0; +} +.ext-strict .ext-ie7 .x-panel-body { + position: relative !important; +} + +.x-form-field { + margin: 0; +} + +.foo { + padding: 1px; +} + +.foo { + margin: 4px; +} + +.x-form-text,textarea.x-form-field { + padding: 1px 3px; + background: repeat-x 0 0; + border: 1px solid; +} + +.ext-gecko textarea.x-form-field { + padding: 0; +} + +.x-form-text,.ext-ie .x-form-file { + height: 22px; + line-height: 18px; + vertical-align: middle; +} + +.ext-ie6 .x-form-text,.ext-ie7 .x-form-text { + margin: -1px 0; + height: 22px; /* ie quirks */ + line-height: 18px; +} + +.ext-ie8-compatibility .x-form-text { + margin: 0; +} + +.ext-ie textarea.x-form-field { + margin: -1px 0; /* ie bogus margin bug */ +} + +.ext-strict .ext-ie8 textarea.x-form-field,.ext-strict .ext-ie8-compatibility textarea.x-form-field { + margin: 0; +} + +.x-form-field-wrap .x-form-text { + position: relative; +} + +.ext-strict .x-form-text { + height: 18px; +} + +.ext-safari.ext-mac textarea.x-form-field { + margin-bottom: -2px; +} + +.ext-gecko .x-form-text,.ext-ie8 .x-form-text { + padding-top: 2px; + padding-bottom: 0; +} + +textarea { + resize: none; +} + +.x-form-select-one { + height: 20px; + line-height: 18px; + vertical-align: middle; + border: 1px solid; +} + +.x-form-check-wrap { + line-height: 18px; + height: 22px; + white-space: nowrap; +} + +.x-editor .x-form-check-wrap { + border: 1px solid; + padding: 2px; + height: 14px; +} + +.x-editor .x-form-checkbox { + height: 13px; +} + +.x-form-check-group-label { + border-bottom: 1px solid; + margin-bottom: 5px; + padding-left: 3px !important; + float: none !important; +} + +.x-form-field-wrap .x-form-trigger { + width: 17px; + height: 21px; + border: 0; + background: transparent no-repeat 0 0; + cursor: pointer; + border-bottom: 1px solid; + position: absolute; + top: 0; +} + +.ext-safari .x-form-field-wrap .x-form-trigger { + height: 21px; +} + +.ext-strict .ext-safari .x-form-field-wrap .x-form-trigger { + height: 23px; +} + +.ext-strict .ext-safari .x-small-editor .x-form-field-wrap .x-form-trigger { + height: 19px; +} + +.ext-strict .ext-ie8 .x-small-editor .x-form-field-wrap .x-form-trigger { + height: 20px !important; +} + +.ext-strict .ext-gecko .x-small-editor .x-form-field-wrap .x-form-trigger { + height: 21px !important; +} + +.x-form-field-wrap .x-form-date-trigger,.x-form-field-wrap .x-form-clear-trigger,.x-form-field-wrap .x-form-search-trigger + { + cursor: pointer; +} + +.ext-safari .x-form-field-wrap .x-form-trigger,.ext-gecko .x-form-field-wrap .x-form-trigger { + right: 0; +} + +.x-form-field-wrap .x-form-twin-triggers .x-form-trigger { + position: static; + top: auto; + vertical-align: top; +} + +.x-form-field-wrap { + position: relative; + left: 0; + top: 0; + zoom: 1; + white-space: nowrap; + text-align: left; +} + +.x-form-field-wrap .x-form-trigger-over { + background-position: -17px 0; +} + +.x-form-field-wrap .x-form-trigger-click { + background-position: -34px 0; +} + +.x-trigger-wrap-focus .x-form-trigger { + background-position: -51px 0; +} + +.x-trigger-wrap-focus .x-form-trigger-over { + background-position: -68px 0; +} + +.x-trigger-wrap-focus .x-form-trigger-click { + background-position: -85px 0; +} + +.x-trigger-wrap-focus .x-form-trigger { + border-bottom: 1px solid; +} + +.x-item-disabled .x-form-trigger-over { + background-position: 0 0 !important; + border-bottom: 1px solid; +} + +.x-item-disabled .x-form-trigger-click { + background-position: 0 0 !important; + border-bottom: 1px solid; +} + +.x-form-focus,textarea.x-form-focus { + border: 1px solid; +} + +.x-form-invalid,textarea.x-form-invalid { + background: repeat-x bottom; + border: 1px solid; +} + +.ext-safari .x-form-invalid { + border: 1px solid; +} + +.x-form-inner-invalid,textarea.x-form-inner-invalid { + background: repeat-x bottom; +} + +.x-editor { + padding: 0; + margin: 0; +} + +.x-form-grow-sizer { + left: -10000px; + padding: 8px 3px; + position: absolute; + visibility: hidden; + top: -10000px; + white-space: pre-wrap; + white-space: -moz-pre-wrap; + white-space: -pre-wrap; + white-space: -o-pre-wrap; + word-wrap: break-word; + zoom: 1; +} + +.x-form-grow-sizer p { + margin: 0 !important; + border: 0 none !important; + padding: 0 !important; +} + +.x-form-item { + display: block; + margin-bottom: 4px; +} + +.x-form-item .x-form-item-label { + display: block; + float: left; + width: 100px; + padding: 3px; + padding-left: 0; + clear: left; + z-index: 2; + position: relative; +} + +.x-form-element { + padding-left: 105px; + position: relative; +} + +.x-form-invalid-msg { + padding: 2px; + padding-left: 18px; + background: transparent no-repeat 0 2px; + line-height: 16px; + width: 200px; +} + +.x-form-label-left .x-form-item-label { + text-align: left; +} + +.x-form-label-right .x-form-item-label { + text-align: right; +} + +.x-form-label-top .x-form-item .x-form-item-label { + width: auto; + float: none; + clear: none; + display: inline; + margin-bottom: 4px; + position: static; +} + +.x-form-label-top .x-form-element { + padding-left: 0; + padding-top: 4px; +} + +.x-form-label-top .x-form-item { + padding-bottom: 4px; +} + +.x-small-editor .x-form-text { + height: 20px; + line-height: 16px; + vertical-align: middle; +} + +.ext-ie6 .x-small-editor .x-form-text,.ext-ie7 .x-small-editor .x-form-text { + height: 20px !important; + line-height: 16px !important; +} + +.ext-strict .x-small-editor .x-form-text { + height: 16px !important; +} + +.ext-strict .ext-ie8 .x-small-editor .x-form-text { + height: 17px !important; +} + +.ext-strict .ext-webkit .x-small-editor .x-form-text { + height: 18px !important; + padding: 0px 3px; +} + +.ext-strict .ext-gecko .x-small-editor .x-form-text { + height: 18px !important; +} + +.ext-strict .ext-gecko .x-edit-grid .x-small-editor .x-form-text { + height:17px !important; +} + +.ext-border-box .x-small-editor .x-form-text { + height: 20px; +} + +.x-small-editor .x-form-select-one { + height: 20px; + line-height: 16px; + vertical-align: middle; +} + +.x-small-editor .x-form-num-field { + text-align: right; +} + +.x-small-editor .x-form-field-wrap .x-form-trigger { + height: 19px; +} + +.x-form-clear { + clear: both; + overflow: hidden; + line-height: 0; + font-size: 0; + height: 0; +} + +.x-form-clear-left { + clear: left; + overflow: hidden; + line-height: 0; + font-size: 0; + height: 0; +} + +.x-form-cb-label { + width: auto !important; + float: none !important; + clear: none !important; + display: inline !important; + margin-left: 4px; +} + +.x-form-column { + float: left; + padding: 0; + margin: 0; + width: 48%; + overflow: hidden; + zoom: 1; +} + +.x-form .x-form-btns-ct .x-btn { + float: right; + clear: none; +} + +.x-form .x-form-btns-ct .x-form-btns td { + border: 0; + padding: 0; +} + +.x-form .x-form-btns-ct .x-form-btns-right table { + float: right; + clear: none; +} + +.x-form .x-form-btns-ct .x-form-btns-left table { + float: left; + clear: none; +} + +.x-form .x-form-btns-ct .x-form-btns-center { + text-align: center; +} + +.x-form .x-form-btns-ct .x-form-btns-center table { + margin: 0 auto; +} + +.x-form .x-form-btns-ct table td.x-form-btn-td { + padding: 3px; +} + +.x-form .x-form-btns-ct .x-btn-focus .x-btn-left { + background-position: 0 -147px; +} + +.x-form .x-form-btns-ct .x-btn-focus .x-btn-right { + background-position: 0 -168px; +} + +.x-form .x-form-btns-ct .x-btn-focus .x-btn-center { + background-position: 0 -189px; +} + +.x-form .x-form-btns-ct .x-btn-click .x-btn-center { + background-position: 0 -126px; +} + +.x-form .x-form-btns-ct .x-btn-click .x-btn-right { + background-position: 0 -84px; +} + +.x-form .x-form-btns-ct .x-btn-click .x-btn-left { + background-position: 0 -63px; +} + +.x-form-invalid-icon { + width: 16px; + height: 18px; + position: absolute; + left: 0; + top: 0; + display: block; + background: transparent no-repeat 0 2px; +} + +.x-fieldset { + border: 1px solid; + padding: 10px; + margin-bottom: 10px; + display: block; +} + +.ext-ie .x-fieldset legend { + margin-bottom: 10px; +} + +.ext-ie .x-fieldset { + padding-top: 0; + padding-bottom: 10px; +} + +.x-fieldset legend .x-tool-toggle { + margin-right: 3px; + margin-left: 0; + float: left !important; +} + +.x-fieldset legend input { + margin-right: 3px; + float: left !important; + height: 13px; + width: 13px; +} + +fieldset.x-panel-collapsed { + padding-bottom: 0 !important; + border-width: 1px 1px 0 1px !important; + border-left-color: transparent; + border-right-color: transparent; +} + +.ext-ie6 fieldset.x-panel-collapsed { + padding-bottom: 0 !important; + border-width: 1px 0 0 0 !important; + margin-left: 1px; + margin-right: 1px; +} + +fieldset.x-panel-collapsed .x-fieldset-bwrap { + visibility: hidden; + position: absolute; + left: -1000px; + top: -1000px; +} + +.ext-ie .x-fieldset-bwrap { + zoom: 1; +} + +.x-fieldset-noborder { + border: 0px none transparent; +} + +.x-fieldset-noborder legend { + margin-left: -3px; +} + +.ext-ie .x-fieldset-noborder legend { + position: relative; + margin-bottom: 23px; +} + +.ext-ie .x-fieldset-noborder legend span { + position: absolute; + left: 16px; +} + +.ext-gecko .x-form-item { + -moz-outline: none; + outline: 0 none; +} + +.x-hide-label label.x-form-item-label { + display: none !important; +} + +.x-hide-label .x-form-element { + padding-left: 0 !important; +} + +.x-fieldset { + overflow: hidden; +} + +/* make top of checkbox/tools visible in webkit */ +.ext-webkit .x-fieldset-header { + padding-top: 1px; +} + +.x-fieldset-bwrap { + overflow: hidden; + zoom: 1; +} + +.x-fieldset-body { + overflow: hidden; +} + +.x-combo-list .x-combo-selected { + border-color: #a3bae9 !important; +} + +.x-combo-list { + background-color: white !important; +} + +.ext-gecko .x-form-file { + height: inherit !important; +} + +.x-form-check { + background: none !important +} + +.x-form-radio { + background: none !important +} + +.x-form-label { + padding: 2px 3px 3px 0px; + font-size: 12px; +} + +.x-form-label-top .x-form-item { + padding-bottom: 0px; + margin-bottom: 2px; +} + +.ext-safari .x-form-text { + height: 22px; /* safari always same size */ + padding: 0 3px; + /* remove extra top/bottom padding */ +} + +.ext-safari .x-small-editor .x-form-text { + height: 20px; +} + +.x-form-group-label,.x-form-cb-label { + font: normal 12px tahoma, arial, helvetica, sans-serif; + padding-right: 10px; +} + +.x-form-list { + background: #FFFFFF url(../images/default/form/text-bg.gif) repeat-x scroll 0 0; + border: 1px solid #B5B8C8; +} + +/* + * FileUploadField component styles + */ +.x-form-file-wrap { + height: 22px; +} + +.x-form-file-wrap .x-form-file { + position: absolute; + right: 0; + -moz-opacity: 0; + filter: alpha(opacity : 0); + opacity: 0; + z-index: 2; + height: 22px; + top: 0; +} + +.x-form-file-wrap .x-form-file-btn { + position: absolute; + right: 0; + z-index: 1; + top: 0; +} + +.x-form-file-wrap .x-form-file-text { + z-index: 3; + color: #777; +} + +.x-form-invalid-icon { + background-position: 0 0 !important; +} + +.x-triggerfield-noedit { + cursor: pointer; +} + +.ext-webkit .x-form-checkbox:focus { + outline: auto !important; +} + +.x-spinner-field .x-form-twin-triggers .x-form-spinner-up, .x-spinner-field .x-form-twin-triggers .x-form-spinner-down { + height: 10px; + position: absolute; +} + +.ext-strict .ext-safari .x-form-field-wrap .x-form-spinner-up { + height: 10px; +} + +.ext-strict .ext-safari .x-form-field-wrap .x-form-spinner-down { + height: 12px; +} + +.x-spinner-field .x-form-twin-triggers .x-form-spinner-up { + top:0px; +} + +.x-spinner-field .x-form-twin-triggers .x-form-spinner-down { + top:11px; +} + +.x-spinner-field .x-form-twin-triggers { + width: 17px; +} + +.x-spinner-field .x-form-spinner-down { + background-position:0 -12px; +} + +.x-trigger-wrap-focus .x-form-spinner-up { + background-position:-85px 0; +} + +.x-trigger-wrap-focus .x-form-spinner-down { + background-position:-85px -12px; +} + +.x-form-field-wrap .x-form-spinner-overup{ + background-position:-17px 0; +} +.x-form-field-wrap .x-form-spinner-clickup{ + background-position:-34px 0; +} + +.x-trigger-wrap-focus .x-form-spinner-overup{ + background-position:-102px 0; +} + +.x-trigger-wrap-focus .x-form-spinner-clickup{ + background-position:-119px 0; +} + +.x-form-field-wrap .x-form-spinner-overdown{ + background-position:-51px -12px; +} +.x-form-field-wrap .x-form-spinner-clickdown{ + background-position:-68px -12px; +} +.x-trigger-wrap-focus .x-form-spinner-overdown{ + background-position:-136px -12px; +} +.x-trigger-wrap-focus .x-form-spinner-clickdown{ + background-position:-153px -12px; +}.x-btn{ + cursor:pointer; + white-space: nowrap; +} +.x-btn button{ + border:0 none; + background:transparent; + padding-left:3px; + padding-right:3px; + cursor:pointer; + margin:0; + overflow:hidden; + width:auto; + -moz-outline:0 none; + outline:0 none; +} +* html .ext-ie .x-btn button { + width:1px; +} +.ext-ie .x-item-disabled .x-btn-mc img { + filter: alpha(opacity=60); +} +.ext-gecko .x-btn button,.ext-webkit .x-btn button { + padding-left:0; + padding-right:0; +} +.ext-gecko .x-btn button::-moz-focus-inner { + padding:0; +} +.ext-ie .x-btn button { + padding-top:2px; +} +.x-btn td { + padding:0 !important; +} +.x-btn-text { + cursor:pointer; + white-space: nowrap; + padding:0; +} +.x-btn-noicon .x-btn-small .x-btn-text{ + height: 16px; +} +.x-btn-noicon .x-btn-medium .x-btn-text{ + height: 24px; +} +.x-btn-noicon .x-btn-large .x-btn-text{ + height: 32px; +} +.x-btn-icon .x-btn-text{ + background-position: center; + background-repeat: no-repeat; +} +.x-btn-icon .x-btn-small .x-btn-text{ + height: 16px; + width: 16px; +} +.x-btn-icon .x-btn-medium .x-btn-text{ + height: 24px; + width: 24px; +} +.x-btn-icon .x-btn-large .x-btn-text{ + height: 32px; + width: 32px; +} +.x-btn-text-icon .x-btn-icon-small-left .x-btn-text{ + background-position: 0 center; + background-repeat: no-repeat; + padding-left:18px; + height:16px; +} +.x-btn-text-icon .x-btn-icon-medium-left .x-btn-text{ + background-position: 0 center; + background-repeat: no-repeat; + padding-left:26px; + height:24px; +} +.x-btn-text-icon .x-btn-icon-large-left .x-btn-text{ + background-position: 0 center; + background-repeat: no-repeat; + padding-left:34px; + height:32px; +} +.x-btn-text-icon .x-btn-icon-small-top .x-btn-text{ + background-position: center 0; + background-repeat: no-repeat; + padding-top:18px; +} +.x-btn-text-icon .x-btn-icon-medium-top .x-btn-text{ + background-position: center 0; + background-repeat: no-repeat; + padding-top:26px; +} +.x-btn-text-icon .x-btn-icon-large-top .x-btn-text{ + background-position: center 0; + background-repeat: no-repeat; + padding-top:34px; +} +.x-btn-text-icon .x-btn-icon-small-right .x-btn-text{ + background-position: right center; + background-repeat: no-repeat; + padding-right:18px; + height:16px; +} +.x-btn-text-icon .x-btn-icon-medium-right .x-btn-text{ + background-position: right center; + background-repeat: no-repeat; + padding-right:26px; + height:24px; +} +.x-btn-text-icon .x-btn-icon-large-right .x-btn-text{ + background-position: right center; + background-repeat: no-repeat; + padding-right:34px; + height:32px; +} +.x-btn-text-icon .x-btn-icon-small-bottom .x-btn-text{ + background-position: center bottom; + background-repeat: no-repeat; + padding-bottom:18px; +} +.x-btn-text-icon .x-btn-icon-medium-bottom .x-btn-text{ + background-position: center bottom; + background-repeat: no-repeat; + padding-bottom:26px; +} +.x-btn-text-icon .x-btn-icon-large-bottom .x-btn-text{ + background-position: center bottom; + background-repeat: no-repeat; + padding-bottom:34px; +} +.x-btn-tr i, .x-btn-tl i, .x-btn-mr i, .x-btn-ml i, .x-btn-br i, .x-btn-bl i{ + font-size:1px; + line-height:1px; + width:3px; + display:block; + overflow:hidden; +} +.x-btn-tr i, .x-btn-tl i, .x-btn-br i, .x-btn-bl i{ + height:3px; +} +.x-btn-tl{ + width:3px; + height:3px; + background:no-repeat 0 0; +} +.x-btn-tr{ + width:3px; + height:3px; + background:no-repeat -3px 0; +} +.x-btn-tc{ + height:3px; + background:repeat-x 0 -6px; +} +.x-btn-ml{ + width:3px; + background:no-repeat 0 -24px; +} +.x-btn-mr{ + width:3px; + background:no-repeat -3px -24px; +} +.x-btn-mc{ + background:repeat-x 0 -1096px; + vertical-align: middle; + text-align:center; + padding:0 5px; + cursor:pointer; + white-space:nowrap; +} +.x-btn-bl{ + width:3px; + height:3px; + background:no-repeat 0 -3px; +} +.x-btn-br{ + width:3px; + height:3px; + background:no-repeat -3px -3px; +} +.x-btn-bc{ + height:3px; + background:repeat-x 0 -15px; +} +.x-btn-over .x-btn-tl{ + background-position: -6px 0; +} +.x-btn-over .x-btn-tr{ + background-position: -9px 0; +} +.x-btn-over .x-btn-tc{ + background-position: 0 -9px; +} +.x-btn-over .x-btn-ml{ + background-position: -6px -24px; +} +.x-btn-over .x-btn-mr{ + background-position: -9px -24px; +} +.x-btn-over .x-btn-mc{ + background-position: 0 -2168px; +} +.x-btn-over .x-btn-bl{ + background-position: -6px -3px; +} +.x-btn-over .x-btn-br{ + background-position: -9px -3px; +} +.x-btn-over .x-btn-bc{ + background-position: 0 -18px; +} +.ext-webkit .x-btn-focus .x-btn-tl{ + background-position: -6px 0; +} +.ext-webkit .x-btn-focus .x-btn-tr{ + background-position: -9px 0; +} +.ext-webkit .x-btn-focus .x-btn-tc{ + background-position: 0 -9px; +} +.ext-webkit .x-btn-focus .x-btn-ml{ + background-position: -6px -24px; +} +.ext-webkit .x-btn-focus .x-btn-mr{ + background-position: -9px -24px; +} +.ext-webkit .x-btn-focus .x-btn-mc{ + background-position: 0 -2168px; +} +.ext-webkit .x-btn-focus .x-btn-bl{ + background-position: -6px -3px; +} +.ext-webkit .x-btn-focus .x-btn-br{ + background-position: -9px -3px; +} +.ext-webkit .x-btn-focus .x-btn-bc{ + background-position: 0 -18px; +} +.x-btn-click .x-btn-tl, .x-btn-menu-active .x-btn-tl, .x-btn-pressed .x-btn-tl{ + background-position: -12px 0 !important; +} +.x-btn-click .x-btn-tr, .x-btn-menu-active .x-btn-tr, .x-btn-pressed .x-btn-tr{ + background-position: -15px 0 !important; +} +.x-btn-click .x-btn-tc, .x-btn-menu-active .x-btn-tc, .x-btn-pressed .x-btn-tc{ + background-position: 0 -12px !important; +} +.x-btn-click .x-btn-ml, .x-btn-menu-active .x-btn-ml, .x-btn-pressed .x-btn-ml{ + background-position: -12px -24px !important; +} +.x-btn-click .x-btn-mr, .x-btn-menu-active .x-btn-mr, .x-btn-pressed .x-btn-mr{ + background-position: -15px -24px !important; +} +.x-btn-click .x-btn-mc, .x-btn-menu-active .x-btn-mc, .x-btn-pressed .x-btn-mc{ + background-position: 0 -3240px !important; +} +.x-btn-click .x-btn-bl, .x-btn-menu-active .x-btn-bl, .x-btn-pressed .x-btn-bl{ + background-position: -12px -3px !important; +} +.x-btn-click .x-btn-br, .x-btn-menu-active .x-btn-br, .x-btn-pressed .x-btn-br{ + background-position: -15px -3px !important; +} +.x-btn-click .x-btn-bc, .x-btn-menu-active .x-btn-bc, .x-btn-pressed .x-btn-bc{ + background-position: 0 -21px !important; +} +.x-btn-disabled *{ + cursor:default !important; +} +.x-btn-mc em.x-btn-arrow { + display:block; + background:transparent no-repeat right center; + padding-right:10px; +} +.x-btn-mc em.x-btn-split { + display:block; + background:transparent no-repeat right center; + padding-right:14px; +} +.x-btn-mc em.x-btn-arrow-bottom { + display:block; + background:transparent no-repeat center bottom; + padding-bottom:14px; +} +.x-btn-mc em.x-btn-split-bottom { + display:block; + background:transparent no-repeat center bottom; + padding-bottom:14px; +} +.x-btn-as-arrow .x-btn-mc em { + display:block; + background:transparent; + padding-bottom:14px; +} +.x-btn-group { + padding:1px; +} +.x-btn-group-header { + padding:2px; + text-align:center; +} +.x-btn-group-tc { + background: transparent repeat-x 0 0; + overflow:hidden; +} +.x-btn-group-tl { + background: transparent no-repeat 0 0; + padding-left:3px; + zoom:1; +} +.x-btn-group-tr { + background: transparent no-repeat right 0; + zoom:1; + padding-right:3px; +} +.x-btn-group-bc { + background: transparent repeat-x 0 bottom; + zoom:1; +} +.x-btn-group-bc .x-panel-footer { + zoom:1; +} +.x-btn-group-bl { + background: transparent no-repeat 0 bottom; + padding-left:3px; + zoom:1; +} +.x-btn-group-br { + background: transparent no-repeat right bottom; + padding-right:3px; + zoom:1; +} +.x-btn-group-mc { + border:0 none; + padding:1px 0 0 0; + margin:0; +} +.x-btn-group-mc .x-btn-group-body { + background:transparent; + border: 0 none; +} +.x-btn-group-ml { + background: transparent repeat-y 0 0; + padding-left:3px; + zoom:1; +} +.x-btn-group-mr { + background: transparent repeat-y right 0; + padding-right:3px; + zoom:1; +} +.x-btn-group-bc .x-btn-group-footer { + padding-bottom:6px; +} +.x-panel-nofooter .x-btn-group-bc { + height:3px; + font-size:0; + line-height:0; +} +.x-btn-group-bwrap { + overflow:hidden; + zoom:1; +} +.x-btn-group-body { + overflow:hidden; + zoom:1; +} +.x-btn-group-notitle .x-btn-group-tc { + background: transparent repeat-x 0 0; + overflow:hidden; + height:2px; +} +.x-toolbar{ + border-style:solid; + border-width:0 0 1px 0; + display: block; + padding:2px; + background:repeat-x top left; + position:relative; + left:0; + top:0; + zoom:1; + overflow:hidden; +} +.x-toolbar .x-item-disabled .x-btn-icon { + opacity: .35; + -moz-opacity: .35; + filter: alpha(opacity=35); +} +.x-toolbar td { + vertical-align:middle; +} +.x-toolbar td,.x-toolbar span,.x-toolbar input,.x-toolbar div,.x-toolbar select,.x-toolbar label{ + white-space: nowrap; +} +.x-toolbar .x-item-disabled { + cursor:default; + opacity:.6; + -moz-opacity:.6; + filter:alpha(opacity=60); +} + +.x-toolbar .x-item-disabled *{ + cursor:default; +} + +.x-toolbar .x-toolbar-cell { + vertical-align:middle; +} +.x-toolbar .x-btn-tl, .x-toolbar .x-btn-tr, .x-toolbar .x-btn-tc, .x-toolbar .x-btn-ml, .x-toolbar .x-btn-mr, +.x-toolbar .x-btn-mc, .x-toolbar .x-btn-bl, .x-toolbar .x-btn-br, .x-toolbar .x-btn-bc +{ + background-position: 500px 500px; +} +.x-toolbar .x-btn-over .x-btn-tl{ + background-position: -6px 0; +} +.x-toolbar .x-btn-over .x-btn-tr{ + background-position: -9px 0; +} +.x-toolbar .x-btn-over .x-btn-tc{ + background-position: 0 -9px; +} +.x-toolbar .x-btn-over .x-btn-ml{ + background-position: -6px -24px; +} +.x-toolbar .x-btn-over .x-btn-mr{ + background-position: -9px -24px; +} +.x-toolbar .x-btn-over .x-btn-mc{ + background-position: 0 -2168px; +} +.x-toolbar .x-btn-over .x-btn-bl{ + background-position: -6px -3px; +} +.x-toolbar .x-btn-over .x-btn-br{ + background-position: -9px -3px; +} +.x-toolbar .x-btn-over .x-btn-bc{ + background-position: 0 -18px; +} +.x-toolbar .x-btn-click .x-btn-tl, .x-toolbar .x-btn-menu-active .x-btn-tl, .x-toolbar .x-btn-pressed .x-btn-tl{ + background-position: -12px 0; +} +.x-toolbar .x-btn-click .x-btn-tr, .x-toolbar .x-btn-menu-active .x-btn-tr, .x-toolbar .x-btn-pressed .x-btn-tr{ + background-position: -15px 0; +} +.x-toolbar .x-btn-click .x-btn-tc, .x-toolbar .x-btn-menu-active .x-btn-tc, .x-toolbar .x-btn-pressed .x-btn-tc{ + background-position: 0 -12px; +} +.x-toolbar .x-btn-click .x-btn-ml, .x-toolbar .x-btn-menu-active .x-btn-ml, .x-toolbar .x-btn-pressed .x-btn-ml{ + background-position: -12px -24px; +} +.x-toolbar .x-btn-click .x-btn-mr, .x-toolbar .x-btn-menu-active .x-btn-mr, .x-toolbar .x-btn-pressed .x-btn-mr{ + background-position: -15px -24px; +} +.x-toolbar .x-btn-click .x-btn-mc, .x-toolbar .x-btn-menu-active .x-btn-mc, .x-toolbar .x-btn-pressed .x-btn-mc{ + background-position: 0 -3240px; +} +.x-toolbar .x-btn-click .x-btn-bl, .x-toolbar .x-btn-menu-active .x-btn-bl, .x-toolbar .x-btn-pressed .x-btn-bl{ + background-position: -12px -3px; +} +.x-toolbar .x-btn-click .x-btn-br, .x-toolbar .x-btn-menu-active .x-btn-br, .x-toolbar .x-btn-pressed .x-btn-br{ + background-position: -15px -3px; +} +.x-toolbar .x-btn-click .x-btn-bc, .x-toolbar .x-btn-menu-active .x-btn-bc, .x-toolbar .x-btn-pressed .x-btn-bc{ + background-position: 0 -21px; +} +.x-toolbar div.xtb-text{ + padding:2px 2px 0; + line-height:16px; + display:block; +} +.x-toolbar .xtb-sep { + background-position: center; + background-repeat: no-repeat; + display: block; + font-size: 1px; + height: 16px; + width:4px; + overflow: hidden; + cursor:default; + margin: 0 2px 0; + border:0; +} +.x-toolbar .xtb-spacer { + width:2px; +} +.x-tbar-page-number{ + width:24px; + height:14px; +} +.x-paging-info { + position:absolute; + top:5px; + right: 8px; +} +.x-toolbar-ct { + width:100%; +} +.x-panel-tbar, .x-panel-bbar, .x-window-tbar, .x-window-bbar, .x-tab-panel-tbar, .x-tab-panel-bbar, .x-plain-tbar, .x-plain-bbar { + overflow:hidden; + zoom:1; +} +.x-toolbar-more .x-btn-small .x-btn-text{ + height: 16px; + width: 12px; +} +.x-toolbar-more em.x-btn-arrow { + display:inline; + background:transparent; + padding-right:0; +} +.x-toolbar-more .x-btn-mc em.x-btn-arrow { + background-image: none; +} +div.x-toolbar-no-items { + color:gray !important; + padding:5px 10px !important; +}.x-resizable-handle { + position:absolute; + z-index:100; + font-size:1px; + line-height:6px; + overflow:hidden; + filter:alpha(opacity=0); + opacity:0; + zoom:1; +} +.x-resizable-handle-east{ + width:6px; + cursor:e-resize; + right:0; + top:0; + height:100%; +} +.ext-ie .x-resizable-handle-east { + margin-right:-1px; +} +.x-resizable-handle-south{ + width:100%; + cursor:s-resize; + left:0; + bottom:0; + height:6px; +} +.ext-ie .x-resizable-handle-south { + margin-bottom:-1px; +} +.x-resizable-handle-west{ + width:6px; + cursor:w-resize; + left:0; + top:0; + height:100%; +} +.x-resizable-handle-north{ + width:100%; + cursor:n-resize; + left:0; + top:0; + height:6px; +} +.x-resizable-handle-southeast{ + width:6px; + cursor:se-resize; + right:0; + bottom:0; + height:6px; + z-index:101; +} +.x-resizable-handle-northwest{ + width:6px; + cursor:nw-resize; + left:0; + top:0; + height:6px; + z-index:101; +} +.x-resizable-handle-northeast{ + width:6px; + cursor:ne-resize; + right:0; + top:0; + height:6px; + z-index:101; +} +.x-resizable-handle-southwest{ + width:6px; + cursor:sw-resize; + left:0; + bottom:0; + height:6px; + z-index:101; +} +.x-resizable-over .x-resizable-handle, .x-resizable-pinned .x-resizable-handle{ + filter:alpha(opacity=100); + opacity:1; +} +.x-resizable-over .x-resizable-handle-east, .x-resizable-pinned .x-resizable-handle-east, +.x-resizable-over .x-resizable-handle-west, .x-resizable-pinned .x-resizable-handle-west +{ + background-position: left; +} +.x-resizable-over .x-resizable-handle-south, .x-resizable-pinned .x-resizable-handle-south, +.x-resizable-over .x-resizable-handle-north, .x-resizable-pinned .x-resizable-handle-north +{ + background-position: top; +} +.x-resizable-over .x-resizable-handle-southeast, .x-resizable-pinned .x-resizable-handle-southeast{ + background-position: top left; +} +.x-resizable-over .x-resizable-handle-northwest, .x-resizable-pinned .x-resizable-handle-northwest{ + background-position:bottom right; +} +.x-resizable-over .x-resizable-handle-northeast, .x-resizable-pinned .x-resizable-handle-northeast{ + background-position: bottom left; +} +.x-resizable-over .x-resizable-handle-southwest, .x-resizable-pinned .x-resizable-handle-southwest{ + background-position: top right; +} +.x-resizable-proxy{ + border: 1px dashed; + position:absolute; + overflow:hidden; + display:none; + left:0; + top:0; + z-index:50000; +} +.x-resizable-overlay{ + width:100%; + height:100%; + display:none; + position:absolute; + left:0; + top:0; + z-index:200000; + -moz-opacity: 0; + opacity:0; + filter: alpha(opacity=0); +} +.x-grid3 { + position: relative; + overflow: hidden; +} + +.x-grid-panel { + -moz-outline: none; + -moz-user-focus: normal; + outline: 0 none; +} + +.x-grid-panel .x-panel-body { + overflow: hidden !important; +} + +.x-grid-panel .x-panel-mc .x-panel-body { + border: 1px solid; +} + +.x-grid3 .x-grid3-row-table, .x-grid3 .x-grid3-summary-table { + table-layout: fixed; +} + +.x-grid3-viewport { + overflow: hidden; +} + +.x-grid3-hd-row .x-grid3-hd,.x-grid3-row .x-grid3-hd,.x-grid3-summary-row .x-grid3-hd { + -moz-outline: none; + -moz-user-focus: normal; + outline: 0 none; +} + +.x-grid3-summary-row { + -moz-user-select: none; + -khtml-user-select: none; + -webkit-user-select: ignore; + outline: 0 none; +} + +.x-grid3-row td.x-grid3-cell,.x-grid3-summary-row td.x-grid3-cell { + line-height: 14px; + vertical-align: top; + padding-left: 1px; + padding-right: 1px; + -moz-outline: none; + outline: 0 none; +} + +.x-grid3-hd-row .x-grid3-hd { + line-height: 15px; + vertical-align: middle; + border-left: 1px solid; + border-right: 1px solid; +} + +.x-grid3-hd-row .x-grid3-marker-hd { + padding: 3px; +} + +.x-grid3-row .x-grid3-marker { + padding: 3px; +} + +.x-grid3-cell-inner,.x-grid3-hd-inner { + overflow: hidden; + -o-text-overflow: ellipsis; + text-overflow: ellipsis; + padding: 3px 3px 3px 5px; + white-space: nowrap; +} + +.x-grid3-hd-inner { + position: relative; + cursor: inherit; + padding: 4px 3px 4px 5px; + vertical-align: middle; +} + +.x-grid3-row-body { + white-space: normal; + font-size: 11px; +} + +.x-grid3-body-cell { + -moz-outline: 0 none; + outline: 0 none; +} + +.ext-ie .x-grid3-cell-inner,.ext-ie .x-grid3-hd-inner { + width: 100%; +} + +.ext-strict .x-grid3-cell-inner,.ext-strict .x-grid3-hd-inner { + width: auto; +} + +.x-grid-row-loading { + background: no-repeat center center; +} + +.x-grid-page { + overflow: hidden; +} + +.x-grid3-row { + cursor: default; + border: 1px solid; + width: 100%; +} + +.x-grid3-row-over { + border: 1px solid; + background: repeat-x left top; +} + +.x-grid3-resize-proxy { + width: 1px; + left: 0; + cursor: e-resize; + cursor: col-resize; + position: absolute; + top: 0; + height: 100px; + overflow: hidden; + visibility: hidden; + border: 0 none; + z-index: 7; +} + +.x-grid3-resize-marker { + width: 1px; + left: 0; + position: absolute; + top: 0; + height: 100px; + overflow: hidden; + visibility: hidden; + border: 0 none; + z-index: 7; +} + +.x-grid3-focus { + position: absolute; + left: 0; + top: 0; + width: 1px; + height: 1px; + line-height: 1px; + font-size: 1px; + -moz-outline: 0 none; + outline: 0 none; + -moz-user-select: text; + -khtml-user-select: text; + -webkit-user-select: ignore; +} + +.x-grid3-header { + background: repeat-x 0 bottom; + cursor: default; + zoom: 1; + padding: 0px 0 0 0; +} + +.x-grid3-header-pop { + border-left: 1px solid; + float: right; + clear: none; +} + +.x-grid3-header-pop-inner { + border-left: 1px solid; + width: 14px; + height: 19px; + background: transparent no-repeat center center; +} + +.ext-ie .x-grid3-header-pop-inner { + width: 15px; +} + +.ext-strict .x-grid3-header-pop-inner { + width: 14px; +} + +.x-grid3-header-inner { + overflow: hidden; + zoom: 1; + float: left; +} + +.x-grid3-header-offset { + padding-left: 1px; +} + +td.x-grid3-hd-over,td.sort-desc,td.sort-asc,td.x-grid3-hd-menu-open { + border-left: 1px solid; + border-right: 1px solid; +} + +td.x-grid3-hd-over .x-grid3-hd-inner,td.sort-desc .x-grid3-hd-inner,td.sort-asc .x-grid3-hd-inner,td.x-grid3-hd-menu-open .x-grid3-hd-inner + { + background: repeat-x left bottom; +} + +.x-grid3-sort-icon { + background-repeat: no-repeat; + display: none; + height: 4px; + width: 13px; + margin-left: 3px; + vertical-align: middle; +} + +.sort-asc .x-grid3-sort-icon,.sort-desc .x-grid3-sort-icon { + display: inline; +} + +.ext-strict .ext-ie .x-grid3-header-inner,.ext-strict .ext-ie6 .x-grid3-hd { + position: relative; +} + +.ext-strict .ext-ie6 .x-grid3-hd-inner { + position: static; +} + +.x-grid3-body { + zoom: 1; +} + +.x-grid3-scroller { + overflow: auto; + zoom: 1; + position: relative; +} + +.x-grid3-cell-text,.x-grid3-hd-text { + display: block; + padding: 3px 5px 3px 5px; +} + +.x-grid3-split { + background-position: center; + background-repeat: no-repeat; + cursor: e-resize; + cursor: col-resize; + display: block; + font-size: 1px; + height: 16px; + overflow: hidden; + position: absolute; + top: 2px; + width: 6px; + z-index: 3; +} + +.x-dd-drag-proxy .x-grid3-hd-inner { + background: repeat-x left bottom; + width: 120px; + padding: 3px; + border: 1px solid; + overflow: hidden; +} + +.col-move-top,.col-move-bottom { + width: 9px; + height: 9px; + position: absolute; + top: 0; + line-height: 1px; + font-size: 1px; + overflow: hidden; + visibility: hidden; + z-index: 20000; + background: transparent no-repeat left top; +} + +.x-grid3-row-selected { + border: 1px dotted; +} + +.x-grid3-locked td.x-grid3-row-marker,.x-grid3-locked .x-grid3-row-selected td.x-grid3-row-marker { + background: repeat-x 0 bottom !important; + vertical-align: middle !important; + padding: 0; + border-top: 1px solid; + border-bottom: none !important; + border-right: 1px solid !important; + text-align: center; +} + +.x-grid3-locked td.x-grid3-row-marker div,.x-grid3-locked .x-grid3-row-selected td.x-grid3-row-marker div { + padding: 0 4px; + text-align: center; +} + +.x-grid3-dirty-cell { + background: transparent no-repeat 0 0; +} + +.x-grid3-invalid-cell { + background: repeat-x bottom; +} + +.x-grid3-topbar,.x-grid3-bottombar { + overflow: hidden; + display: none; + zoom: 1; + position: relative; +} + +.x-grid3-topbar .x-toolbar { + border-right: 0 none; +} + +.x-grid3-bottombar .x-toolbar { + border-right: 0 none; + border-bottom: 0 none; + border-top: 1px solid; +} + +.x-props-grid .x-grid3-cell { + padding: 1px; +} + +.x-props-grid .x-grid3-td-name .x-grid3-cell-inner { + background: transparent repeat-y -16px !important; + padding-left: 12px; +} + +.x-props-grid .x-grid3-body .x-grid3-td-name { + padding: 1px; + padding-right: 0; + border: 0 none; + border-right: 1px solid; +} + +.x-grid3-col-dd { + border: 0 none; + padding: 0; + background: transparent; +} + +.x-dd-drag-ghost .x-grid3-dd-wrap { + padding: 1px 3px 3px 1px; +} + +.x-grid3-hd { + -moz-user-select: none; + -khtml-user-select: none; + -webkit-user-select: ignore; +} + +.x-grid3-hd-btn { + display: none; + position: absolute; + width: 14px; + background: no-repeat left center; + right: 0; + top: 0; + z-index: 2; + cursor: pointer; + outline: none; +} + +.x-grid3-hd-over .x-grid3-hd-btn,.x-grid3-hd-menu-open .x-grid3-hd-btn { + display: block; +} + +a.x-grid3-hd-btn:hover { + background-position: -14px center; +} + +.x-grid3-body .x-grid3-td-expander { + background: transparent repeat-y right; +} + +.x-grid3-body .x-grid3-td-expander .x-grid3-cell-inner { + padding: 0 !important; + height: 100%; +} + +.x-grid3-row-expander { + width: 100%; + height: 18px; + background-position: 4px 2px; + background-repeat: no-repeat; + background-color: transparent; +} + +.x-grid3-row-collapsed .x-grid3-row-expander { + background-position: 4px 2px; +} + +.x-grid3-row-expanded .x-grid3-row-expander { + background-position: -21px 2px; +} + +.x-grid3-row-collapsed .x-grid3-row-body { + display: none !important; +} + +.x-grid3-row-expanded .x-grid3-row-body { + display: block !important; +} + +.x-grid3-body .x-grid3-td-checker { + background: transparent repeat-y right; +} + +.x-grid3-body .x-grid3-td-checker .x-grid3-cell-inner,.x-grid3-header .x-grid3-td-checker .x-grid3-hd-inner { + padding: 0 !important; + height: 100%; +} + +.x-grid3-group-checker { + float: left; +} + +.x-grid3-row-checker,.x-grid3-hd-checker { + width: 100%; + height: 18px; + background-position: 2px 2px; + background-repeat: no-repeat; + background-color: transparent; +} + +.x-grid3-hd-checker { + padding-bottom: 0px !important; +} + +.x-grid3-row .x-grid3-row-checker { + background-position: 2px 2px; +} + +.x-grid3-row-selected .x-grid3-row-checker,.x-grid3-hd-checker-on .x-grid3-hd-checker,.x-grid3-row-checked .x-grid3-row-checker + { + background-position: -23px 2px; +} + +.x-grid3-hd-checker { + background-position: 2px 3px; +} + +.x-grid3-hd-checker-on .x-grid3-hd-checker { + background-position: -23px 3px; +} + +.x-grid3-body .x-grid3-td-numberer { + background: transparent repeat-y right; +} + +.x-grid3-body .x-grid3-td-numberer .x-grid3-cell-inner { + padding: 3px 5px 0 0 !important; + text-align: right; +} + +.x-grid3-body .x-grid3-td-row-icon { + background: transparent repeat-y right; + vertical-align: top; + text-align: center; +} + +.x-grid3-body .x-grid3-td-row-icon .x-grid3-cell-inner { + padding: 0 !important; + background-position: center center; + background-repeat: no-repeat; + width: 16px; + height: 16px; + margin-left: 2px; + margin-top: 3px; +} + +.x-grid3-body .x-grid3-row-selected .x-grid3-td-numberer,.x-grid3-body .x-grid3-row-selected .x-grid3-td-checker,.x-grid3-body .x-grid3-row-selected .x-grid3-td-expander + { + background: transparent repeat-y right; +} + +.x-grid3-body .x-grid3-check-col-td .x-grid3-cell-inner { + padding: 1px 0 0 0 !important; +} + +.x-grid3-check-col { + width: 100%; + height: 16px; + background-position: center center; + background-repeat: no-repeat; + background-color: transparent; +} + +.x-grid3-check-col-on { + width: 100%; + height: 16px; + background-position: center center; + background-repeat: no-repeat; + background-color: transparent; +} + +.x-grid-group,.x-grid-group-body,.x-grid-group-hd { + zoom: 1; +} + +.x-grid-group-hd { + border-bottom: 2px solid; + cursor: pointer; + padding-top: 6px; +} + +.x-grid-group-hd .x-grid-group-div { + background: transparent no-repeat 3px -47px; + padding: 4px 4px 4px 17px; +} + +.x-grid-group-collapsed .x-grid-group-hd .x-grid-group-div { + background-position: 3px 3px; +} + +.x-grid-group-collapsed .x-grid-group-body { + display: none; +} + +.x-grid-empty { + padding: 10px; +} + +.ext-ie7 .x-grid-panel .x-panel-bbar { + position: relative; +} + +.x-grid-with-col-lines .x-grid3-row td.x-grid3-cell { + padding-right: 0; + border-right: 1px solid; +} + +.ext-ie6 .x-grid3-header { + position: relative; +} + +.x-grid3-check-col-disabled { + width: 100%; + height: 16px; + background-position: center center; + background-repeat: no-repeat; +} + +.x-row-editor-header { + height: 2px; + overflow: hidden; +} + +.x-row-editor-footer { + height: 2px; + overflow: hidden; +} + +.ext-ie .x-row-editor-footer { + margin-top: -1px; +} + +.x-row-editor-body { + overflow: hidden; + zoom: 1; + padding-top: 2px; +} + +.x-row-editor .x-btns { + position: absolute; + top: 28px; + left: 20px; + padding-left: 5px; +} + +.x-row-editor .x-btns .x-plain-bwrap { + padding-right: 5px; +} + +.x-row-editor .x-btns .x-plain-body { + height: 31px; +} + +.x-row-editor .x-btns .x-table-layout-cell { + padding: 3px; +} + +.x-grid3-footer { + background: #f7f7f7 none repeat scroll 0 0; + border-top: 1px solid #DDDDDD; + border-bottom: 1px solid #DDDDDD; + display: block; + overflow: hidden; + position: relative; +} + +.x-grid3-footer-row { + border: 1px solid #EEEEEE; + background-color: #f7f7f7; + -moz-user-select: none; + -khtml-user-select: none; + -webkit-user-select: ignore; + cursor: default; +} + +.x-grid3-footer-row td { + line-height: 13px; + vertical-align: top; + padding-left: 1px; + padding-right: 1px; + font: normal 11px arial, tahoma, helvetica, sans-serif; +} + +.ext-ie6 .x-grid3 .x-editor .x-form-text,.ext-ie7 .x-grid3 .x-editor .x-form-text { + top: -1px; +} + +.ext-ie8-compatibility .x-grid3 .x-editor .x-form-text { + top: 0; +} + +.x-grid-panel .x-livegrid-scroller { + z-index: 1; + position: absolute; + right: 0px; + width: 18px; + overflow-y: scroll; + overflow-x: hidden; +} + +.x-grid3-group-checker div { + width: 14px; + height: 18px; + background-position: -1 -2px; + background-repeat: no-repeat; + background-color: transparent; +} + +.x-grid-group-hd .x-grid3-group-check { + background-image: url(../images/default/menu/checked.gif); +} + +.x-grid-group-hd .x-grid3-group-uncheck { + background-image: url(../images/default/menu/unchecked.gif); +} + +.x-grid3-hd-row .x-filtered-column { + font-style: italic !important; + font-weight: bold !important; +} + +.ext-strict .ext-gecko .x-inline-editor .x-small-editor .x-form-text { + height: 18px !important; +} +.x-dd-drag-proxy{ + position:absolute; + left:0; + top:0; + visibility:hidden; + z-index:15000; +} +.x-dd-drag-ghost{ + -moz-opacity: 0.85; + opacity:.85; + filter: alpha(opacity=85); + border: 1px solid; + padding:3px; + padding-left:20px; + white-space:nowrap; +} +.x-dd-drag-repair .x-dd-drag-ghost{ + -moz-opacity: 0.4; + opacity:.4; + filter: alpha(opacity=40); + border:0 none; + padding:0; + background-color:transparent; +} +.x-dd-drag-repair .x-dd-drop-icon{ + visibility:hidden; +} +.x-dd-drop-icon{ + position:absolute; + top:3px; + left:3px; + display:block; + width:16px; + height:16px; + background-color:transparent; + background-position: center; + background-repeat: no-repeat; + z-index:1; +} +.x-view-selector { + position:absolute; + left:0; + top:0; + width:0; + border:1px dotted; + opacity: .5; + -moz-opacity: .5; + filter:alpha(opacity=50); + zoom:1; +} + +.x-dd-cursor { + cursor: default !important; +} + +.x-insert-bar { + position: absolute; + + z-index: 99999; +} + +.x-insert-bar td { + line-height: 1px; + font-size: 1px; +} + +.x-insert-left { + background: url(../images/gxt/dd/insert-bg.gif) no-repeat; +} + +.x-insert-mid { + background: url(../images/gxt/dd/insert-bg.gif) repeat-x 0 -12px; +} + +.x-insert-right { + background: url(../images/gxt/dd/insert-bg.gif) no-repeat 0px -6px; +} +.tree-folder { + background: url(../images/gxt/icons/folder-closed.gif) no-repeat center + left !important; +} + +.tree-folder-open { + background: url(../images/gxt/icons/folder.gif) no-repeat center left + !important; +} + +.my-tree { + cursor: default; + font-size: 11px; + -moz-outline: none; + -moz-user-focus: none; +} + +.my-root-item { + padding: 4px; +} + +.my-tree-item,.my-tree-item table,.my-tree-item table td { + -moz-outline: none; + -moz-user-focus: normal; + outline: 0 none; + font-size: 11px; +} + +.my-tree-item td { + height: 19px; +} + +.my-tree-indent { + line-height: 1px; + font-size: 1px; +} + +.my-tree-joint div { + width: 15px; + height: 19px; + line-height: 1px; + font-size: 1px; +} + +.my-tree-left,.my-tree-left div,.my-tree-right { + line-height: 1px; + font-size: 1px; + width: 3px; +} + +.my-tree-left div,.my-tree-right div { + width: 3px; +} + +.my-tree-item,.my-treeitem-wrap { + -moz-outline: none; + -moz-user-focus: normal; + outline: 0 none; +} + +.my-tree-check div { + width: 17px; + height: 17px; + line-height: 1px; + font-size: 1px; +} + +.my-tree-icon div { + width: 16px; + height: 17px; + cursor: pointer; + background-repeat: no-repeat; + background-position: center; +} + +.my-tree-item-text span { + font-family: arial, tahoma, helvetica, sans-serif; + font-size: 12px; + white-space: nowrap; + padding-left: 3px; + padding-right: 3px; + display: block; + height: 15px; + cursor: pointer; +} + +.my-tree-over .my-tree-left { + background: url(../images/gxt/shared/select-19-bg.gif) no-repeat left + -57px; +} + +.my-tree-over .my-tree-right { + background: url(../images/gxt/shared/select-19-bg.gif) no-repeat right + -76px; +} + +.my-tree-over .my-tree-check,.my-tree-over .my-tree-icon,.my-tree-over .my-tree-item-text + { + background: url(../images/gxt/shared/select-19-bg.gif) left -95px; +} + +.my-tree-sel .my-tree-left { + background: url(../images/gxt/shared/select-19-bg.gif) no-repeat left + 0px; +} + +.my-tree-sel .my-tree-right { + background: url(../images/gxt/shared/select-19-bg.gif) no-repeat right + -19px; +} + +.my-tree-sel .my-tree-check,.my-tree-sel .my-tree-icon,.my-tree-sel .my-tree-item-text + { + background: url(../images/gxt/shared/select-19-bg.gif) left -38px; +} + +.my-tree-drop .my-tree-left { + background: url(../images/gxt/shared/select-19-bg.gif) no-repeat left + -115px; +} + +.my-tree-drop .my-tree-right { + background: url(../images/gxt/shared/select-19-bg.gif) no-repeat right + -133px; +} + +.my-tree-drop .my-tree-check,.my-tree-drop .my-tree-icon,.my-tree-drop .my-tree-item-text + { + background: url(../images/gxt/shared/select-19-bg.gif) left -152px; +} + +.my-tree-close { + background: url(../images/gxt/tree/vnode_transparent.gif) no-repeat 0px + 1px; +} + +.my-tree-open { + background: url(../images/gxt/tree/vnode_transparent.gif) no-repeat 0px + -32px; +} + +.my-tree-joint-over .my-tree-open { + background: url(../images/gxt/tree/vnode_transparent.gif) no-repeat 0px + -48px; +} + +.my-tree-joint-over .my-tree-close { + background: url(../images/gxt/tree/vnode_transparent.gif) no-repeat 0px + -15px; +} + +.my-tree-notchecked { + background: url(../images/gxt/tree/notchecked.gif) no-repeat 0px 50%; +} + +.my-tree-checked { + background: url(../images/gxt/tree/checked.gif) no-repeat 0px 50%; +} + +.my-tree-loading .tree-folder { + background: url(../images/gxt/icons/wait.gif) no-repeat 0px -1px + !important; +} + +.my-tree-loading .my-tree-item-text span { + font-style: italic; +} + +.x-ftree-selected .x-ftree-text { + background-color: #d9e8fb; +} + +.x-ftree-node-over .x-ftree-text { + background-color: #eee; +} + +.x-ftree-item { + line-height: 18px; +} + +.x-ftree-joint,.x-ftree-icon { + border: 0 none; + height: 18px; + margin: 0; + padding: 0; + vertical-align: top; + width: 16px; + background-position: center; + background-repeat: no-repeat; +} + +.x-ftree-text { + color: black; + font: normal 11px arial, tahoma, helvetica, sans-serif; + white-space: nowrap; + text-decoration: none; + color: black; + padding-left: 4px; + vertical-align: middle; + line-height: 18px; + padding: 2px 4px 4px 4px; +} + +/* some default icons for leaf/folder */ +.x-ftree-expanded .x-ftree-icon { + background-image: url(../images/default/tree/folder-open.gif); +} + +.x-ftree-leaf .x-ftree-icon { + background-image: url(../images/default/tree/leaf.gif); +} + +.x-ftree-collapsed .x-ftree-icon { + background-image: url(../images/gxt/icons/folder-closed.gif); +} + +/* Arrows */ +.x-ftree-arrows .x-ftree-joint { + background: transparent; +} + +.x-ftree-arrows .x-ftree-joint-plus { + background: transparent url(../images/default/tree/arrows.gif) no-repeat + 0 0; +} + +.x-ftree-arrows .x-ftree-joint-minus { + background: transparent url(../images/default/tree/arrows.gif) no-repeat + -16px 0; +} + +.x-ftree-arrows .x-ftree-ec-over .x-ftree-joint-plus { + background-position: -32px 0; +} + +.x-ftree-arrows .x-ftree-ec-over .x-ftree-joint-minus { + background-position: -48px 0; +} + +.x-ftree2-highlightrow { + border: 1px dotted #545352; +} + +.x-ftree2-selected { + background-color: #d9e8fb !important; +} + +.x-ftree2-node-over { + background-color: #eee; +} + +.x-ftree2-node-drop { + background-color: #defadc; +} + +.x-ftree2-joint,.x-ftree2-icon { + border: 0 none; + height: 18px; + margin: 0; + padding: 0; + vertical-align: top; + width: 16px; + background-position: center; + background-repeat: no-repeat; +} + +.x-ftree2-joint div { + width: 16px; +} + +.x-ftree2-el-ct { + display: none; +} + +.x-ftree2-node { + padding-bottom: 1px; +} + +.x-ftree2-text { + vertical-align: middle !important; + white-space: nowrap !important; +} + +.x-ftree2-text span { + color: black; + font: normal 11px arial, tahoma, helvetica, sans-serif; + white-space: nowrap; + text-decoration: none; + color: black; + padding: 2px 4px 2px 1px; + display: block; +} + +.ext-ie .x-ftree2-text span { + padding-left: 3px; +} + +.x-ftree2-check { + width: 17px; +} + +.x-ftree2-check div { + width: 17px; + height: 17px; +} + +/* some default icons for leaf/folder */ +.x-ftree2-expanded .x-ftree2-icon { + background-image: url(../images/default/tree/folder-open.gif); +} + +.x-ftree2-leaf .x-ftree2-icon { + background-image: url(../images/default/tree/leaf.gif); +} + +.x-ftree2-collapsed .x-ftree2-icon { + background-image: url(../images/gxt/icons/folder-closed.gif); +} + +/* Arrows */ +.x-ftree2-arrows .x-ftree2-joint { + background: transparent; +} + +.x-ftree2-arrows .x-ftree2-joint-plus { + background: transparent url(../images/default/tree/arrows.gif) no-repeat + 0 0; +} + +.x-ftree2-arrows .x-ftree2-joint-minus { + background: transparent url(../images/default/tree/arrows.gif) no-repeat + -16px 0; +} + +.x-ftree2-arrows .x-ftree2-ec-over .x-ftree2-joint-plus { + background-position: -32px 0; +} + +.x-ftree2-arrows .x-ftree2-ec-over .x-ftree2-joint-minus { + background-position: -48px 0; +} + +.x-treegrid { + -moz-outline: none; + -moz-user-focus: none; + outline: 0 none; +} + +.x-treegrid .x-treegrid-column .x-grid3-cell-inner { + padding: 0px !important; +} + +.x-tree3 { + cursor: default; + -moz-outline: none; + -moz-user-focus: none; + outline: 0 none; +} + +.ext-strict .ext-gecko .x-tree3, .ext-strict .ext-webkit .x-tree3 { + padding-bottom: 1px; +} + +.x-tree3-node { + cursor: default; +} + +.x-tree3-el { + white-space: nowrap; + height: 21px; + position: relative; +} + +.x-tree3-node-text { + white-space: nowrap; + line-height: 11px; + text-decoration: none; + padding: 0 0 0 3px; + position: relative; + top: -4px; +} + +.x-tree3-node-ct { + display: none; +} + +.x-tree3-node-text-widget { + position: static !important; + padding: 0px !important; +}.x-date-picker { + border: 1px solid; + border-top:0 none; + position:relative; + -moz-outline:0 none; + outline:0 none; +} +.x-date-picker a { + -moz-outline:0 none; + outline:0 none; +} +.x-date-inner, .x-date-inner td, .x-date-inner th{ + border-collapse:separate; +} +.x-date-middle,.x-date-left,.x-date-right { + background: repeat-x 0 -83px; + overflow:hidden; +} +.x-date-middle .x-btn-tc,.x-date-middle .x-btn-tl,.x-date-middle .x-btn-tr, +.x-date-middle .x-btn-mc,.x-date-middle .x-btn-ml,.x-date-middle .x-btn-mr, +.x-date-middle .x-btn-bc,.x-date-middle .x-btn-bl,.x-date-middle .x-btn-br{ + background:transparent !important; + vertical-align:middle; +} +.x-date-middle .x-btn-mc em.x-btn-arrow { + background:transparent no-repeat right 0; +} +.x-date-right, .x-date-left { + width:18px; +} +.x-date-right{ + text-align:right; +} +.x-date-middle { + padding-top:2px; + padding-bottom:2px; + width:130px; +} +.x-date-right a, .x-date-left a{ + display:block; + width:16px; + height:16px; + background-position: center; + background-repeat: no-repeat; + cursor:pointer; + -moz-opacity: 0.6; + opacity:.6; + filter: alpha(opacity=60); +} +.x-date-right a:hover, .x-date-left a:hover{ + -moz-opacity: 1; + opacity:1; + filter: alpha(opacity=100); +} +.x-date-right a { + margin-right:2px; + text-decoration:none !important; +} +.x-date-left a{ + margin-left:2px; + text-decoration:none !important; +} +table.x-date-inner { + width:100%; + table-layout:fixed; +} +.x-date-inner th { + width:25px; +} +.x-date-inner th { + background: repeat-x left top; + text-align:right !important; + border-bottom: 1px solid; + cursor:default; + padding:0; + border-collapse:separate; +} +.x-date-inner th span { + display:block; + padding:2px; + padding-right:7px; +} +.x-date-inner td { + border: 1px solid; + text-align:right; + padding:0; +} +.x-date-inner a { + padding:2px 5px; + display:block; + text-decoration:none; + text-align:right; + zoom:1; +} +.x-date-inner .x-date-active{ + cursor:pointer; + color:black; +} +.x-date-inner .x-date-selected a{ + background: repeat-x left top; + border:1px solid; + padding:1px 4px; +} +.x-date-inner .x-date-today a{ + border: 1px solid; + padding:1px 4px; +} +.x-date-inner .x-date-prevday a,.x-date-inner .x-date-nextday a { + text-decoration:none !important; +} +.x-date-bottom { + padding:4px; + border-top: 1px solid; + background: repeat-x left top; +} +.x-date-inner a:hover, .x-date-inner .x-date-disabled a:hover{ + text-decoration:none !important; +} +.x-date-inner .x-date-disabled a { + cursor:default; +} +.x-date-mmenu .x-menu-item { + padding:1px 24px 1px 4px; + white-space: nowrap; +} +.x-date-mmenu .x-menu-item .x-menu-item-icon { + width:10px; + height:10px; + margin-right:5px; + background-position:center -4px !important; +} +.x-date-mp { + position:absolute; + left:0; + top:0; + display:none; +} +.x-date-mp td { + padding:2px; + font:normal 11px arial, helvetica,tahoma,sans-serif; +} +td.x-date-mp-month,td.x-date-mp-year,td.x-date-mp-ybtn { + border: 0 none; + text-align:center; + vertical-align: middle; + width:25%; +} +.x-date-mp-ok { + margin-right:3px; +} +.x-date-mp-btns button { + text-decoration:none; + text-align:center; + text-decoration:none !important; + border:1px solid; + padding:1px 3px 1px; + cursor:pointer; +} +.x-date-mp-btns { + background: repeat-x left top; +} +.x-date-mp-btns td { + border-top: 1px solid; + text-align:center; +} +td.x-date-mp-month a,td.x-date-mp-year a { + display:block; + padding:2px 4px; + text-decoration:none; + text-align:center; +} +td.x-date-mp-month a:hover,td.x-date-mp-year a:hover { + text-decoration:none; + cursor:pointer; +} +td.x-date-mp-sel a { + padding:1px 3px; + background: repeat-x left top; + border:1px solid; +} +.x-date-mp-ybtn a { + overflow:hidden; + width:15px; + height:15px; + cursor:pointer; + background:transparent no-repeat; + display:block; + margin:0 auto; +} +.x-date-mp-ybtn a.x-date-mp-next { + background-position:0 -120px; +} +.x-date-mp-ybtn a.x-date-mp-next:hover { + background-position:-15px -120px; +} +.x-date-mp-ybtn a.x-date-mp-prev { + background-position:0 -105px; +} +.x-date-mp-ybtn a.x-date-mp-prev:hover { + background-position:-15px -105px; +} +.x-date-mp-ybtn { + text-align:center; +} +td.x-date-mp-sep { + border-right:1px solid; +} + +.x-date-picker, .x-date-picker a { + font-size: 11px; +} + +.x-date-right-icon { + background-image: url(../images/default/shared/right-btn.gif); + margin-right: 2px; + text-decoration: none !important; +} + +.x-date-left-icon { + background-image: url(../images/default/shared/left-btn.gif); + margin-left: 4px; + text-decoration: none !important; +} + +.x-date-days { + table-layout: fixed; + width: 100%; +} + +.x-date-days td { + width: 25px; + border: none; +} + +.x-date-days td span { + display: block; + padding: 2px 7px 2px 2px; +} + +.x-date-days td { + background: #DFECFB url(../images/default/shared/glass-bg.gif) repeat-x scroll left top; + border-bottom: 1px solid #A3BAD9; + border-collapse: separate; + color: #233D6D; + cursor: default; + font-family: arial, helvetica, tahoma, sans-serif; + font-size: 10px; + font-size-adjust: none; + font-stretch: normal; + font-style: normal; + font-variant: normal; + font-weight: normal; + line-height: normal; + padding: 0pt; + text-align: right !important; +} + +.x-date-picker .x-date-header { + background: url(../images/default/shared/hd-sprite.gif) repeat-x 0 -83px; + height: 22px; + left: 10px; + top: 10px; + width: 157px; +} + +.x-date-header .x-btn .x-btn-text { + color: #fff; +} + +.x-date-picker-footer { + width: 100%; +} + +.x-date-picker-footer td { + text-align: center; +} + +.x-date-left { + background: transparent url(../images/default/shared/hd-sprite.gif) repeat-x scroll 0pt -83px; + color: #FFFFFF; + font-family: "sans serif", tahoma, verdana, helvetica; + font-size: 11px; + font-size-adjust: none; + font-stretch: normal; + font-style: normal; + font-variant: normal; + font-weight: bold; + line-height: normal; + overflow: hidden; +} + +.x-date-inner .x-date-active-hover { + background: #ddecfe !important; +}.x-tip{ + position: absolute; + top: 0; + left:0; + visibility: hidden; + z-index: 20000; + border:0 none; +} +.x-tip .x-tip-close{ + height: 15px; + float:right; + width: 15px; + margin:0 0 2px 2px; + cursor:pointer; + display:none; +} +.x-tip .x-tip-tc { + background: transparent no-repeat 0 -62px; + padding-top:3px; + overflow:hidden; + zoom:1; +} +.x-tip .x-tip-tl { + background: transparent no-repeat 0 0; + padding-left:6px; + overflow:hidden; + zoom:1; +} +.x-tip .x-tip-tr { + background: transparent no-repeat right 0; + padding-right:6px; + overflow:hidden; + zoom:1; +} +.x-tip .x-tip-bc { + background: transparent no-repeat 0 -121px; + height:3px; + overflow:hidden; +} +.x-tip .x-tip-bl { + background: transparent no-repeat 0 -59px; + padding-left:6px; + zoom:1; +} +.x-tip .x-tip-br { + background: transparent no-repeat right -59px; + padding-right:6px; + zoom:1; +} +.x-tip .x-tip-mc { + border:0 none; +} +.x-tip .x-tip-ml { + background: no-repeat 0 -124px; + padding-left:6px; + zoom:1; +} +.x-tip .x-tip-mr { + background: transparent no-repeat right -124px; + padding-right:6px; + zoom:1; +} +.ext-ie .x-tip .x-tip-header,.ext-ie .x-tip .x-tip-tc { + font-size:0; + line-height:0; +} +.ext-border-box .x-tip .x-tip-header,.ext-border-box .ext-ie .x-tip .x-tip-tc { + line-height:1px; +} +.x-tip .x-tip-header-text { + padding:0; + margin:0 0 2px 0; +} +.x-tip .x-tip-body { + margin:0 !important; + line-height:14px; + padding:0; +} +.x-tip .x-tip-body .loading-indicator { + margin:0; +} +.x-tip-draggable .x-tip-header,.x-tip-draggable .x-tip-header-text { + cursor:move; +} +.x-form-invalid-tip .x-tip-tc { + background: repeat-x 0 -12px; + padding-top:6px; +} +.x-form-invalid-tip .x-tip-bc { + background: repeat-x 0 -18px; + height:6px; +} +.x-form-invalid-tip .x-tip-bl { + background: no-repeat 0 -6px; +} +.x-form-invalid-tip .x-tip-br { + background: no-repeat right -6px; +} +.x-form-invalid-tip .x-tip-body { + padding:2px; +} +.x-form-invalid-tip .x-tip-body { + padding-left:24px; + background:transparent no-repeat 2px 2px; +} +.x-tip-anchor { + position: absolute; + width: 9px; + height: 10px; + overflow:hidden; + background: transparent no-repeat 0 0; + zoom:1; +} +.x-tip-anchor-bottom { + background-position: -9px 0; +} +.x-tip-anchor-right { + background-position: -18px 0; + width: 10px; +} +.x-tip-anchor-left { + background-position: -28px 0; + width: 10px; +} +.x-menu { + border: 1px solid; + z-index: 15000; + zoom: 1; + background: repeat-y; + -moz-outline: none; + outline: 0 none; +} + +.x-menu a { + text-decoration: none !important; +} + +.ext-ie .x-menu { + zoom: 1; + overflow: hidden; +} + +.x-menu-list { + padding: 2px; + background: transparent; + border: 0 none; + overflow: hidden; + overflow-y: hidden; +} + +.ext-strict .ext-ie .x-menu-list { + position: relative; +} + +.x-menu x-menu-sep-li { + font-size: 1px; + line-height: 1px; +} + +.x-menu-list-item { + white-space: nowrap; + display: block; + padding: 1px; +} + +.x-menu-item { + -moz-user-select: none; + -khtml-user-select: none; + -webkit-user-select: ignore +} + +.x-menu-item-arrow { + background: transparent no-repeat right; +} + +.x-menu-sep { + display: block; + font-size: 1px; + line-height: 1px; + margin: 2px 3px; + border-bottom: 1px solid; + overflow: hidden; +} + +.x-menu-focus { + position: absolute; + left: -1px; + top: -1px; + width: 1px; + height: 1px; + line-height: 1px; + font-size: 1px; + -moz-outline: 0 none; + outline: 0 none; + -moz-user-select: none; + -khtml-user-select: none; + -webkit-user-select: ignore + overflow: hidden; + display: block; +} + +a.x-menu-item { + cursor: pointer; + display: block; + line-height: 16px; + outline-color: -moz-use-text-color; + outline-style: none; + outline-width: 0; + padding: 3px 21px 3px 27px; + position: relative; + text-decoration: none; + white-space: nowrap; +} + +.x-menu-item-active { + border-style: solid; + border-width: 1px; + padding: 0; +} + +.x-menu-item-icon { + border: 0 none; + height: 16px; + padding: 0; + vertical-align: top; + width: 16px; + position: absolute; + left: 3px; + top: 3px; + margin: 0; + background-position: center; +} + +.ext-ie .x-menu-item-icon { + left: -24px; +} + +.ext-strict .x-menu-item-icon { + left: 3px; +} + +.ext-ie6 .x-menu-item-icon { + left: -24px; +} + +.ext-ie .x-menu-item-icon { + vertical-align: middle; +} + +.x-date-menu .x-menu-list { + padding: 0; +} + +.x-menu-date-item { + padding: 0; +} + +.x-menu .x-color-palette,.x-menu .x-date-picker { + margin-left: 26px; + margin-right: 4px; +} + +.x-menu .x-date-picker { + border: 1px solid; + margin-top: 2px; + margin-bottom: 2px; +} + +.x-menu-plain .x-color-palette,.x-menu-plain .x-date-picker { + margin: 0; + border: 0 none; +} + +.x-date-menu { + padding: 0 !important; +} + +.x-cycle-menu .x-menu-item-checked { + border: 1px dotted !important; + padding: 0; +} + +.x-menu .x-menu-scroller { + width: 100%; + background-repeat: no-repeat; + background-position: center; + height: 8px; + line-height: 8px; + cursor: pointer; + margin: 0; + padding: 0; +} + +.x-menu .x-menu-scroller-active { + height: 6px; + line-height: 6px; +} + +.x-menu-list-item-indent { + padding-left: 27px !important; +} + +.x-menu-text { + + border-style: solid; + background: #D6E3F2; + border-color:#DAE6F4 #99bbe8 #99bbe8 #DAE6F4; + border-width: 1px; + margin:-2px -2px 0; + color:#15428b; + font:bold 10px tahoma,arial,verdana,sans-serif; + display:block; + padding:3px; +} + +.x-menubar { + padding: 3px; + border-style: solid; + border-width: 0 0 1px 0; + cursor: default; + border-color: #a9bfd3; + background-color: #d0def0; + padding: 3px; + background-image: url(../images/default/toolbar/bg.gif); +} + +.x-menubar-item { + padding: 1px 8px; + font: 12px arial, verdana, sans-serif; +} + +.x-menubar-item-over { + background-color: #98c5f5; +} + +.x-menubar-item-active { + background-color: #98c5f5; +}.x-box-tl { + background: transparent no-repeat 0 0; + zoom:1; +} +.x-box-tc { + height: 8px; + background: transparent repeat-x 0 0; + overflow: hidden; +} +.x-box-tr { + background: transparent no-repeat right -8px; +} +.x-box-ml { + background: transparent repeat-y 0; + padding-left: 4px; + overflow: hidden; + zoom:1; +} +.x-box-mc { + background: repeat-x 0 -16px; + padding: 4px 10px; +} +.x-box-mc h3 { + margin: 0 0 4px 0; + zoom:1; +} +.x-box-mr { + background: transparent repeat-y right; + padding-right: 4px; + overflow: hidden; +} +.x-box-bl { + background: transparent no-repeat 0 -16px; + zoom:1; +} +.x-box-bc { + background: transparent repeat-x 0 -8px; + height: 8px; + overflow: hidden; +} +.x-box-br { + background: transparent no-repeat right -24px; +} +.x-box-tl, .x-box-bl { + padding-left: 8px; + overflow: hidden; +} +.x-box-tr, .x-box-br { + padding-right: 8px; + overflow: hidden; +} +.x-combo-list { + border:1px solid; + zoom:1; + overflow:hidden; + position: absolute; +} +.x-combo-list-inner { + overflow:auto; + position:relative; + zoom:1; + overflow-x:hidden; +} +.x-combo-list-hd { + border-bottom:1px solid; + padding:3px; +} +.x-resizable-pinned .x-combo-list-inner { + border-bottom:1px solid; +} +.x-combo-list-item { + padding:2px; + border:1px solid; + white-space: nowrap; + overflow:hidden; + text-overflow: ellipsis; +} +.x-combo-list .x-combo-selected{ + border:1px dotted !important; + cursor:pointer; +} +.x-combo-list .x-toolbar { + border-top:1px solid; + border-bottom:0 none; +} +.x-panel { + border-style: solid; + border-width:0; + outline: 0 none; +} +.x-panel-header { + overflow:hidden; + zoom:1; + padding:5px 3px 4px 5px; + border:1px solid; + line-height: 15px; + background: transparent repeat-x 0 -1px; +} +.x-panel-body { + border:1px solid; + border-top:0 none; + overflow:hidden; + position: relative; +} +.x-panel-bbar .x-toolbar, .x-panel-tbar .x-toolbar { + border:1px solid; + border-top:0 none; + overflow:hidden; + padding:2px; +} +.x-panel-tbar-noheader .x-toolbar, .x-panel-mc .x-panel-tbar .x-toolbar { + border-top:1px solid; + border-bottom: 0 none; +} +.x-panel-body-noheader, .x-panel-mc .x-panel-body { + border-top:1px solid; +} +.x-panel-header { + overflow:hidden; + zoom:1; +} +.x-panel-tl .x-panel-header { + padding:5px 0 4px 0; + border:0 none; + background:transparent; + line-height: 15px; +} +.x-panel-tl .x-panel-icon, .x-window-tl .x-panel-icon { + padding-left:20px !important; + background-repeat:no-repeat; + background-position:0 4px; + zoom:1; +} +.x-panel-inline-icon { + width:16px; + height:16px; + background-repeat:no-repeat; + background-position:0 0; + vertical-align:middle; + margin-right:4px; + margin-top:-1px; + margin-bottom:-1px; +} +.x-panel-tc { + background: transparent repeat-x 0 0; + overflow:hidden; +} +.ext-strict .ext-ie7 .x-panel-tc { + overflow: visible; +} +.x-panel-tl { + background: transparent no-repeat 0 0; + padding-left:6px; + zoom:1; + border-bottom:1px solid; +} +.x-panel-tr { + background: transparent no-repeat right 0; + zoom:1; + padding-right:6px; +} +.x-panel-bc { + background: transparent repeat-x 0 bottom; + zoom:1; +} +.x-panel-bc .x-panel-footer { + zoom:1; +} +.x-panel-bl { + background: transparent no-repeat 0 bottom; + padding-left:6px; + zoom:1; +} +.x-panel-br { + background: transparent no-repeat right bottom; + padding-right:6px; + zoom:1; +} +.x-panel-mc { + border:0 none; + padding:0; + margin:0; + padding-top:6px; +} +.x-panel-mc .x-panel-body { + background:transparent; + border: 0 none; +} +.x-panel-ml { + background: repeat-y 0 0; + padding-left:6px; + zoom:1; +} +.x-panel-mr { + background: transparent repeat-y right 0; + padding-right:6px; + zoom:1; +} +.x-panel-bc .x-panel-footer { + padding-bottom:6px; +} +.x-panel-nofooter .x-panel-bc, .x-panel-nofooter .x-window-bc { + height:6px; + font-size:0; + line-height:0; +} +.x-panel-bwrap { + overflow:hidden; + zoom:1; + left:0; + top:0; +} +.x-panel-body { + overflow:hidden; + zoom:1; +} +.x-panel-collapsed .x-resizable-handle{ + display:none; +} +.ext-gecko .x-panel-animated * { + overflow:hidden !important; +} +.x-plain-body { + overflow:hidden; +} +.x-plain-bbar .x-toolbar { + overflow:hidden; + padding:2px; +} +.x-plain-tbar .x-toolbar { + overflow:hidden; + padding:2px; +} +.x-plain-bwrap { + overflow:hidden; + zoom:1; +} +.x-plain { + overflow:hidden; +} +.x-tool { + overflow:hidden; + width:15px; + height:15px; + float:right; + cursor:pointer; + background:transparent no-repeat; + margin-left:2px; +} +.x-tool-toggle { + background-position:0 -60px; +} +.x-tool-toggle-over { + background-position:-15px -60px; +} +.x-panel-collapsed .x-tool-toggle { + background-position:0 -75px; +} +.x-panel-collapsed .x-tool-toggle-over { + background-position:-15px -75px; +} +.x-tool-close { + background-position:0 -0; +} +.x-tool-close-over { + background-position:-15px 0; +} +.x-tool-minimize { + background-position:0 -15px; +} +.x-tool-minimize-over { + background-position:-15px -15px; +} +.x-tool-maximize { + background-position:0 -30px; +} +.x-tool-maximize-over { + background-position:-15px -30px; +} +.x-tool-restore { + background-position:0 -45px; +} +.x-tool-restore-over { + background-position:-15px -45px; +} +.x-tool-gear { + background-position:0 -90px; +} +.x-tool-gear-over { + background-position:-15px -90px; +} +.x-tool-pin { + background-position:0 -135px; +} +.x-tool-pin-over { + background-position:-15px -135px; +} +.x-tool-unpin { + background-position:0 -150px; +} +.x-tool-unpin-over { + background-position:-15px -150px; +} +.x-tool-right { + background-position:0 -165px; +} +.x-tool-right-over { + background-position:-15px -165px; +} +.x-tool-left { + background-position:0 -180px; +} +.x-tool-left-over { + background-position:-15px -180px; +} +.x-tool-up { + background-position:0 -210px; +} +.x-tool-up-over { + background-position:-15px -210px; +} +.x-tool-down { + background-position:0 -195px; +} +.x-tool-down-over { + background-position:-15px -195px; +} +.x-tool-refresh { + background-position:0 -225px; +} +.x-tool-refresh-over { + background-position:-15px -225px; +} +.x-tool-minus { + background-position:0 -255px; +} +.x-tool-minus-over { + background-position:-15px -255px; +} +.x-tool-plus { + background-position:0 -240px; +} +.x-tool-plus-over { + background-position:-15px -240px; +} +.x-tool-search { + background-position:0 -270px; +} +.x-tool-search-over { + background-position:-15px -270px; +} +.x-tool-save { + background-position:0 -285px; +} +.x-tool-save-over { + background-position:-15px -285px; +} +.x-tool-help { + background-position:0 -300px; +} +.x-tool-help-over { + background-position:-15px -300px; +} +.x-tool-print { + background-position:0 -315px; +} +.x-tool-print-over { + background-position:-15px -315px; +} +.x-panel-ghost { + z-index:12000; + overflow:hidden; + position:absolute; + left:0;top:0; + opacity:.65; + -moz-opacity:.65; + filter:alpha(opacity=65); +} +.x-panel-ghost ul { + margin:0; + padding:0; + overflow:hidden; + font-size:0; + line-height:0; + border:1px solid; + border-top:0 none; + display:block; +} +.x-panel-ghost * { + cursor:move !important; +} +.x-panel-dd-spacer { + border:2px dashed; +} +.x-panel-btns { + padding:5px; + overflow:hidden; +} +.x-panel-btns-left .x-buttonbar { + clear:none; +} +.x-panel-btns-center{ + text-align:center; +} +.x-panel-btns-center .x-toolbar-ct { + margin:0 auto; + text-align:left; + width:auto; +} +.x-panel-fbar td.x-toolbar-cell{ + padding:0px; +} +.x-panel-fbar { + display: block; + padding:2px; + position:relative; + left:0; + top:0; + zoom:1; + overflow:hidden; +} + +.x-panel-fbar .x-toolbar-cell { + vertical-align:middle; +} + +.x-panel-fbar td { + vertical-align:middle; +} +.x-panel-btns .x-btn-focus .x-btn-left{ + background-position:0 -147px; +} +.x-panel-btns .x-btn-focus .x-btn-right{ + background-position:0 -168px; +} +.x-panel-btns .x-btn-focus .x-btn-center{ + background-position:0 -189px; +} +.x-panel-btns .x-btn-over .x-btn-left{ + background-position:0 -63px; +} +.x-panel-btns .x-btn-over .x-btn-right{ + background-position:0 -84px; +} +.x-panel-btns .x-btn-over .x-btn-center{ + background-position:0 -105px; +} +.x-panel-btns .x-btn-click .x-btn-center{ + background-position:0 -126px; +} +.x-panel-btns .x-btn-click .x-btn-right{ + background-position:0 -84px; +} +.x-panel-btns .x-btn-click .x-btn-left{ + background-position:0 -63px; +} +.x-panel-fbar td,.x-panel-fbar span,.x-panel-fbar input,.x-panel-fbar div,.x-panel-fbar select,.x-panel-fbar label{ + white-space: nowrap; +} +.x-window { + zoom:1; + -moz-outline: none; + outline: 0 none; +} +.x-window .x-resizable-handle { + opacity:0; + -moz-opacity:0; + filter:alpha(opacity=0); +} +.x-window-proxy { + border:1px solid; + z-index:12000; + overflow:hidden; + position:absolute; + left:0;top:0; + display:none; + opacity:.5; + -moz-opacity:.5; + filter:alpha(opacity=50); +} +.x-window-header { + overflow:hidden; + zoom:1; +} +.x-window-bwrap { + z-index:1; + position:relative; + zoom:1; + left:0;top:0; +} +.x-window-tl .x-window-header { + padding:5px 0 4px 0; +} +.x-window-header-text { + cursor:pointer; +} +.x-window-tc { + background: transparent repeat-x 0 0; + overflow:hidden; + zoom:1; +} +.x-window-tl { + background: transparent no-repeat 0 0; + padding-left:6px; + zoom:1; + z-index:1; + position:relative; +} +.x-window-tr { + background: transparent no-repeat right 0; + padding-right:6px; +} +.x-window-bc { + background: transparent repeat-x 0 bottom; + zoom:1; +} +.x-window-bc .x-window-footer { + padding-bottom:6px; + zoom:1; + font-size:0; + line-height:0; +} +.x-window-bl { + background: transparent no-repeat 0 bottom; + padding-left:6px; + zoom:1; +} +.x-window-br { + background: transparent no-repeat right bottom; + padding-right:6px; + zoom:1; +} +.x-window-mc { + border:1px solid; + padding:0; + margin:0; +} +.x-window-ml { + background: transparent repeat-y 0 0; + padding-left:6px; + zoom:1; +} +.x-window-mr { + background: transparent repeat-y right 0; + padding-right:6px; + zoom:1; +} +.x-window-body { + overflow:hidden; +} +.x-window-bwrap { + overflow:hidden; +} +.x-window-maximized .x-window-bl, .x-window-maximized .x-window-br, + .x-window-maximized .x-window-ml, .x-window-maximized .x-window-mr, + .x-window-maximized .x-window-tl, .x-window-maximized .x-window-tr { + padding:0; +} +.x-window-maximized .x-window-footer { + padding-bottom:0; +} +.x-window-maximized .x-window-tc { + padding-left:3px; + padding-right:3px; +} +.x-window-maximized .x-window-mc { + border-left:0 none; + border-right:0 none; +} +.x-window-tbar .x-toolbar, .x-window-bbar .x-toolbar { + border-left:0 none; + border-right: 0 none; +} +.x-window-bbar .x-toolbar { + border-top:1px solid; + border-bottom:0 none; +} +.x-window-draggable, .x-window-draggable .x-window-header-text { + cursor:move; +} +.x-window-maximized .x-window-draggable, .x-window-maximized .x-window-draggable .x-window-header-text { + cursor:default; +} +.x-window-body { + background:transparent; +} +.x-panel-ghost .x-window-tl { + border-bottom:1px solid; +} +.x-panel-collapsed .x-window-tl { + border-bottom:1px solid; +} +.x-window-maximized-ct { + overflow:hidden; +} +.x-window-sizing-ghost ul { + border:0 none !important; +} +.x-dlg-focus{ + -moz-outline:0 none; + outline:0 none; + width:0; + height:0; + overflow:hidden; + position:absolute; + top:0; + left:0; +} +.x-dlg-mask{ + z-index:10000; + display:none; + position:absolute; + top:0; + left:0; + -moz-opacity: 0.5; + opacity:.50; + filter: alpha(opacity=50); +} +body.ext-ie6.x-body-masked select { + visibility:hidden; +} +body.ext-ie6.x-body-masked .x-window select { + visibility:visible; +} +.x-window-plain .x-window-mc { + border: 1px solid; +} +.x-window-plain .x-window-body { + border: 1px solid; + background:transparent !important; +} +.x-html-editor-wrap { + border:1px solid; +} + +.x-html-editor-tb .x-btn-text { + background:transparent no-repeat; +} + +.x-html-editor-tip .x-tip-bd .x-tip-bd-inner { + padding:5px; + padding-bottom:1px; +} + +.x-html-editor-tb .x-toolbar { + position:static !important; +}.x-panel-noborder .x-panel-body-noborder { + border-width:0; +} +.x-panel-noborder .x-panel-header-noborder { + border-width:0 0 1px; + border-style:solid; +} +.x-panel-noborder .x-panel-tbar-noborder .x-toolbar { + border-width:0 0 1px; + border-style:solid; +} +.x-panel-noborder .x-panel-bbar-noborder .x-toolbar { + border-width:1px 0 0 0; + border-style:solid; +} +.x-window-noborder .x-window-mc { + border-width:0; +} +.x-window-plain .x-window-body-noborder { + border-width:0; +} +.x-tab-panel-noborder .x-tab-panel-body-noborder { + border-width:0; +} +.x-tab-panel-noborder .x-tab-panel-header-noborder { + border-width: 0 0 1px 0; +} +.x-tab-panel-noborder .x-tab-panel-footer-noborder { + border-width: 1px 0 0 0; +} +.x-tab-panel-bbar-noborder .x-toolbar { + border-width: 1px 0 0 0; + border-style:solid; +} +.x-tab-panel-tbar-noborder .x-toolbar { + border-width:0 0 1px; + border-style:solid; +} +.x-border-panel { + position:absolute !important; + left:0; + top:0; +} +.x-tool-collapse-south { + background-position:0 -195px; +} +.x-tool-collapse-south-over { + background-position:-15px -195px; +} +.x-tool-collapse-north { + background-position:0 -210px; +} +.x-tool-collapse-north-over { + background-position:-15px -210px; +} +.x-tool-collapse-west { + background-position:0 -180px; +} +.x-tool-collapse-west-over { + background-position:-15px -180px; +} +.x-tool-collapse-east { + background-position:0 -165px; +} +.x-tool-collapse-east-over { + background-position:-15px -165px; +} +.x-tool-expand-south { + background-position:0 -210px; +} +.x-tool-expand-south-over { + background-position:-15px -210px; +} +.x-tool-expand-north { + background-position:0 -195px; +} +.x-tool-expand-north-over { + background-position:-15px -195px; +} +.x-tool-expand-west { + background-position:0 -165px; +} +.x-tool-expand-west-over { + background-position:-15px -165px; +} +.x-tool-expand-east { + background-position:0 -180px; +} +.x-tool-expand-east-over { + background-position:-15px -180px; +} +.x-tool-expand-north, .x-tool-expand-south { + float:right; + margin:3px; +} +.x-tool-expand-east, .x-tool-expand-west { + float:none; + margin:3px auto; +} +.x-accordion-hd .x-tool-toggle { + background-position:0 -255px; +} +.x-accordion-hd .x-tool-toggle-over { + background-position:-15px -255px; +} +.x-panel-collapsed .x-accordion-hd .x-tool-toggle { + background-position:0 -240px; +} +.x-panel-collapsed .x-accordion-hd .x-tool-toggle-over { + background-position:-15px -240px; +} +.x-accordion-hd { + padding-top:4px; + padding-bottom:3px; + border-top:0 none; + background: transparent repeat-x 0 -9px; +} +.x-layout-collapsed{ + position:absolute; + left:-10000px; + top:-10000px; + visibility:hidden; + width:20px; + height:20px; + overflow:hidden; + border:1px solid; + z-index:20; +} +.ext-border-box .x-layout-collapsed{ + width:22px; + height:22px; +} +.x-layout-collapsed-over{ + cursor:pointer; +} +.x-layout-collapsed-west .x-layout-collapsed-tools, .x-layout-collapsed-east .x-layout-collapsed-tools{ + position:absolute; + top:0; + left:0; + width:20px; + height:20px; +} +.x-layout-split{ + position:absolute; + height:5px; + width:5px; + line-height:1px; + font-size:1px; + z-index:3; + background-color:transparent; +} +.ext-strict .ext-ie6 .x-layout-split{ + background-color: #fff !important; + filter: alpha(opacity=1); +} +.x-layout-split-h{ + background-image:url(../images/default/s.gif); + background-position: left; +} +.x-layout-split-v{ + background-image:url(../images/default/s.gif); + background-position: top; +} +.x-column-layout-ct { + overflow:hidden; + zoom:1; +} +.x-column { + float:left; + padding:0; + margin:0; + overflow:hidden; + zoom:1; +} +.x-column-inner { + overflow:hidden; + zoom:1; +} +.x-layout-mini { + position:absolute; + top:0; + left:0; + display:block; + width:5px; + height:35px; + cursor:pointer; + opacity:.5; + -moz-opacity:.5; + filter:alpha(opacity=50); +} +.x-layout-mini-over, .x-layout-collapsed-over .x-layout-mini{ + opacity:1; + -moz-opacity:1; + filter:none; +} +.x-layout-split-west .x-layout-mini { + top:48%; +} +.x-layout-split-east .x-layout-mini { + top:48%; +} +.x-layout-split-north .x-layout-mini { + left:48%; + height:5px; + width:35px; +} +.x-layout-split-south .x-layout-mini { + left:48%; + height:5px; + width:35px; +} +.x-layout-cmini-west .x-layout-mini { + top:48%; +} +.x-layout-cmini-east .x-layout-mini { + top:48%; +} +.x-layout-cmini-north .x-layout-mini { + left:48%; + height:5px; + width:35px; +} +.x-layout-cmini-south .x-layout-mini { + left:48%; + height:5px; + width:35px; +} +.x-layout-cmini-west, .x-layout-cmini-east { + border:0 none; + width:5px !important; + padding:0; + background:transparent; +} +.x-layout-cmini-north, .x-layout-cmini-south { + border:0 none; + height:5px !important; + padding:0; + background:transparent; +} +.x-viewport, .x-viewport body { + margin: 0; + padding: 0; + border: 0 none; + overflow: hidden; + height: 100%; +} +.x-abs-layout-item { + position:absolute !important; + left:0; + top:0; +} +.x-abs-layout-container { + position:relative; +} +.ext-ie input.x-abs-layout-item, .ext-ie textarea.x-abs-layout-item { + margin:0; +} +.x-box-layout-ct { + overflow:hidden; + zoom:1; +} +.x-box-inner { + overflow:hidden; + zoom:1; + position:relative; + left:0; + top:0; +} +.x-box-item { + position:absolute !important; + left:0; + top:0; +} +.x-border-layout-ct { + position: relative; +} +.x-progress-wrap { + border:1px solid; + overflow:hidden; +} +.x-progress-inner { + height:18px; + background:repeat-x; + position:relative; +} +.x-progress-bar { + height:18px; + float:left; + width:0; + background: repeat-x left center; + border-top:1px solid; + border-bottom:1px solid; + border-right:1px solid; +} +.x-progress-text { + padding:1px 5px; + overflow:hidden; + position:absolute; + left:0; + text-align:center; +} +.x-progress-text-back { + line-height:16px; +} +.ext-ie .x-progress-text-back { + line-height:15px; +} +.x-slider { + zoom:1; + -moz-outline: none; + outline: 0 none; +} +.x-slider-thumb { + line-height: 0px; + font-size: 0px; + position: absolute; + background:transparent no-repeat 0 0; +} +.x-slider-inner { + position:relative; + left:0; + top:0; + overflow:visible; + zoom:1; +} +.x-slider-focus { + position:absolute; + left:0; + top:0; + width:1px; + height:1px; + line-height:1px; + font-size:1px; + -moz-outline:0 none; + outline:0 none; + -moz-user-select: none; + -khtml-user-select: none; + -webkit-user-select: ignore + display:block; + overflow:hidden; +} +.x-slider-horz { + padding-left:7px; + background:transparent no-repeat 0 -22px; +} +.x-slider-horz .x-slider-end { + padding-right:7px; + zoom:1; + background:transparent no-repeat right -44px; +} +.x-slider-horz .x-slider-inner { + background:transparent repeat-x 0 0; + height:22px; +} +.x-slider-horz .x-slider-thumb { + width:14px; + height:15px; + left:0; + top:3px; +} +.x-slider-horz .x-slider-thumb-over { + background-position: -14px -15px; +} +.x-slider-horz .x-slider-thumb-drag { + background-position: -28px -30px; +} +.x-slider-vert { + padding-top:7px; + background:transparent no-repeat -44px 0; + width:22px; +} +.x-slider-vert .x-slider-end { + padding-bottom:7px; + zoom:1; + background:transparent no-repeat -22px bottom; +} +.x-slider-vert .x-slider-inner { + background:transparent repeat-y 0 0; +} +.x-slider-vert .x-slider-thumb { + width:15px; + height:14px; + left:3px; + bottom:0; +} +.x-slider-vert .x-slider-thumb-over { + background-position: -15px -14px; +} +.x-slider-vert .x-slider-thumb-drag { + background-position: -30px -28px; +} +.x-window-dlg .x-window-body { + border:0 none !important; + padding:5px 10px; + overflow:hidden !important; +} +.x-window-dlg .x-window-mc { + border:0 none !important; +} +.x-window-dlg .ext-mb-input { + margin-top:4px; + width:95%; +} +.x-window-dlg .ext-mb-textarea { + margin-top:4px; +} +.x-window-dlg .x-progress-wrap { + margin-top:4px; +} +.ext-ie .x-window-dlg .x-progress-wrap { + margin-top:6px; +} +.x-window-dlg .x-msg-box-wait { + background:transparent no-repeat left; + display:block; + width:300px; + padding-left:18px; + line-height:18px; +} +.x-window-dlg .ext-mb-icon { + float:left; + width:47px; + height:32px; +} +.ext-ie .x-window-dlg .ext-mb-icon { + width:44px; +} +.x-window-dlg .x-dlg-icon .ext-mb-content{ + zoom: 1; margin-left: 47px; +} +.x-window-dlg .ext-mb-info, .x-window-dlg .ext-mb-warning, .x-window-dlg .ext-mb-question, .x-window-dlg .ext-mb-error { + background:transparent no-repeat top left; +} +.ext-gecko2 .ext-mb-fix-cursor { + overflow:auto; +} +.arrow-top { + background: url(../images/gxt/icons/top2.gif) no-repeat center left !important; +} +.arrow-bottom { + background: url(../images/gxt/icons/bottom2.gif) no-repeat center left !important; +} +.arrow-up { + background: url(../images/gxt/icons/up2.gif) no-repeat center left !important; +} +.arrow-down { + background: url(../images/gxt/icons/down2.gif) no-repeat center left !important; +} +.arrow-left { + background: url(../images/gxt/icons/left2.gif) no-repeat center left !important; +} +.arrow-double-left { + background: url(../images/gxt/icons/doubleleft2.gif) no-repeat center left !important; +} +.arrow-right { + background: url(../images/gxt/icons/right2.gif) no-repeat center left !important; +} +.arrow-double-right { + background: url(../images/gxt/icons/doubleright2.gif) no-repeat center left !important; +} +.x-info { + border-style: solid; + border-color: #99bbe8; + border-width: 0; + z-index: 99999999; +} + +.x-info-header { + overflow: hidden; + zoom: 1; + color: black; + font: bold 13px tahoma, arial, verdana, sans-serif; + padding: 5px 3px 4px 5px; + line-height: 15px; + background: transparent url(../images/default/panel/white-top-bottom.gif) repeat-x 0 -1px; +} + +.x-info-body { + border-top: 0 none; + overflow: hidden; + background: white; + position: relative; /* added for item scroll positioning */ +} + +.x-info-header { + overflow: hidden; + zoom: 1; +} + +.x-info-tl .x-info-header { + color: #555555; + font-family: tahoma, arial, sans-serif; + font-size: 13px; + font-size-adjust: none; + font-stretch: normal; + font-style: normal; + font-variant: normal; + font-weight: bold; + line-height: normal; + padding: 5px 0 4px 0; + border: 0 none; + background: transparent; +} + +.x-info-tl .x-info-icon,.x-window-tl .x-info-icon { + padding-left: 20px !important; + background-repeat: no-repeat; + background-position: 0 4px; + zoom: 1; +} + +.x-info-inline-icon { + width: 16px; + height: 16px; + background-repeat: no-repeat; + background-position: 0 0; + vertical-align: middle; + margin-right: 4px; + margin-top: -1px; + margin-bottom: -1px; +} + +.x-info-tc { + background: transparent url(../images/gxt/info/top-bottom.gif) repeat-x 0 0; + overflow: hidden; +} + +/* fix ie7 strict mode bug */ +.ext-ie7 .x-info-tc { + overflow: visible; +} + +.x-info-tl { + background: transparent url(../images/gxt/info/corners-sprite.gif) no-repeat 0 0; + padding-left: 6px; + zoom: 1; +} + +.x-info-tr { + background: transparent url(../images/gxt/info/corners-sprite.gif) no-repeat right 0; + zoom: 1; + padding-right: 6px; +} + +.x-info-bc { + background: transparent url(../images/default/panel/top-bottom.gif) repeat-x 0 bottom; + zoom: 1; + font-size: 0px; +} + +.x-info-bc .x-info-footer { + zoom: 1; +} + +.x-info-bl { + background: transparent url(../images/default/panel/corners-sprite.gif) no-repeat 0 bottom; + padding-left: 6px; + zoom: 1; +} + +.x-info-br { + background: transparent url(../images/default/panel/corners-sprite.gif) no-repeat right bottom; + padding-right: 6px; + zoom: 1; +} + +.x-info-mc { + border: 0 none; + padding: 0; + margin: 0; + font: normal 11px tahoma, arial, helvetica, sans-serif; + background: #dfe8f6; +} + +.x-info-mc .x-info-body { + background: transparent; + border: 0 none; +} + +.x-info-ml { + background: #fff url(../images/default/panel/left-right.gif) repeat-y 0 0; + padding-left: 6px; + zoom: 1; +} + +.x-info-mr { + background: transparent url(../images/default/panel/left-right.gif) repeat-y right 0; + padding-right: 6px; + zoom: 1; +} + +.x-info-bc .x-info-footer { + padding-bottom: 6px; +} + +.x-info-nofooter .x-info-bc,.x-panel-nofooter .x-info-bc { + height: 6px; + font-size: 0; + line-height: 0; +} + +.x-info-bwrap { + overflow: hidden; + zoom: 1; +} + +.x-info-body { + overflow: hidden; + zoom: 1; + color: #555555; + font-family: tahoma, arial, sans-serif; + font-size: 12px; + font-size-adjust: none; + font-style: normal; + font-variant: normal; + font-weight: normal; +}.x-combo-over { + border: 1px dotted #B5B4B4 !important; + background: #F1F1F1; + cursor: pointer; +} + +.my-list { + border: 1px solid #99BBE8; + -moz-outline: none; + outline: 0 none; + -moz-user-focus: normal; + background-color: white; + font-family: "Myriad Pro", "Myriad Web", "Tahoma", "Helvetica", "Arial", sans-serif; +} + +.my-list-notchecked { + background: url(../images/gxt/tree/notchecked.gif) no-repeat 0px 0px !important; + margin: 3px 0pt 0pt 0px; +} + +.my-list-checked { + background: url(../images/gxt/tree/checked.gif) no-repeat 0px 0px !important; + margin: 3px 0pt 0pt 0px; +} + +.ext-ie .my-list-notchecked { + margin: 2px 0pt 0pt 0px; +} + +.ext-ie .my-list-checked { + margin: 2px 0pt 0pt 0px; +} + +.my-list-flat { + border: 1px solid #6593cf; + -moz-outline: none; + outline: 0 none; + -moz-user-focus: normal; + background-color: white; + cursor: default; +} + +.my-list-item { + cursor: pointer; + -moz-outline: none; + outline: 0 none; + -moz-user-focus: normal; +} + +.my-list-flat .my-list-item { + height: 19px; + border: 1px solid white; +} + +.my-list-flat .my-list-item-over { + background-color: #F1F1F1; + border: 1px dotted #B5B4B4; +} + +.my-list-flat .my-list-item-sel { + background-color: #DFE8F6; + border: 1px dotted #9EB8ED; +} + +.my-list-flat .my-list-item-over .my-list-item-l { + background: none; +} + +.my-list-flat .my-list-item-over .my-list-item-icon,.my-list-flat .my-list-item-over .my-list-item-ml,.my-list-flat .my-list-item-over .my-list-item-c + { + background: none; +} + +.my-list-flat .my-list-item-over .my-list-item-r { + background: none; +} + +.my-list-flat .my-list-item-sel .my-list-item-l { + background: none; +} + +.my-list-flat .my-list-item-sel .my-list-item-icon,.my-list-flat .my-list-item-sel .my-list-item-ml,.my-list-flat .my-list-item-sel .my-list-item-c + { + background: none; +} + +.my-list-flat .my-list-item-sel .my-list-item-r { + background: none; +} + +.my-list-item-text { + font-size: 11px; + padding-top: 3px; + padding-left: 2px; + white-space: nowrap; + overflow: hidden; + line-height: 19px; +} + +.my-list-item-l div { + width: 5px; +} + +.my-list-item-ml { + width: 18px; +} + +.my-list-item-c { + width: 100%; +} + +.my-list-item-r div { + width: 3px; +} + +.my-list-item-over .my-list-item-l { + background: url(../images/gxt/shared/select-19-bg.gif) no-repeat left -57px; +} + +.my-list-item-over .my-list-item-icon,.my-list-item-over .my-list-item-check,.my-list-item-over .my-list-item-c + { + background: url(../images/gxt/shared/select-19-bg.gif) repeat-x left -95px; +} + +.my-list-item-over .my-list-item-r { + background: url(../images/gxt/shared/select-19-bg.gif) no-repeat right -76px; +} + +.my-list-item-sel .my-list-item-l { + background: url(../images/gxt/shared/select-19-bg.gif) no-repeat left 0px; +} + +.my-list-item-sel .my-list-item-icon,.my-list-item-sel .my-list-item-check,.my-list-item-sel .my-list-item-c + { + background: url(../images/gxt/shared/select-19-bg.gif) left -38px; +} + +.my-list-item-sel .my-list-item-r { + background: url(../images/gxt/shared/select-19-bg.gif) no-repeat right -19px; +}.x-view { + -moz-outline: none; + -moz-user-focus: normal; + outline: 0 none; + background-color: white; + cursor: default; + border: 1px solid #98C0F4; + overflow: auto; + padding: 0px; + zoom: 1; +} + +.x-view-item { + border: 1px solid #FFFFFF; + font-family: tahoma, arial, helvetica, sans-serif; + font-size: 12px; + font-size-adjust: none; + font-stretch: normal; + font-style: normal; + font-variant: normal; + font-weight: normal; + line-height: normal; + overflow: hidden; + padding: 2px; + white-space: nowrap; +} + +.x-view-highlightrow { + border: 1px dotted #545352 !important; +} + +.x-view-item-over { + background: #efefef url(../images/default/grid/row-over.gif) repeat-x left top; + border: 1px dotted #dddddd !important; + cursor: pointer; +} + +.x-view-item-sel { + background: #DFE8F6 none repeat scroll 0%; + border: 1px dotted #A3BAE9 !important; + cursor: pointer; +} +.x-view-item-check { + padding: 0px; +} +.x-view-item-check td { + font-family: tahoma, arial, helvetica, sans-serif; + font-size: 12px; + font-size-adjust: none; + font-stretch: normal; + font-style: normal; + font-variant: normal; + font-weight: normal; + line-height: normal; + white-space: nowrap; + vertical-align: middle; + padding-left: 1px; +} + +.x-splitbar-shim { + filter: alpha(opacity = 1); + opacity: 0; + position: absolute; + width: 100%; + height: 100%; + z-index: 10; + background-color: white; + -moz-user-select: none; + -khtml-user-select: none; + user-select: none; + -moz-outline: none; + -moz-user-focus: normal; + outline: 0 none; +} + +.x-vsplitbar { + background: url(../images/default/s.gif); + position: absolute; + z-index: 3; + cursor: e-resize; + cursor: col-resize; +} + +.x-hsplitbar { + background: url(../images/default/s.gif); + position: absolute; + font-size: 1px; + line-height: 1px; + z-index: 3; + cursor: s-resize; + cursor: row-resize; +} + +.x-splitbar-proxy { + position: absolute; + background-color: #929090; + font-size: 1px; + line-height: 1px; + z-index: 200; +} + +.my-splitbar-shim { + filter: alpha(opacity = 1); + opacity: 0; + position: absolute; + width: 100%; + height: 100%; + z-index: 10; + background-color: white; + -moz-user-select: none; + -khtml-user-select: none; + user-select: none; + -moz-outline: none; + -moz-user-focus: normal; + outline: 0 none; +} + +.my-splitbar-transparent { + background: none; + font-size: 1px; + line-height: 1px; + z-index: 2000; +} + +.my-splitbar-proxy { + position: absolute; + background-color: #929090; + font-size: 1px; + line-height: 1px; + z-index: 200; +}.x-status { + padding: 0 4px; + height: 21px; + line-height: 21px !important; + cursor: default; +} +.x-status .x-status-text{ + padding: 2px; + line-height: 21px !important; +} +.x-status-icon { + padding-left: 25px !important; + background: transparent no-repeat left center; +} +.x-status-busy { + background-image: url(../images/default/grid/loading.gif); +} +.x-status-text-panel { + border: 1px solid; + border-color: #99bbe8 #fff #fff #99bbe8; +} +.my-tbl { + border: 1px solid #99BBE8; + cursor: default; + background-color: white; + overflow: hidden; + -moz-outline: none; + -moz-user-focus: normal; + outline: 0 none; + font-family: arial, tahoma, helvetica, sans-serif; + font-size: 11px; + table-layout: fixed; +} + +.my-tbl-col-overflow { + overflow: hidden; +} + +.ext-ie .my-tbl-col-overflow { + +} + +.my-tbl-col-text { + color: black; + padding: 5px 4px 0 4px; + display: block; + white-space: nowrap; + font-family: arial, tahoma, helvetica, sans-serif; + font-size: 11px; +} + +.my-tbl-col { + border-right: 1px solid #D5D5D5; + background: url(../images/gxt/table/vs-column-bg.gif) repeat-x; +} + +.my-tbl-col-splitter { + position: absolute; + top: 0; + width: 6px; + z-index: 100; + height: 100%; + right: 0px; +} + +.my-tbl-col-over { + background: url(../images/gxt/table/vs-column-bg.gif) repeat-x 0px -24px; +} + +.my-tbl-col-sort { + background-position: 0px -48px; +} + +.my-icon-asc { + background-image: url(../images/gxt/icons/hmenu-asc.gif) !important; +} + +.my-icon-desc { + background-image: url(../images/gxt/icons/hmenu-desc.gif) !important; +} + +.my-tbl-col-asc { + background: url(../images/gxt/table/vsort-asc.gif) no-repeat 50% top; +} + +.my-tbl-col-desc { + background: url(../images/gxt/table/vsort-desc.gif) no-repeat 50% top; +} + +.my-tbl-col-splitter { + background: none; +} + +.my-tbl-data { + background-color: white; + overflow: hidden; + -moz-outline: none; + -moz-user-focus: normal; + outline: 0 none; +} + +.my-tbl-item { + border-top: 1px solid white; + border-bottom: 1px solid white; + border-bottom: 1px solid #EDEDED; + cursor: default; + -moz-outline: none; + -moz-user-focus: normal; + outline: 0 none; +} + +.my-tbl-item table { + -moz-outline: none; + -moz-user-focus: normal; + table-layout: fixed; + outline: 0 none; +} + +.my-tbl-data .my-tbl-item-cell { + -moz-outline: none; + -moz-user-focus: normal; + outline: 0 none; +} + +.my-tbl-item td { + -moz-user-select: none; + -moz-outline: none; + -moz-user-focus: normal; + outline: 0 none; +} + +.my-tbl-vlines .my-tbl-data .my-tbl-item-cell-overflow { + border-right: 1px solid #EDEDED; +} + +.my-tbl-data .my-tbl-item-cell-overflow { + white-space: nowrap; + overflow: hidden; + -moz-outline: none; + -moz-user-focus: normal; + outline: 0 none; +} + +.my-tbl-data .my-tbl-item-cell-text { + padding: 3px 4px; + font-family: arial, tahoma, helvetica, sans-serif; + font-size: 11px; + -moz-outline: none; + -moz-user-focus: normal; + outline: 0 none; +} + +.my-tbl-data .my-tbl-item-cell-widget { + padding: 1px 4px; +} + +.my-tbl-data tr { + overflow: hidden; +} + +.my-tbl-item-over { + border-top: 1px solid #dddddd; + border-bottom: 1px solid #dddddd; + background: #efefef url(../images/default/grid/row-over.gif) repeat-x left top; +} + +.my-tbl-item-sel { + background-image: none !important; + background-color: #D9E1ED !important; + border-top: 1px dotted #9EB8ED !important; + border-bottom: 1px dotted #9EB8ED !important; +} + +.ext-ie .my-tbl TD .x-form-text { + POSITION: static; + TOP: 0px; +}.tree-folder { + background: url(../images/gxt/icons/folder-closed.gif) no-repeat -1px -1px; +} + +.tree-folder-open { + background: url(../images/gxt/icons/folder.gif) no-repeat -1px -1px; +} + +.my-treetbl-tree { + cursor: default; +} + +.my-treetblitem,.my-treetblitem table,.my-treetblitem table td { + -moz-outline: none; + -moz-user-focus: normal; + outline: 0 none; +} + +.my-treetblitem td { + height: 19px; +} + +.my-treetbl-indent { + line-height: 1px; + font-size: 1px; +} + +.my-treetbl-joint div { + width: 15px; + height: 19px; + line-height: 1px; + font-size: 1px; +} + +.my-treetbl-left,.my-treetbl-left div,.my-treetbl-right { + line-height: 1px; + font-size: 1px; + width: 3px; +} + +.my-treetbl-left div,.my-treetbl-right div { + width: 3px; +} + +.my-treetbl-check div { + width: 17px; + height: 19px; + line-height: 1px; + font-size: 1px; + display: block; +} + +.my-treetbl-icon div { + width: 16px; + height: 16px; + margin-top: 1px; + cursor: pointer; + background-repeat: no-repeat; + background-position: center; +} + +.my-ie .my-treetbl-icon { + padding-top: 2px; +} + +.my-ie .my-treetbl-icon div { + position: static; +} + +.my-treetbl-item-text span { + font-family: arial, tahoma, helvetica, sans-serif; + font-size: 12px; + white-space: nowrap; + padding-left: 3px; + padding-right: 3px; + display: block; + height: 15px; + cursor: pointer; +} + +.my-treetbl-over .my-treetbl-left { + background: url(../images/gxt/shared/select-19-bg.gif) no-repeat left -57px; +} + +.my-treetbl-over .my-treetbl-right { + background: url(../images/gxt/shared/select-19-bg.gif) no-repeat right -76px; +} + +.my-treetbl-over .my-treetbl-check,.my-treetbl-over .my-treetbl-icon,.my-treetbl-over .my-treetbl-item-text + { + background: url(../images/gxt/shared/select-19-bg.gif) left -95px; +} + +.my-treetbl-sel .my-treetbl-left { + background: url(../images/gxt/shared/select-19-bg.gif) no-repeat left 0px; +} + +.my-treetbl-sel .my-treetbl-right { + background: url(../images/gxt/shared/select-19-bg.gif) no-repeat right -19px; +} + +.my-treetbl-sel .my-treetbl-check,.my-treetbl-sel .my-treetbl-icon,.my-treetbl-sel .my-treetbl-item-text + { + background: url(../images/gxt/shared/select-19-bg.gif) left -38px; +} + +.my-treetbl-close { + background: url(../images/gxt/tree/vnode_transparent.gif) no-repeat 0px 1px; +} + +.my-treetbl-open { + background: url(../images/gxt/tree/vnode_transparent.gif) no-repeat 0px -32px; +} + +.my-treetbl-joint-over .my-treetbl-open { + background: url(../images/gxt/tree/vnode_transparent.gif) no-repeat 0px -48px; +} + +.my-treetbl-joint-over .my-treetbl-close { + background: url(../images/gxt/tree/vnode_transparent.gif) no-repeat 0px -15px; +} + +.my-treetbl-notchecked { + background: url(../images/gxt/tree/notchecked.gif) no-repeat 0px 50%; +} + +.my-treetbl-checked { + background: url(../images/gxt/tree/checked.gif) no-repeat 0px 50%; +} + +.my-treetbl-loading .tree-folder { + background: url(../images/gxt/icons/wait.gif) no-repeat 0px -1px; +} + +.my-treetbl-loading .my-treetbl-item-text span { + font-style: italic; +} + +.my-treetbl { + border: 1px solid #99BBE8; + cursor: default; + background-color: white; + overflow: hidden; + -moz-outline: none; + -moz-user-focus: normal; + outline: 0 none; +} + +.my-treetbl-col-overflow { + overflow: hidden; + -moz-outline: none; + -moz-user-focus: normal; + outline: 0 none; +} + +.my-treetbl-col-text { + color: black; + padding: 5px 4px 0 4px; + display: block; + white-space: nowrap; + font-family: arial, tahoma, helvetica, sans-serif; + font-size: 12px; +} + +.my-treetbl-col { + border-right: 1px solid #D5D5D5; + background: url(../images/gxt/table/vs-column-bg.gif) repeat-x; +} + +.my-treetbl-col-splitter { + position: absolute; + top: 0; + width: 6px; + z-index: 100; + height: 100%; + right: 0px; +} + +.my-treetbl-col-over { + background: url(../images/gxt/table/vs-column-bg.gif) repeat-x 0px -24px; +} + +.my-treetbl-col-sort { + background-position: 0px -48px; +} + +.my-treetbl-col-asc { + background: url(../images/gxt/table/vsort-asc.gif) no-repeat 50% top; +} + +.my-treetbl-col-desc { + background: url(../images/gxt/table/vsort-desc.gif) no-repeat 50% top; +} + +.my-treetbl-col-splitter { + background: none; +} + +.my-treetbl-data { + background-color: white; + overflow: hidden; +} + +.my-treetbl-data .my-treetbl-cell { + height: 20px; + -moz-outline: none; + -moz-user-focus: normal; + outline: 0 none; +} + +.my-treetbl-data .my-treetbl-cell-overflow { + white-space: nowrap; + overflow: hidden; +} + +.my-treetbl-data .my-treetbl-cell-text { + padding: 0px 0px; + font-family: arial, tahoma, helvetica, sans-serif; + font-size: 12px; +} + +.my-treetbl-data tr { + overflow: hidden; +} + +.my-treetbl-item { + border-top: 1px solid white; + border-bottom: 1px solid white; + border-bottom: 1px solid #EDEDED; + cursor: default; + -moz-outline: none; + -moz-user-focus: normal; + outline: 0 none; +} + +.my-treetbl-item-over { + border-top: 1px solid #dddddd; + border-bottom: 1px solid #dddddd; + background: #efefef url(../images/default/grid/row-over.gif) repeat-x left top; +} + +.my-treetbl-item-sel { + background-image: none; + background-color: #D9E1ED; + border-top: 1px dotted #9EB8ED; + border-bottom: 1px dotted #9EB8ED; +} + +.my-treetbl .x-grid3-td-numberer { + background: transparent url(../images/gxt/tree/tree-table-special-col.gif) repeat-y + scroll left center; + height: 19px; + line-height: normal; + padding-left: 0px; + margin-left: 0px; +} + +.x-grid3-td-numberer div { + font-size: 11px; + font-family: "segoe ui", tahoma, arial, sans-serif; + color: #444444; + padding: 3px 0px 0 5px !important; +} + +.ext-ie .my-treetbl .x-grid3-td-numberer { + height: 20px; +} + +.my-treetbl-item-sel .x-grid3-td-numberer { + background: transparent url(../images/gxt/tree/tree-table-special-col-sel.gif) repeat-y + scroll left center; +}.ext-el-mask { + background-color: #ccc; +} +.ext-el-mask-msg { + border-color:#6593cf; + background-color:#c3daf9; + background-image:url(../images/default/box/tb-blue.gif); +} +.ext-el-mask-msg div { + background-color: white; + border-color:#a3bad9; + color:#222; + font:normal 11px tahoma, arial, helvetica, sans-serif; +} +.x-mask-loading div { + background-color:#fbfbfb; + background-image:url(../images/default/grid/loading.gif); +} +.x-item-disabled { + color: gray; +} +.x-item-disabled * { + color: gray !important; +} +.x-splitbar-proxy { + background-color: #aaa; +} +.x-color-palette a { + border-color:#fff; +} +.x-color-palette a.x-color-palette-hover, .x-color-palette a.x-color-palette-sel { + border-color:#8bb8f3; + background-color: #deecfd; +} +.x-color-palette em { + border-color:#aca899; +} +.x-ie-shadow { + background-color:#777; +} +.x-shadow .xsmc { + background-image: url(../images/default/shadow-c.png); +} +.x-shadow .xsml, .x-shadow .xsmr { + background-image: url(../images/default/shadow-lr.png); +} +.x-shadow .xstl, .x-shadow .xstc, .x-shadow .xstr, .x-shadow .xsbl, .x-shadow .xsbc, .x-shadow .xsbr{ + background-image: url(../images/default/shadow.png); +} +.loading-indicator { + font-size: 11px; + background-image: url(../images/default/grid/loading.gif); +} +.x-spotlight { + background-color: #ccc; +} +.x-aria-focusframe-side { + background-color: #15428B; + line-height: 2px; + font-size: 2px; +} +.x-tab-panel-header, .x-tab-panel-footer { + background-color: #deecfd; + border-color:#8db2e3; + overflow:hidden; + zoom:1; +} +.x-tab-panel-header, .x-tab-panel-footer { + border-color:#8db2e3; +} +ul.x-tab-strip-top{ + background-color:#cedff5; + background-image: url(../images/default/tabs/tab-strip-bg.gif); + border-bottom-color:#8db2e3; +} +ul.x-tab-strip-bottom{ + background-color:#cedff5; + background-image: url(../images/default/tabs/tab-strip-btm-bg.gif); + border-top-color:#8db2e3; +} +.x-tab-panel-header-plain .x-tab-strip-spacer, +.x-tab-panel-footer-plain .x-tab-strip-spacer { + border-color:#8db2e3; + background-color: #deecfd; +} +.x-tab-strip span.x-tab-strip-text { + font:normal 11px tahoma,arial,helvetica; + color:#416aa3; +} +.x-tab-strip-over span.x-tab-strip-text { + color:#15428b; +} +.x-tab-strip-active span.x-tab-strip-text { + color:#15428b; + font-weight:bold; +} +.x-tab-strip-disabled .x-tabs-text { + color:#aaaaaa; +} +.x-tab-strip-top .x-tab-right, .x-tab-strip-top .x-tab-left, .x-tab-strip-top .x-tab-strip-inner{ + background-image: url(../images/default/tabs/tabs-sprite.gif); +} +.x-tab-strip-bottom .x-tab-right { + background-image: url(../images/default/tabs/tab-btm-inactive-right-bg.gif); +} +.x-tab-strip-bottom .x-tab-left { + background-image: url(../images/default/tabs/tab-btm-inactive-left-bg.gif); +} +.x-tab-strip-bottom .x-tab-strip-active .x-tab-right { + background-image: url(../images/default/tabs/tab-btm-right-bg.gif); +} +.x-tab-strip-bottom .x-tab-strip-active .x-tab-left { + background-image: url(../images/default/tabs/tab-btm-left-bg.gif); +} +.x-tab-strip .x-tab-strip-closable a.x-tab-strip-close { + background-image:url(../images/default/tabs/tab-close.gif); +} +.x-tab-strip .x-tab-strip-closable a.x-tab-strip-close:hover{ + background-image:url(../images/default/tabs/tab-close.gif); +} +.x-tab-panel-body { + border-color:#8db2e3; + background-color:#fff; +} +.x-tab-panel-body-top { + border-top: 0 none; +} +.x-tab-panel-body-bottom { + border-bottom: 0 none; +} +.x-tab-scroller-left { + background-image:url(../images/default/tabs/scroll-left.gif); + border-bottom-color:#8db2e3; +} +.x-tab-scroller-left-over { + background-position: 0 0; +} +.x-tab-scroller-left-disabled { + background-position: -18px 0; + opacity:.5; + -moz-opacity:.5; + filter:alpha(opacity=50); + cursor:default; +} +.x-tab-scroller-right { + background-image:url(../images/default/tabs/scroll-right.gif); + border-bottom-color:#8db2e3; +} +.x-tab-panel-bbar .x-toolbar, .x-tab-panel-tbar .x-toolbar { + border-color:#99bbe8; +} +.x-form-field { + font: normal 12px tahoma, arial, helvetica, sans-serif; +} + +.x-form-text,textarea.x-form-field { + background-color: #fff; + background-image: url(../images/default/form/text-bg.gif); + border-color: #b5b8c8; +} + +.x-form-select-one { + background-color: #fff; + border-color: #b5b8c8; +} + +.x-form-check-group-label { + border-bottom: 1px solid #99bbe8; + color: #15428b; +} + +.x-editor .x-form-check-wrap { + background-color: #fff; +} + +.x-form-field-wrap .x-form-trigger { + background-image: url(../images/default/form/trigger.gif); + border-bottom-color: #b5b8c8; +} + +.x-form-field-wrap .x-form-date-trigger { + background-image: url(../images/default/form/date-trigger.gif); +} + +.x-form-field-wrap .x-form-clear-trigger { + background-image: url(../images/default/form/clear-trigger.gif); +} + +.x-form-field-wrap .x-form-search-trigger { + background-image: url(../images/default/form/search-trigger.gif); +} + +.x-trigger-wrap-focus .x-form-trigger { + border-bottom-color: #7eadd9; +} + +.x-item-disabled .x-form-trigger-over { + border-bottom-color: #b5b8c8; +} + +.x-item-disabled .x-form-trigger-click { + border-bottom-color: #b5b8c8; +} + +.x-form-focus,textarea.x-form-focus { + border-color: #7eadd9; +} + +.x-form-invalid,textarea.x-form-invalid { + background-color: #fff; + background-image: url(../images/default/grid/invalid_line.gif); + border-color: #c30; +} + +.ext-safari .x-form-invalid { + background-color: #fee; + border-color: #ff7870; +} + +.x-form-inner-invalid,textarea.x-form-inner-invalid { + background-color: #fff; + background-image: url(../images/default/grid/invalid_line.gif); +} + +.x-form-grow-sizer { + font: normal 12px tahoma, arial, helvetica, sans-serif; +} + +.x-form-item { + font: normal 12px tahoma, arial, helvetica, sans-serif; +} + +.x-form-invalid-msg { + color: #c0272b; + font: normal 11px tahoma, arial, helvetica, sans-serif; + background-image: url(../images/default/shared/warning.gif); +} + +.x-form-empty-field { + color: gray; +} + +.x-small-editor .x-form-field { + font: normal 11px arial, tahoma, helvetica, sans-serif; +} + +.ext-safari .x-small-editor .x-form-field { + font: normal 12px arial, tahoma, helvetica, sans-serif; +} + +.x-form-invalid-icon { + background-image: url(../images/default/form/exclamation.gif); +} + +.x-fieldset { + border-color: #b5b8c8; +} + +.x-fieldset legend { + font: bold 11px tahoma, arial, helvetica, sans-serif; + color: #15428b; +} + +.x-editor .x-form-check-wrap { + border-color: #7eadd9; +} + +.x-spinner-field .x-form-spinner-up { + background-image: url('../images/default/form/spinner.gif'); +} +.x-spinner-field .x-form-spinner-down { + background-image: url('../images/default/form/spinner.gif'); +}.x-btn{ + font:normal 11px tahoma, verdana, helvetica; +} +.x-btn button{ + font:normal 11px arial,tahoma,verdana,helvetica; + color:#333; +} +.x-btn em { + font-style:normal; + font-weight:normal; +} +.x-btn-tl, .x-btn-tr, .x-btn-tc, .x-btn-ml, .x-btn-mr, .x-btn-mc, .x-btn-bl, .x-btn-br, .x-btn-bc{ + background-image:url(../images/default/button/btn.gif); +} +.x-btn-click .x-btn-text, .x-btn-menu-active .x-btn-text, .x-btn-pressed .x-btn-text{ + color:#000; +} +.x-btn-disabled *{ + color:gray !important; +} +.x-btn-mc em.x-btn-arrow { + background-image:url(../images/default/button/arrow.gif); +} +.x-btn-mc em.x-btn-split { + background-image:url(../images/default/button/s-arrow.gif); +} +.x-btn-over .x-btn-mc em.x-btn-split, .x-btn-click .x-btn-mc em.x-btn-split, .x-btn-menu-active .x-btn-mc em.x-btn-split, .x-btn-pressed .x-btn-mc em.x-btn-split { + background-image:url(../images/default/button/s-arrow-o.gif); +} +.x-btn-mc em.x-btn-arrow-bottom { + background-image:url(../images/default/button/s-arrow-b-noline.gif); +} +.x-btn-mc em.x-btn-split-bottom { + background-image:url(../images/default/button/s-arrow-b.gif); +} +.x-btn-over .x-btn-mc em.x-btn-split-bottom, .x-btn-click .x-btn-mc em.x-btn-split-bottom, .x-btn-menu-active .x-btn-mc em.x-btn-split-bottom, .x-btn-pressed .x-btn-mc em.x-btn-split-bottom { + background-image:url(../images/default/button/s-arrow-bo.gif); +} +.x-btn-group-header { + color: #3e6aaa; +} +.x-btn-group-tc { + background-image: url(../images/default/button/group-tb.gif); +} +.x-btn-group-tl { + background-image: url(../images/default/button/group-cs.gif); +} +.x-btn-group-tr { + background-image: url(../images/default/button/group-cs.gif); +} +.x-btn-group-bc { + background-image: url(../images/default/button/group-tb.gif); +} +.x-btn-group-bl { + background-image: url(../images/default/button/group-cs.gif); +} +.x-btn-group-br { + background-image: url(../images/default/button/group-cs.gif); +} +.x-btn-group-ml { + background-image: url(../images/default/button/group-lr.gif); +} +.x-btn-group-mr { + background-image: url(../images/default/button/group-lr.gif); +} +.x-btn-group-notitle .x-btn-group-tc { + background-image: url(../images/default/button/group-tb.gif); +} +.x-toolbar { + border-color: #a9bfd3; + background-color: #d0def0; + background-image: url(../images/default/toolbar/bg.gif); +} + +.x-toolbar td,.x-toolbar span,.x-toolbar input,.x-toolbar div,.x-toolbar select,.x-toolbar label { + font: normal 11px arial, tahoma, helvetica, sans-serif; +} + +.x-toolbar .x-item-disabled { + color: gray; +} + +.x-toolbar .x-item-disabled * { + color: gray; +} + +.x-toolbar .x-btn-mc em.x-btn-split { + background-image: url(../images/default/button/s-arrow-noline.gif); +} + +.x-toolbar .x-btn-over .x-btn-mc em.x-btn-split,.x-toolbar .x-btn-click .x-btn-mc em.x-btn-split,.x-toolbar .x-btn-menu-active .x-btn-mc em.x-btn-split,.x-toolbar .x-btn-pressed .x-btn-mc em.x-btn-split + { + background-image: url(../images/default/button/s-arrow-o.gif); +} + +.x-toolbar .x-btn-mc em.x-btn-split-bottom { + background-image: url(../images/default/button/s-arrow-b-noline.gif); +} + +.x-toolbar .x-btn-over .x-btn-mc em.x-btn-split-bottom,.x-toolbar .x-btn-click .x-btn-mc em.x-btn-split-bottom,.x-toolbar .x-btn-menu-active .x-btn-mc em.x-btn-split-bottom,.x-toolbar .x-btn-pressed .x-btn-mc em.x-btn-split-bottom + { + background-image: url(../images/default/button/s-arrow-bo.gif); +} + +.x-toolbar .xtb-sep { + background-image: url(../images/default/grid/grid-blue-split.gif); +} + +.x-tbar-page-first { + background-image: url(../images/default/grid/page-first.gif) !important; +} + +.x-tbar-refresh { + background-image: url(../images/default/grid/refresh.gif) !important; +} + +.x-tbar-page-last { + background-image: url(../images/default/grid/page-last.gif) !important; +} + +.x-tbar-page-next { + background-image: url(../images/default/grid/page-next.gif) !important; +} + +.x-tbar-page-prev { + background-image: url(../images/default/grid/page-prev.gif) !important; +} + +.x-tbar-loading { + background-image: url(../images/default/grid/loading.gif) !important; +} + +.x-item-disabled .x-tbar-page-first { + background-image: url(../images/default/grid/page-first-disabled.gif) !important; +} + +.x-item-disabled .x-tbar-page-last { + background-image: url(../images/default/grid/page-last-disabled.gif) !important; +} + +.x-item-disabled .x-tbar-page-next { + background-image: url(../images/default/grid/page-next-disabled.gif) !important; +} + +.x-item-disabled .x-tbar-page-prev { + background-image: url(../images/default/grid/page-prev-disabled.gif) !important; +} + +.x-paging-info { + color: #444; +} + +.x-toolbar-more-icon { + background-image: url(../images/default/toolbar/more.gif) !important; +}.x-resizable-handle { + background-color:#fff; +} +.x-resizable-over .x-resizable-handle-east, .x-resizable-pinned .x-resizable-handle-east, +.x-resizable-over .x-resizable-handle-west, .x-resizable-pinned .x-resizable-handle-west +{ + background-image:url(../images/default/sizer/e-handle.gif); +} +.x-resizable-over .x-resizable-handle-south, .x-resizable-pinned .x-resizable-handle-south, +.x-resizable-over .x-resizable-handle-north, .x-resizable-pinned .x-resizable-handle-north +{ + background-image:url(../images/default/sizer/s-handle.gif); +} +.x-resizable-over .x-resizable-handle-north, .x-resizable-pinned .x-resizable-handle-north{ + background-image:url(../images/default/sizer/s-handle.gif); +} +.x-resizable-over .x-resizable-handle-southeast, .x-resizable-pinned .x-resizable-handle-southeast{ + background-image:url(../images/default/sizer/se-handle.gif); +} +.x-resizable-over .x-resizable-handle-northwest, .x-resizable-pinned .x-resizable-handle-northwest{ + background-image:url(../images/default/sizer/nw-handle.gif); +} +.x-resizable-over .x-resizable-handle-northeast, .x-resizable-pinned .x-resizable-handle-northeast{ + background-image:url(../images/default/sizer/ne-handle.gif); +} +.x-resizable-over .x-resizable-handle-southwest, .x-resizable-pinned .x-resizable-handle-southwest{ + background-image:url(../images/default/sizer/sw-handle.gif); +} +.x-resizable-proxy{ + border-color:#3b5a82; +} +.x-resizable-overlay{ + background-color:#fff; +} +.x-grid3 { + background-color: #fff; +} + +.x-grid-panel .x-panel-mc .x-panel-body { + border-color: #99bbe8; +} + +.x-grid3-hd-row .x-grid3-hd,.x-grid3-row .x-grid3-cell,.x-grid3-summary-row .x-grid3-cell { + font: normal 11px arial, tahoma, helvetica, sans-serif; +} + +.x-grid3-hd-row .x-grid3-hd { + border-left-color: #eee; + border-right-color: #d0d0d0; +} + +.x-grid-row-loading { + background-color: #fff; + background-image: url(../images/default/shared/loading-balls.gif); +} + +.x-grid3-row { + border-color: #ededed; + border-top-color: #fff; +} + +.x-grid3-row-alt { + background-color: #fafafa; +} + +.x-grid3-row-over { + border-color: #ddd; + background-color: #efefef; + background-image: url(../images/default/grid/row-over.gif); +} + +.x-grid3-resize-proxy { + background-color: #777; +} + +.x-grid3-resize-marker { + background-color: #777; +} + +.x-grid3-header { + background-color: #f9f9f9; + background-image: url(../images/default/grid/grid3-hrow.gif); +} + +.x-grid3-header-pop { + border-left-color: #d0d0d0; +} + +.x-grid3-header-pop-inner { + border-left-color: #eee; + background-image: url(../images/default/grid/hd-pop.gif); +} + +td.x-grid3-hd-over,td.sort-desc,td.sort-asc,td.x-grid3-hd-menu-open { + border-left-color: #aaccf6; + border-right-color: #aaccf6; +} + +td.x-grid3-hd-over .x-grid3-hd-inner,td.sort-desc .x-grid3-hd-inner,td.sort-asc .x-grid3-hd-inner,td.x-grid3-hd-menu-open .x-grid3-hd-inner + { + background-color: #ebf3fd; + background-image: url(../images/default/grid/grid3-hrow-over.gif); +} + +.sort-asc .x-grid3-sort-icon { + background-image: url(../images/default/grid/sort_asc.gif); +} + +.sort-desc .x-grid3-sort-icon { + background-image: url(../images/default/grid/sort_desc.gif); +} + +.x-grid3-cell-text,.x-grid3-hd-text { + color: #000; +} + +.x-grid3-split { + background-image: url(../images/default/grid/grid-split.gif); +} + +.x-grid3-hd-text { + color: #15428b; +} + +.x-dd-drag-proxy .x-grid3-hd-inner { + background-color: #ebf3fd; + background-image: url(../images/default/grid/grid3-hrow-over.gif); + border-color: #aaccf6; +} + +.col-move-top { + background-image: url(../images/default/grid/col-move-top.gif); +} + +.col-move-bottom { + background-image: url(../images/default/grid/col-move-bottom.gif); +} + +.x-grid3-highlightrow { + border: 1px dotted #545352; +} + +.x-grid3-row-selected { + background-image: none !important; + background-color: #dfe8f6 !important; + border-color: #a3bae9; +} + +.x-grid3-cell-selected { + background-color: #b8cfee !important; + color: #000; +} + +.x-grid3-group-selected { + background-color: #b8cfee !important; +} + +.x-grid3-cell-selected span { + color: #000 !important; +} + +.x-grid3-cell-selected .x-grid3-cell-text { + color: #000; +} + +.x-grid3-locked td.x-grid3-row-marker,.x-grid3-locked .x-grid3-row-selected td.x-grid3-row-marker { + background-color: #ebeadb !important; + background-image: url(../images/default/grid/grid-hrow.gif) !important; + color: #000; + border-top-color: #fff; + border-right-color: #6fa0df !important; +} + +.x-grid3-locked td.x-grid3-row-marker div,.x-grid3-locked .x-grid3-row-selected td.x-grid3-row-marker div { + color: #15428b !important; +} + +.x-grid3-dirty-cell { + background-image: url(../images/default/grid/dirty.gif); +} + +.x-grid3-invalid-cell { + background-image: url(../images/default/grid/invalid_line.gif); +} + +.x-grid3-topbar,.x-grid3-bottombar { + font: normal 11px arial, tahoma, helvetica, sans-serif; +} + +.x-grid3-bottombar .x-toolbar { + border-top-color: #a9bfd3; +} + +.x-props-grid .x-grid3-td-name .x-grid3-cell-inner { + background-image: url(../images/default/grid/grid3-special-col-bg.gif) !important; + color: #000 !important; +} + +.x-props-grid .x-grid3-body .x-grid3-td-name { + background-color: #fff !important; + border-right-color: #eee; +} + +.xg-hmenu-sort-asc .x-menu-item-icon { + background-image: url(../images/default/grid/hmenu-asc.gif); +} + +.xg-hmenu-sort-desc .x-menu-item-icon { + background-image: url(../images/default/grid/hmenu-desc.gif); +} + +.xg-hmenu-lock .x-menu-item-icon { + background-image: url(../images/default/grid/hmenu-lock.gif); +} + +.xg-hmenu-unlock .x-menu-item-icon { + background-image: url(../images/default/grid/hmenu-unlock.gif); +} + +.x-grid3-hd-btn { + background-color: #c3daf9; + background-image: url(../images/default/grid/grid3-hd-btn.gif); +} + +.x-grid3-body .x-grid3-td-expander { + background-image: url(../images/default/grid/grid3-special-col-bg.gif); +} + +.x-grid3-row-expander { + background-image: url(../images/default/grid/row-expand-sprite.gif); +} + +.x-grid3-body .x-grid3-td-checker { + background-image: url(../images/default/grid/grid3-special-col-bg.gif); +} + +.x-grid3-row-checker,.x-grid3-hd-checker { + background-image: url(../images/default/grid/row-check-sprite.gif); +} + +.x-grid3-body .x-grid3-td-numberer { + background-image: url(../images/default/grid/grid3-special-col-bg.gif); +} + +.x-grid3-body .x-grid3-td-numberer .x-grid3-cell-inner { + color: #444; +} + +.x-grid3-body .x-grid3-td-row-icon { + background-image: url(../images/default/grid/grid3-special-col-bg.gif); +} + +.x-grid3-body .x-grid3-row-selected .x-grid3-td-numberer,.x-grid3-body .x-grid3-row-selected .x-grid3-td-checker,.x-grid3-body .x-grid3-row-selected .x-grid3-td-expander + { + background-image: url(../images/default/grid/grid3-special-col-sel-bg.gif); +} + +.x-grid3-check-col { + background-image: url(../images/default/menu/unchecked.gif); +} + +.x-grid3-check-col-on { + background-image: url(../images/default/menu/checked.gif); +} + +.x-grid-group,.x-grid-group-body,.x-grid-group-hd { + zoom: 1; +} + +.x-grid-group-hd { + border-bottom-color: #99bbe8; +} + +.x-grid-group-hd .x-grid-group-div { + background-image: url(../images/default/grid/group-expand-sprite.gif); + color: #3764a0; + font: bold 11px tahoma, arial, helvetica, sans-serif; +} + +.x-group-by-icon { + background-image: url(../images/default/grid/group-by.gif); +} + +.x-cols-icon { + background-image: url(../images/default/grid/columns.gif); +} + +.x-show-groups-icon { + background-image: url(../images/default/grid/group-by.gif); +} + +.x-grid-empty { + color: gray; + font: normal 11px tahoma, arial, helvetica, sans-serif; +} + +.x-grid-with-col-lines .x-grid3-row td.x-grid3-cell { + border-right-color: #ededed; +} + +.x-grid-with-col-lines .x-grid3-row-selected { + border-top-color: #a3bae9; +} + +.x-grid3-check-col-disabled { + background-color: transparent; + background-image: url(../images/gxt/menu/disabledcheck.gif); +} + +.x-row-editor-header { + background: transparent url(../images/gxt/grid/row-editor-bg.gif) repeat-x 0 0; +} + +.x-row-editor-footer { + background: transparent url(../images/gxt/grid/row-editor-bg.gif) repeat-x 0 -2px; +} + +.x-row-editor-body { + background: #ebf2fb; +} + +.x-row-editor .x-btns { + background: transparent url(../images/gxt/grid/row-editor-btns.gif) no-repeat 0 0; +} + +.x-row-editor .x-btns .x-plain-bwrap { + background: transparent url(../images/gxt/grid/row-editor-btns.gif) no-repeat right -31px; +} + +.x-row-editor .x-btns .x-plain-body { + background: transparent url(../images/gxt/grid/row-editor-btns.gif) repeat-x 0 -62px; +} + +.x-inserted-row { + background-color: #f7f9cc +}.x-dd-drag-ghost{ + color:#000; + font: normal 11px arial, helvetica, sans-serif; + border-color: #ddd #bbb #bbb #ddd; + background-color:#fff; +} +.x-dd-drop-nodrop .x-dd-drop-icon{ + background-image: url(../images/default/dd/drop-no.gif); +} +.x-dd-drop-ok .x-dd-drop-icon{ + background-image: url(../images/default/dd/drop-yes.gif); +} +.x-dd-drop-ok-add .x-dd-drop-icon{ + background-image: url(../images/default/dd/drop-add.gif); +} +.x-view-selector { + background-color:#c3daf9; + border-color:#3399bb; +} +.x-tree-drop-ok-append .x-dd-drop-icon { + background-image: url(../images/default/tree/drop-add.gif); +} + +.x-tree-drop-ok-above .x-dd-drop-icon { + background-image: url(../images/default/tree/drop-over.gif); +} + +.x-tree-drop-ok-below .x-dd-drop-icon { + background-image: url(../images/default/tree/drop-under.gif); +} + +.x-tree-drop-ok-between .x-dd-drop-icon { + background-image: url(../images/default/tree/drop-between.gif); +} + +.x-tree3-loading { + background-image: url(../images/default/tree/loading.gif); +} + +.x-tree3-node-text { + font: normal 11px arial, tahoma, helvetica, sans-serif; + color: black; +}.x-date-picker { + border-color: #1b376c; + background-color:#fff; +} +.x-date-middle,.x-date-left,.x-date-right { + background-image: url(../images/default/shared/hd-sprite.gif); + color:#fff; + font:bold 11px "sans serif", tahoma, verdana, helvetica; +} +.x-date-middle .x-btn .x-btn-text { + color:#fff; +} +.x-date-middle .x-btn-mc em.x-btn-arrow { + background-image:url(../images/default/toolbar/btn-arrow-light.gif); +} +.x-date-right a { + background-image: url(../images/default/shared/right-btn.gif); +} +.x-date-left a{ + background-image: url(../images/default/shared/left-btn.gif); +} +.x-date-inner th { + background-color:#dfecfb; + background-image:url(../images/default/shared/glass-bg.gif); + border-bottom-color:#a3bad9; + font:normal 10px arial, helvetica,tahoma,sans-serif; + color:#233d6d; +} +.x-date-inner td { + border-color:#fff; +} +.x-date-inner a { + font:normal 11px arial, helvetica,tahoma,sans-serif; + color:#000; +} +.x-date-inner .x-date-active{ + color:#000; +} +.x-date-inner .x-date-selected a{ + background-color:#dfecfb; + background-image:url(../images/default/shared/glass-bg.gif); + border-color:#8db2e3; +} +.x-date-inner .x-date-today a{ + border-color:darkred; +} +.x-date-inner .x-date-selected span{ + font-weight:bold; +} +.x-date-inner .x-date-prevday a,.x-date-inner .x-date-nextday a { + color:#aaa; +} +.x-date-bottom { + border-top-color:#a3bad9; + background-color:#dfecfb; + background-image:url(../images/default/shared/glass-bg.gif); +} +.x-date-inner .x-date-disabled a { + background-color:#eee; + color:#bbb; +} +.x-date-mmenu{ + background-color:#eee !important; +} +.x-date-mmenu .x-menu-item { + font-size:10px; + color:#000; +} +.x-date-mp { + background-color:#fff; +} +.x-date-mp td { + font:normal 11px arial, helvetica,tahoma,sans-serif; +} +.x-date-mp-btns button { + background-color:#083772; + color:#fff; + border-color: #3366cc #000055 #000055 #3366cc; + font:normal 11px arial, helvetica,tahoma,sans-serif; +} +.x-date-mp-btns { + background-color: #dfecfb; + background-image: url(../images/default/shared/glass-bg.gif); +} +.x-date-mp-btns td { + border-top-color: #c5d2df; +} +td.x-date-mp-month a,td.x-date-mp-year a { + color:#15428b; +} +td.x-date-mp-sel a { + background-color: #dfecfb; + background-image: url(../images/default/shared/glass-bg.gif); + border-color:#8db2e3; +} +.x-date-mp-ybtn a { + background-image:url(../images/default/panel/tool-sprites.gif); +} +td.x-date-mp-sep { + border-right-color:#c5d2df; +} +.x-tip .x-tip-close{ + background-image: url(../images/default/qtip/close.gif); +} +.x-tip .x-tip-tc, .x-tip .x-tip-tl, .x-tip .x-tip-tr, .x-tip .x-tip-bc, .x-tip .x-tip-bl, .x-tip .x-tip-br, .x-tip .x-tip-ml, .x-tip .x-tip-mr { + background-image: url(../images/default/qtip/tip-sprite.gif); +} +.x-tip .x-tip-mc { + font: normal 11px tahoma,arial,helvetica,sans-serif; +} +.x-tip .x-tip-ml { + background-color: #fff; +} +.x-tip .x-tip-header-text { + font: bold 11px tahoma,arial,helvetica,sans-serif; + color:#444; +} +.x-tip .x-tip-body { + font: normal 11px tahoma,arial,helvetica,sans-serif; + color:#444; +} +.x-form-invalid-tip .x-tip-tc, .x-form-invalid-tip .x-tip-tl, .x-form-invalid-tip .x-tip-tr, .x-form-invalid-tip .x-tip-bc, +.x-form-invalid-tip .x-tip-bl, .x-form-invalid-tip .x-tip-br, .x-form-invalid-tip .x-tip-ml, .x-form-invalid-tip .x-tip-mr +{ + background-image: url(../images/default/form/error-tip-corners.gif); +} +.x-form-invalid-tip .x-tip-body { + background-image:url(../images/default/form/exclamation.gif); +} +.x-tip-anchor { + background-image:url(../images/default/qtip/tip-anchor-sprite.gif); +} +.x-menu { + border-color:#718bb7; + background-color:#f0f0f0; + background-image:url(../images/default/menu/menu.gif); +} +.x-menu-nosep { + background-image:none; +} +.x-menu-list-item{ + font:normal 11px tahoma,arial, sans-serif; +} +.x-menu-item-arrow{ + background-image:url(../images/default/menu/menu-parent.gif); +} +.x-menu-sep { + background-color:#e0e0e0; + border-bottom-color:#fff; +} +a.x-menu-item { + color:#222; +} +.x-menu-item-active { + background:#ebf3fd url(../images/default/menu/item-over.gif) repeat-x left bottom; + border:1px solid #aaccf6; + padding:0; +} +.x-menu-item-active a.x-menu-item { + color:#233d6d; +} + +.x-menu-plain { + background-color:#fff !important; +} +.x-menu .x-date-picker{ + border-color:#a3bad9; +} +.x-cycle-menu .x-menu-item-checked { + border-color:#a3bae9 !important; + background-color:#def8f6; +} +.x-menu-scroller-top { + background-image:url(../images/default/layout/mini-top.gif); +} +.x-menu-scroller-bottom { + background-image:url(../images/default/layout/mini-bottom.gif); +} + +.x-menu-scroller{ + border-width: 1px 0; +} +.x-box-tl { + background-image: url(../images/default/box/corners.gif); +} +.x-box-tc { + background-image: url(../images/default/box/tb.gif); +} +.x-box-tr { + background-image: url(../images/default/box/corners.gif); +} +.x-box-ml { + background-image: url(../images/default/box/l.gif); +} +.x-box-mc { + background-color: #eee; + background-image: url(../images/default/box/tb.gif); + font-family: "Myriad Pro","Myriad Web","Tahoma","Helvetica","Arial",sans-serif; + color: #393939; + font-size: 12px; +} +.x-box-mc h3 { + font-size: 14px; + font-weight: bold; +} +.x-box-mr { + background-image: url(../images/default/box/r.gif); +} +.x-box-bl { + background-image: url(../images/default/box/corners.gif); +} +.x-box-bc { + background-image: url(../images/default/box/tb.gif); +} +.x-box-br { + background-image: url(../images/default/box/corners.gif); +} +.x-box-blue .x-box-bl, .x-box-blue .x-box-br, .x-box-blue .x-box-tl, .x-box-blue .x-box-tr { + background-image: url(../images/default/box/corners-blue.gif); +} +.x-box-blue .x-box-bc, .x-box-blue .x-box-mc, .x-box-blue .x-box-tc { + background-image: url(../images/default/box/tb-blue.gif); +} +.x-box-blue .x-box-mc { + background-color: #c3daf9; +} +.x-box-blue .x-box-mc h3 { + color: #17385b; +} +.x-box-blue .x-box-ml { + background-image: url(../images/default/box/l-blue.gif); +} +.x-box-blue .x-box-mr { + background-image: url(../images/default/box/r-blue.gif); +} +.x-combo-list { + border-color:#98c0f4; + background-color:#ddecfe; + font:normal 12px tahoma, arial, helvetica, sans-serif; +} +.x-combo-list-inner { + background-color:#fff; +} +.x-combo-list-hd { + font:bold 11px tahoma, arial, helvetica, sans-serif; + color:#15428b; + background-image: url(../images/default/layout/panel-title-light-bg.gif); + border-bottom-color:#98c0f4; +} +.x-resizable-pinned .x-combo-list-inner { + border-bottom-color:#98c0f4; +} +.x-combo-list-item { + border-color:#fff; +} +.x-combo-list .x-combo-selected{ + border-color:#a3bae9 !important; + background-color:#dfe8f6; +} +.x-combo-list .x-toolbar { + border-top-color:#98c0f4; +} +.x-combo-list-small { + font:normal 11px tahoma, arial, helvetica, sans-serif; +} +.x-panel { + border-color: #99bbe8; +} +.x-panel-header { + color:#15428b; + font-weight:bold; + font-size: 11px; + font-family: tahoma,arial,verdana,sans-serif; + border-color:#99bbe8; + background-image: url(../images/default/panel/white-top-bottom.gif); +} +.x-panel-body { + border-color:#99bbe8; + background-color:#fff; +} +.x-panel-bbar .x-toolbar, .x-panel-tbar .x-toolbar { + border-color:#99bbe8; +} +.x-panel-tbar-noheader .x-toolbar, .x-panel-mc .x-panel-tbar .x-toolbar { + border-top-color:#99bbe8; +} +.x-panel-body-noheader, .x-panel-mc .x-panel-body { + border-top-color:#99bbe8; +} +.x-panel-tl .x-panel-header { + color:#15428b; + font-weight:bold; + font-size: 11px; + font-family: tahoma,arial,verdana,sans-serif; +} +.x-panel-tc { + background-image: url(../images/default/panel/top-bottom.gif); +} +.x-panel-tl, .x-panel-tr, .x-panel-bl, .x-panel-br{ + background-image: url(../images/default/panel/corners-sprite.gif); + border-bottom-color:#99bbe8; +} +.x-panel-bc { + background-image: url(../images/default/panel/top-bottom.gif); +} +.x-panel-mc { + font: normal 11px tahoma,arial,helvetica,sans-serif; + background-color:#dfe8f6; +} +.x-panel-ml { + background-color: #fff; + background-image:url(../images/default/panel/left-right.gif); +} +.x-panel-mr { + background-image: url(../images/default/panel/left-right.gif); +} +.x-tool { + background-image:url(../images/default/panel/tool-sprites.gif); +} +.x-panel-ghost { + background-color:#cbddf3; +} +.x-panel-ghost ul { + border-color:#99bbe8; +} +.x-panel-dd-spacer { + border-color:#99bbe8; +} +.x-panel-fbar td,.x-panel-fbar span,.x-panel-fbar input,.x-panel-fbar div,.x-panel-fbar select,.x-panel-fbar label{ + font:normal 11px arial,tahoma, helvetica, sans-serif; +} +.x-window-proxy { + background-color:#c7dffc; + border-color:#99bbe8; +} +.x-window-tl .x-window-header { + color:#15428b; + font:bold 11px tahoma,arial,verdana,sans-serif; +} +.x-window-tc { + background-image: url(../images/default/window/top-bottom.png); +} +.x-window-tl { + background-image: url(../images/default/window/left-corners.png); +} +.x-window-tr { + background-image: url(../images/default/window/right-corners.png); +} +.x-window-bc { + background-image: url(../images/default/window/top-bottom.png); +} +.x-window-bl { + background-image: url(../images/default/window/left-corners.png); +} +.x-window-br { + background-image: url(../images/default/window/right-corners.png); +} +.x-window-mc { + border-color:#99bbe8; + font: normal 11px tahoma,arial,helvetica,sans-serif; + background-color:#dfe8f6; +} +.x-window-ml { + background-image: url(../images/default/window/left-right.png); +} +.x-window-mr { + background-image: url(../images/default/window/left-right.png); +} +.x-window-maximized .x-window-tc { + background-color:#fff; +} +.x-window-bbar .x-toolbar { + border-top-color:#99bbe8; +} +.x-panel-ghost .x-window-tl { + border-bottom-color:#99bbe8; +} +.x-panel-collapsed .x-window-tl { + border-bottom-color:#84a0c4; +} +.x-dlg-mask{ + background-color:#ccc; +} +.x-window-plain .x-window-mc { + background-color: #ccd9e8; + border-color: #a3bae9 #dfe8f6 #dfe8f6 #a3bae9; +} +.ext-ie .x-window-plain .x-window-mc { + background-color: #c9d5e4; +} +.x-window-plain .x-window-body { + border-color: #dfe8f6 #a3bae9 #a3bae9 #dfe8f6; +} +body.x-body-masked .x-window-plain .x-window-mc { + background-color: #ccd9e8; +} +.x-html-editor-wrap { + border-color:#a9bfd3; + background-color:#fff; +} + +.x-html-editor-tb .x-edit-bold, .x-menu-item .x-edit-bold { + background-position:0 0; + background-image:url(../images/default/editor/tb-sprite.gif); +} + +.x-html-editor-tb .x-edit-italic, .x-menu-item .x-edit-italic { + background-position:-16px 0; + background-image:url(../images/default/editor/tb-sprite.gif); +} + +.x-html-editor-tb .x-edit-underline, .x-menu-item .x-edit-underline { + background-position:-32px 0; + background-image:url(../images/default/editor/tb-sprite.gif); +} + +.x-html-editor-tb .x-edit-forecolor, .x-menu-item .x-edit-forecolor { + background-position:-160px 0; + background-image:url(../images/default/editor/tb-sprite.gif); +} + +.x-html-editor-tb .x-edit-backcolor, .x-menu-item .x-edit-backcolor { + background-position:-176px 0; + background-image:url(../images/default/editor/tb-sprite.gif); +} + +.x-html-editor-tb .x-edit-justifyleft, .x-menu-item .x-edit-justifyleft { + background-position:-112px 0; + background-image:url(../images/default/editor/tb-sprite.gif); +} + +.x-html-editor-tb .x-edit-justifycenter, .x-menu-item .x-edit-justifycenter { + background-position:-128px 0; + background-image:url(../images/default/editor/tb-sprite.gif); +} + +.x-html-editor-tb .x-edit-justifyright, .x-menu-item .x-edit-justifyright { + background-position:-144px 0; + background-image:url(../images/default/editor/tb-sprite.gif); +} + +.x-html-editor-tb .x-edit-insertorderedlist, .x-menu-item .x-edit-insertorderedlist { + background-position:-80px 0; + background-image:url(../images/default/editor/tb-sprite.gif); +} + +.x-html-editor-tb .x-edit-insertunorderedlist, .x-menu-item .x-edit-insertunorderedlist { + background-position:-96px 0; + background-image:url(../images/default/editor/tb-sprite.gif); +} + +.x-html-editor-tb .x-edit-increasefontsize, .x-menu-item .x-edit-increasefontsize { + background-position:-48px 0; + background-image:url(../images/default/editor/tb-sprite.gif); +} + +.x-html-editor-tb .x-edit-decreasefontsize, .x-menu-item .x-edit-decreasefontsize { + background-position:-64px 0; + background-image:url(../images/default/editor/tb-sprite.gif); +} + +.x-html-editor-tb .x-edit-sourceedit, .x-menu-item .x-edit-sourceedit { + background-position:-192px 0; + background-image:url(../images/default/editor/tb-sprite.gif); +} + +.x-html-editor-tb .x-edit-createlink, .x-menu-item .x-edit-createlink { + background-position:-208px 0; + background-image:url(../images/default/editor/tb-sprite.gif); +}.x-panel-noborder .x-panel-header-noborder { + border-bottom-color:#99bbe8; +} +.x-panel-noborder .x-panel-tbar-noborder .x-toolbar { + border-bottom-color:#99bbe8; +} +.x-panel-noborder .x-panel-bbar-noborder .x-toolbar { + border-top-color:#99bbe8; +} +.x-tab-panel-bbar-noborder .x-toolbar { + border-top-color:#99bbe8; +} +.x-tab-panel-tbar-noborder .x-toolbar { + border-bottom-color:#99bbe8; +} +.x-border-layout-ct { + background-color:#dfe8f6; +} +.x-accordion-hd { + color:#222; + font-weight:normal; + background-image: url(../images/default/panel/light-hd.gif); +} +.x-layout-collapsed{ + background-color:#d2e0f2; + border-color:#98c0f4; +} +.x-layout-collapsed-over{ + background-color:#d9e8fb; +} +.x-layout-split-west .x-layout-mini { + background-image:url(../images/default/layout/mini-left.gif); +} +.x-layout-split-east .x-layout-mini { + background-image:url(../images/default/layout/mini-right.gif); +} +.x-layout-split-north .x-layout-mini { + background-image:url(../images/default/layout/mini-top.gif); +} +.x-layout-split-south .x-layout-mini { + background-image:url(../images/default/layout/mini-bottom.gif); +} +.x-layout-cmini-west .x-layout-mini { + background-image:url(../images/default/layout/mini-right.gif); +} +.x-layout-cmini-east .x-layout-mini { + background-image:url(../images/default/layout/mini-left.gif); +} +.x-layout-cmini-north .x-layout-mini { + background-image:url(../images/default/layout/mini-bottom.gif); +} +.x-layout-cmini-south .x-layout-mini { + background-image:url(../images/default/layout/mini-top.gif); +} +.x-progress-wrap { + border-color:#6593cf; +} +.x-progress-inner { + background-color:#e0e8f3; + background-image:url(../images/default/qtip/bg.gif); +} +.x-progress-bar { + background-color:#9cbfee; + background-image:url(../images/default/progress/progress-bg.gif); + border-top-color:#d1e4fd; + border-bottom-color:#7fa9e4; + border-right-color:#7fa9e4; +} +.x-progress-text { + font-size:11px; + font-weight:bold; + color:#fff; +} +.x-progress-text-back { + color:#396095; +} +.x-slider-horz, .x-slider-horz .x-slider-end, .x-slider-horz .x-slider-inner { + background-image:url(../images/default/slider/slider-bg.png); +} +.x-slider-horz .x-slider-thumb { + background-image:url(../images/default/slider/slider-thumb.png); +} +.x-slider-vert, .x-slider-vert .x-slider-end, .x-slider-vert .x-slider-inner { + background-image:url(../images/default/slider/slider-v-bg.png); +} +.x-slider-vert .x-slider-thumb { + background-image:url(../images/default/slider/slider-v-thumb.png); +} +.x-window-dlg .ext-mb-text, +.x-window-dlg .x-window-header-text { + font-size:12px; +} +.x-window-dlg .ext-mb-textarea { + font:normal 12px tahoma,arial,helvetica,sans-serif; +} +.x-window-dlg .x-msg-box-wait { + background-image:url(../images/default/grid/loading.gif); +} +.x-window-dlg .ext-mb-info { + background-image:url(../images/default/window/icon-info.gif); +} +.x-window-dlg .ext-mb-warning { + background-image:url(../images/default/window/icon-warning.gif); +} +.x-window-dlg .ext-mb-question { + background-image:url(../images/default/window/icon-question.gif); +} +.x-window-dlg .ext-mb-error { + background-image:url(../images/default/window/icon-error.gif); +} diff --git a/src/main/webapp/gxt/css/gxt-gray.css b/src/main/webapp/gxt/css/gxt-gray.css new file mode 100644 index 0000000..bc31336 --- /dev/null +++ b/src/main/webapp/gxt/css/gxt-gray.css @@ -0,0 +1,493 @@ +.x-panel { + border-style: solid; + border-color: #d0d0d0; +} +.x-panel-header { + color:#333; + border:1px solid #d0d0d0; + background-image:url(../images/gray/panel/white-top-bottom.gif); +} + +.x-panel-body { + border-color:#d0d0d0; +} + +.x-panel-bbar .x-toolbar { + border-color:#d0d0d0; +} + +.x-panel-tbar .x-toolbar { + border-color:#d0d0d0; +} + +.x-panel-tbar-noheader .x-toolbar, .x-panel-mc .x-panel-tbar .x-toolbar { + border-color:#d0d0d0; +} +.x-panel-body-noheader, .x-panel-mc .x-panel-body { + border-color:#d0d0d0; +} +.x-panel-tl .x-panel-header { + color:#333; +} +.x-panel-tc { + background-image:url(../images/gray/panel/top-bottom.gif); +} +.x-panel-tl { + background-image:url(../images/gray/panel/corners-sprite.gif); + border-color:#d0d0d0; +} +.x-panel-tr { + background-image:url(../images/gray/panel/corners-sprite.gif); +} +.x-panel-bc { + background-image:url(../images/gray/panel/top-bottom.gif); +} +.x-panel-bl { + background-image:url(../images/gray/panel/corners-sprite.gif); +} +.x-panel-br { + background-image:url(../images/gray/panel/corners-sprite.gif); +} +.x-panel-mc { + background:#f1f1f1; +} +.x-panel-mc .x-panel-body { + background:transparent; + border: 0 none; +} +.x-panel-ml { + background-image:url(../images/gray/panel/left-right.gif); +} +.x-panel-mr { + background-image:url(../images/gray/panel/left-right.gif); +} + +/* Tools */ +.x-tool { + background-image:url(../images/gray/panel/tool-sprites.gif); +} + +/* Ghosting */ +.x-panel-ghost { + background:#e0e0e0; +} + +.x-panel-ghost ul { + border-color:#b0b0b0; +} + +.x-grid-panel .x-panel-mc .x-panel-body { + border:1px solid #d0d0d0; +} + +/* Buttons */ + +.x-btn-left{ + background-image:url(../images/gray/button/btn-sprite.gif); +} +.x-btn-right{ + background-image:url(../images/gray/button/btn-sprite.gif); +} +.x-btn-center{ + background-image:url(../images/gray/button/btn-sprite.gif); +} + +.x-btn-group-header { + color: #333333; +} +.x-btn-group-tc { + background-image: url(../images/gray/button/group-tb.gif); +} +.x-btn-group-tl { + background-image: url(../images/gray/button/group-cs.gif); +} +.x-btn-group-tr { + background-image: url(../images/gray/button/group-cs.gif); +} +.x-btn-group-bc { + background-image: url(../images/gray/button/group-tb.gif); +} +.x-btn-group-bl { + background-image: url(../images/gray/button/group-cs.gif); +} +.x-btn-group-br { + background-image: url(../images/gray/button/group-cs.gif); +} +.x-btn-group-ml { + background-image: url(../images/gray/button/group-lr.gif); +} +.x-btn-group-mr { + background-image: url(../images/gray/button/group-lr.gif); +} +.x-btn-group-notitle .x-btn-group-tc { + background-image: url(../images/gray/button/group-tb.gif); +} + +/* Layout classes */ + +.x-border-layout-ct { + background:#f0f0f0; +} + +.x-accordion-hd { + background-image:url(../images/gray/panel/light-hd.gif); +} + +.x-layout-collapsed{ + background-color:#eee; + border-color:#e0e0e0; +} +.x-layout-collapsed-over{ + background-color:#fbfbfb; +} + + +/* qtips */ +.x-tip .x-tip-top { + background-image:url(../images/gray/qtip/tip-sprite.gif); +} +.x-tip .x-tip-top-left { + background-image:url(../images/gray/qtip/tip-sprite.gif); +} +.x-tip .x-tip-top-right { + background-image:url(../images/gray/qtip/tip-sprite.gif); +} +.x-tip .x-tip-ft { + background-image:url(../images/gray/qtip/tip-sprite.gif); +} +.x-tip .x-tip-ft-left { + background-image:url(../images/gray/qtip/tip-sprite.gif); +} +.x-tip .x-tip-ft-right { + background-image:url(../images/gray/qtip/tip-sprite.gif); +} +.x-tip .x-tip-bd-left { + background-image:url(../images/gray/qtip/tip-sprite.gif); +} +.x-tip .x-tip-bd-right { + background-image:url(../images/gray/qtip/tip-sprite.gif); +} + +/* Toolbars */ + +.x-toolbar{ + border-color:#d0d0d0; + background:#f0f4f5 url(../images/gray/toolbar/bg.gif) repeat-x top left; +} +.x-toolbar button { + color:#444; +} +.x-toolbar .x-btn-menu-arrow-wrap .x-btn-center button { + background-image:url(../images/gray/toolbar/btn-arrow.gif); +} +.x-toolbar .x-btn-text-icon .x-btn-menu-arrow-wrap .x-btn-center button { + background-image:url(../images/gray/toolbar/btn-arrow.gif); +} +.x-toolbar .x-btn-over .x-btn-left{ + background-image:url(../images/gray/toolbar/tb-btn-sprite.gif); +} +.x-toolbar .x-btn-over .x-btn-right{ + background-image:url(../images/gray/toolbar/tb-btn-sprite.gif); +} +.x-toolbar .x-btn-over .x-btn-center{ + background-image:url(../images/gray/toolbar/tb-btn-sprite.gif); +} +.x-toolbar .x-btn-over button { + color:#111; +} +.x-toolbar .x-btn-click .x-btn-left, .x-toolbar .x-btn-pressed .x-btn-left, .x-toolbar .x-btn-menu-active .x-btn-left{ + background-image:url(../images/gray/toolbar/tb-btn-sprite.gif); +} +.x-toolbar .x-btn-click .x-btn-right, .x-toolbar .x-btn-pressed .x-btn-right, .x-toolbar .x-btn-menu-active .x-btn-right{ + background-image:url(../images/gray/toolbar/tb-btn-sprite.gif); +} + +.x-toolbar .x-btn-click .x-btn-center, .x-toolbar .x-btn-pressed .x-btn-center, .x-toolbar .x-btn-menu-active .x-btn-center{ + background-image:url(../images/gray/toolbar/tb-btn-sprite.gif); +} +.x-toolbar .xtb-sep { + background-image: url(../images/gray/grid/grid-split.gif); +} + +/* Tabs */ + +.x-tab-panel-header, .x-tab-panel-footer { + background: #EAEAEA; + border-color:#d0d0d0; +} + + +.x-tab-panel-header { + border-color:#d0d0d0; +} + +.x-tab-panel-footer { + border-color:#d0d0d0; +} + +ul.x-tab-strip-top{ + background:#dbdbdb url(../images/gray/tabs/tab-strip-bg.gif) repeat-x left top; + border-color:#d0d0d0; + padding-top: 2px; +} + +ul.x-tab-strip-bottom{ + background-image:url(../images/gray/tabs/tab-strip-btm-bg.gif); + border-color:#d0d0d0; +} + +.x-tab-strip span.x-tab-strip-text { + color:#333; +} +.x-tab-strip-over span.x-tab-strip-text { + color:#111; +} + +.x-tab-strip-active span.x-tab-strip-text { + color:#333; +} + +.x-tab-strip-disabled .x-tabs-text { + color:#aaaaaa; +} + +.x-tab-strip-top .x-tab-right { + background-image:url(../images/gray/tabs/tabs-sprite.gif); +} + +.x-tab-strip-top .x-tab-left { + background-image:url(../images/gray/tabs/tabs-sprite.gif); +} +.x-tab-strip-top .x-tab-strip-inner { + background-image:url(../images/gray/tabs/tabs-sprite.gif); +} + +.x-tab-strip-bottom .x-tab-right { + background-image:url(../images/gray/tabs/tab-btm-inactive-right-bg.gif); +} + +.x-tab-strip-bottom .x-tab-left { + background-image:url(../images/gray/tabs/tab-btm-inactive-left-bg.gif); +} + +.x-tab-strip-bottom .x-tab-strip-active .x-tab-right { + background-image:url(../images/gray/tabs/tab-btm-right-bg.gif); +} + +.x-tab-strip-bottom .x-tab-strip-active .x-tab-left { + background-image:url(../images/gray/tabs/tab-btm-left-bg.gif); +} + +.x-tab-strip .x-tab-strip-closable a.x-tab-strip-close { + background-image:url(../images/gray/tabs/tab-close.gif); +} +.x-tab-strip .x-tab-strip-closable a.x-tab-strip-close:hover{ + background-image:url(../images/gray/tabs/tab-close.gif); +} + +.x-tab-panel-body { + border-color:#d0d0d0; + background:#fff; +} +.x-tab-panel-bbar .x-toolbar { + border-color: #d0d0d0; +} + +.x-tab-panel-tbar .x-toolbar { + border-color: #d0d0d0; +} + +.x-tab-panel-header-plain .x-tab-strip-spacer { + border-color:#d0d0d0; + background: #eaeaea; +} + +.x-tab-scroller-left { + background-image: url(../images/gray/tabs/scroll-left.gif); + border-color:#aeaeae; +} +.x-tab-scroller-right { + background-image: url(../images/gray/tabs/scroll-right.gif); + border-color:#aeaeae; +} + +/* Window */ + +.x-window-proxy { + background:#e0e0e0; + border-color:#b0b0b0; +} + +.x-window-tl .x-window-header { + color:#555; +} +.x-window-tc { + background-image:url(../images/gray/window/top-bottom.png); +} +.x-window-tl { + background-image:url(../images/gray/window/left-corners.png); +} +.x-window-tr { + background-image:url(../images/gray/window/right-corners.png); +} +.x-window-bc { + background-image:url(../images/gray/window/top-bottom.png); +} +.x-window-bl { + background-image:url(../images/gray/window/left-corners.png); +} +.x-window-br { + background-image:url(../images/gray/window/right-corners.png); +} +.x-window-mc { + border:1px solid #d0d0d0; + background:#e8e8e8; +} +.ext-ie .x-window-plain .x-window-mc { + background-color: #e3e3e3; +} + +.x-window-ml { + background-image:url(../images/gray/window/left-right.png); +} +.x-window-mr { + background-image:url(../images/gray/window/left-right.png); +} +.x-panel-ghost .x-window-tl { + border-color:#d0d0d0; +} +.x-panel-collapsed .x-window-tl { + border-color:#d0d0d0; +} + +.x-window-plain .x-window-mc { + background: #e8e8e8; + border-right:1px solid #eee; + border-bottom:1px solid #eee; + border-top:1px solid #d0d0d0; + border-left:1px solid #d0d0d0; +} + +.x-window-plain .x-window-body { + border-left:1px solid #eee; + border-top:1px solid #eee; + border-bottom:1px solid #d0d0d0; + border-right:1px solid #d0d0d0; + background:transparent !important; +} + +body.x-body-masked .x-window-mc, body.x-body-masked .x-window-plain .x-window-mc { + background-color: #e4e4e4; +} + + +/* misc */ +.x-html-editor-wrap { + border-color:#d0d0d0; +} + +/* Borders go last for specificity */ +.x-panel-noborder .x-panel-body-noborder { + border-width:0; +} + +.x-panel-noborder .x-panel-header-noborder { + border-width:0; + border-bottom:1px solid #d0d0d0; +} + +.x-panel-noborder .x-panel-tbar-noborder .x-toolbar { + border-width:0; + border-bottom:1px solid #d0d0d0; +} + +.x-panel-noborder .x-panel-bbar-noborder .x-toolbar { + border-width:0; + border-top:1px solid #d0d0d0; +} + +.x-window-noborder .x-window-mc { + border-width:0; +} +.x-window-plain .x-window-body-noborder { + border-width:0; +} + +.x-tab-panel-noborder .x-tab-panel-body-noborder { + border-width:0; +} + +.x-tab-panel-noborder .x-tab-panel-header-noborder { + border-top-width:0; + border-left-width:0; + border-right-width:0; +} + +.x-tab-panel-noborder .x-tab-panel-footer-noborder { + border-bottom-width:0; + border-left-width:0; + border-right-width:0; +} + + +.x-tab-panel-bbar-noborder .x-toolbar { + border-width:0; + border-top:1px solid #d0d0d0; +} + +.x-tab-panel-tbar-noborder .x-toolbar { + border-width:0; + border-bottom:1px solid #d0d0d0; +} + +.x-spinner-field .x-form-spinner-up { + background-image: url('../images/gray/form/spinner.gif'); +} +.x-spinner-field .x-form-spinner-down { + background-image: url('../images/gray/form/spinner.gif'); +}.x-accordion-hd { + background-color: #e5e5e5; +}.x-border { + border: 1px solid #D0D0D0; +} + +.x-layout-popup { + background-color: #F0F0F0; + border: 1px solid #D0D0D0; +} + +.my-list { + border: 1px solid #D0D0D0; +} + +.x-view { + border:1px solid #D0D0D0; +} + +.x-menubar { + border-color: #D0D0D0; + background-color: #F0F0F0; + background-image: url(../images/gray/toolbar/bg.gif); +} + +.x-menubar-item-active { + background-color: #D9E8FB; +} + +.x-menubar-item-active { + background-color: #D9E8FB; +}.x-date-right-icon { + background-image: url(../images/default/shared/right-btn.gif); + margin-right: 2px; + text-decoration: none !important; +} + +.x-date-left-icon { + background-image: url(../images/default/shared/left-btn.gif); + margin-right: 2px; + text-decoration: none !important; +}.my-tbl { + border: 1px solid #C6C5C5; +}.my-treetbl { + border: 1px solid #C6C5C5; +} \ No newline at end of file diff --git a/src/main/webapp/gxt/desktop/css/desktop.css b/src/main/webapp/gxt/desktop/css/desktop.css new file mode 100644 index 0000000..0013ed9 --- /dev/null +++ b/src/main/webapp/gxt/desktop/css/desktop.css @@ -0,0 +1,638 @@ +/* + * Ext JS Library 2.1 + * Copyright(c) 2006-2008, Ext JS, LLC. + * licensing@extjs.com + * + * http://extjs.com/license + */ +html,body { + background: #3d71b8 url(../wallpapers/desktop.jpg) no-repeat left top; + font: normal 12px tahoma, arial, verdana, sans-serif; + margin: 0; + padding: 0; + border: 0 none; + overflow: hidden; + height: 100%; +} + +.start { + background-image: url( ../images/taskbar/black/startbutton-icon.gif ) !important; +} + +.bogus { + background-image: url( ../images/bogus.png ) !important; +} + +.logout { + background-image: url( ../images/logout.gif ) !important; +} + +.settings { + background-image: url( ../images/gears.gif ) !important; +} + +#dpanels { + width: 250px; + float: right; +} + +#dpanels .x-panel { + margin: 15px; +} + +#dpanels .x-date-picker { + border: 0 none; + border-top: 0 none; + background: transparent; +} + +#dpanels .x-date-picker td.x-date-active { + background: #ffffff; +} + +#dpanels .x-date-picker { + width: 100% !important; +} + +#x-desktop { + width: 100%; + height: 100%; + border: 0 none; + position: relative; + overflow: hidden; + zoom: 1; +} + +#ux-taskbar .x-btn { + float: left; + margin: 1px 0 0 1px; + position: relative; +} + +#ux-taskbar-start .x-btn { + float: left; + margin: 0; + position: relative; +} + +#ux-taskbar button { /* width: 150px; + overflow: hidden; */ + text-align: left; + color: #ffffff; +} + +#title-bar-wrapper { + height: 35px; +} + +#title-bar { + color: #225599; + padding: 9px 7px; + font: bold 16px tahoma, arial, verdana, sans-serif; + float: left; +} + +#x-logout { + float: right; + padding: 6px 7px; +} + +.x-btn-text-icon .x-btn-center .logout { + background-position: 0pt 3px; + background-repeat: no-repeat; + padding: 3px 0pt 3px 18px; +} + +#ux-taskbar { + background: transparent none; + height: 30px; + margin: 0; + padding: 0; + position: relative; + z-index: 12001; +} + +.x-btn-icon .ux-taskbutton-center .x-btn-text { + background-position: center; + background-repeat: no-repeat; + height: 16px; + width: 16px; + cursor: pointer; + white-space: nowrap; + padding: 0; +} + +.x-btn-icon .ux-taskbutton-center { + padding: 1px; +} + +.ux-startbutton-center .x-btn-text { + color: #000000 !important; + font-weight: bold; +} + +.ux-taskbutton-left,.ux-taskbutton-right { + font-size: 1px; + line-height: 1px; +} + +.ux-taskbutton-left { + width: 4px; + height: 28px; + background: url( ../images/taskbar/black/taskbutton.gif ) no-repeat 0 0; +} + +.ux-taskbutton-right { + width: 4px; + height: 28px; + background: url( ../images/taskbar/black/taskbutton.gif ) no-repeat 0 -28px; +} + +.ux-taskbutton-left i,.ux-taskbutton-right i { + display: block; + width: 4px; + overflow: hidden; + font-size: 1px; + line-height: 1px; +} + +.ux-taskbutton-center { + background: url( ../images/taskbar/black/taskbutton.gif ) repeat-x 0 -56px; + vertical-align: middle; + text-align: center; + padding: 0 5px; + cursor: pointer; + white-space: nowrap; +} + +#ux-taskbar .ux-taskbutton-left { + background-position: 0 0; +} + +#ux-taskbar .ux-taskbutton-right { + background-position: 0 -28px; +} + +#ux-taskbar .ux-taskbutton-center { + background-position: 0 -56px; +} + +#ux-taskbar .x-btn-over .ux-taskbutton-left { + background-position: 0 -252px; +} + +#ux-taskbar .x-btn-over .ux-taskbutton-right { + background-position: 0 -280px; +} + +#ux-taskbar .x-btn-over .ux-taskbutton-center { + background-position: 0 -308px; +} + +#ux-taskbar .x-btn-click .ux-taskbutton-left { + background-position: 0 -168px; +} + +#ux-taskbar .x-btn-click .ux-taskbutton-right { + background-position: 0 -196px; +} + +#ux-taskbar .x-btn-click .ux-taskbutton-center { + background-position: 0 -224px; +} + +#ux-taskbar .active-win .ux-taskbutton-left { + background-position: 0 -84px; +} + +#ux-taskbar .active-win .ux-taskbutton-right { + background: url( ../images/taskbar/black/taskbutton.gif ) no-repeat 0 -112px; +} + +#ux-taskbar .active-win .ux-taskbutton-center { + background: url( ../images/taskbar/black/taskbutton.gif ) repeat-x 0 -140px; +} + +#ux-taskbar .active-win .ux-taskbutton-center button { + color: #fff; +} + +#spacer { + height: 25px; + float: left; + width: 0; + overflow: hidden; + margin-top: 2px; +} + +.x-window-body p,.x-panel-body p { + padding: 10px; + margin: 0; +} + +.x-window-maximized .x-window-bc { + height: 0; +} + +.add { + background-image: url(../../shared/icons/fam/add.gif) !important; +} + +.option { + background-image: url(../../shared/icons/fam/plugin.gif) !important; +} + +.remove { + background-image: url(../../shared/icons/fam/delete.gif) !important; +} + +.tabs { + background-image: url(../images/tabs.gif) !important; +} + +.ux-start-menu { + background: transparent none; + border: 0px none; + padding: 0; +} + +.ux-start-menu-tl .x-window-header { + color: #f1f1f1; + font: bold 11px tahoma, arial, verdana, sans-serif; + padding: 5px 0 4px 0; +} + +.x-panel-tl .x-panel-icon,.ux-start-menu-tl .x-panel-icon { + background-position: 0pt 4px; + background-repeat: no-repeat; + padding-left: 20px !important; +} + +.ux-start-menu-tl { + background: transparent url( ../images/taskbar/black/start-menu-left-corners.png ) no-repeat 0 0; + padding-left: 6px; + zoom: 1; + z-index: 1; + position: relative; +} + +.ux-start-menu-tr { + background: transparent url( ../images/taskbar/black/start-menu-right-corners.png ) no-repeat right + 0; + padding-right: 6px; +} + +.ux-start-menu-tc { + background: transparent url( ../images/taskbar/black/start-menu-top-bottom.png ) repeat-x 0 0; + overflow: hidden; + zoom: 1; +} + +.ux-start-menu-ml { + background: transparent url( ../images/taskbar/black/start-menu-left-right.png ) repeat-y 0 0; + padding-left: 6px; + zoom: 1; +} + +.ux-start-menu-bc { + background: transparent url( ../images/taskbar/black/start-menu-top-bottom.png ) repeat-x 0 bottom; + zoom: 1; +} + +.ux-start-menu-bc .x-window-footer { + padding-bottom: 6px; + zoom: 1; + font-size: 0; + line-height: 0; +} + +.ux-start-menu-bl { + background: transparent url( ../images/taskbar/black/start-menu-left-corners.png ) no-repeat 0 + bottom; + padding-left: 6px; + zoom: 1; +} + +.ux-start-menu-br { + background: transparent url( ../images/taskbar/black/start-menu-right-corners.png ) no-repeat right + bottom; + padding-right: 6px; + zoom: 1; +} + +.x-panel-nofooter .ux-start-menu-bc { + height: 6px; +} + +.ux-start-menu-splitbar-h { + background-color: #d0d0d0; +} + +.ux-start-menu-bwrap { + background: transparent none; + border: 0px none; +} + +.ux-start-menu-body { + background: transparent none; + border: 0px none; +} + +.ux-start-menu-apps-panel { + background: #ffffff none; + border: 1px solid #1e2124; +} + +.ux-start-menu-tools-panel { + border: 0px none; + background: transparent url( ../images/taskbar/black/start-menu-right.png ) repeat-y scroll right + 0pt; +} + +#ux-taskbar-start { + background: #000000 url( ../images/taskbar/black/taskbar-start-panel-bg.gif ) repeat-x left top; + left: 0px; + padding: 0; + position: absolute; +} + +#ux-taskbar-start .x-toolbar { + background: none; + padding: 0px; + border: 0px none; +} + +#ux-taskbuttons-panel { + background: #000000 url( ../images/taskbar/black/taskbuttons-panel-bg.gif ) repeat-x left top; + padding-top: 0; + position: relative; +} + +.ux-taskbuttons-strip-wrap { /* overflow:hidden; + position:relative; + width:100%; */ + width: 100%; + overflow: hidden; + position: relative; + zoom: 1; +} + +ul.ux-taskbuttons-strip { + display: block; + width: 5000px; + zoom: 1; +} + +ul.ux-taskbuttons-strip li { + float: left; + margin-left: 2px; +} + +ul.ux-taskbuttons-strip li.ux-taskbuttons-edge { + float: left; + margin: 0 !important; + padding: 0 !important; + border: 0 none !important; + font-size: 1px !important; + line-height: 1px !important; + overflow: hidden; + zoom: 1; + background: transparent !important; + width: 1px; +} + +.x-clear { + clear: both; + height: 0; + overflow: hidden; + line-height: 0; + font-size: 0; +} + +.x-taskbuttons-scrolling { + position: relative; +} + +.x-taskbuttons-scrolling .ux-taskbuttons-strip-wrap { + margin-left: 18px; + margin-right: 18px; +} + +td.ux-taskButtons-edge { /*float:left;*/ + margin: 0 !important; + padding: 0 !important; + border: 0 none !important; + font-size: 1px !important; + line-height: 1px !important; + overflow: hidden; + zoom: 1; + background: transparent !important; + width: 1px; +} + +.ux-taskbuttons-scroller-left { + background: transparent url( ../images/taskbar/black/scroll-left.gif ) no-repeat -18px 0; + width: 18px; + position: absolute; + left: 1px; + top: 0px; + z-index: 10; + cursor: pointer; +} + +.ux-taskbuttons-scroller-left-over { + background-position: 0 0; +} + +.ux-taskbuttons-scroller-left-disabled { + background-position: -18px 0; + opacity: .5; + -moz-opacity: .5; + filter: alpha(opacity = 50); + cursor: default; +} + +.ux-taskbuttons-scroller-right { + background: transparent url( ../images/taskbar/black/scroll-right.gif ) no-repeat 0 0; + width: 18px; + position: absolute; + right: 0; + top: 0px; + z-index: 10; + cursor: pointer; +} + +.ux-taskbuttons-scroller-right-over { + background-position: -18px 0; +} + +.ux-taskbuttons-scroller-right-disabled { + background-position: 0 0; + opacity: .5; + -moz-opacity: .5; + filter: alpha(opacity = 50); + cursor: default; +} + +.ux-toolmenu-sep { + background-color: #18191a; + border-bottom: 1px solid #858789; + display: block; + font-size: 1px; + line-height: 1px; + margin: 2px 3px; +} + +.ux-start-menu-tools-panel ul.x-menu-list li.x-menu-list-item a.x-menu-item { + color: #ffffff; +} + +.ux-start-menu-tools-panel ul.x-menu-list li.x-menu-list-item .x-menu-item-active a.x-menu-item { + color: #000000; +} + +.ux-start-menu-tools-panel .x-menu-item-active { + background: #525456 url( ../images/taskbar/black/item-over.gif ) repeat-x left bottom; + border: 1px solid #000000; + padding: 0; +} + +#ux-taskbar .x-splitbar-h { + background: #000000 url( ../images/taskbar/black/taskbar-split-h.gif ) no-repeat 0 0; + width: 8px; +} + +.x-window-header-text { + cursor: default; +} + +/* + * Begin Start button + */ +.ux-startbutton-left,.ux-startbutton-right { + font-size: 1px; + line-height: 1px; +} + +.ux-startbutton-left { + width: 10px; + height: 28px; + background: url( ../images/taskbar/black/startbutton.gif ) no-repeat 0 0; +} + +.ux-startbutton-right { + width: 10px; + height: 30px; + background: url( ../images/taskbar/black/startbutton.gif ) no-repeat 0 -28px; +} + +.ux-startbutton-left i,.ux-startbutton-right i { + display: block; + width: 10px; + overflow: hidden; + font-size: 1px; + line-height: 1px; +} + +.ux-startbutton-center { + background: url( ../images/taskbar/black/startbutton.gif ) repeat-x 0 -56px; + vertical-align: middle; + text-align: center; + padding: 0; + cursor: pointer; + white-space: nowrap; +} + +#ux-taskbar .ux-startbutton-left { + background-position: 0 0; +} + +#ux-taskbar .ux-startbutton-right { + background-position: 0 -30px; +} + +#ux-taskbar .ux-startbutton-center { + background-position: 0 -60px; +} + +#ux-taskbar .x-btn-over .ux-startbutton-left { + background-position: 0 -270px; +} + +#ux-taskbar .x-btn-over .ux-startbutton-right { + background-position: 0 -300px; +} + +#ux-taskbar .x-btn-over .ux-startbutton-center { + background-position: 0 -330px; +} + +#ux-taskbar .x-btn-click .ux-startbutton-left { + background-position: 0 -180px; +} + +#ux-taskbar .x-btn-click .ux-startbutton-right { + background-position: 0 -210px; +} + +#ux-taskbar .x-btn-click .ux-startbutton-center { + background-position: 0 -240px; +} + +#ux-taskbar .active-win .ux-startbutton-left { + background-position: 0 -90px; +} + +#ux-taskbar .active-win .ux-startbutton-right { + background: url( ../images/taskbar/black/startbutton.gif ) no-repeat 0 -120px; +} + +#ux-taskbar .active-win .ux-startbutton-center { + background: url( ../images/taskbar/black/startbutton.gif ) repeat-x 0 -150px; +} + +#ux-taskbar .active-win .ux-startbutton-center button { + color: #fff; +} + +/* + * End Start button + */ +.x-resizable-proxy { + background: #C7DFFC; + opacity: .5; + -moz-opacity: .5; + filter: alpha(opacity = 50); + border: 1px solid #3b5a82; +} + +/* Desktop Shortcuts */ +#x-shortcuts dt { + float: left; + margin: 15px 0 0 15px; + clear: left; + width: 64px; + font: normal 10px tahoma, arial, verdana, sans-serif; + text-align: center; + zoom: 1; + display: block; +} + +#x-shortcuts dt a { + width: 64px; + display: block; + color: white; + text-decoration: none; +} + +#x-shortcuts dt div { + width: 100%; + color: white; + overflow: hidden; + text-overflow: ellipsis; + cursor: pointer; +} + +#x-shortcuts dt a:hover { + text-decoration: underline; +} diff --git a/src/main/webapp/gxt/desktop/images/desktop.gif b/src/main/webapp/gxt/desktop/images/desktop.gif new file mode 100644 index 0000000..f305cb6 Binary files /dev/null and b/src/main/webapp/gxt/desktop/images/desktop.gif differ diff --git a/src/main/webapp/gxt/desktop/images/desktop3.jpg b/src/main/webapp/gxt/desktop/images/desktop3.jpg new file mode 100644 index 0000000..daca8bc Binary files /dev/null and b/src/main/webapp/gxt/desktop/images/desktop3.jpg differ diff --git a/src/main/webapp/gxt/desktop/images/gears.gif b/src/main/webapp/gxt/desktop/images/gears.gif new file mode 100644 index 0000000..2bf6bd7 Binary files /dev/null and b/src/main/webapp/gxt/desktop/images/gears.gif differ diff --git a/src/main/webapp/gxt/desktop/images/gears.png b/src/main/webapp/gxt/desktop/images/gears.png new file mode 100644 index 0000000..6acdc98 Binary files /dev/null and b/src/main/webapp/gxt/desktop/images/gears.png differ diff --git a/src/main/webapp/gxt/desktop/images/grid.png b/src/main/webapp/gxt/desktop/images/grid.png new file mode 100644 index 0000000..c4da495 Binary files /dev/null and b/src/main/webapp/gxt/desktop/images/grid.png differ diff --git a/src/main/webapp/gxt/desktop/images/hatch.gif b/src/main/webapp/gxt/desktop/images/hatch.gif new file mode 100644 index 0000000..6a044a8 Binary files /dev/null and b/src/main/webapp/gxt/desktop/images/hatch.gif differ diff --git a/src/main/webapp/gxt/desktop/images/hd-bg.gif b/src/main/webapp/gxt/desktop/images/hd-bg.gif new file mode 100644 index 0000000..f35a53f Binary files /dev/null and b/src/main/webapp/gxt/desktop/images/hd-bg.gif differ diff --git a/src/main/webapp/gxt/desktop/images/hd-tb-bg.gif b/src/main/webapp/gxt/desktop/images/hd-tb-bg.gif new file mode 100644 index 0000000..f800edb Binary files /dev/null and b/src/main/webapp/gxt/desktop/images/hd-tb-bg.gif differ diff --git a/src/main/webapp/gxt/desktop/images/icon_padlock.png b/src/main/webapp/gxt/desktop/images/icon_padlock.png new file mode 100644 index 0000000..92625ff Binary files /dev/null and b/src/main/webapp/gxt/desktop/images/icon_padlock.png differ diff --git a/src/main/webapp/gxt/desktop/images/icons-bg.png b/src/main/webapp/gxt/desktop/images/icons-bg.png new file mode 100644 index 0000000..6557cbb Binary files /dev/null and b/src/main/webapp/gxt/desktop/images/icons-bg.png differ diff --git a/src/main/webapp/gxt/desktop/images/launcher-bg.gif b/src/main/webapp/gxt/desktop/images/launcher-bg.gif new file mode 100644 index 0000000..c7cfd83 Binary files /dev/null and b/src/main/webapp/gxt/desktop/images/launcher-bg.gif differ diff --git a/src/main/webapp/gxt/desktop/images/launcher-btn.gif b/src/main/webapp/gxt/desktop/images/launcher-btn.gif new file mode 100644 index 0000000..a9a72d7 Binary files /dev/null and b/src/main/webapp/gxt/desktop/images/launcher-btn.gif differ diff --git a/src/main/webapp/gxt/desktop/images/logout.gif b/src/main/webapp/gxt/desktop/images/logout.gif new file mode 100644 index 0000000..a4f3738 Binary files /dev/null and b/src/main/webapp/gxt/desktop/images/logout.gif differ diff --git a/src/main/webapp/gxt/desktop/images/logout.png b/src/main/webapp/gxt/desktop/images/logout.png new file mode 100644 index 0000000..1fcb386 Binary files /dev/null and b/src/main/webapp/gxt/desktop/images/logout.png differ diff --git a/src/main/webapp/gxt/desktop/images/member.gif b/src/main/webapp/gxt/desktop/images/member.gif new file mode 100644 index 0000000..216c839 Binary files /dev/null and b/src/main/webapp/gxt/desktop/images/member.gif differ diff --git a/src/main/webapp/gxt/desktop/images/member.png b/src/main/webapp/gxt/desktop/images/member.png new file mode 100644 index 0000000..0f3657f Binary files /dev/null and b/src/main/webapp/gxt/desktop/images/member.png differ diff --git a/src/main/webapp/gxt/desktop/images/powered.gif b/src/main/webapp/gxt/desktop/images/powered.gif new file mode 100644 index 0000000..8ce74b8 Binary files /dev/null and b/src/main/webapp/gxt/desktop/images/powered.gif differ diff --git a/src/main/webapp/gxt/desktop/images/powered.png b/src/main/webapp/gxt/desktop/images/powered.png new file mode 100644 index 0000000..5b2a0b8 Binary files /dev/null and b/src/main/webapp/gxt/desktop/images/powered.png differ diff --git a/src/main/webapp/gxt/desktop/images/s.gif b/src/main/webapp/gxt/desktop/images/s.gif new file mode 100644 index 0000000..1d11fa9 Binary files /dev/null and b/src/main/webapp/gxt/desktop/images/s.gif differ diff --git a/src/main/webapp/gxt/desktop/images/taskbar/black/item-over.gif b/src/main/webapp/gxt/desktop/images/taskbar/black/item-over.gif new file mode 100644 index 0000000..26c1fc2 Binary files /dev/null and b/src/main/webapp/gxt/desktop/images/taskbar/black/item-over.gif differ diff --git a/src/main/webapp/gxt/desktop/images/taskbar/black/scroll-left.gif b/src/main/webapp/gxt/desktop/images/taskbar/black/scroll-left.gif new file mode 100644 index 0000000..94fea48 Binary files /dev/null and b/src/main/webapp/gxt/desktop/images/taskbar/black/scroll-left.gif differ diff --git a/src/main/webapp/gxt/desktop/images/taskbar/black/scroll-right.gif b/src/main/webapp/gxt/desktop/images/taskbar/black/scroll-right.gif new file mode 100644 index 0000000..94b5669 Binary files /dev/null and b/src/main/webapp/gxt/desktop/images/taskbar/black/scroll-right.gif differ diff --git a/src/main/webapp/gxt/desktop/images/taskbar/black/start-menu-left-corners.png b/src/main/webapp/gxt/desktop/images/taskbar/black/start-menu-left-corners.png new file mode 100644 index 0000000..d6e5196 Binary files /dev/null and b/src/main/webapp/gxt/desktop/images/taskbar/black/start-menu-left-corners.png differ diff --git a/src/main/webapp/gxt/desktop/images/taskbar/black/start-menu-left-right.png b/src/main/webapp/gxt/desktop/images/taskbar/black/start-menu-left-right.png new file mode 100644 index 0000000..a577d1b Binary files /dev/null and b/src/main/webapp/gxt/desktop/images/taskbar/black/start-menu-left-right.png differ diff --git a/src/main/webapp/gxt/desktop/images/taskbar/black/start-menu-right-corners.png b/src/main/webapp/gxt/desktop/images/taskbar/black/start-menu-right-corners.png new file mode 100644 index 0000000..b683301 Binary files /dev/null and b/src/main/webapp/gxt/desktop/images/taskbar/black/start-menu-right-corners.png differ diff --git a/src/main/webapp/gxt/desktop/images/taskbar/black/start-menu-right.png b/src/main/webapp/gxt/desktop/images/taskbar/black/start-menu-right.png new file mode 100644 index 0000000..e5fa2b8 Binary files /dev/null and b/src/main/webapp/gxt/desktop/images/taskbar/black/start-menu-right.png differ diff --git a/src/main/webapp/gxt/desktop/images/taskbar/black/start-menu-top-bottom.png b/src/main/webapp/gxt/desktop/images/taskbar/black/start-menu-top-bottom.png new file mode 100644 index 0000000..fbea3cb Binary files /dev/null and b/src/main/webapp/gxt/desktop/images/taskbar/black/start-menu-top-bottom.png differ diff --git a/src/main/webapp/gxt/desktop/images/taskbar/black/startbutton-icon.gif b/src/main/webapp/gxt/desktop/images/taskbar/black/startbutton-icon.gif new file mode 100644 index 0000000..8dcd2d1 Binary files /dev/null and b/src/main/webapp/gxt/desktop/images/taskbar/black/startbutton-icon.gif differ diff --git a/src/main/webapp/gxt/desktop/images/taskbar/black/startbutton.gif b/src/main/webapp/gxt/desktop/images/taskbar/black/startbutton.gif new file mode 100644 index 0000000..683313e Binary files /dev/null and b/src/main/webapp/gxt/desktop/images/taskbar/black/startbutton.gif differ diff --git a/src/main/webapp/gxt/desktop/images/taskbar/black/taskbar-split-h.gif b/src/main/webapp/gxt/desktop/images/taskbar/black/taskbar-split-h.gif new file mode 100644 index 0000000..13564ad Binary files /dev/null and b/src/main/webapp/gxt/desktop/images/taskbar/black/taskbar-split-h.gif differ diff --git a/src/main/webapp/gxt/desktop/images/taskbar/black/taskbar-start-panel-bg.gif b/src/main/webapp/gxt/desktop/images/taskbar/black/taskbar-start-panel-bg.gif new file mode 100644 index 0000000..9794880 Binary files /dev/null and b/src/main/webapp/gxt/desktop/images/taskbar/black/taskbar-start-panel-bg.gif differ diff --git a/src/main/webapp/gxt/desktop/images/taskbar/black/taskbutton.gif b/src/main/webapp/gxt/desktop/images/taskbar/black/taskbutton.gif new file mode 100644 index 0000000..df13974 Binary files /dev/null and b/src/main/webapp/gxt/desktop/images/taskbar/black/taskbutton.gif differ diff --git a/src/main/webapp/gxt/desktop/images/taskbar/black/taskbuttons-panel-bg.gif b/src/main/webapp/gxt/desktop/images/taskbar/black/taskbuttons-panel-bg.gif new file mode 100644 index 0000000..0865c45 Binary files /dev/null and b/src/main/webapp/gxt/desktop/images/taskbar/black/taskbuttons-panel-bg.gif differ diff --git a/src/main/webapp/gxt/desktop/images/winbar-bg.gif b/src/main/webapp/gxt/desktop/images/winbar-bg.gif new file mode 100644 index 0000000..45295a6 Binary files /dev/null and b/src/main/webapp/gxt/desktop/images/winbar-bg.gif differ diff --git a/src/main/webapp/gxt/desktop/images/winbar-btn.gif b/src/main/webapp/gxt/desktop/images/winbar-btn.gif new file mode 100644 index 0000000..2c8c024 Binary files /dev/null and b/src/main/webapp/gxt/desktop/images/winbar-btn.gif differ diff --git a/src/main/webapp/gxt/desktop/images/windows-bg.gif b/src/main/webapp/gxt/desktop/images/windows-bg.gif new file mode 100644 index 0000000..396471e Binary files /dev/null and b/src/main/webapp/gxt/desktop/images/windows-bg.gif differ diff --git a/src/main/webapp/gxt/desktop/wallpapers/desktop.jpg b/src/main/webapp/gxt/desktop/wallpapers/desktop.jpg new file mode 100644 index 0000000..8e1fcb0 Binary files /dev/null and b/src/main/webapp/gxt/desktop/wallpapers/desktop.jpg differ diff --git a/src/main/webapp/gxt/flash/swfobject.js b/src/main/webapp/gxt/flash/swfobject.js new file mode 100644 index 0000000..4b704c5 --- /dev/null +++ b/src/main/webapp/gxt/flash/swfobject.js @@ -0,0 +1,5 @@ +/* SWFObject v2.1 + Copyright (c) 2007-2008 Geoff Stearns, Michael Williams, and Bobby van der Sluis + This software is released under the MIT License +*/ +var swfobject=function(){var b="undefined",Q="object",n="Shockwave Flash",p="ShockwaveFlash.ShockwaveFlash",P="application/x-shockwave-flash",m="SWFObjectExprInst",j=window,K=document,T=navigator,o=[],N=[],i=[],d=[],J,Z=null,M=null,l=null,e=false,A=false;var h=function(){var v=typeof K.getElementById!=b&&typeof K.getElementsByTagName!=b&&typeof K.createElement!=b,AC=[0,0,0],x=null;if(typeof T.plugins!=b&&typeof T.plugins[n]==Q){x=T.plugins[n].description;if(x&&!(typeof T.mimeTypes!=b&&T.mimeTypes[P]&&!T.mimeTypes[P].enabledPlugin)){x=x.replace(/^.*\s+(\S+\s+\S+$)/,"$1");AC[0]=parseInt(x.replace(/^(.*)\..*$/,"$1"),10);AC[1]=parseInt(x.replace(/^.*\.(.*)\s.*$/,"$1"),10);AC[2]=/r/.test(x)?parseInt(x.replace(/^.*r(.*)$/,"$1"),10):0}}else{if(typeof j.ActiveXObject!=b){var y=null,AB=false;try{y=new ActiveXObject(p+".7")}catch(t){try{y=new ActiveXObject(p+".6");AC=[6,0,21];y.AllowScriptAccess="always"}catch(t){if(AC[0]==6){AB=true}}if(!AB){try{y=new ActiveXObject(p)}catch(t){}}}if(!AB&&y){try{x=y.GetVariable("$version");if(x){x=x.split(" ")[1].split(",");AC=[parseInt(x[0],10),parseInt(x[1],10),parseInt(x[2],10)]}}catch(t){}}}}var AD=T.userAgent.toLowerCase(),r=T.platform.toLowerCase(),AA=/webkit/.test(AD)?parseFloat(AD.replace(/^.*webkit\/(\d+(\.\d+)?).*$/,"$1")):false,q=false,z=r?/win/.test(r):/win/.test(AD),w=r?/mac/.test(r):/mac/.test(AD);/*@cc_on q=true;@if(@_win32)z=true;@elif(@_mac)w=true;@end@*/return{w3cdom:v,pv:AC,webkit:AA,ie:q,win:z,mac:w}}();var L=function(){if(!h.w3cdom){return }f(H);if(h.ie&&h.win){try{K.write("