X-Git-Url: http://secure.phpeclipse.com diff --git a/net.sourceforge.phpeclipse.ui/src/net/sourceforge/phpeclipse/wizards/html/UnknownElementWizardPage.java b/net.sourceforge.phpeclipse.ui/src/net/sourceforge/phpeclipse/wizards/html/UnknownElementWizardPage.java new file mode 100644 index 0000000..817451d --- /dev/null +++ b/net.sourceforge.phpeclipse.ui/src/net/sourceforge/phpeclipse/wizards/html/UnknownElementWizardPage.java @@ -0,0 +1,334 @@ +/* + * $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 + ""; + } + 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