improved codetemplate wizards; new html tag wizards
[phpeclipse.git] / net.sourceforge.phpeclipse / src / net / sourceforge / phpeclipse / wizards / html / TableElementWizardPage.java
diff --git a/net.sourceforge.phpeclipse/src/net/sourceforge/phpeclipse/wizards/html/TableElementWizardPage.java b/net.sourceforge.phpeclipse/src/net/sourceforge/phpeclipse/wizards/html/TableElementWizardPage.java
new file mode 100644 (file)
index 0000000..cce7813
--- /dev/null
@@ -0,0 +1,285 @@
+/*
+ * $Id: TableElementWizardPage.java,v 1.1 2004-10-05 20:51:57 jsurfer Exp $
+ * Copyright Narushima Hironori. All rights reserved.
+ */
+package net.sourceforge.phpeclipse.wizards.html;
+
+import java.io.IOException;
+
+import javax.xml.parsers.ParserConfigurationException;
+
+import net.sourceforge.phpeclipse.PHPeclipsePlugin;
+
+import org.eclipse.jface.util.IPropertyChangeListener;
+import org.eclipse.jface.util.PropertyChangeEvent;
+import org.eclipse.jface.viewers.CellEditor;
+import org.eclipse.jface.viewers.ISelectionChangedListener;
+import org.eclipse.jface.viewers.IStructuredSelection;
+import org.eclipse.jface.viewers.SelectionChangedEvent;
+import org.eclipse.jface.viewers.TableViewer;
+import org.eclipse.jface.viewers.TextCellEditor;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.events.ModifyEvent;
+import org.eclipse.swt.events.ModifyListener;
+import org.eclipse.swt.events.SelectionEvent;
+import org.eclipse.swt.events.SelectionListener;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.layout.GridLayout;
+import org.eclipse.swt.widgets.Button;
+import org.eclipse.swt.widgets.Combo;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Label;
+import org.eclipse.swt.widgets.Table;
+import org.eclipse.swt.widgets.TableColumn;
+import org.eclipse.swt.widgets.Text;
+import org.w3c.dom.Element;
+import org.xml.sax.SAXException;
+
+/**
+ * TableElementWizardPage.
+ */
+public class TableElementWizardPage extends EditElementWizardPage {
+
+  final public static int COLUMNS_MAX = 32, ROWS_MAX = 256;
+
+  final static String[] expandStyleLabels = { "Flat", "Table", "Enumerate", };
+
+  TableElementModel model;
+
+  TableViewer viewer;
+
+  CellEditor[] editors;
+
+  Combo expandStyleCombo = null;
+
+  Text colsText, rowsText;
+
+  Button addButton, removeButton, upButton, downButton;
+
+  SelectionListener buttonListener = new SelectionListener() {
+    public void widgetSelected(SelectionEvent ev) {
+      Element e = getCurrentSelection();
+      if (ev.widget == addButton) {
+        model.insertNewRowBefore(e);
+      } else if (ev.widget == removeButton) {
+        model.removeRow(e);
+      } else if (ev.widget == upButton) {
+        model.move(e, -1);
+      } else if (ev.widget == downButton) {
+        model.move(e, 1);
+      }
+      refreshAll();
+    }
+
+    public void widgetDefaultSelected(SelectionEvent e) {
+    }
+  };
+
+  ModifyListener cellCountChangeListener = new ModifyListener() {
+    public void modifyText(ModifyEvent e) {
+      try {
+        if (e.widget == colsText) {
+          int cols = Integer.parseInt(colsText.getText());
+          if (cols < 1)
+            cols = 1;
+          if (cols > COLUMNS_MAX)
+            cols = COLUMNS_MAX;
+          model.setColumnCount(cols);
+        } else if (e.widget == rowsText) {
+          int rows = Integer.parseInt(rowsText.getText());
+          if (rows < 1)
+            rows = 1;
+          if (rows > ROWS_MAX)
+            rows = ROWS_MAX;
+          model.setRowCount(rows);
+        }
+        refreshAll();
+      } catch (NumberFormatException x) {
+      }
+    }
+  };
+
+  public TableElementWizardPage() {
+    super("TableElementWizardPage");
+    setTitle("Table");
+    setDescription("Edit table element and cells modifier.");
+  }
+
+  public String getPreviewText() {
+    if (model == null) {
+      initModel();
+    }
+    return (model != null) ? model.expandCodes() : null;
+  }
+
+  void initModel() {
+    String content = ((EditElementWizard) getWizard()).getSelection().getText().trim();
+    try {
+      model = new TableElementModel(content, getEditType() == NEW);
+    } catch (ParserConfigurationException e) {
+      PHPeclipsePlugin.log(e);
+    } catch (SAXException e) {
+      PHPeclipsePlugin.log(e);
+    } catch (IOException e) {
+      PHPeclipsePlugin.log(e);
+    }
+  }
+
+  protected void createChildControl(Composite parent) {
+    parent.setLayout(new GridLayout(2, false));
+
+    // table settings
+    viewer = new TableViewer(parent, SWT.SINGLE | SWT.FULL_SELECTION | SWT.BORDER);
+    refreshTableHeaderColumns();
+
+    viewer.setContentProvider(new TableElementContentProvider());
+    viewer.setLabelProvider(new TableElementLabelProvider());
+    viewer.setCellModifier(new TableElementCellModifier(new IPropertyChangeListener() {
+      public void propertyChange(PropertyChangeEvent event) {
+        refreshAll();
+      }
+    }));
+
+    viewer.setInput(model);
+    viewer.addSelectionChangedListener(new ISelectionChangedListener() {
+      public void selectionChanged(SelectionChangedEvent event) {
+        refreshButtonState();
+        refreshPreview();
+      }
+    });
+
+    Table table = viewer.getTable();
+    table.setLinesVisible(true);
+    table.setHeaderVisible(true);
+
+    GridData gd = new GridData(GridData.FILL_BOTH);
+    gd.verticalSpan = 2;
+    table.setLayoutData(gd);
+
+    // text input area setting
+    Composite textInputArea = new Composite(parent, SWT.NONE);
+    textInputArea.setLayout(new GridLayout(1, false));
+    textInputArea.setLayoutData(new GridData(GridData.HORIZONTAL_ALIGN_FILL | GridData.VERTICAL_ALIGN_BEGINNING));
+    rowsText = createNumInputText(textInputArea, "&Rows:");
+    colsText = createNumInputText(textInputArea, "&Columns:");
+
+    // button area.
+    Composite buttonArea = new Composite(parent, SWT.NONE);
+    buttonArea.setLayout(new GridLayout(1, false));
+    buttonArea.setLayoutData(new GridData(GridData.HORIZONTAL_ALIGN_FILL | GridData.VERTICAL_ALIGN_END));
+    addButton = createButton(buttonArea, "&Add");
+    removeButton = createButton(buttonArea, "&Remove");
+    upButton = createButton(buttonArea, "&Up");
+    downButton = createButton(buttonArea, "&Down");
+
+    // init state
+    TableColumn[] cols = table.getColumns();
+    for (int i = 0; i < cols.length; i++) {
+      cols[i].pack();
+    }
+    refreshTableLengthText();
+    refreshButtonState();
+  }
+
+  Button createButton(Composite parent, String text) {
+    Button button = new Button(parent, SWT.NONE);
+    button.setLayoutData(new GridData(GridData.HORIZONTAL_ALIGN_FILL));
+    button.setText(text);
+    button.addSelectionListener(buttonListener);
+    return button;
+  }
+
+  Text createNumInputText(Composite parent, String label) {
+    Label labe = new Label(parent, SWT.NONE);
+    labe.setText(label);
+
+    Text text = new Text(parent, SWT.BORDER);
+    text.setLayoutData(new GridData(GridData.HORIZONTAL_ALIGN_FILL));
+    text.setTextLimit(2);
+    text.addVerifyListener(new NumVerifyListener());
+    text.addModifyListener(cellCountChangeListener);
+    return text;
+  }
+
+  void refreshAll() {
+    refreshTableHeaderColumns();
+    refreshTableLengthText();
+    refreshButtonState();
+    refreshPreview();
+    viewer.refresh();
+  }
+
+  void refreshTableHeaderColumns() {
+    if (model == null) {
+      initModel();
+    }
+
+    Table table = viewer.getTable();
+    TableColumn[] cols = table.getColumns();
+    CellEditor[] editors = viewer.getCellEditors();
+
+    String[] props = model.getColumnProperties();
+    viewer.setColumnProperties(props);
+    // modify cell length
+    if (props.length > cols.length) {
+      CellEditor[] newEditors = new CellEditor[props.length];
+      if (editors != null) {
+        System.arraycopy(editors, 0, newEditors, 0, editors.length);
+      }
+      for (int i = cols.length; i < props.length; i++) {
+        TableColumn col = new TableColumn(table, SWT.LEFT);
+        col.setText(TableElementModel.toColumnName(i));
+        newEditors[i] = new TextCellEditor(table);
+      }
+      viewer.setCellEditors(newEditors);
+    } else if (props.length < cols.length) {
+      for (int i = props.length; i < cols.length; i++) {
+        cols[i].dispose();
+        editors[i].dispose();
+      }
+      CellEditor[] newEditors = new CellEditor[props.length];
+      System.arraycopy(editors, 0, newEditors, 0, props.length);
+      viewer.setCellEditors(newEditors);
+    }
+
+    // adjust table fields.
+    viewer.refresh();
+    cols = table.getColumns();
+    for (int i = 0; i < cols.length; i++) {
+      cols[i].pack();
+    }
+  }
+
+  void refreshTableLengthText() {
+    String cols = String.valueOf(model.getColumnCount());
+    if (!cols.equals(colsText.getText())) {
+      colsText.setText(cols);
+    }
+    String rows = String.valueOf(model.getRowCount());
+    if (!rows.equals(rowsText.getText())) {
+      rowsText.setText(rows);
+    }
+  }
+
+  void refreshButtonState() {
+    Element e = getCurrentSelection();
+    boolean enable = (e != null);
+
+    removeButton.setEnabled(enable);
+    int currentIndex = -1;
+    Element[] rows = model.getRows();
+    for (int i = 0; i < rows.length; i++) {
+      if (rows[i].equals(e)) {
+        currentIndex = i;
+      }
+    }
+    upButton.setEnabled(enable && currentIndex > 0);
+    downButton.setEnabled(enable && currentIndex < rows.length - 1);
+  }
+
+  Element getCurrentSelection() {
+    IStructuredSelection sel = (IStructuredSelection) viewer.getSelection();
+    return (sel != null) ? (Element) sel.getFirstElement() : null;
+  }
+
+}
\ No newline at end of file