All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.intellij.diagnostic.OutOfMemoryDialog Maven / Gradle / Ivy

Go to download

A packaging of the IntelliJ Community Edition platform-impl library. This is release number 1 of trunk branch 142.

The newest version!
/*
 * Copyright 2000-2014 JetBrains s.r.o.
 *
 * 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.intellij.diagnostic;

import com.intellij.openapi.application.ApplicationNamesInfo;
import com.intellij.openapi.ui.DialogWrapper;
import com.intellij.openapi.ui.Messages;
import com.intellij.ui.JBColor;
import com.intellij.ui.components.JBLabel;
import org.jetbrains.annotations.NotNull;

import javax.swing.*;
import java.awt.event.ActionEvent;
import java.io.File;

public class OutOfMemoryDialog extends DialogWrapper {
  public enum MemoryKind {
    HEAP, PERM_GEN, CODE_CACHE
  }

  private final MemoryKind myMemoryKind;

  private JPanel myContentPane;
  private JLabel myMessageLabel;
  private JTextField myHeapSizeField;
  private JTextField myPermGenSizeField;
  private JBLabel myHeapCurrentValueLabel;
  private JBLabel myPermGenCurrentValueLabel;
  private JLabel myHeapSizeLabel;
  private JLabel myPermGenSizeLabel;
  private JLabel myHeapUnitsLabel;
  private JLabel myPermGenUnitsLabel;
  private JBLabel mySettingsFileHintLabel;
  private JLabel myCodeCacheSizeLabel;
  private JTextField myCodeCacheSizeField;
  private JLabel myCodeCacheUnitsLabel;
  private JBLabel myCodeCacheCurrentValueLabel;
  private final Action myIgnoreAction;
  private final Action myShutdownAction;

  public OutOfMemoryDialog(MemoryKind memoryKind) {
    super(false);
    myMemoryKind = memoryKind;
    setTitle(DiagnosticBundle.message("diagnostic.out.of.memory.title"));

    myMessageLabel.setIcon(Messages.getErrorIcon());
    myMessageLabel.setText(DiagnosticBundle.message(
        "diagnostic.out.of.memory.error",
        memoryKind == MemoryKind.HEAP ? VMOptions.XMX_OPTION_NAME : memoryKind == MemoryKind.PERM_GEN ? VMOptions.PERM_GEN_OPTION_NAME : VMOptions.CODE_CACHE_OPTION_NAME,
        ApplicationNamesInfo.getInstance().getProductName()));

    File file = VMOptions.getWriteFile();
    if (file != null) {
      mySettingsFileHintLabel.setText(DiagnosticBundle.message("diagnostic.out.of.memory.willBeSavedTo", file.getPath()));
    }
    else {
      mySettingsFileHintLabel.setVisible(false);
    }

    myIgnoreAction = new AbstractAction(DiagnosticBundle.message("diagnostic.out.of.memory.ignore")) {
      @Override
      public void actionPerformed(ActionEvent e) {
        save();
        close(0);
      }
    };

    myShutdownAction = new AbstractAction(DiagnosticBundle.message("diagnostic.out.of.memory.shutdown")) {
      @Override
      public void actionPerformed(ActionEvent e) {
        save();
        System.exit(0);
      }
    };
    myShutdownAction.putValue(DialogWrapper.DEFAULT_ACTION, true);

    configControls(VMOptions.XMX_OPTION_NAME,
                   VMOptions.readXmx(),
                   memoryKind == MemoryKind.HEAP,
                   myHeapSizeLabel,
                   myHeapSizeField,
                   myHeapUnitsLabel,
                   myHeapCurrentValueLabel);

    configControls(VMOptions.PERM_GEN_OPTION_NAME,
                   VMOptions.readMaxPermGen(),
                   memoryKind == MemoryKind.PERM_GEN,
                   myPermGenSizeLabel,
                   myPermGenSizeField,
                   myPermGenUnitsLabel,
                   myPermGenCurrentValueLabel);

    configControls(VMOptions.CODE_CACHE_OPTION_NAME,
                   VMOptions.readCodeCache(),
                   memoryKind == MemoryKind.CODE_CACHE,
                   myCodeCacheSizeLabel,
                   myCodeCacheSizeField,
                   myCodeCacheUnitsLabel,
                   myCodeCacheCurrentValueLabel);

    init();
  }

  private static void configControls(String optionName,
                                     int value,
                                     boolean highlight,
                                     JLabel sizeLabel,
                                     JTextField sizeField,
                                     JLabel unitsLabel,
                                     JLabel currentValueLabel) {
    sizeLabel.setText(optionName);

    String formatted = value == -1 ? DiagnosticBundle.message("diagnostic.out.of.memory.currentValue.unknown") : String.valueOf(value);
    sizeField.setText(formatted);
    currentValueLabel.setText(DiagnosticBundle.message("diagnostic.out.of.memory.currentValue", formatted));

    if (highlight) {
      sizeLabel.setForeground(JBColor.RED);
      sizeField.setForeground(JBColor.RED);
      unitsLabel.setForeground(JBColor.RED);
      currentValueLabel.setForeground(JBColor.RED);
    }
  }

  private void save() {
    try {
      VMOptions.writeXmx(Integer.parseInt(myHeapSizeField.getText()));
    }
    catch (NumberFormatException ignored) { }

    try {
      VMOptions.writeMaxPermGen(Integer.parseInt(myPermGenSizeField.getText()));
    }
    catch (NumberFormatException ignored) { }

    try {
      VMOptions.writeCodeCache(Integer.parseInt(myCodeCacheSizeField.getText()));
    }
    catch (NumberFormatException ignored) { }
  }

  @Override
  protected JComponent createCenterPanel() {
    return myContentPane;
  }

  @NotNull
  @Override
  protected Action[] createActions() {
    return new Action[]{myShutdownAction, myIgnoreAction};
  }

  @Override
  public JComponent getPreferredFocusedComponent() {
    return myMemoryKind == MemoryKind.HEAP ? myHeapSizeField :
           myMemoryKind == MemoryKind.PERM_GEN ? myPermGenSizeField :
           myCodeCacheSizeField;
  }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy