Package org.eclipse.jst.pagedesigner.editors.actions

Source Code of org.eclipse.jst.pagedesigner.editors.actions.SkinsMenuItemBuilder$ChangeCurrentSkinAction

/*******************************************************************************
* Copyright (c) 2009 Oracle Corporation.
* 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:
*    Ian Trimble - initial API and implementation
*******************************************************************************/
package org.eclipse.jst.pagedesigner.editors.actions;

import java.util.ArrayList;
import java.util.List;

import org.eclipse.core.resources.IProject;
import org.eclipse.jface.action.Action;
import org.eclipse.jface.action.IMenuManager;
import org.eclipse.jface.action.MenuManager;
import org.eclipse.jface.action.Separator;
import org.eclipse.jst.jsf.common.metadata.Model;
import org.eclipse.jst.jsf.common.metadata.Trait;
import org.eclipse.jst.jsf.common.metadata.internal.IMetaDataDomainContext;
import org.eclipse.jst.jsf.common.metadata.internal.TraitValueHelper;
import org.eclipse.jst.jsf.common.metadata.query.internal.MetaDataQueryContextFactory;
import org.eclipse.jst.jsf.common.metadata.query.internal.MetaDataQueryFactory;
import org.eclipse.jst.jsf.common.metadata.query.internal.taglib.ITaglibDomainMetaDataQuery;
import org.eclipse.jst.pagedesigner.dtresourceprovider.DTResourceProviderFactory;
import org.eclipse.jst.pagedesigner.dtresourceprovider.DTSkinManager;
import org.eclipse.jst.pagedesigner.dtresourceprovider.IDTResourceProvider;
import org.eclipse.jst.pagedesigner.dtresourceprovider.IDTSkin;
import org.eclipse.jst.pagedesigner.utils.EditorUtil;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.events.SelectionListener;
import org.eclipse.swt.widgets.Menu;
import org.eclipse.swt.widgets.MenuItem;
import org.eclipse.ui.IWorkbenchActionConstants;

/**
* Builds menu items for managing skins.
*
* @author Ian Trimble - Oracle
*/
public class SkinsMenuItemBuilder {

  private static final String DATAKEY_DTSKIN = "DATAKEY_DTSKIN"; //$NON-NLS-1$
  private static final String DATAKEY_NSURI = "DTATKEY_NSURI"; //$NON-NLS-1$

  private static List<Menu> menuList = new ArrayList<Menu>();

  private IProject project;

  /**
   * Constructs an instance.
   *
   * @param project IProject instance for which to get skin information.
   */
  public SkinsMenuItemBuilder(IProject project) {
    this.project = project;
  }

  /**
   * Builds menu items (adds a separator and then menu items to end of
   * specified menu.
   *
   * @param menu Menu instance to which to add menu items.
   */
  public void buildMenuItems(Menu menu) {
    for (Menu oldMenu: menuList) {
      oldMenu.dispose();
    }
    if (menu != null) {
      List<TaglibData> taglibDataList = getTaglibDataList();
      if (taglibDataList.size() > 0) {
        new MenuItem(menu, SWT.SEPARATOR);
      }
      for (TaglibData taglibData: taglibDataList) {
        String nsURI = taglibData.getNSURI();
        DTSkinManager dtSkinManager = DTSkinManager.getInstance(project);
        IDTSkin currentDTSkin = dtSkinManager.getCurrentSkin(nsURI);
        MenuItem menuItem = new MenuItem(menu, SWT.CASCADE);
        menuItem.setText(taglibData.getName());
        Menu skinMenu = new Menu(menuItem);
        menuList.add(skinMenu);
        menuItem.setMenu(skinMenu);
        List<IDTSkin> dtSkins = dtSkinManager.getSkins(nsURI);
        for (IDTSkin dtSkin: dtSkins) {
          MenuItem skinMenuItem;
          if (currentDTSkin == dtSkin) {
            skinMenuItem = new MenuItem(skinMenu, SWT.CHECK);
            skinMenuItem.setSelection(true);
          } else {
            skinMenuItem = new MenuItem(skinMenu, SWT.PUSH);
          }
          skinMenuItem.setText(dtSkin.getName());
          skinMenuItem.setData(DATAKEY_DTSKIN, dtSkin);
          skinMenuItem.setData(DATAKEY_NSURI, nsURI);
          skinMenuItem.addSelectionListener(new SkinSelectionListener());
        }
      }
    }
  }

  /**
   * Builds menu managers.
   *
   * @param parent Parent menu manager to which to append new menu managers.
   */
  public void buildMenuManagers(IMenuManager parent) {
    List<TaglibData> taglibDataList = getTaglibDataList();
    if (taglibDataList.size() > 0) {
      parent.appendToGroup(IWorkbenchActionConstants.MB_ADDITIONS, new Separator());
    }
    for (TaglibData taglibData: taglibDataList) {
      String nsURI = taglibData.getNSURI();
      MenuManager newMgr = new MenuManager(taglibData.getName());
      DTSkinManager dtSkinManager = DTSkinManager.getInstance(project);
      IDTSkin currentDTSkin = dtSkinManager.getCurrentSkin(nsURI);
      List<IDTSkin> dtSkins = dtSkinManager.getSkins(nsURI);
      for (IDTSkin dtSkin: dtSkins) {
        newMgr.add(new ChangeCurrentSkinAction(nsURI, dtSkin, dtSkin == currentDTSkin));
      }
      parent.appendToGroup(IWorkbenchActionConstants.MB_ADDITIONS, newMgr);
    }
  }

  private List<TaglibData> getTaglibDataList() {
    List<TaglibData> taglibDataList = new ArrayList<TaglibData>();
    List<IDTResourceProvider> dtResourceProviders =
      DTResourceProviderFactory.getInstance().getActiveDTResourceProviders(project);
    for (IDTResourceProvider dtResourceProvider: dtResourceProviders) {
      TaglibData taglibData = new TaglibData(dtResourceProvider.getId());
      if (!taglibDataList.contains(taglibData)) {
        taglibDataList.add(taglibData);
      }
    }
    return taglibDataList;
  }



  /**
   * Used to hold and pass taglib-related data.
   */
  private class TaglibData {
    private String nsURI;
    private String name;
    public TaglibData(String nsURI) {
      this.nsURI = nsURI;
      final IMetaDataDomainContext context = MetaDataQueryContextFactory.getInstance().createTaglibDomainModelContext(project);
      final ITaglibDomainMetaDataQuery query = MetaDataQueryFactory.getInstance().createQuery(context);

      final Model model = query.findTagLibraryModel(nsURI);
      final Trait trait = query.findTrait(model, "display-label"); //$NON-NLS-1$
      this.name = TraitValueHelper.getValueAsString(trait);
    }
    public String getNSURI() {
      return nsURI;
    }
    public String getName() {
      if (name == null) {
        return nsURI;
      }
      return name;
    }
    /*
     * (non-Javadoc)
     * @see java.lang.Object#hashCode()
     */
    public int hashCode() {
      int nsURIHashCode = 0;
      if (nsURI != null) {
        nsURIHashCode = nsURI.hashCode();
      }
      int nameHashCode = 0;
      if (name != null) {
        nameHashCode = name.hashCode();
      }
      return nameHashCode | nsURIHashCode ;
    }
  }



  /**
   * Selection listener for skin menu items.
   */
  private class SkinSelectionListener implements SelectionListener {
    /*
     * (non-Javadoc)
     * @see org.eclipse.swt.events.SelectionListener#widgetSelected(org.eclipse.swt.events.SelectionEvent)
     */
    public void widgetSelected(SelectionEvent event) {
      String nsURI = (String)event.widget.getData(DATAKEY_NSURI);
      IDTSkin dtSkin = (IDTSkin)event.widget.getData(DATAKEY_DTSKIN);
      DTSkinManager.getInstance(project).setCurrentSkin(nsURI, dtSkin);
      EditorUtil.refreshAllWPEDesignViewers();
    }
    /*
     * (non-Javadoc)
     * @see org.eclipse.swt.events.SelectionListener#widgetDefaultSelected(org.eclipse.swt.events.SelectionEvent)
     */
    public void widgetDefaultSelected(SelectionEvent event) {
      widgetSelected(event);
    }
  }



  /**
   * Action for changing current skin.
   */
  private class ChangeCurrentSkinAction extends Action {
    private String nsURI;
    private IDTSkin dtSkin;
    /**
     * Creates an instance.
     *
     * @param nsURI NSURI of taglib.
     * @param dtSkin IDTSkin instance.
     * @param checked true if IDTSkin instance is current for nsURI.
     */
    public ChangeCurrentSkinAction(String nsURI, IDTSkin dtSkin, boolean checked) {
      super(dtSkin.getName());
      this.nsURI = nsURI;
      this.dtSkin = dtSkin;
      setChecked(checked);
    }
    /*
     * (non-Javadoc)
     * @see org.eclipse.jface.action.Action#run()
     */
    public void run() {
      DTSkinManager.getInstance(project).setCurrentSkin(nsURI, dtSkin);
      EditorUtil.refreshAllWPEDesignViewers();
    }
  }

}
TOP

Related Classes of org.eclipse.jst.pagedesigner.editors.actions.SkinsMenuItemBuilder$ChangeCurrentSkinAction

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.