--- /dev/null
+/*
+ * $Id: UnknownElementWizardPage.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.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