/*
* Copyright 2003-2016 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 jetbrains.mps.nodeEditor.assist;
import jetbrains.mps.openapi.editor.assist.ContextAssistant;
import jetbrains.mps.openapi.editor.menus.transformation.TransformationMenuItem;
import jetbrains.mps.openapi.editor.selection.Selection;
import jetbrains.mps.openapi.editor.selection.SelectionManager;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import org.jetbrains.mps.openapi.module.ModelAccess;
import java.util.Collections;
import java.util.List;
/**
* Responsible for figuring out which menu to show and where, and showing/hiding the assistant.
*/
class EditorContextAssistants {
private final ModelAccess myModelAccess;
private final ContextAssistantFinder myAssistantFinder;
private final SelectionMenuProvider myMenuProvider;
private final SelectionManager mySelectionManager;
private ContextAssistant myActiveAssistant;
private List<TransformationMenuItem> myActiveMenuItems;
private int myAssistantCount;
EditorContextAssistants(ContextAssistantFinder assistantFinder, SelectionMenuProvider menuProvider, SelectionManager selectionManager,
ModelAccess modelAccess) {
myModelAccess = modelAccess;
myAssistantFinder = assistantFinder;
myMenuProvider = menuProvider;
mySelectionManager = selectionManager;
}
public ContextAssistant getActiveAssistant() {
return myActiveAssistant;
}
List<TransformationMenuItem> getActiveMenuItems() {
return myActiveMenuItems;
}
void hideMenu() {
if (myActiveAssistant == null) {
return;
}
myActiveAssistant.hideMenu();
myActiveAssistant = null;
myActiveMenuItems = null;
}
void update() {
myModelAccess.runReadAction(() -> {
Selection selection = mySelectionManager.getSelection();
ContextAssistant newAssistant = selection == null ? null : myAssistantFinder.findAssistant(selection);
List<TransformationMenuItem> newItems = newAssistant == null ? Collections.emptyList() : myMenuProvider.getMenuItems(selection);
hideMenu();
if (newAssistant == null || newItems.isEmpty()) {
return;
}
showMenu(newAssistant, newItems);
});
}
private void showMenu(@NotNull ContextAssistant newAssistant, @NotNull List<TransformationMenuItem> newItems) {
assert myActiveAssistant == null;
myActiveAssistant = newAssistant;
myActiveMenuItems = newItems;
myActiveAssistant.showMenu(newItems);
}
boolean hasRegisteredAssistants() {
return myAssistantCount > 0;
}
void register(ContextAssistant assistant) {
myAssistantCount++;
}
void unregister(ContextAssistant assistant) {
assert myAssistantCount >= 1 : "too many assistants being unregistered";
myAssistantCount--;
if (assistant == myActiveAssistant) {
hideMenu();
}
}
}