| /******************************************************************************* |
| * Copyright (c) 2004, 2005 Sybase, Inc. and others. |
| * |
| * All rights reserved. This program and the accompanying materials |
| * are 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: |
| * Sybase, Inc. - initial API and implementation |
| *******************************************************************************/ |
| |
| package org.eclipse.jst.jsf.facesconfig.ui.pageflow.properties; |
| |
| import java.util.List; |
| |
| import org.eclipse.jface.dialogs.Dialog; |
| import org.eclipse.jface.dialogs.IDialogConstants; |
| import org.eclipse.jface.viewers.ColumnPixelData; |
| import org.eclipse.jface.viewers.TableLayout; |
| import org.eclipse.jst.jsf.common.ui.internal.dialogfield.Separator; |
| import org.eclipse.jst.jsf.facesconfig.ui.pageflow.PageflowMessages; |
| import org.eclipse.jst.jsf.facesconfig.ui.pageflow.util.JSPUtil; |
| import org.eclipse.osgi.util.NLS; |
| import org.eclipse.swt.SWT; |
| import org.eclipse.swt.events.ModifyEvent; |
| import org.eclipse.swt.events.ModifyListener; |
| import org.eclipse.swt.events.SelectionAdapter; |
| import org.eclipse.swt.events.SelectionEvent; |
| import org.eclipse.swt.layout.GridData; |
| import org.eclipse.swt.layout.GridLayout; |
| import org.eclipse.swt.widgets.Composite; |
| import org.eclipse.swt.widgets.Control; |
| import org.eclipse.swt.widgets.Group; |
| import org.eclipse.swt.widgets.Label; |
| import org.eclipse.swt.widgets.Shell; |
| import org.eclipse.swt.widgets.Table; |
| import org.eclipse.swt.widgets.TableColumn; |
| import org.eclipse.swt.widgets.TableItem; |
| import org.eclipse.swt.widgets.Text; |
| import org.w3c.dom.Attr; |
| import org.w3c.dom.Element; |
| |
| /** |
| * This dialog is used to edit outcome property of link component of Pageflow |
| * Designer. |
| * |
| * @author Xiao-guang Zhang |
| */ |
| public class ActionOutcomeSelectionDialog extends Dialog { |
| |
| /** property's name text control */ |
| private Text actionText; |
| |
| /** linked source jsp file name */ |
| private String jspName; |
| |
| /** the current outcome */ |
| private String outcome; |
| |
| /** action table control */ |
| private Table actionTable; |
| |
| /** Column width of component name and action */ |
| private static final int COMPONENT_COL_WIDTH = 160; |
| |
| private static final int ACTION_COL_WIDTH = 160; |
| |
| /** Dialog default height and width */ |
| private static final int DIALOG_DEFAULT_WIDTH = 400; |
| |
| private static final int DIALOG_DEFAULT_HEIGHT = 300; |
| |
| private static String JSF_EL_LEFT_BRACE = "#{"; //$NON-NLS-1$ |
| |
| private static String JSF_EL_RIGHT_BRACE = "}"; //$NON-NLS-1$ |
| |
| /** the listener for the text modification */ |
| private ModifyListener modifyListener; |
| |
| /** |
| * @param parentShell |
| * @param outcome |
| * @param jspName |
| */ |
| public ActionOutcomeSelectionDialog(Shell parentShell, String outcome, |
| String jspName) { |
| super(parentShell); |
| this.outcome = outcome; |
| this.jspName = jspName; |
| |
| modifyListener = new ModifyListener() { |
| public void modifyText(ModifyEvent e) { |
| verifyComplete(); |
| } |
| }; |
| } |
| |
| /* |
| * (non-Javadoc) |
| * |
| * @see Dialog#createDialogArea(Composite) |
| */ |
| protected Control createDialogArea(Composite parent) { |
| GridLayout gridLayout; |
| |
| Composite container = (Composite) super.createDialogArea(parent); |
| gridLayout = new GridLayout(); |
| gridLayout.numColumns = 1; |
| gridLayout.marginWidth = 10; |
| gridLayout.marginHeight = 10; |
| container.setLayout(gridLayout); |
| GridData gd = new GridData(GridData.FILL_BOTH); |
| // gd.widthHint = 300; |
| gd.heightHint = DIALOG_DEFAULT_HEIGHT; |
| gd.widthHint = DIALOG_DEFAULT_WIDTH; |
| container.setLayoutData(gd); |
| |
| Label choiceLabel = new Label(container, SWT.LEFT); |
| gd = new GridData(GridData.HORIZONTAL_ALIGN_FILL); |
| // gd.widthHint = 100; |
| choiceLabel.setLayoutData(gd); |
| // Pageflow.Property.Action.OutcomeSelectionDialog.Choice = Enter the |
| // outcome or select one from action list below: |
| choiceLabel |
| .setText(PageflowMessages.Pageflow_Property_Action_OutcomeSelectionDialog_Choice); |
| |
| createOutcomeSection(container); |
| |
| createActionListSection(container); |
| |
| return container; |
| } |
| |
| /** |
| * create a Outcome input section |
| * |
| * @param container |
| */ |
| protected void createOutcomeSection(Composite container) { |
| Composite outcomeSection = new Composite(container, SWT.NONE); |
| GridLayout gl = new GridLayout(); |
| gl.numColumns = 1; |
| gl.marginWidth = 0; |
| outcomeSection.setLayout(gl); |
| GridData gd = new GridData(GridData.FILL_HORIZONTAL); |
| outcomeSection.setLayoutData(gd); |
| |
| actionText = new Text(outcomeSection, SWT.BORDER); |
| gd = new GridData(GridData.HORIZONTAL_ALIGN_FILL |
| | GridData.FILL_HORIZONTAL); |
| actionText.setLayoutData(gd); |
| |
| actionText.addModifyListener(modifyListener); |
| |
| if (outcome != null && outcome.length() > 0) { |
| actionText.setText(outcome); |
| } |
| } |
| |
| /** |
| * create action list table section |
| * |
| * @param container |
| */ |
| protected void createActionListSection(Composite container) { |
| final Group actionSection = new Group(container, SWT.NONE); |
| GridLayout gridLayout = new GridLayout(); |
| gridLayout.numColumns = 1; |
| actionSection.setLayout(gridLayout); |
| GridData gd = new GridData(GridData.FILL_BOTH); |
| actionSection.setLayoutData(gd); |
| |
| String actionListTitle = null; |
| if (jspName != null && jspName.length() > 0) { |
| actionListTitle = NLS.bind(PageflowMessages.Pageflow_Property_Action_OutcomeSelectionDialog_ActionListTableWithJSP_Title, jspName); |
| } else { |
| actionListTitle = PageflowMessages.Pageflow_Property_Action_OutcomeSelectionDialog_ActionListTable_Title; |
| } |
| |
| // Pageflow.Property.Action.OutcomeSelectionDialog.ActionListTable.Title |
| // = Actions |
| actionSection.setText(actionListTitle); |
| |
| actionTable = new Table(actionSection, SWT.BORDER | SWT.FULL_SELECTION); |
| actionTable.setLayoutData(new GridData(GridData.FILL_BOTH)); |
| actionTable.setHeaderVisible(true); |
| actionTable.setLinesVisible(true); |
| TableLayout layout = new TableLayout(); |
| actionTable.setLayout(layout); |
| |
| layout.addColumnData(new ColumnPixelData(COMPONENT_COL_WIDTH)); |
| layout.addColumnData(new ColumnPixelData(ACTION_COL_WIDTH)); |
| TableColumn componentCol = new TableColumn(actionTable, SWT.NONE); |
| // Pageflow.Property.Action.OutcomeSelectionDialog.ActionListTable.Component |
| // = Component ID |
| componentCol |
| .setText(PageflowMessages.Pageflow_Property_Action_OutcomeSelectionDialog_ActionListTable_Component); |
| TableColumn actionCol = new TableColumn(actionTable, SWT.NONE); |
| |
| // Pageflow.Property.Action.OutcomeSelectionDialog.ActionListTable.Action |
| // = Action |
| actionCol |
| .setText(PageflowMessages.Pageflow_Property_Action_OutcomeSelectionDialog_ActionListTable_Action); |
| |
| actionTable.addSelectionListener(new SelectionAdapter() { |
| public void widgetSelected(SelectionEvent e) { |
| TableItem selItem = (TableItem) e.item; |
| String action = selItem.getText(1); |
| if (action != null && action.length() > 0) |
| actionText.setText(action); |
| } |
| }); |
| |
| addActionsInJSP(); |
| |
| } |
| |
| /** |
| * Creates a separator line. Expects a <code>GridLayout</code> with at |
| * least 1 column. |
| * |
| * @param composite |
| * the parent composite |
| * @param nColumns |
| * number of columns to span |
| */ |
| protected void createSeparator(Composite composite, int nColumns) { |
| (new Separator(SWT.SEPARATOR | SWT.HORIZONTAL)).doFillIntoGrid(null, |
| composite, nColumns, convertHeightInCharsToPixels(1)); |
| } |
| |
| /* |
| * (non-Javadoc) |
| * |
| * @see Dialog#createButtonsForButtonBar(Composite) |
| */ |
| protected void createButtonsForButtonBar(Composite parent) { |
| createButton(parent, IDialogConstants.OK_ID, IDialogConstants.OK_LABEL, |
| true); |
| createButton(parent, IDialogConstants.CANCEL_ID, |
| IDialogConstants.CANCEL_LABEL, false); |
| |
| verifyComplete(); |
| } |
| |
| /* |
| * (non-Javadoc) |
| * |
| * @see Dialog#configureShell(Shell) |
| */ |
| protected void configureShell(Shell newShell) { |
| super.configureShell(newShell); |
| |
| // Pageflow.Property.Action.OutcomeSelectionDialog.Title = Outcome |
| // Selection |
| newShell |
| .setText(PageflowMessages.Pageflow_Property_Action_OutcomeSelectionDialog_Title); |
| |
| } |
| |
| /* |
| * (non-Javadoc) |
| * |
| * @see Dialog#buttonPressed(int) |
| */ |
| protected void buttonPressed(int buttonId) { |
| if (buttonId == IDialogConstants.CANCEL_ID) { |
| setReturnCode(CANCEL); |
| close(); |
| return; |
| } else if (buttonId == IDialogConstants.OK_ID) { |
| setReturnCode(OK); |
| |
| outcome = actionText.getText(); |
| |
| close(); |
| return; |
| } |
| super.buttonPressed(buttonId); |
| } |
| |
| /** |
| * |
| * check the dialog inputs are complete or not, and set the OK button enable |
| * or not. |
| */ |
| private void verifyComplete() { |
| if (getButton(IDialogConstants.OK_ID) != null) { |
| getButton(IDialogConstants.OK_ID).setEnabled(isDialogComplete()); |
| } |
| } |
| |
| /** |
| * check the dialog inputs are complete or not. |
| * |
| * @return |
| */ |
| private boolean isDialogComplete() { |
| return isValidName(); |
| } |
| |
| /** |
| * the input name is valid or not |
| * |
| * @return |
| */ |
| private boolean isValidName() { |
| return actionText.getText().length() > 0; |
| } |
| |
| /** |
| * get the selected action in the action table |
| * |
| * @return - selected action |
| */ |
| public String getSelectedAction() { |
| return outcome; |
| } |
| |
| /** |
| * add actions in the source jsp file to the action list table control |
| * |
| */ |
| private void addActionsInJSP() { |
| List actionNodes = JSPUtil.getActionListInJSPFile(jspName); |
| |
| if (actionNodes != null) { |
| for (int i = 0, n = actionNodes.size(); i < n; i++) { |
| Element node = (Element) actionNodes.get(i); |
| StringBuffer componentName = new StringBuffer(); |
| |
| Attr idAttr = node.getAttributeNode("id"); //$NON-NLS-1$ |
| if (idAttr != null) |
| componentName.append(idAttr.getNodeValue()); |
| |
| componentName.append("(").append(node.getTagName()).append(")"); //$NON-NLS-1$ //$NON-NLS-2$ |
| |
| Attr actionAttr = node.getAttributeNode("action"); //$NON-NLS-1$ |
| if (actionAttr != null) { |
| String action = actionAttr.getValue(); |
| if (isValidEL(action)) |
| addActionTableItem(componentName.toString(), action); |
| } |
| } |
| } |
| } |
| |
| /** |
| * @param expressionString |
| * @return true if expressionString is valid EL |
| */ |
| public static boolean isValidEL(String expressionString) { |
| if (expressionString == null || expressionString.length() == 0) |
| return true; |
| |
| return (expressionString.startsWith(JSF_EL_LEFT_BRACE) && expressionString |
| .endsWith(JSF_EL_RIGHT_BRACE)) |
| || (!expressionString.startsWith(JSF_EL_LEFT_BRACE) && !expressionString |
| .endsWith(JSF_EL_RIGHT_BRACE)); |
| } |
| |
| /** |
| * add a new action item in the previous jsp page. |
| * |
| * @param componentName - |
| * JSF component element |
| * @param action - |
| * value of action's attribute |
| */ |
| private void addActionTableItem(String componentName, String action) { |
| if (componentName != null && componentName.length() > 0 |
| && action != null && action.length() > 0) { |
| TableItem item = new TableItem(actionTable, SWT.NONE); |
| item.setText(0, componentName); |
| item.setText(1, action); |
| } |
| } |
| } |