diff options
Diffstat (limited to 'containers/org.eclipse.linuxtools.docker.ui/src/org/eclipse/linuxtools/internal/docker')
4 files changed, 608 insertions, 23 deletions
diff --git a/containers/org.eclipse.linuxtools.docker.ui/src/org/eclipse/linuxtools/internal/docker/ui/SWTImagesFactory.java b/containers/org.eclipse.linuxtools.docker.ui/src/org/eclipse/linuxtools/internal/docker/ui/SWTImagesFactory.java index 55117df391..1f7d7b89e8 100644 --- a/containers/org.eclipse.linuxtools.docker.ui/src/org/eclipse/linuxtools/internal/docker/ui/SWTImagesFactory.java +++ b/containers/org.eclipse.linuxtools.docker.ui/src/org/eclipse/linuxtools/internal/docker/ui/SWTImagesFactory.java @@ -87,6 +87,12 @@ public class SWTImagesFactory { + "container_paused.png"; //$NON-NLS-1$ public static final String IMG_CONTAINER_STOPPED = NAME_PREFIX + "container_stopped.png"; //$NON-NLS-1$ + public static final String IMG_CONTAINER_VOLUME = NAME_PREFIX + + "container_volume.png"; //$NON-NLS-1$ + public static final String IMG_CONTAINER_PORT = NAME_PREFIX + + "container_port.png"; //$NON-NLS-1$ + public static final String IMG_CONTAINER_LINK = NAME_PREFIX + + "container_link.png"; //$NON-NLS-1$ public static final String IMG_SYSTEM_PROCESS = NAME_PREFIX + "systemprocess.gif"; //$NON-NLS-1$ public static final String IMG_CHECKED = NAME_PREFIX + "checked.gif"; //$NON-NLS-1$ @@ -164,6 +170,12 @@ public class SWTImagesFactory { "", IMG_CONTAINER_PAUSED); public static final ImageDescriptor DESC_CONTAINER_STOPPED = createManaged( "", IMG_CONTAINER_STOPPED); + public static final ImageDescriptor DESC_CONTAINER_VOLUME = createManaged("", + IMG_CONTAINER_VOLUME); + public static final ImageDescriptor DESC_CONTAINER_PORT = createManaged("", + IMG_CONTAINER_PORT); + public static final ImageDescriptor DESC_CONTAINER_LINK = createManaged("", + IMG_CONTAINER_LINK); public static final ImageDescriptor DESC_SYSTEM_PROCESS = createManaged("", IMG_SYSTEM_PROCESS); public static final ImageDescriptor DESC_CHECKED = createManaged("", diff --git a/containers/org.eclipse.linuxtools.docker.ui/src/org/eclipse/linuxtools/internal/docker/ui/views/DVMessages.properties b/containers/org.eclipse.linuxtools.docker.ui/src/org/eclipse/linuxtools/internal/docker/ui/views/DVMessages.properties index c5577999ac..5ab0cd1f32 100644 --- a/containers/org.eclipse.linuxtools.docker.ui/src/org/eclipse/linuxtools/internal/docker/ui/views/DVMessages.properties +++ b/containers/org.eclipse.linuxtools.docker.ui/src/org/eclipse/linuxtools/internal/docker/ui/views/DVMessages.properties @@ -147,6 +147,7 @@ ViewerDaemonMissing.msg=No Docker daemon selected ImagesLoadJob.msg=Loading images... ContainersLoadJob.msg=Loading containers... +ContainerInfoLoadJob.msg=Loading container info... ImagesRemove.msg=Removing Images... ImageRemove.msg=Removing {0} @@ -193,4 +194,7 @@ Connection.unnamed=<unnamed> Loading.label=Loading... DockerContainersCategory.label=Containers +DockerContainerPortMappingsCategory.label=Ports +DockerContainerVolumesCategory.label=Volumes +DockerContainerLinksCategory.label=Links DockerImagesCategory.label=Images diff --git a/containers/org.eclipse.linuxtools.docker.ui/src/org/eclipse/linuxtools/internal/docker/ui/views/DockerExplorerContentProvider.java b/containers/org.eclipse.linuxtools.docker.ui/src/org/eclipse/linuxtools/internal/docker/ui/views/DockerExplorerContentProvider.java index 5cb6b938c9..192e307b3e 100644 --- a/containers/org.eclipse.linuxtools.docker.ui/src/org/eclipse/linuxtools/internal/docker/ui/views/DockerExplorerContentProvider.java +++ b/containers/org.eclipse.linuxtools.docker.ui/src/org/eclipse/linuxtools/internal/docker/ui/views/DockerExplorerContentProvider.java @@ -11,6 +11,12 @@ package org.eclipse.linuxtools.internal.docker.ui.views; +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; +import java.util.Map; +import java.util.Map.Entry; + import org.eclipse.core.runtime.IProgressMonitor; import org.eclipse.core.runtime.IStatus; import org.eclipse.core.runtime.Status; @@ -23,10 +29,18 @@ import org.eclipse.jface.viewers.TreeViewer; import org.eclipse.jface.viewers.Viewer; import org.eclipse.linuxtools.docker.core.DockerConnectionManager; import org.eclipse.linuxtools.docker.core.IDockerConnection; +import org.eclipse.linuxtools.docker.core.IDockerContainer; +import org.eclipse.linuxtools.docker.core.IDockerContainerInfo; +import org.eclipse.linuxtools.docker.core.IDockerHostConfig; +import org.eclipse.linuxtools.docker.core.IDockerImage; +import org.eclipse.linuxtools.docker.core.IDockerNetworkSettings; +import org.eclipse.linuxtools.docker.core.IDockerPortBinding; +import org.eclipse.linuxtools.docker.core.IDockerPortMapping; +import org.eclipse.linuxtools.internal.docker.core.DockerPortMapping; import org.eclipse.swt.widgets.Display; /** - * @author xcoulon + * {@link ITreeContentProvider} for the {@link DockerExplorerView} * */ public class DockerExplorerContentProvider implements ITreeContentProvider { @@ -75,6 +89,34 @@ public class DockerExplorerContentProvider implements ITreeContentProvider { } loadImages(imagesCategory); return new Object[] { new LoadingStub(imagesCategory) }; + } else if (parentElement instanceof IDockerContainer) { + final IDockerContainer container = (IDockerContainer) parentElement; + if (container.isInfoLoaded()) { + final IDockerContainerInfo info = container.info(); + final IDockerNetworkSettings networkSettings = info + .networkSettings(); + final IDockerHostConfig hostConfig = info.hostConfig(); + return new Object[] { + new DockerContainerPortMappingsCategory(container, + networkSettings.ports()), + new DockerContainerVolumesCategory(container, + hostConfig.binds()), + new DockerContainerLinksCategory(container, + hostConfig.links()) }; + } + loadContainerInfo(container); + return new Object[] { new LoadingStub(container) }; + } else if (parentElement instanceof DockerContainerLinksCategory) { + final DockerContainerLinksCategory linksCategory = (DockerContainerLinksCategory) parentElement; + return linksCategory.getLinks().toArray(); + } else + if (parentElement instanceof DockerContainerPortMappingsCategory) { + final DockerContainerPortMappingsCategory portMappingsCategory = (DockerContainerPortMappingsCategory) parentElement; + return portMappingsCategory.getPortMappings().toArray(); + + } else if (parentElement instanceof DockerContainerVolumesCategory) { + final DockerContainerVolumesCategory volumesCategory = (DockerContainerVolumesCategory) parentElement; + return volumesCategory.getVolumes().toArray(); } return EMPTY; } @@ -84,7 +126,8 @@ public class DockerExplorerContentProvider implements ITreeContentProvider { * @param containersCategory the selected {@link DockerContainersCategory} */ private void loadContainers(final DockerContainersCategory containersCategory) { - final Job loadContainersJob = new Job("Loading containers...") { + final Job loadContainersJob = new Job( + DVMessages.getString("ContainersLoadJob.msg")) { //$NON-NLS-1$ @Override protected IStatus run(final IProgressMonitor monitor) { containersCategory.getConnection().getContainers(true); @@ -112,11 +155,49 @@ public class DockerExplorerContentProvider implements ITreeContentProvider { } /** + * Call the {@link IDockerConnection#getContainers(boolean)} in a background + * job to avoid blocking the UI. + * + * @param container + * the selected {@link DockerContainersCategory} + */ + private void loadContainerInfo(final IDockerContainer container) { + // only retain expanded tree paths if container was expanded + final TreePath[] expandedTreePaths = this.viewer.getExpandedState( + container) ? this.viewer.getExpandedTreePaths() : null; + final Job loadContainersJob = new Job( + DVMessages.getString("ContainerInfoLoadJob.msg")) { //$NON-NLS-1$ + @Override + protected IStatus run(final IProgressMonitor monitor) { + container.info(true); + return Status.OK_STATUS; + } + }; + loadContainersJob.addJobChangeListener(new JobChangeAdapter() { + @Override + public void done(final IJobChangeEvent event) { + event.getResult(); + Display.getDefault().asyncExec(new Runnable() { + @Override + public void run() { + refreshTarget(container); + if (expandedTreePaths != null) { + viewer.setExpandedTreePaths(expandedTreePaths); + } + } + }); + } + }); + loadContainersJob.schedule(); + } + + /** * Call the {@link IDockerConnection#getImages(boolean)} in a background job to avoid blocking the UI. * @param imagesCategory the selected {@link DockerImagesCategory} */ private void loadImages(final DockerImagesCategory imagesCategory) { - final Job loadImagesJob = new Job("Loading images...") { + final Job loadImagesJob = new Job( + DVMessages.getString("ImagesLoadJob.msg")) { //$NON-NLS-1$ @Override protected IStatus run(final IProgressMonitor monitor) { imagesCategory.getConnection().getImages(true); @@ -150,7 +231,19 @@ public class DockerExplorerContentProvider implements ITreeContentProvider { @Override public boolean hasChildren(final Object element) { - return (element instanceof IDockerConnection || element instanceof DockerContainersCategory || element instanceof DockerImagesCategory); + return (element instanceof IDockerConnection + || element instanceof DockerContainersCategory + || element instanceof DockerImagesCategory + || element instanceof IDockerContainer + || (element instanceof DockerContainerLinksCategory + && !((DockerContainerLinksCategory) element).getLinks() + .isEmpty()) + || (element instanceof DockerContainerPortMappingsCategory + && !((DockerContainerPortMappingsCategory) element) + .getPortMappings().isEmpty()) + || (element instanceof DockerContainerVolumesCategory + && !((DockerContainerVolumesCategory) element) + .getVolumes().isEmpty())); } /** @@ -163,11 +256,11 @@ public class DockerExplorerContentProvider implements ITreeContentProvider { private void refreshTarget(final Object target) { // this piece of code must run in an async manner to avoid reentrant // call while viewer is busy. - Display.getDefault().asyncExec(new Runnable() { + Display.getDefault().syncExec(new Runnable() { @Override public void run() { if (viewer != null) { - TreePath[] treePaths = viewer.getExpandedTreePaths(); + final TreePath[] treePaths = viewer.getExpandedTreePaths(); viewer.refresh(target, true); viewer.setExpandedTreePaths(treePaths); } @@ -175,13 +268,17 @@ public class DockerExplorerContentProvider implements ITreeContentProvider { }); } + /** + * Wrapper node to display {@link IDockerImage} of a given + * {@link IDockerConnection} + */ public static class DockerImagesCategory { private final IDockerConnection connection; /** - * @param connection - * - Docker connection + * @param container + * - Docker container */ public DockerImagesCategory(final IDockerConnection connection) { this.connection = connection; @@ -219,13 +316,17 @@ public class DockerExplorerContentProvider implements ITreeContentProvider { } + /** + * Wrapper node to display {@link IDockerContainer} of a given + * {@link IDockerConnection} + */ public static class DockerContainersCategory { private final IDockerConnection connection; /** - * @param connection - * - Docker connection + * @param container + * - Docker container */ public DockerContainersCategory(final IDockerConnection connection) { this.connection = connection; @@ -260,10 +361,406 @@ public class DockerExplorerContentProvider implements ITreeContentProvider { return false; return true; } - } + /** + * Wrapper node to display {@link IDockerPortMapping} of a given + * {@link IDockerContainer} + */ + public static class DockerContainerPortMappingsCategory { + + private final IDockerContainer container; + + private final Map<String, List<IDockerPortBinding>> bindings; + + /** + * @param container + * @param bindings + * - the container bindings + */ + public DockerContainerPortMappingsCategory( + final IDockerContainer container, + final Map<String, List<IDockerPortBinding>> bindings) { + this.container = container; + this.bindings = bindings; + } + + public List<IDockerPortMapping> getPortMappings() { + final List<IDockerPortMapping> portMappings = new ArrayList<>(); + if (bindings != null) { + for (Entry<String, List<IDockerPortBinding>> entry : bindings + .entrySet()) { + // internal port is in the following form: "8080/tcp" + final String[] source = entry.getKey().split("/"); + final int privatePort = Integer.parseInt(source[0]); + final String type = source[1]; + for (IDockerPortBinding portBinding : entry.getValue()) { + portMappings.add(new DockerPortMapping(privatePort, + Integer.parseInt(portBinding.hostPort()), type, + portBinding.hostIp())); + } + } + } + Collections.sort(portMappings); + return portMappings; + } + + @Override + public String toString() { + return "Port mappings for " + this.container.name(); + } + + @Override + public int hashCode() { + final int prime = 31; + int result = 1; + result = prime * result + + ((container == null) ? 0 : container.hashCode()); + return result; + } + + @Override + public boolean equals(Object obj) { + if (this == obj) + return true; + if (obj == null) + return false; + if (getClass() != obj.getClass()) + return false; + DockerContainerPortMappingsCategory other = (DockerContainerPortMappingsCategory) obj; + if (container == null) { + if (other.container != null) + return false; + } else if (!container.equals(other.container)) + return false; + return true; + } + + } + + /** + * Wrapper node to display the {@link DockerContainerLink} of a given + * {@link IDockerContainer} + */ + public static class DockerContainerLinksCategory { + + private final IDockerContainer container; + + private final List<DockerContainerLink> links; + + /** + * Constructor. + * + * @param container + * + * @param links + * - the container links + */ + public DockerContainerLinksCategory(final IDockerContainer container, + final List<String> links) { + this.container = container; + this.links = new ArrayList<>(); + if (links != null) { + for (String link : links) { + this.links.add(new DockerContainerLink(link)); + } + } + } + + public List<DockerContainerLink> getLinks() { + if (this.links == null) { + return Collections.emptyList(); + } + return this.links; + } + + @Override + public String toString() { + return "Container links for " + this.container.name(); + } + + /* + * (non-Javadoc) + * + * @see java.lang.Object#hashCode() + */ + @Override + public int hashCode() { + final int prime = 31; + int result = 1; + result = prime * result + + ((container == null) ? 0 : container.hashCode()); + return result; + } + + /* + * (non-Javadoc) + * + * @see java.lang.Object#equals(java.lang.Object) + */ + @Override + public boolean equals(Object obj) { + if (this == obj) + return true; + if (obj == null) + return false; + if (getClass() != obj.getClass()) + return false; + DockerContainerLinksCategory other = (DockerContainerLinksCategory) obj; + if (container == null) { + if (other.container != null) + return false; + } else if (!container.equals(other.container)) + return false; + return true; + } + + } + + public static class DockerContainerLink { + + private final String containerName; + + private final String containerAlias; + + /** + * Constructor. + * + * @param linkValue + * the bind value provided by the {@link IDockerHostConfig}. + */ + public DockerContainerLink(final String linkValue) { + // format: "container_name:containerAlias" + final String[] args = linkValue.split(":"); + this.containerName = getDisplayableContainerName(args[0]); + this.containerAlias = args.length > 0 + ? getDisplayableContainerAlias(args[1]) : null; + } + + /** + * Removes the heading "/" i(if found) in the given container name + * + * @param containerName + * @return a displayable container name + */ + private String getDisplayableContainerName(final String containerName) { + return containerName.startsWith("/") ? containerName.substring(1) + : containerName; + } + + /** + * Removes the heading "/" i(if found) in the given container name + * + * @param containerName + * @return a displayable container name + */ + private String getDisplayableContainerAlias( + final String containerAlias) { + final String[] containerAliasSplit = containerAlias.split("/"); + if (containerAliasSplit.length > 1) { + return containerAliasSplit[2]; + } + return null; + } + + public String getContainerName() { + return containerName; + } + + public String getContainerAlias() { + return containerAlias; + } + + @Override + public int hashCode() { + final int prime = 31; + int result = 1; + result = prime * result + ((containerAlias == null) ? 0 : containerAlias.hashCode()); + result = prime * result + + ((containerName == null) ? 0 : containerName.hashCode()); + return result; + } + + @Override + public boolean equals(Object obj) { + if (this == obj) + return true; + if (obj == null) + return false; + if (getClass() != obj.getClass()) + return false; + DockerContainerLink other = (DockerContainerLink) obj; + if (containerAlias == null) { + if (other.containerAlias != null) + return false; + } else if (!containerAlias.equals(other.containerAlias)) + return false; + if (containerName == null) { + if (other.containerName != null) + return false; + } else if (!containerName.equals(other.containerName)) + return false; + return true; + } + + } + + /** + * Wrapper node to display {@link DockerContainerVolume} of a given + * {@link IDockerContainer} + */ + public static class DockerContainerVolumesCategory { + + private final IDockerContainer container; + + private final List<DockerContainerVolume> volumes; + + /** + * Constructor. + * + * @param container + * + * @param volumes + * - the parent Docker container + */ + public DockerContainerVolumesCategory(final IDockerContainer container, + final List<String> volumes) { + this.container = container; + this.volumes = new ArrayList<>(); + if (volumes != null) { + for (String volume : volumes) { + this.volumes.add(new DockerContainerVolume(volume)); + } + } + } + + public List<DockerContainerVolume> getVolumes() { + if (this.volumes == null) { + return Collections.emptyList(); + } + return volumes; + } + + @Override + public String toString() { + return "Volumes for " + this.container.name(); + } + + @Override + public int hashCode() { + final int prime = 31; + int result = 1; + result = prime * result + + ((container == null) ? 0 : container.hashCode()); + return result; + } + + @Override + public boolean equals(Object obj) { + if (this == obj) + return true; + if (obj == null) + return false; + if (getClass() != obj.getClass()) + return false; + DockerContainerVolumesCategory other = (DockerContainerVolumesCategory) obj; + if (container == null) { + if (other.container != null) + return false; + } else if (!container.equals(other.container)) + return false; + return true; + } + + } + + public static class DockerContainerVolume { + + private final String hostPath; + + private final String containerPath; + + private final String flags; + + /** + * @param volume + * the volume value provided by the {@link IDockerHostConfig} + * . + * @return a {@link DockerContainerVolume} + */ + public DockerContainerVolume(final String volume) { + // (1) "container_path" to create a new volume for the container + // (2) "host_path:container_path" to bind-mount a host path into the + // container + // (3) "host_path:container_path:ro" to make the bind-mount + // read-only + // inside the container. + final String[] args = volume.split(":"); + // on case (1), hostPath is null + this.hostPath = args.length > 1 ? args[0] : null; + // on case (1), containerPath is the first (and only) arg, otherwise + // it's the second one. + this.containerPath = args.length > 1 ? args[1] : args[0]; + // flags exists on case (3) only + this.flags = args.length > 2 ? args[2] : null; + } + + public String getHostPath() { + return hostPath; + } + + public String getContainerPath() { + return containerPath; + } + + public String getFlags() { + return flags; + } + @Override + public int hashCode() { + final int prime = 31; + int result = 1; + result = prime * result + + ((containerPath == null) ? 0 : containerPath.hashCode()); + result = prime * result + ((flags == null) ? 0 : flags.hashCode()); + result = prime * result + + ((hostPath == null) ? 0 : hostPath.hashCode()); + return result; + } + + @Override + public boolean equals(Object obj) { + if (this == obj) + return true; + if (obj == null) + return false; + if (getClass() != obj.getClass()) + return false; + DockerContainerVolume other = (DockerContainerVolume) obj; + if (containerPath == null) { + if (other.containerPath != null) + return false; + } else if (!containerPath.equals(other.containerPath)) + return false; + if (flags == null) { + if (other.flags != null) + return false; + } else if (!flags.equals(other.flags)) + return false; + if (hostPath == null) { + if (other.hostPath != null) + return false; + } else if (!hostPath.equals(other.hostPath)) + return false; + return true; + } + + } + + /** + * Node to indicate that a job is running and loading data. + */ public static class LoadingStub { private final Object element; diff --git a/containers/org.eclipse.linuxtools.docker.ui/src/org/eclipse/linuxtools/internal/docker/ui/views/DockerExplorerLabelProvider.java b/containers/org.eclipse.linuxtools.docker.ui/src/org/eclipse/linuxtools/internal/docker/ui/views/DockerExplorerLabelProvider.java index c1649f1210..42f88aeac5 100644 --- a/containers/org.eclipse.linuxtools.docker.ui/src/org/eclipse/linuxtools/internal/docker/ui/views/DockerExplorerLabelProvider.java +++ b/containers/org.eclipse.linuxtools.docker.ui/src/org/eclipse/linuxtools/internal/docker/ui/views/DockerExplorerLabelProvider.java @@ -26,7 +26,13 @@ import org.eclipse.linuxtools.docker.core.EnumDockerStatus; import org.eclipse.linuxtools.docker.core.IDockerConnection; import org.eclipse.linuxtools.docker.core.IDockerContainer; import org.eclipse.linuxtools.docker.core.IDockerImage; +import org.eclipse.linuxtools.docker.core.IDockerPortMapping; import org.eclipse.linuxtools.internal.docker.ui.SWTImagesFactory; +import org.eclipse.linuxtools.internal.docker.ui.views.DockerExplorerContentProvider.DockerContainerLink; +import org.eclipse.linuxtools.internal.docker.ui.views.DockerExplorerContentProvider.DockerContainerLinksCategory; +import org.eclipse.linuxtools.internal.docker.ui.views.DockerExplorerContentProvider.DockerContainerPortMappingsCategory; +import org.eclipse.linuxtools.internal.docker.ui.views.DockerExplorerContentProvider.DockerContainerVolume; +import org.eclipse.linuxtools.internal.docker.ui.views.DockerExplorerContentProvider.DockerContainerVolumesCategory; import org.eclipse.linuxtools.internal.docker.ui.views.DockerExplorerContentProvider.DockerContainersCategory; import org.eclipse.linuxtools.internal.docker.ui.views.DockerExplorerContentProvider.DockerImagesCategory; import org.eclipse.linuxtools.internal.docker.ui.views.DockerExplorerContentProvider.LoadingStub; @@ -78,6 +84,15 @@ public class DockerExplorerLabelProvider implements IStyledLabelProvider, ILabel } else { return SWTImagesFactory.DESC_CONTAINER_STOPPED.createImage(); } + } else if (element instanceof DockerContainerLinksCategory + || element instanceof DockerContainerLink) { + return SWTImagesFactory.DESC_CONTAINER_LINK.createImage(); + } else if (element instanceof DockerContainerVolumesCategory + || element instanceof DockerContainerVolume) { + return SWTImagesFactory.DESC_CONTAINER_VOLUME.createImage(); + } else if (element instanceof DockerContainerPortMappingsCategory + || element instanceof IDockerPortMapping) { + return SWTImagesFactory.DESC_CONTAINER_PORT.createImage(); } else if(element instanceof LoadingStub) { return SWTImagesFactory.DESC_SYSTEM_PROCESS.createImage(); } @@ -135,7 +150,7 @@ public class DockerExplorerLabelProvider implements IStyledLabelProvider, ILabel if (!dockerImage.tags().isEmpty()) { final List<String> tags = new ArrayList<>(dockerImage.tags()); Collections.sort(tags); - messageBuilder.append(":"); + messageBuilder.append(": "); for (Iterator<String> tagIterator = tags.iterator(); tagIterator .hasNext();) { messageBuilder.append(tagIterator.next()); @@ -143,18 +158,75 @@ public class DockerExplorerLabelProvider implements IStyledLabelProvider, ILabel messageBuilder.append(", "); } } - final int startImageId = messageBuilder.length(); - messageBuilder.append(" (").append(imageShortId).append(')'); - final String message = messageBuilder.toString(); - final StyledString styledString = new StyledString(message); - // styled tags - styledString.setStyle(startTags, startImageId - startTags, StyledString.COUNTER_STYLER); - // styled image id - styledString.setStyle(startImageId, message.length() - startImageId, StyledString.QUALIFIER_STYLER); - return styledString; } - } else if (element instanceof LoadingStub) { - return new StyledString(DVMessages.getString("Loading.label")); //$NON-NLS-1$ + final int startImageId = messageBuilder.length(); + messageBuilder.append(" (").append(imageShortId).append(')'); + final String message = messageBuilder.toString(); + final StyledString styledString = new StyledString(message); + // styled tags + styledString.setStyle(startTags, startImageId - startTags, + StyledString.COUNTER_STYLER); + // styled image id + styledString.setStyle(startImageId, message.length() - startImageId, + StyledString.QUALIFIER_STYLER); + return styledString; + } else if (element instanceof DockerContainerPortMappingsCategory) { + return new StyledString(DVMessages + .getString("DockerContainerPortMappingsCategory.label")); //$NON-NLS-1$ + } else if (element instanceof IDockerPortMapping) { + final IDockerPortMapping mapping = (IDockerPortMapping) element; + final String hostMapping = mapping.getIp() + ":" + + mapping.getPublicPort() + " -> "; + final String containerMapping = Integer + .toString(mapping.getPrivatePort()); + final String mappingType = " (" + mapping.getType() + ")"; + final StyledString styledString = new StyledString( + hostMapping + containerMapping + mappingType); + styledString.setStyle( + hostMapping.length() + containerMapping.length(), + mappingType.length(), StyledString.QUALIFIER_STYLER); + return styledString; + } else if (element instanceof DockerContainerVolumesCategory) { + return new StyledString(DVMessages + .getString("DockerContainerVolumesCategory.label")); //$NON-NLS-1$ + } else if (element instanceof DockerContainerVolume) { + final DockerContainerVolume containerVolume = (DockerContainerVolume) element; + final String hostPath = containerVolume.getHostPath(); + final StyledString styledString = new StyledString(); + if (containerVolume.getHostPath() != null + && containerVolume.getContainerPath() != null) { + styledString.append(hostPath).append(" -> ") + .append(containerVolume.getContainerPath()); + } else if (containerVolume.getHostPath() == null + && containerVolume.getContainerPath() != null) { + styledString.append(containerVolume.getContainerPath()); + } + if (containerVolume.getFlags() != null) { + final int offset = styledString.length(); + styledString.append(" (" + containerVolume.getFlags() + ")"); + styledString.setStyle(offset, styledString.length() - offset, + StyledString.QUALIFIER_STYLER); + } + return styledString; + } else if (element instanceof DockerContainerLinksCategory) { + return new StyledString( + DVMessages.getString("DockerContainerLinksCategory.label")); //$NON-NLS-1$ + } else if (element instanceof DockerContainerLink) { + final DockerContainerLink containerLink = (DockerContainerLink) element; + final String containerName = containerLink.getContainerName(); + final String containerAlias = " (" + + containerLink.getContainerAlias() + ")"; + final StyledString styledString = new StyledString( + containerName + containerAlias); + styledString.setStyle(containerName.length(), + containerAlias.length(), StyledString.QUALIFIER_STYLER); + return styledString; + } else if (element instanceof String) { + return new StyledString((String) element); + } + + else if (element instanceof LoadingStub) { + return new StyledString(DVMessages.getString("Loading.label")); } return null; } |