Revision 40347
branches/v2_0_0_prep/applications/appgvSIG/src/org/gvsig/app/project/documents/view/legend/gui/LegendManager.java | ||
---|---|---|
75 | 75 |
import javax.swing.tree.DefaultMutableTreeNode; |
76 | 76 |
import javax.swing.tree.DefaultTreeCellRenderer; |
77 | 77 |
import javax.swing.tree.DefaultTreeModel; |
78 |
import javax.swing.tree.MutableTreeNode; |
|
78 | 79 |
import javax.swing.tree.TreePath; |
79 | 80 |
import javax.swing.tree.TreeSelectionModel; |
80 | 81 |
|
82 |
import org.slf4j.Logger; |
|
83 |
import org.slf4j.LoggerFactory; |
|
84 |
|
|
81 | 85 |
import org.gvsig.andami.PluginServices; |
82 | 86 |
import org.gvsig.andami.messages.NotificationManager; |
83 | 87 |
import org.gvsig.fmap.mapcontext.exceptions.LegendLayerException; |
... | ... | |
104 | 108 |
*/ |
105 | 109 |
public class LegendManager extends AbstractThemeManagerPage { |
106 | 110 |
|
111 |
private static final Logger logger = |
|
112 |
LoggerFactory.getLogger(LegendManager.class); |
|
113 |
|
|
107 | 114 |
private static final long serialVersionUID = 7989057553773181019L; |
108 | 115 |
private static ArrayList<Class<? extends ILegendPanel>> legendPool = |
109 | 116 |
new ArrayList<Class<? extends ILegendPanel>>(); |
... | ... | |
121 | 128 |
private JTree jTreeLegends; |
122 | 129 |
private ILegendPanel activePanel; |
123 | 130 |
private JScrollPane legendTreeScrollPane; |
124 |
private boolean dirtyTree; |
|
131 |
private boolean dirtyTree_;
|
|
125 | 132 |
private DefaultMutableTreeNode root = new DefaultMutableTreeNode(); |
126 | 133 |
private DefaultTreeModel treeModel; |
127 | 134 |
private JScrollPane jPanelContainer; |
... | ... | |
646 | 653 |
*/ |
647 | 654 |
private void fillDialog() { |
648 | 655 |
if (empty) { |
656 |
|
|
657 |
Class<?> pageClass = null; |
|
658 |
ILegendPanel page = null; |
|
659 |
|
|
649 | 660 |
for (int i = 0; i < legendPool.size(); i++) { |
650 |
Class<?> pageClass = (Class<?>) legendPool.get(i); |
|
651 |
ILegendPanel page; |
|
661 |
pageClass = (Class<?>) legendPool.get(i); |
|
652 | 662 |
try { |
653 | 663 |
page = (ILegendPanel) pageClass.newInstance(); |
654 |
if (page.isSuitableFor(layer)) { |
|
655 |
// this legend can be applied to this layer |
|
656 |
pages.put(page.getClass(), page); |
|
657 |
|
|
658 |
if (dirtyTree) { |
|
659 |
// rebuild page tree |
|
660 |
dirtyTree = false; |
|
661 |
|
|
662 |
ArrayList<ILegendPanel> legList = |
|
663 |
new ArrayList<ILegendPanel>(pages.values()); |
|
664 |
ArrayList<ILegendPanel> alreadyAdded = |
|
665 |
new ArrayList<ILegendPanel>(); |
|
666 |
DefaultTreeModel model = new DefaultTreeModel(root); |
|
667 |
while (legList.size() > 0) { |
|
668 |
ILegendPanel legend = |
|
669 |
(ILegendPanel) legList.get(0); |
|
670 |
Class<? extends ILegendPanel> parent = |
|
671 |
legend.getParentClass(); |
|
672 |
while (parent != null |
|
673 |
&& !alreadyAdded |
|
674 |
.contains(pages.get(parent))) { |
|
675 |
|
|
676 |
ILegendPanel par_legend = |
|
677 |
(ILegendPanel) pages.get(parent); |
|
678 |
|
|
679 |
if (par_legend != null) { |
|
680 |
doInsertNode(model, par_legend); |
|
681 |
alreadyAdded.add(par_legend); |
|
682 |
parent = par_legend.getParentClass(); |
|
683 |
} else { |
|
684 |
parent = null; |
|
685 |
} |
|
686 |
} |
|
687 |
|
|
688 |
doInsertNode(model, legend); |
|
689 |
legList.remove(legend); |
|
690 |
alreadyAdded.add(legend); |
|
691 |
} |
|
692 |
treeModel = model; |
|
693 |
jTreeLegends.setModel(model); |
|
694 |
} |
|
695 |
doInsertNode(treeModel, page); |
|
696 |
|
|
697 |
} |
|
698 |
getJTreeLegends().setModel(treeModel); |
|
699 |
|
|
700 |
} catch (InstantiationException e) { |
|
701 |
NotificationManager.addError( |
|
702 |
"Trying to instantiate an interface" |
|
703 |
+ " or abstract class + " + pageClass.getName(), e); |
|
704 |
} catch (IllegalAccessException e) { |
|
705 |
NotificationManager.addError( |
|
706 |
"IllegalAccessException: does " + pageClass.getName() |
|
707 |
+ " class have an anonymous" + " constructor?", e); |
|
664 |
} catch (Exception e) { |
|
665 |
logger.info("Unable to instantiate legend panel.", e); |
|
708 | 666 |
} |
667 |
if (page != null && page.isSuitableFor(layer)) { |
|
668 |
pages.put(page.getClass(), page); // this legend can be applied |
|
669 |
} |
|
670 |
} |
|
671 |
|
|
672 |
Enumeration<ILegendPanel> enume = pages.elements(); |
|
673 |
while (enume.hasMoreElements()) { |
|
674 |
page = enume.nextElement(); |
|
675 |
doInsertNode(treeModel, page); |
|
676 |
} |
|
709 | 677 |
|
710 |
}
|
|
678 |
getJTreeLegends().setModel(treeModel);
|
|
711 | 679 |
getJTreeLegends().repaint(); |
712 | 680 |
empty = false; |
713 | 681 |
} |
... | ... | |
743 | 711 |
return null; |
744 | 712 |
} |
745 | 713 |
|
746 |
private void doInsertNode(DefaultTreeModel treeModel, ILegendPanel page) { |
|
747 |
dirtyTree = |
|
748 |
((page.getParentClass() != null) && (findNode(page.getParentClass()) == null)); |
|
749 |
if (findNode(page.getClass()) != null) // It is already added |
|
750 |
return; |
|
751 |
if (page.getParentClass() != null) { |
|
752 |
if (pages.containsKey(page.getParentClass())) { |
|
753 |
ILegendPanel parent = |
|
754 |
(ILegendPanel) pages.get(page.getParentClass()); |
|
755 |
DefaultMutableTreeNode nodeParent = findNode(parent.getClass()); |
|
756 |
if (nodeParent == null) { |
|
757 |
// the parent is empty |
|
758 |
// Recursively add it |
|
759 |
doInsertNode(treeModel, parent); |
|
714 |
/** |
|
715 |
* If parent_node == null, add to root. |
|
716 |
* Returns added node |
|
717 |
* |
|
718 |
* @param tm |
|
719 |
* @param parent_node |
|
720 |
* @param item |
|
721 |
*/ |
|
722 |
private MutableTreeNode insertNodeHere( |
|
723 |
DefaultTreeModel tm, |
|
724 |
MutableTreeNode parent_node, |
|
725 |
ILegendPanel item) { |
|
726 |
|
|
727 |
MutableTreeNode pn = null; |
|
728 |
|
|
729 |
if (parent_node == null) { |
|
730 |
pn = root; |
|
731 |
} else { |
|
732 |
pn = parent_node; |
|
733 |
} |
|
734 |
|
|
735 |
DefaultMutableTreeNode nodeValue = new DefaultMutableTreeNode(item); |
|
736 |
int children = pn.getChildCount(); |
|
737 |
int pos = 0; |
|
738 |
String pTitle = null; |
|
739 |
|
|
740 |
for (int i = 0; i < children; i++) { |
|
741 |
DefaultMutableTreeNode node = |
|
742 |
(DefaultMutableTreeNode) tm.getChild(pn, i); |
|
743 |
if (node.getUserObject() instanceof ILegendPanel) { |
|
744 |
pTitle = ((ILegendPanel) node.getUserObject()).getTitle(); |
|
745 |
if (pTitle.compareTo(item.getTitle()) < 0) { |
|
746 |
pos++; |
|
747 |
} |
|
748 |
} |
|
749 |
} |
|
750 |
tm.insertNodeInto(nodeValue, pn, pos); |
|
751 |
return nodeValue; |
|
752 |
} |
|
753 |
|
|
754 |
/** |
|
755 |
* Returns inserted node |
|
756 |
* |
|
757 |
* @param tm |
|
758 |
* @param page |
|
759 |
* @return |
|
760 |
*/ |
|
761 |
private MutableTreeNode doInsertNode(DefaultTreeModel tm, ILegendPanel page) { |
|
762 |
|
|
763 |
if (tm == null || page == null) { |
|
764 |
return null; |
|
765 |
} |
|
766 |
|
|
767 |
MutableTreeNode aux = findNode(page.getClass()); |
|
768 |
if (aux != null) { |
|
769 |
return aux; |
|
770 |
} |
|
771 |
|
|
772 |
Class parent_class = page.getParentClass(); |
|
773 |
|
|
774 |
if (parent_class != null) { |
|
775 |
if (pages.containsKey(parent_class)) { |
|
776 |
ILegendPanel parent = (ILegendPanel) pages.get(parent_class); |
|
777 |
|
|
778 |
aux = doInsertNode(tm, parent); |
|
779 |
if (aux != null) { |
|
780 |
return insertNodeHere(tm, aux, page); |
|
760 | 781 |
} else { |
761 |
DefaultMutableTreeNode nodeValue = |
|
762 |
new DefaultMutableTreeNode(page); |
|
763 |
int children = nodeParent.getChildCount(); |
|
764 |
int pos = 0; |
|
765 |
for (int i = 0; i < children; i++) { |
|
766 |
DefaultMutableTreeNode node = |
|
767 |
(DefaultMutableTreeNode) treeModel.getChild( |
|
768 |
nodeParent, i); |
|
769 |
if (node.getUserObject() instanceof ILegendPanel) { |
|
770 |
String pageTitle = |
|
771 |
((ILegendPanel) node.getUserObject()) |
|
772 |
.getTitle(); |
|
773 |
if (pageTitle.compareTo(page.getTitle()) < 0) |
|
774 |
++pos; |
|
775 |
} |
|
776 |
} |
|
777 |
treeModel.insertNodeInto(nodeValue, nodeParent, pos); |
|
782 |
return null; |
|
778 | 783 |
} |
784 |
|
|
785 |
} else { |
|
786 |
return null; |
|
779 | 787 |
} |
780 | 788 |
} else { |
781 |
// First level node |
|
782 |
DefaultMutableTreeNode nodeValue = new DefaultMutableTreeNode(page); |
|
783 |
int children = root.getChildCount(); |
|
784 |
int pos = 0; |
|
785 |
for (int i = 0; i < children; i++) { |
|
786 |
DefaultMutableTreeNode node = |
|
787 |
(DefaultMutableTreeNode) treeModel.getChild(root, i); |
|
788 |
if (node.getUserObject() instanceof ILegendPanel) { |
|
789 |
String pageTitle = |
|
790 |
((ILegendPanel) node.getUserObject()).getTitle(); |
|
791 |
if (pageTitle.compareTo(page.getTitle()) < 0) |
|
792 |
++pos; |
|
793 |
} |
|
794 |
} |
|
795 |
treeModel.insertNodeInto(nodeValue, root, pos); |
|
789 |
// add to root |
|
790 |
return insertNodeHere(tm, null, page); |
|
796 | 791 |
} |
792 |
|
|
793 |
|
|
797 | 794 |
} |
795 |
|
|
796 |
|
|
797 |
|
|
798 |
|
|
798 | 799 |
|
799 | 800 |
private JScrollPane getTitleScroll() { |
800 | 801 |
if (jTitleScrollPane == null) { |
Also available in: Unified diff