Java tutorial
/* * Copyright 2008 the original author or authors. * * Licensed under 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. */ package org.openehealth.ipf.tools.manager.connection.ui.view; import java.util.Observable; import java.util.Observer; import org.eclipse.core.runtime.IAdaptable; import org.eclipse.jface.action.GroupMarker; import org.eclipse.jface.action.IMenuListener; import org.eclipse.jface.action.IMenuManager; import org.eclipse.jface.action.IStatusLineManager; import org.eclipse.jface.action.IToolBarManager; import org.eclipse.jface.action.MenuManager; import org.eclipse.jface.action.Separator; import org.eclipse.jface.viewers.ISelectionChangedListener; import org.eclipse.jface.viewers.SelectionChangedEvent; import org.eclipse.jface.viewers.TreeViewer; import org.eclipse.jface.viewers.TreeViewerColumn; import org.eclipse.jface.viewers.Viewer; import org.eclipse.swt.SWT; import org.eclipse.swt.events.KeyEvent; import org.eclipse.swt.events.KeyListener; import org.eclipse.swt.events.MouseEvent; import org.eclipse.swt.events.MouseListener; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Control; import org.eclipse.swt.widgets.Display; import org.eclipse.swt.widgets.Menu; import org.eclipse.ui.IEditorDescriptor; import org.eclipse.ui.IEditorPart; import org.eclipse.ui.IEditorReference; import org.eclipse.ui.IEditorRegistry; import org.eclipse.ui.IWorkbenchActionConstants; import org.eclipse.ui.IWorkbenchPage; import org.eclipse.ui.PartInitException; import org.eclipse.ui.PlatformUI; import org.eclipse.ui.part.DrillDownAdapter; import org.eclipse.ui.part.ViewPart; import org.openehealth.ipf.tools.manager.connection.Activator; import org.openehealth.ipf.tools.manager.connection.ConnectionEvent; import org.openehealth.ipf.tools.manager.connection.IConnectionConfiguration; import org.openehealth.ipf.tools.manager.connection.IJMXConnectionManager; import org.openehealth.ipf.tools.manager.connection.ui.editor.ConnectionEditorInput; import org.openehealth.ipf.tools.manager.connection.ui.jobs.OpenJMXConnectionJob; import org.openehealth.ipf.tools.manager.connection.ui.tree.ConnectionNode; import org.openehealth.ipf.tools.manager.connection.ui.tree.JMXContentProvider; import org.openehealth.ipf.tools.manager.connection.ui.tree.Node; import org.openehealth.ipf.tools.manager.connection.ui.utils.ConnectionUtils; import org.openehealth.ipf.tools.manager.connection.ui.utils.jobs.JobUtils; import org.openehealth.ipf.tools.manager.connection.ui.utils.messages.Messages; import org.openehealth.ipf.tools.manager.connection.ui.utils.sorter.TreeColumnViewerSorter; /** * View which visualizes the connection configurations. * * @author Mitko Kolev */ public class ConnectionView extends ViewPart implements ISelectionChangedListener, Observer, MouseListener, KeyListener { private DrillDownAdapter drillDownAdapter; private TreeViewer viewer; // a fixed provider (JMX) can have different providers in the future. private JMXContentProvider contentProvider; /* * (non-Javadoc) * * @see * org.eclipse.ui.part.WorkbenchPart#createPartControl(org.eclipse.swt.widgets * .Composite) */ @Override public void createPartControl(Composite parent) { Activator.getDefault().info("Creating the connection editor"); IJMXConnectionManager jMXConnectionManager = Activator.getDefault().getJMXConnectionManager(); viewer = new TreeViewer(parent, SWT.MULTI | SWT.H_SCROLL | SWT.V_SCROLL); drillDownAdapter = new DrillDownAdapter(viewer); // handle the content provider contentProvider = new JMXContentProvider(this.getViewSite(), jMXConnectionManager); viewer.setContentProvider(contentProvider); viewer.setUseHashlookup(true); viewer.getTree().setLinesVisible(true); viewer.getTree().setHeaderVisible(true); TreeViewerColumn tc0 = new TreeViewerColumn(viewer, SWT.CENTER); TreeViewerColumn tc1 = new TreeViewerColumn(viewer, SWT.CENTER); TreeViewerColumn tc2 = new TreeViewerColumn(viewer, SWT.CENTER); tc0.getColumn().setText(Messages.getLabelString("connection.name")); tc0.setLabelProvider(new JMXConnectionLabelProvider(0)); tc0.getColumn().setWidth(140); tc1.getColumn().setText(Messages.getLabelString("connection.host")); tc1.setLabelProvider(new JMXConnectionLabelProvider(1)); tc1.getColumn().setWidth(100); tc2.getColumn().setText(Messages.getLabelString("connection.port")); tc2.setLabelProvider(new JMXConnectionLabelProvider(2)); tc2.getColumn().setWidth(60); new TreeColumnViewerSorter(viewer, tc0) { @Override protected int doCompare(Viewer viewer, Object e1, Object e2) { IAdaptable adapter1 = (IAdaptable) e1; IAdaptable adapter2 = (IAdaptable) e2; IConnectionConfiguration info1 = (IConnectionConfiguration) adapter1 .getAdapter(IConnectionConfiguration.class); IConnectionConfiguration info2 = (IConnectionConfiguration) adapter2 .getAdapter(IConnectionConfiguration.class); return info1.getName().compareTo(info2.getName()); } }; new TreeColumnViewerSorter(viewer, tc1) { @Override protected int doCompare(Viewer viewer, Object e1, Object e2) { IAdaptable adapter1 = (IAdaptable) e1; IAdaptable adapter2 = (IAdaptable) e2; IConnectionConfiguration info1 = (IConnectionConfiguration) adapter1 .getAdapter(IConnectionConfiguration.class); IConnectionConfiguration info2 = (IConnectionConfiguration) adapter2 .getAdapter(IConnectionConfiguration.class); return info1.getHost().compareTo(info2.getHost()); } }; new TreeColumnViewerSorter(viewer, tc2) { @Override protected int doCompare(Viewer viewer, Object e1, Object e2) { IAdaptable adapter1 = (IAdaptable) e1; IAdaptable adapter2 = (IAdaptable) e2; IConnectionConfiguration info1 = (IConnectionConfiguration) adapter1 .getAdapter(IConnectionConfiguration.class); IConnectionConfiguration info2 = (IConnectionConfiguration) adapter2 .getAdapter(IConnectionConfiguration.class); return new Integer(info1.getPort()).compareTo(new Integer(info2.getPort())); } }; viewer.setInput(getViewSite()); viewer.getTree().addMouseListener(this); this.getSite().setSelectionProvider(viewer); viewer.addSelectionChangedListener(this); // add a popup menu createContextMenu(viewer); jMXConnectionManager.addObserver(this); } private void createContextMenu(TreeViewer viewer) { final MenuManager menuMgr = new MenuManager(); menuMgr.setRemoveAllWhenShown(true); menuMgr.addMenuListener(new IMenuListener() { public void menuAboutToShow(IMenuManager manager) { manager.add(new Separator(IWorkbenchActionConstants.MB_ADDITIONS)); // menuMgr.add(new Separator()); // drillDownAdapter.addNavigationActions(menuMgr); } }); menuMgr.add(new GroupMarker(IWorkbenchActionConstants.MB_ADDITIONS)); getSite().registerContextMenu(menuMgr, viewer); menuMgr.add(new Separator()); drillDownAdapter.addNavigationActions(menuMgr); // add the properties action // menuMgr.add(new Separator()); // menuMgr.add(new PropertyDialogAction(getSite(), viewer)); Control viewerControl = viewer.getControl(); Menu menu = menuMgr.createContextMenu(viewerControl); viewerControl.setMenu(menu); } /* * (non-Javadoc) * * @see org.eclipse.ui.part.WorkbenchPart#setFocus() */ @Override public void setFocus() { getSite().getPage().activate(this); getSite().setSelectionProvider(viewer); } /** * @see org.eclipse.jface.viewers.ISelectionChangedListener#selectionChanged(org.eclipse.jface.viewers.SelectionChangedEvent) */ public void selectionChanged(SelectionChangedEvent event) { IConnectionConfiguration connectionConfiguration = ConnectionUtils .getSingleConnectionConfigurationObject(event.getSelection()); if (connectionConfiguration == null) { return; } else { IStatusLineManager statusline = this.getViewSite().getActionBars().getStatusLineManager(); statusline.setMessage(null, connectionConfiguration.getName()); } } /* * (non-Javadoc) * * @see java.util.Observer#update(java.util.Observable, java.lang.Object) */ public void update(Observable o, Object arg) { final ConnectionEvent event = (ConnectionEvent) arg; final IConnectionConfiguration connectionConfiguration = event.getConnectionConfigurationContext(); if (event.getType() == ConnectionEvent.CONNECTION_REMOVED) { IWorkbenchPage page = this.getSite().getPage(); ConnectionRemovedRunnable runnable = new ConnectionRemovedRunnable(connectionConfiguration, page); JobUtils.runSafe(runnable); } else if ((event.getType() == ConnectionEvent.JMX_CONNECTION_CLOSED) || (event.getType() == ConnectionEvent.JMX_CONNECTION_OPEN)) { // update the table UpdateTreeRunnable runnable = new UpdateTreeRunnable(connectionConfiguration); JobUtils.runSafe(runnable); } if (event.getType() == ConnectionEvent.CONNECTION_ADDED) { // set the table input AddNewConnectionRunnable runnable = new AddNewConnectionRunnable(connectionConfiguration); JobUtils.runSafe(runnable); } } final class ConnectionRemovedRunnable implements Runnable { private final IConnectionConfiguration connectionConfiguration; private final IWorkbenchPage page; public ConnectionRemovedRunnable(IConnectionConfiguration connectionConfiguration, IWorkbenchPage page) { this.connectionConfiguration = connectionConfiguration; this.page = page; } public void run() { // update the table ConnectionNode root = contentProvider.getTree(); // update the table if (root.hasChildren()) { Node[] nodes = root.getChildren(); for (int t = 0; t < nodes.length; t++) { Node n = nodes[t]; IConnectionConfiguration treeConnectionConfiguration = (IConnectionConfiguration) n .getAdapter(IConnectionConfiguration.class); if (treeConnectionConfiguration != null) { if (treeConnectionConfiguration.equals(connectionConfiguration)) { root.removeChild(n); } } } closeAllEditors(connectionConfiguration); viewer.refresh(); } ConnectionEditorInput connectionEditorInput = new ConnectionEditorInput(connectionConfiguration); IEditorPart deletedConnectionEditor = page.findEditor(connectionEditorInput); if (deletedConnectionEditor != null) { page.closeEditor(deletedConnectionEditor, false); } } private void closeAllEditors(IConnectionConfiguration connectionConfiguration) { if (connectionConfiguration == null) { return; } IEditorReference[] references = page.getEditorReferences(); for (IEditorReference reference : references) { IEditorPart editor = reference.getEditor(false); try { IConnectionConfiguration editorConnectionConfiguration = (IConnectionConfiguration) reference .getEditorInput().getAdapter(IConnectionConfiguration.class); if (editorConnectionConfiguration != null && editorConnectionConfiguration.equals(connectionConfiguration)) { page.closeEditor(editor, true); } } catch (PartInitException pe) { Activator.getDefault().error("Cannot close Editor for connetion " + connectionConfiguration, pe); continue; } } } } final class AddNewConnectionRunnable implements Runnable { IConnectionConfiguration connectionConfiguration; AddNewConnectionRunnable(IConnectionConfiguration connectionConfiguration) { this.connectionConfiguration = connectionConfiguration; } public void run() { ConnectionNode root = contentProvider.getTree(); // update the table if (root.hasChildren()) { Node[] nodes = root.getChildren(); for (int t = 0; t < nodes.length; t++) { Node n = nodes[t]; IConnectionConfiguration treeConnectionConfiguration = (IConnectionConfiguration) n .getAdapter(IConnectionConfiguration.class); if (treeConnectionConfiguration != null) { if (treeConnectionConfiguration.equals(connectionConfiguration)) { // we have it already Activator.getDefault().error("Adding a node which already exists!"); return; } } } } root.addChild(new ConnectionNode(connectionConfiguration, connectionConfiguration.getName())); viewer.refresh(); } } final class UpdateTreeRunnable implements Runnable { private final IConnectionConfiguration connectionConfiguration; public UpdateTreeRunnable(IConnectionConfiguration connectionConfiguration) { this.connectionConfiguration = connectionConfiguration; } public void run() { viewer.update(new ConnectionNode(connectionConfiguration, connectionConfiguration.getName()), null); IToolBarManager manager = ConnectionView.this.getViewSite().getActionBars().getToolBarManager(); manager.update(true); } } private void openDefaultEditor() { IJMXConnectionManager jMXConnectionManager = Activator.getDefault().getJMXConnectionManager(); IConnectionConfiguration connectionConfiguration = ConnectionUtils .getSingleConnectionConfigurationObject(viewer.getSelection()); if (connectionConfiguration == null) { return; } ConnectionEditorInput input = new ConnectionEditorInput(connectionConfiguration); try { String editorId = getDefaultEditorId(connectionConfiguration); if (editorId != null) { this.getSite().getPage().openEditor(input, editorId, true); } } catch (PartInitException e1) { Activator.getDefault().error("Cannto open view", e1); } if (!jMXConnectionManager.isOpen(connectionConfiguration)) { Activator.getDefault().info("Openning connection: " + connectionConfiguration); new OpenJMXConnectionJob(Display.getCurrent(), Activator.getDefault().getJMXConnectionManager(), connectionConfiguration).schedule(); } } private String getDefaultEditorId(IConnectionConfiguration connectionConfiguration) { IEditorRegistry editorReg = PlatformUI.getWorkbench().getEditorRegistry(); IEditorDescriptor descriptor = editorReg.getDefaultEditor(connectionConfiguration.getName() + "." + ConnectionEditorInput.CONNECTION_EDITOR_FILE_EXTENSION_ID); if (descriptor != null) { return descriptor.getId(); } return null; } public void keyPressed(KeyEvent e) { setFocus(); } public void keyReleased(KeyEvent e) { if (e.keyCode == SWT.CR) { openDefaultEditor(); } } @Override public void dispose() { Activator.getDefault().getJMXConnectionManager().deleteObserver(this); super.dispose(); } /** * @see org.eclipse.swt.events.MouseListener#mouseDoubleClick(org.eclipse.swt.events.MouseEvent) */ public void mouseDoubleClick(MouseEvent e) { openDefaultEditor(); } /** * @see org.eclipse.swt.events.MouseListener#mouseDown(org.eclipse.swt.events.MouseEvent) */ public void mouseDown(MouseEvent e) { setFocus(); } /** * @see org.eclipse.swt.events.MouseListener#mouseUp(org.eclipse.swt.events.MouseEvent) */ public void mouseUp(MouseEvent e) { } }