/**
 * 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 v1.0
 *  which accompanies this distribution, and is available at
 *  http://www.eclipse.org/legal/epl-v10.html
 * 
 *  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;
  }
}
