private void combineToResourceBundleIfNeed(Collection<PsiFile> files) {
    Collection<PropertiesFile> createdFiles =
        ContainerUtil.map(
            files,
            (NotNullFunction<PsiFile, PropertiesFile>)
                dom -> {
                  final PropertiesFile file = PropertiesImplUtil.getPropertiesFile(dom);
                  LOG.assertTrue(file != null, dom.getName());
                  return file;
                });

    ResourceBundle mainBundle = myResourceBundle;
    final Set<ResourceBundle> allBundles = new HashSet<>();
    if (mainBundle != null) {
      allBundles.add(mainBundle);
    }
    boolean needCombining = false;
    for (PropertiesFile file : createdFiles) {
      final ResourceBundle rb = file.getResourceBundle();
      if (mainBundle == null) {
        mainBundle = rb;
      } else if (!mainBundle.equals(rb)) {
        needCombining = true;
      }
      allBundles.add(rb);
    }

    if (needCombining) {
      final List<PropertiesFile> toCombine = new ArrayList<>(createdFiles);
      final String baseName = getBaseName();
      if (myResourceBundle != null) {
        toCombine.addAll(myResourceBundle.getPropertiesFiles());
      }
      ResourceBundleManager manager = ResourceBundleManager.getInstance(mainBundle.getProject());
      for (ResourceBundle bundle : allBundles) {
        manager.dissociateResourceBundle(bundle);
      }
      manager.combineToResourceBundle(toCombine, baseName);
    }
  }
  public ResourceBundleEditor(@NotNull ResourceBundle resourceBundle) {
    myProject = resourceBundle.getProject();

    final JPanel splitPanel = new JPanel();
    myValuesPanel = new JPanel();
    myStructureViewPanel = new JPanel();
    JBSplitter splitter = new JBSplitter(false);
    splitter.setFirstComponent(myStructureViewPanel);
    splitter.setSecondComponent(myValuesPanel);
    splitter.setShowDividerControls(true);
    splitter.setHonorComponentsMinimumSize(true);
    splitter.setAndLoadSplitterProportionKey(getClass() + ".splitter");
    splitPanel.setLayout(new BorderLayout());
    splitPanel.add(splitter, BorderLayout.CENTER);

    myResourceBundle = resourceBundle;
    myStructureViewComponent = new ResourceBundleStructureViewComponent(myResourceBundle, this);
    myStructureViewPanel.setLayout(new BorderLayout());
    myStructureViewPanel.add(myStructureViewComponent, BorderLayout.CENTER);

    myStructureViewComponent
        .getTree()
        .getSelectionModel()
        .addTreeSelectionListener(
            new TreeSelectionListener() {
              private IProperty selectedProperty;
              private PropertiesFile selectedPropertiesFile;

              @Override
              public void valueChanged(TreeSelectionEvent e) {
                // filter out temp unselect/select events
                if (Comparing.equal(e.getNewLeadSelectionPath(), e.getOldLeadSelectionPath())
                    || getSelectedProperty() == null) return;
                if (!arePropertiesEquivalent(selectedProperty, getSelectedProperty())
                    || !Comparing.equal(selectedPropertiesFile, getSelectedPropertiesFile())) {

                  if (e.getOldLeadSelectionPath() != null) {
                    for (Map.Entry<PropertiesFile, Editor> entry : myEditors.entrySet()) {
                      if (entry.getValue() == mySelectedEditor) {
                        writeEditorPropertyValue(
                            mySelectedEditor, entry.getKey(), selectedProperty.getName());
                        break;
                      }
                    }
                  }

                  selectedProperty = getSelectedProperty();
                  selectedPropertiesFile = getSelectedPropertiesFile();
                  selectionChanged();
                }
              }

              private boolean arePropertiesEquivalent(
                  @Nullable IProperty p1, @Nullable IProperty p2) {
                if (p1 == p2) {
                  return true;
                }
                if (p1 == null || p2 == null) {
                  return false;
                }
                return p1.getPsiElement().isEquivalentTo(p2.getPsiElement());
              }
            });
    installPropertiesChangeListeners();

    myEditors = new THashMap<PropertiesFile, Editor>();
    myTitledPanels = new THashMap<PropertiesFile, JPanel>();
    recreateEditorsPanel();

    TreeElement[] children = myStructureViewComponent.getTreeModel().getRoot().getChildren();
    if (children.length != 0) {
      TreeElement child = children[0];
      String propName =
          ((ResourceBundlePropertyStructureViewElement) child).getProperty().getUnescapedKey();
      setState(new ResourceBundleEditorState(propName));
    }
    myDataProviderPanel = new DataProviderPanel(splitPanel);

    myProject
        .getMessageBus()
        .connect(myProject)
        .subscribe(
            FileEditorManagerListener.FILE_EDITOR_MANAGER,
            new FileEditorManagerAdapter() {
              @Override
              public void selectionChanged(@NotNull FileEditorManagerEvent event) {
                onSelectionChanged(event);
              }
            });
  }
 public ResourceBundlePropertiesUpdateManager(ResourceBundle bundle) {
   myResourceBundle = bundle;
   myCodeStyleManager = CodeStyleManager.getInstance(bundle.getProject());
   reload();
 }