/***************************************************************** * 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 * * 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 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); } }