/*
* Copyright 2013-2017 consulo.io
*
* 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 consulo.ui.bundle;
import com.intellij.openapi.module.Module;
import com.intellij.openapi.project.ProjectBundle;
import com.intellij.openapi.projectRoots.Sdk;
import com.intellij.openapi.projectRoots.SdkModel;
import com.intellij.openapi.projectRoots.SdkTypeId;
import com.intellij.openapi.util.Condition;
import com.intellij.openapi.util.Conditions;
import consulo.module.extension.ModuleExtension;
import consulo.module.extension.MutableModuleInheritableNamedPointer;
import consulo.ui.*;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import javax.swing.*;
/**
* @author VISTALL
* @since 05-Feb-17
* <p>
* Crossplatform version of {@link consulo.roots.ui.configuration.SdkComboBox}
*/
public class BundleComboBox implements PseudoComponent {
public static class SdkComboBoxItem {
private final Sdk mySdk;
public SdkComboBoxItem(@Nullable Sdk sdk) {
mySdk = sdk;
}
public Sdk getSdk() {
return mySdk;
}
@Nullable
public String getSdkName() {
return mySdk != null ? mySdk.getName() : null;
}
}
public static class ModuleExtensionSdkComboBoxItem extends SdkComboBoxItem {
private final ModuleExtension<?> myModuleExtension;
private final MutableModuleInheritableNamedPointer<Sdk> mySdkPointer;
public ModuleExtensionSdkComboBoxItem(ModuleExtension<?> moduleExtension, MutableModuleInheritableNamedPointer<Sdk> sdkPointer) {
super(null);
myModuleExtension = moduleExtension;
mySdkPointer = sdkPointer;
}
@Override
public Sdk getSdk() {
return mySdkPointer.get();
}
@Nullable
@Override
public String getSdkName() {
return mySdkPointer.getName();
}
@NotNull
public Module getModule() {
return myModuleExtension.getModule();
}
}
public static class CustomSdkComboBoxItem extends SdkComboBoxItem {
private final String myKey;
private final String myPresentableName;
private final Icon myIcon;
public CustomSdkComboBoxItem(String key, String presentableName, Icon icon) {
super(null);
myKey = key;
myPresentableName = presentableName;
myIcon = icon;
}
@NotNull
public Icon getIcon() {
return myIcon;
}
@NotNull
public String getPresentableName() {
return myPresentableName;
}
@Nullable
@Override
public String getSdkName() {
return myKey;
}
}
public static class InvalidModuleComboBoxItem extends SdkComboBoxItem {
private final String myModuleName;
public InvalidModuleComboBoxItem(String moduleName) {
super(null);
myModuleName = moduleName;
}
@NotNull
public String getModuleName() {
return myModuleName;
}
}
public static class NullSdkComboBoxItem extends SdkComboBoxItem {
public NullSdkComboBoxItem() {
super(null);
}
}
private static class InvalidSdkComboBoxItem extends SdkComboBoxItem {
private final String mySdkName;
public InvalidSdkComboBoxItem(String name) {
super(null);
mySdkName = name;
}
@Override
public String getSdkName() {
return mySdkName;
}
}
private static Condition<Sdk> getSdkFilter(@Nullable final Condition<SdkTypeId> filter) {
return filter == null ? Conditions.<Sdk>alwaysTrue() : sdk -> filter.value(sdk.getSdkType());
}
private final ComboBox<SdkComboBoxItem> myOriginalComboBox;
@Nullable
private final Condition<SdkTypeId> myFilter;
@Nullable
private final Condition<SdkTypeId> myCreationFilter;
public BundleComboBox(@NotNull final SdkModel sdksModel) {
this(sdksModel, null, false);
}
public BundleComboBox(@NotNull SdkModel sdksModel, @Nullable Condition<SdkTypeId> filter, boolean withNoneItem) {
this(sdksModel, filter, filter, withNoneItem);
}
public BundleComboBox(@NotNull SdkModel sdksModel, @Nullable Condition<SdkTypeId> filter, @Nullable String nullItemName) {
this(sdksModel, filter, filter, nullItemName, null);
}
public BundleComboBox(@NotNull SdkModel sdksModel,
@Nullable Condition<SdkTypeId> filter,
@Nullable Condition<SdkTypeId> creationFilter,
boolean withNoneItem) {
this(sdksModel, filter, creationFilter, withNoneItem ? ProjectBundle.message("sdk.combo.box.item") : null, null);
}
public BundleComboBox(@NotNull SdkModel sdksModel,
@Nullable Condition<SdkTypeId> filter,
@Nullable Condition<SdkTypeId> creationFilter,
@Nullable String nullItemName) {
this(sdksModel, filter, creationFilter, nullItemName, null);
}
public BundleComboBox(@NotNull SdkModel sdksModel,
@Nullable Condition<SdkTypeId> filter,
@Nullable Condition<SdkTypeId> creationFilter,
@Nullable final String nullItemName,
@Nullable final Icon nullIcon) {
myOriginalComboBox = Components.comboBox();
myFilter = filter;
myCreationFilter = creationFilter;
/*myOriginalComboBox.setRender((render, index, value) -> {
if (value instanceof InvalidSdkComboBoxItem) {
setIcon(AllIcons.Toolbar.Unknown);
append(value.getSdkName(), SimpleTextAttributes.ERROR_ATTRIBUTES);
}
else if (value instanceof CustomSdkComboBoxItem) {
setIcon(((CustomSdkComboBoxItem)value).getIcon());
append(((CustomSdkComboBoxItem)value).getPresentableName());
}
else if (value instanceof ModuleExtensionSdkComboBoxItem) {
ModuleExtensionSdkComboBoxItem extensionSdkComboBoxItem = (ModuleExtensionSdkComboBoxItem)value;
setIcon(AllIcons.Nodes.Module);
append(extensionSdkComboBoxItem.getModule().getName(), SimpleTextAttributes.REGULAR_BOLD_ATTRIBUTES);
final String sdkName = extensionSdkComboBoxItem.getSdkName();
if (sdkName != null) {
append(" (" + extensionSdkComboBoxItem.getSdkName() + ")", SimpleTextAttributes.GRAYED_ATTRIBUTES);
}
}
else if (value instanceof InvalidModuleComboBoxItem) {
setIcon(AllIcons.Nodes.Module);
append(((InvalidModuleComboBoxItem)value).getModuleName(), SimpleTextAttributes.ERROR_BOLD_ATTRIBUTES);
}
else if (value == null || value instanceof NullSdkComboBoxItem) {
setIcon(ObjectUtil.notNull(nullIcon, AllIcons.Ide.EmptyFatalError));
String name = ObjectUtil.notNull(nullItemName, ProjectBundle.message("sdk.combo.box.item"));
append(name, SimpleTextAttributes.REGULAR_ATTRIBUTES);
}
else {
Sdk sdk = value.getSdk();
String sdkName = value.getSdkName();
assert sdkName != null;
setIcon(sdk == null ? AllIcons.Toolbar.Unknown : SdkUtil.getIcon(sdk));
append(sdkName, sdk == null ? SimpleTextAttributes.ERROR_ATTRIBUTES : SimpleTextAttributes.REGULAR_ATTRIBUTES);
String version = sdk == null ? null : sdk.getVersionString();
if (version != null) {
append(" (", SimpleTextAttributes.GRAY_ATTRIBUTES);
append(version, SimpleTextAttributes.GRAY_ATTRIBUTES);
append(")", SimpleTextAttributes.GRAY_ATTRIBUTES);
}
}
}); */
}
@RequiredUIAccess
@NotNull
@Override
public Component getComponent() {
return myOriginalComboBox;
}
}