Java tutorial
/******************************************************************************* * Copyright (c) 2013 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.aerogear.hybrid.ui.config.internal; import java.beans.PropertyChangeEvent; import java.beans.PropertyChangeListener; import java.util.List; import java.util.Map; import java.util.Map.Entry; import org.eclipse.core.databinding.DataBindingContext; import org.eclipse.core.databinding.beans.BeanProperties; import org.eclipse.core.databinding.beans.BeansObservables; import org.eclipse.core.databinding.observable.list.IObservableList; import org.eclipse.core.databinding.observable.map.IObservableMap; import org.eclipse.core.resources.IResource; import org.eclipse.core.runtime.CoreException; import org.eclipse.core.runtime.IStatus; import org.eclipse.jface.databinding.viewers.ObservableListContentProvider; import org.eclipse.jface.databinding.viewers.ObservableMapLabelProvider; import org.eclipse.jface.layout.GridDataFactory; import org.eclipse.jface.layout.PixelConverter; import org.eclipse.jface.viewers.ColumnLabelProvider; import org.eclipse.jface.viewers.ISelectionChangedListener; import org.eclipse.jface.viewers.IStructuredContentProvider; import org.eclipse.jface.viewers.IStructuredSelection; import org.eclipse.jface.viewers.SelectionChangedEvent; import org.eclipse.jface.viewers.StructuredSelection; import org.eclipse.jface.viewers.TableViewer; import org.eclipse.jface.viewers.TableViewerColumn; import org.eclipse.jface.viewers.Viewer; import org.eclipse.jface.window.Window; import org.eclipse.swt.SWT; import org.eclipse.swt.events.SelectionAdapter; import org.eclipse.swt.events.SelectionEvent; import org.eclipse.swt.layout.FillLayout; import org.eclipse.swt.layout.GridData; import org.eclipse.swt.layout.GridLayout; import org.eclipse.swt.widgets.Button; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Label; import org.eclipse.swt.widgets.Table; import org.eclipse.swt.widgets.TableColumn; import org.eclipse.swt.widgets.TableItem; import org.eclipse.ui.forms.IManagedForm; import org.eclipse.ui.forms.editor.FormEditor; import org.eclipse.ui.forms.editor.FormPage; import org.eclipse.ui.forms.widgets.FormToolkit; import org.eclipse.ui.forms.widgets.ScrolledForm; import org.eclipse.ui.forms.widgets.Section; import org.eclipse.ui.forms.widgets.TableWrapData; import org.eclipse.ui.forms.widgets.TableWrapLayout; import org.jboss.tools.aerogear.hybrid.core.HybridProject; import org.jboss.tools.aerogear.hybrid.core.config.Access; import org.jboss.tools.aerogear.hybrid.core.config.Feature; import org.jboss.tools.aerogear.hybrid.core.config.Preference; import org.jboss.tools.aerogear.hybrid.core.config.Widget; import org.jboss.tools.aerogear.hybrid.core.config.WidgetModel; import org.jboss.tools.aerogear.hybrid.core.plugin.CordovaPlugin; import org.jboss.tools.aerogear.hybrid.ui.HybridUI; import org.jboss.tools.aerogear.hybrid.ui.plugins.internal.LaunchCordovaPluginWizardAction; import org.jboss.tools.aerogear.hybrid.ui.plugins.internal.PluginUninstallAction; public class PropertiesPage extends FormPage { private static final String BTN_LBL_REMOVE = "Remove"; private static final String BTN_LBL_ADD = "Add..."; private DataBindingContext m_bindingContext; private FormToolkit formToolkit; private Table preferencesTable; private Table accessTable; private TableViewer preferencesViewer; private TableViewer accessViewer; private TableViewer featuresTableViewer; private Table featuresTable; private Table paramsTable; private TableViewer featureParamsTableViewer; public PropertiesPage(FormEditor editor) { super(editor, "properties", "Platform Properties"); formToolkit = editor.getToolkit(); } private Widget getWidget() { return ((ConfigEditor) getEditor()).getWidget(); } private WidgetModel getWidgetModel() { return ((ConfigEditor) getEditor()).getWidgetModel(); } @Override protected void createFormContent(IManagedForm managedForm) { final ScrolledForm form = managedForm.getForm(); formToolkit.decorateFormHeading(form.getForm()); managedForm.getForm().setText(getTitle()); { TableWrapLayout tableWrapLayout = new TableWrapLayout(); tableWrapLayout.horizontalSpacing = 10; tableWrapLayout.verticalSpacing = 15; tableWrapLayout.makeColumnsEqualWidth = true; tableWrapLayout.numColumns = 2; managedForm.getForm().getBody().setLayout(tableWrapLayout); } PixelConverter converter = new PixelConverter(form); int topRowTableHeightHint = converter.convertHeightInCharsToPixels(10);//about 10 rows of data int secondRowTableHeightHint = converter.convertHeightInCharsToPixels(5);//about 10 rows of data Section sctnFeatures = managedForm.getToolkit().createSection(managedForm.getForm().getBody(), Section.TITLE_BAR | Section.DESCRIPTION); TableWrapData twd_sctnFeatures = new TableWrapData(TableWrapData.FILL, TableWrapData.FILL, 1, 1); twd_sctnFeatures.grabVertical = true; sctnFeatures.setLayoutData(twd_sctnFeatures); managedForm.getToolkit().paintBordersFor(sctnFeatures); sctnFeatures.setText("Features"); sctnFeatures.setDescription("Define plug-ins to be used in this application"); Composite featuresComposite = managedForm.getToolkit().createComposite(sctnFeatures, SWT.NONE); managedForm.getToolkit().paintBordersFor(featuresComposite); sctnFeatures.setClient(featuresComposite); featuresComposite.setLayout(new GridLayout(2, false)); featuresTableViewer = new TableViewer(featuresComposite, SWT.BORDER | SWT.FULL_SELECTION | SWT.SINGLE); featuresTable = featuresTableViewer.getTable(); featuresTable.setLinesVisible(false); featuresTable.setHeaderVisible(false); GridData featureTableLayoutData = new GridData(SWT.FILL, SWT.FILL, true, true, 1, 1); featureTableLayoutData.heightHint = topRowTableHeightHint; featuresTable.setLayoutData(featureTableLayoutData); managedForm.getToolkit().paintBordersFor(featuresTable); TableViewerColumn tableViewerColumnURI = new TableViewerColumn(featuresTableViewer, SWT.NONE); TableColumn tblclmnFeatureURI = tableViewerColumnURI.getColumn(); tblclmnFeatureURI.setWidth(200); Composite featureBtnsComposite = managedForm.getToolkit().createComposite(featuresComposite, SWT.NONE); managedForm.getToolkit().paintBordersFor(featureBtnsComposite); featureBtnsComposite.setLayout(new FillLayout(SWT.VERTICAL)); Button btnFeatureAdd = managedForm.getToolkit().createButton(featureBtnsComposite, BTN_LBL_ADD, SWT.NONE); btnFeatureAdd.addSelectionListener(new SelectionAdapter() { @Override public void widgetSelected(SelectionEvent e) { LaunchCordovaPluginWizardAction action = null; IResource resource = (IResource) getEditorInput().getAdapter(IResource.class); if (resource != null && HybridProject.getHybridProject(resource.getProject()) != null) { action = new LaunchCordovaPluginWizardAction( HybridProject.getHybridProject(resource.getProject())); } else { action = new LaunchCordovaPluginWizardAction(); } action.run(); selectFirstFeature(); } }); Button btnFeatureRemove = managedForm.getToolkit().createButton(featureBtnsComposite, BTN_LBL_REMOVE, SWT.NONE); btnFeatureRemove.addSelectionListener(new SelectionAdapter() { @Override public void widgetSelected(SelectionEvent e) { IStructuredSelection selection = (IStructuredSelection) featuresTableViewer.getSelection(); if (selection.isEmpty()) return; Feature feature = (Feature) selection.getFirstElement(); IResource resource = (IResource) getEditorInput().getAdapter(IResource.class); HybridProject prj = HybridProject.getHybridProject(resource.getProject()); boolean pluginFoundAndRemoved = false; try { List<CordovaPlugin> plugins = prj.getPluginManager().getInstalledPlugins(); for (CordovaPlugin cordovaPlugin : plugins) { // This is definitely error prone. As the name for a // plugin is not guaranteed to be unique. Unfortunately feature tag does not have a // reference to plugin id. if (cordovaPlugin.getName() != null && cordovaPlugin.getName().equals(feature.getName())) { PluginUninstallAction action = new PluginUninstallAction(cordovaPlugin); action.run(); pluginFoundAndRemoved = true; break; } } } catch (CoreException ex) { HybridUI.log(IStatus.ERROR, "Error removing the installed plugin", ex); } if (!pluginFoundAndRemoved) { getWidget().removeFeature(feature); featureParamsTableViewer.setInput(null); } selectFirstFeature(); } }); // Params section Section sctnParams = managedForm.getToolkit().createSection(managedForm.getForm().getBody(), Section.TITLE_BAR | Section.DESCRIPTION); TableWrapData twd_sctnParams = new TableWrapData(TableWrapData.FILL, TableWrapData.FILL, 1, 1); twd_sctnParams.grabVertical = true; sctnParams.setLayoutData(twd_sctnParams); managedForm.getToolkit().paintBordersFor(sctnParams); sctnParams.setText("Params"); sctnParams.setDescription("Specify parameters for the selected plug-in"); Composite paramsComposite = managedForm.getToolkit().createComposite(sctnParams, SWT.NONE); managedForm.getToolkit().paintBordersFor(paramsComposite); sctnParams.setClient(paramsComposite); paramsComposite.setLayout(new GridLayout(2, false)); featureParamsTableViewer = new TableViewer(paramsComposite, SWT.BORDER | SWT.FULL_SELECTION); featuresTableViewer.addSelectionChangedListener(new ISelectionChangedListener() { @Override public void selectionChanged(SelectionChangedEvent event) { if (!(event.getSelection() instanceof IStructuredSelection)) return; IStructuredSelection sel = (IStructuredSelection) event.getSelection(); if (sel.isEmpty()) { featureParamsTableViewer.setInput(null); return; } Feature feature = (Feature) sel.getFirstElement(); featureParamsTableViewer.setInput(feature.getParams()); feature.addPropertyChangeListener("param", new PropertyChangeListener() { @Override public void propertyChange(PropertyChangeEvent event) { featureParamsTableViewer.setInput(event.getNewValue()); } }); } }); featureParamsTableViewer.setContentProvider(new IStructuredContentProvider() { private Map<String, String> items; @SuppressWarnings({ "unchecked", "rawtypes" }) @Override public void inputChanged(Viewer viewer, Object oldInput, Object newInput) { this.items = (Map) newInput; } @Override public void dispose() { } @Override public Object[] getElements(Object inputElement) { if (items == null) { return new Object[0]; } return items.entrySet().toArray(); } }); paramsTable = featureParamsTableViewer.getTable(); paramsTable.setLinesVisible(true); paramsTable.setHeaderVisible(true); GridDataFactory.fillDefaults().grab(true, true).hint(SWT.DEFAULT, topRowTableHeightHint) .applyTo(paramsTable); ; managedForm.getToolkit().paintBordersFor(paramsTable); TableViewerColumn paramTableColumnViewer = new TableViewerColumn(featureParamsTableViewer, SWT.NONE); TableColumn tblclmnParamName = paramTableColumnViewer.getColumn(); tblclmnParamName.setWidth(100); tblclmnParamName.setText("name"); paramTableColumnViewer.setLabelProvider(new ColumnLabelProvider() { @Override public String getText(Object element) { Entry<String, String> entry = (Entry<String, String>) element; return entry.getKey(); } }); paramTableColumnViewer = new TableViewerColumn(featureParamsTableViewer, SWT.NONE); TableColumn tblclmnValueColumn = paramTableColumnViewer.getColumn(); tblclmnValueColumn.setWidth(200); tblclmnValueColumn.setText("value"); paramTableColumnViewer.setLabelProvider(new ColumnLabelProvider() { @Override public String getText(Object element) { Entry<String, String> entry = (Entry<String, String>) element; return entry.getValue(); } }); Composite featureParamBtnsComposite = new Composite(paramsComposite, SWT.NONE); managedForm.getToolkit().adapt(featureParamBtnsComposite); managedForm.getToolkit().paintBordersFor(featureParamBtnsComposite); featureParamBtnsComposite.setLayout(new FillLayout(SWT.VERTICAL)); Button btnAdd = managedForm.getToolkit().createButton(featureParamBtnsComposite, BTN_LBL_ADD, SWT.NONE); btnAdd.addSelectionListener(new SelectionAdapter() { @Override public void widgetSelected(SelectionEvent e) { IStructuredSelection sel = (IStructuredSelection) featuresTableViewer.getSelection(); if (sel.isEmpty())//should not happen as we always have a selection return; NewNameValueDialog dialog = new NewNameValueDialog(getSite().getShell(), "New Parameter"); if (dialog.open() == Window.OK) { Feature selectedFeature = (Feature) sel.getFirstElement(); selectedFeature.addParam(dialog.getName(), dialog.getValue()); } } }); Button btnRemove = managedForm.getToolkit().createButton(featureParamBtnsComposite, BTN_LBL_REMOVE, SWT.NONE); new Label(featuresComposite, SWT.NONE); btnRemove.addSelectionListener(new SelectionAdapter() { @Override public void widgetSelected(SelectionEvent e) { IStructuredSelection sel = (IStructuredSelection) featuresTableViewer.getSelection(); if (sel.isEmpty())//should not happen as we always have a selection return; Feature selectedFeature = (Feature) sel.getFirstElement(); sel = (IStructuredSelection) featureParamsTableViewer.getSelection(); Entry<String, String> param = (Entry<String, String>) sel.getFirstElement(); selectedFeature.removeParam(param.getKey()); } }); Section sctnPreferences = managedForm.getToolkit().createSection(managedForm.getForm().getBody(), Section.TITLE_BAR); TableWrapData twd_sctnPreferences = new TableWrapData(TableWrapData.FILL, TableWrapData.FILL, 1, 1); twd_sctnPreferences.grabHorizontal = true; twd_sctnPreferences.grabVertical = true; sctnPreferences.setLayoutData(twd_sctnPreferences); managedForm.getToolkit().paintBordersFor(sctnPreferences); sctnPreferences.setText("Preferences"); Composite composite = managedForm.getToolkit().createComposite(sctnPreferences, SWT.WRAP); managedForm.getToolkit().paintBordersFor(composite); sctnPreferences.setClient(composite); composite.setLayout(new GridLayout(2, false)); preferencesViewer = new TableViewer(composite, SWT.BORDER | SWT.FULL_SELECTION); preferencesTable = preferencesViewer.getTable(); preferencesTable.setLinesVisible(true); preferencesTable.setHeaderVisible(true); managedForm.getToolkit().paintBordersFor(preferencesTable); GridDataFactory.fillDefaults().grab(true, true).hint(SWT.DEFAULT, secondRowTableHeightHint) .applyTo(preferencesTable); TableViewerColumn tableViewerColumnName = new TableViewerColumn(preferencesViewer, SWT.NONE); TableColumn tblclmnName = tableViewerColumnName.getColumn(); tblclmnName.setWidth(100); tblclmnName.setText("name"); TableViewerColumn tableViewerColumnValue = new TableViewerColumn(preferencesViewer, SWT.NONE); TableColumn tblclmnValue = tableViewerColumnValue.getColumn(); tblclmnValue.setWidth(100); tblclmnValue.setText("value"); Composite composite_1 = managedForm.getToolkit().createComposite(composite, SWT.NONE); managedForm.getToolkit().paintBordersFor(composite_1); composite_1.setLayout(new FillLayout(SWT.VERTICAL)); Button btnPreferenceAdd = managedForm.getToolkit().createButton(composite_1, BTN_LBL_ADD, SWT.NONE); btnPreferenceAdd.addSelectionListener(new SelectionAdapter() { @Override public void widgetSelected(SelectionEvent e) { NewNameValueDialog dialog = new NewNameValueDialog(getSite().getShell(), "New Preference"); if (dialog.open() == Window.OK) { Preference pref = getWidgetModel().createPreference(getWidget()); pref.setName(dialog.getName()); pref.setValue(dialog.getValue()); getWidget().addPreference(pref); } } }); Button btnPreferenceRemove = managedForm.getToolkit().createButton(composite_1, BTN_LBL_REMOVE, SWT.NONE); btnPreferenceRemove.addSelectionListener(new SelectionAdapter() { @Override public void widgetSelected(SelectionEvent e) { IStructuredSelection selection = (IStructuredSelection) preferencesViewer.getSelection(); if (selection.isEmpty()) return; Preference preference = (Preference) selection.getFirstElement(); getWidget().removePreference(preference); } }); Section sctnAccess = managedForm.getToolkit().createSection(managedForm.getForm().getBody(), Section.TITLE_BAR); TableWrapData twd_sctnAccess = new TableWrapData(TableWrapData.LEFT, TableWrapData.TOP, 1, 1); twd_sctnAccess.grabHorizontal = true; twd_sctnAccess.grabVertical = true; twd_sctnAccess.align = TableWrapData.FILL; twd_sctnAccess.valign = TableWrapData.FILL; sctnAccess.setLayoutData(twd_sctnAccess); managedForm.getToolkit().paintBordersFor(sctnAccess); sctnAccess.setText("Access"); Composite compositea = managedForm.getToolkit().createComposite(sctnAccess, SWT.WRAP); managedForm.getToolkit().paintBordersFor(compositea); sctnAccess.setClient(compositea); compositea.setLayout(new GridLayout(2, false)); accessViewer = new TableViewer(compositea, SWT.BORDER | SWT.FULL_SELECTION); accessTable = accessViewer.getTable(); accessTable.setLinesVisible(true); accessTable.setHeaderVisible(true); managedForm.getToolkit().paintBordersFor(accessTable); GridDataFactory.fillDefaults().grab(true, true).hint(SWT.DEFAULT, secondRowTableHeightHint) .applyTo(accessTable); TableViewerColumn tableViewerColumnOrigin = new TableViewerColumn(accessViewer, SWT.NONE); TableColumn tblclmnOrigin = tableViewerColumnOrigin.getColumn(); tblclmnOrigin.setWidth(100); tblclmnOrigin.setText("origin"); TableViewerColumn tableViewerColumnSubdomains = new TableViewerColumn(accessViewer, SWT.NONE); TableColumn tblclmnSubdomains = tableViewerColumnSubdomains.getColumn(); tblclmnSubdomains.setWidth(100); tblclmnSubdomains.setText("subdomains"); TableViewerColumn tableViewerColumnBrowserOnly = new TableViewerColumn(accessViewer, SWT.NONE); TableColumn tblclmnNewColumn = tableViewerColumnBrowserOnly.getColumn(); tblclmnNewColumn.setWidth(100); tblclmnNewColumn.setText("browserOnly"); Composite composite_2 = managedForm.getToolkit().createComposite(compositea, SWT.NONE); managedForm.getToolkit().paintBordersFor(composite_2); composite_2.setLayout(new FillLayout(SWT.VERTICAL)); Button btnAccessAdd = managedForm.getToolkit().createButton(composite_2, BTN_LBL_ADD, SWT.NONE); btnAccessAdd.addSelectionListener(new SelectionAdapter() { @Override public void widgetSelected(SelectionEvent e) { NewAccessDialog dialog = new NewAccessDialog(getSite().getShell(), getWidgetModel()); if (dialog.open() == Window.OK && dialog.getAccess() != null) { getWidget().addAccess(dialog.getAccess()); } } }); Button btnAccessRemove = managedForm.getToolkit().createButton(composite_2, BTN_LBL_REMOVE, SWT.NONE); btnAccessRemove.addSelectionListener(new SelectionAdapter() { @Override public void widgetSelected(SelectionEvent e) { IStructuredSelection selection = (IStructuredSelection) accessViewer.getSelection(); if (selection.isEmpty()) return; Access access = (Access) selection.getFirstElement(); getWidget().removeAccess(access); } }); m_bindingContext = initDataBindings(); selectFirstFeature(); } private void selectFirstFeature() { TableItem[] items = this.featuresTable.getItems(); if (items.length > 0) { Object obj = items[0].getData(); featuresTableViewer.setSelection(new StructuredSelection(obj)); } } protected DataBindingContext initDataBindings() { DataBindingContext bindingContext = new DataBindingContext(); // ObservableListContentProvider listContentProvider = new ObservableListContentProvider(); IObservableMap[] observeMaps = BeansObservables.observeMaps(listContentProvider.getKnownElements(), Preference.class, new String[] { "name", "value" }); preferencesViewer.setLabelProvider(new ObservableMapLabelProvider(observeMaps)); preferencesViewer.setContentProvider(listContentProvider); // IObservableList preferencesGetWidgetObserveList = BeanProperties.list("preferences").observe(getWidget()); preferencesViewer.setInput(preferencesGetWidgetObserveList); // ObservableListContentProvider listContentProvider_1 = new ObservableListContentProvider(); IObservableMap[] observeMaps_1 = BeansObservables.observeMaps(listContentProvider_1.getKnownElements(), Access.class, new String[] { "origin", "subdomains", "browserOnly" }); accessViewer.setLabelProvider(new ObservableMapLabelProvider(observeMaps_1)); accessViewer.setContentProvider(listContentProvider_1); // IObservableList accessesGetWidgetObserveList = BeanProperties.list("accesses").observe(getWidget()); accessViewer.setInput(accessesGetWidgetObserveList); // ObservableListContentProvider listContentProvider_2 = new ObservableListContentProvider(); IObservableMap observeMap = BeansObservables.observeMap(listContentProvider_2.getKnownElements(), Feature.class, "name"); featuresTableViewer.setLabelProvider(new ObservableMapLabelProvider(observeMap)); featuresTableViewer.setContentProvider(listContentProvider_2); // IObservableList featuresGetWidgetObserveList = BeanProperties.list("features").observe(getWidget()); featuresTableViewer.setInput(featuresGetWidgetObserveList); // return bindingContext; } }