/*
* Created on 16.03.2005 for PIROL
*
* CVS header information:
* $RCSfile: SetCategoryVisibilityPlugIn.java,v $
* $Revision: 1.6 $
* $Date: 2005/11/22 16:44:42 $
* $Source: D:/CVS/cvsrepo/pirolPlugIns/plugIns/CategoryTools/SetCategoryVisibilityPlugIn.java,v $
*/
package org.openjump.core.ui.plugin.mousemenu.category;
import java.util.Collection;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import javax.swing.Icon;
import javax.swing.ImageIcon;
import javax.swing.JCheckBoxMenuItem;
import javax.swing.JPopupMenu;
import javax.swing.MenuElement;
import org.apache.log4j.Logger;
import org.openjump.core.apitools.PlugInContextTools;
import de.fho.jump.pirol.plugins.EditAttributeByFormula.EditAttributeByFormulaPlugIn;
import de.fho.jump.pirol.utilities.debugOutput.DebugUserIds;
import de.fho.jump.pirol.utilities.debugOutput.PersonalLogger;
import de.fho.jump.pirol.utilities.plugIns.StandardPirolPlugIn;
import com.vividsolutions.jump.I18N;
import com.vividsolutions.jump.workbench.WorkbenchContext;
import com.vividsolutions.jump.workbench.model.Category;
import com.vividsolutions.jump.workbench.model.Layerable;
import com.vividsolutions.jump.workbench.plugin.AbstractPlugIn;
import com.vividsolutions.jump.workbench.plugin.EnableCheckFactory;
import com.vividsolutions.jump.workbench.plugin.MultiEnableCheck;
import com.vividsolutions.jump.workbench.plugin.PlugInContext;
import com.vividsolutions.jump.workbench.ui.GUIUtil;
import com.vividsolutions.jump.workbench.ui.LayerNamePanelListener;
import com.vividsolutions.jump.workbench.ui.plugin.FeatureInstaller;
/**
* @author Ole Rahn
*
* FH Osnabrück - University of Applied Sciences Osnabrück
* Project PIROL 2005
* Daten- und Wissensmanagement
*
*/
public class SetCategoryVisibilityPlugIn extends AbstractPlugIn implements LayerNamePanelListener {
protected Map cathegory2Visibility = new HashMap();
protected Map layer2Visibility = new HashMap();
protected PlugInContext context = null;
protected JCheckBoxMenuItem menuItem = null;
protected static SetCategoryVisibilityPlugIn instance= null;
private static final Logger LOG = Logger.getLogger(SetCategoryVisibilityPlugIn.class);
/**
* Constructor needed to load PlugIn from classes, should NOT be used by any other
* code --> use getInstance() method instead!!
*/
public SetCategoryVisibilityPlugIn(){
SetCategoryVisibilityPlugIn.instance = this;
}
public static SetCategoryVisibilityPlugIn getInstance(PlugInContext context){
if (SetCategoryVisibilityPlugIn.instance == null){
SetCategoryVisibilityPlugIn.instance = new SetCategoryVisibilityPlugIn();
SetCategoryVisibilityPlugIn.instance.context = context;
}
return SetCategoryVisibilityPlugIn.instance;
}
public String getName(){
return I18N.get("org.openjump.core.ui.plugin.mousemenu.category.SetCategoryVisibilityPlugIn.Set-Category-Visibility");
}
public void initialize(PlugInContext context) throws Exception {
/* add to pirol menu */
//super.initialize(context);
/* add to right-click menu */
this.context = context;
JPopupMenu layerNamePopupMenu = context.getWorkbenchContext().getWorkbench().getFrame().getCategoryPopupMenu();
FeatureInstaller featInst = context.getFeatureInstaller();
featInst.addPopupMenuItem(layerNamePopupMenu,
this, this.getName() + "...", true,
GUIUtil.toSmallIcon((ImageIcon) this.getIcon()),
SetCategoryVisibilityPlugIn.createEnableCheck(context.getWorkbenchContext()));
MenuElement[] elements = layerNamePopupMenu.getSubElements();
for (int i=0; i<elements.length; i++){
if ( JCheckBoxMenuItem.class.isInstance(elements[i]) ){
if ( ((JCheckBoxMenuItem)elements[i]).getText().startsWith(this.getName()) ){
((JCheckBoxMenuItem)elements[i]).setSelected(true);
this.menuItem = (JCheckBoxMenuItem)elements[i];
}
}
}
// context.getLayerNamePanel().addListener(this);
}
public static MultiEnableCheck createEnableCheck(final WorkbenchContext workbenchContext) {
EnableCheckFactory checkFactory = new EnableCheckFactory(workbenchContext);
MultiEnableCheck multiEnableCheck = new MultiEnableCheck();
multiEnableCheck.add( checkFactory.createAtLeastNLayersMustExistCheck(1) );
multiEnableCheck.add( checkFactory.createAtLeastNCategoriesMustBeSelectedCheck(1) );
multiEnableCheck.add( checkFactory.createExactlyNCategoriesMustBeSelectedCheck(1) );
return multiEnableCheck;
}
public Icon getIcon() {
return new ImageIcon(getClass().getResource("eye.png"));
}
public boolean execute(PlugInContext context) throws Exception {
try {
context.getLayerNamePanel().addListener(this);
} catch (RuntimeException e) {
e.printStackTrace();
}
Collection selCats = context.getLayerNamePanel().getSelectedCategories();
Iterator iter = selCats.iterator();
Category cat;
Boolean visible;
while(iter.hasNext()){
cat = (Category)iter.next();
if (!this.cathegory2Visibility.containsKey(cat)){
this.cathegory2Visibility.put(cat, new Boolean(true));
}
visible = (Boolean)this.cathegory2Visibility.get(cat);
this.cathegory2Visibility.remove(cat);
this.cathegory2Visibility.put(cat, new Boolean(!visible.booleanValue()) );
this.setLayerVisibility( cat.getLayerables(), !visible.booleanValue() );
}
return true;
}
protected void setLayerVisibility(List layers, boolean visible){
Iterator iter = layers.iterator();
Layerable layer;
while(iter.hasNext()){
layer = (Layerable)iter.next();
if (!visible && !this.layer2Visibility.containsKey(layer)){
this.layer2Visibility.put(layer, new Boolean(layer.isVisible()));
}
if (layer.isVisible() != visible){
if (!visible){
layer.setVisible(visible);
} else {
if (this.layer2Visibility.containsKey(layer)){
layer.setVisible(((Boolean)this.layer2Visibility.get(layer)).booleanValue());
this.layer2Visibility.remove(layer);
} else {
layer.setVisible(visible);
}
}
}
}
}
protected void checkAndFixInvisibility(){
if (this.context == null){
LOG.warn("SetCategoryVisibilityPlugIn: context == null!");
return;
}
PlugInContext context = PlugInContextTools.getContext(this.context);
List cathegories = context.getLayerManager().getCategories();
Iterator iter = cathegories.iterator();
Category cat;
while (iter.hasNext()){
cat = (Category)iter.next();
if (this.cathegory2Visibility.containsKey(cat) && !((Boolean)this.cathegory2Visibility.get(cat)).booleanValue()){
this.setLayerVisibility( cat.getLayerables(), false );
}
}
}
public boolean IsCategoryVisible(Category cat){
if (this.cathegory2Visibility.containsKey(cat))
return ((Boolean)this.cathegory2Visibility.get(cat)).booleanValue();
// by default, there is no invisibilty for categories
return true;
}
public void setCategoryVisibility(Category cat, boolean visible){
this.cathegory2Visibility.put(cat, new Boolean(visible));
this.checkAndFixInvisibility();
}
public void layerSelectionChanged() {
PlugInContext context = PlugInContextTools.getContext(this.context);
List cathegories = context.getLayerManager().getCategories();
Iterator iter = cathegories.iterator();
Category cat;
while (iter.hasNext()){
cat = (Category)iter.next();
if (!this.cathegory2Visibility.containsKey(cat)){
this.cathegory2Visibility.put(cat, new Boolean(true));
}
}
this.checkAndFixInvisibility();
Collection selCats = context.getLayerNamePanel().getSelectedCategories();
if (selCats.isEmpty()) return;
cat = (Category)selCats.toArray()[0];
this.menuItem.setSelected( ((Boolean)this.cathegory2Visibility.get(cat)).booleanValue() );
}
}