package org.openslx.dozmod.gui.window;
import java.awt.Window;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.nio.ByteBuffer;
import org.openslx.dozmod.gui.Gui;
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.ImageDetailsActions.VirtConfCallback;
import org.openslx.dozmod.thrift.cache.MetaDataCache;
import org.openslx.util.ThriftUtil;
import org.openslx.util.vm.VmwareMetaData;
import org.openslx.util.vm.VmwareMetaData.DDAcceleration;
import org.openslx.util.vm.VmwareMetaData.EthernetDevType;
import org.openslx.util.vm.VmwareMetaData.HWVersion;
import org.openslx.util.vm.VmwareMetaData.SoundCardType;
@SuppressWarnings("serial")
public class VirtDropDownConfigEditorWindow extends VirtDropDownConfigEditorWindowLayout
implements UiFeedback {
public interface VirtConfigChanged {
public void virtConfigChanged(String newVmx);
}
private final String imageVersionId;
private final String originalMachineDescription;
private final VirtDropDownConfigEditorWindow me = this;
private final VmwareMetaData meta;
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
meta = new VmwareMetaData(MetaDataCache.getOperatingSystems(), machineDescription.array(),
machineDescription.array().length);
//set the initial state of the buttons
setTheBoxes(meta);
// listener for the sound card drop box
cboSound.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
SoundCardType selected = (SoundCardType) cboSound.getSelectedItem();
meta.setSoundCard(selected);
checkForChange();
}
});
// listener for the 3Dacceleration drop box
cbo3DAcceleration.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
DDAcceleration selected = (DDAcceleration) cbo3DAcceleration.getSelectedItem();
meta.setDDAcceleration(selected);
checkForChange();
}
});
// listener for the Hardware version drop box
cboHWVersion.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
HWVersion selected = (HWVersion) cboHWVersion.getSelectedItem();
meta.setHWVersion(selected);
checkForChange();
}
});
// listener for the Virtual Ethernet device drop box
cboE0VirtDev.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
EthernetDevType selected = (EthernetDevType) cboE0VirtDev.getSelectedItem();
meta.setEthernetDevType(0, selected);
checkForChange();
}
});
// 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 profi button
btnMore.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
if (Gui.showMessageBox(me,
"Bitte beachten Sie: dieser Modus ist für erfahrene Nutzer geeignet. \n Möchten Sie wirklich diesen Modus fortsetzen?",
MessageType.QUESTION_YESNO, null, null))
me.dispose();
VirtConfigEditorWindow.open(me, actionHandler, imageVersionId,
ByteBuffer.wrap(meta.getDefinitionArray()), originalMachineDescription);
}
});
this.originalMachineDescription = ThriftUtil.byteBufferToString(machineDescription);
btnSave.setEnabled(false);
}
protected void checkForChange() {
if (!originalMachineDescription
.equals(ThriftUtil.byteBufferToString(ByteBuffer.wrap(meta.getDefinitionArray())))) {
btnSave.setEnabled(true);
} else {
btnSave.setEnabled(false);
}
}
/* setting the boxes to their initial value...value is read from the given metaData
* @param: given VmwareMetaData
*/
private void setTheBoxes(VmwareMetaData m) {
SoundCardType SCT = m.getSoundCard();
cboSound.setSelectedItem(SCT);
DDAcceleration DDA = m.getDDAcceleration();
cbo3DAcceleration.setSelectedItem(DDA);
HWVersion HWV = m.getHWVersion();
cboHWVersion.setSelectedItem(HWV);
EthernetDevType E0VD = m.getEthernetDevType(0);
cboE0VirtDev.setSelectedItem(E0VD);
}
private void saveClicked() {
// we have a valid vmx or the user accepted to push the filtered input
actionHandler.setVirtualizerConfig(imageVersionId, ByteBuffer.wrap(meta.getDefinitionArray()),
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 void safeClose() {
if (originalMachineDescription
.equals(ThriftUtil.byteBufferToString(ByteBuffer.wrap(meta.getDefinitionArray())))
|| Gui.showMessageBox(me,
"Wollen Sie wirklich abbrechen?\n" + "Ihre Änderungen werden verworfen.",
MessageType.QUESTION_YESNO, null, null))
dispose();
}
@Override
public boolean wantConfirmQuit() {
return !originalMachineDescription
.equals(ThriftUtil.byteBufferToString(ByteBuffer.wrap(meta.getDefinitionArray())));
}
@Override
public void escapePressed() {
safeClose();
}
}