private void drawDurations(final GanttRenderingData data, final GanttDraw ganttDrawData) {
   colorByTypeMap.clear();
   for (final IDuration d : data.getDurations()) {
     drawDurationItem(data, d, ganttDrawData);
     if (d.contains(data.getMarker())) {
       data.setMarkerAt(d);
     }
   }
 }
  private void drawDurationItem(
      final GanttRenderingData data, final IDuration d, final GanttDraw ganttDrawData) {
    final TaskLaneEntry taskFigure = lanes.get(d.getOwner().getName());

    // if task is filtered out
    if (taskFigure == null) {
      return;
    }
    final int y = LANE_START + taskFigure.getLane() * LANE_HEIGHT + DURATION_MARGIN;

    int xStart = ruler.toScreen(d.getStartTime()) - data.getBounds().x / 2;

    final Rectangle dataArea = getDataArea(data);
    dataArea.x = 0;
    if (xStart < dataArea.x) {
      xStart = dataArea.x;
    }
    int xEnd = ruler.toScreen(d.getStartTime() + d.getDurationTime()) - data.getBounds().x / 2;
    if (xEnd < dataArea.x) {
      return;
    }
    if (xEnd - xStart < 1) {
      xEnd = xStart + 1;
    }

    final Rectangle rect = new Rectangle(xStart, y, (xEnd - xStart), DURATION_HEIGHT);

    // If the rectangle width is enormous (when zooming a lot) the clipping
    // mechanism is not working, therefore limit the width below manually
    if (rect.width > dataArea.width) {
      rect.width = dataArea.width;
    }

    final ObjectFigure exec = new TaskExecution(d, rect);
    exec.setBackgroundColor(taskFigure.getBackgroundColor());

    doDrawEvents =
        SeUiPlugin.getDefault()
            .getPreferenceStore()
            .getBoolean(GanttPreferencePage.TAG_SHOW_EVENTS);
    if (doDrawEvents) {
      String idz =
          SeUiPlugin.getDefault()
              .getPreferenceStore()
              .getString(GanttPreferencePage.TAG_SHOW_EVENTS_IDS);
      if (typeReg != null && idz.length() > 0) {
        this.typeArray = idz.split(GanttPreferencePage.SEPARATOR);
      }
      if (typeArray != null && typeArray.length > 0) {
        drawLogEvents(data, d, ganttDrawData, y);
      }
    }
    ganttDrawData.add(exec);
  }
  @Override
  public void runSafe(final IAction action) {
    if (guardFail()) {
      return;
    }
    if (!(getSelection() instanceof IStructuredSelection)) {
      return;
    }
    final IStructuredSelection struct = (IStructuredSelection) getSelection();
    final Object firstElement = struct.getFirstElement();
    if (!(firstElement instanceof ArtifactSelection)) {
      return;
    }
    Object element = null;
    final ArtifactSelection artifactSelection = (ArtifactSelection) firstElement;
    element = artifactSelection.getItem();
    if (element instanceof IActivity) {
      final IActivity activity = (IActivity) element;
      element = activity.getOwner();
    } else if (element instanceof IDuration) {
      final IDuration abstractDuration = (IDuration) element;
      element = abstractDuration.getOwner();
    }

    if (!(element instanceof IArtifact) && !(element instanceof ILogEvent)) {
      return;
    }
    final ArtifactColorMap colorMap = artifactSelection.getSource().getLog().getColorMap();
    final ColorDialog dlg = new ColorDialog(Display.getDefault().getActiveShell());
    final RGB color = dlg.open();
    if (color == null) {
      return;
    }

    if (element instanceof IArtifact) {
      final IArtifact abstractArtifact = (IArtifact) element;
      colorMap.setColor(abstractArtifact, color);
    } else if (element instanceof ILogEvent) {
      ILogEvent o = (ILogEvent) element;
      final ILogEvent event = (ILogEvent) o;
      final IEventColorProvider colorProvider =
          getServiceProvider().getService(IEventColorProvider.class);
      final IColor clr = ColorAdapter.valueOf(color);
      colorProvider.setColor(event.getType(), clr);
    }
  }
  @SuppressWarnings("unchecked")
  private void drawLogEvents(
      final GanttRenderingData data,
      final IDuration d,
      final GanttDraw ganttDrawData,
      final int y) {
    List events = data.getEvents();

    AbstractLogEvent seed = new AbstractLogEvent() {};
    seed.setTs(d.getStartTime());
    int index = Collections.binarySearch(events, seed);
    index = index < 0 ? -index - 1 : index;

    Object durationCore = 0;
    Object genericCore = 0;
    short durationCoreS = 0;
    short genericCoreS = 0;

    for (int i = index; i < data.getEvents().size(); i++) {
      ILogEvent e = data.getEvents().get(i);
      if (!d.contains(e.getTs())) {
        break;
      }

      if (d instanceof IGenericLogItem && e instanceof IGenericLogItem) {
        final IGenericLogItem durationEvent = (IGenericLogItem) d;
        durationCore = durationEvent.getProperty(GenericTypePackage.EXECUTION_UNIT);
        final IGenericLogItem genericEvent = (IGenericLogItem) e;
        genericCore = genericEvent.getProperty(GenericTypePackage.EXECUTION_UNIT);
        if (durationCore != null && genericCore != null) {
          durationCoreS = (Short) durationCore;
          genericCoreS = (Short) genericCore;
          if (durationCoreS != genericCoreS) {
            continue;
          }
        }
      }
      for (int ii = 0; ii < typeArray.length; ii++) {
        try {
          IType type2 = typeReg.getType(typeArray[ii]);
          if (type2 != null) {
            if (e.getType() == type2) {
              final int x = ruler.toScreen(e.getTs());
              if (x < 0) {
                break;
              } else {
                final Event event = new Event(e, x, y, 2, DURATION_HEIGHT);
                ganttDrawData.add(event);
                event.setZ(10000000);

                // Actual element
                final IColor eventColor = data.getColorProvider().getColor(e.getType());
                colorByTypeMap.put(e.getType(), eventColor.toColor());
                if (eventColor == null) {
                  event.setBackgroundColor(SWTResourceManager.getColor(200, 20, 40));
                } else {
                  event.setBackgroundColor(eventColor.toColor());
                }
                break;
              }
            }
          }
        } catch (IllegalArgumentException err) {
          // Ignore type, does not exist any more.
        }
      }
    }
  }