/* * $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"); } }