/******************************************************************************* * Copyright (c) 2008 Red Hat, Inc. * Distributed under license by Red Hat, Inc. All rights reserved. * This program is made available under the terms of the * Eclipse Public License v1.0 which accompanies this distribution, * and is available at http://www.eclipse.org/legal/epl-v10.html * * Contributors: * Red Hat, Inc. - initial API and implementation ******************************************************************************/ package org.jboss.tools.smooks.configuration.editors.json12; import java.util.ArrayList; import java.util.Iterator; import java.util.List; import org.eclipse.jface.resource.ImageDescriptor; import org.eclipse.jface.viewers.CellEditor; import org.eclipse.jface.viewers.ICellModifier; import org.eclipse.jface.viewers.IStructuredContentProvider; import org.eclipse.jface.viewers.IStructuredSelection; import org.eclipse.jface.viewers.ITableLabelProvider; import org.eclipse.jface.viewers.LabelProvider; import org.eclipse.jface.viewers.TableViewer; import org.eclipse.jface.viewers.TextCellEditor; import org.eclipse.jface.viewers.Viewer; import org.eclipse.jface.wizard.WizardPage; import org.eclipse.swt.SWT; import org.eclipse.swt.events.ModifyEvent; import org.eclipse.swt.events.ModifyListener; 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.Combo; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Control; import org.eclipse.swt.widgets.Item; import org.eclipse.swt.widgets.Label; import org.eclipse.swt.widgets.TableColumn; import org.eclipse.swt.widgets.Text; import org.jboss.tools.smooks.configuration.editors.utils.SmooksUIUtils; import org.jboss.tools.smooks.model.json12.Json12Reader; import org.jboss.tools.smooks.model.json12.impl.Json12ReaderImpl; import org.jboss.tools.smooks.model.smooks.SmooksResourceListType; /** * @author Dart (dpeng@redhat.com) * */ public class Json12DataConfiguraitonWizardPage extends WizardPage { private String rootName = null; private String arrayElementName = "element"; //$NON-NLS-1$ private String keyWhitspaceReplacement = "-"; //$NON-NLS-1$ private String keyPrefixOnNumeric; private String illegalElementNameCharReplacement; private String nullValueReplacement = ""; //$NON-NLS-1$ private String encoding = "UTF-8"; //$NON-NLS-1$ private Text rootNameText; private Text arrayElementNameText; private Text keyWhitspaceReplacementText; private Text keyPrefixOnNumericText; private Text illegalElementNameCharReplacementText; private Text nullValueReplacementText; private Text encodingText; private TableViewer keyMapViewer; private ArrayList<KeyValueModel> keyValueList; private Button addButton; private Button removeButton; private Button createJsonReaderButton; protected boolean createJsonReader = true; private Button newReaderConfigButton; private Button useAvailableReaderConfigButton; private SmooksResourceListType resourceList; private boolean hasReader = false; private boolean useAvailabelReader = false; private Composite configComposite; private Composite keyMapComposite; private Combo indentText; private String indent = null; private void initValue() { indent = null; hasReader = false; if (SmooksUIUtils.hasReaderAlready(Json12ReaderImpl.class, resourceList) || SmooksUIUtils.hasReaderAlready(Json12Reader.class, resourceList)) { hasReader = true; } useAvailabelReader = false; rootName = null; createJsonReader = true; arrayElementName = "element"; //$NON-NLS-1$ keyWhitspaceReplacement = "-"; //$NON-NLS-1$ keyPrefixOnNumeric = null; illegalElementNameCharReplacement = null; nullValueReplacement = ""; //$NON-NLS-1$ encoding = "UTF-8"; //$NON-NLS-1$ if (keyValueList != null) { keyValueList.clear(); } else { keyValueList = new ArrayList<KeyValueModel>(); } if (hasReader) { useAvailabelReader = true; createJsonReader = false; } } /* * (non-Javadoc) * * @see * org.eclipse.jface.dialogs.IDialogPage#createControl(org.eclipse.swt.widgets * .Composite) */ public void createControl(Composite parent) { initValue(); Composite mainComposite = new Composite(parent, SWT.NONE); GridLayout layout = new GridLayout(); layout.numColumns = 2; mainComposite.setLayout(layout); GridData gd = new GridData(GridData.FILL_BOTH); gd.grabExcessHorizontalSpace = true; gd.grabExcessVerticalSpace = true; mainComposite.setLayoutData(gd); Composite radioButtonComposite = new Composite(mainComposite, SWT.NONE); gd = new GridData(GridData.FILL_HORIZONTAL); gd.horizontalSpan = 2; radioButtonComposite.setLayoutData(gd); GridLayout rgl = new GridLayout(); rgl.numColumns = 2; rgl.marginHeight = 0; rgl.marginWidth = 0; radioButtonComposite.setLayout(rgl); Composite spaceComposite = new Composite(mainComposite, SWT.NONE); gd = new GridData(GridData.FILL_HORIZONTAL); gd.horizontalSpan = 2; gd.heightHint = 20; spaceComposite.setLayoutData(gd); newReaderConfigButton = new Button(radioButtonComposite, SWT.RADIO); newReaderConfigButton.setText("Create new JSON reader configurations"); //$NON-NLS-1$ newReaderConfigButton.setSelection(true); useAvailableReaderConfigButton = new Button(radioButtonComposite, SWT.RADIO); useAvailableReaderConfigButton.setText("Use available JSON reader configurations"); //$NON-NLS-1$ configComposite = new Composite(mainComposite, SWT.NONE); gd = new GridData(GridData.FILL_BOTH); gd.horizontalSpan = 2; configComposite.setLayoutData(gd); GridLayout cgl = new GridLayout(); cgl.marginHeight = 0; cgl.marginWidth = 0; cgl.numColumns = 2; configComposite.setLayout(cgl); gd = new GridData(GridData.FILL_HORIZONTAL); Label rootnameLabel = new Label(configComposite, SWT.NONE); rootnameLabel.setText("Root Element Name"); //$NON-NLS-1$ rootNameText = new Text(configComposite, SWT.BORDER); rootNameText.setLayoutData(gd); Label arrayElementNameLabel = new Label(configComposite, SWT.NONE); arrayElementNameLabel.setText("Array Element Name"); //$NON-NLS-1$ arrayElementNameText = new Text(configComposite, SWT.BORDER); arrayElementNameText.setLayoutData(gd); arrayElementNameText.setText(arrayElementName); Label keyWhitspaceReplacementLabel = new Label(configComposite, SWT.NONE); keyWhitspaceReplacementLabel.setText("Space Replacement"); //$NON-NLS-1$ keyWhitspaceReplacementText = new Text(configComposite, SWT.BORDER); keyWhitspaceReplacementText.setLayoutData(gd); if (keyWhitspaceReplacement == null) { keyWhitspaceReplacement = ""; //$NON-NLS-1$ } keyWhitspaceReplacementText.setText(keyWhitspaceReplacement); Label keyPrefixOnNumeric = new Label(configComposite, SWT.NONE); keyPrefixOnNumeric.setText("Prefix On Numeric"); //$NON-NLS-1$ keyPrefixOnNumericText = new Text(configComposite, SWT.BORDER); keyPrefixOnNumericText.setLayoutData(gd); Label illegalElementNameCharReplacementLabel = new Label(configComposite, SWT.NONE); illegalElementNameCharReplacementLabel.setText("IllegalChar Replacement"); //$NON-NLS-1$ illegalElementNameCharReplacementText = new Text(configComposite, SWT.BORDER); illegalElementNameCharReplacementText.setLayoutData(gd); Label nullValueReplacementlabel = new Label(configComposite, SWT.NONE); nullValueReplacementlabel.setText("NullValue Replacement"); //$NON-NLS-1$ nullValueReplacementText = new Text(configComposite, SWT.BORDER); nullValueReplacementText.setLayoutData(gd); nullValueReplacementText.setText(nullValueReplacement); Label encodingLabel = new Label(configComposite, SWT.NONE); encodingLabel.setText("Encoding"); //$NON-NLS-1$ encodingText = new Text(configComposite, SWT.BORDER); encodingText.setLayoutData(gd); encodingText.setText(encoding); Label indentLabel = new Label(configComposite, SWT.NONE); indentLabel.setText("Indent"); //$NON-NLS-1$ indentText = new Combo(configComposite, SWT.BORDER | SWT.READ_ONLY); indentText.add(""); //$NON-NLS-1$ indentText.add("TRUE"); //$NON-NLS-1$ indentText.add("FALSE"); //$NON-NLS-1$ indentText.setLayoutData(gd); Label keyMapLabel = new Label(configComposite, SWT.NONE); keyMapLabel.setText("Key Map:"); //$NON-NLS-1$ gd = new GridData(GridData.FILL_HORIZONTAL); gd.horizontalSpan = 2; keyMapLabel.setLayoutData(gd); gd = new GridData(GridData.FILL_BOTH); gd.horizontalSpan = 2; keyMapComposite = new Composite(configComposite, SWT.NONE); keyMapComposite.setLayoutData(gd); GridLayout kgl = new GridLayout(); kgl.numColumns = 2; keyMapComposite.setLayout(kgl); gd = new GridData(GridData.FILL_BOTH); keyMapViewer = new TableViewer(keyMapComposite, SWT.BORDER | SWT.MULTI); keyMapViewer.getControl().setLayoutData(gd); keyMapViewer.getTable().setHeaderVisible(true); keyMapViewer.getTable().setLinesVisible(true); keyMapViewer.setContentProvider(new KeyMapContentProvider()); keyMapViewer.setLabelProvider(new KeyMapLabelProvider()); CellEditor keyCellEditor = new TextCellEditor(keyMapViewer.getTable(), SWT.BORDER); CellEditor valueCellEditor = new TextCellEditor(keyMapViewer.getTable(), SWT.BORDER); keyMapViewer.setCellEditors(new CellEditor[] { keyCellEditor, valueCellEditor }); keyMapViewer.setColumnProperties(new String[] { "key", "value" }); //$NON-NLS-1$ //$NON-NLS-2$ keyMapViewer.setCellModifier(new ICellModifier() { public void modify(Object element, String property, Object value) { Object el = null; if (element instanceof Item) { el = ((Item) element).getData(); } if (el == null) return; if (el instanceof KeyValueModel && value instanceof String) { if (property.equals("key")) { //$NON-NLS-1$ ((KeyValueModel) el).setKey(value.toString()); } if (property.equals("value")) { //$NON-NLS-1$ ((KeyValueModel) el).setValue(value.toString()); } keyMapViewer.refresh(el); } } public Object getValue(Object element, String property) { // Object el = null; // if(element instanceof Item){ // el = ((Item)element).getData(); // } // if(el == null) return null; if (element instanceof KeyValueModel) { if (property.equals("key")) { //$NON-NLS-1$ return ((KeyValueModel) element).getKey(); } if (property.equals("value")) { //$NON-NLS-1$ return ((KeyValueModel) element).getValue(); } } return null; } public boolean canModify(Object element, String property) { // Object el = null; // if(element instanceof Item){ // el = ((Item)element).getData(); // } // if(el == null) return false; if (element instanceof KeyValueModel) { if (property.equals("key") || property.equals("value")) { //$NON-NLS-1$ //$NON-NLS-2$ return true; } } return false; } }); TableColumn keyColumn = new TableColumn(keyMapViewer.getTable(), SWT.BORDER); keyColumn.setWidth(150); keyColumn.setText("Key"); //$NON-NLS-1$ TableColumn replaceColumn = new TableColumn(keyMapViewer.getTable(), SWT.BORDER); replaceColumn.setWidth(150); replaceColumn.setText("Replace"); //$NON-NLS-1$ keyMapViewer.setInput(keyValueList); Composite buttonComposite = new Composite(keyMapComposite, SWT.NONE); gd = new GridData(GridData.FILL_VERTICAL); buttonComposite.setLayoutData(gd); GridLayout bgl = new GridLayout(); buttonComposite.setLayout(bgl); gd = new GridData(GridData.FILL_HORIZONTAL); addButton = new Button(buttonComposite, SWT.NONE); addButton.setLayoutData(gd); addButton.setText("Add"); //$NON-NLS-1$ removeButton = new Button(buttonComposite, SWT.NONE); removeButton.setLayoutData(gd); removeButton.setText("Remove"); //$NON-NLS-1$ createJsonReaderButton = new Button(configComposite, SWT.CHECK); createJsonReaderButton.setText("Create a JSON Reader"); //$NON-NLS-1$ gd = new GridData(GridData.FILL_HORIZONTAL); gd.horizontalSpan = 2; createJsonReaderButton.setLayoutData(gd); createJsonReaderButton.setSelection(createJsonReader); if (hasReader) { createJsonReaderButton.setEnabled(false); newReaderConfigButton.setSelection(false); useAvailableReaderConfigButton.setSelection(true); setConfigCompositeStates(false); // configComposite.setEnabled(false); } hookControls(); changePageStatus(); this.setControl(mainComposite); } private void setConfigCompositeStates(boolean enabled) { configComposite.setEnabled(enabled); Control[] controls = configComposite.getChildren(); for (int i = 0; i < controls.length; i++) { Control c = controls[i]; if (c == createJsonReaderButton) { if (hasReader) { c.setEnabled(false); continue; } } if (c == keyMapComposite) { Control[] cs = ((Composite) c).getChildren(); for (int j = 0; j < cs.length; j++) { Control cc = cs[j]; cc.setEnabled(enabled); } } c.setEnabled(enabled); } } private void hookControls() { newReaderConfigButton.addSelectionListener(new SelectionListener() { public void widgetSelected(SelectionEvent e) { if (newReaderConfigButton.getSelection()) { useAvailabelReader = false; changePageStatus(); setConfigCompositeStates(true); } } public void widgetDefaultSelected(SelectionEvent e) { // TODO Auto-generated method stub } }); useAvailableReaderConfigButton.addSelectionListener(new SelectionListener() { public void widgetSelected(SelectionEvent e) { if (useAvailableReaderConfigButton.getSelection()) { useAvailabelReader = true; changePageStatus(); setConfigCompositeStates(false); } } public void widgetDefaultSelected(SelectionEvent e) { } }); indentText.addModifyListener(new ModifyListener() { public void modifyText(ModifyEvent e) { indent = indentText.getText(); changePageStatus(); } }); addButton.addSelectionListener(new SelectionListener() { public void widgetSelected(SelectionEvent e) { keyValueList.add(new KeyValueModel("key", "value")); //$NON-NLS-1$ //$NON-NLS-2$ keyMapViewer.refresh(); } public void widgetDefaultSelected(SelectionEvent e) { } }); removeButton.addSelectionListener(new SelectionListener() { public void widgetSelected(SelectionEvent e) { IStructuredSelection selection = (IStructuredSelection) keyMapViewer.getSelection(); List<?> selections = selection.toList(); for (Iterator<?> iterator = selections.iterator(); iterator.hasNext();) { Object object = (Object) iterator.next(); keyValueList.remove(object); } keyMapViewer.refresh(); } public void widgetDefaultSelected(SelectionEvent e) { // TODO Auto-generated method stub } }); createJsonReaderButton.addSelectionListener(new SelectionListener() { public void widgetSelected(SelectionEvent e) { createJsonReader = createJsonReaderButton.getSelection(); } public void widgetDefaultSelected(SelectionEvent e) { } }); encodingText.addModifyListener(new ModifyListener() { public void modifyText(ModifyEvent e) { encoding = encodingText.getText(); changePageStatus(); } }); nullValueReplacementText.addModifyListener(new ModifyListener() { public void modifyText(ModifyEvent e) { nullValueReplacement = nullValueReplacementText.getText(); changePageStatus(); } }); illegalElementNameCharReplacementText.addModifyListener(new ModifyListener() { public void modifyText(ModifyEvent e) { illegalElementNameCharReplacement = illegalElementNameCharReplacementText.getText(); changePageStatus(); } }); keyPrefixOnNumericText.addModifyListener(new ModifyListener() { public void modifyText(ModifyEvent e) { keyPrefixOnNumeric = keyPrefixOnNumericText.getText(); changePageStatus(); } }); keyWhitspaceReplacementText.addModifyListener(new ModifyListener() { public void modifyText(ModifyEvent e) { keyWhitspaceReplacement = keyWhitspaceReplacementText.getText(); changePageStatus(); } }); arrayElementNameText.addModifyListener(new ModifyListener() { public void modifyText(ModifyEvent e) { arrayElementName = arrayElementNameText.getText(); changePageStatus(); } }); rootNameText.addModifyListener(new ModifyListener() { public void modifyText(ModifyEvent e) { rootName = rootNameText.getText(); changePageStatus(); } }); } private void changePageStatus() { String error = null; if (useAvailabelReader) { setErrorMessage(null); setPageComplete(true); return; } rootName = rootNameText.getText(); if (rootName == null || rootName.length() == 0) { error = "Root Name can't be null"; //$NON-NLS-1$ } arrayElementName = arrayElementNameText.getText(); if (arrayElementName == null || arrayElementName.length() == 0) { error = "Array Element Name can't be null"; //$NON-NLS-1$ } // if (keyWhitspaceReplacement == null // || keyWhitspaceReplacement.length() == 0) { // error = "Space replacement string can't be null"; // } encoding = encodingText.getText(); if (encoding == null || encoding.length() == 0) { error = "Encoding can't be null"; //$NON-NLS-1$ } setErrorMessage(error); setPageComplete(error == null); } public Json12DataConfiguraitonWizardPage(String pageName, String title, ImageDescriptor titleImage) { super(pageName, title, titleImage); } public Json12DataConfiguraitonWizardPage(String pageName) { super(pageName); this.setTitle("JSON Reader configurations (version 1.2)"); //$NON-NLS-1$ this.setDescription("Set the configurations for parsing JSON file."); //$NON-NLS-1$ } public String getRootName() { return rootName; } public void setRootName(String rootName) { this.rootName = rootName; } public String getArrayElementName() { return arrayElementName; } public void setArrayElementName(String arrayElementName) { this.arrayElementName = arrayElementName; } public String getKeyWhitspaceReplacement() { return keyWhitspaceReplacement; } public void setKeyWhitspaceReplacement(String keyWhitspaceReplacement) { this.keyWhitspaceReplacement = keyWhitspaceReplacement; } public String getKeyPrefixOnNumeric() { return keyPrefixOnNumeric; } public void setKeyPrefixOnNumeric(String keyPrefixOnNumeric) { this.keyPrefixOnNumeric = keyPrefixOnNumeric; } public String getIllegalElementNameCharReplacement() { return illegalElementNameCharReplacement; } public void setIllegalElementNameCharReplacement(String illegalElementNameCharReplacement) { this.illegalElementNameCharReplacement = illegalElementNameCharReplacement; } public String getNullValueReplacement() { return nullValueReplacement; } public void setNullValueReplacement(String nullValueReplacement) { this.nullValueReplacement = nullValueReplacement; } // public Map<String, String> getKeyMap() { // return keyMap; // } // // public void setKeyMap(Map<String, String> keyMap) { // this.keyMap = keyMap; // } public String getEncoding() { return encoding; } public boolean isUseAvailabelReader() { return useAvailabelReader; } public void setUseAvailabelReader(boolean useAvailabelReader) { this.useAvailabelReader = useAvailabelReader; } public String getIndent() { return indent; } public void setIndent(String indent) { this.indent = indent; } public SmooksResourceListType getSmooksResourceList() { return resourceList; } public void setSmooksResourceList(SmooksResourceListType resourceList) { this.resourceList = resourceList; } public void setEncoding(String encoding) { this.encoding = encoding; } public ArrayList<KeyValueModel> getKeyValueList() { return keyValueList; } public void setKeyValueList(ArrayList<KeyValueModel> keyValueList) { this.keyValueList = keyValueList; } public boolean isCreateJsonReader() { return createJsonReader; } public void setCreateJsonReader(boolean createJsonReader) { this.createJsonReader = createJsonReader; } private class KeyMapLabelProvider extends LabelProvider implements ITableLabelProvider { public Image getColumnImage(Object element, int columnIndex) { return null; } public String getColumnText(Object element, int columnIndex) { if (element instanceof KeyValueModel) { switch (columnIndex) { case 0: return ((KeyValueModel) element).getKey(); case 1: return ((KeyValueModel) element).getValue(); } } return getText(element); } } private class KeyMapContentProvider implements IStructuredContentProvider { public Object[] getElements(Object inputElement) { if (inputElement instanceof List<?>) { return ((List<?>) inputElement).toArray(); } // TODO Auto-generated method stub return new Object[] {}; } public void dispose() { } public void inputChanged(Viewer viewer, Object oldInput, Object newInput) { // TODO Auto-generated method stub } } public class KeyValueModel { private String key; private String value; public KeyValueModel(String key, String value) { this.key = key; this.value = value; } public String getKey() { return key; } public void setKey(String key) { this.key = key; } public String getValue() { return value; } public void setValue(String value) { this.value = value; } } }