/**
 * Copyright (c) 2011, 2016 - Loetz GmbH&Co.KG (69115 Heidelberg, Germany)
 * 
 *  All rights reserved. This program and the accompanying materials
 *  are made available under the terms of the Eclipse Public License 2.0
 *  which accompanies this distribution, and is available at
 *  https://www.eclipse.org/legal/epl-2.0/
 * 
 *  SPDX-License-Identifier: EPL-2.0
 * 
 *  Contributors:
 * 	   Christophe Loetz (Loetz GmbH&Co.KG) - initial implementation
 * 
 * 
 *  This copyright notice shows up in the generated Java code
 */
package org.eclipse.osbp.xtext.messagedsl.ui.labeling;

import com.google.inject.Inject;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.emf.edit.ui.provider.AdapterFactoryLabelProvider;
import org.eclipse.osbp.xtext.basic.ui.labeling.BasicDSLLabelProvider;
import org.eclipse.osbp.xtext.messagedsl.MessageCategory;
import org.eclipse.osbp.xtext.messagedsl.MessageItem;
import org.eclipse.osbp.xtext.messagedsl.MessageModel;
import org.eclipse.osbp.xtext.messagedsl.MessagePackage;
import org.eclipse.osbp.xtext.messagedsl.MessageParameter;
import org.eclipse.osbp.xtext.messagedsl.MessageText;
import org.eclipse.osbp.xtext.messagedsl.ParameterTypeEnum;
import org.eclipse.swt.graphics.Image;

/**
 * Provides labels for a EObjects.
 * 
 * see http://www.eclipse.org/Xtext/documentation.html#labelProvider
 */
@SuppressWarnings("all")
public class MessageDslLabelProvider extends BasicDSLLabelProvider {
  @Inject
  public MessageDslLabelProvider(final AdapterFactoryLabelProvider delegate) {
    super(delegate);
  }
  
  @Override
  public Object text(final Object o) {
    Object _switchResult = null;
    boolean _matched = false;
    if (o instanceof MessageCategory) {
      _matched=true;
      _switchResult = this.generateText(o, "category", ((MessageCategory)o).getName());
    }
    if (!_matched) {
      if (o instanceof MessageItem) {
        _matched=true;
        _switchResult = this.generateText(o, "item", ((MessageItem)o).getName());
      }
    }
    if (!_matched) {
      if (o instanceof MessageParameter) {
        _matched=true;
        String _switchResult_1 = null;
        ParameterTypeEnum _oftype = ((MessageParameter)o).getOftype();
        if (_oftype != null) {
          switch (_oftype) {
            case BOOLEAN:
              _switchResult_1 = this.generateText(o, "boolean param", ((MessageParameter)o).getName());
              break;
            case INTEGER:
              _switchResult_1 = this.generateText(o, "integer param", ((MessageParameter)o).getName());
              break;
            case DOUBLE:
              _switchResult_1 = this.generateText(o, "double param", ((MessageParameter)o).getName());
              break;
            case STRING:
              _switchResult_1 = this.generateText(o, "string param", ((MessageParameter)o).getName());
              break;
            case CLASS:
              _switchResult_1 = this.generateText(o, "class param", ((MessageParameter)o).getName());
              break;
            case OBJECT:
              _switchResult_1 = this.generateText(o, "object param", ((MessageParameter)o).getName());
              break;
            case EXCEPTION:
              _switchResult_1 = this.generateText(o, "exception param", ((MessageParameter)o).getName());
              break;
            default:
              break;
          }
        }
        _switchResult = _switchResult_1;
      }
    }
    if (!_matched) {
      if (o instanceof MessageText) {
        _matched=true;
        String _xblockexpression = null;
        {
          EObject _eContainer = ((MessageText)o).eContainer();
          final MessageItem item = ((MessageItem) _eContainer);
          String desc = "format";
          boolean _equals = ((MessageText)o).equals(item.getLogOutput());
          if (_equals) {
            desc = "log format";
          } else {
            boolean _equals_1 = ((MessageText)o).equals(item.getShowOutput());
            if (_equals_1) {
              desc = "show format";
            }
          }
          _xblockexpression = this.generateText(o, desc, ((MessageText)o).getText());
        }
        _switchResult = _xblockexpression;
      }
    }
    if (!_matched) {
      _switchResult = super.text(o);
    }
    return _switchResult;
  }
  
  @Override
  public Object image(final Object o) {
    Image _switchResult = null;
    boolean _matched = false;
    if (o instanceof MessageModel) {
      _matched=true;
      _switchResult = this.getInternalImage("dsl_message.gif", this.getClass());
    }
    if (!_matched) {
      if (o instanceof MessagePackage) {
        _matched=true;
        _switchResult = this.getInternalImage("package.gif", this.getClass());
      }
    }
    if (!_matched) {
      if (o instanceof MessageCategory) {
        _matched=true;
        _switchResult = this.getInternalImage("category.gif", this.getClass());
      }
    }
    if (!_matched) {
      if (o instanceof MessageItem) {
        _matched=true;
        _switchResult = this.getInternalImage("message_info.gif", this.getClass());
      }
    }
    if (!_matched) {
      if (o instanceof MessageParameter) {
        _matched=true;
        Image _switchResult_1 = null;
        ParameterTypeEnum _oftype = ((MessageParameter)o).getOftype();
        if (_oftype != null) {
          switch (_oftype) {
            case BOOLEAN:
              _switchResult_1 = this.getInternalImage("boolean.gif", this.getClass());
              break;
            case INTEGER:
              _switchResult_1 = this.getInternalImage("int.gif", this.getClass());
              break;
            case DOUBLE:
              _switchResult_1 = this.getInternalImage("double.gif", this.getClass());
              break;
            case STRING:
              _switchResult_1 = this.getInternalImage("var_string.gif", this.getClass());
              break;
            case CLASS:
              _switchResult_1 = this.getInternalImage("class.gif", this.getClass());
              break;
            case OBJECT:
              _switchResult_1 = this.getInternalImage("object.png", this.getClass());
              break;
            case EXCEPTION:
              _switchResult_1 = this.getInternalImage("exception.gif", this.getClass());
              break;
            default:
              break;
          }
        }
        _switchResult = _switchResult_1;
      }
    }
    if (!_matched) {
      if (o instanceof MessageText) {
        _matched=true;
        Image _xblockexpression = null;
        {
          EObject _eContainer = ((MessageText)o).eContainer();
          final MessageItem item = ((MessageItem) _eContainer);
          Image _xifexpression = null;
          boolean _equals = ((MessageText)o).equals(item.getLogOutput());
          if (_equals) {
            _xifexpression = this.getInternalImage("agent_log_obj.gif", this.getClass());
          } else {
            Image _xifexpression_1 = null;
            boolean _equals_1 = ((MessageText)o).equals(item.getShowOutput());
            if (_equals_1) {
              _xifexpression_1 = this.getInternalImage("dsl_dialog.gif", this.getClass());
            } else {
              _xifexpression_1 = this.getInternalImage("formatbuilder.gif", this.getClass());
            }
            _xifexpression = _xifexpression_1;
          }
          _xblockexpression = _xifexpression;
        }
        _switchResult = _xblockexpression;
      }
    }
    if (!_matched) {
      _switchResult = null;
    }
    return _switchResult;
  }
}
