Revision 40945

View differences:

trunk/org.gvsig.desktop/org.gvsig.desktop.plugin/org.gvsig.app/org.gvsig.app.mainplugin/src/main/java/org/gvsig/app/project/documents/view/toc/actions/CopyLayersTocMenuEntry.java
24 24
package org.gvsig.app.project.documents.view.toc.actions;
25 25

  
26 26
import java.awt.Component;
27
import java.util.ArrayList;
28
import java.util.List;
27 29

  
28 30
import javax.swing.JOptionPane;
29 31

  
......
34 36
import org.gvsig.app.project.documents.view.toc.AbstractTocContextMenuAction;
35 37
import org.gvsig.app.project.documents.view.toc.ITocItem;
36 38
import org.gvsig.fmap.mapcontext.layers.FLayer;
39
import org.gvsig.fmap.mapcontext.layers.FLayers;
37 40
import org.gvsig.i18n.Messages;
38 41
import org.gvsig.tools.persistence.PersistentState;
39 42

  
......
73 76
	}
74 77

  
75 78

  
76
	public void execute(ITocItem item, FLayer[] selectedItems) {
79
	public void execute(ITocItem item, FLayer[] selItems) {
77 80

  
78 81
	       PersistentState lyrs_state = null;
79 82
	        
80 83
	        try {
84
	            /*
85
	             * This prevents copying the same layer
86
	             * twice (because a parent is also copied)
87
	             */
88
	            FLayer[] tocopy = getLayersWithNoActiveAncestors(selItems);
89
	            
81 90
	            lyrs_state = CopyPasteLayersUtils.getAsFLayersPersistentState(
82
	                selectedItems, this.getMapContext());
91
	                tocopy, this.getMapContext());
83 92
	            /*
84 93
	             * Saving layers data to clipboard.
85 94
	             * Files and URLs are not relativized
......
107 116
	        }
108 117
	}
109 118

  
119
    private FLayer[] getLayersWithNoActiveAncestors(FLayer[] selItems) {
120
        
121
        List<FLayer> resp = new ArrayList<FLayer>();
122
        FLayer lyr = null;
123
        for (int i=0; i<selItems.length; i++) {
124
            lyr = selItems[i];
125
            if (!hasActiveAncestor(lyr)) {
126
                resp.add(lyr);
127
            }
128
        }
129
        return resp.toArray(new FLayer[0]);
130
    }
110 131

  
132
    private boolean hasActiveAncestor(FLayer lyr) {
133
        
134
        FLayers lyrs = lyr.getParentLayer();
135
        while (lyrs != null) {
136
            if (lyrs.isActive()) {
137
                return true;
138
            } else {
139
                if (lyrs == lyrs.getParentLayer()) {
140
                    /*
141
                     * Prevent endless loop due to bad setting
142
                     */
143
                    return false;
144
                } else {
145
                    lyrs = lyrs.getParentLayer();
146
                }
147
            }
148
        }
149
        return false;
150
    }
151

  
152

  
111 153
}

Also available in: Unified diff