Java tutorial
package com.mentor.nucleus.bp.ui.sem.pages; //===================================================================== // // File: $RCSfile: SEMEditorPage.java,v $ // Version: $Revision: 1.11 $ // Modified: $Date: 2013/05/10 13:29:04 $ // //(c) Copyright 2006-2014 by Mentor Graphics Corp. All rights reserved. // //======================================================================== // 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. //======================================================================== // // This class is responsible for providing the help ids for the // SessionExplorerPlugin plugin. // import java.util.ArrayList; import java.util.Arrays; import java.util.List; import org.eclipse.core.resources.IWorkspaceRunnable; import org.eclipse.core.runtime.CoreException; import org.eclipse.core.runtime.IProgressMonitor; import org.eclipse.jface.action.Action; import org.eclipse.jface.viewers.CellLabelProvider; import org.eclipse.jface.viewers.ILabelProviderListener; import org.eclipse.jface.viewers.IStructuredContentProvider; import org.eclipse.jface.viewers.IStructuredSelection; import org.eclipse.jface.viewers.ITableLabelProvider; import org.eclipse.jface.viewers.StructuredSelection; import org.eclipse.jface.viewers.TableViewerColumn; import org.eclipse.jface.viewers.Viewer; import org.eclipse.jface.viewers.ViewerCell; import org.eclipse.swt.SWT; import org.eclipse.swt.events.MouseEvent; import org.eclipse.swt.events.MouseListener; import org.eclipse.swt.events.MouseMoveListener; import org.eclipse.swt.events.MouseTrackListener; import org.eclipse.swt.graphics.Cursor; import org.eclipse.swt.graphics.Image; import org.eclipse.swt.graphics.Point; import org.eclipse.swt.graphics.Rectangle; import org.eclipse.swt.layout.GridData; import org.eclipse.swt.layout.GridLayout; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Label; import org.eclipse.swt.widgets.TableColumn; import org.eclipse.swt.widgets.TableItem; import org.eclipse.ui.PlatformUI; import com.mentor.nucleus.bp.core.ActionHome_c; import com.mentor.nucleus.bp.core.Action_c; import com.mentor.nucleus.bp.core.CantHappen_c; import com.mentor.nucleus.bp.core.CorePlugin; import com.mentor.nucleus.bp.core.CreationTransition_c; import com.mentor.nucleus.bp.core.EventIgnored_c; import com.mentor.nucleus.bp.core.InstanceStateMachine_c; import com.mentor.nucleus.bp.core.LocalEvent_c; import com.mentor.nucleus.bp.core.Modeleventnotification_c; import com.mentor.nucleus.bp.core.NewStateTransition_c; import com.mentor.nucleus.bp.core.Ooaofooa; import com.mentor.nucleus.bp.core.SemEvent_c; import com.mentor.nucleus.bp.core.StateEventMatrixEntry_c; import com.mentor.nucleus.bp.core.StateMachineEvent_c; import com.mentor.nucleus.bp.core.StateMachineState_c; import com.mentor.nucleus.bp.core.StateMachine_c; import com.mentor.nucleus.bp.core.TransitionActionHome_c; import com.mentor.nucleus.bp.core.Transition_c; import com.mentor.nucleus.bp.core.common.BaseModelDelta; import com.mentor.nucleus.bp.core.common.IModelDelta; import com.mentor.nucleus.bp.core.common.ITransactionListener; import com.mentor.nucleus.bp.core.common.Transaction; import com.mentor.nucleus.bp.ui.sem.listeners.SemEditorListener; import com.mentor.nucleus.bp.ui.sem.viewers.SEMEditingSupport; import com.mentor.nucleus.bp.ui.sem.viewers.SEMTableViewer; import com.mentor.nucleus.bp.ui.text.activity.ShowActivityAction; public class SEMEditorPage extends Composite { private StateMachine_c fStateMachine; private SEMTableViewer fTableViewer; private ArrayList<StateMachineEvent_c> events = new ArrayList<StateMachineEvent_c>(); private ITransactionListener fTransactionListener; private SemEditorListener semListener; private static Image IMAGE_OAL_NO_GEAR = CorePlugin.getImageDescriptor("edit_oal_nogear.gif").createImage(); private static Image IMAGE_EDIT_OAL = CorePlugin.getImageDescriptor("edit_oal.gif").createImage(); protected static Cursor fOpenCursor; protected static Cursor fDefaultCursor; public SEMEditorPage(Composite parent, StateMachine_c stateMachine) { super(parent, SWT.SINGLE); if (fDefaultCursor == null) { fDefaultCursor = getCursor(); } if (fOpenCursor == null) { fOpenCursor = new Cursor(getDisplay(), SWT.CURSOR_HAND); } fStateMachine = stateMachine; createControls(parent); } private void createControls(Composite parent) { setLayout(new GridLayout(2, false)); Label label = new Label(this, SWT.FLAT); label.setText("events"); label.setLayoutData(new GridData(SWT.CENTER, SWT.CENTER, true, false, 2, 1)); label = new Label(this, SWT.FLAT); label.setText("states"); label.setLayoutData(new GridData(SWT.CENTER, SWT.CENTER, false, true, 1, 1)); createTableViewer(parent); addModelChangeListeners(); } /** * This class exists simply as a place holder for the no-state row. When * a no-state is present, its data is filled-in by the getColumnText() * function (at the same point the other states data is determined). * * @see getColumnText() * */ class NoStateRow extends Object { NoStateRow() { } }; private void createTableViewer(Composite parent) { fTableViewer = new SEMTableViewer(this, SWT.H_SCROLL | SWT.V_SCROLL | SWT.BORDER | SWT.FULL_SELECTION); addTableListeners(); createInitialColumns(true); fTableViewer.setContentProvider(new IStructuredContentProvider() { @Override public void inputChanged(Viewer viewer, Object oldInput, Object newInput) { // nothing to do } @Override public void dispose() { // nothing to do } @Override public Object[] getElements(Object inputElement) { if (inputElement instanceof StateMachine_c) { List<Object> rowData = new ArrayList<Object>(); StateMachineState_c[] smStates = StateMachineState_c.getManySM_STATEsOnR501(fStateMachine); if (smStates.length > 0) { // See if there is an creation transition LocalEvent_c assignedLocalEvent = LocalEvent_c.getOneSM_LEVTOnR509(CreationTransition_c .getManySM_CRTXNsOnR507(Transition_c.getManySM_TXNsOnR506(smStates))); if (assignedLocalEvent != null) { Object noStateRow = new NoStateRow(); rowData.add(noStateRow); } rowData.addAll(Arrays.asList(smStates)); } return rowData.toArray(); } return null; } }); fTableViewer.setLabelProvider(new ITableLabelProvider() { @Override public void removeListener(ILabelProviderListener listener) { // do nothing } @Override public boolean isLabelProperty(Object element, String property) { return false; } @Override public void dispose() { // do nothing } @Override public void addListener(ILabelProviderListener listener) { // do nothing } @Override public String getColumnText(Object element, int columnIndex) { if (element instanceof StateMachineState_c) { if (columnIndex == 0) { // pack the column fTableViewer.getTable().getColumn(0).pack(); return ((StateMachineState_c) element).getName(); } else { final StateMachineEvent_c event = getEventAtColumn(columnIndex); final StateMachineState_c state = (StateMachineState_c) element; StateEventMatrixEntry_c matrixEntry = getMatrixEntry(state, event); if (matrixEntry != null) { NewStateTransition_c transition = NewStateTransition_c .getOneSM_NSTXNOnR504(matrixEntry); if (transition != null) { StateMachineState_c newState = StateMachineState_c .getOneSM_STATEOnR506(Transition_c.getOneSM_TXNOnR507(transition)); return newState.getName(); } CantHappen_c ch = CantHappen_c.getOneSM_CHOnR504(matrixEntry); if (ch != null) { return "Can't Happen"; } EventIgnored_c ignored = EventIgnored_c.getOneSM_EIGNOnR504(matrixEntry); if (ignored != null) { return "Event Ignored"; } } } } else if (element instanceof NoStateRow) { if (columnIndex == 0) { final String NoStateRowName = ""; return NoStateRowName; } else { final StateMachineEvent_c event = getEventAtColumn(columnIndex); CreationTransition_c ct = CreationTransition_c.getOneSM_CRTXNOnR509( LocalEvent_c.getOneSM_LEVTOnR526(SemEvent_c.getOneSM_SEVTOnR525(event))); if (ct != null) { // If this is an assigned creation event then we // must show // the name of the state it is assigned to // Note: We do not allow editing of the creation // transition action. // so there is no editor for it. LocalEvent_c assignedEvent = LocalEvent_c.getOneSM_LEVTOnR509(ct); if (assignedEvent != null) { StateMachineState_c sms = StateMachineState_c .getOneSM_STATEOnR506(Transition_c.getOneSM_TXNOnR507(ct)); return sms.getName(); } } return "Can't Happen"; } } return ""; } @Override public Image getColumnImage(Object element, int columnIndex) { if (element instanceof StateMachineState_c) { if (columnIndex == 0) { return CorePlugin.getImageFor(element); } else { final StateMachineEvent_c event = getEventAtColumn(columnIndex); final StateMachineState_c state = (StateMachineState_c) element; StateEventMatrixEntry_c matrixEntry = getMatrixEntry(state, event); if (matrixEntry != null) { NewStateTransition_c transition = NewStateTransition_c .getOneSM_NSTXNOnR504(matrixEntry); if (transition != null) { Transition_c superTrans = Transition_c.getOneSM_TXNOnR507(transition); Action_c action = Action_c.getOneSM_ACTOnR514(ActionHome_c .getOneSM_AHOnR513(TransitionActionHome_c.getOneSM_TAHOnR530(superTrans))); if (action == null || action.getAction_semantics_internal().equals("")) { return IMAGE_OAL_NO_GEAR; } return IMAGE_EDIT_OAL; } } } } else if (element instanceof NoStateRow) { if (columnIndex == 0) { // The columns that represent state show the State.gif // icon, but this isn't a state. so it shows nothing return null; } else { // Note that since we do not allow editing of creation // transitions there is no icon. return null; } } return null; } }); fTableViewer.setInput(fStateMachine); } private void addTableListeners() { fTableViewer.getTable().addMouseTrackListener(new MouseTrackListener() { @Override public void mouseHover(MouseEvent e) { fTableViewer.getTable().setToolTipText(""); } @Override public void mouseExit(MouseEvent e) { setCursor(fDefaultCursor); } @Override public void mouseEnter(MouseEvent e) { } }); fTableViewer.getTable().addMouseMoveListener(new MouseMoveListener() { @Override public void mouseMove(MouseEvent e) { // if over an openable area, change cursor Point point = new Point(e.x, e.y); TableItem item = fTableViewer.getTable().getItem(point); if (item != null) { for (int i = 0; i < fTableViewer.getTable().getColumnCount(); i++) { Rectangle rect = item.getBounds(i); if (rect.contains(point)) { StateMachineEvent_c event = getEventAtColumn(i); if (event == null) { setCursor(fOpenCursor); return; } else { StateEventMatrixEntry_c entry = getMatrixEntry((StateMachineState_c) item.getData(), event); if (entry != null) { // if this is a new state transition matrix entry // then open the transition activity editor NewStateTransition_c transition = NewStateTransition_c .getOneSM_NSTXNOnR504(entry); if (transition != null) { setCursor(fOpenCursor); return; } } } } } } setCursor(fDefaultCursor); } }); fTableViewer.getTable().addMouseListener(new MouseListener() { @Override public void mouseUp(MouseEvent e) { // nothing to do } @Override public void mouseDown(MouseEvent e) { if (e.button == 1) { Object elementToOpen = null; Point point = new Point(e.x, e.y); TableItem item = fTableViewer.getTable().getItem(point); if (item != null) { for (int i = 0; i < fTableViewer.getTable().getColumnCount(); i++) { Rectangle rect = item.getBounds(i); if (rect.contains(point)) { StateMachineEvent_c event = getEventAtColumn(i); if (event == null) { elementToOpen = item.getData(); } else { StateEventMatrixEntry_c entry = getMatrixEntry( (StateMachineState_c) item.getData(), event); if (entry != null) { // if this is a new state transition matrix entry // then open the transition activity editor NewStateTransition_c transition = NewStateTransition_c .getOneSM_NSTXNOnR504(entry); if (transition != null) { elementToOpen = Transition_c.getOneSM_TXNOnR507(transition); } } } } } } if (elementToOpen != null) { openActivityDiagramFor(elementToOpen); } } } @Override public void mouseDoubleClick(MouseEvent e) { } }); } protected void openActivityDiagramFor(final Object elementToOpen) { try { IWorkspaceRunnable r = new IWorkspaceRunnable() { public void run(IProgressMonitor monitor) throws CoreException { IStructuredSelection ss = new StructuredSelection(elementToOpen); ShowActivityAction sda = new ShowActivityAction(); Action a = new Action() { }; sda.selectionChanged(a, ss); sda.run(a); } }; CorePlugin.getWorkspace().run(r, null); } catch (CoreException x) { CorePlugin.logError("Unable to open activity editor.", x); } } private void addModelChangeListeners() { fTransactionListener = new ITransactionListener() { @Override public void transactionStarted(Transaction transaction) { // do nothing } @Override public void transactionEnded(Transaction transaction) { if (transaction.getType().equals(Transaction.AUTORECONCILE_TYPE)) return; final Transaction finalTransaction = transaction; PlatformUI.getWorkbench().getDisplay().asyncExec(new Runnable() { @Override public void run() { refresh(finalTransaction, false); } }); } @Override public void transactionCancelled(Transaction transaction) { // do nothing } }; semListener = new SemEditorListener(this); Ooaofooa.getDefaultInstance().addModelChangeListener(semListener); if ((fStateMachine != null) && (fStateMachine.getModelRoot() instanceof Ooaofooa) && (((Ooaofooa) fStateMachine.getModelRoot()).getRoot() != null)) { ((Ooaofooa) fStateMachine.getModelRoot()).getRoot().getTransactionManager() .addTransactionListener(fTransactionListener); } } public void refresh(final Transaction transaction, boolean recreate) { if (fTableViewer.getTable().isDisposed()) return; // refresh table, and columns if (transaction != null) { StateMachineEvent_c[] deletedEvents = getDeletedEvents(transaction); removeColumns(deletedEvents); StateMachineEvent_c[] addedEvents = getAddedEvents(transaction); addColumns(addedEvents); } if (recreate) { // we may need to update our cached state machine if (InstanceStateMachine_c.getOneSM_ISMOnR517(fStateMachine) == null) { fStateMachine = (StateMachine_c) fStateMachine.getModelRoot().getInstanceList(StateMachine_c.class) .get(fStateMachine.getInstanceKey()); } events.clear(); TableColumn[] columns = fTableViewer.getTable().getColumns(); for (TableColumn column : columns) { column.dispose(); } createInitialColumns(false); } refreshColumnNames(); fTableViewer.refresh(); } protected void refreshColumnNames() { for (int i = 0; i < fTableViewer.getTable().getColumnCount(); i++) { TableColumn column = fTableViewer.getTable().getColumn(i); if (column.getData() != null && column.getData() instanceof StateMachineEvent_c) { column.setText(((StateMachineEvent_c) column.getData()).Get_name()); } } } protected void addColumns(StateMachineEvent_c[] addedEvents) { for (int i = 0; i < addedEvents.length; i++) { events.add(addedEvents[i]); createColumnForEvent(addedEvents[i]); } } protected void removeColumns(StateMachineEvent_c[] deletedEvents) { for (int i = 0; i < deletedEvents.length; i++) { for (int j = 1; j < fTableViewer.getTable().getColumnCount(); j++) { StateMachineEvent_c event = getEventAtColumn(j); if (event.equals(deletedEvents[i])) { fTableViewer.getTable().getColumn(j).dispose(); events.remove(deletedEvents[i]); } } } } protected StateMachineEvent_c[] getAddedEvents(Transaction transaction) { ArrayList<StateMachineEvent_c> list = new ArrayList<StateMachineEvent_c>(); IModelDelta[] deltas = transaction.getDeltas(Ooaofooa.getDefaultInstance()); if (deltas != null) { for (int i = 0; i < deltas.length; i++) { if (deltas[i] instanceof BaseModelDelta) { if (deltas[i].getKind() == Modeleventnotification_c.DELTA_NEW) { if (deltas[i].getModelElement() instanceof StateMachineEvent_c) { StateMachineEvent_c event = (StateMachineEvent_c) deltas[i].getModelElement(); StateMachine_c stateMachine = StateMachine_c.getOneSM_SMOnR502(event); if (stateMachine != null && stateMachine.equals(fStateMachine)) list.add((StateMachineEvent_c) deltas[i].getModelElement()); } } } } } return list.toArray(new StateMachineEvent_c[list.size()]); } protected StateMachineEvent_c[] getDeletedEvents(Transaction transaction) { ArrayList<StateMachineEvent_c> list = new ArrayList<StateMachineEvent_c>(); IModelDelta[] deltas = transaction.getDeltas(Ooaofooa.getDefaultInstance()); if (deltas != null) { for (int i = 0; i < deltas.length; i++) { if (deltas[i] instanceof BaseModelDelta) { if (deltas[i].getKind() == Modeleventnotification_c.DELTA_DELETE) { if (deltas[i].getModelElement() instanceof StateMachineEvent_c) { list.add((StateMachineEvent_c) deltas[i].getModelElement()); } } } } } return list.toArray(new StateMachineEvent_c[list.size()]); } @Override public void dispose() { super.dispose(); ((Ooaofooa) fStateMachine.getModelRoot()).getRoot().getTransactionManager() .removeTransactionListener(fTransactionListener); Ooaofooa.getDefaultInstance().removeModelChangeListener(semListener); } protected StateEventMatrixEntry_c getMatrixEntry(final StateMachineState_c state, final StateMachineEvent_c event) { return fTableViewer.getMatrixEntryFor(state, event); } protected StateMachineEvent_c getEventAtColumn(int columnIndex) { if (columnIndex == 0) return null; return events.get(columnIndex - 1); } private void createInitialColumns(boolean pack) { setupInitialEvents(); TableColumn blank = new TableColumn(fTableViewer.getTable(), SWT.CENTER); blank.setWidth(getWidthForStateColumn()); // create a column for each event for (int i = 0; i < events.size(); i++) { createColumnForEvent(events.get(i)); } if (pack) { fTableViewer.getTable().pack(); } } private void createColumnForEvent(StateMachineEvent_c event) { TableViewerColumn column = new TableViewerColumn(fTableViewer, SWT.CENTER); column.setLabelProvider(new CellLabelProvider() { @Override public void update(ViewerCell cell) { ITableLabelProvider provider = (ITableLabelProvider) fTableViewer.getLabelProvider(); cell.setText(provider.getColumnText(cell.getElement(), cell.getColumnIndex())); cell.setImage(provider.getColumnImage(cell.getElement(), cell.getColumnIndex())); } }); column.setEditingSupport(new SEMEditingSupport(fTableViewer, column.getColumn())); column.getColumn().setData(event); column.getColumn().setText(event.Get_name()); column.getColumn().pack(); } private int getWidthForStateColumn() { return 80; } private void setupInitialEvents() { StateMachineEvent_c[] currentEvents = StateMachineEvent_c.getManySM_EVTsOnR502(fStateMachine); for (int i = 0; i < currentEvents.length; i++) { events.add(currentEvents[i]); } } public String getEditorName() { return "State Event Matrix Editor"; } public StateMachine_c getStateMahine() { return fStateMachine; } }