Java tutorial
/* * Licensed to the Apache Software Foundation (ASF) under one * or more contributor license agreements. See the NOTICE file * distributed with this work for additional information * regarding copyright ownership. The ASF licenses this file * to you 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 org.apache.directory.studio.aciitemeditor.dialogs; import java.util.List; import org.apache.directory.studio.aciitemeditor.ACIItemValueWithContext; import org.apache.directory.studio.aciitemeditor.Activator; import org.apache.directory.studio.ldapbrowser.core.model.IAttribute; import org.apache.directory.studio.ldapbrowser.core.model.IValue; import org.apache.directory.studio.ldapbrowser.core.model.impl.Attribute; import org.apache.directory.studio.ldapbrowser.core.model.impl.Value; import org.apache.directory.studio.valueeditors.AbstractDialogStringValueEditor; import org.eclipse.jface.dialogs.Dialog; import org.eclipse.jface.dialogs.IDialogConstants; import org.eclipse.jface.viewers.ArrayContentProvider; import org.eclipse.jface.viewers.CellEditor; import org.eclipse.jface.viewers.DoubleClickEvent; import org.eclipse.jface.viewers.IDoubleClickListener; import org.eclipse.jface.viewers.ISelectionChangedListener; import org.eclipse.jface.viewers.IStructuredSelection; import org.eclipse.jface.viewers.LabelProvider; import org.eclipse.jface.viewers.SelectionChangedEvent; import org.eclipse.jface.viewers.TableViewer; import org.eclipse.swt.SWT; 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.Button; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Control; import org.eclipse.swt.widgets.Shell; import org.eclipse.swt.widgets.Table; /** * Dialog to edit user classes or protected items with multiple values. * * @author <a href="mailto:dev@directory.apache.org">Apache Directory Project</a> */ public class MultiValuedDialog extends Dialog { /** The dialog title */ private String displayName; /** The value editor */ private AbstractDialogStringValueEditor valueEditor; /** The values, may be empty. */ private List<String> values; /** The context */ private ACIItemValueWithContext context; /** The inner composite for all the content */ private Composite composite = null; /** The table viewer containing all user classes */ private TableViewer tableViewer = null; /** The edit button */ private Button editButton = null; /** The delete button */ private Button deleteButton = null; /** * Creates a new instance of MultiValuedDialog. * * @param parentShell the shell * @param displayName the display name of the edited element * @param values a modifiable list of values * @param context the context * @param valueEditor the detail value editor */ public MultiValuedDialog(Shell parentShell, String displayName, List<String> values, ACIItemValueWithContext context, AbstractDialogStringValueEditor valueEditor) { super(parentShell); super.setShellStyle(super.getShellStyle() | SWT.RESIZE); this.displayName = displayName; this.values = values; this.context = context; this.valueEditor = valueEditor; } /** * {@inheritDoc} * * Sets the dialog title. */ protected void configureShell(Shell shell) { super.configureShell(shell); shell.setText(Messages.getString("MultiValuedDialog.dialog.titlePrefix") + displayName); //$NON-NLS-1$ shell.setImage(Activator.getDefault().getImage(Messages.getString("MultiValuedDialog.dialog.icon"))); //$NON-NLS-1$ } /** * {@inheritDoc} * * Creates only a OK button. */ protected void createButtonsForButtonBar(Composite parent) { createButton(parent, IDialogConstants.OK_ID, IDialogConstants.OK_LABEL, false); } /** * {@inheritDoc} */ protected Control createDialogArea(Composite parent) { // create composite composite = (Composite) super.createDialogArea(parent); GridData gd = new GridData(GridData.FILL_BOTH); gd.widthHint = convertHorizontalDLUsToPixels(IDialogConstants.MINIMUM_MESSAGE_AREA_WIDTH); gd.heightHint = convertHorizontalDLUsToPixels(IDialogConstants.MINIMUM_MESSAGE_AREA_WIDTH / 2); composite.setLayoutData(gd); GridLayout layout = (GridLayout) composite.getLayout(); layout.makeColumnsEqualWidth = false; layout.numColumns = 2; createTable(); createButtonComposite(); applyDialogFont(composite); return composite; } /** * This method initializes table and table viewer */ private void createTable() { GridData tableGridData = new GridData(GridData.FILL_BOTH); tableGridData.grabExcessHorizontalSpace = true; tableGridData.verticalAlignment = GridData.FILL; tableGridData.horizontalAlignment = GridData.FILL; //tableGridData.heightHint = 100; Table table = new Table(composite, SWT.BORDER); table.setHeaderVisible(false); table.setLayoutData(tableGridData); table.setLinesVisible(false); tableViewer = new TableViewer(table); tableViewer.setContentProvider(new ArrayContentProvider()); tableViewer.setLabelProvider(new LabelProvider()); tableViewer.setInput(values); tableViewer.addSelectionChangedListener(new ISelectionChangedListener() { public void selectionChanged(SelectionChangedEvent event) { valueSelected(); } }); tableViewer.addDoubleClickListener(new IDoubleClickListener() { public void doubleClick(DoubleClickEvent event) { editValue(); } }); } /** * This method initializes buttons */ private void createButtonComposite() { GridData deleteButtonGridData = new GridData(); deleteButtonGridData.horizontalAlignment = GridData.FILL; deleteButtonGridData.grabExcessHorizontalSpace = false; deleteButtonGridData.verticalAlignment = GridData.BEGINNING; deleteButtonGridData.widthHint = Activator.getButtonWidth(composite); GridData editButtonGridData = new GridData(); editButtonGridData.horizontalAlignment = GridData.FILL; editButtonGridData.grabExcessHorizontalSpace = false; editButtonGridData.verticalAlignment = GridData.BEGINNING; editButtonGridData.widthHint = Activator.getButtonWidth(composite); GridData addButtonGridData = new GridData(); addButtonGridData.horizontalAlignment = GridData.FILL; addButtonGridData.grabExcessHorizontalSpace = false; addButtonGridData.verticalAlignment = GridData.BEGINNING; addButtonGridData.widthHint = Activator.getButtonWidth(composite); GridLayout gridLayout = new GridLayout(); gridLayout.marginWidth = 0; gridLayout.marginHeight = 0; GridData gridData = new GridData(); gridData.horizontalAlignment = GridData.CENTER; gridData.grabExcessHorizontalSpace = false; gridData.grabExcessVerticalSpace = false; gridData.verticalAlignment = GridData.FILL; Composite buttonComposite = new Composite(composite, SWT.NONE); buttonComposite.setLayoutData(gridData); buttonComposite.setLayout(gridLayout); Button addButton = new Button(buttonComposite, SWT.NONE); addButton.setText(Messages.getString("MultiValuedDialog.button.add")); //$NON-NLS-1$ addButton.setLayoutData(addButtonGridData); addButton.addSelectionListener(new SelectionAdapter() { public void widgetSelected(SelectionEvent e) { addValue(); } }); editButton = new Button(buttonComposite, SWT.NONE); editButton.setText(Messages.getString("MultiValuedDialog.button.edit")); //$NON-NLS-1$ editButton.setLayoutData(editButtonGridData); editButton.addSelectionListener(new SelectionAdapter() { public void widgetSelected(SelectionEvent e) { editValue(); } }); editButton.setEnabled(false); deleteButton = new Button(buttonComposite, SWT.NONE); deleteButton.setText(Messages.getString("MultiValuedDialog.button.delete")); //$NON-NLS-1$ deleteButton.setLayoutData(deleteButtonGridData); deleteButton.addSelectionListener(new SelectionAdapter() { public void widgetSelected(SelectionEvent e) { deleteValue(); } }); deleteButton.setEnabled(false); } /** * Opens the editor and adds the new value to the list. */ private void addValue() { IAttribute attribute = new Attribute(context.getEntry(), ""); //$NON-NLS-1$ IValue value = new Value(attribute, ""); //$NON-NLS-1$ Object oldRawValue = valueEditor.getRawValue(value); //$NON-NLS-1$ CellEditor cellEditor = valueEditor.getCellEditor(); cellEditor.setValue(oldRawValue); cellEditor.activate(); Object newRawValue = cellEditor.getValue(); if (newRawValue != null) { String newValue = (String) valueEditor.getStringOrBinaryValue(newRawValue); values.add(newValue); tableViewer.refresh(); } } /** * Opens the editor with the currently selected * value and puts the modified value into the list. */ private void editValue() { String oldValue = getSelectedValue(); if (oldValue != null) { IAttribute attribute = new Attribute(context.getEntry(), ""); //$NON-NLS-1$ IValue value = new Value(attribute, oldValue); //$NON-NLS-1$ Object oldRawValue = valueEditor.getRawValue(value); //$NON-NLS-1$ CellEditor cellEditor = valueEditor.getCellEditor(); cellEditor.setValue(oldRawValue); cellEditor.activate(); Object newRawValue = cellEditor.getValue(); if (newRawValue != null) { String newValue = (String) valueEditor.getStringOrBinaryValue(newRawValue); values.remove(oldValue); values.add(newValue); tableViewer.refresh(); } } } /** * Deletes the currently selected value from list. */ private void deleteValue() { String value = getSelectedValue(); if (value != null) { values.remove(value); tableViewer.refresh(); } } /** * Called when value is selected in table viewer. * Updates the enabled/disabled state of the buttons. */ private void valueSelected() { String value = getSelectedValue(); if (value == null) { editButton.setEnabled(false); deleteButton.setEnabled(false); } else { editButton.setEnabled(true); deleteButton.setEnabled(true); } } /** * @return the value that is selected in the table viewer, or null. */ private String getSelectedValue() { String value = null; IStructuredSelection selection = (IStructuredSelection) tableViewer.getSelection(); if (!selection.isEmpty()) { Object element = selection.getFirstElement(); if (element instanceof String) { value = (String) element; } } return value; } }