From 47283d59d85ea2a3f95371d014250466f50c6f3c Mon Sep 17 00:00:00 2001 From: Lorenzo Tilve Date: Thu, 7 Jan 2010 10:16:29 +0100 Subject: [PATCH] ItEr42S15SoporteImpresionMultiplesPaxinasItEr41S18: Implemented print behaviour to open generated PDF based on scheduler view --- INSTALL | 18 +++++ .../main/java/org/zkoss/ganttz/Planner.java | 79 ++++++++++++++++++- .../ganttz/adapters/PlannerConfiguration.java | 2 + .../web/ganttz/zul/plannerLayout.zul | 10 +-- .../timetracker/timetrackersecondlevel.zul | 2 +- .../main/resources/web/js/ganttz/tasklist.js | 13 ++- .../planner/tabs/IGlobalViewEntryPoints.java | 4 + .../tabs/MultipleTabsPlannerController.java | 6 ++ ...lplanner-webapp-spring-security-config.xml | 2 + .../main/webapp/common/css/navalpro_zk.css | 67 ++++++++-------- .../main/webapp/common/layout/template.zul | 2 +- .../src/main/webapp/planner/css/ganttzk.css | 9 ++- .../src/main/webapp/print/.gitignore | 1 + 13 files changed, 167 insertions(+), 48 deletions(-) create mode 100644 navalplanner-webapp/src/main/webapp/print/.gitignore diff --git a/INSTALL b/INSTALL index 5fcd3edb2..2826318f4 100644 --- a/INSTALL +++ b/INSTALL @@ -86,3 +86,21 @@ Check ```` section in the root ``pom.xml`` to see the profile-based approach used in the project. The default profiles (the one assumed by the above instructions) are ``dev`` and ``postgresql`` (meaning "use PostgreSQL assuming a development environment"). + +Print +----- + +Printing system is based on a tool that produces several output formats rendering +the specified URLs with the WebKit engine. To be able to print local diagrams this +tool and a lightweight X server must be installed. + +The capturing tool is CutyCapt [1], which has to be either compiled or installed from +an external package. Once compiled from the tarball the binary CutyCapt must be located +under /usr/local/bin/ to be available to the application. + +X virtual framebuffer xvfb[2] package needs to be installed for the application running on +a non-desktop server is capable of launching an X instance to create the print capture of +the selected page. + +[1] http://cutycapt.sourceforge.net/ +[2] http://www.xfree86.org/4.0.1/Xvfb.1.html diff --git a/ganttzk/src/main/java/org/zkoss/ganttz/Planner.java b/ganttzk/src/main/java/org/zkoss/ganttz/Planner.java index bf9a45332..342d3117a 100644 --- a/ganttzk/src/main/java/org/zkoss/ganttz/Planner.java +++ b/ganttzk/src/main/java/org/zkoss/ganttz/Planner.java @@ -22,11 +22,18 @@ package org.zkoss.ganttz; import static org.zkoss.ganttz.i18n.I18nHelper._; +import java.io.IOException; +import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Arrays; import java.util.Collection; +import java.util.Date; import java.util.List; +import javax.servlet.ServletException; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + import org.zkoss.ganttz.adapters.IDisabilityConfiguration; import org.zkoss.ganttz.adapters.PlannerConfiguration; import org.zkoss.ganttz.data.Dependency; @@ -37,7 +44,8 @@ import org.zkoss.ganttz.data.GanttDiagramGraph.IGraphChangeListener; import org.zkoss.ganttz.extensions.ICommand; import org.zkoss.ganttz.extensions.ICommandOnTask; import org.zkoss.ganttz.extensions.IContext; -import org.zkoss.ganttz.print.Print; +import org.zkoss.ganttz.servlets.CallbackServlet; +import org.zkoss.ganttz.servlets.CallbackServlet.IServletRequestHandler; import org.zkoss.ganttz.timetracker.TimeTracker; import org.zkoss.ganttz.timetracker.TimeTrackerComponent; import org.zkoss.ganttz.timetracker.TimeTrackerComponentWithoutColumns; @@ -58,6 +66,12 @@ import org.zkoss.zul.api.Button; public class Planner extends HtmlMacroComponent { + // Read path and Xvfb port from properties file + private static final String CUTYCAPT_COMMAND = "/usr/local/bin/CutyCapt "; + + // Calculate dynamically width and delay parameters + private static final String CUTYCAPT_PARAMETERS = " --min-width=2500 --delay=1000 "; + public static void registerNeededScripts() { IScriptsRegister register = getScriptsRegister(); register.register(ScriptsRequiredByPlanner.class); @@ -387,7 +401,68 @@ public class Planner extends HtmlMacroComponent { } public void print() { - Print.print(diagramGraph); + + // Pending to raise print configuration popup + + HttpServletRequest request = (HttpServletRequest) Executions + .getCurrent().getNativeRequest(); + + String url = CallbackServlet.registerAndCreateURLFor(request, + new IServletRequestHandler() { + + @Override + public void handle(HttpServletRequest request, + HttpServletResponse response) + throws ServletException, IOException { + + String forwardURL = "/planner/index.zul"; + String orderId = request.getParameter("order"); + + if ((orderId != null) && !(orderId.equals(""))) { + forwardURL += ";order=" + orderId; + } + + // Pending to forward and process additional parameters + // as show labels or resources + request.getRequestDispatcher(forwardURL).forward( + request, response); + } + }); + + String CUTYCAPT_URL = "--url=http://localhost:8080" + url; + String captureString = CUTYCAPT_COMMAND + CUTYCAPT_URL; + + captureString += CUTYCAPT_PARAMETERS; + + String absolutePath = request.getSession().getServletContext() + .getRealPath("/"); + String filename = "/print/" + + new SimpleDateFormat("yyyyMMddHHmmss").format(new Date()) + + ".pdf"; + + captureString += "--out=" + absolutePath + filename; + + try { + // CutyCapt command execution + // If there is a not real X server environment, use framebuffer + String[] serverEnvironment = { "PATH=$PATH" }; + Process server = Runtime.getRuntime().exec("env - Xvfb :99", + serverEnvironment); + String[] environment = { "DISPLAY=:99.0" }; + Process p = Runtime.getRuntime().exec(captureString, environment); + System.out.println(captureString); + try { + p.waitFor(); + p.destroy(); + server.destroy(); + Executions.getCurrent().sendRedirect(filename, "_blank"); + } catch (InterruptedException e) { + e.printStackTrace(); + } + + } catch (IOException e) { + e.printStackTrace(); + } } } diff --git a/ganttzk/src/main/java/org/zkoss/ganttz/adapters/PlannerConfiguration.java b/ganttzk/src/main/java/org/zkoss/ganttz/adapters/PlannerConfiguration.java index 6c6626fb8..8a53b5415 100644 --- a/ganttzk/src/main/java/org/zkoss/ganttz/adapters/PlannerConfiguration.java +++ b/ganttzk/src/main/java/org/zkoss/ganttz/adapters/PlannerConfiguration.java @@ -110,6 +110,8 @@ public class PlannerConfiguration implements IDisabilityConfiguration { private boolean criticalPathEnabled = true; + // private String identifier = null; + private IDetailItemModificator firstLevelModificators = SeveralModificators .empty(); diff --git a/ganttzk/src/main/resources/web/ganttz/zul/plannerLayout.zul b/ganttzk/src/main/resources/web/ganttz/zul/plannerLayout.zul index 6707ab300..7b6c5217a 100644 --- a/ganttzk/src/main/resources/web/ganttz/zul/plannerLayout.zul +++ b/ganttzk/src/main/resources/web/ganttz/zul/plannerLayout.zul @@ -46,9 +46,8 @@ planner = self;
- - + @@ -61,7 +60,7 @@ planner = self; -
+
@@ -78,8 +77,7 @@ planner = self;
- +
diff --git a/ganttzk/src/main/resources/web/ganttz/zul/timetracker/timetrackersecondlevel.zul b/ganttzk/src/main/resources/web/ganttz/zul/timetracker/timetrackersecondlevel.zul index 432d7f951..d6286eb7b 100644 --- a/ganttzk/src/main/resources/web/ganttz/zul/timetracker/timetrackersecondlevel.zul +++ b/ganttzk/src/main/resources/web/ganttz/zul/timetracker/timetrackersecondlevel.zul @@ -28,7 +28,7 @@ ${each.name} - + + + diff --git a/navalplanner-webapp/src/main/webapp/common/css/navalpro_zk.css b/navalplanner-webapp/src/main/webapp/common/css/navalpro_zk.css index 61bc8e1d3..68971d4ca 100644 --- a/navalplanner-webapp/src/main/webapp/common/css/navalpro_zk.css +++ b/navalplanner-webapp/src/main/webapp/common/css/navalpro_zk.css @@ -20,41 +20,51 @@ margin-left: -90px; } + /* Calculate dynamically */ + body { + width: 2500px; + } + body .z-border-layout { background-color: #FFFFFF; } - body .leftpanelcontainer, .rightpanellayout .z-center-body { + .plannerlayout .leftpanelcontainer, + .plannerlayout .rightpanellayout .z-center-body { overflow: hidden !important; - overflow-x: hidden !important; - overflow-y: hidden !important; } - /* Height dependent styles */ + body { + width: 2500px; + } + + /* ----- Height dependent styles ----- */ body div.scheduling-graphics { height:0px !important; display: none; } + /* Dynamically set heights */ body div.main-layout { - height: 12800px !important; + height: 1800px !important; } body div.plannerlayout { - height: 12790px !important; + height: 1790px !important; } - body div#timetracker, - #watermark .timetracker_column_even { - height: 12730px !important; + body div#timetracker { + height: 1730px !important; } body div#scroll_container { - height: 12710px !important; + height: 1710px !important; } -} +} /* --- End print media ----*/ + + /* ----- Predefined Height dependent styles ----- */ .scheduling-graphics { height:200px; } @@ -63,31 +73,23 @@ height: 560px; } - #watermark { - height: 442px; - } - - - #watermark { - height: 12780px !important; - } - - #timetracker, #watermark, #watermark .timetracker_column_even { - height: 99999px !important; - } - - #timetracker { - overflow: hidden; - } - - .taskheaders-border { width: 300px; } - .leftpanelcontainer { - overflow-x: scroll; - } + +.plannerlayout #watermark, +.plannerlayout #watermark .timetracker_column_even { + height: 99999px !important; +} + +.plannerlayout .taskspanelgap #timetracker { + overflow-y: hidden; +} + +.leftpanelcontainer { + overflow-x: scroll; +} body { font-family: Verdana, Tahoma, Arial, Helvetica, sans-serif; @@ -101,6 +103,7 @@ body { float: left; clear: both; position: absolute; + border: 0; } .headings { diff --git a/navalplanner-webapp/src/main/webapp/common/layout/template.zul b/navalplanner-webapp/src/main/webapp/common/layout/template.zul index 1f9bf4e68..712d60d26 100644 --- a/navalplanner-webapp/src/main/webapp/common/layout/template.zul +++ b/navalplanner-webapp/src/main/webapp/common/layout/template.zul @@ -54,7 +54,7 @@ - + diff --git a/navalplanner-webapp/src/main/webapp/planner/css/ganttzk.css b/navalplanner-webapp/src/main/webapp/planner/css/ganttzk.css index b4fa542d9..4262fe415 100644 --- a/navalplanner-webapp/src/main/webapp/planner/css/ganttzk.css +++ b/navalplanner-webapp/src/main/webapp/planner/css/ganttzk.css @@ -248,7 +248,7 @@ min-width:200px; } #ganttpanel table td { - padding: 0; + /* padding: 0; */ } /* -------------- Timetracker -------------- */ @@ -271,7 +271,8 @@ min-width:200px; /* Watermark alternate row color */ #watermark .timetracker_column_even { - background-color: #EEEEEE; + background-color: #EEEEEE !important; + height: 458px; } #watermark .timetracker_column_today.timetracker_column_deadline, @@ -698,9 +699,11 @@ div.z-tree { .listdetails { position:relative; - top:-18px; } +#listdetails_container { + top:-18px; +} .listdetails .z-tree-header { margin-bottom:17px; diff --git a/navalplanner-webapp/src/main/webapp/print/.gitignore b/navalplanner-webapp/src/main/webapp/print/.gitignore new file mode 100644 index 000000000..a13633799 --- /dev/null +++ b/navalplanner-webapp/src/main/webapp/print/.gitignore @@ -0,0 +1 @@ +*.pdf