Package org.dozer.eclipse.plugin.editorpage.utils

Source Code of org.dozer.eclipse.plugin.editorpage.utils.DozerUiUtils

/**
* Copyright 2005-2013 Dozer Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
*      http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.dozer.eclipse.plugin.editorpage.utils;

import org.dozer.eclipse.plugin.DozerMultiPageEditor;
import org.dozer.eclipse.plugin.DozerPlugin;
import org.dozer.eclipse.plugin.editorpage.Messages;
import org.eclipse.core.databinding.observable.list.IObservableList;
import org.eclipse.core.databinding.observable.value.IObservableValue;
import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.IProject;
import org.eclipse.jdt.core.IField;
import org.eclipse.jdt.core.IJavaProject;
import org.eclipse.jdt.core.IMethod;
import org.eclipse.jdt.core.IType;
import org.eclipse.jdt.core.JavaCore;
import org.eclipse.jdt.core.JavaModelException;
import org.eclipse.jdt.core.Signature;
import org.eclipse.jdt.core.search.IJavaSearchScope;
import org.eclipse.jdt.core.search.SearchEngine;
import org.eclipse.jdt.internal.ui.viewsupport.JavaElementImageProvider;
import org.eclipse.jdt.ui.IJavaElementSearchConstants;
import org.eclipse.jdt.ui.JavaUI;
import org.eclipse.jface.databinding.swt.SWTObservables;
import org.eclipse.jface.databinding.viewers.ObservableListContentProvider;
import org.eclipse.jface.text.IDocument;
import org.eclipse.jface.viewers.AbstractListViewer;
import org.eclipse.jface.viewers.ComboViewer;
import org.eclipse.jface.viewers.LabelProvider;
import org.eclipse.jface.viewers.StructuredSelection;
import org.eclipse.jface.window.Window;
import org.eclipse.swt.SWT;
import org.eclipse.swt.custom.BusyIndicator;
import org.eclipse.swt.custom.CCombo;
import org.eclipse.swt.events.FocusEvent;
import org.eclipse.swt.events.FocusListener;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.graphics.Color;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Text;
import org.eclipse.ui.IEditorInput;
import org.eclipse.ui.IFileEditorInput;
import org.eclipse.ui.PlatformUI;
import org.eclipse.ui.dialogs.SelectionDialog;
import org.eclipse.ui.forms.widgets.ExpandableComposite;
import org.eclipse.ui.forms.widgets.FormToolkit;
import org.eclipse.ui.forms.widgets.Section;
import org.eclipse.ui.forms.widgets.TableWrapData;
import org.eclipse.ui.forms.widgets.TableWrapLayout;
import org.eclipse.ui.texteditor.ITextEditor;
import org.eclipse.wst.xml.core.internal.Logger;
import org.eclipse.wst.xml.core.internal.document.ElementImpl;
import org.eclipse.wst.xml.core.internal.provisional.document.IDOMDocument;
import org.eclipse.wst.xml.core.internal.provisional.document.IDOMModel;
import org.springframework.ide.eclipse.beans.ui.editor.Activator;
import org.springframework.ide.eclipse.core.java.JdtUtils;
import org.w3c.dom.Element;

import java.util.List;

public class DozerUiUtils {

  private static DozerUiUtils instance;
 
  private IEditorInput editorInput;
  private static FormToolkit toolkit;
 
  private Image classImg = DozerPlugin.getDefault().getImageRegistry().getDescriptor(DozerPlugin.IMG_CLASS).createImage();
  private Image interfaceImg = DozerPlugin.getDefault().getImageRegistry().getDescriptor(DozerPlugin.IMG_INTERFACE).createImage();
 
  private IProject project;
  private IJavaProject javaProject;
  private DozerMultiPageEditor dozerEditor;
 
  public static DozerUiUtils getInstance() {
    if (instance == null)
      instance = new DozerUiUtils();
   
    return instance;
  }
 
  public IEditorInput getEditorInput() {
    return editorInput;
  }
 
  public static void setToolKit(FormToolkit toolkit) {
    DozerUiUtils.toolkit = toolkit;
  }
 
  public static FormToolkit getToolKit() {
    return DozerUiUtils.toolkit;
 
 
  public void setEditorInput(IEditorInput editorInput, FormToolkit toolkit) {
    IEditorInput oldInput = this.editorInput;
    this.editorInput = editorInput;
    DozerUiUtils.setToolKit(toolkit);
   
    if (oldInput != editorInput) {
      init();
    }
  }
 
  public void setMultiEditor(DozerMultiPageEditor dozerEditor) {
    this.dozerEditor = dozerEditor;
  }
 
  private void init() {
    project = getProject();
    javaProject = JavaCore.create(project);
  }
 
  private IProject getProject() {
    IFile file = null;
    if (editorInput instanceof IFileEditorInput) {
      file = ((IFileEditorInput) editorInput).getFile();
    } else
      return null; //Error

    return file.getProject();
  }
 
  public String doOpenClassSelectionDialog(String superType, boolean allowInterfaces) {
    IJavaSearchScope searchScope = null;
 
    IProject project = getProject();
    try {
      IJavaProject javaProject = JavaCore.create(project);
      if (superType != null) {
        IType superTypeType = javaProject.findType(superType);
        if (superTypeType != null) {
          searchScope = SearchEngine.createHierarchyScope(superTypeType);
        } else
          return null; //Error
      }
 
      SelectionDialog dialog =
        JavaUI.createTypeDialog(
          DozerPlugin.getActiveWorkbenchShell(),
          PlatformUI.getWorkbench().getProgressService(),
          searchScope,
          allowInterfaces?IJavaElementSearchConstants.CONSIDER_CLASSES_AND_INTERFACES:IJavaElementSearchConstants.CONSIDER_CLASSES,
          false);
      dialog.setTitle("Browse...");
      if (dialog.open() == Window.OK) {
        IType type = (IType) dialog.getResult()[0];
        return type.getFullyQualifiedName('$');
      }
    } catch (Exception e) {
      Logger.logException(e);
    }
    return null;
  }
 
  public static String nullSafeTrimString(String value) {
    if (value == null)
      return "";
    else
      return value.trim();
  }
 
  public Image getImageFromClassName(String className) {
    if (className == null)
      return null;
   
    try {
      IType superTypeType = javaProject.findType(className);
      if (superTypeType == null)
        return null;
      else if (superTypeType.isInterface())
        return interfaceImg;
      else
        return classImg;
    } catch (JavaModelException e) {
      Logger.logException(e);
    }
     
    return null;
 
 
  public static Composite createComposite(Composite parent) {
    return toolkit.createComposite(parent);
  }
 
  public static Label createLabel(Composite client, String messagePrefix) {
    //Controls
    Label label = toolkit.createLabel(client, Messages.getString(messagePrefix));
    label.setToolTipText(Messages.getString(messagePrefix + "_hint")); //$NON-NLS-1$
   
    //Format
    TableWrapData td = new TableWrapData();
    label.setLayoutData(td)
   
    return label;
  }

  public static IObservableValue createText(Composite client, String messagePrefix) {
    Text text = toolkit.createText(client, "", SWT.SINGLE); //$NON-NLS-1$
    text.setBackground(new Color(Display.getCurrent(), 255,255,255));
    text.setToolTipText(Messages.getString(messagePrefix + "_hint")); //$NON-NLS-1$
   
    //Format
    TableWrapData td = new TableWrapData(TableWrapData.FILL_GRAB);
    text.setLayoutData(td)
   
    return SWTObservables.observeText(text, SWT.Modify);   
  }
 
  public static IObservableValue createLabelCheckbox(Composite client, String messagePrefix) {
    createLabel(client, messagePrefix);
   
    Button checkbox = toolkit.createButton(client, "", SWT.CHECK);
    checkbox.setToolTipText(Messages.getString(messagePrefix + "_hint")); //$NON-NLS-1$
    checkbox.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));   
   
    //Format
    TableWrapData td = new TableWrapData(TableWrapData.FILL_GRAB);
    checkbox.setLayoutData(td)
   
    return SWTObservables.observeSelection(checkbox);     
 
 
  public static IObservableValue createLabelText(Composite client, String messagePrefix) {
    createLabel(client, messagePrefix);
    return createText(client, messagePrefix);   
 

  public static IObservableValue createLabelCombo(Composite client, String messagePrefix, String[] values) {
    createLabel(client, messagePrefix);
    return createCombo(client, messagePrefix, values);
  }
 
  public static IObservableValue createCombo(Composite client, String messagePrefix, String[] values) {
    CCombo combo = new CCombo(client, SWT.DROP_DOWN | SWT.READ_ONLY
        | SWT.FLAT | SWT.BORDER);
    for (String value : values) {
      combo.add(value);
    }

    toolkit.adapt(combo);
    toolkit.paintBordersFor(combo);
   
    combo.setToolTipText(Messages.getString(messagePrefix + "_hint")); //$NON-NLS-1$
   
    //Format
    TableWrapData td = new TableWrapData();
    combo.setLayoutData(td);
   
    return SWTObservables.observeSelection(combo);
  }
 
  public static IObservableValue createLabelClassBrowse(Composite client, String messagePrefix, final String superType, final boolean allowInterfaces) {
    createLabel(client, messagePrefix);

    Composite tableClient = toolkit.createComposite(client, SWT.WRAP);
    TableWrapLayout layout = new TableWrapLayout();
    layout.bottomMargin=0;
    layout.leftMargin=0;
    layout.rightMargin=0;
    layout.topMargin=0;
    layout.numColumns = 2;
    tableClient.setLayout(layout);
   
    final IObservableValue text = DozerUiUtils.createText(tableClient, messagePrefix);

    Button browseBtn = toolkit.createButton(tableClient, "Browse...", SWT.PUSH);
    browseBtn.addSelectionListener(new SelectionAdapter() {
      @Override
      public void widgetSelected(SelectionEvent e) {
        String className = DozerUiUtils.getInstance().doOpenClassSelectionDialog(superType, allowInterfaces);
        if (className != null) {
          text.setValue(className);
         
        }
      }
    });
    TableWrapData td = new TableWrapData();
    browseBtn.setLayoutData(td);
   
    td = new TableWrapData(TableWrapData.FILL_GRAB);
    tableClient.setLayoutData(td);
   
    return text;
  }
 
  public static AbstractListViewer createLabelFieldCombobox(Composite client, String messagePrefix) {
    createLabel(client, messagePrefix);
   
    final CCombo combo = new CCombo(client, SWT.FLAT | SWT.BORDER);
    TableWrapData td = new TableWrapData();
    td.grabHorizontal = true;
    //td.maxWidth = 400;
    combo.setLayoutData(td);

    toolkit.adapt(combo);
    toolkit.paintBordersFor(combo);
   
    combo.setToolTipText(Messages.getString(messagePrefix + "_hint")); //$NON-NLS-1$
    final ComboViewer comboViewer = new ComboViewer(combo);
   
    //Add Focus-Lost Listener so that the entered text gets converted to a IField and gets selected.
    //This way the databinding works
    combo.addFocusListener(new FocusListener() {

      private StringToFieldConverter converter = new StringToFieldConverter(null, comboViewer);     
     
      public void focusGained(FocusEvent e) {}
      public void focusLost(FocusEvent e) {
        //already selected (due to combobox select)
        if (!comboViewer.getSelection().isEmpty())
          return;
       
        converter.setExistingFields((List<IField>)comboViewer.getInput());
        Object convertedText = converter.convert(combo.getText());
        comboViewer.setSelection(new StructuredSelection(convertedText));
      }
     
    });   
   
    comboViewer.setContentProvider(new ObservableListContentProvider());
    comboViewer.setLabelProvider(new LabelProvider() {

      @Override
      public Image getImage(Object element) {
        //FIXME never gets invoced, as a CCombo only shows text
        IMethod method = (IMethod)element;
        Image image = null;
        try {
          image = Activator.getDefault().getJavaElementLabelProvider().getImageLabel(
              method, method.getFlags() | JavaElementImageProvider.SMALL_ICONS);
        } catch (Exception e) {
          Logger.logException(e);
        }
       
        return image;
      }
     
      @Override
      public String getText(Object element) {
        IField field = (IField)element;
        StringBuilder buf = new StringBuilder();

        //Copied from org.springframework.ide.eclipse.beans.ui.editor.contentassist.MethodContentAssistCalculator
        String fieldName = field.getElementName();
        // add method name
        String replaceText = fieldName;
        buf.append(replaceText);
       
        String displayText = buf.toString();
        return displayText;
      }
     
    });
   
    return comboViewer;
  }

  public static AbstractListViewer createLabelMethodCombobox(Composite client, String messagePrefix) {
    createLabel(client, messagePrefix);
   
    final CCombo combo = new CCombo(client, SWT.FLAT | SWT.BORDER);
    TableWrapData td = new TableWrapData();
    td.grabHorizontal = true;
    //td.maxWidth = 400;
    combo.setLayoutData(td);

    toolkit.adapt(combo);
    toolkit.paintBordersFor(combo);
   
    combo.setToolTipText(Messages.getString(messagePrefix + "_hint")); //$NON-NLS-1$
   
    final ComboViewer comboViewer = new ComboViewer(combo);
   
    //Add Focus-Lost Listener so that the entered text gets converted to a IMethod and gets selected.
    //This way the databinding works
    combo.addFocusListener(new FocusListener() {

      private StringToMethodConverter converter = new StringToMethodConverter(null, comboViewer);
     
      public void focusGained(FocusEvent e) {}
      public void focusLost(FocusEvent e) {
        //already selected (due to combobox select)
        if (!comboViewer.getSelection().isEmpty())
          return;
       
        converter.setExistingMethods((List<IMethod>)comboViewer.getInput());
        Object convertedText = converter.convert(combo.getText());
        comboViewer.setSelection(new StructuredSelection(convertedText));
      }
     
    });   
   
    comboViewer.setContentProvider(new ObservableListContentProvider());
    comboViewer.setLabelProvider(new LabelProvider() {

      @Override
      public Image getImage(Object element) {
        //FIXME never gets invoced, as a CCombo only shows text
        IMethod method = (IMethod)element;
        Image image = null;
        try {
          image = Activator.getDefault().getJavaElementLabelProvider().getImageLabel(
              method, method.getFlags() | JavaElementImageProvider.SMALL_ICONS);
        } catch (Exception e) {
          Logger.logException(e);
        }
       
        return image;
      }
     
      @Override
      public String getText(Object element) {
        IMethod method = (IMethod)element;
        StringBuilder buf = new StringBuilder();

        //Copied from org.springframework.ide.eclipse.beans.ui.editor.contentassist.MethodContentAssistCalculator
        String methodName = method.getElementName();
        // add method name
        String replaceText = methodName;
        buf.append(replaceText);

        String[] parameterNames = new String[]{"?"};
        String[] parameterTypes = new String[]{"?"};
        String className = "?";
        String returnType = "?";
        try {
          parameterNames = method.getParameterNames();
          parameterTypes = JdtUtils.getParameterTypesString(method);
          returnType = JdtUtils.getReturnTypeString(method, true);
          className = method.getParent().getElementName();
        } catch (JavaModelException e) {
          //do nothing
        }
       
       
        // add method parameters
        if (parameterTypes.length > 0 && parameterNames.length > 0) {
          buf.append(" (");
          for (int i = 0; i < parameterTypes.length; i++) {
            buf.append(parameterTypes[i]);
            buf.append(' ');
            buf.append(parameterNames[i]);
            if (i < (parameterTypes.length - 1)) {
              buf.append(", ");
            }
          }
          buf.append(") ");
        }
        else {
          buf.append("() ");
        }

        // add return type
        if (returnType != null) {
          buf.append(Signature.getSimpleName(returnType));
          buf.append(" - ");
        }
        else {
          buf.append(" void - ");
        }

        // add class name
        buf.append(className);     
       
        String displayText = buf.toString();
        return displayText;
      }
     
    });
   
    return comboViewer;
  }
 
  public static TableViewerSelectionListener createAddClassSelectionListener(
      IDOMModel model,
      final String elementName,
      final String lookupClass) {
   
    TableViewerSelectionListener listener = new TableViewerSelectionListener(model) {

      @Override
      protected void invoceSelected(Object selected) {
        final String className = DozerUiUtils.getInstance().doOpenClassSelectionDialog(lookupClass, true);
        if (className != null) {
          BusyIndicator.showWhile(
            Display.getCurrent(),
            new Runnable() {
              public void run() {
                Element element = getModel().getDocument().createElement(elementName);
               
                org.eclipse.core.dom.utils.DOMUtils.setTextContent(element, className);
               
                IObservableList values = (IObservableList)getTableViewer().getInput();
                values.add(element);             
              }
          });         
        }
      }
     
    };
   
    return listener;
  }
 
  public static TableViewerSelectionListener createDeleteSelectionListener(IDOMModel model) {
    TableViewerSelectionListener listener = new TableViewerSelectionListener(model) {

      @Override
      protected void invoceSelected(Object selected) {
        Element selection = (Element)selected;
        Element parentNode = (Element)selection.getParentNode();
       
        IObservableList values = (IObservableList)getTableViewer().getInput();
        values.remove(selection);
       
        //if last node had been deleted, delete parent
        if (DOMUtils.getElements(parentNode).length == 0) {
          Element parentParentNode = (Element)parentNode.getParentNode();
         
          parentNode.getParentNode().removeChild(parentNode)
         
          if (DOMUtils.getElements(parentParentNode).length == 0) {
            parentParentNode.getParentNode().removeChild(parentParentNode);         
          }
        }       
      }
     
    };
   
    return listener;
  }
 
  public static Section createTwistieSection(
      Composite parentClient,
      String messagePrefix) {
    Section section = toolkit.createSection(parentClient,
        ExpandableComposite.TITLE_BAR |
        ExpandableComposite.TWISTIE);
    section.setText(Messages.getString(messagePrefix));
    section.setDescriptionControl(toolkit.createLabel(section, Messages.getString(messagePrefix+"_sdesc")));
    section.setExpanded(true);
   
    GridData gd = new GridData(GridData.FILL_HORIZONTAL);
    gd.verticalAlignment = SWT.BEGINNING;
    section.setLayoutData(gd);

    return section;
  }
 
  /**
   * Highlights the given element in the sourceview of the document
   *
   * @param element The element that should be highlighted
   */
  public void jumpToElement(Element element) {
    ElementImpl elementImpl = (ElementImpl)element;

    dozerEditor.getSourceEditor().setHighlightRange(elementImpl.getStartOffset()+1, elementImpl.getLength(), true);
    dozerEditor.changeToSourcePage();
  }
 
  public IDOMDocument getDomDocument(ITextEditor editor) {
    IDocument document = editor.getDocumentProvider().getDocument(editorInput);
    IDOMModel sModel = (IDOMModel)org.eclipse.wst.sse.core.StructuredModelManager.getModelManager().getExistingModelForRead(document);
    return sModel.getDocument();
  }

}
TOP

Related Classes of org.dozer.eclipse.plugin.editorpage.utils.DozerUiUtils

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.