/*
*
* 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.airavata.xbaya.ui.views;
import java.awt.BorderLayout;
import java.awt.Component;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.util.ArrayList;
import java.util.List;
import java.util.Observable;
import java.util.Observer;
import javax.swing.JPanel;
import javax.swing.JPopupMenu;
import javax.swing.JScrollPane;
import javax.swing.JTree;
import javax.swing.KeyStroke;
import javax.swing.border.EmptyBorder;
import javax.swing.tree.DefaultTreeModel;
//import org.apache.airavata.registry.api.AiravataRegistry2;
import org.apache.airavata.client.api.AiravataAPI;
import org.apache.airavata.workflow.model.component.registry.JCRComponentRegistry;
import org.apache.airavata.xbaya.XBayaEngine;
import org.apache.airavata.xbaya.registrybrowser.nodes.AbstractAiravataTreeNode;
import org.apache.airavata.xbaya.registrybrowser.nodes.AiravataTreeNodeFactory;
import org.apache.airavata.xbaya.registrybrowser.nodes.RegistryTreeCellRenderer;
import org.apache.airavata.xbaya.ui.actions.AbstractBrowserActionItem;
import org.apache.airavata.xbaya.ui.actions.registry.browser.AddAction;
import org.apache.airavata.xbaya.ui.actions.registry.browser.CopyAction;
import org.apache.airavata.xbaya.ui.actions.registry.browser.DeleteAction;
import org.apache.airavata.xbaya.ui.actions.registry.browser.EditAction;
import org.apache.airavata.xbaya.ui.actions.registry.browser.ImportAction;
import org.apache.airavata.xbaya.ui.actions.registry.browser.RefreshAction;
import org.apache.airavata.xbaya.ui.actions.registry.browser.ViewAction;
public class JCRBrowserPanel extends JPanel implements Observer {
private List<AbstractBrowserActionItem> browserActions = new ArrayList<AbstractBrowserActionItem>();
/**
*
*/
private static final long serialVersionUID = -4490110894914580271L;
private XBayaEngine engine;
private JTree tree;
private JPopupMenu popupMenu;
private AbstractBrowserActionItem actionDelete;
/**
* Create the dialog.
*/
public JCRBrowserPanel(XBayaEngine engine) {
setEngine(engine);
initGUI();
}
private void initGUI() {
setBounds(100, 100, 450, 300);
this.setBorder(new EmptyBorder(5, 5, 5, 5));
this.setLayout(new BorderLayout(0, 0));
{
JScrollPane scrollPane = new JScrollPane();
this.add(scrollPane, BorderLayout.CENTER);
{
tree = new JTree(AiravataTreeNodeFactory.getTreeNode(getJCRRegistry() == null ? "No registry specified"
: getEngine(), null));
tree.addKeyListener(new KeyAdapter() {
@Override
public void keyPressed(KeyEvent e) {
if (e.getKeyCode() == KeyEvent.VK_F5) {
triggerNodeAction(RefreshAction.ID);
}
}
});
tree.setCellRenderer(new RegistryTreeCellRenderer());
scrollPane.setViewportView(tree);
popupMenu = new JPopupMenu();
popupMenu.setLabel("");
addPopup(tree, popupMenu);
AbstractBrowserActionItem actionRefresh = new RefreshAction();
actionRefresh.getMenuItem().setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_F5, 0));
actionRefresh.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
triggerNodeAction(RefreshAction.ID);
}
});
actionDelete = new DeleteAction();
actionDelete.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent arg0) {
triggerNodeAction(DeleteAction.ID);
}
});
AddAction actionAdd = new AddAction();
actionAdd.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent arg0) {
triggerNodeAction(AddAction.ID);
}
});
EditAction actionEdit = new EditAction();
actionEdit.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent arg0) {
triggerNodeAction(EditAction.ID);
}
});
ImportAction actionImport = new ImportAction();
actionImport.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent arg0) {
triggerNodeAction(ImportAction.ID);
}
});
CopyAction actionCopy = new CopyAction();
actionCopy.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent arg0) {
triggerNodeAction(CopyAction.ID);
}
});
ViewAction actionView = new ViewAction();
actionView.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent arg0) {
triggerNodeAction(ViewAction.ID);
}
});
tree.addMouseListener(new MouseAdapter(){
@Override
public void mouseClicked(MouseEvent e) {
if (e.getClickCount() == 2){
triggerNodeAction(null);
}
}
});
browserActions.add(actionAdd);
browserActions.add(actionView);
browserActions.add(actionImport);
browserActions.add(actionEdit);
browserActions.add(actionRefresh);
browserActions.add(actionDelete);
browserActions.add(actionCopy);
// popupMenu.add(actionAdd.getMenuItem());
// popupMenu.add(actionDelete.getMenuItem());
// popupMenu.add(actionRefresh.getMenuItem());
}
}
}
public void close() {
setVisible(false);
}
public void open() {
setVisible(true);
}
public XBayaEngine getEngine() {
return engine;
}
public void setEngine(XBayaEngine engine) {
if (this.engine != null) {
this.engine.getConfiguration().deleteObserver(this);
}
this.engine = engine;
if (this.engine != null) {
this.engine.getConfiguration().addObserver(this);
}
}
private AiravataAPI getJCRRegistry() {
try {
return getEngine().getConfiguration().getAiravataAPI();
} catch (Exception e) {
// JCR registry not specified yet
return null;
}
}
public void update(Observable observable, Object o) {
if (getEngine().getConfiguration() == observable) {
if (o instanceof JCRComponentRegistry) {
resetModel();
} else if (o instanceof AiravataAPI) {
resetModel();
}
}
}
private void resetModel() {
tree.setModel(new DefaultTreeModel(AiravataTreeNodeFactory.getTreeNode(
getJCRRegistry() == null ? "No registry specified" : getEngine(), null)));
}
private void addPopup(Component component, final JPopupMenu popup) {
component.addMouseListener(new MouseAdapter() {
public void mousePressed(MouseEvent e) {
if (e.isPopupTrigger()) {
showMenu(e);
}
}
public void mouseReleased(MouseEvent e) {
if (e.isPopupTrigger()) {
showMenu(e);
}
}
private void showMenu(MouseEvent e) {
int selRow = tree.getRowForLocation(e.getX(), e.getY());
if (selRow != -1 && e.isPopupTrigger()) {
tree.setSelectionRow(selRow);
Object o = tree.getLastSelectedPathComponent();
popup.removeAll();
if (o instanceof AbstractAiravataTreeNode) {
AbstractAiravataTreeNode node = ((AbstractAiravataTreeNode) o);
for (AbstractBrowserActionItem action : browserActions) {
boolean actionSupported = node.isActionSupported(action);
action.setVisible(actionSupported);
if (actionSupported) {
action.setCaption(node.getActionCaption(action));
action.setIcon(node.getActionIcon(action));
action.setDescription(node.getActionDescription(action));
popup.add(action.getMenuItem());
}
}
}
if (popup.getSubElements().length>0) {
popup.show(e.getComponent(), e.getX(), e.getY());
}
}
}
});
}
private void triggerNodeAction(String action) {
Object o = tree.getLastSelectedPathComponent();
if (o instanceof AbstractAiravataTreeNode) {
AbstractAiravataTreeNode node = ((AbstractAiravataTreeNode) o);
try {
if (action==null){
action=node.getDefaultAction();
}
if (action!=null) {
node.triggerAction(tree, action);
}
} catch (Exception e) {
e.printStackTrace();
getEngine().getGUI().getErrorWindow().error(e);
}
}
}
}