Java tutorial
/******************************************************************************* * Copyright (c) 2009, 2011 IBM Corporation 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: * IBM Corporation - initial API and implementation *******************************************************************************/ package org.eclipse.pde.api.tools.ui.internal.views; import org.eclipse.core.runtime.CoreException; import org.eclipse.jdt.core.Flags; import org.eclipse.jdt.ui.JavaUI; import org.eclipse.jface.action.Action; import org.eclipse.jface.action.IAction; import org.eclipse.jface.action.IToolBarManager; import org.eclipse.jface.action.Separator; import org.eclipse.jface.resource.ImageDescriptor; import org.eclipse.jface.viewers.DoubleClickEvent; import org.eclipse.jface.viewers.IDoubleClickListener; import org.eclipse.jface.viewers.ISelection; import org.eclipse.jface.viewers.IStructuredSelection; import org.eclipse.jface.viewers.ITreeContentProvider; import org.eclipse.jface.viewers.LabelProvider; import org.eclipse.jface.viewers.TreeViewer; import org.eclipse.jface.viewers.Viewer; import org.eclipse.jface.viewers.ViewerComparator; import org.eclipse.pde.api.tools.internal.ApiBaselineManager; import org.eclipse.pde.api.tools.internal.provisional.ApiPlugin; import org.eclipse.pde.api.tools.internal.provisional.ISession; import org.eclipse.pde.api.tools.internal.provisional.ISessionListener; import org.eclipse.pde.api.tools.internal.provisional.ISessionManager; import org.eclipse.pde.api.tools.internal.provisional.ITreeModel; import org.eclipse.pde.api.tools.internal.provisional.ITreeNode; import org.eclipse.pde.api.tools.internal.provisional.comparator.DeltaProcessor; import org.eclipse.pde.api.tools.internal.provisional.comparator.IDelta; import org.eclipse.pde.api.tools.internal.provisional.model.IApiBaseline; import org.eclipse.pde.api.tools.internal.provisional.model.IApiComponent; import org.eclipse.pde.api.tools.ui.internal.ApiImageDescriptor; import org.eclipse.pde.api.tools.ui.internal.ApiUIPlugin; import org.eclipse.pde.api.tools.ui.internal.IApiToolsConstants; import org.eclipse.pde.api.tools.ui.internal.IApiToolsHelpContextIds; import org.eclipse.pde.api.tools.ui.internal.SWTFactory; import org.eclipse.pde.api.tools.ui.internal.actions.CollapseAllAction; import org.eclipse.pde.api.tools.ui.internal.actions.ExpandAllAction; import org.eclipse.pde.api.tools.ui.internal.actions.ExportSessionAction; import org.eclipse.pde.api.tools.ui.internal.actions.NavigateAction; import org.eclipse.pde.api.tools.ui.internal.actions.RemoveActiveSessionAction; import org.eclipse.pde.api.tools.ui.internal.actions.RemoveAllSessionsAction; import org.eclipse.pde.api.tools.ui.internal.actions.SelectSessionAction; import org.eclipse.swt.SWT; import org.eclipse.swt.custom.ViewForm; import org.eclipse.swt.graphics.Image; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Label; import org.eclipse.ui.IActionBars; import org.eclipse.ui.IViewSite; import org.eclipse.ui.PartInitException; import org.eclipse.ui.PlatformUI; import org.eclipse.ui.actions.ActionFactory; import org.eclipse.ui.part.ViewPart; import org.eclipse.ui.views.properties.IPropertySheetPage; import org.eclipse.ui.views.properties.PropertySheetPage; /** * The class is used to show API Tools task results in a tree view. */ public class APIToolingView extends ViewPart implements ISessionListener { /** * The ID of the view as specified by the extension. */ public static final String ID = "org.eclipse.pde.api.tools.ui.views.apitooling.views.apitoolingview"; //$NON-NLS-1$ public TreeViewer viewer; Label sessionDescription = null; IAction removeActiveSessionAction; IAction removeAllSessionsAction; IAction selectSessionAction; Action doubleClickAction; ExportSessionAction exportSessionAction; NavigateAction nextAction; NavigateAction previousAction; ExpandAllAction expandallAction; CollapseAllAction collapseallAction; private IPropertySheetPage page; class ViewContentProvider implements ITreeContentProvider { ITreeModel model; @Override public void inputChanged(Viewer v, Object oldInput, Object newInput) { this.model = null; } @Override public void dispose() { } @Override public Object[] getElements(Object parent) { if (parent instanceof ISession) { ISession session = (ISession) parent; if (this.model == null) { this.model = session.getModel(); } return getChildren(this.model.getRoot()); } return getChildren(parent); } @Override public Object getParent(Object child) { return null; } @Override public Object[] getChildren(Object parent) { if (parent instanceof ITreeNode) { return ((ITreeNode) parent).getChildren(); } return new Object[0]; } @Override public boolean hasChildren(Object parent) { if (parent instanceof ITreeNode) { return ((ITreeNode) parent).hasChildren(); } return false; } } class ViewLabelProvider extends LabelProvider { @Override public String getText(Object obj) { return obj.toString(); } @Override public Image getImage(Object obj) { if (obj instanceof ITreeNode) { ITreeNode treeNode = (ITreeNode) obj; switch (treeNode.getId()) { case ITreeNode.CLASS: return JavaUI.getSharedImages().getImage(org.eclipse.jdt.ui.ISharedImages.IMG_OBJS_CLASS); case ITreeNode.INTERFACE: return JavaUI.getSharedImages().getImage(org.eclipse.jdt.ui.ISharedImages.IMG_OBJS_INTERFACE); case ITreeNode.ANNOTATION: return JavaUI.getSharedImages().getImage(org.eclipse.jdt.ui.ISharedImages.IMG_OBJS_ANNOTATION); case ITreeNode.ENUM: return JavaUI.getSharedImages().getImage(org.eclipse.jdt.ui.ISharedImages.IMG_OBJS_ENUM); case ITreeNode.PACKAGE: return JavaUI.getSharedImages().getImage(org.eclipse.jdt.ui.ISharedImages.IMG_OBJS_PACKAGE); default: break; } Object data = treeNode.getData(); if (data instanceof IDelta) { IDelta delta = (IDelta) data; Image image = getDeltaElementImage(delta); if (image != null) { int flags = (DeltaProcessor.isCompatible(delta) ? ApiImageDescriptor.SUCCESS : ApiImageDescriptor.ERROR); ImageDescriptor descriptor = ImageDescriptor.createFromImage(image); ApiImageDescriptor desc = new ApiImageDescriptor(descriptor, flags); return ApiUIPlugin.getImage(desc); } } } return null; } private Image getDeltaElementImage(IDelta delta) { switch (delta.getFlags()) { case IDelta.API_FIELD: case IDelta.FIELD: { int modifiers = delta.getNewModifiers(); switch (delta.getKind()) { case IDelta.REMOVED: { modifiers = delta.getOldModifiers(); break; } default: break; } if (Flags.isPublic(modifiers)) { return JavaUI.getSharedImages().getImage(org.eclipse.jdt.ui.ISharedImages.IMG_FIELD_PUBLIC); } else if (Flags.isProtected(modifiers)) { return JavaUI.getSharedImages().getImage(org.eclipse.jdt.ui.ISharedImages.IMG_FIELD_PROTECTED); } else if (Flags.isPrivate(modifiers)) { return JavaUI.getSharedImages().getImage(org.eclipse.jdt.ui.ISharedImages.IMG_FIELD_PRIVATE); } else { return JavaUI.getSharedImages().getImage(org.eclipse.jdt.ui.ISharedImages.IMG_FIELD_DEFAULT); } } case IDelta.METHOD: case IDelta.METHOD_MOVED_DOWN: case IDelta.METHOD_MOVED_UP: case IDelta.METHOD_WITH_DEFAULT_VALUE: case IDelta.METHOD_WITHOUT_DEFAULT_VALUE: case IDelta.CONSTRUCTOR: case IDelta.CLINIT: { int modifiers = delta.getNewModifiers(); switch (delta.getKind()) { case IDelta.REMOVED: { modifiers = delta.getOldModifiers(); break; } default: break; } if (Flags.isPublic(modifiers)) { return JavaUI.getSharedImages().getImage(org.eclipse.jdt.ui.ISharedImages.IMG_OBJS_PUBLIC); } else if (Flags.isProtected(modifiers)) { return JavaUI.getSharedImages().getImage(org.eclipse.jdt.ui.ISharedImages.IMG_OBJS_PROTECTED); } else if (Flags.isPrivate(modifiers)) { return JavaUI.getSharedImages().getImage(org.eclipse.jdt.ui.ISharedImages.IMG_OBJS_PRIVATE); } else { return JavaUI.getSharedImages() .getImage(org.eclipse.jdt.ui.ISharedImages.IMG_OBJS_CLASS_DEFAULT); } } default: break; } switch (delta.getElementType()) { case IDelta.ANNOTATION_ELEMENT_TYPE: return JavaUI.getSharedImages().getImage(org.eclipse.jdt.ui.ISharedImages.IMG_OBJS_ANNOTATION); case IDelta.ENUM_ELEMENT_TYPE: return JavaUI.getSharedImages().getImage(org.eclipse.jdt.ui.ISharedImages.IMG_OBJS_ENUM); case IDelta.CLASS_ELEMENT_TYPE: return JavaUI.getSharedImages().getImage(org.eclipse.jdt.ui.ISharedImages.IMG_OBJS_CLASS); case IDelta.INTERFACE_ELEMENT_TYPE: return JavaUI.getSharedImages().getImage(org.eclipse.jdt.ui.ISharedImages.IMG_OBJS_INTERFACE); case IDelta.FIELD_ELEMENT_TYPE: { int modifiers = delta.getNewModifiers(); switch (delta.getKind()) { case IDelta.REMOVED: { modifiers = delta.getOldModifiers(); break; } default: break; } if (Flags.isPublic(modifiers)) { return JavaUI.getSharedImages().getImage(org.eclipse.jdt.ui.ISharedImages.IMG_FIELD_PUBLIC); } else if (Flags.isProtected(modifiers)) { return JavaUI.getSharedImages().getImage(org.eclipse.jdt.ui.ISharedImages.IMG_FIELD_PROTECTED); } else if (Flags.isPrivate(modifiers)) { return JavaUI.getSharedImages().getImage(org.eclipse.jdt.ui.ISharedImages.IMG_FIELD_PRIVATE); } else { return JavaUI.getSharedImages().getImage(org.eclipse.jdt.ui.ISharedImages.IMG_FIELD_DEFAULT); } } case IDelta.METHOD_ELEMENT_TYPE: case IDelta.CONSTRUCTOR_ELEMENT_TYPE: { int modifiers = delta.getNewModifiers(); switch (delta.getKind()) { case IDelta.REMOVED: { modifiers = delta.getOldModifiers(); break; } default: break; } if (Flags.isPublic(modifiers)) { return JavaUI.getSharedImages().getImage(org.eclipse.jdt.ui.ISharedImages.IMG_OBJS_PUBLIC); } else if (Flags.isProtected(modifiers)) { return JavaUI.getSharedImages().getImage(org.eclipse.jdt.ui.ISharedImages.IMG_OBJS_PROTECTED); } else if (Flags.isPrivate(modifiers)) { return JavaUI.getSharedImages().getImage(org.eclipse.jdt.ui.ISharedImages.IMG_OBJS_PRIVATE); } else { return JavaUI.getSharedImages() .getImage(org.eclipse.jdt.ui.ISharedImages.IMG_OBJS_CLASS_DEFAULT); } } case IDelta.TYPE_PARAMETER_ELEMENT_TYPE: return JavaUI.getSharedImages().getImage(org.eclipse.jdt.ui.ISharedImages.IMG_OBJS_PUBLIC); case IDelta.API_BASELINE_ELEMENT_TYPE: case IDelta.API_COMPONENT_ELEMENT_TYPE: { String componentVersionId = delta.getComponentVersionId(); IApiComponent component = null; if (componentVersionId != null) { int indexOfOpen = componentVersionId.lastIndexOf('('); String componentID = componentVersionId.substring(0, indexOfOpen); IApiBaseline baseline = ApiBaselineManager.getManager().getWorkspaceBaseline(); if (baseline != null) { IApiComponent apiComponent = baseline.getApiComponent(componentID); if (apiComponent != null) { component = apiComponent; } } } if (component != null) { if (component.isSystemComponent()) { return ApiUIPlugin.getSharedImage(IApiToolsConstants.IMG_OBJ_API_SYSTEM_LIBRARY); } try { if (component.isFragment()) { return ApiUIPlugin.getSharedImage(IApiToolsConstants.IMG_OBJ_FRAGMENT); } } catch (CoreException e) { ApiPlugin.log(e); } } return ApiUIPlugin.getSharedImage(IApiToolsConstants.IMG_OBJ_BUNDLE); } default: break; } return null; } } /** * The constructor. */ public APIToolingView() { } /** * This is a callback that will allow us to create the viewer and initialize * it. */ @Override public void createPartControl(Composite parent) { ViewForm form = new ViewForm(parent, SWT.FLAT); PlatformUI.getWorkbench().getHelpSystem().setHelp(form, IApiToolsHelpContextIds.API_TOOLING_VIEW); this.sessionDescription = SWTFactory.createLabel(form, null, 1); form.setTopCenterSeparate(true); form.setTopCenter(this.sessionDescription); this.viewer = new TreeViewer(form, SWT.MULTI | SWT.H_SCROLL | SWT.V_SCROLL); this.viewer.setContentProvider(new ViewContentProvider()); this.viewer.setComparator(new ViewerComparator() { @Override public int category(Object element) { ITreeNode node = (ITreeNode) element; switch (node.getId()) { case ITreeNode.PACKAGE: return 1; default: return 0; } } }); this.viewer.setLabelProvider(new ViewLabelProvider()); createActions(); updateActions(); configureToolbar(); hookDoubleClickAction(); form.setContent(this.viewer.getTree()); getSite().setSelectionProvider(this.viewer); final ISessionManager sessionManager = ApiPlugin.getDefault().getSessionManager(); ISession[] sessions = sessionManager.getSessions(); if (sessions.length > 0) { ISession activeSession = sessionManager.getActiveSession(); if (sessions[0] != activeSession) { sessionManager.activateSession(sessions[0]); } else { this.viewer.setInput(activeSession); updateActions(); } } } @Override public void init(IViewSite site) throws PartInitException { super.init(site); final ISessionManager sessionManager = ApiPlugin.getDefault().getSessionManager(); sessionManager.addSessionListener(this); } private void hookDoubleClickAction() { this.viewer.addDoubleClickListener(new IDoubleClickListener() { @Override public void doubleClick(DoubleClickEvent event) { APIToolingView.this.doubleClickAction.run(); } }); } @Override public void dispose() { ApiPlugin.getDefault().getSessionManager().removeSessionListener(this); } protected void configureToolbar() { IActionBars actionBars = getViewSite().getActionBars(); IToolBarManager tbm = actionBars.getToolBarManager(); tbm.add(new Separator()); tbm.add(this.removeActiveSessionAction); tbm.add(this.removeAllSessionsAction); tbm.add(new Separator()); tbm.add(this.selectSessionAction); tbm.add(new Separator()); tbm.add(this.nextAction); tbm.add(this.previousAction); tbm.add(new Separator()); tbm.add(this.expandallAction); tbm.add(this.collapseallAction); tbm.add(new Separator()); tbm.add(this.exportSessionAction); } private void createActions() { final IActionBars actionBars = getViewSite().getActionBars(); this.removeActiveSessionAction = new RemoveActiveSessionAction(); actionBars.setGlobalActionHandler(ActionFactory.DELETE.getId(), removeActiveSessionAction); this.removeAllSessionsAction = new RemoveAllSessionsAction(); this.selectSessionAction = new SelectSessionAction(); this.doubleClickAction = new Action() { @Override public void run() { ISelection selection = viewer.getSelection(); if (selection instanceof IStructuredSelection) { Object item = ((IStructuredSelection) selection).getFirstElement(); if (APIToolingView.this.viewer.getExpandedState(item)) { APIToolingView.this.viewer.collapseToLevel(item, 1); } else { APIToolingView.this.viewer.expandToLevel(item, 1); } if (item instanceof ITreeNode) { ITreeNode node = (ITreeNode) item; if (node.getData() != null && !node.hasChildren()) { // show the Properties view ApiUIPlugin.getDefault().showPropertiesView(); } } } } }; this.exportSessionAction = new ExportSessionAction(this); this.nextAction = new NavigateAction(this, true); this.previousAction = new NavigateAction(this, false); this.expandallAction = new ExpandAllAction(this.viewer); this.collapseallAction = new CollapseAllAction(this.viewer); } private void updateActions() { this.viewer.getControl().getDisplay().asyncExec(new Runnable() { @Override public void run() { ISessionManager sessionManager = ApiPlugin.getDefault().getSessionManager(); ISession active = sessionManager.getActiveSession(); APIToolingView.this.sessionDescription .setText(active == null ? "No Description" : active.getDescription()); //$NON-NLS-1$ ISession[] sessions = sessionManager.getSessions(); boolean atLeastOne = sessions.length >= 1; APIToolingView.this.removeActiveSessionAction.setEnabled(atLeastOne); APIToolingView.this.removeAllSessionsAction.setEnabled(atLeastOne); APIToolingView.this.selectSessionAction.setEnabled(atLeastOne); APIToolingView.this.exportSessionAction.setEnabled(active != null); APIToolingView.this.expandallAction.setEnabled(atLeastOne); APIToolingView.this.collapseallAction.setEnabled(atLeastOne); APIToolingView.this.nextAction.setEnabled(atLeastOne); APIToolingView.this.previousAction.setEnabled(atLeastOne); } }); } /** * Passing the focus request to the viewer's control. */ @Override public void setFocus() { this.viewer.getControl().setFocus(); } @Override public void sessionAdded(final ISession session) { this.viewer.getControl().getDisplay().asyncExec(new Runnable() { @Override public void run() { APIToolingView.this.viewer.setInput(session); } }); updateActions(); } @Override public void sessionRemoved(ISession session) { this.viewer.setInput(null); updateActions(); } @Override public void sessionActivated(final ISession session) { this.viewer.getControl().getDisplay().asyncExec(new Runnable() { @Override public void run() { APIToolingView.this.viewer.setInput(session); } }); updateActions(); } /** * Returns the property sheet. */ protected IPropertySheetPage getPropertySheet() { if (this.page == null) { this.page = new PropertySheetPage(); } return this.page; } /* * (non-Javadoc) Method declared on IAdaptable */ @Override public Object getAdapter(Class adapter) { if (adapter.equals(IPropertySheetPage.class)) { return getPropertySheet(); } return super.getAdapter(adapter); } }