/*
* Copyright 2015-present Facebook, Inc.
*
* 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.facebook.buck.intellij.ideabuck.config;
import com.facebook.buck.intellij.ideabuck.autodeps.BuckAutoDepsContributor;
import com.facebook.buck.intellij.ideabuck.debugger.AndroidDebugger;
import com.facebook.buck.intellij.ideabuck.file.BuckFileUtil;
import com.facebook.buck.intellij.ideabuck.ui.BuckEventsConsumer;
import com.facebook.buck.intellij.ideabuck.ui.BuckToolWindowFactory;
import com.facebook.buck.intellij.ideabuck.ui.BuckUIManager;
import com.facebook.buck.intellij.ideabuck.ui.utils.BuckPluginNotifications;
import com.facebook.buck.intellij.ideabuck.ws.BuckClientManager;
import com.facebook.buck.intellij.ideabuck.ws.buckevents.BuckEventsHandler;
import com.facebook.buck.intellij.ideabuck.ws.buckevents.consumers.BuckEventsConsumerFactory;
import com.intellij.execution.ui.ConsoleViewContentType;
import com.intellij.ide.ui.UISettings;
import com.intellij.openapi.application.ApplicationManager;
import com.intellij.openapi.components.ProjectComponent;
import com.intellij.openapi.project.Project;
import com.intellij.psi.PsiDocumentManager;
import java.util.concurrent.atomic.AtomicBoolean;
public final class BuckModule implements ProjectComponent {
private Project mProject;
private BuckEventsHandler mEventHandler;
private BuckEventsConsumer mBuckEventsConsumer;
private AtomicBoolean projectClosed;
public BuckModule(final Project project) {
mProject = project;
mEventHandler =
new BuckEventsHandler(
new BuckEventsConsumerFactory(mProject),
new ExecuteOnBuckPluginConnect(),
new ExecuteOnBuckPluginDisconnect());
}
@Override
public String getComponentName() {
return "ideabuck - " + mProject.getName();
}
@Override
public void initComponent() {}
@Override
public void disposeComponent() {}
@Override
public void projectOpened() {
projectClosed = new AtomicBoolean(false);
BuckFileUtil.setBuckFileType();
// connect to the Buck client
BuckClientManager.getOrCreateClient(mProject, mEventHandler).connect();
if (!UISettings.getInstance().SHOW_MAIN_TOOLBAR) {
BuckPluginNotifications.notifyActionToolbar(mProject);
}
mBuckEventsConsumer = new BuckEventsConsumer(mProject);
PsiDocumentManager manager = PsiDocumentManager.getInstance(mProject);
manager.addListener(new BuckAutoDepsContributor(mProject));
}
@Override
public void projectClosed() {
projectClosed.set(true);
BuckClientManager.getOrCreateClient(mProject, mEventHandler).disconnectWithoutRetry();
AndroidDebugger.disconnect();
if (mBuckEventsConsumer != null) {
mBuckEventsConsumer.detach();
}
}
public boolean isConnected() {
return BuckClientManager.getOrCreateClient(mProject, mEventHandler).isConnected();
}
public void attachIfDetached() {
attachIfDetached("");
}
public void attachIfDetached(String target) {
if (!mBuckEventsConsumer.isAttached()) {
attach(target);
}
}
public void attach(String target) {
mBuckEventsConsumer.detach();
mBuckEventsConsumer.attach(target, BuckUIManager.getInstance(mProject).getTreeModel());
}
public BuckEventsConsumer getBuckEventsConsumer() {
return mBuckEventsConsumer;
}
private class ExecuteOnBuckPluginDisconnect implements Runnable {
@Override
public void run() {
ApplicationManager.getApplication()
.invokeLater(
new Runnable() {
@Override
public void run() {
// If we haven't closed the project, then we show the message
if (!mProject.isDisposed()) {
BuckToolWindowFactory.outputConsoleMessage(
mProject,
"Disconnected from buck!\n",
ConsoleViewContentType.SYSTEM_OUTPUT);
}
}
});
if (!projectClosed.get()) {
// Tell the client that we got disconnected, but we can retry
BuckClientManager.getOrCreateClient(mProject, mEventHandler).disconnectWithRetry();
}
}
}
private class ExecuteOnBuckPluginConnect implements Runnable {
@Override
public void run() {
ApplicationManager.getApplication()
.invokeLater(
new Runnable() {
@Override
public void run() {
// If we connected to Buck and then closed the project, before getting
// the success message
if (!mProject.isDisposed()) {
BuckToolWindowFactory.outputConsoleMessage(
mProject, "Connected to buck!\n", ConsoleViewContentType.SYSTEM_OUTPUT);
}
}
});
}
}
}