From b18bea1b92f55731b6e41b9fdc590ba98e452580 Mon Sep 17 00:00:00 2001 From: Massimiliano Assante Date: Wed, 18 Dec 2013 15:30:32 +0000 Subject: [PATCH] implemented create scenario git-svn-id: http://svn.research-infrastructures.eu/public/d4science/gcube/trunk/portlets/user/reports@87162 82a268e6-3cf1-43bd-a215-b396298e98cf --- .classpath | 6 +-- .settings/com.google.gdt.eclipse.core.prefs | 2 +- pom.xml | 2 +- .../reportgenerator/client/Headerbar.java | 48 +++++++++++++++++- .../client/Presenter/CommonCommands.java | 2 +- .../client/Presenter/Presenter.java | 20 ++++++++ .../reportgenerator/client/ReportService.java | 2 + .../client/ReportServiceAsync.java | 2 + .../client/toolbar/Images.java | 5 ++ .../RichTextToolbar$Strings.properties | 1 + .../client/toolbar/RichTextToolbar.java | 7 +++ .../client/toolbar/closeDoc.png | Bin 0 -> 3457 bytes .../client/uibinder/OpenOptionsVME.java | 3 +- .../server/servlet/ReportServiceImpl.java | 30 ++++++++++- .../server/servlet/ReportsReader.java | 10 +++- .../shared/VMETypeIdentifier.java | 21 +++++--- src/main/webapp/ReportGenerator.css | 1 + src/main/webapp/images/closeDoc.png | Bin 0 -> 3457 bytes 18 files changed, 145 insertions(+), 17 deletions(-) create mode 100644 src/main/java/org/gcube/portlets/user/reportgenerator/client/toolbar/closeDoc.png create mode 100644 src/main/webapp/images/closeDoc.png diff --git a/.classpath b/.classpath index a317ac4..a007caa 100644 --- a/.classpath +++ b/.classpath @@ -1,6 +1,6 @@ - + @@ -26,10 +26,10 @@ - + - + diff --git a/.settings/com.google.gdt.eclipse.core.prefs b/.settings/com.google.gdt.eclipse.core.prefs index 7eb289d..e798aa2 100644 --- a/.settings/com.google.gdt.eclipse.core.prefs +++ b/.settings/com.google.gdt.eclipse.core.prefs @@ -2,6 +2,6 @@ <<<<<<<=.mine >>>>>>>=.r71295 eclipse.preferences.version=1 -lastWarOutDir=/Users/massi/Documents/workspace/reports/target/reports-4.6.17-SNAPSHOT +lastWarOutDir=/Users/massi/Documents/workspace/reports/target/reports-4.6.19-SNAPSHOT warSrcDir=src/main/webapp warSrcDirIsOutput=false diff --git a/pom.xml b/pom.xml index 3decdc8..062a157 100644 --- a/pom.xml +++ b/pom.xml @@ -12,7 +12,7 @@ org.gcube.portlets.user reports war - 4.6.17-SNAPSHOT + 4.6.19-SNAPSHOT gCube Reports Manager gCube Reports Portlet. 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 index 21350e4..1e64b4c 100644 --- a/src/main/java/org/gcube/portlets/user/reportgenerator/client/Headerbar.java +++ b/src/main/java/org/gcube/portlets/user/reportgenerator/client/Headerbar.java @@ -186,7 +186,7 @@ public class Headerbar extends Composite{ menuBar.addSeparator(); - MenuItem vmeMenuCreate = getVMEMenuFake("Create"); + MenuItem vmeMenuCreate = getVMEMenuCreate(); menuBar.addItem(vmeMenuCreate); separator4 = menuBar.addSeparator(); @@ -414,6 +414,52 @@ public class Headerbar extends Composite{ return toReturn; } + + + private MenuItem getVMEMenuCreate() { + MenuBar importMenu = new MenuBar(true); + + importMenu.setAnimationEnabled(true); + MenuItem toReturn = new MenuItem("Create VME-DB", importMenu); + toReturn.getElement().getStyle().setWhiteSpace(WhiteSpace.NOWRAP); + + MenuItem item = new MenuItem("Create new VME", true, new Command() { + public void execute() { + presenter.importVMETemplate(VMETypeIdentifier.Vme); + } + }); + importMenu.addItem(item); + importMenu.addSeparator(); + + item = new MenuItem("Create new General Measure", true, new Command() { + public void execute() { + presenter.importVMETemplate(VMETypeIdentifier.GeneralMeasure); + } + }); + importMenu.addItem(item); + + item = new MenuItem("Create new Information Source", true, new Command() { + public void execute() { + presenter.importVMETemplate(VMETypeIdentifier.InformationSource); + } + }); + importMenu.addItem(item); + + item = new MenuItem("Create new Fishing footprint", true, new Command() { + public void execute() { + presenter.importVMETemplate(VMETypeIdentifier.FisheryAreasHistory); + } + }); + importMenu.addItem(item); + + item = new MenuItem("Create new Regional History of VMEs", true, new Command() { + public void execute() { + presenter.importVMETemplate(VMETypeIdentifier.VMEsHistory); + } + }); + importMenu.addItem(item); + return toReturn; + } /** * 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 index da9d9d2..8f27c05 100644 --- 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 @@ -38,6 +38,7 @@ public class CommonCommands { */ public Command openReport; + public Command newTemplate; /** * @@ -73,7 +74,6 @@ public class CommonCommands { } }; - openTemplate = new Command() { public void execute() { final int left = presenter.getHeader().getMainLayout().getAbsoluteLeft() + 50; 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 index d1afb2e..19aa5b2 100644 --- 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 @@ -1208,6 +1208,26 @@ public class Presenter { dlg.show(); } + public void importVMETemplate(final VMETypeIdentifier type) { + showLoading(); + reportService.importVMETemplate(type, new AsyncCallback() { + @Override + public void onFailure(Throwable caught) { + Window.alert("Could not Load Template Model, error on server.: " + caught.getMessage()); + } + + @Override + public void onSuccess(Model toLoad) { + if (toLoad != null) { + loadModel(toLoad, type == VMETypeIdentifier.Vme); + } + else + Window.alert("Could not Load Template Model, error on server."); + } + }); + + } + private void importVMEReport(String reportId, String name, final VMETypeIdentifier type) { showLoading(); reportService.importVMEReport(reportId, name, type, new AsyncCallback() { 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 index 8208836..f86a72c 100644 --- a/src/main/java/org/gcube/portlets/user/reportgenerator/client/ReportService.java +++ b/src/main/java/org/gcube/portlets/user/reportgenerator/client/ReportService.java @@ -28,6 +28,8 @@ public interface ReportService extends RemoteService{ Model importVMEReport(String id, String name, VMETypeIdentifier refType); Model getVMEReportRef2Associate(String id, VMETypeIdentifier refType); + + Model importVMETemplate(VMETypeIdentifier refType); String save(String filePath, String workspaceFolderId, String ItemName, TypeExporter type, boolean overwrite) 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 index b1b42c6..00c2dab 100644 --- a/src/main/java/org/gcube/portlets/user/reportgenerator/client/ReportServiceAsync.java +++ b/src/main/java/org/gcube/portlets/user/reportgenerator/client/ReportServiceAsync.java @@ -84,4 +84,6 @@ public interface ReportServiceAsync { AsyncCallback> callback); void getVMEReportRef2Associate(String id, VMETypeIdentifier refType, AsyncCallback callback); + void importVMETemplate(VMETypeIdentifier refType, + AsyncCallback callback); } diff --git a/src/main/java/org/gcube/portlets/user/reportgenerator/client/toolbar/Images.java b/src/main/java/org/gcube/portlets/user/reportgenerator/client/toolbar/Images.java index 8cf4782..fbf00d6 100644 --- a/src/main/java/org/gcube/portlets/user/reportgenerator/client/toolbar/Images.java +++ b/src/main/java/org/gcube/portlets/user/reportgenerator/client/toolbar/Images.java @@ -50,10 +50,15 @@ public interface Images extends ImageBundle { * @return . */ AbstractImagePrototype justifyRight(); + /** + * @return . + */ + AbstractImagePrototype closeDoc(); /** * @return . */ AbstractImagePrototype newdoc(); + /** * @return . */ diff --git a/src/main/java/org/gcube/portlets/user/reportgenerator/client/toolbar/RichTextToolbar$Strings.properties b/src/main/java/org/gcube/portlets/user/reportgenerator/client/toolbar/RichTextToolbar$Strings.properties index 80a8777..14f00b7 100644 --- a/src/main/java/org/gcube/portlets/user/reportgenerator/client/toolbar/RichTextToolbar$Strings.properties +++ b/src/main/java/org/gcube/portlets/user/reportgenerator/client/toolbar/RichTextToolbar$Strings.properties @@ -39,3 +39,4 @@ open_template = Open Template open_report = Open Report from Workspace importing = Import from Template forecolors = Text Color +close_report = Close Report \ No newline at end of file diff --git a/src/main/java/org/gcube/portlets/user/reportgenerator/client/toolbar/RichTextToolbar.java b/src/main/java/org/gcube/portlets/user/reportgenerator/client/toolbar/RichTextToolbar.java index 63796f2..04747ec 100644 --- a/src/main/java/org/gcube/portlets/user/reportgenerator/client/toolbar/RichTextToolbar.java +++ b/src/main/java/org/gcube/portlets/user/reportgenerator/client/toolbar/RichTextToolbar.java @@ -80,6 +80,8 @@ public class RichTextToolbar extends Composite { commands.get("save").execute(); } else if (sender == newdoc) { commands.get("newdoc").execute(); + }else if (sender == close) { + commands.get("newdoc").execute(); } else if (sender == open_report) { commands.get("open_report").execute(); } else if (sender == open_template) { @@ -173,6 +175,7 @@ public class RichTextToolbar extends Composite { private PushButton justifyRight; private PushButton save; private PushButton saveDB; + private PushButton close; private PushButton newdoc; private PushButton open_template; private PushButton open_report; @@ -245,6 +248,8 @@ public class RichTextToolbar extends Composite { } //add the save button topPanel.add(save = createPushButton(images.save(), strings.save())); + //add the close button + topPanel.add(close = createPushButton(images.closeDoc(), strings.close_report())); if (isVme) { topPanel.add(saveDB = createPushButton(images.db_save(), "Commit current in VME-DB")); saveDB.addClickHandler(new ClickHandler() { @@ -456,6 +461,8 @@ public class RichTextToolbar extends Composite { */ public interface Strings extends Constants { + String close_report(); + String insertImage(); String importing(); diff --git a/src/main/java/org/gcube/portlets/user/reportgenerator/client/toolbar/closeDoc.png b/src/main/java/org/gcube/portlets/user/reportgenerator/client/toolbar/closeDoc.png new file mode 100644 index 0000000000000000000000000000000000000000..94033d5f1807ca68c80cc548340e6db4062147c2 GIT binary patch literal 3457 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