Skip to content

Commit 14599cf

Browse files
committed
Unify DICOM import UX: handle ZIP drag-and-drop and consolidate into the "Local Device" dialog #793
1 parent 77e7dbb commit 14599cf

File tree

8 files changed

+223
-58
lines changed

8 files changed

+223
-58
lines changed

weasis-core/src/main/java/org/weasis/core/api/media/data/MediaReader.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,10 @@ public interface MediaReader<E extends MediaElement> extends Taggable {
2727

2828
boolean delegate(DataExplorerModel explorerModel);
2929

30+
default boolean isOnlyDelegate() {
31+
return false;
32+
}
33+
3034
MediaElement getPreview();
3135

3236
PlanarImage getImageFragment(MediaElement media) throws Exception;

weasis-core/src/main/resources/mime-types.properties

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -136,7 +136,7 @@ xwd=image/x-xwindowdump
136136
gz=application/x-gzip,application/x-compressed
137137
gzip=application/x-gzip,multipart/x-gzip
138138
z=application/x-compress,application/x-compressed
139-
zip=application/zip,application/x-compressed
139+
zip=application/x-zip,application/x-compressed
140140
bz=application/x-bzip
141141
bz2=application/x-bzip2
142142
lzh=application/x-lzh
@@ -156,4 +156,4 @@ ppt=application/mspowerpoint
156156
pptx=application/vnd.openxmlformats-officedocument.presentationml.presentation
157157
rtf=text/rtf
158158
xls=application/vndms-excel
159-
xlsx=application/vnd.openxmlformats-officedocument.spreadsheetml.sheet
159+
xlsx=application/vnd.openxmlformats-officedocument.spreadsheetml.sheet

weasis-dicom/weasis-dicom-explorer/src/main/java/org/weasis/dicom/explorer/DicomModel.java

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -94,7 +94,7 @@
9494
import org.weasis.dicom.explorer.HangingProtocols.OpeningViewer;
9595
import org.weasis.dicom.explorer.imp.DicomDirImport;
9696
import org.weasis.dicom.explorer.imp.DicomDirLoader;
97-
import org.weasis.dicom.explorer.imp.DicomZipImport;
97+
import org.weasis.dicom.explorer.imp.DicomZipMediaIO;
9898
import org.weasis.dicom.explorer.imp.LocalImport;
9999
import org.weasis.dicom.explorer.main.SeriesPane;
100100
import org.weasis.dicom.explorer.rs.RsQueryParams;
@@ -161,7 +161,8 @@ public List<Codec<MediaElement>> getCodecPlugins() {
161161
for (Codec<MediaElement> codec : codecs) {
162162
if (codec != null
163163
&& !"JDK ImageIO".equals(codec.getCodecName()) // NON-NLS
164-
&& codec.isMimeTypeSupported(DicomMediaIO.DICOM_MIMETYPE)
164+
&& (codec.isMimeTypeSupported(DicomMediaIO.DICOM_MIMETYPE)
165+
|| codec.isMimeTypeSupported(DicomZipMediaIO.MIME_TYPE))
165166
&& !codecPlugins.contains(codec)) {
166167
codecPlugins.add(codec);
167168
}
@@ -1172,7 +1173,7 @@ private void getCommand(
11721173

11731174
if (opt.isSet("zip")) {
11741175
for (String zip : zargs) {
1175-
DicomZipImport.loadDicomZip(zip, DicomModel.this);
1176+
DicomZipMediaIO.loadDicomZip(zip, DicomModel.this);
11761177
}
11771178
}
11781179

weasis-dicom/weasis-dicom-explorer/src/main/java/org/weasis/dicom/explorer/LoadLocalDicom.java

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,8 @@
2525
import org.weasis.dicom.codec.*;
2626
import org.weasis.dicom.codec.DicomMediaIO.Reading;
2727
import org.weasis.dicom.explorer.HangingProtocols.OpeningViewer;
28+
import org.weasis.dicom.explorer.imp.DicomZipCodec;
29+
import org.weasis.dicom.explorer.imp.DicomZipMediaIO;
2830

2931
public class LoadLocalDicom extends LoadDicom {
3032

@@ -67,16 +69,15 @@ protected void addSelectionAndNotify(File[] file, boolean firstLevel) {
6769
if (isCancelled()) {
6870
return;
6971
}
70-
if (value == null) {
72+
if (value == null || !value.canRead()) {
7173
continue;
7274
}
7375

7476
if (value.isDirectory()) {
7577
if (firstLevel || recursive) {
7678
folders.add(value);
7779
}
78-
} else if (value.canRead()
79-
&& FileUtil.isFileExtensionMatching(value.toPath(), DicomCodec.FILE_EXTENSIONS)
80+
} else if (FileUtil.isFileExtensionMatching(value.toPath(), DicomCodec.FILE_EXTENSIONS)
8081
|| MimeInspector.isMatchingMimeTypeFromMagicNumber(value, DicomMediaIO.DICOM_MIMETYPE)) {
8182
DicomMediaIO loader = new DicomMediaIO(value);
8283
Reading reading = loader.getReadingStatus();
@@ -94,6 +95,9 @@ protected void addSelectionAndNotify(File[] file, boolean firstLevel) {
9495
} else if (reading == Reading.ERROR) {
9596
errors.incrementAndGet();
9697
}
98+
} else if (FileUtil.isFileExtensionMatching(value.toPath(), DicomZipCodec.FILE_EXTENSIONS)
99+
|| MimeInspector.isMatchingMimeTypeFromMagicNumber(value, DicomZipMediaIO.MIME_TYPE)) {
100+
new DicomZipMediaIO(value.toURI(), null).delegate(dicomModel);
97101
}
98102
}
99103

weasis-dicom/weasis-dicom-explorer/src/main/java/org/weasis/dicom/explorer/imp/DicomImport.java

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -75,7 +75,6 @@ public DicomImport(Window parent, final DicomModel dicomModel) {
7575
protected void initializePages() {
7676
ArrayList<AbstractItemDialogPage> list = new ArrayList<>();
7777
list.add(new LocalImport());
78-
list.add(new DicomZipImport());
7978
list.add(new DicomDirImport());
8079

8180
BundleContext context = AppProperties.getBundleContext(this.getClass());
Lines changed: 65 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,65 @@
1+
/*
2+
* Copyright (c) 2009-2020 Weasis Team and other contributors.
3+
*
4+
* This program and the accompanying materials are made available under the terms of the Eclipse
5+
* Public License 2.0 which is available at https://www.eclipse.org/legal/epl-2.0, or the Apache
6+
* License, Version 2.0 which is available at https://www.apache.org/licenses/LICENSE-2.0.
7+
*
8+
* SPDX-License-Identifier: EPL-2.0 OR Apache-2.0
9+
*/
10+
package org.weasis.dicom.explorer.imp;
11+
12+
import java.net.URI;
13+
import java.util.Hashtable;
14+
import org.osgi.service.component.annotations.Component;
15+
import org.weasis.core.api.media.data.Codec;
16+
import org.weasis.core.api.media.data.MediaElement;
17+
import org.weasis.core.api.media.data.MediaReader;
18+
19+
/** An OSGi {@link Codec} service that handles {@code .zip} files containing DICOM data. */
20+
@Component(service = Codec.class)
21+
public class DicomZipCodec implements Codec<MediaElement> {
22+
23+
public static final String NAME = "DICOM-ZIP"; // NON-NLS
24+
public static final String MIME_TYPE = DicomZipMediaIO.MIME_TYPE;
25+
public static final String[] FILE_EXTENSIONS = {"zip"}; // NON-NLS
26+
27+
@Override
28+
public String getCodecName() {
29+
return NAME;
30+
}
31+
32+
@Override
33+
public String[] getReaderMIMETypes() {
34+
return new String[] {MIME_TYPE};
35+
}
36+
37+
@Override
38+
public String[] getReaderExtensions() {
39+
return FILE_EXTENSIONS;
40+
}
41+
42+
@Override
43+
public String[] getWriterMIMETypes() {
44+
return new String[0];
45+
}
46+
47+
@Override
48+
public String[] getWriterExtensions() {
49+
return new String[0];
50+
}
51+
52+
@Override
53+
public boolean isMimeTypeSupported(String mimeType) {
54+
return MIME_TYPE.equals(mimeType);
55+
}
56+
57+
@Override
58+
public MediaReader<MediaElement> getMediaIO(
59+
URI media, String mimeType, Hashtable<String, Object> properties) {
60+
if (isMimeTypeSupported(mimeType)) {
61+
return new DicomZipMediaIO(media, this);
62+
}
63+
return null;
64+
}
65+
}

0 commit comments

Comments
 (0)