
io.github.jeddict.relation.mapper.widget.table.TableWidget Maven / Gradle / Ivy
/**
* Copyright 2013-2022 the original author or authors from the Jeddict project (https://jeddict.github.io/).
*
* 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 io.github.jeddict.relation.mapper.widget.table;
import io.github.jeddict.jpa.modeler.widget.FlowNodeWidget;
import java.awt.Cursor;
import java.awt.event.ActionEvent;
import java.awt.event.MouseEvent;
import java.util.ArrayList;
import java.util.Collection;
import java.util.HashMap;
import java.util.LinkedHashMap;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
import static java.util.stream.Collectors.toList;
import javax.swing.JMenuItem;
import org.netbeans.api.visual.action.WidgetAction;
import org.netbeans.api.visual.anchor.Anchor;
import org.netbeans.api.visual.widget.Widget;
import io.github.jeddict.relation.mapper.widget.column.BasicColumnWidget;
import io.github.jeddict.relation.mapper.widget.column.ColumnWidget;
import io.github.jeddict.relation.mapper.widget.column.DiscriminatorColumnWidget;
import io.github.jeddict.relation.mapper.widget.column.ForeignKeyWidget;
import io.github.jeddict.relation.mapper.widget.api.IPrimaryKeyWidget;
import io.github.jeddict.relation.mapper.widget.api.IReferenceColumnWidget;
import io.github.jeddict.relation.mapper.widget.column.InverseJoinColumnWidget;
import io.github.jeddict.relation.mapper.widget.column.JoinColumnWidget;
import io.github.jeddict.relation.mapper.widget.column.PrimaryKeyJoinColumnWidget;
import io.github.jeddict.relation.mapper.widget.column.PrimaryKeyWidget;
import io.github.jeddict.relation.mapper.widget.column.embedded.EmbeddedAssociationInverseJoinColumnWidget;
import io.github.jeddict.relation.mapper.widget.column.embedded.EmbeddedAssociationJoinColumnWidget;
import io.github.jeddict.relation.mapper.widget.column.embedded.EmbeddedAttributeColumnWidget;
import io.github.jeddict.relation.mapper.widget.column.embedded.EmbeddedAttributeJoinColumnWidget;
import io.github.jeddict.relation.mapper.widget.column.map.MapKeyColumnWidget;
import io.github.jeddict.relation.mapper.widget.column.map.MapKeyEmbeddedColumnWidget;
import io.github.jeddict.relation.mapper.widget.column.map.MapKeyJoinColumnWidget;
import io.github.jeddict.relation.mapper.widget.column.parent.ParentAssociationInverseJoinColumnWidget;
import io.github.jeddict.relation.mapper.widget.column.parent.ParentAssociationJoinColumnWidget;
import io.github.jeddict.relation.mapper.widget.column.parent.ParentAttributeColumnWidget;
import io.github.jeddict.relation.mapper.widget.column.parent.ParentAttributePrimaryKeyWidget;
import io.github.jeddict.relation.mapper.properties.PropertiesHandler;
import io.github.jeddict.relation.mapper.spec.DBColumn;
import io.github.jeddict.relation.mapper.spec.DBMapKeyColumn;
import io.github.jeddict.relation.mapper.spec.DBMapKeyEmbeddedColumn;
import io.github.jeddict.relation.mapper.spec.DBMapKeyJoinColumn;
import io.github.jeddict.relation.mapper.spec.DBTable;
import io.github.jeddict.relation.mapper.initializer.RelationMapperScene;
import io.github.jeddict.relation.mapper.initializer.SQLEditorUtil;
import io.github.jeddict.jpa.spec.Entity;
import io.github.jeddict.jpa.modeler.initializer.JPAFileActionListener;
import org.netbeans.modeler.anchors.CustomRectangularAnchor;
import org.netbeans.modeler.config.palette.SubCategoryNodeConfig;
import org.netbeans.modeler.core.ModelerFile;
import org.netbeans.modeler.specification.model.document.IModelerScene;
import org.netbeans.modeler.specification.model.document.IRootElement;
import org.netbeans.modeler.specification.model.document.property.ElementPropertySet;
import org.netbeans.modeler.widget.context.ContextPaletteModel;
import org.netbeans.modeler.widget.node.INodeWidget;
import org.netbeans.modeler.widget.node.info.NodeWidgetInfo;
public abstract class TableWidget extends FlowNodeWidget {
private final Map columnWidgets = new HashMap<>();
private final Map foreignKeyWidgets = new HashMap<>();//ForeignKey Column
private final Map primaryKeyWidgets = new HashMap<>();//PrimaryKey Column
public TableWidget(RelationMapperScene scene, NodeWidgetInfo node) {
super(scene, node);
this.setName(((DBTable)node.getBaseElementSpec()).getName());
this.setImage(this.getNodeWidgetInfo().getModelerDocument().getImage());
this.getImageWidget().setCursor(Cursor.getPredefinedCursor(Cursor.HAND_CURSOR));
this.getImageWidget().getActions().addAction(new TableAction());
}
@Override
public void createPropertySet(ElementPropertySet set) {
set.put("BASIC_PROP", PropertiesHandler.getIndexProperties(this));
set.put("BASIC_PROP", PropertiesHandler.getUniqueConstraintProperties(this));
}
private final class TableAction extends WidgetAction.Adapter {
@Override
public WidgetAction.State mousePressed(Widget widget, WidgetAction.WidgetMouseEvent event) {
if (event.getButton() == MouseEvent.BUTTON1 && event.getClickCount()==2) {
SQLEditorUtil.openDBTable(TableWidget.this);
return WidgetAction.State.CONSUMED;
}
return WidgetAction.State.REJECTED;
}
}
public void addBasicColumn(String name, DBColumn column) {
columnWidgets.put(column.getId(),
createPinWidget(column, BasicColumnWidget.class, w -> new BasicColumnWidget(this.getModelerScene(), this, w)));
}
public void addEmbeddedAttributeColumn(String name, DBColumn column) {
columnWidgets.put(column.getId(),
createPinWidget(column, EmbeddedAttributeColumnWidget.class, w -> new EmbeddedAttributeColumnWidget(this.getModelerScene(), this, w)));
}
public void addParentPrimaryKeyAttributeColumn(String name, DBColumn column) {
primaryKeyWidgets.put(column.getId(),
createPinWidget(column, ParentAttributePrimaryKeyWidget.class, w -> new ParentAttributePrimaryKeyWidget(this.getModelerScene(), this, w)));
}
public void addMapKeyColumn(String name, DBMapKeyColumn column) {
columnWidgets.put(column.getId(),
createPinWidget(column, MapKeyColumnWidget.class, w -> new MapKeyColumnWidget(this.getModelerScene(), this, w)));
}
public void addMapKeyJoinColumn(String name, DBMapKeyJoinColumn column) {
foreignKeyWidgets.put(column.getId(),
createPinWidget(column, MapKeyJoinColumnWidget.class, w -> new MapKeyJoinColumnWidget(this.getModelerScene(), this, w)));
}
public void addMapKeyEmbeddedColumn(String name, DBMapKeyEmbeddedColumn column) {
columnWidgets.put(column.getId(),
createPinWidget(column, MapKeyEmbeddedColumnWidget.class, w -> new MapKeyEmbeddedColumnWidget(this.getModelerScene(), this, w)));
}
public void addDiscriminatorColumn(String name, DBColumn column) {
columnWidgets.put(column.getId(),
createPinWidget(column, DiscriminatorColumnWidget.class, w -> new DiscriminatorColumnWidget(this.getModelerScene(), this, w)));
}
public void addParentAttributeColumn(String name, DBColumn column) {
columnWidgets.put(column.getId(),
createPinWidget(column, ParentAttributeColumnWidget.class, w -> new ParentAttributeColumnWidget(this.getModelerScene(), this, w)));
}
public void addParentAssociationInverseJoinColumn(String name, DBColumn column) {
foreignKeyWidgets.put(column.getId(),
createPinWidget(column, ParentAssociationInverseJoinColumnWidget.class, w -> new ParentAssociationInverseJoinColumnWidget(this.getModelerScene(), this, w)));
}
public void addParentAssociationJoinColumn(String name, DBColumn column) {
foreignKeyWidgets.put(column.getId(),
createPinWidget(column, ParentAssociationJoinColumnWidget.class, w -> new ParentAssociationJoinColumnWidget(this.getModelerScene(), this, w)));
}
public void addEmbeddedAttributeJoinColumn(String name, DBColumn column) {
foreignKeyWidgets.put(column.getId(),
createPinWidget(column, EmbeddedAttributeJoinColumnWidget.class, w -> new EmbeddedAttributeJoinColumnWidget(this.getModelerScene(), this, w)));
}
public void addEmbeddedAssociationInverseJoinColumn(String name, DBColumn column) {
foreignKeyWidgets.put(column.getId(),
createPinWidget(column, EmbeddedAssociationInverseJoinColumnWidget.class, w -> new EmbeddedAssociationInverseJoinColumnWidget(this.getModelerScene(), this, w)));
}
public void addEmbeddedAssociationJoinColumn(String name, DBColumn column) {
foreignKeyWidgets.put(column.getId(),
createPinWidget(column, EmbeddedAssociationJoinColumnWidget.class, w -> new EmbeddedAssociationJoinColumnWidget(this.getModelerScene(), this, w)));
}
public void addJoinColumn(String name, DBColumn column) {
foreignKeyWidgets.put(column.getId(),
createPinWidget(column, JoinColumnWidget.class, w -> new JoinColumnWidget(this.getModelerScene(), this, w)));
}
public void addInverseJoinColumn(String name, DBColumn column) {
foreignKeyWidgets.put(column.getId(),
createPinWidget(column, InverseJoinColumnWidget.class, w -> new InverseJoinColumnWidget(this.getModelerScene(), this, w)));
}
public void addPrimaryKeyJoinColumn(String name, DBColumn column) {
foreignKeyWidgets.put(column.getId(),
createPinWidget(column, PrimaryKeyJoinColumnWidget.class, w -> new PrimaryKeyJoinColumnWidget(this.getModelerScene(), this, w)));
}
public void addPrimaryKey(String name, DBColumn column) {
primaryKeyWidgets.put(column.getId(),
createPinWidget(column, PrimaryKeyWidget.class, w -> new PrimaryKeyWidget(this.getModelerScene(), this, w)));
}
// public abstract void deleteAttribute(AttributeWidget attributeWidget);
// method should be called only onec in case of loadDocument
public void sortAttributes() {
Map> categories = new LinkedHashMap<>();
if (!primaryKeyWidgets.isEmpty()) {
List primaryKeyCatWidget = new ArrayList<>();
primaryKeyWidgets.values().forEach((primaryKeyWidget) -> {
primaryKeyCatWidget.add((Widget) primaryKeyWidget);
});
categories.put("Primary Key", primaryKeyCatWidget);
}
// List foreignKeyCatWidget = new ArrayList<>();
// List derivedIdentiyCatWidget = new ArrayList<>();
// if (!foreignKeyWidgets.isEmpty()) {
// foreignKeyWidgets.values().stream()
// .forEach((foreignKeyWidget) -> {
// if (((DBColumn) foreignKeyWidget.getBaseElementSpec()).isPrimaryKey()) {
// derivedIdentiyCatWidget.add(foreignKeyWidget);
// } else {
// foreignKeyCatWidget.add(foreignKeyWidget);
// }
// });
// }
// if (!derivedIdentiyCatWidget.isEmpty()) {
// categories.put("Derived Identity", derivedIdentiyCatWidget);
// }
// if (!foreignKeyCatWidget.isEmpty()) {
// categories.put("Foreign Key", foreignKeyCatWidget);
// }
if (!foreignKeyWidgets.isEmpty()) {
categories.put("Foreign Key", new ArrayList<>(foreignKeyWidgets.values()));
}
if (!columnWidgets.isEmpty()) {
categories.put("Basic", new ArrayList<>(columnWidgets.values()));
}
this.sortPins(categories);
}
@Override
public void setLabel(String label) {
if (label != null && !label.trim().isEmpty()) {
this.setNodeName(label.replaceAll("\\s+", ""));
}
}
/**
* @return the columnWidgets
*/
public ColumnWidget getColumnWidget(String id) {
return columnWidgets.get(id);
}
/**
* @return the referenceColumnWidgets
*/
public ForeignKeyWidget getForeignKeyWidget(String id) {
return foreignKeyWidgets.get(id);
}
/**
* @return the columnWidgets
*/
public Collection getColumnWidgets() {
return columnWidgets.values();
}
/**
* @return the referenceColumnWidgets
*/
public Collection getForeignKeyWidgets() {
return foreignKeyWidgets.values();
}
/**
* @return the primaryKeyWidgets
*/
public IPrimaryKeyWidget getPrimaryKeyWidget(String id) {
return primaryKeyWidgets.get(id);
}
public IReferenceColumnWidget findColumnWidget(String id) {
IReferenceColumnWidget columnWidget = primaryKeyWidgets.get(id);
if (columnWidget == null) {
columnWidget = foreignKeyWidgets.get(id);
}
return columnWidget;
}
/**
* @return the primaryKeyWidgets
*/
public Collection getPrimaryKeyWidgets() {
return primaryKeyWidgets.values();
}
public Collection getPrimaryKeyColumnWidgets() {
return getPrimaryKeyWidgets().stream()
.map(pkw -> (ColumnWidget)pkw)
.collect(toList());
}
@Override
public ContextPaletteModel getContextPaletteModel() {
return null;
}
@Override
protected List getPopupMenuItemList() {
List menuItemList = new LinkedList<>();
JMenuItem drive = new JMenuItem("Drive to Entity");
drive.addActionListener((ActionEvent e) -> {
DBTable table = TableWidget.this.getBaseElementSpec();
Entity entity = table.getEntity();
ModelerFile modelerFile = TableWidget.this.getModelerScene().getModelerFile();
ModelerFile parentModelerFile = modelerFile.getParentFile();
IModelerScene parentScene = parentModelerFile.getModelerScene();
INodeWidget widget = (INodeWidget) parentScene.getBaseElements()
.stream()
.filter(w -> w.getBaseElementSpec() == entity)
.findAny()
.get();
JPAFileActionListener.open(parentModelerFile);
parentModelerFile.getModelerDiagramEngine().moveToWidget(widget);
});
menuItemList.add(drive);
menuItemList.add(getPropertyMenu());
return menuItemList;
}
public void removeColumnWidget(ColumnWidget key) {
if (key instanceof ForeignKeyWidget) {
foreignKeyWidgets.remove(key.getId());
} else if (key instanceof IPrimaryKeyWidget) {
primaryKeyWidgets.remove(key.getId());
} else {
columnWidgets.remove(key.getId());
}
}
public void removeForeignKeyWidget(ForeignKeyWidget key) {
foreignKeyWidgets.remove(key.getId());
}
public void removePrimaryKeyWidget(IPrimaryKeyWidget key) {
primaryKeyWidgets.remove(key.getId());
}
@Override
public void createPinWidget(SubCategoryNodeConfig subCategoryInfo) {
throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
}
public Anchor getAnchor() {
return new CustomRectangularAnchor(this, -5, true);
}
}
© 2015 - 2025 Weber Informatics LLC | Privacy Policy