/*
* � Copyright IBM Corp. 2014
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at:
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
* implied. See the License for the specific language governing
* permissions and limitations under the License.
*/
package com.ibm.xsp.extlib.designer.tooling.palette.singlepageapp;
import java.text.MessageFormat;
import java.util.ArrayList;
import org.eclipse.jface.dialogs.IMessageProvider;
import org.eclipse.jface.dialogs.TitleAreaDialog;
import org.eclipse.jface.viewers.ArrayContentProvider;
import org.eclipse.jface.viewers.ColumnLabelProvider;
import org.eclipse.jface.viewers.DoubleClickEvent;
import org.eclipse.jface.viewers.IDoubleClickListener;
import org.eclipse.jface.viewers.TableViewer;
import org.eclipse.jface.viewers.TableViewerColumn;
import org.eclipse.jface.window.Window;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.SelectionEvent;
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.Event;
import org.eclipse.swt.widgets.Listener;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.swt.widgets.TableItem;
import org.eclipse.swt.widgets.Text;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import com.ibm.commons.util.StringUtil;
import com.ibm.designer.domino.constants.XSPAttributeNames;
import com.ibm.designer.domino.constants.XSPTagNames;
import com.ibm.designer.domino.xsp.utils.FormModelUtil;
import com.ibm.xsp.extlib.designer.tooling.constants.IExtLibAttrNames;
import com.ibm.xsp.extlib.designer.tooling.constants.IExtLibTagLib;
import com.ibm.xsp.extlib.designer.tooling.constants.IExtLibTagNames;
import com.ibm.xsp.extlib.designer.tooling.palette.singlepageapp.WizardSubPageDataSource.FormField;
import com.ibm.xsp.extlib.designer.tooling.utils.WizardUtils;
import com.ibm.xsp.extlib.designer.tooling.visualizations.AbstractCommonControlVisualizer;
import com.ibm.xsp.registry.FacesRegistry;
/**
* @author Gary Marjoram
*
*/
public class WizardSubPageFormTable extends WizardSubPage {
private ArrayList <FormField> fieldList;
private TableViewer tableViewer;
private Button resetBtn;
private Button checkBtn;
private Button editBtn;
private Button moveUpBtn;
private Button moveDownBtn;
private boolean checkBtnState = true;
protected WizardSubPageFormTable(WizardDataSub pd) {
super(pd);
fieldList = new ArrayList<FormField>();
}
@Override
public void refreshData() {
super.refreshData();
setMessage(getStepTxt() + MessageFormat.format("Configure the Fields for the \"{0}\" Application Page", pageData.name), IMessageProvider.INFORMATION); // $NLX-WizardSubPageFormTable.ConfiguretheFieldsforthe0Applicat-1$
fieldList = ((WizardSubPageDataSource)pageData.wizardPage[1]).getFormFields();
setupTableContents(0);
refreshButtonState();
}
@Override
public void createControl(Composite parent) {
container = new Composite(parent, SWT.NONE);
GridLayout layout = WizardUtils.createGridLayout(2, 5);
container.setLayout(layout);
tableViewer = WizardUtils.createCheckboxTableViewer(container, 3);
// Create Field Name column
TableViewerColumn col = new TableViewerColumn(tableViewer, SWT.LEFT);
col.getColumn().setText("Field"); // $NLX-WizardSubPageFormTable.Field-1$
col.getColumn().setResizable(false);
col.setLabelProvider(new ColumnLabelProvider() {
@Override
public String getText(Object element) {
return ((FormField)element).fieldName;
}
});
// Create Label column
col = new TableViewerColumn(tableViewer, SWT.LEFT);
col.getColumn().setText("Label"); // $NLX-WizardSubPageFormTable.Label-1$
col.getColumn().setResizable(false);
col.setLabelProvider(new ColumnLabelProvider() {
@Override
public String getText(Object element) {
return ((FormField)element).label;
}
});
// Create type column
col = new TableViewerColumn(tableViewer, SWT.LEFT);
col.getColumn().setText("Control"); // $NLX-WizardSubPageFormTable.Control-1$
col.getColumn().setResizable(false);
col.setLabelProvider(new ColumnLabelProvider() {
@Override
public String getText(Object element) {
return FormField.getControlName(((FormField)element).control);
}
});
tableViewer.setContentProvider(new ArrayContentProvider());
tableViewer.addDoubleClickListener(new IDoubleClickListener() {
public void doubleClick(DoubleClickEvent event) {
editFieldEntry();
}
});
tableViewer.getTable().addListener(SWT.Selection, new Listener() {
public void handleEvent(Event event) {
if( event.detail == SWT.CHECK ) {
FormField fld = fieldList.get(tableViewer.getTable().indexOf((TableItem)event.item));
fld.checked = !fld.checked;
}
}
});
Composite buttonComposite = new Composite(container, SWT.NONE);
layout = new GridLayout();
layout.numColumns = 1;
buttonComposite.setLayout(layout);
resetBtn = WizardUtils.createButton(buttonComposite, "Reset", this); // $NLX-WizardSubPageFormTable.Reset-1$
checkBtn = WizardUtils.createButton(buttonComposite, "Select All", this); // $NLX-WizardSubPageFormTable.SelectAll-1$
editBtn = WizardUtils.createButton(buttonComposite, "Edit", this); // $NLX-WizardSubPageFormTable.Edit-1$
moveUpBtn = WizardUtils.createButton(buttonComposite, "Move Up", this); // $NLX-WizardSubPageFormTable.MoveUp-1$
moveDownBtn = WizardUtils.createButton(buttonComposite, "Move Down", this); // $NLX-WizardSubPageFormTable.MoveDown-1$
GridData buttonLayoutData = new GridData(GridData.HORIZONTAL_ALIGN_BEGINNING | GridData.VERTICAL_ALIGN_BEGINNING);
buttonComposite.setLayoutData(buttonLayoutData);
refreshButtonState();
setControl(container);
setPageComplete(true);
}
//
// Displays the Dialog for editing an entry
//
private void editFieldEntry() {
FormField nt;
int sel = tableViewer.getTable().getSelectionIndex();
if (sel >= 0) {
FormField fld = fieldList.get(sel);
String desc = MessageFormat.format("Configure the \"{0}\" field.", fld.fieldName); // $NLX-WizardSubPageFormTable.Configurethe0field-1$
EditFormFieldDialog dialog = new EditFormFieldDialog(getShell(), "Edit Document Field", desc, fld); // $NLX-WizardSubPageFormTable.EditDocumentField-1$
dialog.create();
if (dialog.open() == Window.OK) {
nt = dialog.getFormField();
fieldList.set(sel, nt);
setupTableContents(sel);
}
}
}
@Override
public void widgetSelected(SelectionEvent event) {
// Get the current selection index
int sel = tableViewer.getTable().getSelectionIndex();
if (event.widget == resetBtn) {
((WizardSubPageDataSource)pageData.wizardPage[1]).clearCachedData();
checkBtnState = true;
checkBtn.setText("Select All"); // $NLX-WizardSubPageFormTable.SelectAll.1-1$
refreshData();
} else if (event.widget == editBtn) {
editFieldEntry();
} else if (event.widget == moveUpBtn) {
if (sel > 0) {
FormField tmp = fieldList.get(sel-1);
fieldList.set(sel-1, fieldList.get(sel));
fieldList.set(sel, tmp);
setupTableContents(sel-1);
}
} else if (event.widget == moveDownBtn) {
if (sel < fieldList.size()-1) {
FormField tmp = fieldList.get(sel+1);
fieldList.set(sel+1, fieldList.get(sel));
fieldList.set(sel, tmp);
setupTableContents(sel+1);
}
} else if (event.widget == checkBtn) {
for (FormField fld : fieldList) {
fld.checked = checkBtnState;
}
checkBtnState = !checkBtnState;
checkBtn.setText(checkBtnState ? "Select All" : "Deselect All"); // $NLX-WizardSubPageFormTable.SelectAll.2-1$ $NLX-WizardSubPageFormTable.DeselectAll-2$
setupTableContents(sel);
}
refreshButtonState();
}
@Override
public void pageDeleted(int idx) {
}
//
// Adds the markup for this page
//
@Override
public void addElementMarkup(Element base, FacesRegistry registry) {
Document doc = base.getOwnerDocument();
// Create a Panel and a FormTable
Element formTable = FormModelUtil.createElement(doc, registry, IExtLibTagLib.EXT_LIB_NAMESPACE_URI, IExtLibTagNames.EXT_LIB_TAG_FORM_TABLE);
// Get the dataSource name
String dsName = ((WizardSubPageDataSource)pageData.wizardPage[1]).getVarName();
if (!StringUtil.isEmpty(dsName)) {
dsName += ".";
}
for (FormField fld : fieldList) {
if (fld.checked && (fld.control != FormField.NOT_SUPPORTED)) {
// Create a Form Row with a Label
Element formRow = FormModelUtil.createElement(doc, registry, IExtLibTagLib.EXT_LIB_NAMESPACE_URI, IExtLibTagNames.EXT_LIB_TAG_FORM_ROW);
FormModelUtil.setAttribute(formRow, IExtLibAttrNames.EXT_LIB_ATTR_LABEL, fld.label);
FormModelUtil.setAttribute(formRow, IExtLibAttrNames.EXT_LIB_ATTR_LABEL_POSITION, "above"); // $NON-NLS-1$
Element fldElement = null;
// Create the Control
switch (fld.control) {
case FormField.EDIT_BOX:
default :
fldElement = FormModelUtil.createElement(doc, registry, AbstractCommonControlVisualizer.XP_CORE_NAMESPACE, XSPTagNames.XSP_TAG_EDIT_BOX);
break;
case FormField.DATE_ONLY:
case FormField.TIME_ONLY:
case FormField.DATE_AND_TIME:
// Create the data/time elements
fldElement = FormModelUtil.createElement(doc, registry, AbstractCommonControlVisualizer.XP_CORE_NAMESPACE, XSPTagNames.XSP_TAG_EDIT_BOX);
Element dtHelper = FormModelUtil.createElement(doc, registry, AbstractCommonControlVisualizer.XP_CORE_NAMESPACE, XSPTagNames.XSP_TAG_DATE_TIME_HELPER);
Element converter = FormModelUtil.createElement(doc, registry, AbstractCommonControlVisualizer.XP_CORE_NAMESPACE, XSPTagNames.XSP_TAG_THIS_CONVERTER);
Element convertDateTime = FormModelUtil.createElement(doc, registry, AbstractCommonControlVisualizer.XP_CORE_NAMESPACE, XSPTagNames.XSP_TAG_CONVERTER_CONVERT_DATE_TIME);
FormModelUtil.setAttribute(convertDateTime, XSPAttributeNames.XSP_ATTR_TIME_STYLE, "short"); // $NON-NLS-1$
if(fld.control == FormField.DATE_ONLY) {
FormModelUtil.setAttribute(convertDateTime, XSPAttributeNames.XSP_ATTR_TYPE, "date"); // $NON-NLS-1$
} else if (fld.control == FormField.TIME_ONLY) {
FormModelUtil.setAttribute(convertDateTime, XSPAttributeNames.XSP_ATTR_TYPE, "time"); // $NON-NLS-1$
} else {
FormModelUtil.setAttribute(convertDateTime, XSPAttributeNames.XSP_ATTR_TYPE, "both"); // $NON-NLS-1$
}
// Nest them
converter.appendChild(convertDateTime);
fldElement.appendChild(dtHelper);
fldElement.appendChild(converter);
break;
case FormField.RICH_TEXT:
fldElement = FormModelUtil.createElement(doc, registry, AbstractCommonControlVisualizer.XP_CORE_NAMESPACE, XSPTagNames.XSP_TAG_INPUT_RICH_TEXT);
break;
}
// Add the control to the formRow
if(fldElement != null) {
FormModelUtil.setAttribute(fldElement, XSPAttributeNames.XSP_ATTR_VALUE, "#{" + dsName + fld.fieldName + "}");
formRow.appendChild(fldElement);
}
// Add the row to the formTable
formTable.appendChild(formRow);
}
}
base.appendChild(formTable);
// Add the TabBar at the bottom if selected
if (((WizardSubPageMain)pageData.wizardPage[0]).getTabBarPosition() == WizardData.TAB_BAR_BOTTOM) {
((WizardSubPageMain)pageData.wizardPage[0]).addTabBarMarkup(base, registry);
}
}
private void refreshButtonState() {
boolean state = tableViewer.getTable().getSelectionIndex() >= 0;
editBtn.setEnabled(state);
moveUpBtn.setEnabled(state);
moveDownBtn.setEnabled(state);
}
//
// Setup the TableViewer contents
//
protected void setupTableContents(int selIndex) {
tableViewer.setInput(fieldList.toArray());
tableViewer.getTable().setSelection(selIndex);
int i = 0;
for(TableItem ti : tableViewer.getTable().getItems()) {
ti.setChecked(fieldList.get(i++).checked);
}
}
//
// Class providing the Edit Field Dialog
//
private class EditFormFieldDialog extends TitleAreaDialog {
private Text txtLabel;
private Combo comboControl;
private String dialogTitle;
private String dialogDesc;
private FormField frmFld;
public EditFormFieldDialog(Shell parentShell, String title, String desc, FormField ff) {
super(parentShell);
dialogTitle = title;
dialogDesc = desc;
if (ff == null) {
frmFld = new FormField("", 0);
} else {
frmFld = ff;
}
}
@Override
public void create() {
super.create();
setTitle(dialogTitle);
setMessage(dialogDesc, IMessageProvider.INFORMATION);
}
@Override
protected Control createDialogArea(Composite parent) {
Composite area = (Composite) super.createDialogArea(parent);
Composite container = new Composite(area, SWT.NONE);
container.setLayoutData(new GridData(GridData.FILL_BOTH));
GridLayout layout = new GridLayout(2, false);
container.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
container.setLayout(layout);
WizardUtils.createLabel(container, "Label :", 1); // $NLX-WizardSubPageFormTable.Label.1-1$
txtLabel = WizardUtils.createText(container);
txtLabel.setText(frmFld.label);
WizardUtils.createLabel(container, "Control :", 1); // $NLX-WizardSubPageFormTable.Control.1-1$
comboControl = WizardUtils.createCombo(container, 1, FormField.controlNames, frmFld.control, null);
return area;
}
@Override
protected boolean isResizable() {
return true;
}
// save content of the fields because they get disposed
// as soon as the Dialog closes
private void saveInput() {
frmFld.label = txtLabel.getText();
frmFld.control = comboControl.getSelectionIndex();
}
@Override
protected void okPressed() {
saveInput();
super.okPressed();
}
public FormField getFormField() {
return frmFld;
}
}
}