blob: a5efbf4ca1ccb29bb7a4ec10f2dc4659a1d6dc81 [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;
import org.apache.cayenne.map.QueryDescriptor;
import org.apache.cayenne.modeler.Application;
import org.apache.cayenne.modeler.ProjectController;
import org.apache.cayenne.modeler.ProjectTreeView;
import org.apache.cayenne.modeler.action.ActionManager;
import org.apache.cayenne.modeler.action.CollapseTreeAction;
import org.apache.cayenne.modeler.action.FilterAction;
import org.apache.cayenne.modeler.dialog.datadomain.FilterController;
import org.apache.cayenne.modeler.editor.datanode.DataNodeEditor;
import org.apache.cayenne.modeler.editor.dbentity.DbEntityTabbedView;
import org.apache.cayenne.modeler.event.DataMapDisplayEvent;
import org.apache.cayenne.modeler.event.DataMapDisplayListener;
import org.apache.cayenne.modeler.event.DataNodeDisplayEvent;
import org.apache.cayenne.modeler.event.DataNodeDisplayListener;
import org.apache.cayenne.modeler.event.DbEntityDisplayListener;
import org.apache.cayenne.modeler.event.DomainDisplayEvent;
import org.apache.cayenne.modeler.event.DomainDisplayListener;
import org.apache.cayenne.modeler.event.EmbeddableDisplayEvent;
import org.apache.cayenne.modeler.event.EmbeddableDisplayListener;
import org.apache.cayenne.modeler.event.EntityDisplayEvent;
import org.apache.cayenne.modeler.event.MultipleObjectsDisplayEvent;
import org.apache.cayenne.modeler.event.MultipleObjectsDisplayListener;
import org.apache.cayenne.modeler.event.ObjEntityDisplayListener;
import org.apache.cayenne.modeler.event.ProcedureDisplayEvent;
import org.apache.cayenne.modeler.event.ProcedureDisplayListener;
import org.apache.cayenne.modeler.event.QueryDisplayEvent;
import org.apache.cayenne.modeler.event.QueryDisplayListener;
import org.apache.cayenne.modeler.pref.ComponentGeometry;
import org.slf4j.LoggerFactory;
import javax.swing.Action;
import javax.swing.BorderFactory;
import javax.swing.JButton;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JSplitPane;
import javax.swing.JTabbedPane;
import javax.swing.JToolBar;
import java.awt.BorderLayout;
import java.awt.CardLayout;
import java.awt.Component;
import java.awt.ComponentOrientation;
import java.awt.Container;
import java.awt.Dimension;
/**
* Main display area split into the project navigation tree on the left and selected
* object editor on the right.
*/
public class EditorView extends JPanel implements ObjEntityDisplayListener,
DbEntityDisplayListener, DomainDisplayListener, DataMapDisplayListener,
DataNodeDisplayListener, ProcedureDisplayListener, QueryDisplayListener,
MultipleObjectsDisplayListener, EmbeddableDisplayListener {
private static final String EMPTY_VIEW = "Empty";
private static final String DOMAIN_VIEW = "Domain";
private static final String NODE_VIEW = "Node";
private static final String DATA_MAP_VIEW = "DataMap";
private static final String OBJ_VIEW = "ObjView";
private static final String DB_VIEW = "DbView";
private static final String EMBEDDABLE_VIEW = "EmbeddableView";
private static final String PROCEDURE_VIEW = "ProcedureView";
private static final String SELECT_QUERY_VIEW = "SelectQueryView";
private static final String SQL_TEMPLATE_VIEW = "SQLTemplateView";
private static final String PROCEDURE_QUERY_VIEW = "ProcedureQueryView";
private static final String EJBQL_QUERY_VIEW = "EjbqlQueryView";
protected ProjectController eventController;
protected JSplitPane splitPane;
protected JPanel leftPanel;
protected Container detailPanel;
protected CardLayout detailLayout;
private ProjectTreeView treePanel;
private DbEntityTabbedView dbDetailView;
private ObjEntityTabbedView objDetailView;
private EmbeddableTabbedView embeddableView;
private DataDomainTabbedView dataDomainView;
private DataMapTabbedView dataMapView;
private ProcedureTabbedView procedureView;
private SelectQueryTabbedView selectQueryView;
private SQLTemplateTabbedView sqlTemplateView;
private EjbqlTabbedView ejbqlQueryView;
private JTabbedPane dataNodeView;
protected ActionManager actionManager;
private FilterController filterController;
public FilterController getFilterController() {
return filterController;
}
public SelectQueryTabbedView getSelectQueryView() {
return selectQueryView;
}
public SQLTemplateTabbedView getSqlTemplateView() {
return sqlTemplateView;
}
public EjbqlTabbedView getEjbqlQueryView() {
return ejbqlQueryView;
}
public ProcedureTabbedView getProcedureView() {
return procedureView;
}
public ProjectTreeView getProjectTreeView() {
return treePanel;
}
public EmbeddableTabbedView getEmbeddableView() {
return embeddableView;
}
public DbEntityTabbedView getDbDetailView() {
return dbDetailView;
}
public ObjEntityTabbedView getObjDetailView() {
return objDetailView;
}
public DataDomainTabbedView getDataDomainView() {
return dataDomainView;
}
public DataMapTabbedView getDataMapView() {
return dataMapView;
}
public JTabbedPane getDataNodeView() {
return dataNodeView;
}
public ProjectTreeView getTreePanel() {
return treePanel;
}
public EditorView(ProjectController eventController) {
this.eventController = eventController;
this.actionManager = eventController.getApplication().getActionManager();
initView();
initController();
}
public ProjectController getEventController() {
return eventController;
}
private void initView() {
setBorder(BorderFactory.createEmptyBorder(1, 0, 0, 1));
// init widgets
actionManager.getAction(CollapseTreeAction.class).setAlwaysOn(true);
actionManager.getAction(FilterAction.class).setAlwaysOn(true);
actionManager.getAction(FilterAction.class).resetDialog();
JToolBar barPanel = new JToolBar();
barPanel.setFloatable(false);
barPanel.setMinimumSize(new Dimension(75, 30));
barPanel.setBorder(BorderFactory.createEmptyBorder());
barPanel.setComponentOrientation(ComponentOrientation.RIGHT_TO_LEFT);
JButton collapseButton = getAction(CollapseTreeAction.class).buildButton(1);
JButton filterButton = getAction(FilterAction.class).buildButton(3);
filterButton.setPreferredSize(new Dimension(30, 30));
collapseButton.setPreferredSize(new Dimension(30, 30));
barPanel.add(filterButton);
barPanel.add(collapseButton);
treePanel = new ProjectTreeView(eventController);
treePanel.setMinimumSize(new Dimension(75, 180));
JPanel treeNavigatePanel = new JPanel();
treeNavigatePanel.setMinimumSize(new Dimension(75, 220));
treeNavigatePanel.setLayout(new BorderLayout());
treeNavigatePanel.add(treePanel, BorderLayout.CENTER);
detailPanel = new JPanel();
splitPane = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT, true);
splitPane.setDividerSize(2);
splitPane.setBorder(BorderFactory.createEmptyBorder());
leftPanel = new JPanel(new BorderLayout());
// assemble...
detailLayout = new CardLayout();
detailPanel.setLayout(detailLayout);
// some but not all panels must be wrapped in a scroll pane
// those that are not wrapped usually have there own scrollers
// in subpanels...
detailPanel.add(new JPanel(), EMPTY_VIEW);
dataDomainView = new DataDomainTabbedView(eventController);
detailPanel.add(dataDomainView, DOMAIN_VIEW);
DataNodeEditor nodeController = new DataNodeEditor(eventController);
detailPanel.add(nodeController.getView(), NODE_VIEW);
dataNodeView = nodeController.getTabComponent();
dataMapView = new DataMapTabbedView(eventController);
detailPanel.add(dataMapView, DATA_MAP_VIEW);
procedureView = new ProcedureTabbedView(eventController);
detailPanel.add(procedureView, PROCEDURE_VIEW);
selectQueryView = new SelectQueryTabbedView(eventController);
detailPanel.add(selectQueryView, SELECT_QUERY_VIEW);
sqlTemplateView = new SQLTemplateTabbedView(eventController);
detailPanel.add(sqlTemplateView, SQL_TEMPLATE_VIEW);
Component procedureQueryView = new ProcedureQueryView(eventController);
detailPanel.add(new JScrollPane(procedureQueryView), PROCEDURE_QUERY_VIEW);
ejbqlQueryView = new EjbqlTabbedView(eventController);
detailPanel.add(ejbqlQueryView, EJBQL_QUERY_VIEW);
embeddableView = new EmbeddableTabbedView(eventController);
detailPanel.add(embeddableView, EMBEDDABLE_VIEW);
objDetailView = new ObjEntityTabbedView(eventController);
detailPanel.add(objDetailView, OBJ_VIEW);
dbDetailView = new DbEntityTabbedView(eventController);
detailPanel.add(dbDetailView, DB_VIEW);
leftPanel.add(barPanel, BorderLayout.NORTH);
leftPanel.setBorder(BorderFactory.createEmptyBorder());
JScrollPane scrollPane = new JScrollPane(treeNavigatePanel);
scrollPane.setBorder(BorderFactory.createEmptyBorder());
leftPanel.add(scrollPane, BorderLayout.CENTER);
splitPane.setLeftComponent(leftPanel);
splitPane.setRightComponent(detailPanel);
setLayout(new BorderLayout());
add(splitPane, BorderLayout.CENTER);
}
private <T extends Action> T getAction(Class<T> type) {
return actionManager.getAction(type);
}
private void initController() {
this.filterController = new FilterController(eventController,treePanel);
eventController.addDomainDisplayListener(this);
eventController.addDataNodeDisplayListener(this);
eventController.addDataMapDisplayListener(this);
eventController.addObjEntityDisplayListener(this);
eventController.addDbEntityDisplayListener(this);
eventController.addProcedureDisplayListener(this);
eventController.addQueryDisplayListener(this);
eventController.addMultipleObjectsDisplayListener(this);
eventController.addEmbeddableDisplayListener(this);
// Moving this to try-catch block per CAY-940. Exception will be stack-traced
try {
ComponentGeometry geometry = new ComponentGeometry(this.getClass(), "splitPane/divider");
geometry.bindIntProperty(splitPane, JSplitPane.DIVIDER_LOCATION_PROPERTY, 150);
} catch (Exception ex) {
LoggerFactory.getLogger(getClass()).error("Cannot bind divider property", ex);
}
}
public void currentProcedureChanged(ProcedureDisplayEvent e) {
detailLayout.show(detailPanel, e.getProcedure() == null ? EMPTY_VIEW : PROCEDURE_VIEW);
}
public void currentDomainChanged(DomainDisplayEvent e) {
detailLayout.show(detailPanel, e.getDomain() == null ? EMPTY_VIEW : DOMAIN_VIEW);
}
public void currentDataNodeChanged(DataNodeDisplayEvent e) {
detailLayout.show(detailPanel, e.getDataNode() == null ? EMPTY_VIEW : NODE_VIEW);
}
public void currentDataMapChanged(DataMapDisplayEvent e) {
detailLayout.show(detailPanel, e.getDataMap() == null ? EMPTY_VIEW : DATA_MAP_VIEW);
}
public void currentObjEntityChanged(EntityDisplayEvent e) {
detailLayout.show(detailPanel, e.getEntity() == null ? EMPTY_VIEW : OBJ_VIEW);
}
public void currentDbEntityChanged(EntityDisplayEvent e) {
detailLayout.show(detailPanel, e.getEntity() == null ? EMPTY_VIEW : DB_VIEW);
}
public void currentQueryChanged(QueryDisplayEvent e) {
QueryDescriptor query = e.getQuery();
switch (query.getType()) {
case QueryDescriptor.SELECT_QUERY:
detailLayout.show(detailPanel, SELECT_QUERY_VIEW);
break;
case QueryDescriptor.SQL_TEMPLATE:
detailLayout.show(detailPanel, SQL_TEMPLATE_VIEW);
break;
case QueryDescriptor.PROCEDURE_QUERY:
detailLayout.show(detailPanel, PROCEDURE_QUERY_VIEW);
break;
case QueryDescriptor.EJBQL_QUERY:
detailLayout.show(detailPanel, EJBQL_QUERY_VIEW);
break;
default:
detailLayout.show(detailPanel, EMPTY_VIEW);
}
}
public void currentObjectsChanged(MultipleObjectsDisplayEvent e, Application application) {
detailLayout.show(detailPanel, EMPTY_VIEW);
}
public void currentEmbeddableChanged(EmbeddableDisplayEvent e) {
detailLayout.show(detailPanel, e.getEmbeddable() == null ? EMPTY_VIEW : EMBEDDABLE_VIEW);
}
}