blob: fc2e42ae5e68d8a6497a7a53d1ce2d670f14c98b [file] [log] [blame]
/*****************************************************************
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you 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
*
* https://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 org.apache.cayenne.modeler.editor.dbimport;
import org.apache.cayenne.dbsync.reverse.dbimport.Catalog;
import org.apache.cayenne.dbsync.reverse.dbimport.ExcludeColumn;
import org.apache.cayenne.dbsync.reverse.dbimport.ExcludeProcedure;
import org.apache.cayenne.dbsync.reverse.dbimport.ExcludeTable;
import org.apache.cayenne.dbsync.reverse.dbimport.IncludeColumn;
import org.apache.cayenne.dbsync.reverse.dbimport.IncludeProcedure;
import org.apache.cayenne.dbsync.reverse.dbimport.IncludeTable;
import org.apache.cayenne.dbsync.reverse.dbimport.ReverseEngineering;
import org.apache.cayenne.dbsync.reverse.dbimport.Schema;
import org.apache.cayenne.map.DataMap;
import org.apache.cayenne.modeler.ProjectController;
import org.apache.cayenne.modeler.dialog.db.load.CatalogPopUpMenu;
import org.apache.cayenne.modeler.dialog.db.load.DbImportTreeNode;
import org.apache.cayenne.modeler.dialog.db.load.DefaultPopUpMenu;
import org.apache.cayenne.modeler.dialog.db.load.IncludeTablePopUpMenu;
import org.apache.cayenne.modeler.dialog.db.load.RootPopUpMenu;
import org.apache.cayenne.modeler.dialog.db.load.SchemaPopUpMenu;
import javax.swing.JScrollPane;
import javax.swing.JTree;
import javax.swing.SwingUtilities;
import javax.swing.tree.DefaultTreeCellRenderer;
import javax.swing.tree.TreePath;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.util.HashMap;
import java.util.Map;
/**
* @since 4.1
*/
class ReverseEngineeringTreePanel extends JScrollPane {
private DbImportTree reverseEngineeringTree;
private DbImportTree dbSchemaTree;
private ProjectController projectController;
private TreeToolbarPanel treeToolbar;
private Map<Class<?>, DefaultPopUpMenu> popups;
ReverseEngineeringTreePanel(ProjectController projectController, DbImportTree reverseEngineeringTree,
DbImportTree dbSchemaTree) {
super(reverseEngineeringTree);
this.projectController = projectController;
this.reverseEngineeringTree = reverseEngineeringTree;
this.dbSchemaTree = dbSchemaTree;
reverseEngineeringTree.setEditable(true);
reverseEngineeringTree.setCellRenderer(new DbImportTreeCellRenderer());
DbImportTreeCellEditor editor = new DbImportTreeCellEditor(reverseEngineeringTree,
(DefaultTreeCellRenderer) reverseEngineeringTree.getCellRenderer());
editor.setProjectController(projectController);
reverseEngineeringTree.setCellEditor(editor);
initListeners();
initPopupMenus();
changeIcons();
}
void updateTree() {
reverseEngineeringTree.translateReverseEngineeringToTree(getReverseEngineeringBySelectedMap(), false);
}
private void initPopupMenus() {
popups = new HashMap<>();
popups.put(Catalog.class, new CatalogPopUpMenu());
popups.put(Schema.class, new SchemaPopUpMenu());
popups.put(ReverseEngineering.class, new RootPopUpMenu());
popups.put(String.class, new RootPopUpMenu());
popups.put(IncludeTable.class, new IncludeTablePopUpMenu());
popups.put(ExcludeTable.class, new DefaultPopUpMenu());
popups.put(IncludeColumn.class, new DefaultPopUpMenu());
popups.put(ExcludeColumn.class, new DefaultPopUpMenu());
popups.put(IncludeProcedure.class, new DefaultPopUpMenu());
popups.put(ExcludeProcedure.class, new DefaultPopUpMenu());
}
private void initListeners() {
reverseEngineeringTree.addTreeSelectionListener(e -> treeToolbar.lockButtons());
reverseEngineeringTree.addMouseListener(new MouseAdapter() {
@Override
public void mouseClicked(MouseEvent e) {
if (reverseEngineeringTree.getRowForLocation(e.getX(), e.getY()) == -1) {
reverseEngineeringTree.setSelectionRow(-1);
}
if (SwingUtilities.isRightMouseButton(e)) {
if (reverseEngineeringTree.isEditing()) {
return;
}
int row = reverseEngineeringTree.getClosestRowForLocation(e.getX(), e.getY());
reverseEngineeringTree.setSelectionRow(row);
DefaultPopUpMenu popupMenu;
DbImportTreeNode selectedElement;
if (reverseEngineeringTree.getSelectionPath() != null) {
selectedElement = reverseEngineeringTree.getSelectedNode();
popupMenu = popups.get(selectedElement.getUserObject().getClass());
} else {
selectedElement = reverseEngineeringTree.getRootNode();
popupMenu = popups.get(ReverseEngineering.class);
}
if (popupMenu != null) {
popupMenu.setProjectController(projectController);
popupMenu.setSelectedElement(selectedElement);
popupMenu.setParentElement(selectedElement.getParent());
popupMenu.setTree(reverseEngineeringTree);
popupMenu.show(e.getComponent(), e.getX(), e.getY());
}
} else if (reverseEngineeringTree.getSelectionPath() != null) {
DbImportTreeNode selectedNode = reverseEngineeringTree.getSelectedNode();
if( selectedNode.isExcludeColumn() || selectedNode.isIncludeColumn()) {
DbImportTreeNode expandNode = selectedNode.getParent();
DbImportTreeNode parentPath = dbSchemaTree.findNode(
dbSchemaTree.getRootNode(), expandNode, 0
);
if (parentPath != null) {
dbSchemaTree.expandPath(new TreePath((parentPath).getPath()));
scrollToNode(dbSchemaTree, parentPath);
}
} else {
DbImportTreeNode findNode = dbSchemaTree.findNode(
dbSchemaTree.getRootNode(), selectedNode, 0
);
if (findNode != null) {
dbSchemaTree.expandPath(new TreePath(findNode.getParent().getPath()));
scrollToNode(dbSchemaTree, findNode);
}
}
}
}
});
}
private void scrollToNode(JTree tree, DbImportTreeNode node) {
TreePath path = new TreePath(node.getPath());
tree.scrollPathToVisible(path);
DraggableTreePanel parentPanel = ((DraggableTreePanel) dbSchemaTree.getParent().getParent());
parentPanel.getHorizontalScrollBar().setValue(0);
}
private ReverseEngineering getReverseEngineeringBySelectedMap() {
DataMap dataMap = projectController.getCurrentDataMap();
return projectController.getApplication().getMetaData().get(dataMap, ReverseEngineering.class);
}
private void changeIcons() {
// Deleting standard tree icons
DefaultTreeCellRenderer renderer = (DefaultTreeCellRenderer) reverseEngineeringTree.getCellRenderer();
renderer.setLeafIcon(null);
renderer.setClosedIcon(null);
renderer.setOpenIcon(null);
}
public DbImportTree getReverseEngineeringTree() {
return reverseEngineeringTree;
}
void setTreeToolbar(TreeToolbarPanel treeToolbar) {
this.treeToolbar = treeToolbar;
}
}