Revision 40347

View differences:

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