      /**
       * The constants used in this Content Widget.
       */
      public static interface CwConstants extends Constants,
          ContentWidget.CwConstants {
        String cwFlexTableAddRow();

        String cwFlexTableDescription();

        String cwFlexTableDetails();

        String cwFlexTableName();

        String cwFlexTableRemoveRow();
      }

      /**
       * An instance of the constants.
       */
      private CwConstants constants;

      /**
       * Initialize this example.
       */
      @Override
      public Widget onInitialize() {
        // Create a Flex Table
        final FlexTable flexTable = new FlexTable();
        FlexCellFormatter cellFormatter = flexTable.getFlexCellFormatter();
        flexTable.addStyleName("cw-FlexTable");
        flexTable.setWidth("32em");
        flexTable.setCellSpacing(5);
        flexTable.setCellPadding(3);

        // Add some text
        cellFormatter.setHorizontalAlignment(0, 1,
            HasHorizontalAlignment.ALIGN_LEFT);
        flexTable.setHTML(0, 0, constants.cwFlexTableDetails());
        cellFormatter.setColSpan(0, 0, 2);

        // Add a button that will add more rows to the table
        Button addRowButton = new Button(constants.cwFlexTableAddRow(),
            new ClickHandler() {
              public void onClick(ClickEvent event) {
                addRow(flexTable);
              }
            });
        addRowButton.addStyleName("sc-FixedWidthButton");

        Button removeRowButton = new Button(constants.cwFlexTableRemoveRow(),
            new ClickHandler() {
              public void onClick(ClickEvent event) {
                removeRow(flexTable);
              }
            });
        removeRowButton.addStyleName("sc-FixedWidthButton");
        VerticalPanel buttonPanel = new VerticalPanel();
        buttonPanel.setStyleName("cw-FlexTable-buttonPanel");
        buttonPanel.add(addRowButton);
        buttonPanel.add(removeRowButton);
        flexTable.setWidget(0, 1, buttonPanel);
        cellFormatter.setVerticalAlignment(0, 1, HasVerticalAlignment.ALIGN_TOP);

        // Add two rows to start
        addRow(flexTable);
        addRow(flexTable);

        // Return the panel
        flexTable.ensureDebugId("cwFlexTable");
        return flexTable;
      }

      /**
       * Add a row to the flex table.
       */
      private void addRow(FlexTable flexTable) {
        int numRows = flexTable.getRowCount();
        flexTable.setWidget(numRows, 0, new Image(Showcase.images.gwtLogo()));
        flexTable.setWidget(numRows, 1, new Image(Showcase.images.gwtLogo()));
        flexTable.getFlexCellFormatter().setRowSpan(0, 1, numRows + 1);
      }

      /**
       * Remove a row from the flex table.
       */
      private void removeRow(FlexTable flexTable) {
        int numRows = flexTable.getRowCount();
        if (numRows > 1) {
          flexTable.removeRow(numRows - 1);
          flexTable.getFlexCellFormatter().setRowSpan(0, 1, numRows - 1);
        }
      }