/** * Copyright (C) Yutaka Matsuno 2010-2012 All rights reserved. */ package net.dependableos.dcase.diagram.editor.computenodes; import java.util.ArrayList; import java.util.List; import net.dependableos.dcase.Argument; import net.dependableos.dcase.BasicLink; import net.dependableos.dcase.BasicNode; import net.dependableos.dcase.Context; import net.dependableos.dcase.DcaseLink001; import net.dependableos.dcase.DcaseLink002; import net.dependableos.dcase.DcaseLink003; import net.dependableos.dcase.DcaseLink004; import net.dependableos.dcase.Evidence; import net.dependableos.dcase.Goal; import net.dependableos.dcase.Justification; import net.dependableos.dcase.Monitor; import net.dependableos.dcase.Policy; import net.dependableos.dcase.Strategy; import net.dependableos.dcase.Undeveloped; import net.dependableos.dcase.Userdef001; import net.dependableos.dcase.Userdef002; import net.dependableos.dcase.Userdef003; import net.dependableos.dcase.Userdef004; import net.dependableos.dcase.Userdef005; import net.dependableos.dcase.Userdef006; import net.dependableos.dcase.diagram.common.util.StringUtil; import net.dependableos.dcase.diagram.edit.parts.ArgumentEditPart; import net.dependableos.dcase.diagram.editor.common.util.DcaseEditorUtil; import net.dependableos.dcase.diagram.editor.message.Messages; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Display; import org.eclipse.swt.widgets.Table; import org.eclipse.swt.widgets.TableColumn; import org.eclipse.swt.widgets.TableItem; import org.eclipse.gmf.runtime.common.ui.util.DisplayUtils; import org.eclipse.gmf.runtime.common.ui.util.PartListenerAdapter; import org.eclipse.swt.events.KeyEvent; import org.eclipse.swt.events.KeyListener; import org.eclipse.swt.graphics.Image; import org.eclipse.swt.layout.GridData; import org.eclipse.jface.action.Action; import org.eclipse.jface.viewers.IStructuredContentProvider; import org.eclipse.jface.viewers.ITableLabelProvider; import org.eclipse.jface.viewers.LabelProvider; import org.eclipse.jface.viewers.TableViewer; import org.eclipse.jface.viewers.Viewer; import org.eclipse.swt.SWT; import org.eclipse.ui.IActionBars; import org.eclipse.ui.IWorkbenchPage; import org.eclipse.ui.IWorkbenchPart; import org.eclipse.ui.part.ViewPart; import org.eclipse.swt.dnd.Clipboard; import org.eclipse.swt.dnd.TextTransfer; import org.eclipse.swt.dnd.Transfer; /** * The class that view part of compute nodes. */ public class ComputeNodesViewPart extends ViewPart { /** * The ID of the view as specified by the extension. */ public static final String ID = "net.dependableos.dcase.diagram.editor.computenodes.ComputeNodes"; /** * The part listener adaptor. */ private PartListenerAdapter partListener; /** * The current argument edit part. */ private ArgumentEditPart argumentEditPart; /** * The width hint for a table column. */ private static final int TABLE_COLUMN_WIDTH = 100; /** * The table viewer. */ private TableViewer viewer; /** * The titles. */ private static final String[] TITLES = new String[]{ Messages.ComputeNodesViewPart_AllNodesText, Messages.ComputeNodesViewPart_GoalText, Messages.ComputeNodesViewPart_SystemText, Messages.ComputeNodesViewPart_StrategyText, Messages.ComputeNodesViewPart_ContextText, Messages.ComputeNodesViewPart_JustificationText, Messages.ComputeNodesViewPart_AssumptionText, Messages.ComputeNodesViewPart_EvidenceText, Messages.ComputeNodesViewPart_UndevelopedText, Messages.ComputeNodesViewPart_ModuleText, Messages.ComputeNodesViewPart_ContractText, Messages.ComputeNodesViewPart_MonitorText, Messages.ComputeNodesViewPart_PolicyText, Messages.ComputeNodesViewPart_Userdef001Text, Messages.ComputeNodesViewPart_Userdef002Text, Messages.ComputeNodesViewPart_Userdef003Text, Messages.ComputeNodesViewPart_AllLinksText, Messages.ComputeNodesViewPart_SupportedByText, Messages.ComputeNodesViewPart_InContextOfText, Messages.ComputeNodesViewPart_LinkSolidText, Messages.ComputeNodesViewPart_LinkDashText }; /** * The number of all node. */ private static final int NUM_ALL_NODE = 0; /** * The number of goal. */ private static final int NUM_GOAL = 1; /** * The number of system. */ private static final int NUM_SYSTEM = 2; /** * The number of strategy. */ private static final int NUM_STRATEGY = 3; /** * The number of context. */ private static final int NUM_CONTEXT = 4; /** * The number of justification. */ private static final int NUM_JUSTIFICATION = 5; /** * The number of assumption. */ private static final int NUM_ASSUMPTION = 6; /** * The number of evidence. */ private static final int NUM_EVIDENCE = 7; /** * The number of undeveloped. */ private static final int NUM_UNDEVELOPED = 8; /** * The number of module. */ private static final int NUM_MODULE = 9; /** * The number of contract. */ private static final int NUM_CONTRACT = 10; /** * The number of monitor. */ private static final int NUM_MONITOR = 11; /** * The number of policy. */ private static final int NUM_POLICY = 12; /** * The number of userdef001. */ private static final int NUM_USERDEF001 = 13; /** * The number of userdef002. */ private static final int NUM_USERDEF002 = 14; /** * The number of userdef003. */ private static final int NUM_USERDEF003 = 15; /** * The number of all links. */ private static final int NUM_ALL_LINKS = 16; /** * The number of supported by. */ private static final int NUM_SUPPORTED_BY = 17; /** * The number of in context of. */ private static final int NUM_IN_CONTEXST_OF = 18; /** * The number of link Solid. */ private static final int NUM_LINK_SOLID = 19; /** * The number of link dash. */ private static final int NUM_LINK_DASH = 20; /** * A private class that provides the label of the table view. */ class ViewLabelProvider extends LabelProvider implements ITableLabelProvider { /** * Returns the properties of requirement as the label of columns. * * @param obj the object representing the entire row * @param index the zero-based index of the column * @return the label of column. * @see org.eclipse.jface.viewers.ITableLabelProvider#getColumnText(java.lang.Object, int) */ public String getColumnText(Object obj, int index) { ComputeNodesModel computeNodesModel = (ComputeNodesModel) obj; switch(index) { case 0: return computeNodesModel.getNodeLink(); case 1: return computeNodesModel.getTotal(); default: return StringUtil.EMPTY; } } /** * Does nothing. * @param obj the object representing the entire row * @param index the zero-based index of the column * @return null * @see org.eclipse.jface.viewers.ITableLabelProvider#getColumnImage(java.lang.Object, int) */ public Image getColumnImage(Object obj, int index) { return null; } } /** * Initializes. */ private void initialize() { List<ComputeNodesModel> list = new ArrayList<ComputeNodesModel>(); try { argumentEditPart = DcaseEditorUtil.getCurrentArgumentEditPart(); } catch (Exception e) { argumentEditPart = null; } if (argumentEditPart != null) { Argument argument = (Argument) DcaseEditorUtil .getElement(argumentEditPart); if (argument != null) { // get nodes count ComputeNodesMember computeNodesMember = new ComputeNodesMember(TITLES.length); for (BasicNode basicNode : argument.getRootBasicNode()) { if (basicNode instanceof Goal) { computeNodesMember.incCount(NUM_GOAL); } else if (basicNode instanceof net.dependableos.dcase.System) { computeNodesMember.incCount(NUM_SYSTEM); } else if (basicNode instanceof Strategy) { computeNodesMember.incCount(NUM_STRATEGY); } else if (basicNode instanceof Context) { computeNodesMember.incCount(NUM_CONTEXT); } else if (basicNode instanceof Justification) { computeNodesMember.incCount(NUM_JUSTIFICATION); } else if (basicNode instanceof Userdef004) { computeNodesMember.incCount(NUM_ASSUMPTION); } else if (basicNode instanceof Evidence) { computeNodesMember.incCount(NUM_EVIDENCE); } else if (basicNode instanceof Undeveloped) { computeNodesMember.incCount(NUM_UNDEVELOPED); } else if (basicNode instanceof Userdef005) { computeNodesMember.incCount(NUM_MODULE); } else if (basicNode instanceof Userdef006) { computeNodesMember.incCount(NUM_CONTRACT); } else if (basicNode instanceof Monitor) { computeNodesMember.incCount(NUM_MONITOR); } else if (basicNode instanceof Policy) { computeNodesMember.incCount(NUM_POLICY); } else if (basicNode instanceof Userdef001) { computeNodesMember.incCount(NUM_USERDEF001); } else if (basicNode instanceof Userdef002) { computeNodesMember.incCount(NUM_USERDEF002); } else if (basicNode instanceof Userdef003) { computeNodesMember.incCount(NUM_USERDEF003); } // all nodes computeNodesMember.incCount(NUM_ALL_NODE); } // get link count for (BasicLink basicLink : argument.getRootBasicLink()) { if (basicLink instanceof DcaseLink001) { computeNodesMember.incCount(NUM_SUPPORTED_BY); } else if (basicLink instanceof DcaseLink002) { computeNodesMember.incCount(NUM_IN_CONTEXST_OF); } else if (basicLink instanceof DcaseLink003) { computeNodesMember.incCount(NUM_LINK_SOLID); } else if (basicLink instanceof DcaseLink004) { computeNodesMember.incCount(NUM_LINK_DASH); } // all links computeNodesMember.incCount(NUM_ALL_LINKS); } // set model list for (int i = 0; i < TITLES.length; i++) { ComputeNodesModel model = new ComputeNodesModel(); model.setNodeLink(TITLES[i]); model.setTotal(Integer.toString(computeNodesMember.getCount(i))); list.add(model); } } } viewer.setInput(list); viewer.refresh(); } /** * Creates the controls. * @param parent the parent composite */ public void createPartControl(Composite parent) { // mode layout viewer = new TableViewer(parent, SWT.H_SCROLL | SWT.V_SCROLL | SWT.BORDER); Table table = viewer.getTable(); table.setHeaderVisible(true); table.setLinesVisible(true); TableColumn column1 = new TableColumn(table, SWT.NULL); column1.setText(Messages.ComputeNodesViewPart_NodeLinkText); column1.setWidth(TABLE_COLUMN_WIDTH); TableColumn column2 = new TableColumn(table, SWT.NULL); column2.setText(Messages.ComputeNodesViewPart_TotalText); column2.setWidth(TABLE_COLUMN_WIDTH); viewer.setContentProvider(new ComputeNodesContentsProvider()); GridData gridData = new GridData(); gridData.verticalAlignment = GridData.FILL; gridData.horizontalAlignment = GridData.FILL; viewer.getControl().setLayoutData(gridData); getSite().setSelectionProvider(viewer); viewer.setLabelProvider(new ViewLabelProvider()); registerToolBar(); setPartListener(); setKeyListener(); initialize(); } /** * Does nothing. * @see org.eclipse.ui.part.WorkbenchPart#setFocus() */ @Override public void setFocus() { } /** * Sets Part Listener for detecting that activating D-Case diagram editor change. */ private void setPartListener() { // set the PartListener that observe the diagram editor. partListener = new PartListenerAdapter() { /** * @see org.eclipse.ui.IPartListener#partActivated(org.eclipse.ui.IWorkbenchPart) */ public void partActivated(IWorkbenchPart part) { initialize(); } /** * @see org.eclipse.ui.IPartListener#partClosed(org.eclipse.ui.IWorkbenchPart) */ public void partClosed(IWorkbenchPart part) { } }; getSite().getPage().addPartListener(partListener); } /** * Sets the Key Listener for table. */ private void setKeyListener() { viewer.getTable().addKeyListener(new KeyListener() { public void keyPressed(KeyEvent e) { if (e.stateMask == SWT.CTRL && (e.keyCode == 'c' || e.keyCode == 'C')) { //$NON-NLS-1$ setClopboard(); } } public void keyReleased(KeyEvent e) { } }); } /** * The function when this view part is exiting. */ @Override public void dispose() { super.dispose(); IWorkbenchPage activePage = getSite().getWorkbenchWindow().getActivePage(); if (activePage != null) { activePage.removePartListener(partListener); } } /** * Registers tool bar action for copy. */ private void registerToolBar() { IActionBars bars = getViewSite().getActionBars(); bars.getToolBarManager().removeAll(); Action copyAction = new Action() { @Override public void run() { setClopboard(); } }; copyAction.setText(Messages.ComputeNodesViewPart_CopyText); // set menu item. bars.getToolBarManager().add(copyAction); } /** * Sets the contents for clip board. */ private void setClopboard() { Display display = DisplayUtils.getDisplay(); Clipboard clipboard = new Clipboard(display); StringBuffer sb = new StringBuffer(); Table table = viewer.getTable(); int itemMaxCnt = table.getItemCount(); int itemCount = 1; sb.append(Messages.ComputeNodesViewPart_NodeLinkText); sb.append(","); //$NON-NLS-1$ sb.append(Messages.ComputeNodesViewPart_TotalText); sb.append(System.getProperty("line.separator")); //$NON-NLS-1$ for (TableItem item : table.getItems()) { sb.append(item.getText(0)); sb.append(","); //$NON-NLS-1$ sb.append(item.getText(1)); if (itemCount != itemMaxCnt) { sb.append(System.getProperty("line.separator")); //$NON-NLS-1$ } itemCount++; } clipboard.setContents(new Object[]{sb.toString()}, new Transfer[]{TextTransfer.getInstance()}); } /** * Contents Provider inner class for this View Part. */ private class ComputeNodesContentsProvider implements IStructuredContentProvider { /** * Does nothing. * @see org.eclipse.jface.viewers.IContentProvider#dispose() */ public void dispose() { } /** * Does nothing. * * @param viewer the viewer * @param oldInput the old input element * @param newInput the new input element * @see org.eclipse.jface.viewers.IContentProvider * #inputChanged(org.eclipse.jface.viewers.Viewer, java.lang.Object, java.lang.Object) */ public void inputChanged(Viewer viewer, Object oldInput, Object newInput) { } /** * Returns the array of compute nodes as elements. * @param inputElement the input element * @return the array of compute nodes model. * @see org.eclipse.jface.viewers.IStructuredContentProvider#getElements(java.lang.Object) */ @SuppressWarnings("unchecked") public Object[] getElements(Object inputElement) { return ((List<ComputeNodesModel>) inputElement).toArray(); } } }