/******************************************************************************* * Copyright (c) 2016 Weasis Team and others. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html * * Contributors: * Nicolas Roduit - initial API and implementation *******************************************************************************/ package org.weasis.dicom.codec.display; import java.util.HashMap; import java.util.Optional; import org.weasis.core.api.gui.util.ActionW; import org.weasis.core.api.gui.util.JMVUtils; import org.weasis.core.api.image.ImageOpEvent; import org.weasis.core.api.image.ImageOpEvent.OpEvent; import org.weasis.core.api.image.WindowOp; import org.weasis.core.api.media.data.ImageElement; import org.weasis.dicom.codec.DicomImageElement; import org.weasis.dicom.codec.PRSpecialElement; import org.weasis.dicom.codec.PresentationStateReader; public class WindowAndPresetsOp extends WindowOp { public static final String P_PR_ELEMENT = "pr.element"; //$NON-NLS-1$ @Override public void handleImageOpEvent(ImageOpEvent event) { OpEvent type = event.getEventType(); if (OpEvent.ImageChange.equals(type)) { setParam(P_IMAGE_ELEMENT, event.getImage()); removeParam(P_PR_ELEMENT); } else if (OpEvent.ResetDisplay.equals(type) || OpEvent.SeriesChange.equals(type)) { ImageElement img = event.getImage(); setParam(P_IMAGE_ELEMENT, img); removeParam(P_PR_ELEMENT); if (img != null) { if (!img.isImageAvailable()) { // Ensure to load image before calling the default preset that requires pixel min and max img.getImage(); } boolean pixelPadding = JMVUtils.getNULLtoTrue(getParam(ActionW.IMAGE_PIX_PADDING.cmd())); PresetWindowLevel preset = null; if (img instanceof DicomImageElement) { preset = ((DicomImageElement) img).getDefaultPreset(pixelPadding); } setPreset(preset, img, pixelPadding); } } else if (OpEvent.ApplyPR.equals(type)) { ImageElement img = event.getImage(); setParam(P_IMAGE_ELEMENT, img); if (img != null) { if (!img.isImageAvailable()) { // Ensure to load image before calling the default preset that requires pixel min and max img.getImage(); } boolean pixelPadding = JMVUtils.getNULLtoTrue(getParam(ActionW.IMAGE_PIX_PADDING.cmd())); HashMap<String, Object> p = event.getParams(); if (p != null) { setParam(P_PR_ELEMENT, Optional.ofNullable(p.get(ActionW.PR_STATE.cmd())) .filter(PRSpecialElement.class::isInstance).orElse(null)); PresetWindowLevel preset = (PresetWindowLevel) p.get(ActionW.PRESET.cmd()); if (preset == null && img instanceof DicomImageElement) { preset = ((DicomImageElement) img).getDefaultPreset(pixelPadding); } setPreset(preset, img, pixelPadding); } } } } private void setPreset(PresetWindowLevel preset, ImageElement img, boolean pixelPadding) { boolean p = preset != null; PRSpecialElement pr = (PRSpecialElement) getParam(P_PR_ELEMENT); setParam(ActionW.PRESET.cmd(), preset); setParam(ActionW.DEFAULT_PRESET.cmd(), true); setParam(ActionW.WINDOW.cmd(), p ? preset.getWindow() : img.getDefaultWindow(pixelPadding)); setParam(ActionW.LEVEL.cmd(), p ? preset.getLevel() : img.getDefaultLevel(pixelPadding)); setParam(ActionW.LEVEL_MIN.cmd(), img.getMinValue(pr, pixelPadding)); setParam(ActionW.LEVEL_MAX.cmd(), img.getMaxValue(pr, pixelPadding)); setParam(ActionW.LUT_SHAPE.cmd(), p ? preset.getLutShape() : img.getDefaultShape(pixelPadding)); } }