/* * Copyright 2013 Hewlett-Packard Development Company, L.P * * 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 com.hp.alm.ali.idea.content.detail; import com.hp.alm.ali.idea.action.ActionUtil; import com.hp.alm.ali.idea.ui.entity.table.EntityTable; import com.hp.alm.ali.idea.entity.table.EntityTableModel; import com.hp.alm.ali.idea.entity.table.QuerySharingManager; import com.hp.alm.ali.idea.model.Entity; import com.intellij.openapi.actionSystem.ActionToolbar; import com.intellij.openapi.actionSystem.DataProvider; import com.intellij.openapi.project.Project; import org.jetbrains.annotations.NonNls; import javax.swing.Icon; import javax.swing.JPanel; import javax.swing.event.ChangeEvent; import javax.swing.event.ChangeListener; import javax.swing.event.TableModelEvent; import javax.swing.event.TableModelListener; import java.awt.BorderLayout; import java.awt.Component; import java.awt.Dimension; import java.awt.FlowLayout; import java.util.LinkedList; import java.util.List; public class TableContent extends JPanel implements DetailContent, TableModelListener, DataProvider { private EntityTable entityTable; private Entity entity; private final String label; private final Icon icon; private JPanel toolbars; private ActionToolbar entityToolbar; private EntityTableLoader loader; private QuerySharingManager querySharingManager; final private List<ChangeListener> listeners; public TableContent(Project project, Entity entity, String label, Icon icon, ActionToolbar toolbar, EntityTableLoader loader) { super(new BorderLayout()); this.entity = entity; this.label = label; this.icon = icon; this.loader = loader; this.listeners = new LinkedList<ChangeListener>(); this.querySharingManager = project.getComponent(QuerySharingManager.class); toolbars = new JPanel(new FlowLayout(FlowLayout.LEFT, 2, 0)); if(toolbar != null) { toolbar.setTargetComponent(this); toolbars.add(toolbar.getComponent()); } add(toolbars, BorderLayout.NORTH); entityToolbar = ActionUtil.createActionToolbar("hpali.entity", "detail-table", true); } public void remove() { removeExistingTable(); synchronized (listeners) { listeners.clear(); } } private void removeExistingTable() { if(entityTable != null) { toolbars.remove(entityToolbar.getComponent()); EntityTableModel model = entityTable.getModel(); model.removeTableModelListener(this); querySharingManager.removeSharedQuery(model, model.getFilter().getEntityType()); } } public void setTable(EntityTable entityTable) { if(this.entityTable == entityTable) { if(entityTable != null) { entityTable.getModel().reload(); } return; } removeExistingTable(); this.entityTable = entityTable; if(entityTable != null) { entityToolbar.setTargetComponent(entityTable); toolbars.add(entityToolbar.getComponent()); add(entityTable, BorderLayout.CENTER); EntityTableModel model = entityTable.getModel(); model.addTableModelListener(this); querySharingManager.addSharedQuery(model, model.getFilter().getEntityType()); } fireChangeEvent(this); } private void fireChangeEvent(Object source) { synchronized (listeners) { for(ChangeListener listener: listeners) { listener.stateChanged(new ChangeEvent(source)); } } } @Override public void reload() { loader.load(this); } @Override public Component getComponent() { if(entityTable == null) { return null; } else { return this; } } @Override public String getLinkText() { if(entityTable == null) { return label; } else { return label + " (" + entityTable.getModel().getRowCount() + ")"; } } @Override public void addChangeListener(final ChangeListener listener) { synchronized (listeners) { listeners.add(listener); } } @Override public Icon getIcon() { return icon; } @Override public Dimension getPreferredSize() { if(entityTable == null) { return super.getPreferredSize(); } Dimension dim = entityTable.getPreferredSize(); int rowCount = entityTable.getModel().getRowCount(); dim.height = rowCount * entityTable.getTable().getRowHeight() + 32; // row content + header if(toolbars != null) { dim.height += toolbars.getPreferredSize().height; } if(rowCount == 0) { dim.height += 18; // Nothing to show label } return dim; } @Override public void tableChanged(TableModelEvent e) { fireChangeEvent(e); } @Override public Object getData(@NonNls String s) { // if("entity-list".equals(s)) { // return Arrays.asList(entity); // } return null; } public static interface EntityTableLoader { void load(TableContent content); } }