/******************************************************************************* * Copyright (c) 2004, 2006 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.section; import java.util.ArrayList; import java.util.Iterator; import java.util.List; import org.eclipse.emf.common.notify.Notification; import org.eclipse.emf.common.notify.impl.AdapterImpl; import org.eclipse.emf.ecore.EObject; import org.eclipse.emf.ecore.util.EcoreUtil; import org.eclipse.jface.viewers.ColumnWeightData; import org.eclipse.jface.viewers.ILabelProviderListener; import org.eclipse.jface.viewers.IStructuredContentProvider; import org.eclipse.jface.viewers.ITableLabelProvider; import org.eclipse.jface.viewers.TableLayout; import org.eclipse.jface.viewers.TableViewer; import org.eclipse.jface.viewers.Viewer; import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage; import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigType; import org.eclipse.jst.jsf.facesconfig.emf.NavigationCaseType; import org.eclipse.jst.jsf.facesconfig.emf.NavigationRuleType; import org.eclipse.jst.jsf.facesconfig.ui.EditorMessages; import org.eclipse.jst.jsf.facesconfig.ui.page.IFacesConfigPage; import org.eclipse.jst.jsf.facesconfig.ui.pageflow.PageflowEditor; import org.eclipse.swt.SWT; import org.eclipse.swt.graphics.Image; import org.eclipse.swt.layout.GridData; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Table; import org.eclipse.swt.widgets.TableColumn; import org.eclipse.ui.PlatformUI; import org.eclipse.ui.forms.IManagedForm; import org.eclipse.ui.forms.widgets.FormToolkit; /** * @author sfshi * */ public class OverviewNavigationSection extends AbstractOverviewSection { private static final int COLUMN_WITH = 70; private OverviewNavigationSectionAdapter overviewNavigationSectionAdapter; /** * * @param parent * @param managedForm * @param page * @param toolkit */ public OverviewNavigationSection(Composite parent, IManagedForm managedForm, IFacesConfigPage page, FormToolkit toolkit) { super(parent, managedForm, page, toolkit, PageflowEditor.PAGE_ID, EditorMessages.OverviewPage_NavigationSection_name, EditorMessages.OverviewPage_NavigationSection_description, null, null); } /* * (non-Javadoc) * * @see org.eclipse.jst.jsf.facesconfig.ui.section.AbstractOverviewSection#configTableViewer(org.eclipse.jface.viewers.TableViewer) */ protected void configTableViewer(TableViewer tableViewer1) { tableViewer1.setContentProvider(new IStructuredContentProvider() { public Object[] getElements(Object inputElement) { List navigationCaseList = (List) inputElement; return navigationCaseList.toArray(); } public void dispose() { // nothing to dispose } public void inputChanged(Viewer viewer, Object oldInput, Object newInput) { // do nothing } }); tableViewer1.setLabelProvider(new ITableLabelProvider() { public Image getColumnImage(Object element, int columnIndex) { return null; } public String getColumnText(Object element, int columnIndex) { NavigationCaseType navigationCase = (NavigationCaseType) element; switch (columnIndex) { case 0: return ((NavigationRuleType) navigationCase.eContainer()) .getFromViewId() == null ? "" //$NON-NLS-1$ : ((NavigationRuleType) navigationCase.eContainer()) .getFromViewId().getTextContent(); case 1: return navigationCase.getFromOutcome() == null ? "" //$NON-NLS-1$ : navigationCase.getFromOutcome().getTextContent(); case 2: return navigationCase.getToViewId() == null ? "" //$NON-NLS-1$ : navigationCase.getToViewId().getTextContent(); } return null; } public void addListener(ILabelProviderListener listener) { // no listeners? } public void dispose() { // do nothing } public boolean isLabelProperty(Object element, String property) { return false; } public void removeListener(ILabelProviderListener listener) { // no listeners? } }); } /* * (non-Javadoc) * * @see org.eclipse.jst.jsf.facesconfig.ui.section.AbstractOverviewSection#createTable(org.eclipse.swt.widgets.Composite) */ protected Table createTable(Composite container) { Table table = new Table(container, SWT.H_SCROLL | SWT.V_SCROLL | SWT.FULL_SELECTION | SWT.BORDER | SWT.BORDER); GridData gd = new GridData(GridData.FILL_BOTH); gd.horizontalSpan = 1; gd.heightHint = 100; table.setLayoutData(gd); table.setLinesVisible(true); table.setHeaderVisible(true); TableLayout tablelayout = new TableLayout(); table.setLayout(tablelayout); TableColumn column1 = new TableColumn(table, SWT.LEFT); column1 .setText(EditorMessages.OverviewPage_NavigationSection_table_col1); // column1.setWidth(COLUMN_WITH); tablelayout.addColumnData(new ColumnWeightData(1, COLUMN_WITH, true)); // tablelayout.addColumnData(new ColumnWeightData(1, true)); column1.setResizable(true); TableColumn column2 = new TableColumn(table, SWT.LEFT); column2 .setText(EditorMessages.OverviewPage_NavigationSection_table_col2); tablelayout.addColumnData(new ColumnWeightData(1, COLUMN_WITH, true)); // tablelayout.addColumnData(new ColumnWeightData(1, true)); column2.setResizable(true); // column2.setWidth(COLUMN_WITH); TableColumn column3 = new TableColumn(table, SWT.LEFT); column3 .setText(EditorMessages.OverviewPage_NavigationSection_table_col3); tablelayout.addColumnData(new ColumnWeightData(1, COLUMN_WITH, true)); // tablelayout.addColumnData(new ColumnWeightData(1, true)); column3.setResizable(true); // column3.setWidth(COLUMN_WITH); return table; } /* * (non-Javadoc) * * @see org.eclipse.jst.jsf.facesconfig.ui.section.IFacesConfigSection#refreshAll() */ public void refreshAll() { List navigationCaseList = new ArrayList(); if (getInput() instanceof FacesConfigType) { List navigationRules = ((FacesConfigType) getInput()) .getNavigationRule(); for (int i = 0, n = navigationRules.size(); i < n; i++) { NavigationRuleType navigationRule = (NavigationRuleType) navigationRules .get(i); navigationCaseList.addAll(navigationRule.getNavigationCase()); } } tableViewer.setInput(navigationCaseList); } /* * (non-Javadoc) * * @see org.eclipse.jst.jsf.facesconfig.ui.section.AbstractFacesConfigSection#addAdaptersOntoInput(java.lang.Object) */ protected void addAdaptersOntoInput(Object newInput) { FacesConfigType facesConfig = (FacesConfigType) newInput; addOverviewNavigationSectionAdapter(facesConfig); for (Iterator it = facesConfig.getNavigationRule().iterator(); it .hasNext();) { NavigationRuleType navigationRule = (NavigationRuleType) it.next(); addOverviewNavigationSectionAdapter(navigationRule); if (navigationRule.getFromViewId() != null) { addOverviewNavigationSectionAdapter(navigationRule .getFromViewId()); } for (Iterator it2 = navigationRule.getNavigationCase().iterator(); it2 .hasNext();) { NavigationCaseType navigationCase = (NavigationCaseType) it2 .next(); addOverviewNavigationSectionAdapter(navigationCase); if (navigationCase.getFromOutcome() != null) { addOverviewNavigationSectionAdapter(navigationCase .getFromOutcome()); } if (navigationCase.getToViewId() != null) { addOverviewNavigationSectionAdapter(navigationCase .getToViewId()); } } } } /* * (non-Javadoc) * * @see org.eclipse.jst.jsf.facesconfig.ui.section.AbstractFacesConfigSection#removeAdaptersFromInput(java.lang.Object) */ protected void removeAdaptersFromInput(Object oldInput) { super.removeAdaptersFromInput(oldInput); FacesConfigType facesConfig = (FacesConfigType) oldInput; removeOverviewNavigationSectionAdapter(facesConfig); for (Iterator it = facesConfig.getNavigationRule().iterator(); it .hasNext();) { NavigationRuleType navigationRule = (NavigationRuleType) it.next(); removeOverviewNavigationSectionAdapter(navigationRule); if (navigationRule.getFromViewId() != null) { removeOverviewNavigationSectionAdapter(navigationRule .getFromViewId()); } for (Iterator it2 = navigationRule.getNavigationCase().iterator(); it2 .hasNext();) { NavigationCaseType navigationCase = (NavigationCaseType) it2 .next(); removeOverviewNavigationSectionAdapter(navigationCase); if (navigationCase.getFromOutcome() != null) { removeOverviewNavigationSectionAdapter(navigationCase .getFromOutcome()); } if (navigationCase.getToViewId() != null) { removeOverviewNavigationSectionAdapter(navigationCase .getToViewId()); } } } } private void addOverviewNavigationSectionAdapter(EObject object) { if (EcoreUtil.getExistingAdapter(object, OverviewNavigationSection.class) == null) { object.eAdapters().add(getOverviewNavigationSectionAdapter()); } } private void removeOverviewNavigationSectionAdapter(EObject object) { if (object != null && EcoreUtil.getExistingAdapter(object, OverviewNavigationSection.class) != null) { object.eAdapters().remove(getOverviewNavigationSectionAdapter()); } } private OverviewNavigationSectionAdapter getOverviewNavigationSectionAdapter() { if (overviewNavigationSectionAdapter == null) overviewNavigationSectionAdapter = new OverviewNavigationSectionAdapter(); return overviewNavigationSectionAdapter; } class OverviewNavigationSectionAdapter extends AdapterImpl { public boolean isAdapterForType(Object type) { if (type == OverviewNavigationSection.class) return true; return false; } public void notifyChanged(Notification msg) { if ((msg.getFeature() == FacesConfigPackage.eINSTANCE .getFacesConfigType_NavigationRule() || msg.getFeature() == FacesConfigPackage.eINSTANCE .getNavigationRuleType_NavigationCase() || msg.getFeature() == FacesConfigPackage.eINSTANCE .getNavigationRuleType_FromViewId() || msg .getFeature() == FacesConfigPackage.eINSTANCE .getFromViewIdType_TextContent())) { if (msg.getEventType() == Notification.ADD || msg.getEventType() == Notification.SET) { if (msg.getNewValue() instanceof EObject) { EObject newObject = (EObject) msg.getNewValue(); addOverviewNavigationSectionAdapter(newObject); } } if (msg.getEventType() == Notification.ADD || msg.getEventType() == Notification.REMOVE || msg.getEventType() == Notification.SET) if (Thread.currentThread() == PlatformUI.getWorkbench().getDisplay().getThread()) { refreshAll(); } else { PlatformUI.getWorkbench().getDisplay().asyncExec(new Runnable() { public void run() { refreshAll(); } }); } return; } if (msg.getFeature() == FacesConfigPackage.eINSTANCE .getNavigationCaseType_FromOutcome() || msg.getFeature() == FacesConfigPackage.eINSTANCE .getNavigationCaseType_ToViewId()) { if (msg.getEventType() == Notification.ADD || msg.getEventType() == Notification.SET) { if (msg.getNewValue() instanceof EObject) { EObject newObject = (EObject) msg.getNewValue(); addOverviewNavigationSectionAdapter(newObject); } } if (msg.getEventType() == Notification.ADD || msg.getEventType() == Notification.REMOVE || msg.getEventType() == Notification.SET) { NavigationCaseType navigationCase = (NavigationCaseType) msg .getNotifier(); refreshViewerOnUIThread(navigationCase); } return; } if (msg.getFeature() == FacesConfigPackage.eINSTANCE .getFromOutcomeType_TextContent() || msg.getFeature() == FacesConfigPackage.eINSTANCE .getToViewIdType_TextContent()) { if (msg.getEventType() == Notification.ADD || msg.getEventType() == Notification.REMOVE || msg.getEventType() == Notification.SET) { NavigationCaseType navigationCase = (NavigationCaseType) ((EObject) msg .getNotifier()).eContainer(); refreshViewerOnUIThread(navigationCase); } return; } } private void refreshViewerOnUIThread(final NavigationCaseType navigationCase) { if (Thread.currentThread() == PlatformUI.getWorkbench().getDisplay().getThread()) { tableViewer.refresh(navigationCase); } else { PlatformUI.getWorkbench().getDisplay().asyncExec(new Runnable() { public void run() { tableViewer.refresh(navigationCase); } }); } } } }