blob: 70a99b3d8f606ecec59aa49ea5aa46054f0de3e2 [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.netbeans.modules.xml.multiview.ui;
import java.awt.event.MouseEvent;
import java.beans.*;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.swing.JPopupMenu;
import org.openide.awt.MouseUtils;
import org.openide.explorer.ExplorerManager;
import org.openide.nodes.Node;
/**
* The component that will display a panel corresponding to the node selection of its parent ExplorerManager, usually a
* ContentPanel. It provides the mapping between selected nodes and displayed panels. A parent ContentPanel will get a node hierarchy
* by calling getRoot and display that tree in it's structure view. The PanelView will then show an appropriate panel
* based on the node selection. Subclasses should, at a bare minimum, initialize the root node and override the showSelection method.
* Created on October 29, 2002, 12:24 PM
* @author B.Ashby, M.Kuchtiak
*/
public abstract class PanelView extends javax.swing.JPanel {
private static final Logger LOGGER = Logger.getLogger(PanelView.class.getName());
private Node root;
/** not null if popup menu enabled */
transient boolean sectionHeaderClicked;
transient PopupAdapter popupListener;
/** the most important listener */
//transient NodeSelectedListener nodeListener = null;
/** Explorer manager, valid when this view is showing */
private transient ExplorerManager manager;
/** weak variation of the listener for property change on the explorer manager */
transient PropertyChangeListener wlpc;
/** weak variation of the listener for vetoable change on the explorer manager */
transient VetoableChangeListener wlvc;
/** ResourceBundle for ejb package. */
transient ErrorPanel errorPanel;
public PanelView() {
initComponents();
}
public void initComponents () {
}
void attachErrorPanel(ErrorPanel errorPanel) {
this.errorPanel=errorPanel;
}
public ErrorPanel getErrorPanel() {
return errorPanel;
}
protected abstract org.netbeans.modules.xml.multiview.Error validateView();
public final void checkValidity() {
org.netbeans.modules.xml.multiview.Error error = validateView();
if (error!=null) {
errorPanel.setError(error);
} else {
errorPanel.clearError();
}
}
/**
* Gets the current root Node.
* @return the Node.
*/
public Node getRoot() {
return root;
}
public void setRoot(Node r){
root = r;
}
public void setSectionHeaderClicked(boolean value) {
sectionHeaderClicked=value;
}
public boolean isSectionHeaderClicked() {
return sectionHeaderClicked;
}
/** Called when the view wishes to reuse the context menu from the root node
* as its own context menu
* @param value true to set the context menu, false otherwise
*/
public void setPopupAllowed(boolean value) {
if (popupListener == null && value) {
// on
popupListener = new PopupAdapter();
addMouseListener(popupListener);
return;
}
if (popupListener != null && !value) {
// off
removeMouseListener(popupListener);
popupListener = null;
return;
}
}
/** Popup adapter.
*/
private class PopupAdapter extends MouseUtils.PopupMouseAdapter {
PopupAdapter() {
}
protected void showPopup(MouseEvent e) {
JPopupMenu popup = getRoot().getContextMenu();
popup.show(PanelView.this,e.getX(), e.getY());
}
}
/** Called when explorer manager has changed the current selection.
* The view should display the panel corresponding to the selected nodes
* @param nodes the nodes used to update the view
*/
public abstract void showSelection(Node[] nodes) ;
/** The view can change the explorer manager's current selection.
* @param value the new node to explore
* @param nodes the nodes to select
* @return false if the explorer manager is not able to change the selection
*/
public boolean setManagerExploredContextAndSelection(Node value, Node[] nodes) {
try{
getExplorerManager().setExploredContextAndSelection(value, nodes);
}
catch (PropertyVetoException e) {
return false;
}
return true;
}
/** The view can change the explorer manager's current selection.
* @param nodes the nodes to select
* @return false if the explorer manager is not able to change the selection
*/
public boolean setManagerSelection(Node[] nodes) {
try{
getExplorerManager().setSelectedNodes(nodes);
} catch (PropertyVetoException e) {
return false;
} catch (IllegalArgumentException iae) {
// see #140613
LOGGER.log(Level.WARNING, "Failed to select the given nodes.", iae);
return false;
}
return true;
}
/** Called when explorer manager is about to change the current selection.
* The view can forbid the change if it is not able to display such
* selection.
* @param nodes the nodes to select
* @return false if the view is not able to change the selection
*/
protected boolean selectionAccept(Node[] nodes) {
return true;
}
/**
* A parent ComponentPanel uses this method to notify its PanelView children that it was opened
* and lets them do any needed initialization as a result. Default implementation does nothing.
*/
public void open(){
}
/**
* A parent ComponentPanel uses this method to notify its PanelView children it is about to close.
* and lets them determine if they are ready. Default implementation just returns true.
* @return boolean True if the PanelView is ready to close, false otherwise.
*/
public boolean canClose(){
return true;
}
/* Initializes the component.
* We need to register for ExplorerManager events here
*/
public void addNotify() {
super.addNotify();
// Enter key in the tree
/*
ExplorerManager newManager = ExplorerManager.find(this);
System.out.println("newManager="+newManager);
if (newManager != manager) {
if (manager != null) {
manager.removeVetoableChangeListener(wlvc);
manager.removePropertyChangeListener(wlpc);
}
manager = newManager;
manager.addVetoableChangeListener(wlvc = WeakListeners.vetoableChange(nodeListener, manager));
manager.addPropertyChangeListener(wlpc = WeakListeners.propertyChange(nodeListener, manager));
//manager.addPropertyChangeListener(nodeListener);
}
*/
}
/**
* Gets the current ExplorerManager the view is attached.
* @return the ExplorerManager.
*/
public ExplorerManager getExplorerManager() {
return ExplorerManager.find(this);
//return manager;
}
/*
class NodeSelectedListener implements VetoableChangeListener,PropertyChangeListener {
public void vetoableChange(PropertyChangeEvent evt) throws PropertyVetoException {
if (evt.getPropertyName().equals(ExplorerManager.PROP_SELECTED_NODES)) {
if (!selectionAccept((Node[])evt.getNewValue())) {
throw new PropertyVetoException("", evt); // NOI18N
}
}
}
public void propertyChange(PropertyChangeEvent evt) {
System.out.println("propName = "+evt.getPropertyName()+":"+ExplorerManager.PROP_SELECTED_NODES);
if (!ExplorerManager.PROP_SELECTED_NODES.equals(evt.getPropertyName()))
return;
Node[] selectedNodes = getExplorerManager().getSelectedNodes();
showSelection(selectedNodes);
}
}
*/
}