package krasa.frameswitcher;
import com.intellij.openapi.application.ApplicationManager;
import com.intellij.openapi.application.PathManager;
import com.intellij.openapi.components.*;
import com.intellij.openapi.diagnostic.Logger;
import krasa.frameswitcher.networking.*;
import org.jetbrains.annotations.NotNull;
import java.io.File;
import java.util.UUID;
@State(name = "FrameSwitcherSettings", storages = {@Storage(id = "FrameSwitcherSettings", file = "$APP_CONFIG$/FrameSwitcherSettings.xml")})
public class FrameSwitcherApplicationComponent implements ApplicationComponent,
PersistentStateComponent<FrameSwitcherSettings>, ExportableApplicationComponent {
private final Logger LOG = Logger.getInstance("#" + getClass().getCanonicalName());
public static final String IDE_MAX_RECENT_PROJECTS = "ide.max.recent.projects";
private FrameSwitcherSettings settings;
private RemoteInstancesState remoteInstancesState = new RemoteInstancesState();
private RemoteSender remoteSender;
private ProjectFocusMonitor projectFocusMonitor;
public static FrameSwitcherApplicationComponent getInstance() {
return ApplicationManager.getApplication().getComponent(FrameSwitcherApplicationComponent.class);
}
public FrameSwitcherApplicationComponent() {
}
public ProjectFocusMonitor getProjectFocusMonitor() {
if (projectFocusMonitor == null) {
projectFocusMonitor = new ProjectFocusMonitor();
}
return projectFocusMonitor;
}
public void initComponent() {
if (getState().isRemoting()) {
initRemoting();
} else {
remoteSender = new DummyRemoteSender();
}
}
private void initRemoting() {
UUID uuid = UUID.randomUUID();
try {
remoteSender = new RemoteSenderImpl(uuid, new Receiver(uuid, this));
} catch (Throwable e) {
LOG.warn(e);
}
}
public void disposeComponent() {
if (getRemoteSender() != null) {
getRemoteSender().close();
}
}
@NotNull
public String getComponentName() {
return "FrameSwitcherApplicationComponent";
}
@NotNull
@Override
public File[] getExportFiles() {
return new File[]{PathManager.getOptionsFile("FrameSwitcherSettings")};
}
@NotNull
@Override
public String getPresentableName() {
return "Frame Switcher";
}
@NotNull
@Override
public FrameSwitcherSettings getState() {
if (settings == null) {
settings = new FrameSwitcherSettings();
}
return settings;
}
@Override
public void loadState(FrameSwitcherSettings frameSwitcherSettings) {
this.settings = frameSwitcherSettings;
frameSwitcherSettings.applyMaxRecentProjectsToRegistry();
}
public void updateSettings(FrameSwitcherSettings settings) {
this.settings = settings;
this.settings.applyOrResetMaxRecentProjectsToRegistry();
if (remoteSender instanceof DummyRemoteSender && this.settings.isRemoting()) {
initRemoting();
} else if (remoteSender instanceof RemoteSenderImpl && !this.settings.isRemoting()) {
remoteSender.close();
remoteInstancesState = new RemoteInstancesState();
remoteSender = new DummyRemoteSender();
}
}
public RemoteInstancesState getRemoteInstancesState() {
return remoteInstancesState;
}
public RemoteSender getRemoteSender() {
return remoteSender;
}
}