Java tutorial
/****************************************************************************** * Copyright (c) 2007 - 2008 g-Eclipse consortium * 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 * * Initial development of the original code was made for * project g-Eclipse founded by European Union * project number: FP6-IST-034327 http://www.geclipse.eu/ * * Contributor(s): * PSNC - Katarzyna Bylec (katis@man.poznan.pl) * *****************************************************************************/ package eu.geclipse.jsdl.ui.preference; import java.net.URL; import java.util.ArrayList; import java.util.List; import org.eclipse.compare.IContentChangeListener; import org.eclipse.compare.IContentChangeNotifier; import org.eclipse.core.runtime.IProgressMonitor; import org.eclipse.core.runtime.IStatus; import org.eclipse.core.runtime.Path; import org.eclipse.core.runtime.Status; import org.eclipse.core.runtime.SubProgressMonitor; import org.eclipse.core.runtime.jobs.Job; import org.eclipse.jface.dialogs.Dialog; import org.eclipse.jface.dialogs.IDialogConstants; import org.eclipse.jface.preference.PreferencePage; import org.eclipse.jface.resource.ImageDescriptor; import org.eclipse.jface.viewers.ColumnLayoutData; import org.eclipse.jface.viewers.ColumnWeightData; import org.eclipse.jface.viewers.ISelection; import org.eclipse.jface.viewers.ISelectionChangedListener; 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.SelectionChangedEvent; import org.eclipse.jface.viewers.TableLayout; import org.eclipse.jface.viewers.TableViewer; import org.eclipse.jface.viewers.Viewer; import org.eclipse.jface.window.Window; 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.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.Composite; import org.eclipse.swt.widgets.Control; import org.eclipse.swt.widgets.FileDialog; 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.Text; import org.eclipse.ui.IWorkbench; import org.eclipse.ui.IWorkbenchPreferencePage; import org.eclipse.ui.PlatformUI; import eu.geclipse.core.model.impl.GridApplicationParameters; import eu.geclipse.core.reporting.ProblemException; import eu.geclipse.jsdl.ui.internal.Activator; import eu.geclipse.ui.dialogs.ProblemDialog; /** * Class providing contents of Application Parameters Preferences Page */ public class ApplicationParametersPreferencePage extends PreferencePage implements IWorkbenchPreferencePage, IContentChangeListener { TableViewer appsViewer; private Button addButton; private Button editButton; private Button removeButton; private Table appsTable; private Button refreshButton; /** * Creates new instance of preferences page */ public ApplicationParametersPreferencePage() { super(); setDescription(Messages.getString("ApplicationSpecificPreferencePage.description")); //$NON-NLS-1$ ApplicationParametersRegistry.getInstance().addContentChangeListener(this); } @Override public void dispose() { ApplicationParametersRegistry.getInstance().removeContentChangeListener(this); super.dispose(); } @Override protected Control createContents(final Composite parent) { initializeDialogUnits(parent); noDefaultAndApplyButton(); Composite mainComp = new Composite(parent, SWT.NONE); GridLayout gLayout = new GridLayout(1, false); gLayout.marginHeight = 0; gLayout.marginWidth = 0; GridData gData; gData = new GridData(SWT.FILL, SWT.FILL, true, true); mainComp.setLayoutData(gData); mainComp.setLayout(gLayout); initializeDialogUnits(mainComp); this.appsTable = new Table(mainComp, SWT.BORDER | SWT.VIRTUAL | SWT.MULTI | SWT.FULL_SELECTION); this.appsTable.setHeaderVisible(true); this.appsTable.setLinesVisible(true); gData = new GridData(SWT.FILL, SWT.FILL, true, true); this.appsTable.setLayoutData(gData); TableLayout tableLayout = new TableLayout(); this.appsTable.setLayout(tableLayout); TableColumn nameColumn = new TableColumn(this.appsTable, SWT.CENTER); ColumnLayoutData data = new ColumnWeightData(100); tableLayout.addColumnData(data); data = new ColumnWeightData(100); tableLayout.addColumnData(data); data = new ColumnWeightData(150); tableLayout.addColumnData(data); data = new ColumnWeightData(150); tableLayout.addColumnData(data); nameColumn.setText("Name"); //$NON-NLS-1$ TableColumn typeColumn = new TableColumn(this.appsTable, SWT.LEFT); typeColumn.setText("Path"); //$NON-NLS-1$ TableColumn xmlColumn = new TableColumn(this.appsTable, SWT.LEFT); xmlColumn.setText("XML file"); //$NON-NLS-1$ TableColumn jsdlColumn = new TableColumn(this.appsTable, SWT.LEFT); jsdlColumn.setText("JSDL file"); //$NON-NLS-1$ this.appsViewer = new TableViewer(this.appsTable); IStructuredContentProvider contentProvider = new ApplicationSpecificPageContentProvider(); this.appsViewer.setContentProvider(contentProvider); this.appsViewer.setLabelProvider(new ApplicationSpecificLabelProvider()); this.appsViewer.setInput(contentProvider.getElements(null)); this.appsViewer.addSelectionChangedListener(new ISelectionChangedListener() { public void selectionChanged(final SelectionChangedEvent event) { updateButtons(); } }); Composite buttonsComp = new Composite(mainComp, SWT.NONE); gLayout = new GridLayout(4, false); gLayout.marginHeight = 0; gLayout.marginWidth = 0; buttonsComp.setLayout(gLayout); gData = new GridData(GridData.VERTICAL_ALIGN_BEGINNING | GridData.HORIZONTAL_ALIGN_END); gData.horizontalSpan = 1; buttonsComp.setLayoutData(gData); this.refreshButton = new Button(buttonsComp, SWT.PUSH); gData = new GridData(GridData.FILL_BOTH); this.refreshButton.setLayoutData(gData); this.refreshButton.setText(Messages.getString("ApplicationParametersPreferencePage.refresh_list")); //$NON-NLS-1$ this.refreshButton.addSelectionListener(new SelectionAdapter() { @Override public void widgetSelected(final SelectionEvent e) { fetchApplications(); } }); this.addButton = new Button(buttonsComp, SWT.PUSH); gData = new GridData(GridData.FILL_BOTH); this.addButton.setLayoutData(gData); this.addButton.setText(Messages.getString("ApplicationSpecificPreferencePage.add_button")); //$NON-NLS-1$ this.addButton.addSelectionListener(new SelectionAdapter() { @Override public void widgetSelected(final SelectionEvent event) { editAppliactionSpecificData(null); } }); this.editButton = new Button(buttonsComp, SWT.PUSH); gData = new GridData(GridData.FILL_BOTH); this.editButton.setLayoutData(gData); this.editButton.setText(Messages.getString("ApplicationSpecificPreferencePage.edit_button")); //$NON-NLS-1$ this.editButton.addSelectionListener(new SelectionAdapter() { @Override public void widgetSelected(final SelectionEvent event) { editAppliactionSpecificData(getSelectedAppSpecificObject()); } }); this.removeButton = new Button(buttonsComp, SWT.PUSH); gData = new GridData(GridData.FILL_BOTH); this.removeButton.setLayoutData(gData); this.removeButton.setText(Messages.getString("ApplicationSpecificPreferencePage.delete_button")); //$NON-NLS-1$ this.removeButton.addSelectionListener(new SelectionAdapter() { @Override public void widgetSelected(final SelectionEvent event) { for (GridApplicationParameters obj : getSelectedAppSpecificObjects()) { try { ApplicationParametersRegistry.getInstance().removeApplicationParameters(obj); } catch (ApplicationParametersException e) { ProblemDialog.openProblem(getShell(), Messages.getString("ApplicationSpecificPreferencePage.removing_error_title"), //$NON-NLS-1$ Messages.getString("ApplicationSpecificPreferencePage.removing_error_message"), //$NON-NLS-1$ e); } } } }); updateButtons(); return mainComp; } void fetchApplications() { Job job = new Job(Messages.getString("ApplicationParametersPreferencePage.get_apps_params")) { //$NON-NLS-1$ @Override protected IStatus run(final IProgressMonitor monitor) { IStatus result = Status.OK_STATUS; monitor.beginTask(Messages.getString("ApplicationParametersPreferencePage.updating)_registry"), //$NON-NLS-1$ IProgressMonitor.UNKNOWN); try { if (!monitor.isCanceled()) { ApplicationParametersRegistry.getInstance().updateApplicationsParameters(null, new SubProgressMonitor(monitor, IProgressMonitor.UNKNOWN)); monitor.worked(1); } } catch (ProblemException problemE) { result = new Status(IStatus.ERROR, Activator.PLUGIN_ID, Messages.getString("ApplicationParametersPreferencePage.error_fetching_apps"), //$NON-NLS-1$ problemE); } finally { monitor.done(); } return result; } }; job.setUser(true); job.schedule(); } void editAppliactionSpecificData(final GridApplicationParameters aSO) { EditDialog dialog; if (aSO == null) { dialog = new EditDialog(getShell()); if (dialog.open() == Window.OK) { ApplicationParametersRegistry.getInstance().addApplicationSpecificData(dialog.getAppName(), dialog.getAppPath(), new Path(dialog.getXMLPath()), new Path(dialog.getJSDLPath()), null); } } else { String jsdlPath = null; if (aSO.getJsdlPath() != null) { jsdlPath = aSO.getJsdlPath().toOSString(); } dialog = new EditDialog(getShell(), aSO.getApplicationName(), aSO.getApplicationPath(), aSO.getXmlPath().toOSString(), jsdlPath); if (dialog.open() == Window.OK) { try { ApplicationParametersRegistry.getInstance().editApplicationSpecificData(aSO, dialog.getAppName(), dialog.getAppPath(), dialog.getXMLPath(), dialog.getJSDLPath()); } catch (ApplicationParametersException e) { ProblemDialog.openProblem(getShell(), Messages.getString("ApplicationSpecificPreferencePage.editing_error_title"), //$NON-NLS-1$ Messages.getString("ApplicationSpecificPreferencePage.editing_error_message"), //$NON-NLS-1$ e); } } } } /** * Returns {@link GridApplicationParameters} corresponding to entry selected * in table. * * @return ApplicationSpecificObject selected in table */ public GridApplicationParameters getSelectedAppSpecificObject() { GridApplicationParameters selectedASO = null; IStructuredSelection selection = (IStructuredSelection) this.appsViewer.getSelection(); Object obj = selection.getFirstElement(); if (obj instanceof GridApplicationParameters) { selectedASO = (GridApplicationParameters) obj; } return selectedASO; } /** * Returns {@link GridApplicationParameters} corresponding to entry selected * in table. * * @return ApplicationSpecificObject selected in table */ public List<GridApplicationParameters> getSelectedAppSpecificObjects() { List<GridApplicationParameters> selectedASO = new ArrayList<GridApplicationParameters>(); IStructuredSelection selection = (IStructuredSelection) this.appsViewer.getSelection(); for (Object selObject : selection.toList()) { if (selObject instanceof GridApplicationParameters) { selectedASO.add((GridApplicationParameters) selObject); } } return selectedASO; } protected void updateButtons() { ISelection selection = this.appsViewer.getSelection(); boolean selectionAvailable = !selection.isEmpty(); this.addButton.setEnabled(true); // TODO mathias this.removeButton.setEnabled(selectionAvailable); this.editButton.setEnabled(selectionAvailable); } public void init(final IWorkbench workbench) { setPreferenceStore(Activator.getDefault().getPreferenceStore()); } class ApplicationSpecificPageContentProvider implements IStructuredContentProvider { public Object[] getElements(final Object inputElement) { GridApplicationParameters[] result = new GridApplicationParameters[0]; // ApplicationParametersRegistry.getInstance() // .updateApplicationsParameters( null ); result = ApplicationParametersRegistry.getInstance().getApplicationParameters(null).toArray(result); return result; } public void dispose() { // TODO Auto-generated method stub } public void inputChanged(final Viewer viewer, final Object oldInput, final Object newInput) { // TODO Auto-generated method stub } } class ApplicationSpecificLabelProvider extends LabelProvider implements ITableLabelProvider { public Image getColumnImage(final Object element, final int columnIndex) { return null; } public String getColumnText(final Object element, final int columnIndex) { String result = null; GridApplicationParameters asO = (GridApplicationParameters) element; switch (columnIndex) { case 0: // name result = asO.getApplicationName(); break; case 1: // appPath result = asO.getApplicationPath(); break; case 2: // XML path result = asO.getXmlPath().toOSString(); break; case 3: // JSDL path if (asO.getJsdlPath() != null) { result = asO.getJsdlPath().toOSString(); } break; default: result = ""; //$NON-NLS-1$ break; } return result; } } class EditDialog extends Dialog { Text xmlPath; Text jsdlPath; private Text appName; private Text appPath; private String appNameInit; private String appPathInit; private String xmlPathInit; private String jsdlPathInit; private String returnAppName; private String returnXMLPath; private String returnAppPath; private String returnJSDLPath; protected EditDialog(final Shell parentShell) { super(parentShell); } protected EditDialog(final Shell parentShell, final String appName, final String appPath, final String xmlPath, final String jsdlPath) { super(parentShell); this.appNameInit = appName; this.appPathInit = appPath; this.xmlPathInit = xmlPath; this.jsdlPathInit = jsdlPath; } @Override protected void createButtonsForButtonBar(final Composite parent) { super.createButtonsForButtonBar(parent); updateButtons(); } void updateButtons() { if (!this.appName.getText().equals("") //$NON-NLS-1$ && /* !this.appPath.getText().equals( "" ) && */!this.xmlPath.getText().equals("")) { //$NON-NLS-1$ super.getButton(IDialogConstants.OK_ID).setEnabled(true); } else { super.getButton(IDialogConstants.OK_ID).setEnabled(false); } } @Override protected Control createDialogArea(final Composite parent) { getShell().setText(Messages.getString("ApplicationSpecificPreferencePage.editDialogTitle")); //$NON-NLS-1$ Composite composite = (Composite) super.createDialogArea(parent); composite.setLayout(new GridLayout(1, false)); composite.setLayoutData(new GridData(GridData.FILL_BOTH)); Composite panel = new Composite(composite, SWT.NONE); this.initializeDialogUnits(composite); GridData gd; GridLayout gLayout = new GridLayout(3, false); panel.setLayout(gLayout); gd = new GridData(GridData.FILL_HORIZONTAL); panel.setLayoutData(gd); Label appNameLabel = new Label(panel, SWT.LEAD); appNameLabel .setText(Messages.getString("ApplicationSpecificPreferencePage.dialog_application_name_label")); //$NON-NLS-1$ gd = new GridData(); appNameLabel.setLayoutData(gd); this.appName = new Text(panel, SWT.BORDER); gd = new GridData(GridData.FILL_BOTH); gd.horizontalSpan = 2; this.appName.setLayoutData(gd); if (this.appNameInit != null) { this.appName.setText(this.appNameInit); } Label pathNameLabel = new Label(panel, SWT.LEAD); pathNameLabel .setText(Messages.getString("ApplicationSpecificPreferencePage.dialog_application_path_label")); //$NON-NLS-1$ gd = new GridData(); pathNameLabel.setLayoutData(new GridData()); this.appPath = new Text(panel, SWT.BORDER); gd = new GridData(GridData.FILL_BOTH); gd.widthHint = 250; gd.horizontalSpan = 2; this.appPath.setLayoutData(gd); if (this.appPathInit != null) { this.appPath.setText(this.appPathInit); } Label xmlPathLabel = new Label(panel, SWT.LEAD); xmlPathLabel.setText(Messages.getString("ApplicationSpecificPreferencePage.dialog_xml_label")); //$NON-NLS-1$ gd = new GridData(); xmlPathLabel.setLayoutData(new GridData()); this.xmlPath = new Text(panel, SWT.BORDER); gd = new GridData(GridData.FILL_HORIZONTAL); gd.grabExcessHorizontalSpace = true; // gd.horizontalSpan = 2; this.xmlPath.setLayoutData(gd); this.xmlPath.setLayoutData(gd); if (this.xmlPathInit != null) { this.xmlPath.setText(this.xmlPathInit); } Button browseButton = new Button(panel, SWT.PUSH); gd = new GridData(); browseButton.setLayoutData(gd); URL openFileIcon = Activator.getDefault().getBundle().getEntry("icons/obj16/open_file.gif"); //$NON-NLS-1$ Image openFileImage = ImageDescriptor.createFromURL(openFileIcon).createImage(); browseButton.setImage(openFileImage); browseButton.addSelectionListener(new SelectionAdapter() { @Override public void widgetSelected(final SelectionEvent event) { FileDialog file = new FileDialog(getShell()); file.setText(Messages.getString("ApplicationSpecificPreferencePage.selectXmlFile")); //$NON-NLS-1$ String connection = file.open(); if (connection != null) { EditDialog.this.xmlPath.setText(connection); } updateButtons(); } }); Label jsdlPathLabel = new Label(panel, SWT.LEAD); jsdlPathLabel.setText(Messages.getString("ApplicationSpecificPreferencePage.dialog_jsdl_label")); //$NON-NLS-1$ gd = new GridData(); jsdlPathLabel.setLayoutData(new GridData()); this.jsdlPath = new Text(panel, SWT.BORDER); gd = new GridData(GridData.FILL_HORIZONTAL); gd.grabExcessHorizontalSpace = true; // gd.horizontalSpan = 2; this.jsdlPath.setLayoutData(gd); this.jsdlPath.setLayoutData(gd); if (this.jsdlPathInit != null) { this.jsdlPath.setText(this.jsdlPathInit); } Button browseButton1 = new Button(panel, SWT.PUSH); gd = new GridData(); browseButton1.setLayoutData(gd); browseButton1.setImage(openFileImage); browseButton1.addSelectionListener(new SelectionAdapter() { @Override public void widgetSelected(final SelectionEvent event) { FileDialog file = new FileDialog(getShell()); file.setText(Messages.getString("ApplicationSpecificPreferencePage.selectJsdlFile")); //$NON-NLS-1$ String connection = file.open(); if (connection != null) { EditDialog.this.jsdlPath.setText(connection); } updateButtons(); } }); ModifyListener selectionAdapter = new updateAdapter(); this.appName.addModifyListener(selectionAdapter); this.appPath.addModifyListener(selectionAdapter); this.xmlPath.addModifyListener(selectionAdapter); return composite; } @Override protected void okPressed() { this.returnAppName = this.appName.getText(); this.returnAppPath = this.appPath.getText(); this.returnXMLPath = this.xmlPath.getText(); this.returnJSDLPath = this.jsdlPath.getText(); super.okPressed(); } /** * Method to access value of application name provided by user in dialog. * * @return application name */ public String getAppName() { return this.returnAppName; } /** * Method to access value of application path (path to executable file of * application) provided by user in dialog. * * @return application path */ public String getAppPath() { return this.returnAppPath; } /** * Method to access value of path to XML (this file defines how New Job * Wizard's extra pages should look like)provided by user in dialog. * * @return path to XML file */ public String getXMLPath() { return this.returnXMLPath; } /** * Method to access value of path to base JSDL file * * @return path to JSDL file */ public String getJSDLPath() { return this.returnJSDLPath; } class updateAdapter implements ModifyListener { public void modifyText(final ModifyEvent event) { updateButtons(); } } } public void contentChanged(final IContentChangeNotifier source) { if (source instanceof ApplicationParametersRegistry) { PlatformUI.getWorkbench().getDisplay().asyncExec(new Runnable() { public void run() { ApplicationParametersPreferencePage.this.appsViewer.refresh(); } }); } } }