Package org.dyno.visual.swing.base

Source Code of org.dyno.visual.swing.base.JavaUtil

/************************************************************************************
* 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.base;

import java.applet.Applet;
import java.awt.Component;
import java.awt.Container;
import java.awt.Window;
import java.io.File;
import java.lang.reflect.Field;
import java.net.MalformedURLException;
import java.net.URL;
import java.net.URLClassLoader;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Stack;

import javax.swing.Icon;
import javax.swing.ImageIcon;
import javax.swing.JComponent;
import javax.swing.JMenu;
import javax.swing.JPopupMenu;
import javax.swing.MenuElement;

import org.dyno.visual.swing.VisualSwingPlugin;
import org.eclipse.core.filebuffers.FileBuffers;
import org.eclipse.core.filebuffers.ITextFileBufferManager;
import org.eclipse.core.filebuffers.LocationKind;
import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.resources.IResource;
import org.eclipse.core.resources.IncrementalProjectBuilder;
import org.eclipse.core.resources.ResourceAttributes;
import org.eclipse.core.resources.ResourcesPlugin;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IPath;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.MultiStatus;
import org.eclipse.core.runtime.NullProgressMonitor;
import org.eclipse.core.runtime.Path;
import org.eclipse.core.runtime.Status;
import org.eclipse.core.runtime.SubProgressMonitor;
import org.eclipse.jdt.core.IClasspathEntry;
import org.eclipse.jdt.core.ICompilationUnit;
import org.eclipse.jdt.core.IJavaElement;
import org.eclipse.jdt.core.IJavaProject;
import org.eclipse.jdt.core.IPackageFragmentRoot;
import org.eclipse.jdt.core.JavaCore;
import org.eclipse.jdt.core.JavaModelException;
import org.eclipse.jdt.core.ToolFactory;
import org.eclipse.jdt.core.formatter.CodeFormatter;
import org.eclipse.jdt.core.formatter.DefaultCodeFormatterConstants;
import org.eclipse.jdt.launching.JavaRuntime;
import org.eclipse.jface.text.BadLocationException;
import org.eclipse.jface.text.Document;
import org.eclipse.jface.text.IDocument;
import org.eclipse.jface.text.RewriteSessionEditProcessor;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.text.edits.MalformedTreeException;
import org.eclipse.text.edits.TextEdit;
import org.eclipse.ui.IWorkbenchWindow;
import org.eclipse.ui.PlatformUI;

/**
*
* JavaUtil
*
* @version 1.0.0, 2008-7-3
* @author William Chen
*/
@SuppressWarnings("unchecked")
public class JavaUtil {
  private static CodeFormatter codeFormatter;

  public static void layoutContainer(Container container) {
    container.doLayout();
    int count = container.getComponentCount();
    for (int i = 0; i < count; i++) {
      Component child = container.getComponent(i);
      if (child instanceof Container) {
        layoutContainer((Container) child);
      }
    }
  }
  public static boolean isJava6(){
    String version = System.getProperty("java.version");
    return version.startsWith("1.6");   
  }
  public static JPopupMenu getComponentPopupMenu(JComponent jcomp) {
    if (!jcomp.getInheritsPopupMenu())
      return jcomp.getComponentPopupMenu();
    else {
      JPopupMenu jpopup = jcomp.getComponentPopupMenu();
      if (jpopup == null)
        return null;
      // Search parents for its popup
      Container parent = jcomp.getParent();
      while (parent != null) {
        if (parent instanceof JComponent) {
          JPopupMenu parent_popup = ((JComponent) parent).getComponentPopupMenu();
          if (jpopup == parent_popup)
            return null;
          return jpopup;
        }
        if (parent instanceof Window || parent instanceof Applet) {
          return jpopup;
        }
        parent = parent.getParent();
      }
      return jpopup;
    }
  }

  public static ClassLoader getProjectClassLoader(IJavaProject java_project) {
    try {
      IProject project = java_project.getProject();
      project.build(IncrementalProjectBuilder.INCREMENTAL_BUILD, null);
      String[] classPath = JavaRuntime.computeDefaultRuntimeClassPath(java_project);
      URL[] urls = new URL[classPath.length];
      for (int i = 0; i < classPath.length; i++) {
        File cp = new File(classPath[i]);
        if (cp.exists())
          urls[i] = cp.toURI().toURL();
      }
      return new URLClassLoader(urls, JavaUtil.class.getClassLoader());
    } catch (Exception e) {
      VisualSwingPlugin.getLogger().error(e);
      return null;
    }
  }

  public static IFile getIconFile(Icon icon) {
    if (icon != null && icon instanceof ResourceIcon) {
      String text = ((ResourceIcon) icon).toString();
      if (text != null && text.trim().length() > 0) {
        IJavaProject javaProject = VisualSwingPlugin.getCurrentProject();
        if (javaProject != null) {
          IPackageFragmentRoot src_root = getSourceRoot(javaProject);
          if (src_root != null) {
            String srcName = src_root.getElementName();
            IProject prj = javaProject.getProject();
            IFile file = prj.getFolder(srcName).getFile(text);
            if (file != null && file.exists())
              return file;
          }
        }
      }
    }
    return null;
  }

  public static Icon getIconFromFile(IFile file) {
    if (file != null) {
      IPath location = file.getFullPath();
      location = location.removeFirstSegments(2);
      String path = location.toString();
      if (!path.startsWith("/"))
        path = "/" + path;
      ImageIcon imgIcon;
      try {
        imgIcon = new ImageIcon(file.getRawLocationURI().toURL());
        ResourceIcon ri = new ResourceIcon(imgIcon, path);
        return ri;
      } catch (MalformedURLException e) {
        VisualSwingPlugin.getLogger().error(e);
      }
    }
    return null;
  }

  private static IPackageFragmentRoot getSourceRoot(IJavaProject prj) {
    try {
      IJavaElement[] children = prj.getChildren();
      for (IJavaElement child : children) {
        if (child instanceof IPackageFragmentRoot) {
          IPackageFragmentRoot childRoot = (IPackageFragmentRoot) child;
          if (!childRoot.isArchive())
            return childRoot;
        }
      }
    } catch (JavaModelException e) {
      VisualSwingPlugin.getLogger().error(e);
    }
    return null;
  }

  public static IWorkbenchWindow getEclipseWindow() {
    IWorkbenchWindow window = PlatformUI.getWorkbench().getActiveWorkbenchWindow();
    if (window == null) {
      IWorkbenchWindow[] windows = PlatformUI.getWorkbench().getWorkbenchWindows();
      if (windows != null && windows.length > 0)
        return windows[0];
      else
        return null;
    } else
      return window;
  }

  public static Display getEclipseDisplay() {
    return PlatformUI.getWorkbench().getDisplay();
  }

  public static Shell getEclipseShell() {
    IWorkbenchWindow window = getEclipseWindow();
    if (window != null)
      return window.getShell();
    else
      return Display.getDefault().getActiveShell();
  }

  public static void applyEdit(ICompilationUnit cu, TextEdit edit, boolean save, IProgressMonitor monitor) throws CoreException {
    if (monitor == null) {
      monitor = new NullProgressMonitor();
    }
    monitor.beginTask(Messages.JAVA_UTIL_APPLYING_CHANGES, 3);

    try {
      IDocument document = null;
      try {
        document = aquireDocument(cu, new SubProgressMonitor(monitor, 1));
        if (save) {
          commitDocument(cu, document, edit, new SubProgressMonitor(monitor, 1));
        } else {
          new RewriteSessionEditProcessor(document, edit, TextEdit.UPDATE_REGIONS).performEdits();
        }
      } catch (BadLocationException e) {
        VisualSwingPlugin.getLogger().error(e);
      } finally {
        releaseDocument(cu, document, new SubProgressMonitor(monitor, 1));
      }
    } finally {
      monitor.done();
    }
  }

  public static void hideMenu() {
    Stack<MenuElement> stack = MenuSelectionManager.defaultManager().getSelectionStack();
    while (!stack.isEmpty()) {
      MenuElement me = stack.pop();
      if (me instanceof JMenu) {
        JMenu jme = (JMenu) me;
        jme.setPopupMenuVisible(false);
        jme.setSelected(false);
      } else if (me instanceof JPopupMenu) {
        JPopupMenu pop = (JPopupMenu) me;
        pop.setVisible(false);
      }
    }
  }

  private static void releaseDocument(ICompilationUnit cu, IDocument document, IProgressMonitor monitor) throws CoreException {
    if (cu.getOwner() == null) {
      IFile file = (IFile) cu.getResource();
      if (file.exists()) {
        ITextFileBufferManager bufferManager = FileBuffers.getTextFileBufferManager();
        bufferManager.disconnect(file.getFullPath(), LocationKind.IFILE, monitor);
        return;
      }
    }
    cu.getBuffer().setContents(document.get());
    monitor.done();
  }

  private static IDocument aquireDocument(ICompilationUnit cu, IProgressMonitor monitor) throws CoreException {
    if (cu.getOwner() == null) {
      IFile file = (IFile) cu.getResource();
      if (file.exists()) {
        ITextFileBufferManager bufferManager = FileBuffers.getTextFileBufferManager();
        IPath path = cu.getPath();
        bufferManager.connect(path, LocationKind.IFILE, monitor);
        return bufferManager.getTextFileBuffer(path, LocationKind.IFILE).getDocument();
      }
    }
    monitor.done();
    return new Document(cu.getSource());
  }

  private static void commitDocument(ICompilationUnit cu, IDocument document, TextEdit edit, IProgressMonitor monitor) throws CoreException, MalformedTreeException, BadLocationException {
    if (cu.getOwner() == null) {
      IFile file = (IFile) cu.getResource();
      if (file.exists()) {
        IStatus status = makeCommittable(new IResource[] { file }, null);
        if (!status.isOK()) {
          throw new CoreException(status);
        }
        new RewriteSessionEditProcessor(document, edit, TextEdit.UPDATE_REGIONS).performEdits(); // apply
        ITextFileBufferManager bufferManager = FileBuffers.getTextFileBufferManager();
        bufferManager.getTextFileBuffer(file.getFullPath(), LocationKind.IFILE).commit(monitor, true);
        return;
      }
    }
    new RewriteSessionEditProcessor(document, edit, TextEdit.UPDATE_REGIONS).performEdits();
  }

  private static IStatus makeCommittable(IResource[] resources, Object context) {
    List<IResource> readOnlyFiles = new ArrayList<IResource>();
    for (int i = 0; i < resources.length; i++) {
      IResource resource = resources[i];
      if (resource.getType() == IResource.FILE && isReadOnly(resource))
        readOnlyFiles.add(resource);
    }
    if (readOnlyFiles.size() == 0)
      return new Status(IStatus.OK, VisualSwingPlugin.getPluginID(), IStatus.OK, "", null); //$NON-NLS-1$

    Map<IFile, Long> oldTimeStamps = createModificationStampMap(readOnlyFiles);
    IStatus status = ResourcesPlugin.getWorkspace().validateEdit(readOnlyFiles.toArray(new IFile[readOnlyFiles.size()]), context);
    if (!status.isOK())
      return status;

    IStatus modified = null;
    Map<IFile, Long> newTimeStamps = createModificationStampMap(readOnlyFiles);
    for (Iterator<IFile> iter = oldTimeStamps.keySet().iterator(); iter.hasNext();) {
      IFile file = iter.next();
      if (!oldTimeStamps.get(file).equals(newTimeStamps.get(file)))
        modified = addModified(modified, file);
    }
    if (modified != null)
      return modified;
    return new Status(IStatus.OK, VisualSwingPlugin.getPluginID(), IStatus.OK, "", null); //$NON-NLS-1$
  }

  private static final int VALIDATE_EDIT_CHANGED_CONTENT = 10003;

  private static IStatus addModified(IStatus status, IFile file) {
    String message = Messages.JAVA_UTIL_FILE + file.getFullPath().toString() + Messages.JAVA_UTIL_MODIFIED;
    IStatus entry = new Status(VALIDATE_EDIT_CHANGED_CONTENT, message, null);
    if (status == null) {
      return entry;
    } else if (status.isMultiStatus()) {
      ((MultiStatus) status).add(entry);
      return status;
    } else {
      MultiStatus result = new MultiStatus(VisualSwingPlugin.getPluginID(), VALIDATE_EDIT_CHANGED_CONTENT, Messages.JAVA_UTIL_MODIFIED_RESOURCE, null);
      result.add(status);
      result.add(entry);
      return result;
    }
  }

  private static Map<IFile, Long> createModificationStampMap(List<IResource> files) {
    Map<IFile, Long> map = new HashMap<IFile, Long>();
    for (Iterator<IResource> iter = files.iterator(); iter.hasNext();) {
      IFile file = (IFile) iter.next();
      map.put(file, new Long(file.getModificationStamp()));
    }
    return map;
  }

  private static boolean isReadOnly(IResource resource) {
    ResourceAttributes resourceAttributes = resource.getResourceAttributes();
    if (resourceAttributes == null)
      return false;
    return resourceAttributes.isReadOnly();
  }

  private static CodeFormatter getCodeFormatter() {
    if (codeFormatter == null) {
      Map options = DefaultCodeFormatterConstants.getEclipseDefaultSettings();
      options.put(JavaCore.COMPILER_COMPLIANCE, JavaCore.VERSION_1_5);
      options.put(JavaCore.COMPILER_CODEGEN_TARGET_PLATFORM, JavaCore.VERSION_1_5);
      options.put(JavaCore.COMPILER_SOURCE, JavaCore.VERSION_1_5);
      options.put(DefaultCodeFormatterConstants.FORMATTER_ALIGNMENT_FOR_ENUM_CONSTANTS, DefaultCodeFormatterConstants.createAlignmentValue(true, DefaultCodeFormatterConstants.WRAP_ONE_PER_LINE,
          DefaultCodeFormatterConstants.INDENT_ON_COLUMN));
      options.put(DefaultCodeFormatterConstants.FORMATTER_LINE_SPLIT, "160"); //$NON-NLS-1$
      codeFormatter = ToolFactory.createCodeFormatter(options);
    }
    return codeFormatter;
  }

  public static String formatCode(String source) {
    TextEdit edit = getCodeFormatter().format(CodeFormatter.K_UNKNOWN, source, 0, source.length(), 0, System.getProperty("line.separator")); //$NON-NLS-1$
    if (edit != null) {
      IDocument document = new Document(source);
      try {
        edit.apply(document);
        return document.get();
      } catch (Exception e) {
        VisualSwingPlugin.getLogger().error(e);
      }
    }
    return source;
  }

  public static boolean setupLayoutLib(IProgressMonitor monitor) {
    return setupLayoutLib(VisualSwingPlugin.getCurrentProject(), monitor);
  }

  public static boolean setupLayoutLib(IJavaProject javaProject, IProgressMonitor monitor) {
    if (javaProject != null) {
      try {
        IClasspathEntry[] entries = javaProject.getRawClasspath();
        boolean layout_exists = false;
        for (IClasspathEntry entry : entries) {
          if (entry.getPath().equals(VS_LAYOUTEXT))
            layout_exists = true;
        }
        if (!layout_exists) {
          IClasspathEntry varEntry = JavaCore.newContainerEntry(VS_LAYOUTEXT, false);
          IClasspathEntry[] newClasspath = new IClasspathEntry[entries.length + 1];
          System.arraycopy(entries, 0, newClasspath, 0, entries.length);
          newClasspath[entries.length] = varEntry;
          javaProject.setRawClasspath(newClasspath, monitor);
        }
      } catch (Exception e) {
        VisualSwingPlugin.getLogger().error(e);
        return false;
      }
    }
    return true;
  }

  public static Object getField(Object object, String fieldName) {
    if (object == null)
      return null;
    else {
      try {
        Class clazz = object.getClass();
        Field field = clazz.getDeclaredField(fieldName);
        return field.get(object);
      } catch (Exception e) {
        VisualSwingPlugin.getLogger().error(e);
        return null;
      }
    }

  }

  public static final IPath VS_LIBRARY = new Path(VisualSwingPlugin.PLUGIN_ID + ".VS_LIBRARY"); //$NON-NLS-1$
  public static final IPath VS_LAYOUTEXT = VS_LIBRARY.append("layoutext"); //$NON-NLS-1$
}
TOP

Related Classes of org.dyno.visual.swing.base.JavaUtil

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.