2 * $Id: UnknownElementWizardPage.java,v 1.2 2006-10-21 23:18:43 pombredanne Exp $
3 * Copyright Narushima Hironori. All rights reserved.
5 package net.sourceforge.phpeclipse.wizards.html;
7 import java.util.ArrayList;
9 import org.eclipse.jface.dialogs.IInputValidator;
10 import org.eclipse.jface.viewers.ArrayContentProvider;
11 import org.eclipse.jface.viewers.CellEditor;
12 import org.eclipse.jface.viewers.ICellModifier;
13 import org.eclipse.jface.viewers.ILabelProviderListener;
14 import org.eclipse.jface.viewers.IStructuredSelection;
15 import org.eclipse.jface.viewers.ITableLabelProvider;
16 import org.eclipse.jface.viewers.TableViewer;
17 import org.eclipse.jface.viewers.TextCellEditor;
18 import org.eclipse.jface.window.Window;
19 import org.eclipse.swt.SWT;
20 import org.eclipse.swt.events.SelectionEvent;
21 import org.eclipse.swt.events.SelectionListener;
22 import org.eclipse.swt.graphics.Image;
23 import org.eclipse.swt.layout.GridData;
24 import org.eclipse.swt.layout.GridLayout;
25 import org.eclipse.swt.widgets.Button;
26 import org.eclipse.swt.widgets.Composite;
27 import org.eclipse.swt.widgets.Item;
28 import org.eclipse.swt.widgets.Label;
29 import org.eclipse.swt.widgets.Table;
30 import org.eclipse.swt.widgets.TableColumn;
31 import org.w3c.dom.Element;
32 import org.w3c.dom.NamedNodeMap;
33 import org.w3c.dom.Node;
39 public class UnknownElementWizardPage extends EditElementWizardPage {
41 // key of TableCell for attribute editor.
42 final static String NAME = "ColumnProperty-name",
43 VALUE = "ColumnProperty-value";
45 Button emptyElementCheck, addButton, removeButton, upButton, downButton;
47 TableViewer unknownElementAttrs;
49 ArrayList attrs = new ArrayList(), listeners = new ArrayList();
51 SelectionListener elemTypeChangeListener = new SelectionListener() {
52 public void widgetSelected(SelectionEvent e) {
56 public void widgetDefaultSelected(SelectionEvent e) {
60 public UnknownElementWizardPage() {
61 super("UnknownElementEditPage");
63 setDescription("Editor for any HTML element.");
66 static IInputValidator attrValidator = new IInputValidator() {
67 public String isValid(String newText) {
68 if (newText.length() == 0) {
69 return "Need to specify name";
71 if (newText.indexOf(' ') != -1 || newText.indexOf('\n') != -1
72 || newText.indexOf('\t') != -1) {
73 return "Not contain blank";
79 protected void createChildControl(Composite parent) {
81 parent.setLayout(new GridLayout(2, false));
83 // // attribute editor
84 Label labe = new Label(parent, SWT.NONE);
85 labe.setText("Element &Attribute:");
86 GridData gd = new GridData(GridData.HORIZONTAL_ALIGN_BEGINNING);
87 labe.setLayoutData(gd);
88 new Label(parent, SWT.NONE);
90 // attribute display table setting
91 unknownElementAttrs = new TableViewer(parent, SWT.BORDER | SWT.SINGLE
92 | SWT.FULL_SELECTION);
93 gd = new GridData(GridData.FILL_BOTH);
94 gd.horizontalSpan = 1;
96 unknownElementAttrs.getControl().setLayoutData(gd);
98 final Table table = unknownElementAttrs.getTable();
99 new TableColumn(table, SWT.LEFT).setText("Name");
100 new TableColumn(table, SWT.LEFT).setText("Value");
102 table.setLinesVisible(true);
103 table.setHeaderVisible(true);
105 unknownElementAttrs.setColumnProperties(new String[] { NAME, VALUE });
106 unknownElementAttrs.setContentProvider(new ArrayContentProvider());
108 unknownElementAttrs.setCellEditors(new CellEditor[] {
109 new TextCellEditor(table), new TextCellEditor(table) });
110 unknownElementAttrs.setCellModifier(new ICellModifier() {
111 public boolean canModify(Object element, String property) {
115 public Object getValue(Object element, String property) {
116 return ((String[]) element)[property.equals(NAME) ? 0 : 1];
119 public void modify(Object element, String property, Object value) {
120 if (element instanceof Item) {
121 ((String[]) ((Item) element).getData())[property
122 .equals(NAME) ? 0 : 1] = HTMLUtilities
123 .unescape((String) value);
129 unknownElementAttrs.setLabelProvider(new ITableLabelProvider() {
130 public Image getColumnImage(Object element, int columnIndex) {
134 public String getColumnText(Object element, int columnIndex) {
135 return ((String[]) element)[columnIndex];
138 public void addListener(ILabelProviderListener listener) {
141 public void removeListener(ILabelProviderListener listener) {
144 public void dispose() {
147 public boolean isLabelProperty(Object element, String property) {
148 return property.equals(NAME) || property.equals(VALUE);
153 unknownElementAttrs.setInput(attrs);
155 TableColumn[] columns = table.getColumns();
156 for (int i = 0; i < columns.length; i++) {
161 upButton = createButton(parent, "&Up");
162 upButton.addSelectionListener(new SelectionListener() {
164 public void widgetSelected(SelectionEvent e) {
165 int index = getSelectionIndex();
167 attrs.add(index - 1, attrs.remove(index));
172 public void widgetDefaultSelected(SelectionEvent e) {
176 downButton = createButton(parent, "&Down");
177 downButton.addSelectionListener(new SelectionListener() {
178 public void widgetSelected(SelectionEvent e) {
179 int index = getSelectionIndex();
180 if (index < attrs.size() - 1) {
181 attrs.add(index + 1, attrs.remove(index));
186 public void widgetDefaultSelected(SelectionEvent e) {
190 addButton = createButton(parent, "&Add");
191 addButton.addSelectionListener(new SelectionListener() {
192 public void widgetSelected(SelectionEvent e) {
193 int insertIndex = getSelectionIndex();
194 String[] newData = inputValue();
195 if (newData != null) {
201 String[] inputValue() {
202 SomeItemInputDialog dialog = new SomeItemInputDialog(
203 getShell(), "Input new attribute", new String[] {
204 "Attribute name", "Attribute value" },
205 new IInputValidator[] { attrValidator, null });
207 if (dialog.open() == Window.OK) {
208 return dialog.getValues();
213 public void widgetDefaultSelected(SelectionEvent e) {
217 removeButton = createButton(parent, "&Remove");
218 removeButton.addSelectionListener(new SelectionListener() {
219 public void widgetSelected(SelectionEvent e) {
220 int index = getSelectionIndex();
227 public void widgetDefaultSelected(SelectionEvent e) {
231 emptyElementCheck = new Button(parent, SWT.CHECK);
232 gd = new GridData(GridData.FILL_HORIZONTAL);
233 emptyElementCheck.setLayoutData(gd);
234 emptyElementCheck.setText("&Empty Element");
235 emptyElementCheck.addSelectionListener(elemTypeChangeListener);
236 emptyElementCheck.setSelection(isEmptyAsText());
238 new Label(parent, SWT.NONE);
241 static Button createButton(Composite parent, String text) {
242 Button button = new Button(parent, SWT.PUSH);
243 GridData gd = new GridData(GridData.VERTICAL_ALIGN_BEGINNING
244 | GridData.HORIZONTAL_ALIGN_END);
246 button.setLayoutData(gd);
247 button.setText(text);
251 public String getPreviewText() {
252 String elemName = getElementName();
253 if (elemName == null) {
259 boolean empty = false;
260 if (emptyElementCheck == null) {
262 empty = isEmptyAsText();
265 empty = emptyElementCheck.getSelection();
268 String content = getSelectionText();
269 if (!empty && getEditType() == MODIFY) {
270 content = chooseContent(content);
273 String previewText = "<" + elemName + attrsCode();
275 previewText += " />";
277 previewText += ">" + content + "</" + elemName + ">";
282 boolean isEmptyAsText() {
283 String selText = getSelectionText();
284 if (getEditType() == MODIFY) {
285 int len = selText.length();
286 return selText.substring(len - 2, len).equals("/>");
291 void resetAttributes() {
294 Element elem = getParsedSelectionText();
296 NamedNodeMap as = elem.getAttributes();
297 for (int i = 0; i < as.getLength(); i++) {
299 attrs.add(new String[] { n.getNodeName(), n.getNodeValue() });
305 StringBuffer buff = new StringBuffer();
306 Object[] as = attrs.toArray();
307 for (int i = 0; i < as.length; i++) {
308 String[] a = (String[]) as[i];
309 buff.append(" " + a[0] + "=\"" + HTMLUtilities.escape(a[1]) + "\"");
311 return buff.toString();
314 int getSelectionIndex() {
315 Object sel = unknownElementAttrs.getSelection();
316 if (sel instanceof IStructuredSelection) {
317 Object item = ((IStructuredSelection) sel).getFirstElement();
318 return attrs.indexOf(item);
324 public void refreshPreview() {
325 unknownElementAttrs.refresh();
326 super.refreshPreview();
329 public void setElementName(String elemName) {
330 super.setElementName(elemName);
331 setTitle("\"" + elemName + "\" Element");