Merge branch 'development' of https://gitlab.lrz.de/lrr-tum/students/eragp-misim...
[Mograsim.git] / net.mograsim.plugin.core / src / net / mograsim / plugin / asm / AsmOpsEdit.java
1 package net.mograsim.plugin.asm;
2
3 import java.util.Arrays;
4 import java.util.stream.Collectors;
5
6 import javax.inject.Inject;
7
8 import org.eclipse.e4.ui.di.Persist;
9 import org.eclipse.e4.ui.model.application.ui.basic.MPart;
10 import org.eclipse.jface.action.Action;
11 import org.eclipse.jface.action.IAction;
12 import org.eclipse.jface.action.IMenuListener;
13 import org.eclipse.jface.action.IMenuManager;
14 import org.eclipse.jface.action.IToolBarManager;
15 import org.eclipse.jface.action.MenuManager;
16 import org.eclipse.jface.action.Separator;
17 import org.eclipse.jface.viewers.ArrayContentProvider;
18 import org.eclipse.jface.viewers.ITableLabelProvider;
19 import org.eclipse.jface.viewers.LabelProvider;
20 import org.eclipse.jface.viewers.TableViewer;
21 import org.eclipse.swt.SWT;
22 import org.eclipse.swt.events.KeyEvent;
23 import org.eclipse.swt.events.KeyListener;
24 import org.eclipse.swt.graphics.Image;
25 import org.eclipse.swt.layout.GridData;
26 import org.eclipse.swt.layout.GridLayout;
27 import org.eclipse.swt.widgets.Composite;
28 import org.eclipse.swt.widgets.Menu;
29 import org.eclipse.swt.widgets.Text;
30 import org.eclipse.ui.IActionBars;
31 import org.eclipse.ui.ISharedImages;
32 import org.eclipse.ui.IWorkbench;
33 import org.eclipse.ui.IWorkbenchActionConstants;
34 import org.eclipse.ui.PlatformUI;
35 import org.eclipse.ui.part.ViewPart;
36
37 import net.mograsim.plugin.AsmOps;
38
39 /**
40  * This sample class demonstrates how to plug-in a new workbench view. The view shows data obtained from the model. The sample creates a
41  * 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
42  * workspace). The view is connected to the model using a content provider.
43  * <p>
44  * 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
45  * using different labels and icons, if needed. Alternatively, a single label provider can be shared between views in order to ensure that
46  * objects of the same type are presented in the same way everywhere.
47  * <p>
48  */
49
50 public class AsmOpsEdit extends ViewPart
51 {
52
53         @Inject
54         private MPart part;
55
56         /**
57          * The ID of the view as specified by the extension.
58          */
59         public static final String ID = "plugintest.views.AsmOpsEdit";
60
61         @Inject
62         IWorkbench workbench;
63
64         private Text txtInput;
65         private TableViewer viewer;
66
67         private IAction saveAction;
68
69         class ViewLabelProvider extends LabelProvider implements ITableLabelProvider
70         {
71                 @Override
72                 public String getColumnText(Object obj, int index)
73                 {
74                         return getText(obj);
75                 }
76
77                 @Override
78                 public Image getColumnImage(Object obj, int index)
79                 {
80                         return getImage(obj);
81                 }
82
83                 @Override
84                 public Image getImage(Object obj)
85                 {
86                         return workbench.getSharedImages().getImage(ISharedImages.IMG_OBJ_ELEMENT);
87                 }
88         }
89
90         @Override
91         public void createPartControl(Composite parent)
92         {
93                 parent.setLayout(new GridLayout(1, false));
94
95                 txtInput = new Text(parent, SWT.BORDER);
96                 txtInput.setMessage("Enter new Asm OP");
97                 txtInput.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
98                 txtInput.addKeyListener(new KeyListener()
99                 {
100
101                         @Override
102                         public void keyReleased(KeyEvent e)
103                         {
104                                 // TODO Auto-generated method stub
105
106                         }
107
108                         @Override
109                         public void keyPressed(KeyEvent e)
110                         {
111                                 if (e.keyCode == SWT.CR || e.keyCode == SWT.LF)
112                                 {
113                                         String in = txtInput.getText().toLowerCase();
114                                         if (in.startsWith("-"))
115                                                 viewer.remove(in.substring(1).trim());
116                                         else
117                                                 viewer.add(in.trim());
118                                         txtInput.setText("");
119                                         part.setDirty(true);
120                                 }
121                         }
122                 });
123
124                 viewer = new TableViewer(parent, SWT.MULTI | SWT.H_SCROLL | SWT.V_SCROLL);
125
126                 viewer.setContentProvider(ArrayContentProvider.getInstance());
127                 viewer.setInput(createInitialDataModel());
128                 viewer.setLabelProvider(new ViewLabelProvider());
129                 viewer.getTable().setLayoutData(new GridData(GridData.FILL_BOTH));
130
131                 // Create the help context id for the viewer's control
132                 workbench.getHelpSystem().setHelp(viewer.getControl(), "PluginTest.viewer");
133                 getSite().setSelectionProvider(viewer);
134                 makeActions();
135                 contributeToActionBars();
136                 hookContextMenu();
137         }
138
139         private Object createInitialDataModel()
140         {
141                 return AsmOps.ops;
142         }
143
144         @Override
145         public void setFocus()
146         {
147                 txtInput.setFocus();
148         }
149
150         @Persist
151         public void save()
152         {
153                 AsmOps.setWords(Arrays.stream(viewer.getTable().getItems()).map(i -> (String) i.getData()).collect(Collectors.toList()));
154                 viewer.refresh();
155         }
156
157         private void makeActions()
158         {
159                 saveAction = new Action()
160                 {
161                         public void run()
162                         {
163                                 save();
164                                 part.setDirty(false);
165                         }
166                 };
167                 saveAction.setText("Save");
168                 saveAction.setToolTipText("Save Changes To ISA");
169                 saveAction.setImageDescriptor(PlatformUI.getWorkbench().getSharedImages().getImageDescriptor(ISharedImages.IMG_OBJS_INFO_TSK));
170         }
171
172         private void contributeToActionBars()
173         {
174                 IActionBars bars = getViewSite().getActionBars();
175                 fillLocalPullDown(bars.getMenuManager());
176                 fillLocalToolBar(bars.getToolBarManager());
177         }
178
179         private void fillLocalPullDown(IMenuManager manager)
180         {
181                 manager.add(saveAction);
182         }
183
184         private void fillContextMenu(IMenuManager manager)
185         {
186                 manager.add(saveAction);
187                 // Other plug-ins can contribute there actions here
188                 manager.add(new Separator(IWorkbenchActionConstants.MB_ADDITIONS));
189         }
190
191         private void fillLocalToolBar(IToolBarManager manager)
192         {
193                 manager.add(saveAction);
194         }
195
196         private void hookContextMenu()
197         {
198                 MenuManager menuMgr = new MenuManager("#PopupMenu");
199                 menuMgr.setRemoveAllWhenShown(true);
200                 menuMgr.addMenuListener(new IMenuListener()
201                 {
202                         public void menuAboutToShow(IMenuManager manager)
203                         {
204                                 AsmOpsEdit.this.fillContextMenu(manager);
205                         }
206                 });
207                 Menu menu = menuMgr.createContextMenu(viewer.getControl());
208                 viewer.getControl().setMenu(menu);
209                 getSite().registerContextMenu(menuMgr, viewer);
210         }
211 }