You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@myfaces.apache.org by lo...@apache.org on 2016/10/21 20:04:23 UTC

svn commit: r1766115 - in /myfaces/tobago/trunk: tobago-core/src/main/java/org/apache/myfaces/tobago/component/ tobago-core/src/main/java/org/apache/myfaces/tobago/internal/taglib/component/ tobago-theme/tobago-theme-standard/src/main/java/org/apache/m...

Author: lofwyr
Date: Fri Oct 21 20:04:23 2016
New Revision: 1766115

URL: http://svn.apache.org/viewvc?rev=1766115&view=rev
Log:
TOBAGO-1578: tc:sheet behavior of showHeader and columns are different to Tobago2
tc:sheet behavior of showHeader and columns are different to Tobago2
* deprecated attribute "forceVerticalScrollBar" removed
* bugfix: <tc:style maxHeight> and <tc:style height> can now used in
<tc:sheet> without shrinking the header.
* bugfix: if no horizontal scrollbar is shown, the position of the bar
is set to 0
* columns of header and body are now among each other if the scroll bar
is on the right
* resizing now work with <tc:columnEvent>
* width of body columns is now updated instant while resizing
[developed by hnoeth]

Modified:
    myfaces/tobago/trunk/tobago-core/src/main/java/org/apache/myfaces/tobago/component/Attributes.java
    myfaces/tobago/trunk/tobago-core/src/main/java/org/apache/myfaces/tobago/internal/taglib/component/SheetTagDeclaration.java
    myfaces/tobago/trunk/tobago-theme/tobago-theme-standard/src/main/java/org/apache/myfaces/tobago/renderkit/html/standard/standard/tag/SheetRenderer.java
    myfaces/tobago/trunk/tobago-theme/tobago-theme-standard/src/main/resources/org/apache/myfaces/tobago/renderkit/html/standard/standard/script/tobago-sheet.js
    myfaces/tobago/trunk/tobago-theme/tobago-theme-standard/src/main/resources/org/apache/myfaces/tobago/renderkit/html/standard/standard/style/tobago.css

Modified: myfaces/tobago/trunk/tobago-core/src/main/java/org/apache/myfaces/tobago/component/Attributes.java
URL: http://svn.apache.org/viewvc/myfaces/tobago/trunk/tobago-core/src/main/java/org/apache/myfaces/tobago/component/Attributes.java?rev=1766115&r1=1766114&r2=1766115&view=diff
==============================================================================
--- myfaces/tobago/trunk/tobago-core/src/main/java/org/apache/myfaces/tobago/component/Attributes.java (original)
+++ myfaces/tobago/trunk/tobago-core/src/main/java/org/apache/myfaces/tobago/component/Attributes.java Fri Oct 21 20:04:23 2016
@@ -81,11 +81,6 @@ public enum Attributes {
   frequency,
   focus,
   focusId,
-  /**
-   * @deprecated since Tobago 3.0.0
-   */
-  @Deprecated
-  forceVerticalScrollbar,
   formatPattern,
   forValue("for"),
   globalOnly,

Modified: myfaces/tobago/trunk/tobago-core/src/main/java/org/apache/myfaces/tobago/internal/taglib/component/SheetTagDeclaration.java
URL: http://svn.apache.org/viewvc/myfaces/tobago/trunk/tobago-core/src/main/java/org/apache/myfaces/tobago/internal/taglib/component/SheetTagDeclaration.java?rev=1766115&r1=1766114&r2=1766115&view=diff
==============================================================================
--- myfaces/tobago/trunk/tobago-core/src/main/java/org/apache/myfaces/tobago/internal/taglib/component/SheetTagDeclaration.java (original)
+++ myfaces/tobago/trunk/tobago-core/src/main/java/org/apache/myfaces/tobago/internal/taglib/component/SheetTagDeclaration.java Fri Oct 21 20:04:23 2016
@@ -128,20 +128,6 @@ public interface SheetTagDeclaration
   void setDirectLinkCount(String directLinkCount);
 
   /**
-   * Flag indicating whether or not this sheet should reserve space for
-   * vertical toolbar when calculating column width's.<br>
-   * Possible values are: <pre>
-   *      'auto'  : sheet try to estimate the need of scrollbar.
-   *      'true'  : space for scrollbar is reserved.
-   *      'false' : no space is reserved.
-   *      </pre>
-   */
-  @TagAttribute
-  @UIComponentTagAttribute(defaultValue = "auto",
-      allowedValues = {"auto", "true", "false"})
-  void setForceVerticalScrollbar(String forceVerticalScrollbar);
-
-  /**
    * Flag indicating whether or not a range of direct paging links should be
    * rendered in the sheet's footer.
    */

Modified: myfaces/tobago/trunk/tobago-theme/tobago-theme-standard/src/main/java/org/apache/myfaces/tobago/renderkit/html/standard/standard/tag/SheetRenderer.java
URL: http://svn.apache.org/viewvc/myfaces/tobago/trunk/tobago-theme/tobago-theme-standard/src/main/java/org/apache/myfaces/tobago/renderkit/html/standard/standard/tag/SheetRenderer.java?rev=1766115&r1=1766114&r2=1766115&view=diff
==============================================================================
--- myfaces/tobago/trunk/tobago-theme/tobago-theme-standard/src/main/java/org/apache/myfaces/tobago/renderkit/html/standard/standard/tag/SheetRenderer.java (original)
+++ myfaces/tobago/trunk/tobago-theme/tobago-theme-standard/src/main/java/org/apache/myfaces/tobago/renderkit/html/standard/standard/tag/SheetRenderer.java Fri Oct 21 20:04:23 2016
@@ -243,12 +243,7 @@ public class SheetRenderer extends Rende
       writer.writeNameAttribute(sheetId + SUFFIX_WIDTHS);
       writer.writeAttribute(HtmlAttributes.TYPE, HtmlInputTypes.HIDDEN);
       if (definedColumnWidths) {
-        final List<Integer> encodedWidths = new ArrayList<Integer>(columnWidths.size());
-        for (int i = 0; i < columns.size(); i++) {
-          final Integer width = columnWidths.get(i);
-          encodedWidths.add(width > -1 ? width : 100);
-        }
-        writer.writeAttribute(HtmlAttributes.VALUE, JsonUtils.encode(encodedWidths), false);
+        writer.writeAttribute(HtmlAttributes.VALUE, JsonUtils.encode(columnWidths), false);
       }
       writer.endElement(HtmlElements.INPUT);
 
@@ -256,11 +251,14 @@ public class SheetRenderer extends Rende
       writer.writeIdAttribute(sheetId + SUFFIX_COLUMN_RENDERED);
       writer.writeNameAttribute(sheetId + SUFFIX_COLUMN_RENDERED);
       writer.writeAttribute(HtmlAttributes.TYPE, HtmlInputTypes.HIDDEN);
-      final String[] encodedRendered = new String[columns.size()];
-      for (int i = 0; i < encodedRendered.length; i++) {
-        encodedRendered[i] = columns.get(i).isRendered() ? "true" : "false";
+      final ArrayList<String> encodedRendered = new ArrayList<String>();
+      for (AbstractUIColumnBase column : columns) {
+        if (!(column instanceof AbstractUIColumnEvent)) {
+          encodedRendered.add(Boolean.toString(column.isRendered()));
+        }
       }
-      writer.writeAttribute(HtmlAttributes.VALUE, JsonUtils.encode(encodedRendered), false);
+      writer.writeAttribute(HtmlAttributes.VALUE,
+          JsonUtils.encode(encodedRendered.toArray(new String[encodedRendered.size()])), false);
       writer.endElement(HtmlElements.INPUT);
     }
 
@@ -309,7 +307,7 @@ public class SheetRenderer extends Rende
           sheetMarkup.contains(Markup.SMALL) ? BootstrapClass.TABLE_SM : null,
           !autoLayout ? TobagoClass.TABLE_LAYOUT__FIXED : null);
 
-      writeColgroup(writer, columnWidths, columns);
+      writeColgroup(writer, columnWidths, columns, true);
 
       writer.startElement(HtmlElements.TBODY);
       encodeHeaderRows(facesContext, sheet, writer, columns);
@@ -343,7 +341,7 @@ public class SheetRenderer extends Rende
     }
 
     if (!autoLayout) {
-      writeColgroup(writer, columnWidths, columns);
+      writeColgroup(writer, columnWidths, columns, false);
     }
 
     // Print the Content
@@ -699,21 +697,25 @@ public class SheetRenderer extends Rende
       final List<Integer> columnWidths, final List<AbstractUIColumnBase> columns, final List<Integer> samples) {
     // we have to fill the non rendered positions with some values.
     // on client site, we don't know nothing about the non-rendered columns.
-    for (int i = 0, j = 0; i < columns.size(); i++) {
-      AbstractUIColumnBase column = columns.get(i);
-      Integer newValue;
-      if (j < samples.size()) {
-        newValue = samples.get(j);
-        j++;
-      } else {
-        newValue = null;
-      }
-      if (columnWidths.size() > i) {
-        if (newValue != null) {
-          columnWidths.set(i, newValue);
+    int i = 0;
+    int j = 0;
+    for (AbstractUIColumnBase column : columns) {
+      if (column instanceof org.apache.myfaces.tobago.component.UIColumn) {
+        Integer newValue;
+        if (j < samples.size()) {
+          newValue = samples.get(j);
+          j++;
+        } else {
+          newValue = null;
         }
-      } else {
-        columnWidths.add(newValue != null ? newValue : -1); // -1 means unknown or undefined
+        if (columnWidths.size() > i) {
+          if (newValue != null) {
+            columnWidths.set(i, newValue);
+          }
+        } else {
+          columnWidths.add(newValue != null ? newValue : -1); // -1 means unknown or undefined
+        }
+        i++;
       }
     }
   }
@@ -765,7 +767,6 @@ public class SheetRenderer extends Rende
 
           final UIComponent cellComponent = cell.getComponent();
 
-          writer.startElement(HtmlElements.DIV);
           final CssItem align;
           final String alignString = ComponentUtils.getStringAttribute(column, Attributes.align);
           if(multiHeader && cell.getColumnSpan() > 1) {
@@ -890,47 +891,55 @@ public class SheetRenderer extends Rende
           writer.endElement(HtmlElements.SPAN);
           if (!autoLayout) {
             if (column.isResizable()) {
-              encodeResizing(writer, sheet, j + cell.getColumnSpan() - 1);
+              encodeResizing(writer, sheet, j - offset + cell.getColumnSpan() - 1);
             }
           }
-          writer.endElement(HtmlElements.DIV);
 
           writer.endElement(HtmlElements.TH);
         }
         }
       }
       if (!autoLayout) {
-        // add a filler column
-        writer.startElement(HtmlElements.TH);
-        writer.startElement(HtmlElements.DIV);
-        // todo: is the filler class needed here?
-        writer.writeClassAttribute(Classes.create(sheet, "headerCell", Markup.FILLER));
-        writer.startElement(HtmlElements.SPAN);
-        writer.writeClassAttribute(Classes.create(sheet, "header"));
-        final Style headerStyle = new Style();
-        headerStyle.setHeight(Measure.valueOf(14)); // XXX todo
-        writer.writeStyleAttribute(headerStyle);
-        writer.endElement(HtmlElements.SPAN);
-        writer.endElement(HtmlElements.DIV);
-        writer.endElement(HtmlElements.TH);
+        // Add two filler columns. The second one get the size of the scrollBar via JavaScript.
+        encodeHeaderFiller(writer, sheet);
+        encodeHeaderFiller(writer, sheet);
       }
 
       writer.endElement(HtmlElements.TR);
     }
   }
 
+  private void encodeHeaderFiller(final TobagoResponseWriter writer, final UISheet sheet) throws IOException {
+    writer.startElement(HtmlElements.TH);
+    writer.writeClassAttribute(Classes.create(sheet, "headerCell", Markup.FILLER));
+    writer.startElement(HtmlElements.SPAN);
+    writer.writeClassAttribute(Classes.create(sheet, "header"));
+    final Style headerStyle = new Style();
+    headerStyle.setHeight(Measure.valueOf(14)); // XXX todo
+    writer.writeStyleAttribute(headerStyle);
+    writer.endElement(HtmlElements.SPAN);
+    writer.endElement(HtmlElements.TH);
+  }
+
   private void writeColgroup(
       final TobagoResponseWriter writer, final List<Integer> columnWidths,
-      final List<AbstractUIColumnBase> columns) throws IOException {
+      final List<AbstractUIColumnBase> columns, boolean isHeader) throws IOException {
     writer.startElement(HtmlElements.COLGROUP);
-    for (int i = 0; i < columns.size(); i++) {
-      final AbstractUIColumnBase column =  columns.get(i);
-      if (column.isRendered() && !(column instanceof AbstractUIColumnEvent)) {
-        final Integer width = columnWidths.get(i);
-        writeCol(writer, width >= 0 ? width : null);
+
+    int i = 0;
+    for (AbstractUIColumnBase column : columns) {
+      if (column instanceof org.apache.myfaces.tobago.component.UIColumn) {
+        if (column.isRendered()) {
+          final Integer width = columnWidths.get(i);
+          writeCol(writer, width >= 0 ? width : null);
+        }
+        i++;
       }
     }
     writeCol(writer, null); // extra entry for resizing...
+    if (isHeader) {
+      writeCol(writer, null); // extra entry for headerFiller
+    }
     // TODO: the value should be added to the list
     writer.endElement(HtmlElements.COLGROUP);
   }

Modified: myfaces/tobago/trunk/tobago-theme/tobago-theme-standard/src/main/resources/org/apache/myfaces/tobago/renderkit/html/standard/standard/script/tobago-sheet.js
URL: http://svn.apache.org/viewvc/myfaces/tobago/trunk/tobago-theme/tobago-theme-standard/src/main/resources/org/apache/myfaces/tobago/renderkit/html/standard/standard/script/tobago-sheet.js?rev=1766115&r1=1766114&r2=1766115&view=diff
==============================================================================
--- myfaces/tobago/trunk/tobago-theme/tobago-theme-standard/src/main/resources/org/apache/myfaces/tobago/renderkit/html/standard/standard/script/tobago-sheet.js (original)
+++ myfaces/tobago/trunk/tobago-theme/tobago-theme-standard/src/main/resources/org/apache/myfaces/tobago/renderkit/html/standard/standard/script/tobago-sheet.js Fri Oct 21 20:04:23 2016
@@ -149,7 +149,7 @@ Tobago.Sheet.setup2 = function (sheets)
         var $bodyTable = $sheet.children("div").children("table");
         var $bodyCol = $bodyTable.children("colgroup").children("col");
 
-        console.assert($headerCol.length == $bodyCol.length, "header and body column number doesn't match");  // @DEV_ONLY
+        console.assert($headerCol.length - 1 == $bodyCol.length, "header and body column number doesn't match");  // @DEV_ONLY
 
         var i;
         var sumRelative = 0;
@@ -193,6 +193,7 @@ Tobago.Sheet.setup2 = function (sheets)
         }
       }
     }
+    Tobago.Sheet.addHeaderFillerWidth($sheet);
   });
 
   // resize: mouse events
@@ -202,44 +203,42 @@ Tobago.Sheet.setup2 = function (sheets)
     });
     jQuery(this).mousedown(function (event) {
       // begin resizing
-//      console.log("begin");
-//      console.log(event);
       console.info("down"); // @DEV_ONLY
       var columnIndex = jQuery(this).data("tobago-column-index");
       var body = jQuery("body");
-      var column = jQuery(this).closest("table").children("colgroup").children("col").eq(columnIndex);
-      var filler = column.siblings("col:last");
+      var sheet = jQuery(this).closest(".tobago-sheet");
+      var headerTable = sheet.find(".tobago-sheet-headerTable");
+      var bodyTable = sheet.find(".tobago-sheet-bodyTable");
+      var headerColumn = headerTable.children("colgroup").children("col").eq(columnIndex);
+      var bodyColumn = bodyTable.children("colgroup").children("col").eq(columnIndex);
       var data = {
         columnIndex: columnIndex,
         originalClientX: event.clientX,
-        column: column,
-        originalColumnWidth: parseInt(column.attr("width")),
-        filler: filler,
-        originalFillerWidth: parseInt(filler.attr("width"))
+        headerColumn: headerColumn,
+        bodyColumn: bodyColumn,
+        originalHeaderColumnWidth: parseInt(headerColumn.attr("width"))
       };
+
+      // Set width attribute: Avoid scrollBar position flip to 0.
+      headerTable.css("width", headerTable.outerWidth());
+      bodyTable.css("width", bodyTable.outerWidth());
+
       body.on("mousemove", data, function(event) {
         console.info("move"); // @DEV_ONLY
         var delta = event.clientX - event.data.originalClientX;
-//        console.log("columnResize(): " + event.data.columnIndex + ", delta: " + delta);
-        delta = - Math.min(-delta, event.data.originalColumnWidth - 10);
-        var columnWidth = event.data.originalColumnWidth + delta;
-        var fillerWidth = Math.max(event.data.originalFillerWidth - delta, 0);
-        event.data.column.attr("width", columnWidth);
-        event.data.filler.attr("width", fillerWidth);
-        var sum = 0;
-        column.parent().children("col").each(function() {
-          sum += parseInt(jQuery(this).attr("width"));
-        });
-        Tobago.Sheet.resetInputFieldSize(column.closest("table"));
+        delta = -Math.min(-delta, event.data.originalHeaderColumnWidth - 10);
+        var columnWidth = event.data.originalHeaderColumnWidth + delta;
+        event.data.headerColumn.attr("width", columnWidth);
+        event.data.bodyColumn.attr("width", columnWidth);
+        Tobago.Sheet.resetInputFieldSize(headerColumn.closest("table"));
         Tobago.clearSelection();
         return false;
       });
-      body.one("mouseup", {sheet: jQuery(this).closest(".tobago-sheet")}, function (event) {
+      body.one("mouseup", function(event) {
         // switch off the mouse move listener
         jQuery("body").off("mousemove");
         console.info("up"); // @DEV_ONLY
         // copy the width values from the header to the body, (and build a list of it)
-        var sheet = event.data.sheet;
         var tokens = sheet.data("tobago-layout").columns;
         var rendered = jQuery.parseJSON(Tobago.Sheet.findHiddenRendered(sheet).val());
         var hidden = Tobago.Sheet.findHiddenWidths(sheet);
@@ -247,8 +246,6 @@ Tobago.Sheet.setup2 = function (sheets)
         if (hidden.length > 0 && hidden.val()) {
           hiddenWidths = jQuery.parseJSON(hidden.val());
         }
-        var headerTable = sheet.find(".tobago-sheet-headerTable");
-        var bodyTable = sheet.find(".tobago-sheet-bodyTable");
         var headerCols = headerTable.find("col");
         var bodyCols = bodyTable.find("col");
         var widths = [];
@@ -296,30 +293,9 @@ Tobago.Sheet.setup2 = function (sheets)
             }
           }
         }
-        // adjust filler space
-        var bodyDiv = bodyTable.parent();
-        var bodyDivWidth = bodyDiv.css("width").replace("px", "") * 1;
-        console.log("usedWidth : " + usedWidth); // @DEV_ONLY
-        console.log("bodyDivWidth : " + bodyDivWidth); // @DEV_ONLY
-        var bodyHeight = bodyDiv.css("height").replace("px", "");
-        var scrollHeight = bodyDiv.prop("scrollHeight");
-        console.log("bodyHeight : " + bodyHeight); // @DEV_ONLY
-        console.log("scrollHeight : " + scrollHeight); // @DEV_ONLY
-
-        var headerFillerWidth = 0;
-        var bodyFillerWidth = 0;
-        if (usedWidth <= bodyDivWidth) {
-          bodyFillerWidth = bodyDivWidth - usedWidth;
-          headerFillerWidth = bodyFillerWidth;
-          bodyTable.css("width", bodyDivWidth);
-        } else {
-          bodyTable.css("width", usedWidth);
-        }
-
-        console.log("SET fillerWidth : " + headerFillerWidth); // @DEV_ONLY
-// TBD filler width seams not to be needed?        widths = widths + headerFillerWidth + ",";
-        bodyCols.last().attr("width", bodyFillerWidth);
-        headerCols.last().attr("width", headerFillerWidth);
+        // Remove width attribute: Avoid scrollBar position flip to 0.
+        headerTable.css("width", "");
+        bodyTable.css("width", "");
 
         // store the width values in a hidden field
         Tobago.Sheet.findHiddenWidths(sheet).val(JSON.stringify(widths));
@@ -476,29 +452,6 @@ Tobago.Sheet.setup2 = function (sheets)
   });
 };
 
-Tobago.Sheet.adjustTableWidth = function(bodyDiv) {
-  var bodyHeight = bodyDiv.css("height").replace("px", "");
-  var scrollHeight = bodyDiv.prop("scrollHeight");
-  console.log("bodyHeight : " + bodyHeight); // @DEV_ONLY
-  console.log("scrollHeight : " + scrollHeight); // @DEV_ONLY
-  if (bodyHeight >= scrollHeight) {
-    var table = bodyDiv.find("table");
-    var bodyDivWidth = bodyDiv.css("width").replace("px", "") * 1;
-    console.log("bodyDivWidth : " + bodyDivWidth); // @DEV_ONLY
-    var tableWidth = table.css("width").replace("px", "") * 1;
-    console.log("tableWidth : " + tableWidth); // @DEV_ONLY
-    if (tableWidth < bodyDivWidth) {
-
-      var fillerWidth = bodyDiv.prev().find("col").last().attr("width").replace("px", "") * 1;
-      console.log("set filler col width : " + fillerWidth); // @DEV_ONLY
-      table.find("col").last().attr("width", fillerWidth);
-
-      console.log("set table width : " + bodyDivWidth); // @DEV_ONLY
-      table.css("width", bodyDivWidth);
-    }
-  }
-};
-
 Tobago.Sheet.hideInputOrSubmit = function(input) {
   var output = input.siblings(".tobago-sheet-pagingOutput");
   var changed = output.html() != input.val();
@@ -533,6 +486,19 @@ Tobago.Sheet.findHiddenRendered = functi
   return jQuery(Tobago.Utils.escapeClientId(id));
 };
 
+Tobago.Sheet.addHeaderFillerWidth = function($sheet) {
+  var $headerTable = $sheet.find(".tobago-sheet-headerTable");
+  var $headerCols = $headerTable.find("col");
+  $headerCols.last().attr("width", Tobago.Sheet.getScrollBarSize());
+};
+
+Tobago.Sheet.getScrollBarSize = function() {
+  var $outer = $('<div>').css({visibility: 'hidden', width: 100, overflow: 'scroll'}).appendTo('body'),
+      widthWithScroll = $('<div>').css({width: '100%'}).appendTo($outer).outerWidth();
+  $outer.remove();
+  return 100 - widthWithScroll;
+};
+
 Tobago.Sheet.prototype.setup = function() {
   console.time("[tobago-sheet] setup"); // @DEV_ONLY
   this.initReload();

Modified: myfaces/tobago/trunk/tobago-theme/tobago-theme-standard/src/main/resources/org/apache/myfaces/tobago/renderkit/html/standard/standard/style/tobago.css
URL: http://svn.apache.org/viewvc/myfaces/tobago/trunk/tobago-theme/tobago-theme-standard/src/main/resources/org/apache/myfaces/tobago/renderkit/html/standard/standard/style/tobago.css?rev=1766115&r1=1766114&r2=1766115&view=diff
==============================================================================
--- myfaces/tobago/trunk/tobago-theme/tobago-theme-standard/src/main/resources/org/apache/myfaces/tobago/renderkit/html/standard/standard/style/tobago.css (original)
+++ myfaces/tobago/trunk/tobago-theme/tobago-theme-standard/src/main/resources/org/apache/myfaces/tobago/renderkit/html/standard/standard/style/tobago.css Fri Oct 21 20:04:23 2016
@@ -579,6 +579,11 @@ p.tobago-separator:after {
 
 /* sheet -------------------------------------------------------------- */
 
+.tobago-sheet-header {
+  overflow: hidden;
+  flex-shrink: 0;
+}
+
 .tobago-sheet {
   display: flex;
   flex-direction: column;
@@ -596,6 +601,10 @@ p.tobago-separator:after {
   text-align: justify;
 }
 
+.tobago-sheet-cell-markup-filler {
+  padding: 0 !important; /* fix for IE 11 */
+}
+
 .tobago-sheet-footer {
   text-align: center;
 }
@@ -634,6 +643,10 @@ p.tobago-separator:after {
   table-layout: fixed;
 }
 
+.tobago-sheet-headerCell-markup-filler {
+  border-width: 0 !important;
+}
+
 .tobago-sheet-headerCell {
   position: relative;
 }