/* * Copyright (c) 2002 Felix Golubov */ // Decompiled by Jad v1.5.8g. Copyright 2001 Pavel Kouznetsov. // Jad home page: http://www.kpdus.com/jad.html // Decompiler options: packimports(3) // Source File Name: FXBasicView.java package com.fg.xmleditor; import com.fg.ftree.*; import com.fg.ftreenodes.*; import com.fg.util.FLoader; import java.awt.*; import java.awt.event.*; import java.util.Vector; import javax.swing.*; import org.apache.xerces.impl.xs.psvi.XSParticle; /* * @author Felix Golubov * @version 1.0 Fix to get a different FTree implementation */ // Referenced classes of package com.fg.xmleditor: // FXModelStatusListener, FXModel, FXDocumentModelImpl, FXStatusEvent, // FXViewStatusListener, XSRef, NSQualifiersDialog, SearchDialog public class FXBasicView extends JComponent implements FXModelStatusListener { class InnerListener implements FTreeExpansionListener, FTreeExpansBarListener, FTreeEditorListener, FTreeActionListener, FTreeSelectionListener, MouseListener { boolean isSelectedNodeShowingChanged(FTreeNodeEvent expansionEvent) { FToggleNode selNode = (FToggleNode) tree.getSelectedNode(); if (selNode == null) return false; FToggleNode node = (FToggleNode) expansionEvent.getTreeNode(); FToggleNode curr; for (curr = (FToggleNode) selNode.getParent(); curr != node && curr != null; curr = (FToggleNode) curr .getParent()) if (!tree.isNodeExpanded(curr)) return false; return curr != null; } void selectedNodeShown() { FToggleNode node = (FToggleNode) tree.getSelectedNode(); if (node == null) return; FToggleNode parent = (FToggleNode) node.getParent(); if (parent != null) setEditorFlags(parent, node); node = (FToggleNode) node.getSubstituteNode(); if (node == null) return; nodesInfoArea.setText(model.getNodeMessage(node)); if (FXBasicView.hasValue(node)) { String errMessage = model.getValidityMessage(node, node.getValue()); if (errMessage != null) errorInfoArea.setText("Error: " + errMessage); else errorInfoArea.setText("OK"); } else { errorInfoArea.setText(""); } } void selectedNodeHidden() { clearEditorFlags(); nodesInfoArea.setText(""); errorInfoArea.setText(""); } public void nodeWillExpand(FTreeNodeEvent e) { FToggleNode node = (FToggleNode) e.getTreeNode(); node = (FToggleNode) node.getSubstituteNode(); if (node != null && model.populateNode(node)) { Object selPath[] = tree.getSelectedPath(); model.fireTreeModelDataChanged(true); tree.setSelectedPath(selPath); } } public void nodeWillCollapse(FTreeNodeEvent ftreenodeevent) { } public void nodeExpanded(FTreeNodeEvent e) { if (isSelectedNodeShowingChanged(e)) selectedNodeShown(); } public void nodeCollapsed(FTreeNodeEvent e) { if (isSelectedNodeShowingChanged(e)) selectedNodeHidden(); } public void enteredExpansBar(FTreeNodeEvent e) { FToggleNode node = (FToggleNode) e.getTreeNode(); FToggleNode parent = (FToggleNode) node.getParent(); String text = " Folder: "; if (parent != null) { XSRef ref = (XSRef) parent.getAssociate(); if (ref.isArray()) text = " Folder: #" + (parent.getIndex(node) + 1) + " "; } text = text + node.getLabelText(); FAbstractToggleNode subNode = node.getSubstituteNode(); if (subNode != null && subNode != node) text = text + " " + subNode.getLabelText(); if (node.getValue() != null) text = text + " " + node.getValue().toString(); mouseInfo.setText(text); mouseInfo.setCaretPosition(0); } public void exitedExpansBar(FTreeNodeEvent e) { mouseInfo.setText(" Folder:"); } boolean equal(Object a, Object b) { return a == null && b == null || a != null && a.equals(b); } public void cellEditingStarted(FTreeEditorEvent ftreeeditorevent) { } public void cellEditingWillStop(FTreeEditorEvent e) { if (e.isCanceled()) return; FToggleNode node = (FToggleNode) e.getTreeNode(); node = (FToggleNode) node.getSubstituteNode(); if (node == null || !FXBasicView.hasValue(node) || !node.isEditable()) return; JComponent editor = e.getEditor(); if (editor == null) return; JComponent extraControl = ((FToggleControl) editor).getExtraControl(); if (extraControl instanceof ICellControl) { Object newValue = ((ICellControl) extraControl).getData(); Object oldValue = node.getValue(); if (!equal(oldValue, newValue)) model.setNodeValue(node, newValue); } } public void cellEditingStopped(FTreeEditorEvent e) { if (e.isCanceled()) selectedNodeShown(); } public void cellEditorValueChanged(FTreeEditorEvent e) { FToggleNode node = (FToggleNode) e.getTreeNode(); node = (FToggleNode) node.getSubstituteNode(); if (node == null) return; Object editor = e.getEditor(); if (!(editor instanceof ICellControl)) return; Object obj = ((ICellControl) editor).getData(); String editorValue = obj != null ? obj.toString() : ""; String errMessage = model.getValidityMessage(node, editorValue); if (errMessage != null) errorInfoArea.setText("Error: " + errMessage); else errorInfoArea.setText("OK"); } public void treeActionPerformed(FTreeActionEvent e) { if (e.containsAction(1)) { FToggleNode node = (FToggleNode) e.getTreeNode(); model.toggleSelectionChanged(node); } } public void nodeSelected(FTreeNodeEvent e) { selectedNodeShown(); } public void nodeUnselected(FTreeNodeEvent e) { selectedNodeHidden(); } void showPopup(MouseEvent e) { if (!e.isPopupTrigger()) { return; } else { treeNode = (FToggleNode) tree.getNodeAt(e.getX(), e.getY()); boolean b = treeNode != null && treeNode == tree.getSelectedNode(); mSelect.setEnabled(treeNode != null && treeNode != tree.getSelectedNode() && treeNode.isToggleSelected() && treeNode.isPathSelected()); mUnselect.setEnabled(b); mInsBefore.setEnabled(b && canInsert()); mInsAfter.setEnabled(b && canInsert()); mRemove.setEnabled(b && canRemove()); mMoveUp.setEnabled(b && canMoveUp()); mMoveDown.setEnabled(b && canMoveDown()); mNS.setEnabled(hasDocument()); mFindInvalid.setEnabled(hasDocument() && !isDocValid()); mFindNode.setEnabled(hasDocument()); popup.show(tree, e.getX(), e.getY()); return; } } public void mousePressed(MouseEvent e) { showPopup(e); } public void mouseClicked(MouseEvent mouseevent) { } public void mouseReleased(MouseEvent e) { showPopup(e); } public void mouseEntered(MouseEvent mouseevent) { } public void mouseExited(MouseEvent mouseevent) { } FToggleNode treeNode; InnerListener() { treeNode = null; } } public FXBasicView(FXModel model) { this.model = null; viewListeners = new Vector(); innerListener = new InnerListener(); _insert = false; _remove = false; _moveUp = false; _moveDown = false; popup = new JPopupMenu(); mSelect = new JMenuItem("Select Node"); mUnselect = new JMenuItem("Unselect Node"); mInsBefore = new JMenuItem("Insert Node Before"); mInsAfter = new JMenuItem("Insert Node After"); mRemove = new JMenuItem("Remove Node"); mMoveUp = new JMenuItem("Move Node Up"); mMoveDown = new JMenuItem("Move Node Down"); mFindInvalid = new JMenuItem("Find Invalid Node"); mFindNode = new JMenuItem("Find Node"); mNS = new JMenuItem("Edit NS Qualifiers"); searchDialog = null; setLayout(new BorderLayout()); JSplitPane mainSplitPane = new JSplitPane(0); mainSplitPane.setResizeWeight(0.80000000000000004D); mainSplitPane.setDividerSize(8); mainSplitPane.setDoubleBuffered(false); add(mainSplitPane, "Center"); JScrollPane sp = new JScrollPane(); tree = new GgFTree(); setFXModel(model); Insets insets = tree.getInsets(); insets.top = 20; tree.setInsets(insets); sp.getViewport().add(tree, null); mainSplitPane.add(sp, "left"); JPanel infoPanel = new JPanel(new BorderLayout()); JSplitPane infoSplitPane = new JSplitPane(1); infoSplitPane.setResizeWeight(0.5D); infoSplitPane.setDividerSize(8); JScrollPane nodesInfoAreaSP = new JScrollPane(); nodesInfoAreaSP.setHorizontalScrollBarPolicy(31); nodesInfoArea = new JTextArea(); nodesInfoArea.setLineWrap(true); nodesInfoArea.setWrapStyleWord(true); nodesInfoArea.setEditable(false); nodesInfoAreaSP.getViewport().add(nodesInfoArea, null); infoSplitPane.add(nodesInfoAreaSP, "left"); JScrollPane errorInfoAreaSP = new JScrollPane(); errorInfoAreaSP.setHorizontalScrollBarPolicy(31); errorInfoArea = new JTextArea(); errorInfoArea.setLineWrap(true); errorInfoArea.setWrapStyleWord(true); errorInfoArea.setEditable(false); errorInfoAreaSP.getViewport().add(errorInfoArea, null); infoSplitPane.add(errorInfoAreaSP, "right"); infoPanel.add(infoSplitPane, "Center"); mouseInfo = new JTextField(" Folder:"); mouseInfo.setEditable(false); mouseInfo.setBorder(BorderFactory.createLineBorder(Color.gray)); infoPanel.add(mouseInfo, "South"); mainSplitPane.add(infoPanel, "right"); setBackground(new Color(230, 230, 230)); tree.setCellsLeftInset(5); tree.addFTreeExpansionListener(innerListener); tree.addFTreeExpansBarListener(innerListener); tree.addFTreeEditorListener(innerListener); tree.addFTreeActionListener(innerListener); tree.addFTreeSelectionListener(innerListener); tree.addMouseListener(innerListener); createPopupMenu(); } public FXBasicView() { this(null); } public void setFXModel(FXModel newModel) { if (model != null) model.removeModelStatusListener(this); if (newModel == null) newModel = new FXDocumentModelImpl(); model = newModel; model.addModelStatusListener(this); tree.setTreeModel(model); } public void newDocumentLoaded(FXStatusEvent e) { if (e.getStatus()) tree.setNodeExpanded(model.getRoot(), true); clearEditorFlags(); nodesInfoArea.setText(""); } public void docValidityStatusChanged(FXStatusEvent fxstatusevent) { } public FXModel getFXModel() { return model; } public FTree getTree() { return tree; } public void updateUI() { super.updateUI(); SwingUtilities.updateComponentTreeUI(popup); if (searchDialog != null) SwingUtilities.updateComponentTreeUI(searchDialog); } void createPopupMenu() { mSelect.setIcon(FLoader.getIcon(this, "SelectNode.gif")); mSelect.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { FToggleNode node = innerListener.treeNode; if (innerListener.treeNode != null) tree.setSelectedPath(innerListener.treeNode.getPath()); } } ); popup.add(mSelect); mUnselect.setIcon(FLoader.getIcon(this, "UnselectNode.gif")); mUnselect.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { tree.setSelectedPath(null); } } ); popup.add(mUnselect); popup.addSeparator(); mInsBefore.setIcon(FLoader.getIcon(this, "InsNodeBefore.gif")); mInsBefore.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { insertNodeBefore(); } } ); popup.add(mInsBefore); mInsAfter.setIcon(FLoader.getIcon(this, "InsNodeAfter.gif")); mInsAfter.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { insertNodeAfter(); } } ); popup.add(mInsAfter); popup.addSeparator(); mRemove.setIcon(FLoader.getIcon(this, "RemoveNode.gif")); mRemove.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { removeNode(); } } ); popup.add(mRemove); popup.addSeparator(); mMoveUp.setIcon(FLoader.getIcon(this, "MoveNodeUp.gif")); mMoveUp.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { moveNodeUp(); } } ); popup.add(mMoveUp); mMoveDown.setIcon(FLoader.getIcon(this, "MoveNodeDown.gif")); mMoveDown.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { moveNodeDown(); } } ); popup.add(mMoveDown); popup.addSeparator(); mNS.setIcon(FLoader.getIcon(this, "NSQualifiers.gif")); mNS.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { showNSQualifiersDialog(); } } ); popup.add(mNS); popup.addSeparator(); mFindInvalid.setIcon(FLoader.getIcon(this, "FindInvalidNode.gif")); mFindInvalid.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { showInvalidNode(); } } ); popup.add(mFindInvalid); mFindNode.setIcon(FLoader.getIcon(this, "FindNode.gif")); mFindNode.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { showSearchDialog(); } } ); popup.add(mFindNode); } public void addExternalDialog(String id, JDialog dialog) { tree.addDialog(id, dialog); } public void removeExternalDialog(String id) { tree.removeDialog(id); } public void removeAllExternalDialogs() { tree.removeAllDialogs(); } public void setBackground(Color color) { super.setBackground(color); if (tree != null) { tree.setBackground(color); if (tree.isShowing()) tree.repaint(); } } public boolean isReducedView() { return tree.isReducedView(); } public void setReducedView(boolean reduced) { tree.setReducedView(reduced); FToggleNode node = (FToggleNode) tree.getSelectedNode(); if (node == null) return; FToggleNode parent = (FToggleNode) node.getParent(); if (parent == null) { return; } else { setEditorFlags(parent, node); return; } } public boolean stopEditing() { return tree.stopEditing(); } public boolean cancelEditing() { return tree.cancelEditing(); } public static void stopCellEditing(JComponent editor) { FTree.stopCellEditing(editor); } public static void cancelCellEditing(JComponent editor) { FTree.cancelCellEditing(editor); } public static void cellEditorValueChanged(JComponent editor, Object event) { FTree.cellEditorValueChanged(editor, event); } public void showInfoMessage(String message) { nodesInfoArea.setText(message); } public void showErrorMessage(String message) { errorInfoArea.setText(message); } public void addViewStatusListener(FXViewStatusListener l) { if (!viewListeners.contains(l)) viewListeners.addElement(l); } public void removeViewStatusListener(FXViewStatusListener l) { viewListeners.removeElement(l); } public boolean hasDocument() { return model.getRoot() != null; } public boolean isDocChanged() { return model.isDocumentChanged(); } public boolean isDocValid() { return model.isDocumentValid(); } public boolean canInsert() { return _insert; } public boolean canRemove() { return _remove; } public boolean canMoveUp() { return _moveUp; } public boolean canMoveDown() { return _moveDown; } void setInsert(boolean insert) { if (insert == _insert) return; _insert = insert; FXStatusEvent e = new FXStatusEvent(this, _insert); for (int i = 0; i < viewListeners.size(); i++) { FXViewStatusListener fxl = (FXViewStatusListener) viewListeners.get(i); fxl.canInsertStatusChanged(e); } } void setRemove(boolean remove) { if (remove == _remove) return; _remove = remove; FXStatusEvent e = new FXStatusEvent(this, _remove); for (int i = 0; i < viewListeners.size(); i++) { FXViewStatusListener fxl = (FXViewStatusListener) viewListeners.get(i); fxl.canRemoveStatusChanged(e); } } void setMoveUp(boolean moveUp) { if (moveUp == _moveUp) return; _moveUp = moveUp; FXStatusEvent e = new FXStatusEvent(this, _moveUp); for (int i = 0; i < viewListeners.size(); i++) { FXViewStatusListener fxl = (FXViewStatusListener) viewListeners.get(i); fxl.canMoveUpStatusChanged(e); } } void setMoveDown(boolean moveDown) { if (moveDown == _moveDown) return; _moveDown = moveDown; FXStatusEvent e = new FXStatusEvent(this, _moveDown); for (int i = 0; i < viewListeners.size(); i++) { FXViewStatusListener fxl = (FXViewStatusListener) viewListeners.get(i); fxl.canMoveDownStatusChanged(e); } } void clearEditorFlags() { setInsert(false); setRemove(false); setMoveUp(false); setMoveDown(false); } void setEditorFlags(FToggleNode parent, FToggleNode node) { int count = parent.getRealChildCount(); XSRef ref = (XSRef) parent.getAssociate(); boolean b = !tree.isReducedView(); if (ref.isArray()) { XSParticle particle = ref.getParticle(); int minOccurs = Math.max(particle.getMinOccurs(), 1); int maxOccurs = particle.getMaxOccursUnbounded() ? 0x7fffffff : particle.getMaxOccurs(); setInsert(b && count < maxOccurs); setRemove(b && count > minOccurs); setMoveUp(b && node != parent.getRealChildAt(0)); setMoveDown(b && node != parent.getRealChildAt(count - 1)); } else if (ref.in(16)) { setMoveUp(b && node != parent.getRealChildAt(0)); setMoveDown(b && node != parent.getRealChildAt(count - 1)); } } public void insertNodeBefore() { if (!canInsert()) return; FToggleNode node = (FToggleNode) tree.getSelectedNode(); if (node == null) return; FToggleNode parent = (FToggleNode) node.getParent(); if (parent == null) return; int index = parent.getIndex(node); if (model.insertInstance(parent, index) != null) { tree.setSelectedPath(node.getPath()); setEditorFlags(parent, node); } } public void insertNodeAfter() { if (!canInsert()) return; FToggleNode node = (FToggleNode) tree.getSelectedNode(); if (node == null) return; FToggleNode parent = (FToggleNode) node.getParent(); if (parent == null) return; int index = parent.getIndex(node); if (model.insertInstance(parent, index + 1) != null) { tree.setSelectedPath(node.getPath()); setEditorFlags(parent, node); } } public void removeNode() { if (!canRemove()) return; FToggleNode node = (FToggleNode) tree.getSelectedNode(); if (node == null) return; FToggleNode parent = (FToggleNode) node.getParent(); if (parent == null) return; int index = model.removeInstance(node); if (index < 0) return; if (index >= parent.getRealChildCount()) node = (FToggleNode) parent.getRealChildAt(index - 1); else node = (FToggleNode) parent.getRealChildAt(index); tree.setSelectedPath(node.getPath()); setEditorFlags(parent, node); } public void moveNodeUp() { if (!canMoveUp()) return; FToggleNode node = (FToggleNode) tree.getSelectedNode(); if (node == null) return; FToggleNode parent = (FToggleNode) node.getParent(); if (parent == null) { return; } else { int index = parent.getIndex(node); parent.remove(index); parent.insert(node, index - 1); model.fireTreeModelDataChanged(true); tree.setSelectedPath(node.getPath()); setEditorFlags(parent, node); return; } } public void moveNodeDown() { if (!canMoveDown()) return; FToggleNode node = (FToggleNode) tree.getSelectedNode(); if (node == null) return; FToggleNode parent = (FToggleNode) node.getParent(); if (parent == null) { return; } else { int index = parent.getIndex(node); parent.remove(index); parent.insert(node, index + 1); model.fireTreeModelDataChanged(true); tree.setSelectedPath(node.getPath()); setEditorFlags(parent, node); return; } } void setDialogLocation(JDialog dlg) { Dimension scrSize = Toolkit.getDefaultToolkit().getScreenSize(); Dimension size = getSize(); Dimension dlgSize = dlg.getSize(); int x = getLocationOnScreen().x + (size.width - dlgSize.width) / 2; if (x < 0) x = 0; if (x + dlgSize.width > scrSize.width) x = scrSize.width - dlgSize.width; int y = getLocationOnScreen().y + (size.height - dlgSize.height) / 2; if (y < 0) y = 0; if (y + dlgSize.height > scrSize.height) y = scrSize.height - dlgSize.height; dlg.setLocation(x, y); } public void showNSQualifiersDialog() { Frame frame = (Frame) SwingUtilities.getAncestorOfClass(java.awt.Frame.class, this); NSQualifiersDialog dlg = new NSQualifiersDialog(frame, model); setDialogLocation(dlg); dlg.setVisible(true); } int[] createPath(FBasicNode treeNode) { Vector v = new Vector(); for (FBasicNode node = treeNode; node != null; node = (FBasicNode) node.getParent()) v.add(0, node); int path[] = new int[v.size()]; FBasicNode parent = (FBasicNode) v.get(0); for (int i = 1; i < v.size(); i++) { FBasicNode child = (FBasicNode) v.get(i); path[i - 1] = parent.getIndex(child); parent = child; } path[path.length - 1] = 0; return path; } FToggleNode getInvalidNode(FToggleNode parent, int startPath[], int level) { int startIndex = startPath[level]; FToggleNode node = null; for (int i = startIndex; i < parent.getRealChildCount(); i++) { FToggleNode child = (FToggleNode) parent.getRealChildAt(i); if (child.isToggleSelected() && (!child.getChildrenValidity() || !child.getNodeValidity())) { if (i == startIndex && level + 1 < startPath.length) node = getInvalidNode(child, startPath, level + 1); else node = getInvalidNode(child); if (node != null) return node; } } return null; } FToggleNode getInvalidNode(FToggleNode parent) { if (!parent.getNodeValidity()) return parent; FToggleNode node = null; for (int i = 0; i < parent.getRealChildCount(); i++) { FToggleNode child = (FToggleNode) parent.getRealChildAt(i); if (child.isToggleSelected() && (!child.getChildrenValidity() || !child.getNodeValidity())) return getInvalidNode(child); } return parent; } public void showInvalidNode() { if (!hasDocument() || isDocValid()) return; FToggleNode node = null; FToggleNode rootNode = (FToggleNode) tree.getRoot(); FToggleNode startNode = (FToggleNode) tree.getSelectedNode(); if (startNode != null) startNode = (FToggleNode) startNode.getSubstituteNode(); if (startNode != null) { int startPath[] = createPath(startNode); node = getInvalidNode(rootNode, startPath, 0); } if (node == null) node = getInvalidNode(rootNode); if (node != null) { if (node.getParent() instanceof FToggleSwitchNode) node = (FToggleNode) node.getParent(); Object path[] = node.getPath(); tree.makeVisible(path); tree.setSelectedPath(path); } } public void showSearchDialog() { if (searchDialog == null) { Frame frame = (Frame) SwingUtilities.getAncestorOfClass(java.awt.Frame.class, this); searchDialog = new SearchDialog(frame, this); searchDialog.pack(); setDialogLocation(searchDialog); } searchDialog.setVisible(true); } static boolean hasValue(FToggleNode node) { XSRef ref = (XSRef) node.getAssociate(); return ref.hasValue(); } FXModel model; FTree tree; JTextField mouseInfo; JTextArea errorInfoArea; JTextArea nodesInfoArea; Vector viewListeners; InnerListener innerListener; boolean _insert; boolean _remove; boolean _moveUp; boolean _moveDown; JPopupMenu popup; JMenuItem mSelect; JMenuItem mUnselect; JMenuItem mInsBefore; JMenuItem mInsAfter; JMenuItem mRemove; JMenuItem mMoveUp; JMenuItem mMoveDown; JMenuItem mFindInvalid; JMenuItem mFindNode; JMenuItem mNS; SearchDialog searchDialog; }