/******************************************************************************* * 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.explorer; import java.awt.Container; import java.awt.Toolkit; import java.awt.event.InputEvent; import java.awt.event.KeyEvent; import java.util.ArrayList; import java.util.Collection; import java.util.List; import javax.swing.JPanel; import org.weasis.core.api.gui.util.JMVUtils; import org.weasis.core.api.media.data.Series; import org.weasis.core.api.media.data.TagW; import org.weasis.core.api.media.data.Thumbnail; import org.weasis.dicom.explorer.DicomExplorer.PatientContainerPane; import org.weasis.dicom.explorer.DicomExplorer.PatientPane; import org.weasis.dicom.explorer.DicomExplorer.SeriesPane; import org.weasis.dicom.explorer.DicomExplorer.StudyPane; public class SeriesSelectionModel extends ArrayList<Series<?>> { private static final long serialVersionUID = -7481872614518038371L; private final PatientContainerPane patientContainer; private Series<?> anchorSelection; private Series<?> leadSelection; private boolean openningSeries = false; public SeriesSelectionModel(PatientContainerPane patientContainer) { this.patientContainer = patientContainer; } @Override public void add(int index, Series<?> element) { if (!contains(element)) { super.add(index, element); setBackgroundColor(element, false); } } @Override public boolean add(Series<?> e) { if (!contains(e)) { setBackgroundColor(e, true); return super.add(e); } return false; } @Override public boolean addAll(Collection<? extends Series<?>> c) { for (Series<?> series : c) { setBackgroundColor(series, true); } return super.addAll(c); } @Override public boolean addAll(int index, Collection<? extends Series<?>> c) { for (Series<?> series : c) { setBackgroundColor(series, true); } return super.addAll(index, c); } public Series<?> getAnchorSelection() { return anchorSelection; } public Series<?> getLeadSelection() { return leadSelection; } @Override public void clear() { this.anchorSelection = null; this.leadSelection = null; for (Series<?> s : this) { setBackgroundColor(s, false); } super.clear(); } @Override public Series<?> remove(int index) { Series<?> s = super.remove(index); if (s != null) { setBackgroundColor(s, false); } return s; } @Override public boolean remove(Object o) { if (o instanceof Series) { setBackgroundColor((Series<?>) o, false); } return super.remove(o); } @Override protected void removeRange(int fromIndex, int toIndex) { if (fromIndex < toIndex) { int seriesSize = this.size(); int end = toIndex > seriesSize ? seriesSize : toIndex; int start = fromIndex < 0 ? 0 : fromIndex; for (int i = start; i < end; i++) { Series<?> val = this.get(i); setBackgroundColor(val, false); } super.removeRange(start, end); } } @Override public Series<?> set(int index, Series<?> element) { Series<?> s = super.set(index, element); if (s != null) { setBackgroundColor(s, false); } if (element != null) { setBackgroundColor(element, true); } return s; } private void setBackgroundColor(Series<?> series, boolean selected) { if (series != null) { Thumbnail thumb = (Thumbnail) series.getTagValue(TagW.Thumbnail); if (thumb != null) { Container parent = thumb.getParent(); if (parent instanceof JPanel) { parent.setBackground(selected ? JMVUtils.TREE_SELECTION_BACKROUND : JMVUtils.TREE_BACKROUND); } } } } private void requestFocus(Series<?> series) { if (series != null) { Thumbnail thumb = (Thumbnail) series.getTagValue(TagW.Thumbnail); if (thumb != null) { if (!thumb.hasFocus() && thumb.isRequestFocusEnabled()) { thumb.requestFocus(); } } } } void adjustSelection(InputEvent e, Series<?> series) { if (e != null && series != null) { boolean anchorSelected; Series<?> anchor = anchorSelection; Series<?> row = series; if (anchor == null) { anchorSelected = false; } else { anchorSelected = this.contains(anchor); } if ((e.getModifiers() & Toolkit.getDefaultToolkit().getMenuShortcutKeyMask()) != 0) { if (e.isShiftDown()) { if (anchorSelected) { addSelectionInterval(anchor, row); } else { removeSelectionInterval(anchor, row); } } else if (e instanceof KeyEvent) { setSelectionInterval(row, row); } else if (this.contains(row)) { removeSelectionInterval(row, row); } else { addSelectionInterval(row, row); } } else if (e.isShiftDown()) { setSelectionInterval(anchor, row); } else { setSelectionInterval(row, row); } } } void setSelectionInterval(Series<?> anchorIndex, Series<?> row) { this.clear(); addSelectionInterval(anchorIndex, row); } void removeSelectionInterval(Series<?> anchorIndex, Series<?> row) { if (anchorIndex == null || row == null) { return; } int fromIndex = -1; int toIndex = -1; for (int i = 0; i < this.size(); i++) { Series<?> val = this.get(i); if (anchorIndex == val) { if (fromIndex == -1) { fromIndex = i; } else { toIndex = i; break; } } if (row == val) { if (fromIndex == -1) { fromIndex = i; } else { toIndex = i; break; } } } removeRange(fromIndex, toIndex + 1); requestFocus(row); this.anchorSelection = anchorIndex; this.leadSelection = row; } void addSelectionInterval(Series anchorIndex, Series row) { if (anchorIndex == null || row == null) { return; } boolean first = false; if (patientContainer == null || anchorIndex == row) { add(anchorIndex); } else { pat: for (PatientPane p : patientContainer.getPatientPaneList()) { for (StudyPane studyPane : p.getStudyPaneList()) { for (SeriesPane series : studyPane.getSeriesPaneList()) { if (anchorIndex == series.getSequence()) { add(anchorIndex); if (first) { break pat; } first = true; } else if (row == series.getSequence()) { add(row); if (first) { break pat; } first = true; } else if (first) { add((Series) series.getSequence()); } } } } } requestFocus(row); this.anchorSelection = anchorIndex; this.leadSelection = row; } Series getFirstElement() { if (patientContainer != null) { for (PatientPane p : patientContainer.getPatientPaneList()) { for (StudyPane studyPane : p.getStudyPaneList()) { List<SeriesPane> list = studyPane.getSeriesPaneList(); if (list.size() > 0) { return (Series) list.get(0).getSequence(); } } } } return null; } Series getLastElement() { if (patientContainer != null) { List<PatientPane> pts = patientContainer.getPatientPaneList(); for (int i = pts.size() - 1; i >= 0; i--) { List<StudyPane> st = pts.get(i).getStudyPaneList(); for (int j = st.size() - 1; j >= 0; j--) { List<SeriesPane> list = st.get(j).getSeriesPaneList(); if (list.size() > 0) { return (Series) list.get(list.size() - 1).getSequence(); } } } } return null; } Series getPreviousElement(Series element) { if (element != null && patientContainer != null) { boolean next = false; List<PatientPane> pts = patientContainer.getPatientPaneList(); for (int i = pts.size() - 1; i >= 0; i--) { List<StudyPane> st = pts.get(i).getStudyPaneList(); for (int j = st.size() - 1; j >= 0; j--) { List<SeriesPane> list = st.get(j).getSeriesPaneList(); for (int k = list.size() - 1; k >= 0; k--) { if (next) { return (Series) list.get(k).getSequence(); } if (element == list.get(k).getSequence()) { next = true; } } } } return getFirstElement(); } return null; } Series getNextElement(Series element) { if (element != null && patientContainer != null) { boolean next = false; for (PatientPane p : patientContainer.getPatientPaneList()) { for (StudyPane studyPane : p.getStudyPaneList()) { List<SeriesPane> list = studyPane.getSeriesPaneList(); for (SeriesPane seriesPane : list) { if (next) { return (Series) seriesPane.getSequence(); } if (element == seriesPane.getSequence()) { next = true; } } } } return getLastElement(); } return null; } public boolean isOpenningSeries() { return openningSeries; } public void setOpenningSeries(boolean openningSeries) { this.openningSeries = openningSeries; } }