public void removeProperty(Object description) {
   logger.debug("Removing property: ", description);
   super.removeProperty(description);
 }
	/**
	 * Returns an IChemModel, using the reader provided (picked).
	 * 
	 * @param cor
	 * @param panel
	 * @return
	 * @throws CDKException
	 */
	public static IChemModel getChemModelFromReader(
			final ISimpleChemObjectReader cor,
			final AbstractJChemPaintPanel panel) throws CDKException {
		panel.get2DHub().setRGroupHandler(null);
		String error = null;
		ChemModel chemModel = null;
		IChemFile chemFile = null;
		if (cor.accepts(IChemFile.class) && chemModel == null) {
			// try to read a ChemFile
			try {
				chemFile = (IChemFile) cor.read((IChemObject) new ChemFile());
				if (chemFile == null) {
					error = "The object chemFile was empty unexpectedly!";
				}
			} catch (final Exception exception) {
				error = "Error while reading file: " + exception.getMessage();
				exception.printStackTrace();
			}
		}
		if (error != null) {
			throw new CDKException(error);
		}
		if (chemModel == null && chemFile != null) {
			chemModel = (ChemModel) chemFile.getChemSequence(0).getChemModel(0);
		}
		if (cor.accepts(ChemModel.class) && chemModel == null) {
			// try to read a ChemModel
			try {

				chemModel = (ChemModel) cor.read((IChemObject) new ChemModel());
				if (chemModel == null) {
					error = "The object chemModel was empty unexpectedly!";
				}
			} catch (final Exception exception) {
				error = "Error while reading file: " + exception.getMessage();
				exception.printStackTrace();
			}
		}

		// Smiles reading
		if (cor.accepts(AtomContainerSet.class) && chemModel == null) {
			// try to read a AtomContainer set
			try {
				final IAtomContainerSet som = cor.read(new AtomContainerSet());
				chemModel = new ChemModel();
				chemModel.setMoleculeSet(som);
				if (chemModel == null) {
					error = "The object chemModel was empty unexpectedly!";
				}
			} catch (final Exception exception) {
				error = "Error while reading file: " + exception.getMessage();
				exception.printStackTrace();
			}
		}

		// MDLV3000 reading
		if (cor.accepts(AtomContainer.class) && chemModel == null) {
			// try to read a AtomContainer
			final IAtomContainer mol = cor.read(new AtomContainer());
			if (mol != null) {
				try {
					final IAtomContainerSet newSet = new AtomContainerSet();
					newSet.addAtomContainer(mol);
					chemModel = new ChemModel();
					chemModel.setMoleculeSet(newSet);
					if (chemModel == null) {
						error = "The object chemModel was empty unexpectedly!";
					}
				} catch (final Exception exception) {
					error = "Error while reading file: "
							+ exception.getMessage();
					exception.printStackTrace();
				}
			}
		}

		// RGroupQuery reading
		if (cor.accepts(RGroupQuery.class) && chemModel == null) {
			final IRGroupQuery rgroupQuery = cor.read(new RGroupQuery());
			if (rgroupQuery != null) {
				try {
					chemModel = new ChemModel();
					final RGroupHandler rgHandler = new RGroupHandler(
							rgroupQuery);
					panel.get2DHub().setRGroupHandler(rgHandler);
					chemModel.setMoleculeSet(rgHandler
							.getMoleculeSet(chemModel));
					rgHandler.layoutRgroup();

				} catch (final Exception exception) {
					error = "Error while reading file: "
							+ exception.getMessage();
					exception.printStackTrace();
				}
			}
		}

		if (error != null) {
			throw new CDKException(error);
		}

		if (chemModel == null && chemFile != null) {
			chemModel = (ChemModel) chemFile.getChemSequence(0).getChemModel(0);
		}

		// SmilesParser sets valencies, switch off by default.
		if (cor instanceof SMILESReader) {
			final IAtomContainer allinone = JChemPaintPanel
					.getAllAtomContainersInOne(chemModel);
			for (int k = 0; k < allinone.getAtomCount(); k++) {
				allinone.getAtom(k).setValency(null);
			}
		}
		return chemModel;
	}
 public void notifyChanged(IChemObjectChangeEvent evt) {
   logger.debug("Notifying changed event: ", evt);
   super.notifyChanged(evt);
 }
 public void setProperty(Object description, Object property) {
   logger.debug("Setting property: ", description + "=" + property);
   super.setProperty(description, property);
 }
 public void removeListener(IChemObjectListener col) {
   logger.debug("Removing listener: ", col);
   super.removeListener(col);
 }
 public void notifyChanged() {
   logger.debug("Notifying changed");
   super.notifyChanged();
 }
 public void setReactionSet(IReactionSet sor) {
   logger.debug("Setting setOfReactions: ", sor);
   super.setReactionSet(sor);
 }
 public void addListener(IChemObjectListener col) {
   logger.debug("Adding listener: ", col);
   super.addListener(col);
 }
 public void setRingSet(IRingSet ringSet) {
   logger.debug("Setting ringSet: ", ringSet);
   super.setRingSet(ringSet);
 }
 public void setCrystal(ICrystal crystal) {
   logger.debug("Setting crystal: ", crystal);
   super.setCrystal(crystal);
 }
 public void setMoleculeSet(IMoleculeSet setOfMolecules) {
   logger.debug("Setting setOfMolecules: ", setOfMolecules);
   super.setMoleculeSet(setOfMolecules);
 }
 public void setFlags(boolean[] flagsNew) {
   logger.debug("Setting flags:", flagsNew.length);
   super.setFlags(flagsNew);
 }
 public void setProperties(Map<Object, Object> properties) {
   logger.debug("Setting properties: ", properties);
   super.setProperties(properties);
 }
 public void setFlag(int flag_type, boolean flag_value) {
   logger.debug("Setting flag: ", flag_type + "=" + flag_value);
   super.setFlag(flag_type, flag_value);
 }
 public void setID(String identifier) {
   logger.debug("Setting ID: ", identifier);
   super.setID(identifier);
 }