Skip to Content
Author's profile photo Andreas Gautsch

Coloring systems in ABAP in Eclipse

One feature I was missing since I switched from SAP GUI to ABAP in Eclipse is the possibility to change the color theme for specific systems, in particular different themes for Development, Quality Assurance and the Productive system.

Therefore I started to build a plugin functionality for the ABAP in Eclipse Editor that enables coloring of my different ABAP projects.

The plugin is not already completely ready. But at least its very easy to get it up and running – so give it a try. There are only 3 simple steps to get colored projects in ABAP in Eclipse:

  1. Download and install the free plugin ABAP Continuous Integration from the Eclipse Marketplace
  2. Open Window->Preferences Section ABAP CI and activate one or more of the selection boxes at the end of the configuration tab. The coloring functionality can be set for  tab header, left ruler bar and / or right ruler bar
  3. Open Window->Show View->Other and Search for the “ABAP Colored Projects” view to assign colors for specific projects

 

The source code for the plugin can be found at: https://github.com/andau/abapCI. Ideas welcome.

Some remarks on the current functionality:

  • the tab header works for all development objects but  my PC is flickering when changing  from one ABAP project to another
  • the coloring for the left and right bar works quite good, but it does not work for example for transactions as there are no left and right bars
  • on the left and right bars annotations are shown – therefore I do not use the coloring for the DEV system–> I am currently working with left and right bar coloring enabled for all not DEV systems and skip the tab header coloring

There are still some small flaws in the functionality. Like the first opened editor in a new system is not colored at the first time and when working on two screens the tab header coloring does not work perfectly.

I am curious about suggestions to improve the functionality, in particular ideas about other possible visualisation options or even a yet existing better solution.

Have colorful Easter Holidays,

Andreas

 

 

Assigned Tags

      14 Comments
      You must be Logged on to comment or reply to a post.
      Author's profile photo Roberto Forti dos Santos
      Roberto Forti dos Santos

      Hi Andreas,

      Great! I will try it.

      Regards,

      Roberto

       

      Author's profile photo Micky Oestreich
      Micky Oestreich

      Hi Andreas,

      'Nice feature', was my first reaction. So I downloaded it and installed it.

      But unfortunately, it does not work well together with the darkest of dark theme I'm using. The ABAP CI plug-in messes up the entire settings (see picture).

      Any idea what causes this? Would be nice to use both plugins, alongside.

      Kind regards,

      Micky

      P.S. After uninstalling the ABAP CI plugin, the dark theme is working just fine again.

       

      Author's profile photo Andreas Gautsch
      Andreas Gautsch
      Blog Post Author

      Hei Micky!

      Sorry if the plugin messed up your development environment a bit – thats really not the intention.

      I installed the darkest of dark theme and I think if you deactivate the two options:

      – change theme layout on failed tests
      – chage color of tab header for colored projects

      … then you should get only a colored bar and the rest of the  theme remains unchanged.

      Maybe you have to  reset the dark theme and restart Eclipse once after disabling the two checkboxes. I could only verfiy on a Neo Eclipse with Oxygen the darkest dark theme g

      As far as I have seen a programmatically initialized Theme change always starts from the Default theme, I have to check if this can be changed.

      Let me know if  it works for you if you deactivate the two mentioned options.

      Regards, Andreas

      Author's profile photo Micky Oestreich
      Micky Oestreich

      I give it another try on tuesday. I'll keep you informed.

       

      Thanks.

      Micky.

      Author's profile photo Micky Oestreich
      Micky Oestreich

      Hi Andreas,

      indeed this works, however the coloring does not always 'cover' the entire (left) side bar as one can see in the image below.

       

      But no real argument not to keep using this plugin.

      Thanks.

      Gr. Micky.

       

      Author's profile photo Andreas Gautsch
      Andreas Gautsch
      Blog Post Author

      Hi!

      I didn't want to override the marker functionality for the scope of the current method.

      Of course not yet perfect, but I am happy that the darkest dark theme is not messed up any more 🙂

      Author's profile photo Michelle Crapo
      Michelle Crapo

      Woohoo!!! Color.

      I'll have to download.  Thank you,

      Michelle

      Author's profile photo Dominik Di Lorenzo
      Dominik Di Lorenzo

      Hi Andreas,

      thanks for sharing this tool!

       

      I tried to use the coloring, but when I open the view 'ABAP Colored Projects' I get the error message 'Failed to create the part's controls' ( details at the end of this comment).

      Any idea what could be the problem?

       

      Best regards,

      Dominik

       

      java.lang.NullPointerException
      at abapci.xml.ColoredProjectModelXml.getColoredProjects(ColoredProjectModelXml.java:130)
      at abapci.model.ColoredProjectModel.getColoredProjects(ColoredProjectModel.java:33)
      at abapci.presenter.ColoredProjectsPresenter.setViewerInput(ColoredProjectsPresenter.java:25)
      at abapci.presenter.ColoredProjectsPresenter.<init>(ColoredProjectsPresenter.java:16)
      at abapci.views.AbapCiColoredProjectView.createPartControl(AbapCiColoredProjectView.java:54)
      at org.eclipse.ui.internal.e4.compatibility.CompatibilityPart.createPartControl(CompatibilityPart.java:151)
      at org.eclipse.ui.internal.e4.compatibility.CompatibilityView.createPartControl(CompatibilityView.java:147)
      at org.eclipse.ui.internal.e4.compatibility.CompatibilityPart.create(CompatibilityPart.java:355)
      at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
      at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
      at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
      at java.lang.reflect.Method.invoke(Unknown Source)
      at org.eclipse.e4.core.internal.di.MethodRequestor.execute(MethodRequestor.java:55)
      at org.eclipse.e4.core.internal.di.InjectorImpl.processAnnotated(InjectorImpl.java:990)
      at org.eclipse.e4.core.internal.di.InjectorImpl.processAnnotated(InjectorImpl.java:955)
      at org.eclipse.e4.core.internal.di.InjectorImpl.inject(InjectorImpl.java:124)
      at org.eclipse.e4.core.internal.di.InjectorImpl.internalMake(InjectorImpl.java:399)
      at org.eclipse.e4.core.internal.di.InjectorImpl.make(InjectorImpl.java:318)
      at org.eclipse.e4.core.contexts.ContextInjectionFactory.make(ContextInjectionFactory.java:162)
      at org.eclipse.e4.ui.internal.workbench.ReflectionContributionFactory.createFromBundle(ReflectionContributionFactory.java:105)
      at org.eclipse.e4.ui.internal.workbench.ReflectionContributionFactory.doCreate(ReflectionContributionFactory.java:74)
      at org.eclipse.e4.ui.internal.workbench.ReflectionContributionFactory.create(ReflectionContributionFactory.java:56)
      at org.eclipse.e4.ui.workbench.renderers.swt.ContributedPartRenderer.createWidget(ContributedPartRenderer.java:129)
      at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine.createWidget(PartRenderingEngine.java:992)
      at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine.safeCreateGui(PartRenderingEngine.java:661)
      at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine$1.run(PartRenderingEngine.java:546)
      at org.eclipse.core.runtime.SafeRunner.run(SafeRunner.java:42)
      at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine.createGui(PartRenderingEngine.java:530)
      at org.eclipse.e4.ui.workbench.renderers.swt.ElementReferenceRenderer.createWidget(ElementReferenceRenderer.java:70)
      at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine.createWidget(PartRenderingEngine.java:992)
      at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine.safeCreateGui(PartRenderingEngine.java:661)
      at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine.safeCreateGui(PartRenderingEngine.java:767)
      at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine.access$0(PartRenderingEngine.java:738)
      at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine$2.run(PartRenderingEngine.java:732)
      at org.eclipse.core.runtime.SafeRunner.run(SafeRunner.java:42)
      at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine.createGui(PartRenderingEngine.java:716)
      at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine.subscribeTopicToBeRendered(PartRenderingEngine.java:154)
      at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
      at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
      at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
      at java.lang.reflect.Method.invoke(Unknown Source)
      at org.eclipse.e4.core.internal.di.MethodRequestor.execute(MethodRequestor.java:55)
      at org.eclipse.e4.core.di.internal.extensions.EventObjectSupplier$DIEventHandler.handleEvent(EventObjectSupplier.java:88)
      at org.eclipse.equinox.internal.event.EventHandlerWrapper.handleEvent(EventHandlerWrapper.java:201)
      at org.eclipse.equinox.internal.event.EventHandlerTracker.dispatchEvent(EventHandlerTracker.java:197)
      at org.eclipse.equinox.internal.event.EventHandlerTracker.dispatchEvent(EventHandlerTracker.java:1)
      at org.eclipse.osgi.framework.eventmgr.EventManager.dispatchEvent(EventManager.java:230)
      at org.eclipse.osgi.framework.eventmgr.ListenerQueue.dispatchEventSynchronous(ListenerQueue.java:148)
      at org.eclipse.equinox.internal.event.EventAdminImpl.dispatchEvent(EventAdminImpl.java:135)
      at org.eclipse.equinox.internal.event.EventAdminImpl.sendEvent(EventAdminImpl.java:78)
      at org.eclipse.equinox.internal.event.EventComponent.sendEvent(EventComponent.java:39)
      at org.eclipse.e4.ui.services.internal.events.EventBroker.send(EventBroker.java:52)
      at org.eclipse.e4.ui.internal.workbench.UIEventPublisher.notifyChanged(UIEventPublisher.java:60)
      at org.eclipse.emf.common.notify.impl.BasicNotifierImpl.eNotify(BasicNotifierImpl.java:374)
      at org.eclipse.e4.ui.model.application.ui.impl.UIElementImpl.setToBeRendered(UIElementImpl.java:303)
      at org.eclipse.e4.ui.internal.workbench.ModelServiceImpl.showElementInWindow(ModelServiceImpl.java:615)
      at org.eclipse.e4.ui.internal.workbench.ModelServiceImpl.bringToTop(ModelServiceImpl.java:584)
      at org.eclipse.e4.ui.internal.workbench.PartServiceImpl.delegateBringToTop(PartServiceImpl.java:769)
      at org.eclipse.e4.ui.internal.workbench.PartServiceImpl.activate(PartServiceImpl.java:743)
      at org.eclipse.e4.ui.internal.workbench.PartServiceImpl.activate(PartServiceImpl.java:681)
      at org.eclipse.e4.ui.internal.workbench.PartServiceImpl.activate(PartServiceImpl.java:676)
      at org.eclipse.e4.ui.internal.workbench.PartServiceImpl.showPart(PartServiceImpl.java:1179)
      at org.eclipse.ui.internal.WorkbenchPage.showPart(WorkbenchPage.java:1287)
      at org.eclipse.ui.internal.WorkbenchPage.busyShowView(WorkbenchPage.java:1278)
      at org.eclipse.ui.internal.WorkbenchPage$12.run(WorkbenchPage.java:4329)
      at org.eclipse.swt.custom.BusyIndicator.showWhile(BusyIndicator.java:70)
      at org.eclipse.ui.internal.WorkbenchPage.showView(WorkbenchPage.java:4325)
      at org.eclipse.ui.internal.WorkbenchPage.showView(WorkbenchPage.java:4305)
      at org.eclipse.ui.handlers.ShowViewHandler.openView(ShowViewHandler.java:132)
      at org.eclipse.ui.handlers.ShowViewHandler.openOther(ShowViewHandler.java:110)
      at org.eclipse.ui.handlers.ShowViewHandler.execute(ShowViewHandler.java:77)
      at org.eclipse.ui.internal.handlers.HandlerProxy.execute(HandlerProxy.java:291)
      at org.eclipse.ui.internal.handlers.E4HandlerProxy.execute(E4HandlerProxy.java:92)
      at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
      at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
      at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
      at java.lang.reflect.Method.invoke(Unknown Source)
      at org.eclipse.e4.core.internal.di.MethodRequestor.execute(MethodRequestor.java:55)
      at org.eclipse.e4.core.internal.di.InjectorImpl.invokeUsingClass(InjectorImpl.java:305)
      at org.eclipse.e4.core.internal.di.InjectorImpl.invoke(InjectorImpl.java:239)
      at org.eclipse.e4.core.contexts.ContextInjectionFactory.invoke(ContextInjectionFactory.java:132)
      at org.eclipse.e4.core.commands.internal.HandlerServiceHandler.execute(HandlerServiceHandler.java:152)
      at org.eclipse.core.commands.Command.executeWithChecks(Command.java:494)
      at org.eclipse.core.commands.ParameterizedCommand.executeWithChecks(ParameterizedCommand.java:487)
      at org.eclipse.e4.core.commands.internal.HandlerServiceImpl.executeHandler(HandlerServiceImpl.java:210)
      at org.eclipse.ui.internal.handlers.LegacyHandlerService.executeCommand(LegacyHandlerService.java:390)
      at org.eclipse.ui.internal.ShowViewMenu$1.run(ShowViewMenu.java:139)
      at org.eclipse.jface.action.Action.runWithEvent(Action.java:473)
      at org.eclipse.jface.action.ActionContributionItem.handleWidgetSelection(ActionContributionItem.java:565)
      at org.eclipse.jface.action.ActionContributionItem.lambda$4(ActionContributionItem.java:397)
      at org.eclipse.swt.widgets.EventTable.sendEvent(EventTable.java:86)
      at org.eclipse.swt.widgets.Display.sendEvent(Display.java:4428)
      at org.eclipse.swt.widgets.Widget.sendEvent(Widget.java:1079)
      at org.eclipse.swt.widgets.Display.runDeferredEvents(Display.java:4238)
      at org.eclipse.swt.widgets.Display.readAndDispatch(Display.java:3817)
      at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine$5.run(PartRenderingEngine.java:1150)
      at org.eclipse.core.databinding.observable.Realm.runWithDefault(Realm.java:336)
      at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine.run(PartRenderingEngine.java:1039)
      at org.eclipse.e4.ui.internal.workbench.E4Workbench.createAndRunUI(E4Workbench.java:153)
      at org.eclipse.ui.internal.Workbench.lambda$3(Workbench.java:680)
      at org.eclipse.core.databinding.observable.Realm.runWithDefault(Realm.java:336)
      at org.eclipse.ui.internal.Workbench.createAndRunWorkbench(Workbench.java:594)
      at org.eclipse.ui.PlatformUI.createAndRunWorkbench(PlatformUI.java:148)
      at org.eclipse.ui.internal.ide.application.IDEApplication.start(IDEApplication.java:151)
      at org.eclipse.equinox.internal.app.EclipseAppHandle.run(EclipseAppHandle.java:196)
      at org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.runApplication(EclipseAppLauncher.java:134)
      at org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.start(EclipseAppLauncher.java:104)
      at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:388)
      at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:243)
      at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
      at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
      at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
      at java.lang.reflect.Method.invoke(Unknown Source)
      at org.eclipse.equinox.launcher.Main.invokeFramework(Main.java:653)
      at org.eclipse.equinox.launcher.Main.basicRun(Main.java:590)
      at org.eclipse.equinox.launcher.Main.run(Main.java:1499)

       

       

      Author's profile photo Andreas Gautsch
      Andreas Gautsch
      Blog Post Author

      Hi Dominik!

       

      Could you please try to update the plugin to version 0.3.4.

      Maybe you have to additionally delete the following file on your computer and restart eclipse: $WORKSPACE\.metadata\.plugins\com.abapci.core\coloredProjectModel.xml

      Then hopefully it works also in your Environment.

      Regards, Andreas

      Author's profile photo Thomas Zehnder
      Thomas Zehnder

      Hi Andreas,

      i would love to have your addon in my eclipse envirement. because i am a starter using eclipse as my development envirement, the coloring is one thing that i miss most.

      Unfortunately i am not able to install your add on from eclipse marketplace... I get that error message after confirming the installation etc.:

      Cannot complete the install because one or more required items could not be found.
      Software currently installed: ABAP Continuous Integration 0.3.13 (com.abapci.feature.feature.group 0.3.13)
      Missing requirement: com.abapci.core 0.3.13 requires 'bundle com.sap.adt.atc 2.68.3' but it could not be found
      Cannot satisfy dependency:
      From: ABAP Continuous Integration 0.3.13 (com.abapci.feature.feature.group 0.3.13)
      To: com.abapci.core [0.3.13]

       

      Thx a lot for your feedback

      Tom

       

       

       

       

       

      Author's profile photo Andreas Gautsch
      Andreas Gautsch
      Blog Post Author

      Hi Thomas!

      This  seems for me that you have not installed one of the lates version of the ABAP Core Development tools.

      If you go to Help->About Eclipse->Installation Details, which Version do you see there for the ABAP Core Development Tools (Developer version)?

      Greetings, Andreas

       

      Author's profile photo Srikanth Peri
      Srikanth Peri

      Love it Andreas. Thanks!

      Author's profile photo Pavlo Astashonok
      Pavlo Astashonok

      Is it possible to change coloration by client for the same system, not by different systems?

      Author's profile photo Mark Combs
      Mark Combs

      Had ABAP CI working fine in 2023-03.  Did auto upgrade and now it's gone from menu and doesn't work anymore.