blob: 2d7416bf8acff516f34abefc7c09aab542f5b75b [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
*
* 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.oodt.cas.workflow.gui.perspective.build;
//JDK imports
import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.util.Collections;
import java.util.HashMap;
import java.util.Map;
import java.util.Map.Entry;
import javax.swing.JMenuItem;
import javax.swing.JPanel;
import javax.swing.JPopupMenu;
import javax.swing.JSplitPane;
import javax.swing.JTabbedPane;
import javax.swing.event.ChangeEvent;
import javax.swing.event.ChangeListener;
//OODT imports
import org.apache.oodt.cas.workflow.gui.model.ModelGraph;
import org.apache.oodt.cas.workflow.gui.perspective.MultiStatePerspective;
import org.apache.oodt.cas.workflow.gui.perspective.view.MultiStateView;
import org.apache.oodt.cas.workflow.gui.perspective.view.View;
import org.apache.oodt.cas.workflow.gui.perspective.view.ViewChange;
import org.apache.oodt.cas.workflow.gui.perspective.view.ViewListener;
import org.apache.oodt.cas.workflow.gui.perspective.view.ViewState;
import org.apache.oodt.cas.workflow.gui.perspective.view.impl.DefaultPropView;
import org.apache.oodt.cas.workflow.gui.perspective.view.impl.DefaultTreeView;
import org.apache.oodt.cas.workflow.gui.perspective.view.impl.GlobalConfigView;
import org.apache.oodt.cas.workflow.gui.perspective.view.impl.GraphView;
import org.apache.oodt.cas.workflow.gui.perspective.view.impl.TreeProjectView;
import org.apache.oodt.cas.workflow.gui.util.GuiUtils;
/**
*
* The default build perspective.
*
* @author bfoster
* @author mattmann
*
*/
public class BuildPerspective extends MultiStatePerspective {
private static final long serialVersionUID = 3387632819576057527L;
private View projectView;
private View globalConfigView;
private Class<? extends View> projectViewClass;
private Class<? extends View> mainViewClass;
private Class<? extends View> treeViewClass;
private Class<? extends View> propViewClass;
private Class<? extends View> globalViewClass;
private HashMap<ViewState, BuildPanel> stateViews;
private ViewState activeState;
public static final int MAIN_VIEW = 1;
private static final int WIDTH = 1000;
private static final int HEIGHT = 700;
private JSplitPane projectSplitPane;
private boolean findSelectedInTab = false;
public BuildPerspective() throws InstantiationException,
IllegalAccessException {
this(TreeProjectView.class, GraphView.class, DefaultTreeView.class,
DefaultPropView.class, GlobalConfigView.class);
}
public BuildPerspective(Class<? extends View> projectViewClass,
Class<? extends View> mainViewClass, Class<? extends View> treeViewClass,
Class<? extends View> propViewClass, Class<? extends View> globalViewClass)
throws InstantiationException, IllegalAccessException {
super("Build");
this.projectViewClass = projectViewClass;
this.mainViewClass = mainViewClass;
this.treeViewClass = treeViewClass;
this.propViewClass = propViewClass;
this.globalViewClass = globalViewClass;
this.stateViews = new HashMap<ViewState, BuildPanel>();
this.projectView = this.createProjectView();
this.projectView.setPreferredSize(new Dimension(WIDTH / 10, HEIGHT / 2));
this.globalConfigView = this.createGlobalConfigView();
this.globalConfigView
.setPreferredSize(new Dimension(WIDTH / 10, HEIGHT / 2));
}
public void reset() {
super.reset();
this.activeState = null;
this.stateViews.clear();
this.projectView = this.createProjectView();
this.globalConfigView = this.createGlobalConfigView();
}
public void stateChangeNotify(ViewChange<?> change) {
if (change instanceof ViewChange.NEW_ACTIVE_STATE) {
this.activeState = ((ViewChange.NEW_ACTIVE_STATE) change).getObject();
this.refresh();
} else if (change instanceof ViewChange.REFRESH_VIEW) {
this.refresh();
} else if (change instanceof ViewChange.STATE_NAME_CHANGE) {
ViewState state = ((ViewChange.STATE_NAME_CHANGE) change).getObject();
this.refresh();
} else if (change instanceof ViewChange.VIEW_MODEL) {
String modelId = ((ViewChange.VIEW_MODEL) change).getObject();
for (ViewState state : this.stateViews.keySet()) {
for (ModelGraph graph : state.getGraphs()) {
ModelGraph found = graph.recursiveFindByModelId(modelId);
if (found != null && !found.getModel().isRef()) {
this.activeState = state;
this.activeState.setSelected(found);
break;
}
}
}
this.findSelectedInTab = true;
this.refresh();
this.findSelectedInTab = false;
}
}
@Override
public ViewState getActiveState() {
return this.activeState;
}
public View getActiveView() {
if (this.getActiveState() != null)
return this.stateViews.get(this.getActiveState()).getActiveView();
else
return null;
}
@Override
public void handleAddState(final ViewState state) {
this.activeState = state;
BuildPanel buildPanel = new BuildPanel(state);
this.stateViews.put(state, buildPanel);
this.refresh();
}
@Override
public void handleRemoveState(ViewState state) {
this.stateViews.remove(state);
if (this.stateViews.size() > 0)
this.activeState = this.stateViews.keySet().iterator().next();
else
this.activeState = null;
this.refresh();
}
@Override
public void refresh() {
this.save();
this.removeAll();
this.setLayout(new BorderLayout());
JPanel panel = null;
if (this.activeState != null) {
BuildPanel buildPanel = this.stateViews.get(this.activeState);
buildPanel.refresh();
panel = buildPanel;
} else {
panel = new JPanel();
}
if (this.projectView instanceof MultiStateView)
((MultiStateView) this.projectView).refreshView(this.activeState,
this.getStates());
else
this.projectView.refreshView(this.activeState);
this.globalConfigView.refreshView(this.activeState);
JPanel globalPanel = new JPanel();
globalPanel.setLayout(new BorderLayout());
globalPanel.add(this.projectView, BorderLayout.CENTER);
globalPanel.add(this.globalConfigView, BorderLayout.SOUTH);
int dividerLocation = -1;
if (projectSplitPane != null)
dividerLocation = projectSplitPane.getDividerLocation();
projectSplitPane = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT, globalPanel,
panel);
if (dividerLocation != -1)
projectSplitPane.setDividerLocation(dividerLocation);
this.add(projectSplitPane, BorderLayout.CENTER);
this.revalidate();
}
private View createMainView(String name) {
try {
return this.mainViewClass.getConstructor(String.class).newInstance(name);
} catch (Exception e) {
e.printStackTrace();
return null;
}
}
private View createTreeView() {
try {
return this.treeViewClass.getConstructor(String.class).newInstance(
this.treeViewClass.getSimpleName());
} catch (Exception e) {
e.printStackTrace();
return null;
}
}
private View createGlobalConfigView() {
try {
return this.globalViewClass.getConstructor(String.class).newInstance(
this.globalViewClass.getSimpleName());
} catch (Exception e) {
e.printStackTrace();
return null;
}
}
private View createProjectView() {
try {
View view = this.projectViewClass.getConstructor(String.class)
.newInstance(this.projectViewClass.getSimpleName());
view.registerListener(this);
return view;
} catch (Exception e) {
e.printStackTrace();
return null;
}
}
private View createPropView() {
try {
return this.propViewClass.getConstructor(String.class).newInstance(
this.propViewClass.getSimpleName());
} catch (Exception e) {
e.printStackTrace();
return null;
}
}
private class BuildPanel extends JPanel implements ViewListener {
private static final long serialVersionUID = -6120047959962567963L;
private JTabbedPane tabbedPane;
private Map<View, ViewState> mainViews;
private View propView;
private View treeView;
private View primaryMainView;
private JPopupMenu closeTabPopup;
private ViewState state;
public BuildPanel(ViewState state) {
this.state = state;
mainViews = new HashMap<View, ViewState>();
propView = createPropView();
propView.registerListener(this);
treeView = createTreeView();
treeView.registerListener(this);
tabbedPane = new JTabbedPane();
this.addMainView(createMainView(state.getFile().getName()), state);
closeTabPopup = new JPopupMenu();
JMenuItem closeItem = new JMenuItem("Close");
closeItem.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
View mainView = (View) BuildPanel.this.tabbedPane
.getSelectedComponent();
BuildPanel.this.removeMainView(mainView);
}
});
closeTabPopup.add(closeItem);
this.tabbedPane.addMouseListener(new MouseListener() {
public void mouseClicked(MouseEvent e) {
if (e.getButton() == MouseEvent.BUTTON3
&& !BuildPanel.this.tabbedPane.getSelectedComponent().equals(
BuildPanel.this.primaryMainView)) {
closeTabPopup.show(BuildPanel.this.tabbedPane, e.getX(), e.getY());
}
}
public void mouseEntered(MouseEvent e) {
}
public void mouseExited(MouseEvent e) {
}
public void mousePressed(MouseEvent e) {
}
public void mouseReleased(MouseEvent e) {
}
});
this.tabbedPane.addChangeListener(new ChangeListener() {
public void stateChanged(ChangeEvent e) {
View activeView = (View) BuildPanel.this.tabbedPane
.getSelectedComponent();
activeView.notifyListeners();
}
});
treeView.setPreferredSize(new Dimension(WIDTH / 10, HEIGHT / 2));
propView.setPreferredSize(new Dimension(WIDTH / 10, HEIGHT / 2));
JSplitPane treePropPane = new JSplitPane(JSplitPane.VERTICAL_SPLIT,
treeView, propView);
treePropPane.setResizeWeight(.25);
tabbedPane.setPreferredSize(new Dimension(WIDTH, HEIGHT));
JSplitPane mainSplitPane = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT,
tabbedPane, treePropPane);
mainSplitPane.setResizeWeight(.75);
this.setLayout(new BorderLayout());
this.add(mainSplitPane, BorderLayout.CENTER);
}
public void addMainView(View mainView, ViewState state) {
if (this.mainViews.size() == 0) {
this.primaryMainView = mainView;
mainView.setPrimary(true);
}
this.mainViews.put(mainView, state);
this.tabbedPane.addTab(mainView.getName(), mainView);
this.tabbedPane.setSelectedComponent(mainView);
mainView.registerListener(this);
}
public void removeMainView(View mainView) {
if (!this.primaryMainView.equals(mainView)) {
for (int i = 0; i < this.tabbedPane.getTabCount(); i++) {
if (mainView.getName().equals(this.tabbedPane.getTitleAt(i))) {
this.tabbedPane.removeTabAt(i);
this.mainViews.remove(mainView);
return;
}
}
}
}
public View getActiveView() {
return (View) this.tabbedPane.getSelectedComponent();
}
public void refresh() {
if (this.getActiveView() != null) {
ViewState viewState = null;
if (this.state.getSelected() != null && findSelectedInTab) {
TOP: for (Entry<View, ViewState> entry : this.mainViews.entrySet()) {
for (ModelGraph graph : entry.getValue().getGraphs()) {
ModelGraph found = graph.recursiveFindByModelId(this.state
.getSelected().getModel().getModelId());
if (found != null && !found.getModel().isRef()) {
viewState = entry.getValue();
viewState.setSelected(found);
this.tabbedPane.setSelectedComponent(entry.getKey());
break TOP;
}
}
}
} else {
viewState = this.mainViews.get(this.getActiveView());
}
this.getActiveView().refreshView(viewState);
this.propView.refreshView(viewState);
this.treeView.refreshView(viewState);
}
this.revalidate();
}
public void stateChangeNotify(ViewChange<?> change) {
if (change instanceof ViewChange.NEW_VIEW) {
this.addMainView(
createMainView(((ViewChange.NEW_VIEW) change).getObject()
.getModel().getModelId()),
new ViewState(this.state.getFile(), null, Collections
.singletonList(GuiUtils.find(this.state.getGraphs(),
((ViewChange.NEW_VIEW) change).getObject().getModel()
.getId())), this.state.getGlobalConfigGroups()));
this.refresh();
}
BuildPerspective.this.stateChangeNotify(change);
}
}
}