Package org.dyno.visual.swing.parser.listener

Source Code of org.dyno.visual.swing.parser.listener.AbstractClassModel

/************************************************************************************
* Copyright (c) 2008 William Chen.                                                 *
*                                                                                  *
* 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 *
*                                                                                  *
* Use is subject to the terms of Eclipse Public License v1.0.                      *
*                                                                                  *
* Contributors:                                                                    *
*     William Chen - initial API and implementation.                               *
************************************************************************************/

package org.dyno.visual.swing.parser.listener;

import java.beans.EventSetDescriptor;
import java.beans.MethodDescriptor;
import java.lang.reflect.Method;
import java.util.List;

import org.dyno.visual.swing.parser.NamespaceUtil;
import org.dyno.visual.swing.plugin.spi.IConstants;
import org.dyno.visual.swing.plugin.spi.IEventListenerModel;
import org.dyno.visual.swing.plugin.spi.WidgetAdapter;
import org.eclipse.jdt.core.dom.Block;
import org.eclipse.jdt.core.dom.Expression;
import org.eclipse.jdt.core.dom.ExpressionStatement;
import org.eclipse.jdt.core.dom.IfStatement;
import org.eclipse.jdt.core.dom.MethodDeclaration;
import org.eclipse.jdt.core.dom.MethodInvocation;
import org.eclipse.jdt.core.dom.SimpleName;
import org.eclipse.jdt.core.dom.Statement;
import org.eclipse.jdt.core.dom.TypeDeclaration;

@SuppressWarnings("unchecked")
public abstract class AbstractClassModel implements IEventListenerModel, IConstants {
  protected EventSetDescriptor eventSet;
  protected WidgetAdapter adapter;

 
  public void init(WidgetAdapter adapter, EventSetDescriptor eventSet) {
    this.adapter = adapter;
    this.eventSet = eventSet;
  }

  public boolean parse(TypeDeclaration type){
    MethodDescriptor[] mListeners = eventSet.getListenerMethodDescriptors();
    boolean success = false;
    for (MethodDescriptor mListener : mListeners) {
      if (createEventMethod(adapter, eventSet, mListener, type))
        success = true;
    }
    return success;
  }

  private boolean createEventMethod(WidgetAdapter adapter, EventSetDescriptor esd, MethodDescriptor mListener, TypeDeclaration type) {
    MethodDeclaration[] mds = type.getMethods();
    boolean success = false;
    for (MethodDeclaration md : mds) {
      String mdName = md.getName().getFullyQualifiedName();
      if (adapter.isRoot()) {
        if (mdName.equals(INIT_METHOD_NAME)) {
          if (createEventMethodForWidget(type, adapter, esd, mListener, md))
            success = true;
          break;
        }
      } else {
        String getName = NamespaceUtil.getGetMethodName(adapter, adapter.getID());
        if (mdName.equals(getName)) {
          if (createEventMethodForWidget(type, adapter, esd, mListener, md))
            success = true;
          break;
        }
      }
    }
    return success;
  }

 
  private boolean createEventMethodForWidget(TypeDeclaration type, WidgetAdapter adapter, EventSetDescriptor esd, MethodDescriptor mListener, MethodDeclaration md) {
    Block body = md.getBody();
    List statements = body.statements();
    if (!adapter.isRoot()&&!statements.isEmpty()) {
      Object firstStatement = statements.get(0);
      if (firstStatement instanceof IfStatement) {
        IfStatement ifstatement = (IfStatement) firstStatement;
        Statement thenstatement = ifstatement.getThenStatement();
        if (thenstatement instanceof Block) {
          statements = ((Block) thenstatement).statements();
        }
      }
    }
    boolean success = false;
    for (Object stmt : statements) {
      Statement statement = (Statement) stmt;
      if (statement instanceof ExpressionStatement) {
        if (processWidgetCreationStatement(type, adapter, esd, mListener, statement))
          success = true;
      }
    }
    return success;
  }

  private boolean processWidgetCreationStatement(TypeDeclaration type, WidgetAdapter adapter, EventSetDescriptor esd, MethodDescriptor mListener, Statement statement) {
    ExpressionStatement expressionStatement = (ExpressionStatement) statement;
    Expression expression = expressionStatement.getExpression();
    if (expression instanceof MethodInvocation) {
      MethodInvocation mi = (MethodInvocation) expression;
      if (adapter.isRoot()) {
        return createAddMethod(type, adapter, esd, mListener, mi);
      } else {
        Expression optionalExpression = mi.getExpression();
        if (optionalExpression instanceof SimpleName) {
          SimpleName simplename = (SimpleName) optionalExpression;
          String idName = simplename.getFullyQualifiedName();
          if (idName.equals(adapter.getID()))
            return createAddMethod(type, adapter, esd, mListener, mi);
          else
            return false;
        } else
          return false;
      }
    } else
      return false;
  }

  private boolean createAddMethod(TypeDeclaration type, WidgetAdapter adapter, EventSetDescriptor esd, MethodDescriptor mListener, MethodInvocation mi) {
    Method addm = esd.getAddListenerMethod();
    String addmName = addm.getName();
    String mName = mi.getName().getFullyQualifiedName();
    if (mName.equals(addmName)) {
      return processAddListenerStatement(type, adapter, esd, mListener, mi);
    } else
      return false;
  }
  protected abstract boolean processAddListenerStatement(TypeDeclaration type, WidgetAdapter adapter, EventSetDescriptor esd, MethodDescriptor mListener, MethodInvocation mi);
}

TOP

Related Classes of org.dyno.visual.swing.parser.listener.AbstractClassModel

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.