in flex/src/com/intellij/lang/javascript/flex/projectStructure/ui/DependenciesConfigurable.java [100:323]
public DependenciesConfigurable(final ModifiableFlexBuildConfiguration bc,
Project project,
@NotNull FlexProjectConfigurationEditor configEditor,
final ProjectSdksModel sdksModel,
@NotNull ProjectStructureConfigurable projectStructureConfigurable) {
mySkdsModel = sdksModel;
myConfigEditor = configEditor;
myDependencies = bc.getDependencies();
myProject = project;
myNature = bc.getNature();
myProjectStructureConfigurable = projectStructureConfigurable;
mySdkChangeDispatcher = EventDispatcher.create(ChangeListener.class);
myDisposable = Disposer.newDisposable();
final SdkModel.Listener listener = new SdkModel.Listener() {
@Override
public void sdkAdded(final @NotNull Sdk sdk) {
rebuildSdksModel();
}
@Override
public void beforeSdkRemove(final @NotNull Sdk sdk) {
rebuildSdksModel();
}
@Override
public void sdkChanged(final @NotNull Sdk sdk, final String previousName) {
rebuildSdksModel();
}
@Override
public void sdkHomeSelected(final @NotNull Sdk sdk, final @NotNull String newSdkHome) {
rebuildSdksModel();
}
};
sdksModel.addListener(listener);
Disposer.register(myDisposable, () -> sdksModel.removeListener(listener));
mySdkCombo.showNoneSdkItem();
mySdkCombo.setEditButton(myEditButton, myProject, () -> mySdkCombo.getSelectedJdk());
mySdkLabel.setLabelFor(mySdkCombo);
mySdkCombo.addActionListener(e -> {
if (myFreeze) {
return;
}
updateOnSelectedSdkChange();
});
myComponentSetCombo.setModel(new DefaultComboBoxModel<>(ComponentSet.values()));
myComponentSetCombo.setRenderer(SimpleListCellRenderer.create("", ComponentSet::getPresentableText));
myFrameworkLinkageCombo.setRenderer(SimpleListCellRenderer.create("", value -> {
if (value == LinkageType.Default) {
Sdk sdk = mySdkCombo.getSelectedJdk();
String sdkVersion = sdk != null ? sdk.getVersionString() : null;
return sdkVersion == null ? "Default" : MessageFormat.format(
"Default ({0})", FlexCommonUtils.getDefaultFrameworkLinkage(sdkVersion, myNature).getLongText());
}
else {
return value.getLongText();
}
}));
myFrameworkLinkageCombo.setModel(new DefaultComboBoxModel<>(BCUtils.getSuitableFrameworkLinkages(myNature)));
ItemListener updateSdkItemsListener = new ItemListener() {
@Override
public void itemStateChanged(ItemEvent e) {
if (myFreeze) {
return;
}
DefaultMutableTreeNode sdkNode = findSdkNode();
Sdk currentSdk = mySdkCombo.getSelectedJdk();
if (sdkNode != null && currentSdk != null) {
updateSdkEntries(sdkNode, currentSdk);
myTable.refresh();
}
}
};
myTargetPlayerCombo.addItemListener(updateSdkItemsListener);
myComponentSetCombo.addItemListener(updateSdkItemsListener);
myFrameworkLinkageCombo.addItemListener(updateSdkItemsListener);
myTargetPlayerWarning.setIcon(AllIcons.General.BalloonWarning12);
myWarning.setIcon(UIUtil.getBalloonWarningIcon());
myTable = new EditableTreeTable<>("", DEPENDENCY_TYPE_COLUMN) {
@Override
protected void render(SimpleColoredComponent c, MyTableItem item) {
if (item != null) {
item.getPresentableText().appendToComponent(c);
c.setIcon(item.getIcon());
}
}
};
myTable.setRootVisible(false);
myTable.getTree().setShowsRootHandles(true);
myTablePanel.add(
ToolbarDecorator.createDecorator(myTable)
.setAddAction(this::addItem).setAddActionName(FlexBundle.message("add.dependency.action.name"))
.setRemoveAction(anActionButton -> removeSelection()).setEditAction(button -> {
MyTableItem item = myTable.getItemAt(myTable.getSelectedRow());
if (item instanceof SharedLibraryItem) {
editLibrary((SharedLibraryItem)item);
}
if (item instanceof ModuleLibraryItem) {
editLibrary(((ModuleLibraryItem)item));
}
}).setRemoveActionUpdater(e -> {
if (myTable.getSelectedRowCount() == 0) return false;
for (int row : myTable.getSelectedRows()) {
MyTableItem item = myTable.getItemAt(row);
if (item instanceof SdkItem || item instanceof SdkEntryItem) return false;
}
return true;
}).setEditActionUpdater(e -> {
MyTableItem item = myTable.getItemAt(myTable.getSelectedRow());
return item != null && item.canEdit();
}).disableUpDownActions().createPanel(), BorderLayout.CENTER);
new DoubleClickListener() {
@Override
protected boolean onDoubleClick(@NotNull MouseEvent e) {
if (myTable.getSelectedRowCount() == 1) {
myTable.getItemAt(myTable.getSelectedRow()).onDoubleClick();
return true;
}
return false;
}
}.installOn(myTable);
FlexBuildConfigurationsExtension.getInstance().getConfigurator().addListener(new FlexBCConfigurator.Listener() {
@Override
public void moduleRemoved(Module module) {
// TODO return if module == this module
Set<MyTableItem> itemsToRemove = new HashSet<>();
// 1st-level nodes are always visible
// 2nd-level nodes cannot refer to BC
for (int row = 0; row < myTable.getRowCount(); row++) {
MyTableItem item = myTable.getItemAt(row);
if (item instanceof BCItem) {
FlexBCConfigurable configurable = ((BCItem)item).configurable;
if (configurable != null && configurable.getModule() == module) {
itemsToRemove.add(item);
}
}
}
removeItems(itemsToRemove, true);
}
@Override
public void buildConfigurationRemoved(FlexBCConfigurable configurable) {
Pair<BCItem, Integer> item = findDependencyItem(configurable);
if (item != null) {
removeItems(Collections.singleton(item.first), true);
}
}
@Override
public void buildConfigurationRenamed(final FlexBCConfigurable configurable) {
Pair<BCItem, Integer> item = findDependencyItem(configurable);
if (item != null) {
myTable.refreshItemAt(item.second);
}
}
@Override
public void natureChanged(final FlexBCConfigurable configurable) {
Pair<BCItem, Integer> item = findDependencyItem(configurable);
if (item != null) {
final BuildConfigurationNature dependencyNature = item.first.configurable.getEditableObject().getNature();
if (!FlexCommonUtils.checkDependencyType(myNature.outputType, dependencyNature.outputType, item.first.getLinkageType())) {
removeItems(Collections.singleton(item.first), true);
}
}
}
private @Nullable Pair<BCItem, Integer> findDependencyItem(FlexBCConfigurable configurable) {
if (configurable.isParentFor(DependenciesConfigurable.this)) {
return null;
}
// 1st-level nodes are always visible
// 2nd-level nodes cannot refer to BC
for (int row = 0; row < myTable.getRowCount(); row++) {
final MyTableItem item = myTable.getItemAt(row);
if (item instanceof BCItem && ((BCItem)item).configurable == configurable) {
// there may be only one dependency on a BC
return Pair.create((BCItem)item, row);
}
}
return null;
}
}, myDisposable);
myConfigEditor.addModulesModelChangeListener(modules -> {
FlexBCConfigurator configurator = FlexBuildConfigurationsExtension.getInstance().getConfigurator();
for (Module module : modules) {
for (CompositeConfigurable configurable : configurator.getBCConfigurables(module)) {
FlexBCConfigurable flexBCConfigurable = FlexBCConfigurable.unwrap(configurable);
if (flexBCConfigurable.isParentFor(this)) {
resetTable(myDependencies.getSdkEntry(), true);
}
}
}
}, myDisposable);
UserActivityWatcher watcher = new UserActivityWatcher();
watcher.register(myMainPanel);
myUserActivityDispatcher = EventDispatcher.create(UserActivityListener.class);
watcher.addUserActivityListener(() -> {
if (myFreeze) {
return;
}
myUserActivityDispatcher.getMulticaster().stateChanged();
}, myDisposable);
}