Merge branch 'machines-are-launch-configs' into development
[Mograsim.git] / plugins / net.mograsim.plugin.core / src / net / mograsim / plugin / tables / mi / ColorProvider.java
index 6aee0bd..0a1dc0c 100644 (file)
@@ -1,35 +1,49 @@
 package net.mograsim.plugin.tables.mi;
 
 import org.eclipse.jface.resource.ColorRegistry;
+import org.eclipse.jface.resource.FontRegistry;
 import org.eclipse.jface.util.IPropertyChangeListener;
 import org.eclipse.jface.viewers.TableViewer;
+import org.eclipse.swt.SWT;
 import org.eclipse.swt.graphics.Color;
+import org.eclipse.swt.graphics.Font;
+import org.eclipse.swt.widgets.Display;
+import org.eclipse.ui.themes.ITheme;
 import org.eclipse.ui.themes.IThemeManager;
 
+import net.mograsim.machine.mi.MicroInstructionMemory;
+
 public class ColorProvider
 {
        private final TableViewer viewer;
        private final IThemeManager themeManager;
+       private long highlightedAddress = -1;
        private ColorRegistry cRegistry;
+       private FontRegistry fRegistry;
+       private Font boldItalic;
 
-       private final static String modifBackground = "net.mograsim.plugin.modified_cell_bg_color",
-                       modifForeground = "net.mograsim.plugin.modified_cell_fg_color";
+       private final static String font = "net.mograsim.plugin.table_font",
+                       colorModifBackground = "net.mograsim.plugin.modified_cell_bg_color",
+                       colorModifForeground = "net.mograsim.plugin.modified_cell_fg_color",
+                       colorHighlightedForeground = "net.mograsim.plugin.highlighted_cell_fg_color",
+                       colorHighlightedBackground = "net.mograsim.plugin.highlighted_cell_bg_color";
        private final IPropertyChangeListener updateListener;
 
        public ColorProvider(TableViewer viewer, IThemeManager themeManager)
        {
                this.viewer = viewer;
                this.themeManager = themeManager;
-               this.cRegistry = themeManager.getCurrentTheme().getColorRegistry();
+               themeChanged(themeManager.getCurrentTheme());
                updateListener = e ->
                {
                        switch (e.getProperty())
                        {
                        case IThemeManager.CHANGE_CURRENT_THEME:
-                               cRegistry = themeManager.getCurrentTheme().getColorRegistry();
+                               themeChanged(themeManager.getCurrentTheme());
                                //$FALL-THROUGH$
-                       case modifBackground:
-                       case modifForeground:
+                       case font:
+                       case colorModifBackground:
+                       case colorModifForeground:
                                viewer.refresh();
                                break;
                        default:
@@ -39,19 +53,66 @@ public class ColorProvider
                themeManager.addPropertyChangeListener(updateListener);
        }
 
-       public Color getBackground(Object element, int index)
+       private void themeChanged(ITheme theme)
+       {
+               cRegistry = theme.getColorRegistry();
+               fRegistry = theme.getFontRegistry();
+               boldItalic = fRegistry.getDescriptor(font).setStyle(SWT.BOLD | SWT.ITALIC).createFont(Display.getDefault());
+       }
+
+       public Color getBackground(Object element, int column)
        {
                InstructionTableRow row = (InstructionTableRow) element;
+               if (isDefault(row, column))
+               {
+                       if (isHighlighted(row))
+                               return cRegistry.get(colorHighlightedBackground);
+                       return viewer.getTable().getBackground();
+               }
+               return cRegistry.get(colorModifBackground);
+       }
 
-               return row.data.getCell(row.address).getParameter(index).isDefault() ? viewer.getTable().getBackground()
-                               : cRegistry.get(modifBackground);
+       public Color getForeground(Object element, int column)
+       {
+               InstructionTableRow row = (InstructionTableRow) element;
+               if (isDefault(row, column))
+               {
+                       if (isHighlighted(row))
+                               return cRegistry.get(colorHighlightedForeground);
+                       return viewer.getTable().getForeground();
+               }
+               return cRegistry.get(colorModifForeground);
        }
 
-       public Color getForeground(Object element, int index)
+       public Font getFont(Object element, int column)
        {
                InstructionTableRow row = (InstructionTableRow) element;
-               return row.data.getCell(row.address).getParameter(index).isDefault() ? viewer.getTable().getForeground()
-                               : cRegistry.get(modifForeground);
+               boolean modified = !isDefault(row, column), highlighted = isHighlighted(row);
+               if (modified && highlighted)
+                       return boldItalic;
+               if (modified)
+                       return fRegistry.getItalic(font);
+               if (highlighted)
+                       return fRegistry.getBold(font);
+               return fRegistry.get(font);
+       }
+
+       private static boolean isDefault(InstructionTableRow row, int column)
+       {
+               return column == -1 ? true : row.data.getCell(row.address).getParameter(column).isDefault();
+       }
+
+       private boolean isHighlighted(InstructionTableRow row)
+       {
+               return highlightedAddress == row.address;
+       }
+
+       /**
+        * @param index Index of the row to highlight; An negative index means no row is highlighted
+        */
+       public void highlight(long row)
+       {
+               highlightedAddress = row + ((MicroInstructionMemory) viewer.getInput()).getDefinition().getMinimalAddress();
        }
 
        public void dispose()