--- /dev/null
+/*
+ * $Id: UnknownElementWizardPage.java,v 1.2 2006-10-21 23:18:43 pombredanne Exp $
+ * Copyright Narushima Hironori. All rights reserved.
+ */
+package net.sourceforge.phpeclipse.wizards.html;
+
+import java.util.ArrayList;
+
+import org.eclipse.jface.dialogs.IInputValidator;
+import org.eclipse.jface.viewers.ArrayContentProvider;
+import org.eclipse.jface.viewers.CellEditor;
+import org.eclipse.jface.viewers.ICellModifier;
+import org.eclipse.jface.viewers.ILabelProviderListener;
+import org.eclipse.jface.viewers.IStructuredSelection;
+import org.eclipse.jface.viewers.ITableLabelProvider;
+import org.eclipse.jface.viewers.TableViewer;
+import org.eclipse.jface.viewers.TextCellEditor;
+import org.eclipse.jface.window.Window;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.events.SelectionEvent;
+import org.eclipse.swt.events.SelectionListener;
+import org.eclipse.swt.graphics.Image;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.layout.GridLayout;
+import org.eclipse.swt.widgets.Button;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Item;
+import org.eclipse.swt.widgets.Label;
+import org.eclipse.swt.widgets.Table;
+import org.eclipse.swt.widgets.TableColumn;
+import org.w3c.dom.Element;
+import org.w3c.dom.NamedNodeMap;
+import org.w3c.dom.Node;
+
+/**
+ *
+ *
+ */
+public class UnknownElementWizardPage extends EditElementWizardPage {
+
+ // key of TableCell for attribute editor.
+ final static String NAME = "ColumnProperty-name",
+ VALUE = "ColumnProperty-value";
+
+ Button emptyElementCheck, addButton, removeButton, upButton, downButton;
+
+ TableViewer unknownElementAttrs;
+
+ ArrayList attrs = new ArrayList(), listeners = new ArrayList();
+
+ SelectionListener elemTypeChangeListener = new SelectionListener() {
+ public void widgetSelected(SelectionEvent e) {
+ refreshPreview();
+ }
+
+ public void widgetDefaultSelected(SelectionEvent e) {
+ }
+ };
+
+ public UnknownElementWizardPage() {
+ super("UnknownElementEditPage");
+ setTitle("Unknown");
+ setDescription("Editor for any HTML element.");
+ }
+
+ static IInputValidator attrValidator = new IInputValidator() {
+ public String isValid(String newText) {
+ if (newText.length() == 0) {
+ return "Need to specify name";
+ }
+ if (newText.indexOf(' ') != -1 || newText.indexOf('\n') != -1
+ || newText.indexOf('\t') != -1) {
+ return "Not contain blank";
+ }
+ return null;
+ }
+ };
+
+ protected void createChildControl(Composite parent) {
+ // empty eleemnt
+ parent.setLayout(new GridLayout(2, false));
+
+ // // attribute editor
+ Label labe = new Label(parent, SWT.NONE);
+ labe.setText("Element &Attribute:");
+ GridData gd = new GridData(GridData.HORIZONTAL_ALIGN_BEGINNING);
+ labe.setLayoutData(gd);
+ new Label(parent, SWT.NONE);
+
+ // attribute display table setting
+ unknownElementAttrs = new TableViewer(parent, SWT.BORDER | SWT.SINGLE
+ | SWT.FULL_SELECTION);
+ gd = new GridData(GridData.FILL_BOTH);
+ gd.horizontalSpan = 1;
+ gd.verticalSpan = 4;
+ unknownElementAttrs.getControl().setLayoutData(gd);
+
+ final Table table = unknownElementAttrs.getTable();
+ new TableColumn(table, SWT.LEFT).setText("Name");
+ new TableColumn(table, SWT.LEFT).setText("Value");
+
+ table.setLinesVisible(true);
+ table.setHeaderVisible(true);
+ // modifier setting
+ unknownElementAttrs.setColumnProperties(new String[] { NAME, VALUE });
+ unknownElementAttrs.setContentProvider(new ArrayContentProvider());
+
+ unknownElementAttrs.setCellEditors(new CellEditor[] {
+ new TextCellEditor(table), new TextCellEditor(table) });
+ unknownElementAttrs.setCellModifier(new ICellModifier() {
+ public boolean canModify(Object element, String property) {
+ return true;
+ }
+
+ public Object getValue(Object element, String property) {
+ return ((String[]) element)[property.equals(NAME) ? 0 : 1];
+ }
+
+ public void modify(Object element, String property, Object value) {
+ if (element instanceof Item) {
+ ((String[]) ((Item) element).getData())[property
+ .equals(NAME) ? 0 : 1] = HTMLUtilities
+ .unescape((String) value);
+ refreshPreview();
+ }
+ }
+ });
+
+ unknownElementAttrs.setLabelProvider(new ITableLabelProvider() {
+ public Image getColumnImage(Object element, int columnIndex) {
+ return null;
+ }
+
+ public String getColumnText(Object element, int columnIndex) {
+ return ((String[]) element)[columnIndex];
+ }
+
+ public void addListener(ILabelProviderListener listener) {
+ }
+
+ public void removeListener(ILabelProviderListener listener) {
+ }
+
+ public void dispose() {
+ }
+
+ public boolean isLabelProperty(Object element, String property) {
+ return property.equals(NAME) || property.equals(VALUE);
+ }
+ });
+
+ resetAttributes();
+ unknownElementAttrs.setInput(attrs);
+
+ TableColumn[] columns = table.getColumns();
+ for (int i = 0; i < columns.length; i++) {
+ columns[i].pack();
+ }
+
+ // buttonss
+ upButton = createButton(parent, "&Up");
+ upButton.addSelectionListener(new SelectionListener() {
+
+ public void widgetSelected(SelectionEvent e) {
+ int index = getSelectionIndex();
+ if (index > 0) {
+ attrs.add(index - 1, attrs.remove(index));
+ refreshPreview();
+ }
+ }
+
+ public void widgetDefaultSelected(SelectionEvent e) {
+ }
+ });
+
+ downButton = createButton(parent, "&Down");
+ downButton.addSelectionListener(new SelectionListener() {
+ public void widgetSelected(SelectionEvent e) {
+ int index = getSelectionIndex();
+ if (index < attrs.size() - 1) {
+ attrs.add(index + 1, attrs.remove(index));
+ refreshPreview();
+ }
+ }
+
+ public void widgetDefaultSelected(SelectionEvent e) {
+ }
+ });
+
+ addButton = createButton(parent, "&Add");
+ addButton.addSelectionListener(new SelectionListener() {
+ public void widgetSelected(SelectionEvent e) {
+ //int insertIndex = getSelectionIndex();
+ String[] newData = inputValue();
+ if (newData != null) {
+ attrs.add(newData);
+ refreshPreview();
+ }
+ }
+
+ String[] inputValue() {
+ SomeItemInputDialog dialog = new SomeItemInputDialog(
+ getShell(), "Input new attribute", new String[] {
+ "Attribute name", "Attribute value" },
+ new IInputValidator[] { attrValidator, null });
+
+ if (dialog.open() == Window.OK) {
+ return dialog.getValues();
+ }
+ return null;
+ }
+
+ public void widgetDefaultSelected(SelectionEvent e) {
+ }
+ });
+
+ removeButton = createButton(parent, "&Remove");
+ removeButton.addSelectionListener(new SelectionListener() {
+ public void widgetSelected(SelectionEvent e) {
+ int index = getSelectionIndex();
+ if (index != -1) {
+ attrs.remove(index);
+ refreshPreview();
+ }
+ }
+
+ public void widgetDefaultSelected(SelectionEvent e) {
+ }
+ });
+
+ emptyElementCheck = new Button(parent, SWT.CHECK);
+ gd = new GridData(GridData.FILL_HORIZONTAL);
+ emptyElementCheck.setLayoutData(gd);
+ emptyElementCheck.setText("&Empty Element");
+ emptyElementCheck.addSelectionListener(elemTypeChangeListener);
+ emptyElementCheck.setSelection(isEmptyAsText());
+
+ new Label(parent, SWT.NONE);
+ }
+
+ static Button createButton(Composite parent, String text) {
+ Button button = new Button(parent, SWT.PUSH);
+ GridData gd = new GridData(GridData.VERTICAL_ALIGN_BEGINNING
+ | GridData.HORIZONTAL_ALIGN_END);
+ gd.widthHint = 60;
+ button.setLayoutData(gd);
+ button.setText(text);
+ return button;
+ }
+
+ public String getPreviewText() {
+ String elemName = getElementName();
+ if (elemName == null) {
+ return null;
+ }
+
+ // sets values
+
+ boolean empty = false;
+ if (emptyElementCheck == null) {
+ // ui uninitialized
+ empty = isEmptyAsText();
+ } else {
+ // ui initialized
+ empty = emptyElementCheck.getSelection();
+ }
+
+ String content = getSelectionText();
+ if (!empty && getEditType() == MODIFY) {
+ content = chooseContent(content);
+ }
+
+ String previewText = "<" + elemName + attrsCode();
+ if (empty) {
+ previewText += " />";
+ } else {
+ previewText += ">" + content + "</" + elemName + ">";
+ }
+ return previewText;
+ }
+
+ boolean isEmptyAsText() {
+ String selText = getSelectionText();
+ if (getEditType() == MODIFY) {
+ int len = selText.length();
+ return selText.substring(len - 2, len).equals("/>");
+ }
+ return false;
+ }
+
+ void resetAttributes() {
+ attrs.clear();
+
+ Element elem = getParsedSelectionText();
+ if (elem != null) {
+ NamedNodeMap as = elem.getAttributes();
+ for (int i = 0; i < as.getLength(); i++) {
+ Node n = as.item(i);
+ attrs.add(new String[] { n.getNodeName(), n.getNodeValue() });
+ }
+ }
+ }
+
+ String attrsCode() {
+ StringBuffer buff = new StringBuffer();
+ Object[] as = attrs.toArray();
+ for (int i = 0; i < as.length; i++) {
+ String[] a = (String[]) as[i];
+ buff.append(" " + a[0] + "=\"" + HTMLUtilities.escape(a[1]) + "\"");
+ }
+ return buff.toString();
+ }
+
+ int getSelectionIndex() {
+ Object sel = unknownElementAttrs.getSelection();
+ if (sel instanceof IStructuredSelection) {
+ Object item = ((IStructuredSelection) sel).getFirstElement();
+ return attrs.indexOf(item);
+ } else {
+ return -1;
+ }
+ }
+
+ public void refreshPreview() {
+ unknownElementAttrs.refresh();
+ super.refreshPreview();
+ }
+
+ public void setElementName(String elemName) {
+ super.setElementName(elemName);
+ setTitle("\"" + elemName + "\" Element");
+ }
+
+}
\ No newline at end of file