public void run(final IVexWidget vexWidget) {

    final int indexToDup = ActionUtils.getCurrentColumnIndex(vexWidget);
    if (indexToDup == -1) {
      return;
    }

    vexWidget.doWork(
        new Runnable() {
          public void run() {

            final List cellsToDup = new ArrayList();
            ActionUtils.iterateTableCells(
                vexWidget,
                new TableCellCallback() {
                  public void startRow(Object row, int rowIndex) {}

                  public void onCell(Object row, Object cell, int rowIndex, int cellIndex) {
                    if (cellIndex == indexToDup && cell instanceof Element) {
                      cellsToDup.add(cell);
                    }
                  }

                  public void endRow(Object row, int rowIndex) {}
                });

            int finalOffset = -1;
            for (Iterator it = cellsToDup.iterator(); it.hasNext(); ) {
              Element element = (Element) it.next();
              if (finalOffset == -1) {
                finalOffset = element.getStartOffset() + 1;
              }
              vexWidget.moveTo(element.getEndOffset() + 1);
              vexWidget.insertElement((Element) element.clone());
            }

            if (finalOffset != -1) {
              vexWidget.moveTo(finalOffset);
            }
          }
        });
  }
 public boolean isEnabled(IVexWidget vexWidget) {
   return ActionUtils.getCurrentColumnIndex(vexWidget) != -1;
 }