package nota.oxygen.common.table; import java.awt.Component; import java.awt.GridLayout; import javax.swing.JLabel; import javax.swing.JOptionPane; import javax.swing.JPanel; import javax.swing.JSpinner; import javax.swing.SpinnerNumberModel; import org.w3c.dom.Element; import ro.sync.ecss.extensions.api.ArgumentDescriptor; import ro.sync.ecss.extensions.api.ArgumentsMap; import ro.sync.ecss.extensions.api.AuthorOperationException; import nota.oxygen.common.BaseAuthorOperation; import nota.oxygen.common.Utils; /** * @author OHA * */ public class InsertTableOperation extends BaseAuthorOperation { private static String ARG_TABLE_FRAGMENT = "table fragment"; private String tableFragment; private static String ARG_TABLE_HEADER_FRAGMENT = "table header fragment"; private String tableHeaderFragment; private static String ARG_TABLE_BODY_FRAGMENT = "table body fragment"; private String tableBodyFragment; private static String ARG_TABLE_FOOTER_FRAGMENT = "table footer fragment"; private String tableFooterFragment; private static String ARG_TABLE_ROW_FRAGMENT = "table row fragment"; private String tableRowFragment; private static String ARG_TABLE_CELL_FRAGMENT = "table cell fragment"; private String tableCellFragment; private static String ARG_TABLE_HEADER_CELL_FRAGMENT = "table header cell fragment"; private String tableHeaderCellFragment; @Override public ArgumentDescriptor[] getArguments() { return new ArgumentDescriptor[]{ new ArgumentDescriptor(ARG_TABLE_FRAGMENT, ArgumentDescriptor.TYPE_FRAGMENT, "Table fragment"), new ArgumentDescriptor(ARG_TABLE_HEADER_FRAGMENT, ArgumentDescriptor.TYPE_FRAGMENT, "Table header fragment"), new ArgumentDescriptor(ARG_TABLE_FOOTER_FRAGMENT, ArgumentDescriptor.TYPE_FRAGMENT, "Table footer fragment"), new ArgumentDescriptor(ARG_TABLE_BODY_FRAGMENT, ArgumentDescriptor.TYPE_FRAGMENT, "Table body fragment"), new ArgumentDescriptor(ARG_TABLE_ROW_FRAGMENT, ArgumentDescriptor.TYPE_FRAGMENT, "Table row fragment"), new ArgumentDescriptor(ARG_TABLE_CELL_FRAGMENT, ArgumentDescriptor.TYPE_FRAGMENT, "Table call fragment"), new ArgumentDescriptor(ARG_TABLE_HEADER_CELL_FRAGMENT, ArgumentDescriptor.TYPE_FRAGMENT, "Table header cell fragment") }; } @Override protected void parseArguments(ArgumentsMap args) throws IllegalArgumentException { tableFragment = (String)args.getArgumentValue(ARG_TABLE_FRAGMENT); tableHeaderFragment = (String)args.getArgumentValue(ARG_TABLE_HEADER_FRAGMENT); tableFooterFragment = (String)args.getArgumentValue(ARG_TABLE_FOOTER_FRAGMENT); tableBodyFragment = (String)args.getArgumentValue(ARG_TABLE_BODY_FRAGMENT); tableRowFragment = (String)args.getArgumentValue(ARG_TABLE_ROW_FRAGMENT); tableCellFragment = (String)args.getArgumentValue(ARG_TABLE_CELL_FRAGMENT); tableHeaderCellFragment = (String)args.getArgumentValue(ARG_TABLE_HEADER_CELL_FRAGMENT); } @Override public String getDescription() { return "Inserts a table, prompting the user for number of rows and columns (and header rows/footer rows)"; } private void insertRows(int rows, int cols, String cellFragment, Element rowContainer) throws AuthorOperationException { for (int r = 0; r < rows; r++) { Element row = Utils.deserializeElement(tableRowFragment); for (int c = 0; c < cols; c++) { Element cell = Utils.deserializeElement(tableCellFragment); row.appendChild(row.getOwnerDocument().importNode(cell, true)); } rowContainer.appendChild(rowContainer.getOwnerDocument().importNode(row, true)); } } @Override protected void doOperation() throws AuthorOperationException { SpinnerNumberModel colsModel = new SpinnerNumberModel(3, 1, 100, 1); SpinnerNumberModel rowsModel = new SpinnerNumberModel(2, 1, 100, 1); SpinnerNumberModel headerRowsModel = new SpinnerNumberModel(1, 0, 100, 1); SpinnerNumberModel footerRowsModel = new SpinnerNumberModel(0, 0, 100, 1); JPanel panel = new JPanel(new GridLayout(4, 2)); panel.add(new JLabel(getAuthorAccess().getAuthorResourceBundle().getMessage("columns"))); panel.add(new JSpinner(colsModel)); panel.add(new JLabel(getAuthorAccess().getAuthorResourceBundle().getMessage("rows"))); panel.add(new JSpinner(rowsModel)); panel.add(new JLabel(getAuthorAccess().getAuthorResourceBundle().getMessage("header.rows"))); panel.add(new JSpinner(headerRowsModel)); panel.add(new JLabel(getAuthorAccess().getAuthorResourceBundle().getMessage("footer.rows"))); panel.add(new JSpinner(footerRowsModel)); int res = JOptionPane.showConfirmDialog( (Component)getAuthorAccess().getWorkspaceAccess().getParentFrame(), panel, getAuthorAccess().getAuthorResourceBundle().getMessage("insert.table"), JOptionPane.OK_CANCEL_OPTION); if (res != JOptionPane.OK_OPTION) return; getAuthorAccess().getDocumentController().beginCompoundEdit(); int cols = colsModel.getNumber().intValue(); int rows = rowsModel.getNumber().intValue(); int headerRows = headerRowsModel.getNumber().intValue(); int footerRows = footerRowsModel.getNumber().intValue(); Element table = Utils.deserializeElement(tableFragment); if (headerRows > 0) { Element header = Utils.deserializeElement(tableHeaderFragment); insertRows(headerRows, cols, tableHeaderCellFragment, header); table.appendChild(table.getOwnerDocument().importNode(header, true)); } Element body = Utils.deserializeElement(tableBodyFragment); insertRows(rows, cols, tableCellFragment, body); table.appendChild(table.getOwnerDocument().importNode(body, true)); if (footerRows > 0) { Element footer = Utils.deserializeElement(tableFooterFragment); insertRows(footerRows, cols, tableHeaderCellFragment, footer); table.appendChild(table.getOwnerDocument().importNode(footer, true)); } getAuthorAccess().getDocumentController().insertXMLFragment(Utils.serialize(table), getAuthorAccess().getEditorAccess().getCaretOffset()); getAuthorAccess().getDocumentController().endCompoundEdit(); } }