2022-01-05 18:31:37 +01:00

168 lines
5.3 KiB
Java

package de.marhali.easyi18n.tabs;
import com.intellij.ide.projectView.PresentationData;
import com.intellij.openapi.actionSystem.ActionManager;
import com.intellij.openapi.actionSystem.ActionToolbar;
import com.intellij.openapi.actionSystem.DefaultActionGroup;
import com.intellij.openapi.project.Project;
import com.intellij.ui.components.JBScrollPane;
import com.intellij.ui.treeStructure.Tree;
import de.marhali.easyi18n.InstanceManager;
import de.marhali.easyi18n.model.KeyedTranslation;
import de.marhali.easyi18n.model.Translation;
import de.marhali.easyi18n.model.TranslationData;
import de.marhali.easyi18n.model.TranslationDelete;
import de.marhali.easyi18n.model.bus.BusListener;
import de.marhali.easyi18n.action.treeview.CollapseTreeViewAction;
import de.marhali.easyi18n.action.treeview.ExpandTreeViewAction;
import de.marhali.easyi18n.dialog.EditDialog;
import de.marhali.easyi18n.listener.DeleteKeyListener;
import de.marhali.easyi18n.listener.PopupClickListener;
import de.marhali.easyi18n.renderer.TreeRenderer;
import de.marhali.easyi18n.service.SettingsService;
import de.marhali.easyi18n.tabs.mapper.TreeModelMapper;
import de.marhali.easyi18n.util.TreeUtil;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import javax.swing.*;
import javax.swing.tree.DefaultMutableTreeNode;
import javax.swing.tree.TreePath;
import java.awt.event.MouseEvent;
import java.util.ResourceBundle;
/**
* Show translation state as tree.
* @author marhali
*/
public class TreeView implements BusListener {
private final Project project;
private TreeModelMapper currentMapper;
private JPanel rootPanel;
private JPanel toolBarPanel;
private JPanel containerPanel;
private Tree tree;
public TreeView(Project project) {
this.project = project;
tree = new Tree();
tree.setCellRenderer(new TreeRenderer());
tree.setRootVisible(false);
tree.getEmptyText().setText(ResourceBundle.getBundle("messages").getString("view.empty"));
tree.addMouseListener(new PopupClickListener(this::handlePopup));
tree.addKeyListener(new DeleteKeyListener(handleDeleteKey()));
containerPanel.add(new JBScrollPane(tree));
placeActions();
}
private void placeActions() {
DefaultActionGroup group = new DefaultActionGroup("TranslationsGroup", false);
ExpandTreeViewAction expand = new ExpandTreeViewAction(expandAll());
CollapseTreeViewAction collapse = new CollapseTreeViewAction(collapseAll());
group.add(collapse);
group.add(expand);
ActionToolbar actionToolbar = ActionManager.getInstance()
.createActionToolbar("TranslationsActions", group, false);
actionToolbar.setTargetComponent(toolBarPanel);
toolBarPanel.add(actionToolbar.getComponent());
}
@Override
public void onUpdateData(@NotNull TranslationData data) {
tree.setModel(this.currentMapper = new TreeModelMapper(data, SettingsService.getInstance(project).getState()));
}
@Override
public void onFocusKey(@Nullable String key) {
if(key != null && currentMapper != null) {
TreePath path = currentMapper.findTreePath(key);
this.tree.getSelectionModel().setSelectionPath(path);
this.tree.scrollPathToVisible(path);
if(this.tree.isCollapsed(path)) {
this.tree.expandPath(path);
}
}
}
@Override
public void onSearchQuery(@Nullable String query) {
if(this.currentMapper != null) {
this.currentMapper.onSearchQuery(query);
this.expandAll().run();
this.tree.updateUI();
}
}
private void handlePopup(MouseEvent e) {
TreePath path = tree.getPathForLocation(e.getX(), e.getY());
if(path != null) {
DefaultMutableTreeNode node = (DefaultMutableTreeNode) path.getLastPathComponent();
if(node.getUserObject() instanceof PresentationData) {
String fullPath = TreeUtil.getFullPath(path);
Translation translation = InstanceManager.get(project).store().getData().getTranslation(fullPath);
if(translation != null) {
new EditDialog(project, new KeyedTranslation(fullPath, translation)).showAndHandle();
}
}
}
}
private Runnable handleDeleteKey() {
return () -> {
TreePath[] paths = tree.getSelectionPaths();
if (paths == null) {
return;
}
for (TreePath path : tree.getSelectionPaths()) {
String fullPath = TreeUtil.getFullPath(path);
InstanceManager.get(project).processUpdate(
new TranslationDelete(new KeyedTranslation(fullPath, null))
);
}
};
}
private Runnable expandAll() {
return () -> {
for(int i = 0; i < tree.getRowCount(); i++) {
tree.expandRow(i);
}
};
}
private Runnable collapseAll() {
return () -> {
for(int i = 0; i < tree.getRowCount(); i++) {
tree.collapseRow(i);
}
};
}
public JPanel getRootPanel() {
return rootPanel;
}
public Tree getTree() {
return tree;
}
}