Merge branch 'machines-are-launch-configs' into development
[Mograsim.git] / plugins / net.mograsim.plugin.core / src / net / mograsim / plugin / launch / MainMachineLaunchConfigTab.java
index 6f3c293..836b8a9 100644 (file)
@@ -27,7 +27,7 @@ import org.eclipse.swt.layout.GridLayout;
 import org.eclipse.swt.widgets.Button;
 import org.eclipse.swt.widgets.Composite;
 import org.eclipse.swt.widgets.Control;
-import org.eclipse.swt.widgets.Group;
+import org.eclipse.swt.widgets.Label;
 import org.eclipse.swt.widgets.Text;
 import org.eclipse.ui.dialogs.ElementListSelectionDialog;
 import org.eclipse.ui.dialogs.ElementTreeSelectionDialog;
@@ -37,12 +37,14 @@ import org.eclipse.ui.model.WorkbenchLabelProvider;
 import net.mograsim.plugin.nature.MograsimNature;
 import net.mograsim.plugin.util.FileExtensionViewerFilter;
 import net.mograsim.plugin.util.ImageDescriptorWithMargins;
+import net.mograsim.plugin.util.ProjectViewerFilter;
 
 //a big part of this class is stolen from org.eclipse.jdt.debug.ui
 public class MainMachineLaunchConfigTab extends AbstractLaunchConfigurationTab
 {
        private Text projSelText;
        private Text mpmFileSelText;
+       private Text initialRAMFileSelText;
 
        @Override
        public void createControl(Composite parent)
@@ -51,27 +53,28 @@ public class MainMachineLaunchConfigTab extends AbstractLaunchConfigurationTab
                Composite innerParent = new Composite(parent, SWT.NONE);
                setControl(innerParent);
 
-               innerParent.setLayout(new GridLayout());
+               innerParent.setLayout(new GridLayout(3, false));
 
-               this.projSelText = createResourceSelectorGroup(innerParent, "&Project:", this::chooseMograsimProject);
+               this.projSelText = addResourceSelector(innerParent, "&Project:", this::chooseMograsimProject);
 
-               this.mpmFileSelText = createResourceSelectorGroup(innerParent, "&MPM:", this::chooseMPMFile);
+               this.mpmFileSelText = addResourceSelector(innerParent, "&MPM:", this::chooseMPMFile);
 
-               // TODO RAM selector
+               this.initialRAMFileSelText = addResourceSelector(innerParent, "Initial &RAM (optional):", this::chooseInitialRAMFile);
        }
 
-       private Text createResourceSelectorGroup(Composite innerParent, String groupName, Supplier<String> chooser)
+       private Text addResourceSelector(Composite innerParent, String label, Supplier<String> chooser)
        {
-               Group group = new Group(innerParent, SWT.NONE);
-               group.setLayout(new GridLayout(2, false));
-               group.setText(groupName);
-               group.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, false));
+               Label swtLabel = new Label(innerParent, SWT.NONE);
+               swtLabel.setText(label);
+               swtLabel.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, false, false));
 
-               Text text = new Text(group, SWT.BORDER);
+               Text text = new Text(innerParent, SWT.BORDER);
                text.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false));
                text.addModifyListener(e -> updateLaunchConfigurationDialog());
 
-               Button browseButton = new Button(group, SWT.PUSH);
+               swtLabel.addListener(SWT.FocusIn, e -> text.setFocus());
+
+               Button browseButton = new Button(innerParent, SWT.PUSH);
                GridData projSelButtonData = new GridData();
                projSelButtonData.widthHint = calculateWidthHint(browseButton);
                projSelButtonData.horizontalAlignment = SWT.FILL;
@@ -99,7 +102,7 @@ public class MainMachineLaunchConfigTab extends AbstractLaunchConfigurationTab
                        @Override
                        protected ImageDescriptor decorateImage(ImageDescriptor input, Object element)
                        {
-                               return new ImageDescriptorWithMargins(input, new Point(22, 16));
+                               return new ImageDescriptorWithMargins(input, new Point(20, 16));
                        }
                };
                ElementListSelectionDialog dialog = new ElementListSelectionDialog(getShell(), renderer);
@@ -113,17 +116,28 @@ public class MainMachineLaunchConfigTab extends AbstractLaunchConfigurationTab
 
        private String chooseMPMFile()
        {
-               WorkbenchLabelProvider renderer = new WorkbenchLabelProvider()
-               {
-                       @Override
-                       protected ImageDescriptor decorateImage(ImageDescriptor input, Object element)
-                       {
-                               return new ImageDescriptorWithMargins(input, new Point(22, 16));
-                       }
-               };
-               ElementTreeSelectionDialog dialog = new ElementTreeSelectionDialog(getShell(), renderer, new WorkbenchContentProvider());
-               dialog.setInput(getSelectedProject());
+               ElementTreeSelectionDialog dialog = new ElementTreeSelectionDialog(getShell(), new WorkbenchLabelProvider(),
+                               new WorkbenchContentProvider());
+               dialog.setTitle("MPM Selection");
+               dialog.setMessage("Select a MPM file");
+               dialog.setInput(ResourcesPlugin.getWorkspace().getRoot());
                dialog.addFilter(new FileExtensionViewerFilter("mpm"));
+               dialog.addFilter(new ProjectViewerFilter(getSelectedProject()));
+
+               if (dialog.open() == Window.OK)
+                       return ((IResource) dialog.getResult()[0]).getProjectRelativePath().toPortableString();
+               return null;
+       }
+
+       private String chooseInitialRAMFile()
+       {
+               ElementTreeSelectionDialog dialog = new ElementTreeSelectionDialog(getShell(), new WorkbenchLabelProvider(),
+                               new WorkbenchContentProvider());
+               dialog.setTitle("Initial RAM Selection");
+               dialog.setMessage("Select a RAM file");
+               dialog.setInput(ResourcesPlugin.getWorkspace().getRoot());
+               dialog.addFilter(new FileExtensionViewerFilter("mem"));
+               dialog.addFilter(new ProjectViewerFilter(getSelectedProject()));
 
                if (dialog.open() == Window.OK)
                        return ((IResource) dialog.getResult()[0]).getProjectRelativePath().toPortableString();
@@ -165,6 +179,7 @@ public class MainMachineLaunchConfigTab extends AbstractLaunchConfigurationTab
        {
                projSelText.setText(getStringAttribSafe(configuration, MachineLaunchConfigType.PROJECT_ATTR, ""));
                mpmFileSelText.setText(getStringAttribSafe(configuration, MachineLaunchConfigType.MPM_FILE_ATTR, ""));
+               initialRAMFileSelText.setText(getStringAttribSafe(configuration, MachineLaunchConfigType.INITIAL_RAM_FILE_ATTR, ""));
        }
 
        private String getStringAttribSafe(ILaunchConfiguration configuration, String attrib, String defaultValue)
@@ -185,6 +200,7 @@ public class MainMachineLaunchConfigTab extends AbstractLaunchConfigurationTab
        {
                String projName = projSelText.getText().trim();
                String mpmFileName = mpmFileSelText.getText().trim();
+               String initialRAMFileName = initialRAMFileSelText.getText().trim();
 
                Set<IResource> associatedResources = new HashSet<>();
                IWorkspace workspace = ResourcesPlugin.getWorkspace();
@@ -195,11 +211,15 @@ public class MainMachineLaunchConfigTab extends AbstractLaunchConfigurationTab
                        {
                                if (project != null && project.isAccessible() && project.hasNature(MograsimNature.NATURE_ID))
                                {
+                                       associatedResources.add(project);
+
                                        IResource mpmFile = project.findMember(mpmFileName);
                                        if (mpmFile != null && mpmFile.exists() && mpmFile.getType() == IResource.FILE)
                                                associatedResources.add(mpmFile);
-                                       else
-                                               associatedResources.add(project);
+
+                                       IResource ramFile = project.findMember(initialRAMFileName);
+                                       if (ramFile != null && ramFile.exists() && ramFile.getType() == IResource.FILE)
+                                               associatedResources.add(ramFile);
                                }
                        }
                        catch (CoreException e)
@@ -210,6 +230,7 @@ public class MainMachineLaunchConfigTab extends AbstractLaunchConfigurationTab
                configuration.setMappedResources(associatedResources.toArray(IResource[]::new));
                configuration.setAttribute(MachineLaunchConfigType.PROJECT_ATTR, projName);
                configuration.setAttribute(MachineLaunchConfigType.MPM_FILE_ATTR, mpmFileName);
+               configuration.setAttribute(MachineLaunchConfigType.INITIAL_RAM_FILE_ATTR, initialRAMFileName);
        }
 
        @Override
@@ -250,6 +271,16 @@ public class MainMachineLaunchConfigTab extends AbstractLaunchConfigurationTab
                if (mpmResource.getType() != IResource.FILE)
                        return setErrorAndReturnFalse("MPM file {0} is not a file", mpmFileName);
 
+               String initialRAMFileName = initialRAMFileSelText.getText().trim();
+               if (initialRAMFileName.length() > 0)
+               {
+                       IResource initialRAMResource = project.findMember(initialRAMFileName);
+                       if (initialRAMResource == null || !initialRAMResource.exists())
+                               return setErrorAndReturnFalse("Initial RAM file {0} does not exist", initialRAMFileName);
+                       if (initialRAMResource.getType() != IResource.FILE)
+                               return setErrorAndReturnFalse("Initial RAM file {0} is not a file", initialRAMFileName);
+               }
+
                return true;
        }