package org.openslx.dozmod.gui.window;
import java.awt.Window;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.nio.ByteBuffer;
import org.apache.log4j.Logger;
import org.openslx.dozmod.gui.Gui;
import org.openslx.dozmod.gui.helper.I18n;
import org.openslx.dozmod.gui.helper.MessageType;
import org.openslx.dozmod.gui.helper.UiFeedback;
import org.openslx.dozmod.gui.window.layout.VirtDropDownConfigEditorWindowLayout;
import org.openslx.dozmod.thrift.ImageDetailsActions;
import org.openslx.dozmod.thrift.Session;
import org.openslx.dozmod.thrift.ImageDetailsActions.VirtConfCallback;
import org.openslx.dozmod.thrift.cache.MetaDataCache;
import org.openslx.sat.thrift.version.Feature;
import org.openslx.util.ThriftUtil;
import org.openslx.util.XmlHelper;
import org.openslx.virtualization.configuration.VirtualizationConfigurationVirtualBox;
import org.openslx.virtualization.Version;
import org.openslx.virtualization.configuration.VirtualizationConfiguration;
import org.openslx.virtualization.configuration.VirtualizationConfiguration.DDAcceleration;
import org.openslx.virtualization.configuration.VirtualizationConfiguration.EthernetDevType;
import org.openslx.virtualization.configuration.VirtualizationConfiguration.SoundCardType;
import org.openslx.virtualization.configuration.VirtualizationConfiguration.UsbSpeed;
public class VirtDropDownConfigEditorWindow extends VirtDropDownConfigEditorWindowLayout
implements UiFeedback {
/**
* Version for serialization.
*/
private static final long serialVersionUID = 230794205942072411L;
private final static Logger LOGGER = Logger.getLogger(VirtDropDownConfigEditorWindow.class);
public interface VirtConfigChanged {
public void virtConfigChanged(String newVmx);
}
private final String imageVersionId;
private final String originalMachineDescription;
private final VirtDropDownConfigEditorWindow me = this;
private VirtualizationConfiguration<?, ?, ?, ?> virtualizationConfig = null;
private final ImageDetailsActions actionHandler;
protected VirtDropDownConfigEditorWindow(Window modalParent, final ImageDetailsActions actionHandler,
final String imageVersionId, final ByteBuffer machineDescription) {
super(modalParent);
this.actionHandler = actionHandler;
this.imageVersionId = imageVersionId;
// and now for the meta data
byte[] machineData = ThriftUtil.unwrapByteBuffer(machineDescription);
try {
virtualizationConfig = VirtualizationConfiguration.getInstance(MetaDataCache.getOperatingSystems(),
machineData, machineData.length);
} catch (IOException e) {
LOGGER.error("Could not get VmMetaData instance from given machine description: ", e);
}
if (virtualizationConfig == null) {
this.originalMachineDescription = null;
dispose();
return;
}
initializeSoundBox(virtualizationConfig.getSupportedSoundCards());
initializeDDABox(virtualizationConfig.getSupportedDDAccs());
initializeHWVersBox(virtualizationConfig.getVirtualizer().getSupportedVersions());
initializeEDTBox(virtualizationConfig.getSupportedEthernetDevices());
initializeUsbBox(virtualizationConfig.getSupportedUsbSpeeds());
//set the initial state of the buttons
initializeComboBoxes(virtualizationConfig);
// listener for the sound card drop box
cboSound.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
SoundCardType selected = (SoundCardType) cboSound.getSelectedItem();
virtualizationConfig.setSoundCard(selected);
btnSave.setEnabled(hasChanged());
}
});
// listener for the 3Dacceleration drop box
cbo3DAcceleration.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
DDAcceleration selected = (DDAcceleration) cbo3DAcceleration.getSelectedItem();
virtualizationConfig.setDDAcceleration(selected);
btnSave.setEnabled(hasChanged());
}
});
// listener for the Hardware version drop box
cboHWVersion.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
Version selected = (Version) cboHWVersion.getSelectedItem();
virtualizationConfig.setVirtualizerVersion(selected);
btnSave.setEnabled(hasChanged());
}
});
// listener for the Virtual Ethernet device drop box
cboE0VirtDev.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
EthernetDevType selected = (EthernetDevType) cboE0VirtDev.getSelectedItem();
virtualizationConfig.setEthernetDevType(0, selected);
btnSave.setEnabled(hasChanged());
}
});
if (Session.hasFeature(Feature.CONFIGURE_USB)) {
cboMaxUsbSpeed.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
UsbSpeed selected = (UsbSpeed) cboMaxUsbSpeed.getSelectedItem();
virtualizationConfig.setMaxUsbSpeed(selected);
btnSave.setEnabled(hasChanged());
}
});
}
// listener for the save button
btnSave.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
saveClicked();
}
});
// listener for the cancel button
btnCancel.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
safeClose();
}
});
// listener for the expert mode
btnMore.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
// here we need special logic for formatting vbox file in a human-readable way...
// we will just format it before sending it to the editor window and reformat it right after...
String currentMachineDesc;
if (virtualizationConfig instanceof VirtualizationConfigurationVirtualBox)
currentMachineDesc = XmlHelper
.getFormattedXml(new ByteArrayInputStream(virtualizationConfig.getConfigurationAsByteArray()));
else
currentMachineDesc = ThriftUtil
.byteBufferToString(ByteBuffer.wrap(virtualizationConfig.getConfigurationAsByteArray()));
boolean didSave = VirtConfigEditorWindow.open(me, actionHandler, imageVersionId,
currentMachineDesc, originalMachineDescription);
// user did save the changes via the expert mode window - close this one too
if (didSave) {
dispose();
}
}
});
this.originalMachineDescription = ThriftUtil.byteBufferToString(machineDescription);
btnSave.setEnabled(false);
}
/*
* setting the boxes to their initial value...value is read from the given virtualization configuration
*/
private void initializeComboBoxes(VirtualizationConfiguration<?, ?, ?, ?> m) {
try {
SoundCardType SCT = m.getSoundCard();
cboSound.setSelectedItem(SCT);
DDAcceleration DDA = m.getDDAcceleration();
cbo3DAcceleration.setSelectedItem(DDA);
// initialize version value in combobox
Version HWV = m.getVirtualizerVersion();
if (HWV != null) {
// set version value specified in the virtualization configuration as default if specified
cboHWVersion.setSelectedItem(HWV);
}
EthernetDevType E0VD = m.getEthernetDevType(0);
cboE0VirtDev.setSelectedItem(E0VD);
UsbSpeed usbSpeed = m.getMaxUsbSpeed();
cboMaxUsbSpeed.setSelectedItem(usbSpeed);
} catch (IllegalArgumentException e) {
// TODO improve user message
Gui.showMessageBox(I18n.WINDOW.getString("VirtDropDownConfigEditor.Message.warning.initializeComboBoxes"),
MessageType.WARNING, null, e);
}
}
private void saveClicked() {
// we have a valid vmx or the user accepted to push the filtered input
actionHandler.setVirtualizerConfig(imageVersionId, ByteBuffer.wrap(virtualizationConfig.getConfigurationAsByteArray()),
new VirtConfCallback() {
@Override
public void virtConfCallback(boolean success) {
if (success) {
dispose();
}
}
});
}
public static void open(Window modalParent, final ImageDetailsActions handler,
final String imageVersionId, final ByteBuffer machineDescription) {
VirtDropDownConfigEditorWindow win = new VirtDropDownConfigEditorWindow(modalParent, handler,
imageVersionId, machineDescription);
win.setVisible(true);
}
private boolean hasChanged() {
return !originalMachineDescription
.equals(ThriftUtil.byteBufferToString(ByteBuffer.wrap(virtualizationConfig.getConfigurationAsByteArray())));
}
private void safeClose() {
if (!hasChanged() || Gui.showMessageBox(me,
I18n.WINDOW.getString("VirtDropDownConfigEditor.Message.yesNo.safeClose"),
MessageType.QUESTION_YESNO, null, null)) {
dispose();
}
}
@Override
public boolean wantConfirmQuit() {
return hasChanged();
}
@Override
public void escapePressed() {
safeClose();
}
}