/**
* Copyright 2014 Microsoft Open Technologies Inc.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.microsoftopentechnologies.intellij.wizards.createvm;
import com.intellij.openapi.application.ApplicationManager;
import com.intellij.openapi.progress.ProgressIndicator;
import com.intellij.openapi.progress.ProgressManager;
import com.intellij.openapi.progress.Task;
import com.intellij.openapi.project.Project;
import com.intellij.ui.wizard.WizardNavigationState;
import com.intellij.ui.wizard.WizardStep;
import com.microsoftopentechnologies.intellij.helpers.UIHelper;
import com.microsoftopentechnologies.intellij.helpers.azure.AzureCmdException;
import com.microsoftopentechnologies.intellij.helpers.azure.sdk.AzureSDKManagerImpl;
import com.microsoftopentechnologies.intellij.model.vm.VirtualMachineImage;
import javax.swing.*;
import javax.swing.event.HyperlinkEvent;
import javax.swing.event.HyperlinkListener;
import javax.swing.event.ListSelectionEvent;
import javax.swing.event.ListSelectionListener;
import java.awt.*;
import java.awt.event.ItemEvent;
import java.awt.event.ItemListener;
import java.text.SimpleDateFormat;
import java.util.*;
import java.util.List;
public class SelectImageStep extends WizardStep<CreateVMWizardModel> {
private JPanel rootPanel;
private JList createVmStepsList;
private JComboBox imageTypeComboBox;
private JList imageLabelList;
private JEditorPane imageDescriptionTextPane;
private JPanel imageInfoPanel;
CreateVMWizardModel model;
private void createUIComponents() {
imageInfoPanel = new JPanel() {
@Override
public Dimension getPreferredSize() {
double height = 0;
for (Component component : this.getComponents()) {
height += component.getHeight();
}
Dimension preferredSize = super.getPreferredSize();
preferredSize.setSize(preferredSize.getWidth(), height);
return preferredSize;
}
};
}
private enum PublicImages {
WindowsServer,
SharePoint,
BizTalkServer,
SQLServer,
VisualStudio,
Linux,
Other;
@Override
public String toString() {
switch (this) {
case WindowsServer:
return "Windows Server";
case BizTalkServer:
return "BizTalk Server";
case SQLServer:
return "SQL Server";
case VisualStudio:
return "Visual Studio";
default:
return super.toString();
}
}
}
private enum MSDNImages {
BizTalkServer,
Dynamics,
VisualStudio,
Other;
@Override
public String toString() {
switch (this) {
case BizTalkServer:
return "BizTalk Server";
case VisualStudio:
return "Visual Studio";
default:
return super.toString();
}
}
}
private enum PrivateImages {
VMImages;
@Override
public String toString() {
switch (this) {
case VMImages:
return "VM Images";
default:
return super.toString();
}
}
}
Map<Enum, List<VirtualMachineImage>> virtualMachineImages;
private Project project;
public SelectImageStep(final CreateVMWizardModel model, Project project) {
super("Select a Virtual Machine Image", null, null);
this.model = model;
this.project = project;
model.configStepList(createVmStepsList, 1);
final ArrayList imageTypeList = new ArrayList();
imageTypeList.add("Public Images");
imageTypeList.addAll(Arrays.asList(PublicImages.values()));
imageTypeList.add("MSDN Images");
imageTypeList.addAll(Arrays.asList(MSDNImages.values()));
imageTypeList.add("Private Images");
imageTypeList.addAll(Arrays.asList(PrivateImages.values()));
imageTypeComboBox.setModel(new DefaultComboBoxModel(imageTypeList.toArray()) {
@Override
public void setSelectedItem(Object o) {
if (o instanceof Enum) {
super.setSelectedItem(o);
}
}
});
imageTypeComboBox.setRenderer(new DefaultListCellRenderer() {
@Override
public Component getListCellRendererComponent(JList jList, Object o, int i, boolean b, boolean b1) {
if (o instanceof Enum) {
return super.getListCellRendererComponent(jList, " " + o.toString(), i, b, b1);
} else {
JLabel label = new JLabel(o.toString());
Font f = label.getFont();
label.setFont(f.deriveFont(f.getStyle()
| Font.BOLD | Font.ITALIC));
return label;
}
}
});
imageTypeComboBox.addItemListener(new ItemListener() {
@Override
public void itemStateChanged(ItemEvent itemEvent) {
fillList();
}
});
imageLabelList.setCellRenderer(new DefaultListCellRenderer() {
@Override
public Component getListCellRendererComponent(JList jList, Object o, int i, boolean b, boolean b1) {
String cellValue = o.toString();
if (o instanceof VirtualMachineImage) {
VirtualMachineImage virtualMachineImage = (VirtualMachineImage) o;
cellValue = String.format("%s (%s)",
virtualMachineImage.getLabel(),
new SimpleDateFormat("yyyy-MM-dd").format(virtualMachineImage.getPublishedDate().getTime()));
}
this.setToolTipText(cellValue);
return super.getListCellRendererComponent(jList, cellValue, i, b, b1);
}
});
imageLabelList.addListSelectionListener(new ListSelectionListener() {
@Override
public void valueChanged(ListSelectionEvent listSelectionEvent) {
VirtualMachineImage virtualMachineImage = (VirtualMachineImage) imageLabelList.getSelectedValue();
model.setVirtualMachineImage(virtualMachineImage);
if (virtualMachineImage != null) {
imageDescriptionTextPane.setText(model.getHtmlFromVMImage(virtualMachineImage));
imageDescriptionTextPane.setCaretPosition(0);
model.getCurrentNavigationState().NEXT.setEnabled(true);
}
}
});
imageDescriptionTextPane.addHyperlinkListener(new HyperlinkListener() {
@Override
public void hyperlinkUpdate(HyperlinkEvent hyperlinkEvent) {
if (hyperlinkEvent.getEventType() == HyperlinkEvent.EventType.ACTIVATED) {
if (Desktop.isDesktopSupported()) {
try {
Desktop.getDesktop().browse(hyperlinkEvent.getURL().toURI());
} catch (Exception e) {
UIHelper.showException("Error opening link", e);
}
}
}
}
});
}
@Override
public JComponent prepare(WizardNavigationState wizardNavigationState) {
rootPanel.revalidate();
if (virtualMachineImages == null) {
imageTypeComboBox.setEnabled(false);
model.getCurrentNavigationState().NEXT.setEnabled(false);
imageLabelList.setListData(new String[]{"loading..."});
imageLabelList.setEnabled(false);
ProgressManager.getInstance().run(new Task.Backgroundable(project, "Loading virtual machine images...", false) {
@Override
public void run(ProgressIndicator progressIndicator) {
progressIndicator.setIndeterminate(true);
try {
for (VirtualMachineImage virtualMachineImage : AzureSDKManagerImpl.getManager().getVirtualMachineImages(model.getSubscription().getId().toString())) {
if (virtualMachineImage.isShowInGui()) {
Enum type = null;
if (virtualMachineImage.getCategory().equals("Public")) {
for (PublicImages publicImage : PublicImages.values()) {
if (virtualMachineImage.getPublisherName().contains(publicImage.toString())) {
type = publicImage;
} else if (virtualMachineImage.getOperatingSystemType().equals(publicImage.toString())) {
type = publicImage;
}
}
if (type == null) {
type = PublicImages.Other;
}
} else if (virtualMachineImage.getCategory().equals("Private")) {
type = PrivateImages.VMImages;
} else {
for (MSDNImages msdnImages : MSDNImages.values()) {
if (virtualMachineImage.getPublisherName().contains(msdnImages.toString())) {
type = msdnImages;
} else if (virtualMachineImage.getOperatingSystemType().equals(msdnImages.toString())) {
type = msdnImages;
}
}
if (type == null) {
type = MSDNImages.Other;
}
}
if (virtualMachineImages == null) {
virtualMachineImages = new HashMap<Enum, List<VirtualMachineImage>>();
}
if (!virtualMachineImages.containsKey(type)) {
virtualMachineImages.put(type, new ArrayList<VirtualMachineImage>());
}
virtualMachineImages.get(type).add(virtualMachineImage);
}
}
ApplicationManager.getApplication().invokeLater(new Runnable() {
@Override
public void run() {
imageTypeComboBox.setEnabled(true);
imageLabelList.setEnabled(true);
imageTypeComboBox.setSelectedIndex(1);
}
});
} catch (AzureCmdException e) {
UIHelper.showException("Error getting Virtual Machine Images", e);
}
}
});
}
return rootPanel;
}
private void fillList() {
model.getCurrentNavigationState().NEXT.setEnabled(false);
Enum imageType = (Enum) imageTypeComboBox.getSelectedItem();
List<VirtualMachineImage> machineImages = virtualMachineImages.get(imageType);
imageLabelList.setListData(machineImages == null ? new Object[]{} : machineImages.toArray());
if (machineImages != null && machineImages.size() > 0) {
imageLabelList.setSelectedIndex(0);
}
}
}