/*
* 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.idea;
import com.intellij.Patches;
import com.intellij.ide.IdeEventQueue;
import com.intellij.ide.IdeRepaintManager;
import com.intellij.idea.starter.ApplicationPostStarter;
import com.intellij.openapi.application.PathManager;
import com.intellij.openapi.application.TransactionGuard;
import com.intellij.openapi.application.TransactionGuardImpl;
import com.intellij.openapi.application.ex.ApplicationEx;
import com.intellij.openapi.application.ex.ApplicationManagerEx;
import com.intellij.openapi.diagnostic.Logger;
import com.intellij.openapi.util.IconLoader;
import com.intellij.openapi.util.SystemInfo;
import com.intellij.openapi.wm.impl.X11UiUtil;
import com.intellij.util.ReflectionUtil;
import consulo.application.ApplicationProperties;
import consulo.start.CommandLineArgs;
import org.jetbrains.annotations.NotNull;
import javax.swing.*;
import java.lang.reflect.Constructor;
public class ApplicationStarter {
private static final Logger LOG = Logger.getInstance(ApplicationStarter.class);
private static ApplicationStarter ourInstance;
public volatile static boolean ourLoaded;
public static ApplicationStarter getInstance() {
return ourInstance;
}
public static boolean isLoaded() {
return ourLoaded;
}
private final CommandLineArgs myArgs;
private boolean myPerformProjectLoad = true;
private ApplicationPostStarter myPostStarter;
public ApplicationStarter(CommandLineArgs args) {
LOG.assertTrue(ourInstance == null);
//noinspection AssignmentToStaticFieldFromInstanceMethod
ourInstance = this;
myArgs = args;
boolean isInternal = Boolean.getBoolean(ApplicationProperties.IDEA_IS_INTERNAL);
boolean isUnitTest = Boolean.getBoolean(ApplicationProperties.CONSULO_IN_UNIT_TEST);
boolean asWebApp = Boolean.getBoolean(ApplicationProperties.CONSULO_AS_WEB_APP);
boolean headless = Main.isHeadless();
patchSystem(headless);
myPostStarter = createPostStarter(isUnitTest, asWebApp);
myPostStarter.createApplication(isInternal, isUnitTest, headless, isUnitTest, args);
myPostStarter.premain(args);
}
private static void patchSystem(boolean headless) {
System.setProperty("sun.awt.noerasebackground", "true");
IdeEventQueue.getInstance(); // replace system event queue
if (headless) return;
if (Patches.SUN_BUG_ID_6209673) {
RepaintManager.setCurrentManager(new IdeRepaintManager());
}
if (SystemInfo.isXWindow) {
String wmName = X11UiUtil.getWmName();
LOG.info("WM detected: " + wmName);
if (wmName != null) {
X11UiUtil.patchDetectedWm(wmName);
}
}
IconLoader.activate();
new JFrame().pack(); // this peer will prevent shutting down our application
}
@NotNull
private ApplicationPostStarter createPostStarter(boolean isUnitTest, boolean asWebApp) {
Class<?> starterClass = ReflectionUtil.forName(getStarterClass(isUnitTest, asWebApp));
try {
Constructor constructor = starterClass.getConstructor(ApplicationStarter.class);
constructor.setAccessible(true);
return (ApplicationPostStarter)ReflectionUtil.createInstance(constructor, this);
}
catch (NoSuchMethodException e) {
throw new Error(e);
}
}
@NotNull
private static String getStarterClass(boolean isUnitTest, boolean asWebApp) {
if (isUnitTest) {
return "consulo.start.UnitTestPostStarter";
}
return asWebApp ? "consulo.web.main.WebPostStarter" : "com.intellij.idea.starter.DefaultApplicationPostStarter";
}
public void run() {
try {
ApplicationEx app = ApplicationManagerEx.getApplicationEx();
app.load(PathManager.getOptionsPath());
((TransactionGuardImpl) TransactionGuard.getInstance()).performUserActivity(new Runnable() {
@Override
public void run() {
myPostStarter.main(myArgs);
}
});
myPostStarter = null; //GC it
ourLoaded = true;
}
catch (Exception e) {
throw new RuntimeException(e);
}
}
public boolean isPerformProjectLoad() {
return myPerformProjectLoad;
}
public void setPerformProjectLoad(boolean performProjectLoad) {
myPerformProjectLoad = performProjectLoad;
}
}