Java tutorial
/******************************************************************************* * Copyright (c) 2015 www.DockerFoundry.cn * * All rights reserved. This program and the accompanying materials * are made available under the terms of the Apache License, * Version 2.0 (the "License"); you may not use this file except in compliance * with the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * * Contributors: * Xi Ning Wang ********************************************************************************/ package cn.dockerfoundry.ide.eclipse.explorer.ui.views; import org.eclipse.core.runtime.preferences.InstanceScope; import org.eclipse.jface.action.Action; import org.eclipse.jface.action.IMenuListener; import org.eclipse.jface.action.IMenuManager; import org.eclipse.jface.action.IToolBarManager; import org.eclipse.jface.action.MenuManager; import org.eclipse.jface.action.Separator; import org.eclipse.jface.dialogs.MessageDialog; import org.eclipse.jface.viewers.DoubleClickEvent; import org.eclipse.jface.viewers.IDoubleClickListener; import org.eclipse.jface.viewers.ISelection; import org.eclipse.jface.viewers.ISelectionChangedListener; import org.eclipse.jface.viewers.IStructuredContentProvider; import org.eclipse.jface.viewers.IStructuredSelection; import org.eclipse.jface.viewers.ITreeContentProvider; import org.eclipse.jface.viewers.LabelProvider; import org.eclipse.jface.viewers.SelectionChangedEvent; import org.eclipse.jface.viewers.TreeViewer; import org.eclipse.jface.viewers.Viewer; import org.eclipse.jface.viewers.ViewerSorter; import org.eclipse.jface.wizard.WizardDialog; import org.eclipse.swt.SWT; import org.eclipse.swt.graphics.Image; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Menu; import org.eclipse.ui.IActionBars; import org.eclipse.ui.ISharedImages; import org.eclipse.ui.IWorkbenchActionConstants; import org.eclipse.ui.PlatformUI; import org.eclipse.ui.part.DrillDownAdapter; import org.eclipse.ui.part.ViewPart; import org.osgi.service.prefs.BackingStoreException; import org.osgi.service.prefs.Preferences; import cn.dockerfoundry.ide.eclipse.explorer.ui.Activator; import cn.dockerfoundry.ide.eclipse.explorer.ui.domain.DockerConnectionContainersTreeParent; import cn.dockerfoundry.ide.eclipse.explorer.ui.domain.DockerConnectionElement; import cn.dockerfoundry.ide.eclipse.explorer.ui.domain.DockerConnectionImagesTreeParent; import cn.dockerfoundry.ide.eclipse.explorer.ui.domain.DockerConnectionTreeObject; import cn.dockerfoundry.ide.eclipse.explorer.ui.domain.DockerConnectionTreeObject.DockerConnectionContainerTreeObject; import cn.dockerfoundry.ide.eclipse.explorer.ui.domain.DockerConnectionTreeObject.DockerConnectionImageTreeObject; import cn.dockerfoundry.ide.eclipse.explorer.ui.domain.DockerConnectionTreeParent; import cn.dockerfoundry.ide.eclipse.explorer.ui.utils.ViewHelper; import cn.dockerfoundry.ide.eclipse.explorer.ui.wizards.DockerConnectionWizard; import com.spotify.docker.client.DockerCertificateException; import com.spotify.docker.client.DockerClient; import com.spotify.docker.client.DockerException; import com.spotify.docker.client.messages.Info; import com.spotify.docker.client.messages.Version; /** * This sample class demonstrates how to plug-in a new * workbench view. The view shows data obtained from the * model. The sample creates a dummy model on the fly, * but a real implementation would connect to the model * available either in this or another plug-in (e.g. the workspace). * The view is connected to the model using a content provider. * <p> * The view uses a label provider to define how model * objects should be presented in the view. Each * view can present the same model objects using * different labels and icons, if needed. Alternatively, * a single label provider can be shared between views * in order to ensure that objects of the same type are * presented in the same way everywhere. * <p> */ public class DockerExplorerView extends ViewPart { /** * The ID of the view as specified by the extension. */ public static final String ID = "cn.dockerfoundry.ide.eclipse.explorer.ui.views.DockerExplorerView"; private TreeViewer viewer; private DrillDownAdapter drillDownAdapter; private Action createDockerConnAction; private Action removeDockerConnAction; private Action dockerInfoAction; private Action dockerVersionAction; private Action doubleClickAction; /* * The content provider class is responsible for * providing objects to the view. It can wrap * existing objects in adapters or simply return * objects as-is. These objects may be sensitive * to the current input of the view, or ignore * it and always show the same content * (like Task List, for example). */ class ViewContentProvider implements IStructuredContentProvider, ITreeContentProvider { private DockerConnectionTreeParent invisibleRoot; public void inputChanged(Viewer v, Object oldInput, Object newInput) { } public void dispose() { } public Object[] getElements(Object parent) { if (parent.equals(getViewSite())) { if (invisibleRoot == null) initialize(); return getChildren(invisibleRoot); } return getChildren(parent); } public Object getParent(Object child) { if (child instanceof DockerConnectionTreeObject) { return ((DockerConnectionTreeObject) child).getParent(); } return null; } public Object[] getChildren(Object parent) { if (parent instanceof DockerConnectionTreeParent) { return ((DockerConnectionTreeParent) parent).getChildren(); } return new Object[0]; } public boolean hasChildren(Object parent) { if (parent instanceof DockerConnectionTreeParent) return ((DockerConnectionTreeParent) parent).hasChildren(); return false; } /* * We will set up a dummy model to initialize tree heararchy. * In a real code, you will connect to a real model and * expose its hierarchy. */ private void initialize() { // DockerConnectionTreeObject to1 = new DockerConnectionTreeObject("Leaf 1"); // DockerConnectionTreeObject to2 = new DockerConnectionTreeObject("Leaf 2"); // DockerConnectionTreeObject to3 = new DockerConnectionTreeObject("Leaf 3"); // DockerConnectionTreeParent p1 = new DockerConnectionTreeParent("Parent 1"); // p1.addChild(to1); // p1.addChild(to2); // p1.addChild(to3); // // DockerConnectionTreeObject to4 = new DockerConnectionTreeObject("Leaf 4"); // DockerConnectionTreeParent p2 = new DockerConnectionTreeParent("Parent 2"); // p2.addChild(to4); // // DockerConnectionTreeParent root = new DockerConnectionTreeParent("Root"); // root.addChild(p1); // root.addChild(p2); // // invisibleRoot = new DockerConnectionTreeParent(""); // invisibleRoot.addChild(root); invisibleRoot = getInitInput(); } } class ViewLabelProvider extends LabelProvider { public String getText(Object obj) { return obj.toString(); } public Image getImage(Object obj) { String imageKey = ISharedImages.IMG_OBJ_ELEMENT; if (obj instanceof DockerConnectionImagesTreeParent) imageKey = "icons/images.gif"; else if (obj instanceof DockerConnectionContainersTreeParent) imageKey = "icons/containers.gif"; else if (obj instanceof DockerConnectionImageTreeObject) imageKey = "icons/image.gif"; else if (obj instanceof DockerConnectionContainerTreeObject) imageKey = "icons/container.gif"; else if (obj instanceof DockerConnectionTreeParent) imageKey = "icons/server.gif"; return Activator.getImageDescriptor(imageKey).createImage(); // return PlatformUI.getWorkbench().getSharedImages().getImage(imageKey); } } class NameSorter extends ViewerSorter { } /** * The constructor. */ public DockerExplorerView() { } /** * This is a callback that will allow us * to create the viewer and initialize it. */ public void createPartControl(Composite parent) { viewer = new TreeViewer(parent, SWT.SINGLE | SWT.H_SCROLL | SWT.V_SCROLL); drillDownAdapter = new DrillDownAdapter(viewer); viewer.setContentProvider(new ViewContentProvider()); viewer.setLabelProvider(new ViewLabelProvider()); viewer.setSorter(new NameSorter()); viewer.setInput(getInitInput()); // Create the help context id for the viewer's control PlatformUI.getWorkbench().getHelpSystem().setHelp(viewer.getControl(), "cn.dockerfoundry.ide.eclipse.explorer.ui.viewer"); makeActions(); hookContextMenu(); hookSingleClickAction(); hookDoubleClickAction(); contributeToActionBars(); } private DockerConnectionTreeParent getInitInput() { DockerConnectionTreeParent invisibleRoot = new DockerConnectionTreeParent("invisibleRoot", null); Preferences preferences = InstanceScope.INSTANCE.getNode(Activator.PLUGIN_ID); try { String[] childrenNames = preferences.childrenNames(); if (childrenNames != null) { for (int i = 0; i < childrenNames.length; i++) { Preferences sub1 = preferences.node(childrenNames[i]); String name = sub1.get("name", ""); boolean isUseDefault = sub1.getBoolean("isUseDefault", true); boolean isUseUnixSocket = sub1.getBoolean("isUseUnixSocket", false); String socketPath = sub1.get("socketPath", ""); boolean isUseHTTPS = sub1.getBoolean("isUseHTTPS", false); String host = sub1.get("host", ""); boolean isEnableAuth = sub1.getBoolean("isEnableAuth", false); String authPath = sub1.get("authPath", ""); DockerConnectionElement connElem = new DockerConnectionElement(); connElem.setAuthPath(authPath); connElem.setEnableAuth(isEnableAuth); connElem.setHost(host); connElem.setName(name); connElem.setSocketPath(socketPath); connElem.setUseDefault(isUseDefault); connElem.setUseHTTPS(isUseHTTPS); connElem.setUseUnixSocket(isUseUnixSocket); String connName = name; if (connElem.isUseDefault()) { connName += "[Default]"; } else if (connElem.isUseHTTPS()) { connName += "[" + connElem.getHost() + "]"; } DockerConnectionTreeParent conn = new DockerConnectionTreeParent(connName, connElem); DockerConnectionTreeParent containersTreeParent = new DockerConnectionContainersTreeParent( "Containers", connElem); conn.addChild(containersTreeParent); DockerConnectionTreeParent imagesTreeParent = new DockerConnectionImagesTreeParent("Images", connElem); conn.addChild(imagesTreeParent); invisibleRoot.addChild(conn); } } } catch (BackingStoreException e) { e.printStackTrace(); } return invisibleRoot; } private void hookContextMenu() { MenuManager menuMgr = new MenuManager("#PopupMenu"); menuMgr.setRemoveAllWhenShown(true); menuMgr.addMenuListener(new IMenuListener() { public void menuAboutToShow(IMenuManager manager) { DockerExplorerView.this.fillContextMenu(manager); } }); Menu menu = menuMgr.createContextMenu(viewer.getControl()); viewer.getControl().setMenu(menu); getSite().registerContextMenu(menuMgr, viewer); } private void contributeToActionBars() { IActionBars bars = getViewSite().getActionBars(); fillLocalPullDown(bars.getMenuManager()); fillLocalToolBar(bars.getToolBarManager()); } private void fillLocalPullDown(IMenuManager manager) { manager.add(createDockerConnAction); manager.add(new Separator()); manager.add(removeDockerConnAction); Object selectedElem = getSelectedElement(); removeDockerConnAction.setEnabled(isDockerConnectionElem(selectedElem)); manager.add(new Separator()); manager.add(dockerInfoAction); manager.add(dockerVersionAction); } private void fillContextMenu(IMenuManager manager) { manager.add(createDockerConnAction); manager.add(removeDockerConnAction); Object selectedElem = getSelectedElement(); removeDockerConnAction.setEnabled(isDockerConnectionElem(selectedElem)); manager.add(new Separator()); manager.add(dockerInfoAction); manager.add(dockerVersionAction); manager.add(new Separator()); // drillDownAdapter.addNavigationActions(manager); // Other plug-ins can contribute there actions here manager.add(new Separator(IWorkbenchActionConstants.MB_ADDITIONS)); } private void fillLocalToolBar(IToolBarManager manager) { manager.add(createDockerConnAction); manager.add(removeDockerConnAction); Object selectedElem = getSelectedElement(); removeDockerConnAction.setEnabled(isDockerConnectionElem(selectedElem)); manager.add(new Separator()); manager.add(dockerInfoAction); manager.add(dockerVersionAction); manager.add(new Separator()); drillDownAdapter.addNavigationActions(manager); } private void makeActions() { createDockerConnAction = new Action() { public void run() { //showMessage("Action 1 executed"); DockerConnectionWizard wizard = new DockerConnectionWizard(viewer); WizardDialog dialog = new WizardDialog(viewer.getControl().getShell(), wizard); // dialog.create(); dialog.open(); } }; createDockerConnAction.setText("Create Docker Connection..."); createDockerConnAction.setToolTipText("Create the connection to talk with Docker..."); createDockerConnAction.setImageDescriptor( PlatformUI.getWorkbench().getSharedImages().getImageDescriptor(ISharedImages.IMG_OBJ_ADD)); removeDockerConnAction = new Action() { public void run() { if (viewer.getSelection().isEmpty()) { return; } viewer.getTree().setRedraw(false); System.out.println(viewer.getSelection()); Object selectedElem = getSelectedElement(); if (isDockerConnectionElem(selectedElem)) { ((DockerConnectionTreeParent) selectedElem).getParent() .removeChild((DockerConnectionTreeParent) selectedElem); } viewer.getTree().setRedraw(true); viewer.refresh(true); } }; removeDockerConnAction.setText("Remove Docker Connection"); removeDockerConnAction.setToolTipText("Remove the connection to talk with Docker..."); removeDockerConnAction.setImageDescriptor( PlatformUI.getWorkbench().getSharedImages().getImageDescriptor(ISharedImages.IMG_TOOL_DELETE)); dockerInfoAction = new Action() { public void run() { ISelection selection = viewer.getSelection(); Object obj = ((IStructuredSelection) selection).getFirstElement(); if (obj instanceof DockerConnectionTreeParent) { DockerConnectionTreeParent elem = (DockerConnectionTreeParent) obj; if (elem != null && elem.getConn() != null) { try { DockerClient client = elem.getConn().getDockerClient(); Info info = client.info(); showMessage(info.toString()); } catch (DockerCertificateException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (DockerException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } } }; dockerInfoAction.setText("Docker Info"); dockerInfoAction.setToolTipText("Display system-wide information - [info]"); dockerInfoAction.setImageDescriptor(Activator.getImageDescriptor("icons/info.gif")); dockerVersionAction = new Action() { public void run() { ISelection selection = viewer.getSelection(); Object obj = ((IStructuredSelection) selection).getFirstElement(); if (obj instanceof DockerConnectionTreeParent) { DockerConnectionTreeParent elem = (DockerConnectionTreeParent) obj; if (elem != null && elem.getConn() != null) { try { DockerClient client = elem.getConn().getDockerClient(); Version version = client.version(); showMessage(version.toString()); } catch (DockerCertificateException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (DockerException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } } }; dockerVersionAction.setText("Docker Version"); dockerVersionAction.setToolTipText("Show the Docker version information - [version]"); dockerVersionAction.setImageDescriptor(Activator.getImageDescriptor("icons/version.gif")); doubleClickAction = new Action() { public void run() { ISelection selection = viewer.getSelection(); Object obj = ((IStructuredSelection) selection).getFirstElement(); if (obj instanceof DockerConnectionImagesTreeParent) { DockerConnectionImagesTreeParent elem = (DockerConnectionImagesTreeParent) obj; if (elem != null && elem.getConn() != null) try { ViewHelper.showDockerImages(elem.getConn().getDockerClient()); } catch (DockerCertificateException e) { // TODO Auto-generated catch block e.printStackTrace(); } } else if (obj instanceof DockerConnectionContainersTreeParent) { DockerConnectionContainersTreeParent elem = (DockerConnectionContainersTreeParent) obj; if (elem != null && elem.getConn() != null) try { ViewHelper.showDockerContainers(elem.getConn().getDockerClient()); } catch (DockerCertificateException e) { // TODO Auto-generated catch block e.printStackTrace(); } } else if (obj instanceof DockerConnectionTreeParent) { } else if (obj instanceof DockerConnectionContainerTreeObject) { System.out.println(obj); } else if (obj instanceof DockerConnectionImageTreeObject) { System.out.println(obj); } if (obj != null) { if (viewer.getExpandedState(obj)) { viewer.collapseToLevel(obj, 2); } else { viewer.expandToLevel(obj, 2); } } } }; } private void hookSingleClickAction() { viewer.addSelectionChangedListener(new ISelectionChangedListener() { @Override public void selectionChanged(SelectionChangedEvent arg0) { doubleClickAction.run(); Object selectedElem = getSelectedElement(); removeDockerConnAction.setEnabled(isDockerConnectionElem(selectedElem)); } }); } private void hookDoubleClickAction() { viewer.addDoubleClickListener(new IDoubleClickListener() { public void doubleClick(DoubleClickEvent event) { doubleClickAction.run(); } }); } private void showMessage(String message) { MessageDialog.openInformation(viewer.getControl().getShell(), "Docker Explorer", message); } /** * Passing the focus request to the viewer's control. */ public void setFocus() { viewer.getControl().setFocus(); } private Object getSelectedElement() { if (viewer.getSelection() == null || !(viewer.getSelection() instanceof IStructuredSelection)) return null; Object obj = ((IStructuredSelection) viewer.getSelection()).getFirstElement(); return obj; } private boolean isDockerConnectionElem(Object selectedElem) { if (selectedElem != null && selectedElem instanceof DockerConnectionTreeParent && !(selectedElem instanceof DockerConnectionContainersTreeParent) && !(selectedElem instanceof DockerConnectionImagesTreeParent)) { return true; } return false; } }