blob: 79ed4d27119018c368207145d4b76c9c5be79e73 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2013, 2020 Dirk Fauth and others.
*
* This program and the accompanying materials are made
* available under the terms of the Eclipse Public License 2.0
* which is available at https://www.eclipse.org/legal/epl-2.0/
*
* SPDX-License-Identifier: EPL-2.0
*
* Contributors:
* Dirk Fauth <dirk.fauth@googlemail.com> - initial API and implementation
*******************************************************************************/
package org.eclipse.nebula.widgets.nattable.edit.gui;
import org.eclipse.nebula.widgets.nattable.config.IConfigRegistry;
import org.eclipse.nebula.widgets.nattable.edit.DialogEditHandler;
import org.eclipse.nebula.widgets.nattable.edit.EditConfigAttributes;
import org.eclipse.nebula.widgets.nattable.edit.editor.ICellEditor;
import org.eclipse.nebula.widgets.nattable.layer.cell.ILayerCell;
import org.eclipse.nebula.widgets.nattable.style.DisplayMode;
import org.eclipse.nebula.widgets.nattable.tickupdate.ITickUpdateHandler;
import org.eclipse.nebula.widgets.nattable.tickupdate.TickUpdateConfigAttributes;
import org.eclipse.nebula.widgets.nattable.widget.EditModeEnum;
import org.eclipse.swt.widgets.Shell;
/**
* Factory to create {@link ICellEditDialog} instances that should be opened for
* editing cell values.
*/
public final class CellEditDialogFactory {
private CellEditDialogFactory() {
// private default constructor for helper class
}
/**
* Will determine and return the {@link ICellEditDialog} to open for editing
* a cell value. For this the type of the {@link ICellEditor} and the
* configuration for tick updates are checked. Will return the default
* {@link CellEditDialog} for the given {@link ICellEditor} for cell editors
* that wrap an edit control. If the {@link ICellEditor} itself is a
* {@link ICellEditDialog}, it will returned itself without creating a new
* one.
*
* @param parentShell
* the parent shell, or <code>null</code> to create a top-level
* shell
* @param originalCanonicalValue
* The value that should be propagated to the editor control.
* Needed because for multi cell editing or editor activation by
* letter/digit key will result in a different value to populate
* for some editors than populating the value out of the
* cell/data model directly.
* @param cell
* The cell that should be edited. Needed because editor
* activation retrieves the configuration for editing directly
* out of the cell.
* @param cellEditor
* The cell editor that should be used for multi cell editing.
* @param configRegistry
* The {@link IConfigRegistry} containing the configuration of
* the current NatTable instance the command should be executed
* for. This is necessary because the edit controllers in the
* current architecture are not aware of the instance they are
* running in and therefore it is needed for activation of
* editors.
* @return The {@link ICellEditDialog} that should be opened for editing a
* cell value.
*/
public static ICellEditDialog createCellEditDialog(Shell parentShell,
final Object originalCanonicalValue, final ILayerCell cell,
final ICellEditor cellEditor, final IConfigRegistry configRegistry) {
ICellEditDialog result = null;
// if the cell editor itself is a ICellEditDialog, simply return it
if (cellEditor instanceof ICellEditDialog) {
// activate the editor and then return it
cellEditor.activateCell(
parentShell,
originalCanonicalValue,
EditModeEnum.DIALOG,
new DialogEditHandler(),
cell,
configRegistry);
result = (ICellEditDialog) cellEditor;
} else {
ITickUpdateHandler tickUpdateHandler = configRegistry.getConfigAttribute(
TickUpdateConfigAttributes.UPDATE_HANDLER,
DisplayMode.EDIT,
cell.getConfigLabels());
if (tickUpdateHandler != null
&& tickUpdateHandler.isApplicableFor(cell.getDataValue())) {
// if a tick update handler is applicable, return the
// TickUpdateCellEditDialog
result = new TickUpdateCellEditDialog(
parentShell,
originalCanonicalValue,
cell,
cellEditor,
configRegistry,
tickUpdateHandler);
} else {
// return the default edit dialog that will show the underlying
// editor
result = new CellEditDialog(
parentShell,
originalCanonicalValue,
cell,
cellEditor,
configRegistry);
}
}
// check if there are custom edit dialog settings registered
result.setDialogSettings(configRegistry.getConfigAttribute(
EditConfigAttributes.EDIT_DIALOG_SETTINGS,
DisplayMode.EDIT,
cell.getConfigLabels()));
return result;
}
}