blob: f60ec2cd6bf1fcf02af4431d93fdd8438330537f [file] [log] [blame]
/*
* 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.ide;
import com.intellij.openapi.application.ApplicationManager;
import com.intellij.openapi.application.PathManager;
import com.intellij.openapi.components.ExportableApplicationComponent;
import com.intellij.openapi.util.NamedJDOMExternalizable;
import com.intellij.openapi.util.text.StringUtil;
import org.intellij.lang.annotations.MagicConstant;
import org.jdom.Element;
import org.jetbrains.annotations.NonNls;
import org.jetbrains.annotations.NotNull;
import java.beans.PropertyChangeListener;
import java.beans.PropertyChangeSupport;
import java.io.File;
import java.util.List;
public class GeneralSettings implements NamedJDOMExternalizable, ExportableApplicationComponent {
@NonNls private static final String OPTION_INACTIVE_TIMEOUT = "inactiveTimeout";
@NonNls public static final String PROP_INACTIVE_TIMEOUT = OPTION_INACTIVE_TIMEOUT;
private static final int DEFAULT_INACTIVE_TIMEOUT = 15;
@NonNls private String myBrowserPath;
private boolean myShowTipsOnStartup = true;
private int myLastTip = 0;
private boolean myShowOccupiedMemory = false;
private boolean myReopenLastProject = true;
private boolean mySyncOnFrameActivation = true;
private boolean mySaveOnFrameDeactivation = true;
private boolean myAutoSaveIfInactive = false; // If true the IDEA automatically saves files if it is inactive for some seconds
private int myInactiveTimeout; // Number of seconds of inactivity after which IDEA automatically saves all files
private boolean myUseSafeWrite = true;
private final PropertyChangeSupport myPropertyChangeSupport;
private boolean myUseDefaultBrowser = true;
private boolean myConfirmExtractFiles = true;
private String myLastProjectLocation;
private boolean mySearchInBackground;
private boolean myConfirmExit = true;
private int myConfirmOpenNewProject = OPEN_PROJECT_ASK;
@NonNls private static final String ELEMENT_OPTION = "option";
@NonNls private static final String ATTRIBUTE_NAME = "name";
@NonNls private static final String ATTRIBUTE_VALUE = "value";
@NonNls private static final String OPTION_BROWSER_PATH = "browserPath";
@NonNls private static final String OPTION_LAST_TIP = "lastTip";
@NonNls private static final String OPTION_SHOW_TIPS_ON_STARTUP = "showTipsOnStartup";
@NonNls private static final String OPTION_SHOW_OCCUPIED_MEMORY = "showOccupiedMemory";
@NonNls private static final String OPTION_REOPEN_LAST_PROJECT = "reopenLastProject";
@NonNls private static final String OPTION_AUTO_SYNC_FILES = "autoSyncFiles";
@NonNls private static final String OPTION_AUTO_SAVE_FILES = "autoSaveFiles";
@NonNls private static final String OPTION_AUTO_SAVE_IF_INACTIVE = "autoSaveIfInactive";
@NonNls private static final String OPTION_USE_SAFE_WRITE = "useSafeWrite";
@NonNls private static final String OPTION_USE_DEFAULT_BROWSER = "useDefaultBrowser";
@NonNls private static final String OPTION_CONFIRM_EXTRACT_FILES = "confirmExtractFiles";
@NonNls private static final String OPTION_USE_CYCLIC_BUFFER = "useCyclicBuffer";
@NonNls private static final String OPTION_SEARCH_IN_BACKGROUND = "searchInBackground";
@NonNls private static final String OPTION_CONFIRM_EXIT = "confirmExit";
@NonNls private static final String OPTION_CONFIRM_OPEN_NEW_PROJECT = "confirmOpenNewProject2";
@NonNls private static final String OPTION_CYCLIC_BUFFER_SIZE = "cyclicBufferSize";
@NonNls private static final String OPTION_LAST_PROJECT_LOCATION = "lastProjectLocation";
public static GeneralSettings getInstance(){
return ApplicationManager.getApplication().getComponent(GeneralSettings.class);
}
public GeneralSettings() {
myInactiveTimeout = DEFAULT_INACTIVE_TIMEOUT;
myBrowserPath = BrowserUtil.getDefaultAlternativeBrowserPath();
myPropertyChangeSupport = new PropertyChangeSupport(this);
}
public void addPropertyChangeListener(PropertyChangeListener listener){
myPropertyChangeSupport.addPropertyChangeListener(listener);
}
public void removePropertyChangeListener(PropertyChangeListener listener){
myPropertyChangeSupport.removePropertyChangeListener(listener);
}
@Override
public void initComponent() { }
@Override
public void disposeComponent() { }
public String getBrowserPath() {
return myBrowserPath;
}
/**
* @return a path pointing to a directory where the last project was created or null if not available
*/
public String getLastProjectCreationLocation() {
return myLastProjectLocation;
}
public void setLastProjectCreationLocation(String lastProjectLocation) {
myLastProjectLocation = lastProjectLocation;
}
public void setBrowserPath(String browserPath) {
myBrowserPath = browserPath;
}
public boolean showTipsOnStartup() {
return myShowTipsOnStartup;
}
public void setShowTipsOnStartup(boolean b) {
myShowTipsOnStartup = b;
}
public int getLastTip() {
return myLastTip;
}
public void setLastTip(int i) {
myLastTip = i;
}
public boolean isShowOccupiedMemory() {
return myShowOccupiedMemory;
}
public boolean isReopenLastProject() {
return myReopenLastProject;
}
public void setReopenLastProject(boolean reopenLastProject) {
myReopenLastProject = reopenLastProject;
}
public boolean isSyncOnFrameActivation() {
return mySyncOnFrameActivation;
}
public void setSyncOnFrameActivation(boolean syncOnFrameActivation) {
mySyncOnFrameActivation = syncOnFrameActivation;
}
public boolean isSaveOnFrameDeactivation() {
return mySaveOnFrameDeactivation;
}
public void setSaveOnFrameDeactivation(boolean saveOnFrameDeactivation) {
mySaveOnFrameDeactivation = saveOnFrameDeactivation;
}
/**
* @return <code>true</code> if IDEA saves all files after "idle" timeout.
*/
public boolean isAutoSaveIfInactive(){
return myAutoSaveIfInactive;
}
public void setAutoSaveIfInactive(boolean autoSaveIfInactive) {
myAutoSaveIfInactive = autoSaveIfInactive;
}
/**
* @return timeout in seconds after which IDEA saves all files if there was no user activity.
* The method always return non positive (more then zero) value.
*/
public int getInactiveTimeout(){
return myInactiveTimeout;
}
public void setInactiveTimeout(int inactiveTimeout) {
int oldInactiveTimeout = myInactiveTimeout;
myInactiveTimeout = inactiveTimeout;
myPropertyChangeSupport.firePropertyChange(
PROP_INACTIVE_TIMEOUT, Integer.valueOf(oldInactiveTimeout), Integer.valueOf(inactiveTimeout)
);
}
public boolean isUseSafeWrite() {
return myUseSafeWrite;
}
public void setUseSafeWrite(final boolean useSafeWrite) {
myUseSafeWrite = useSafeWrite;
}
//todo use DefaultExternalizer
@Override
public void readExternal(Element parentNode) {
boolean safeWriteSettingRead = false;
List children = parentNode.getChildren(ELEMENT_OPTION);
for (final Object aChildren : children) {
Element element = (Element)aChildren;
String name = element.getAttributeValue(ATTRIBUTE_NAME);
String value = element.getAttributeValue(ATTRIBUTE_VALUE);
if (OPTION_BROWSER_PATH.equals(name)) {
myBrowserPath = value;
}
if (OPTION_LAST_TIP.equals(name)) {
try {
myLastTip = Integer.parseInt(value);
}
catch (NumberFormatException ex) {
myLastTip = 0;
}
}
if (OPTION_SHOW_TIPS_ON_STARTUP.equals(name)) {
try {
myShowTipsOnStartup = Boolean.valueOf(value).booleanValue();
}
catch (Exception ex) {
myShowTipsOnStartup = true;
}
}
if (OPTION_SHOW_OCCUPIED_MEMORY.equals(name)) {
try {
myShowOccupiedMemory = Boolean.valueOf(value).booleanValue();
}
catch (Exception ex) {
myShowOccupiedMemory = false;
}
}
if (OPTION_REOPEN_LAST_PROJECT.equals(name)) {
try {
myReopenLastProject = Boolean.valueOf(value).booleanValue();
}
catch (Exception ex) {
myReopenLastProject = true;
}
}
if (OPTION_AUTO_SYNC_FILES.equals(name)) {
try {
mySyncOnFrameActivation = Boolean.valueOf(value).booleanValue();
}
catch (Exception ex) {
mySyncOnFrameActivation = true;
}
}
if (OPTION_AUTO_SAVE_FILES.equals(name)) {
try {
mySaveOnFrameDeactivation = Boolean.valueOf(value).booleanValue();
}
catch (Exception ex) {
mySaveOnFrameDeactivation = true;
}
}
if (OPTION_AUTO_SAVE_IF_INACTIVE.equals(name) && value != null) {
myAutoSaveIfInactive = Boolean.valueOf(value).booleanValue();
}
if (OPTION_INACTIVE_TIMEOUT.equals(name)) {
try {
int inactiveTimeout = Integer.parseInt(value);
if (inactiveTimeout > 0) {
myInactiveTimeout = inactiveTimeout;
}
}
catch (Exception ignored) {
}
}
if (OPTION_USE_SAFE_WRITE.equals(name) && value != null) {
myUseSafeWrite = Boolean.valueOf(value).booleanValue();
safeWriteSettingRead = true;
}
if (OPTION_USE_DEFAULT_BROWSER.equals(name)) {
try {
myUseDefaultBrowser = Boolean.valueOf(value).booleanValue();
}
catch (Exception ex) {
myUseDefaultBrowser = true;
}
}
if (OPTION_CONFIRM_EXTRACT_FILES.equals(name)) {
try {
myConfirmExtractFiles = Boolean.valueOf(value).booleanValue();
}
catch (Exception ex) {
myConfirmExtractFiles = true;
}
}
if (OPTION_SEARCH_IN_BACKGROUND.equals(name)) {
try {
mySearchInBackground = Boolean.valueOf(value).booleanValue();
}
catch (Exception ex) {
mySearchInBackground = false;
}
}
if (OPTION_CONFIRM_EXIT.equals(name)) {
try {
myConfirmExit = Boolean.valueOf(value).booleanValue();
}
catch (Exception ex) {
myConfirmExit = false;
}
}
if (OPTION_CONFIRM_OPEN_NEW_PROJECT.equals(name)) {
try {
myConfirmOpenNewProject = Integer.valueOf(value).intValue();
}
catch (Exception ex) {
myConfirmOpenNewProject = OPEN_PROJECT_ASK;
}
}
if (OPTION_LAST_PROJECT_LOCATION.equals(name)) {
try {
myLastProjectLocation = value;
}
catch (Exception ex) {
myLastProjectLocation = null;
}
}
}
if (!safeWriteSettingRead && "true".equals(System.getProperty("idea.no.safe.write"))) {
myUseSafeWrite = false;
}
}
@Override
public void writeExternal(Element parentNode) {
if (!StringUtil.isEmpty(myBrowserPath) && !myBrowserPath.equals(BrowserUtil.getDefaultAlternativeBrowserPath())) {
Element element = new Element(ELEMENT_OPTION);
element.setAttribute(ATTRIBUTE_NAME, OPTION_BROWSER_PATH);
element.setAttribute(ATTRIBUTE_VALUE, myBrowserPath);
parentNode.addContent(element);
}
Element optionElement = new Element(ELEMENT_OPTION);
optionElement.setAttribute(ATTRIBUTE_NAME, OPTION_LAST_TIP);
optionElement.setAttribute(ATTRIBUTE_VALUE, Integer.toString(myLastTip));
parentNode.addContent(optionElement);
optionElement = new Element(ELEMENT_OPTION);
optionElement.setAttribute(ATTRIBUTE_NAME, OPTION_SHOW_TIPS_ON_STARTUP);
optionElement.setAttribute(ATTRIBUTE_VALUE, Boolean.toString(myShowTipsOnStartup));
parentNode.addContent(optionElement);
optionElement = new Element(ELEMENT_OPTION);
optionElement.setAttribute(ATTRIBUTE_NAME, OPTION_SHOW_OCCUPIED_MEMORY);
optionElement.setAttribute(ATTRIBUTE_VALUE, Boolean.toString(myShowOccupiedMemory));
parentNode.addContent(optionElement);
optionElement = new Element(ELEMENT_OPTION);
optionElement.setAttribute(ATTRIBUTE_NAME, OPTION_REOPEN_LAST_PROJECT);
optionElement.setAttribute(ATTRIBUTE_VALUE, Boolean.toString(myReopenLastProject));
parentNode.addContent(optionElement);
optionElement = new Element(ELEMENT_OPTION);
optionElement.setAttribute(ATTRIBUTE_NAME, OPTION_AUTO_SYNC_FILES);
optionElement.setAttribute(ATTRIBUTE_VALUE, Boolean.toString(mySyncOnFrameActivation));
parentNode.addContent(optionElement);
optionElement = new Element(ELEMENT_OPTION);
optionElement.setAttribute(ATTRIBUTE_NAME, OPTION_AUTO_SAVE_FILES);
optionElement.setAttribute(ATTRIBUTE_VALUE, Boolean.toString(mySaveOnFrameDeactivation));
parentNode.addContent(optionElement);
optionElement = new Element(ELEMENT_OPTION);
optionElement.setAttribute(ATTRIBUTE_NAME,OPTION_AUTO_SAVE_IF_INACTIVE);
optionElement.setAttribute(ATTRIBUTE_VALUE,(myAutoSaveIfInactive?Boolean.TRUE:Boolean.FALSE).toString());
parentNode.addContent(optionElement);
optionElement = new Element(ELEMENT_OPTION);
optionElement.setAttribute(ATTRIBUTE_NAME,OPTION_INACTIVE_TIMEOUT);
optionElement.setAttribute(ATTRIBUTE_VALUE,Integer.toString(myInactiveTimeout));
parentNode.addContent(optionElement);
optionElement = new Element(ELEMENT_OPTION);
optionElement.setAttribute(ATTRIBUTE_NAME, OPTION_USE_SAFE_WRITE);
optionElement.setAttribute(ATTRIBUTE_VALUE, (myUseSafeWrite ? Boolean.TRUE : Boolean.FALSE).toString());
parentNode.addContent(optionElement);
optionElement = new Element(ELEMENT_OPTION);
optionElement.setAttribute(ATTRIBUTE_NAME, OPTION_USE_DEFAULT_BROWSER);
optionElement.setAttribute(ATTRIBUTE_VALUE, Boolean.toString(myUseDefaultBrowser));
parentNode.addContent(optionElement);
optionElement = new Element(ELEMENT_OPTION);
optionElement.setAttribute(ATTRIBUTE_NAME, OPTION_CONFIRM_EXTRACT_FILES);
optionElement.setAttribute(ATTRIBUTE_VALUE, Boolean.toString(myConfirmExtractFiles));
parentNode.addContent(optionElement);
optionElement = new Element(ELEMENT_OPTION);
optionElement.setAttribute(ATTRIBUTE_NAME, OPTION_SEARCH_IN_BACKGROUND);
optionElement.setAttribute(ATTRIBUTE_VALUE, Boolean.toString(mySearchInBackground));
parentNode.addContent(optionElement);
optionElement = new Element(ELEMENT_OPTION);
optionElement.setAttribute(ATTRIBUTE_NAME, OPTION_CONFIRM_EXIT);
optionElement.setAttribute(ATTRIBUTE_VALUE, Boolean.toString(myConfirmExit));
parentNode.addContent(optionElement);
optionElement = new Element(ELEMENT_OPTION);
optionElement.setAttribute(ATTRIBUTE_NAME, OPTION_CONFIRM_OPEN_NEW_PROJECT);
optionElement.setAttribute(ATTRIBUTE_VALUE, Integer.toString(myConfirmOpenNewProject));
parentNode.addContent(optionElement);
if (myLastProjectLocation != null) {
optionElement = new Element(ELEMENT_OPTION);
optionElement.setAttribute(ATTRIBUTE_NAME, OPTION_LAST_PROJECT_LOCATION);
optionElement.setAttribute(ATTRIBUTE_VALUE, myLastProjectLocation);
parentNode.addContent(optionElement);
}
}
@Override
public String getExternalFileName() {
return "ide.general";
}
@Override
@NotNull
public File[] getExportFiles() {
return new File[]{PathManager.getOptionsFile(this)};
}
@Override
@NotNull
public String getPresentableName() {
return IdeBundle.message("general.settings");
}
@Override
@NotNull
public String getComponentName() {
return "GeneralSettings";
}
public boolean isUseDefaultBrowser() {
return myUseDefaultBrowser;
}
public void setUseDefaultBrowser(boolean value) {
myUseDefaultBrowser = value;
}
public boolean isConfirmExtractFiles() {
return myConfirmExtractFiles;
}
public void setConfirmExtractFiles(boolean value) {
myConfirmExtractFiles = value;
}
public boolean isConfirmExit() {
return myConfirmExit;
}
public void setConfirmExit(boolean confirmExit) {
myConfirmExit = confirmExit;
}
@MagicConstant(intValues = {OPEN_PROJECT_ASK, OPEN_PROJECT_NEW_WINDOW, OPEN_PROJECT_SAME_WINDOW})
@interface OpenNewProjectOption {}
/**
* @return
* <ul>
* <li>{@link GeneralSettings#OPEN_PROJECT_NEW_WINDOW} if new project should be opened in new window
* <li>{@link GeneralSettings#OPEN_PROJECT_SAME_WINDOW} if new project should be opened in same window
* <li>{@link GeneralSettings#OPEN_PROJECT_ASK} if a confirmation dialog should be shown
* </ul>
*/
@OpenNewProjectOption
public int getConfirmOpenNewProject() {
return myConfirmOpenNewProject;
}
public void setConfirmOpenNewProject(@OpenNewProjectOption int confirmOpenNewProject) {
myConfirmOpenNewProject = confirmOpenNewProject;
}
public static final int OPEN_PROJECT_ASK = -1;
public static final int OPEN_PROJECT_NEW_WINDOW = 0;
public static final int OPEN_PROJECT_SAME_WINDOW = 1;
public boolean isSearchInBackground() {
return mySearchInBackground;
}
public void setSearchInBackground(final boolean searchInBackground) {
mySearchInBackground = searchInBackground;
}
}