/*******************************************************************************
* Copyright (c) 2012, 2017 Dirk Fauth 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:
* Dirk Fauth - initial API and implementation
*******************************************************************************/
package org.eclipse.nebula.widgets.nattable.persistence.command;
import java.util.ArrayList;
import java.util.List;
import java.util.Properties;
import org.eclipse.nebula.widgets.nattable.NatTable;
import org.eclipse.nebula.widgets.nattable.command.AbstractLayerCommandHandler;
import org.eclipse.nebula.widgets.nattable.persistence.gui.PersistenceDialog;
/**
* Command handler implementation for handling
* {@link DisplayPersistenceDialogCommand}s. It is used to open the
* corresponding dialog for save/load operations regarding the NatTable state.
* Will also serve as some kind of storage for the {@link Properties} instance
* holding the states.
*/
public class DisplayPersistenceDialogCommandHandler extends AbstractLayerCommandHandler<DisplayPersistenceDialogCommand> {
/**
* The {@link Properties} instance that should be used for saving and
* loading.
*/
private Properties properties;
/**
* List of {@link IStateChangedListener}s that will be notified if states
* are changed using this dialog.
*
* <p>
* Listeners that are registered with this command handler will be
* propagated to the newly created dialog that is created. This way the
* listeners only need to be registered once from a users point of view,
* while this handler will deal the correct registering.
* </p>
*/
private List<IStateChangedListener> stateChangeListeners = new ArrayList<IStateChangedListener>();
/**
* Create a new {@link DisplayPersistenceDialogCommandHandler}. Using this
* constructor the {@link Properties} instance used for save and load
* operations will be created. It can be accessed via
* {@link #getProperties()} for further usage.
*/
public DisplayPersistenceDialogCommandHandler() {
this(new Properties(), null);
}
/**
* Create a new {@link DisplayPersistenceDialogCommandHandler}. Using this
* constructor the {@link Properties} instance used for save and load
* operations will be created. It can be accessed via
* {@link #getProperties()} for further usage. The current state of the
* given NatTable instance will be used to store a default configuration.
* <p>
* <b>IMPORTANT:</b><br>
* To store a default configuration in the view configuration management
* based on a given NatTable instance, you need to create and register the
* {@link DisplayPersistenceDialogCommandHandler} <b><i>AFTER</i></b>
* calling {@link NatTable#configure()}. Otherwise some state information
* might be missing and it could cause some unexpected behavior, like broken
* sorting for example.
* </p>
*
* @param natTable
* The NatTable instance for which this handler is registered. If
* it is not <code>null</code>, the current state of that
* NatTable will be stored as default configuration. This default
* configuration can't be modified anymore in the opened dialog.
*/
public DisplayPersistenceDialogCommandHandler(NatTable natTable) {
this(new Properties(), natTable);
}
/**
* Create a new {@link DisplayPersistenceDialogCommandHandler} using the
* specified {@link Properties} instance.
*
* @param properties
* The {@link Properties} instance that should be used for saving
* and loading.
*/
public DisplayPersistenceDialogCommandHandler(Properties properties) {
this(properties, null);
}
/**
* Create a new {@link DisplayPersistenceDialogCommandHandler} using the
* specified {@link Properties} instance. The current state of the given
* NatTable instance will be used to store a default configuration.
* <p>
* <b>IMPORTANT:</b><br>
* To store a default configuration in the view configuration management
* based on a given NatTable instance, you need to create and register the
* {@link DisplayPersistenceDialogCommandHandler} <b><i>AFTER</i></b>
* calling {@link NatTable#configure()}. Otherwise some state information
* might be missing and it could cause some unexpected behavior, like broken
* sorting for example.
* </p>
*
* @param properties
* The {@link Properties} instance that should be used for saving
* and loading.
* @param natTable
* The NatTable instance for which this handler is registered. If
* it is not <code>null</code>, the current state of that
* NatTable will be stored as default configuration. This default
* configuration can't be modified anymore in the opened dialog.
*/
public DisplayPersistenceDialogCommandHandler(Properties properties, NatTable natTable) {
if (properties == null) {
throw new IllegalArgumentException("properties can not be null!"); //$NON-NLS-1$
}
this.properties = properties;
if (natTable != null) {
natTable.saveState("", this.properties); //$NON-NLS-1$
this.properties.setProperty(PersistenceDialog.ACTIVE_VIEW_CONFIGURATION_KEY, ""); //$NON-NLS-1$
}
}
@Override
protected boolean doCommand(DisplayPersistenceDialogCommand command) {
PersistenceDialog dialog = new PersistenceDialog(
command.getNatTable().getShell(),
command.getNatTable(),
this.properties);
// register the listeners
dialog.addAllStateChangeListener(this.stateChangeListeners);
// open the dialog
dialog.open();
return true;
}
/**
* @return The Properties instance that is used for saving and loading.
*/
public Properties getProperties() {
return this.properties;
}
/**
* @param properties
* The Properties instance that should be used for saving and
* loading.
*/
public void setProperties(Properties properties) {
if (properties == null) {
throw new IllegalArgumentException("properties can not be null!"); //$NON-NLS-1$
}
this.properties = properties;
}
/**
* Add the given {@link IStateChangedListener} to the local list of
* listeners. The {@link IStateChangedListener} will be registered on every
* {@link PersistenceDialog} that is opened via this command handler.
*
* @param listener
* The listener to add.
*/
public void addStateChangeListener(IStateChangedListener listener) {
this.stateChangeListeners.add(listener);
}
/**
* Removes the given {@link IStateChangedListener} from the local list of
* listeners.
*
* @param listener
* The listener to remove.
*/
public void removeStateChangeListener(IStateChangedListener listener) {
this.stateChangeListeners.remove(listener);
}
@Override
public Class<DisplayPersistenceDialogCommand> getCommandClass() {
return DisplayPersistenceDialogCommand.class;
}
}