/*
* Copyright 2003-2007 Tufts University Licensed under the
* Educational Community 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.osedu.org/licenses/ECL-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 tufts.vue;
import java.io.*;
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.border.*;
import tufts.vue.gui.*;
import tufts.vue.filter.*;
/**
*
* @deprecated -- no longer in use
*
* The Object Inspector Panel!
*
* @version $Revision: 1.1 $ / $Date: 2008-06-19 03:46:58 $ / $Author: sfraize $
*
*/
public class ObjectInspectorPanel extends JPanel
implements LWSelection.Listener
{
private static final boolean WidgetStackImpl = false;
public static final int INFO_TAB = 0;
public static final int NOTES_TAB = 1;
public static final int TREE_TAB = 2;
public static final int FILTER_TAB = 3;
/** The tabbed panel **/
JTabbedPane mTabbedPane = null;
/** The node we are inspecting **/
LWComponent mComponent = null;
/** info tab panel **/
InfoPanel mInfoPanel = null;
/** pathways panel **/
TreePanel mTreePanel = null;
/** notes panel **/
NotePanel mNotePanel = null;
/** filter panel **/
NodeFilterPanel mNodeFilterPanel = null;
public ObjectInspectorPanel()
{
setMinimumSize( new Dimension( 240,200) );
//mInfoPanel = new InfoPanel();
mTreePanel = new TreePanel();
mNotePanel = new NotePanel();
mNodeFilterPanel = new NodeFilterPanel();
setLayout( new BorderLayout() );
if (WidgetStackImpl) {
WidgetStack stack = new WidgetStack();
stack.addPane(mNotePanel);
stack.addPane(mNodeFilterPanel);
stack.addPane(mTreePanel);
add(stack);
Widget.setExpanded(mTreePanel, false);
} else {
setOpaque(false);
setBorder( new EmptyBorder( 5,5,5,5) );
mTabbedPane = new JTabbedPane();
VueResources.initComponent( mTabbedPane, "tabPane");
//mTabbedPane.addTab( mInfoPanel.getName(), mInfoPanel);
mTabbedPane.addTab( mTreePanel.getName(), mTreePanel);
mTabbedPane.addTab( mNotePanel.getName(), mNotePanel);
mTabbedPane.addTab(mNodeFilterPanel.getName(),mNodeFilterPanel);
add( BorderLayout.CENTER, mTabbedPane );
}
VUE.getSelection().addListener(this);
if (DEBUG.INIT) System.out.println("Created " + this);
}
////////////////////
// Methods
///////////////////
/**
* setComponent
* Sets the LWMap component and updates the display
*
* @param pComponet - the LWMap to inspect
**/
public void setLWComponent(LWComponent pComponent) {
// if we have a change in maps...
if( pComponent != mComponent) {
mComponent = pComponent;
updatePanels();
}
}
/**
* updatePanels
* This method updates the panel's content pased on the selected
* Map
*
**/
public void updatePanels() {
//mInfoPanel.updatePanel( mComponent);
mTreePanel.updatePanel( mComponent);
//mNotePanel.updatePanel( mComponent);
mNodeFilterPanel.updatePanel(mComponent);
}
//////////////////////
// OVerrides
//////////////////////
public Dimension getPreferredSize() {
Dimension size = super.getPreferredSize();
if( size.getWidth() < 300 ) {
size.setSize( 300, size.getHeight() );
}
if( size.getHeight() < 250 ) {
size.setSize( size.getWidth(), 250);
}
return size;
}
public void selectionChanged( LWSelection pSelection) {
LWComponent lwc = null;
if( pSelection.size() == 1 ) {
// debug( "Object Inspector single selection");
lwc = pSelection.first();
setLWComponent(lwc);
}
else if (pSelection.size() == 0) {
mTreePanel.updatePanel();
}else {
// debug("ObjectInspector item selection size is: "+ pSelection.size() );
}
// setLWComponent(lwc);
}
/////////////////
// Inner Classes
////////////////////
/**
* InfoPanel
* This is the tab panel for displaying Map Info
*
**/
public class InfoPanel extends JPanel {
JScrollPane mInfoScrollPane = null;
JPanel labelPanel;
JLabel objectLabel;
//JPanel previewPanel = new JPanel(new BorderLayout());
JComponent mPreview = null;
LWComponent mComponent;
public InfoPanel() {
setLayout( new BorderLayout() );
setName("infoPanel");
setOpaque(false);
//setBorder( BorderFactory.createEmptyBorder(10,10,10,6));
objectLabel = new JLabel("Node");
objectLabel.setFont(VueConstants.FONT_MEDIUM_BOLD);
objectLabel.setHorizontalTextPosition(JLabel.LEFT);
objectLabel.setVerticalAlignment(JLabel.TOP);
labelPanel = new JPanel(new BorderLayout());
labelPanel.setOpaque(false);
labelPanel.setBorder( BorderFactory.createEmptyBorder(0,0,5,0));
labelPanel.add(objectLabel,BorderLayout.WEST);
//previewPanel.setPreferredSize(new Dimension(75,75));
//previewPanel.setBorder(BorderFactory.createLineBorder(Color.BLACK));
//previewPanel.setBorder(BorderFactory.createLoweredBevelBorder());
//labelPanel.add(previewPanel,BorderLayout.EAST);
//setBorder(BorderFactory.createEmptyBorder(10,10,0,6));
setBorder(BorderFactory.createEmptyBorder(3,4,0,4));
//setBorder(BorderFactory.createLineBorder(Color.red, 1));
//setBorder(null);
add(labelPanel,BorderLayout.NORTH);
add(new LWCInfoPanel(),BorderLayout.CENTER);
}
public String getName() {
String name = VueResources.getString("mapInfoTabName") ;
if( name == null) {
name = "Info";
}
return name;
}
/**
* updatePanel
* Updates the Map info panel
* @param LWMap the map
**/
public void updatePanel( LWComponent pComponent) {
mComponent = pComponent;
if (DEBUG.Enabled)
objectLabel.setText(mComponent.getUniqueComponentTypeLabel());
else
objectLabel.setText(mComponent.getComponentTypeLabel());
// To get the preview, the resource may have to do an initial
// load of the content, which may take a while, so we do this
// in a thread.
/// Remove Preview
/**
new Thread() {
public void run() {
JComponent preview = null;
if (mComponent.hasResource())
preview = mComponent.getResource().getPreview();
if (mPreview != preview) {
// the preview JComponent is diferrent: change display
if (mPreview != null)
previewPanel.remove(mPreview);
mPreview = preview;
if (mPreview != null)
previewPanel.add(mPreview, BorderLayout.CENTER);
// panel doesn't always update (probably threading issue)
// so we throw alot out and hope it sticks:
previewPanel.repaint();
validate();
repaint();
}
}
}.start();
*/
}
}
/**
* This is the Pathway Panel for the Map Inspector
*
**/
public class TreePanel extends JPanel {
/** the path scroll pane **/
JScrollPane mTreeScrollPane = null;
/** the tree to represented in the scroll pane **/
OutlineViewTree tree = null;
/** the header of the panel**/
//JLabel panelLabel = null;
/**
* TreePanel
* Constructs a pathway panel
**/
public TreePanel() {
setName("treePanel");
//fix the layout?
setLayout( new BorderLayout() );
setBorder( new EmptyBorder(4,4,4,4) );
tree = new OutlineViewTree();
tree.setBorder(new EmptyBorder(4,4,4,4));
//panelLabel = new JLabel();
mTreeScrollPane = new JScrollPane(tree);
mTreeScrollPane.setVerticalScrollBarPolicy( JScrollPane.VERTICAL_SCROLLBAR_ALWAYS);
mTreeScrollPane.setHorizontalScrollBarPolicy( JScrollPane.HORIZONTAL_SCROLLBAR_NEVER);
mTreeScrollPane.setLocation(new Point(8, 9));
mTreeScrollPane.setVisible(true);
//add(panelLabel, BorderLayout.NORTH);
add(mTreeScrollPane, BorderLayout.CENTER);
}
public String getName() {
String name = VueResources.getString("nodeTreeTabName") ;
if( name == null) {
name = "Tree";
}
return name;
}
/**
* updatePanel
* This updates the Panel display based on a new LWMap
*
**/
public void updatePanel( LWComponent pComponent) {
// update display based on the LWNode
//if the tree is not intiliazed, hidden, or doesn't contain the given node,
//then it switches the model of the tree using the given node
if (!tree.isInitialized() || !this.isVisible() || !tree.contains(pComponent)) {
//panelLabel.setText("Node: " + pNode.getLabel());
if(pComponent instanceof LWContainer)
tree.switchContainer((LWContainer)pComponent);
else if (pComponent instanceof LWLink)
tree.switchContainer(null);
}
//if the node is in the model and the panel is visible and intialized,
//then it sets the selected path to the one which ends with the given node
//else
//tree.setSelectionPath(pComponent);
}
public void updatePanel() {
tree.switchContainer(null);
}
}
public class NodeFilterPanel extends JPanel implements ActionListener{
NodeFilterEditor nodeFilterEditor = null;
public NodeFilterPanel() {
setName("nodeFilterPanel");
setLayout(new BorderLayout());
setBorder( BorderFactory.createEmptyBorder(10,10,10,6));
// todo in VUE to create map before adding panels or have a model that
// has selection loaded when map is added.
// nodeFilterEditor = new NodeFilterEditor(mNode.getNodeFilter(),true);
// add(nodeFilterEditor);
}
public void actionPerformed(ActionEvent e) {
}
public String getName() {
return "Custom Metadata"; // this should come from VueResources
}
public void updatePanel( LWComponent pComponent) {
// update the display
if (DEBUG.SELECTION) System.out.println("NodeFilterPanel.updatePanel: " + pComponent);
if(nodeFilterEditor!= null) {
nodeFilterEditor.setNodeFilter(pComponent.getNodeFilter());
}else {
if (VUE.getActiveMap() != null && pComponent.getNodeFilter() != null) {
// NodeFilter bombs entirely if no active map, so don't let
// it mess us up if there isn't one.
nodeFilterEditor = new NodeFilterEditor(pComponent.getNodeFilter(),true);
add(nodeFilterEditor,BorderLayout.CENTER);
}
}
validate();
}
}
/**
* setTab
* Sets the selected Tab for teh panel to the specifided ObjectInspector panel key
**/
public void setTab( int pTabKey) {
JComponent picked = null;
if (pTabKey == NOTES_TAB ) {
picked = mNotePanel;
} else if (pTabKey == INFO_TAB ) {
picked = mInfoPanel;
} else if (pTabKey == TREE_TAB ) {
picked = mTreePanel;
} else if(pTabKey == FILTER_TAB) {
picked = mNodeFilterPanel;
}
if (picked != null) {
if (WidgetStackImpl)
Widget.setExpanded(picked, true);
else
mTabbedPane.setSelectedComponent(picked);
}
Window w = javax.swing.SwingUtilities.getWindowAncestor(this);
if (w != null)
w.setVisible(true);
}
public static void main(String args[]) {
VUE.parseArgs(args);
VUE.initUI();
new Frame("A Frame").setVisible(true);
ObjectInspectorPanel p = new ObjectInspectorPanel();
//LWMap map = new LWMap("TestMap");
LWComponent node = new LWNode("Test Node");
node.setNotes("I am a note.");
node.setResource("file:///System/Library/Frameworks/JavaVM.framework/Versions/1.4.2/Home");
Resource r = node.getResource();
for (int i = 10; i < 31; i++)
r.setProperty("field_" + i, "value_" + i);
//map.addLWC(node);
tufts.vue.gui.DockWindow w = tufts.vue.gui.GUI.createDockWindow("Object Inspector");
w.setContent(p);
w.setVisible(true);
p.setLWComponent(node);
VUE.getSelection().setTo(node); // setLWComponent does diddly -- need this
}
}