/*******************************************************************************
* Copyright (c) 2006-2011 Gluster, Inc. <http://www.gluster.com>
* This file is part of Gluster Management Console.
*
* Gluster Management Console is free software; you can redistribute
* it and/or modify it under the terms of the GNU General Public
* License as published by the Free Software Foundation; either
* version 3 of the License, or (at your option) any later version.
*
* Gluster Management Console is distributed in the hope that it
* will be useful, but WITHOUT ANY WARRANTY; without even the
* implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
* PURPOSE. See the GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see
* <http://www.gnu.org/licenses/>.
*******************************************************************************/
/**
*
*/
package org.gluster.storage.management.console.views.pages;
import java.util.ArrayList;
import java.util.List;
import org.eclipse.jface.viewers.CellEditor;
import org.eclipse.jface.viewers.ColumnViewer;
import org.eclipse.jface.viewers.ComboBoxCellEditor;
import org.eclipse.jface.viewers.EditingSupport;
import org.eclipse.swt.SWT;
import org.eclipse.swt.widgets.Composite;
import org.gluster.storage.management.console.GlusterDataModelManager;
import org.gluster.storage.management.core.model.Volume;
import org.gluster.storage.management.core.model.VolumeOption;
import org.gluster.storage.management.core.model.VolumeOptionInfo;
import org.gluster.storage.management.core.model.VolumeOptions;
/**
* Editing support for the "value" column in volume options table viewer.
*/
public class OptionKeyEditingSupport extends EditingSupport {
private CellEditor cellEditor;
private Volume volume;
private List<VolumeOptionInfo> defaults = GlusterDataModelManager.getInstance().getVolumeOptionsInfo();
private String[] allowedKeys;
private ColumnViewer viewer;
public OptionKeyEditingSupport(ColumnViewer viewer, Volume volume) {
super(viewer);
this.volume = volume;
this.viewer = viewer;
}
/**
* @return array of option keys that are not already set on the volume
*/
private String[] getAllowedKeys() {
ArrayList<String> keys = new ArrayList<String>();
VolumeOptions volumeOptions = volume.getOptions();
for(VolumeOptionInfo optionInfo : defaults) {
String optionName = optionInfo.getName();
if(!volumeOptions.containsKey(optionName) || volumeOptions.get(optionName).isEmpty()) {
// key not set => available for setting
// value not set => this is the row being edited
keys.add(optionName);
}
}
return keys.toArray(new String[0]);
}
@Override
protected void setValue(final Object element, final Object value) {
VolumeOption oldEntry = (VolumeOption)element;
Integer newValue = (Integer)value;
String newKey = allowedKeys[newValue];
if (((VolumeOption)element).getKey().equals(newKey)) {
// selected value is same as old one.
return;
}
// value has changed. set new value and refresh the viewer.
volume.getOptions().remove(oldEntry.getKey());
volume.setOption(newKey, "");
getViewer().refresh();
}
@Override
protected Object getValue(Object element) {
VolumeOption entryBeingAdded = getEntryBeingAdded();
if(entryBeingAdded == null) {
return cellEditor.getValue();
}
if(entryBeingAdded.getKey().isEmpty()) {
// editing just about to start. set first element as default.
return 0;
}
return getIndexOfEntry(entryBeingAdded);
}
@Override
protected CellEditor getCellEditor(Object element) {
allowedKeys = getAllowedKeys();
cellEditor = new ComboBoxCellEditor((Composite) viewer.getControl(), allowedKeys, SWT.READ_ONLY);
return cellEditor;
}
private int getIndexOfEntry(VolumeOption entryBeingAdded) {
for(int index = 0; index < allowedKeys.length; index++) {
if(allowedKeys[index].equals(entryBeingAdded.getKey())) {
return index;
}
}
return -1;
}
protected VolumeOption getEntryBeingAdded() {
List<VolumeOption> options = volume.getOptions().getOptions();
int size = options.size();
String lastValue = options.get(size - 1).getValue();
if(lastValue == null || lastValue.isEmpty()) {
// it's the LAST entry, and it's value is empty.
// means this is a new row being added in the table viewer.
return options.get(size - 1);
}
return null;
}
@Override
protected boolean canEdit(Object element) {
VolumeOption entry = (VolumeOption)element;
return (entry.getKey().isEmpty() || entry.getValue().isEmpty());
}
}