/* * Copyright 2015 the original author or authors. * @https://github.com/scouter-project/scouter * * 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 scouter.client.views; import java.io.File; import java.io.FileFilter; import java.util.ArrayList; import java.util.Arrays; import java.util.Collections; import java.util.Comparator; import java.util.Iterator; import java.util.List; import org.eclipse.jface.action.Action; import org.eclipse.jface.action.IMenuListener; import org.eclipse.jface.action.IMenuManager; import org.eclipse.jface.action.IToolBarManager; import org.eclipse.jface.action.MenuManager; import org.eclipse.jface.action.Separator; import org.eclipse.jface.resource.ImageDescriptor; import org.eclipse.jface.viewers.DoubleClickEvent; import org.eclipse.jface.viewers.IDoubleClickListener; import org.eclipse.jface.viewers.ISelection; import org.eclipse.jface.viewers.IStructuredSelection; import org.eclipse.jface.viewers.ITreeContentProvider; import org.eclipse.jface.viewers.LabelProvider; import org.eclipse.jface.viewers.StructuredSelection; import org.eclipse.jface.viewers.TreePath; import org.eclipse.jface.viewers.TreeViewer; import org.eclipse.jface.viewers.Viewer; import org.eclipse.swt.SWT; import org.eclipse.swt.dnd.Clipboard; import org.eclipse.swt.dnd.FileTransfer; import org.eclipse.swt.dnd.TextTransfer; import org.eclipse.swt.dnd.Transfer; import org.eclipse.swt.events.KeyAdapter; import org.eclipse.swt.events.KeyEvent; import org.eclipse.swt.graphics.Image; import org.eclipse.swt.program.Program; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Display; import org.eclipse.swt.widgets.Menu; import org.eclipse.ui.IWorkbenchPage; import org.eclipse.ui.IWorkbenchWindow; import org.eclipse.ui.PlatformUI; import org.eclipse.ui.part.ViewPart; import scouter.client.Images; import scouter.client.stack.base.MainProcessor; import scouter.client.util.ImageUtil; import scouter.client.util.RCPUtil; import scouter.client.xlog.SaveProfileJob; import scouter.client.xlog.views.XLogFullProfileView; public class WorkspaceExplorer extends ViewPart { private TreeViewer viewer; private int serverId; IWorkbenchWindow window = PlatformUI.getWorkbench().getActiveWorkbenchWindow(); File workingDir = RCPUtil.getWorkingDirectory(); public static final String ID = WorkspaceExplorer.class.getName(); public void createPartControl(Composite parent) { viewer = new TreeViewer(parent, SWT.MULTI | SWT.H_SCROLL | SWT.V_SCROLL); viewer.setContentProvider(new WorkspaceContentProvider()); viewer.setLabelProvider(new WorkspaceLabelProvider()); viewer.addDoubleClickListener(new IDoubleClickListener() { public void doubleClick(DoubleClickEvent event) { IStructuredSelection selection = (IStructuredSelection) event.getSelection(); Object element = selection.getFirstElement(); if (element != null && element instanceof File && ((File) element).isFile()) { File selectedFile = (File) element; openFile(selectedFile); }else if(element != null && element instanceof File && ((File) element).isDirectory()) { TreeViewer viewer = (TreeViewer) event.getViewer(); IStructuredSelection thisSelection = (IStructuredSelection) event.getSelection(); Object selectedNode = thisSelection.getFirstElement(); viewer.setExpandedState(selectedNode, !viewer.getExpandedState(selectedNode)); } } }); viewer.getTree().addKeyListener(new KeyAdapter() { public void keyPressed(KeyEvent e) { if (e.stateMask == SWT.CTRL) { if (e.keyCode == 'c' || e.keyCode == 'C') { new CopySelectedFilesAction().run(); } } } }); viewer.setInput(sortDirectoriesAndFiles(workingDir.listFiles(new ContentFilter()))); fillTreeViewerCoolbar(); createContextMenu(viewer, new IMenuListener() { public void menuAboutToShow(IMenuManager manager){ fillTreeViewerContextMenu(manager); } }); } public void setInput(int serverId){ this.serverId = serverId; refreshViewer(); } private void fillTreeViewerCoolbar() { IToolBarManager man = getViewSite().getActionBars().getToolBarManager(); man.add(new Action("Expand All", ImageUtil.getImageDescriptor(Images.expand)) { public void run() { viewer.expandAll(); } }); man.add(new Action("Collapse All", ImageUtil.getImageDescriptor(Images.collapse)) { public void run() { viewer.collapseAll(); } }); man.add(new Separator()); man.add(new Action("Refresh", ImageUtil.getImageDescriptor(Images.refresh)) { public void run() { refreshViewer(); } }); } public void refreshViewer() { Object[] elements = viewer.getExpandedElements(); TreePath[] treePaths = viewer.getExpandedTreePaths(); viewer.getTree().clearAll(true); viewer.setInput(sortDirectoriesAndFiles(workingDir.listFiles(new ContentFilter()))); viewer.refresh(); viewer.setExpandedElements(elements); viewer.setExpandedTreePaths(treePaths); } public void openFile(File selectedFile) { if(SaveProfileJob.xLogFileName.equals(selectedFile.getName()) || SaveProfileJob.profileFileName.equals(selectedFile.getName())) { try { XLogFullProfileView view = (XLogFullProfileView) window.getActivePage().showView(XLogFullProfileView.ID, selectedFile.getParentFile().getName(), IWorkbenchPage.VIEW_ACTIVATE); if (view != null) { view.setInput(selectedFile.getParentFile(), serverId, false); } } catch (Exception e) { e.printStackTrace(); } }else if(SaveProfileJob.profileSummaryFileName.equals(selectedFile.getName())) { try { XLogFullProfileView view = (XLogFullProfileView) window.getActivePage().showView(XLogFullProfileView.ID, selectedFile.getParentFile().getName(), IWorkbenchPage.VIEW_ACTIVATE); if (view != null) { view.setInput(selectedFile.getParentFile(), serverId, true); } } catch (Exception e) { e.printStackTrace(); } } else if(selectedFile.getName().endsWith(".stack")) { MainProcessor.instance().processStackFile(selectedFile.getAbsolutePath()); } else { Program.launch(selectedFile.getAbsolutePath()); } } public Object[] sortDirectoriesAndFiles(File[] files) { List<File> fileList = Arrays.asList(files); Collections.sort(fileList, new Comparator<File>() { public int compare(File f1, File f2) { if (f1.isDirectory() && !f2.isDirectory()) { return -1; } else if (!f1.isDirectory() && f2.isDirectory()) { return 1; } else { return f1.getName().compareTo(f2.getName()); } } }); List<File> arr = new ArrayList<File>(); for(int inx = 0 ; inx < fileList.size() ; inx++){ File f = fileList.get(inx); if(f.isFile() && f.getName().equals(SaveProfileJob.xLogFileName)){ } else{ arr.add(f); } } return arr.toArray(new File[arr.size()]); } private void fillTreeViewerContextMenu(IMenuManager mgr){ ISelection selection = viewer.getSelection(); if (selection instanceof IStructuredSelection) { IStructuredSelection sel = (IStructuredSelection)selection; Object[] elements = sel.toArray(); if (elements == null || elements.length < 1) { return; } Object lastElement = elements[elements.length - 1]; if (lastElement instanceof File) { if (((File) lastElement).isFile()) { mgr.add(new OpenSelectedFileAction((File) lastElement)); mgr.add(new Separator()); mgr.add(new CopySelectedFilesAction()); mgr.add(new CopyWSPathSelectedFilesAction()); mgr.add(new Separator()); mgr.add(new DeleteSelectedFileAction()); } else if (((File) lastElement).isDirectory()) { mgr.add(new DeleteSelectedFileAction()); } } } } private void createContextMenu(Viewer viewer, IMenuListener listener){ MenuManager contextMenu = new MenuManager(); contextMenu.setRemoveAllWhenShown(true); contextMenu.addMenuListener(listener); Menu menu = contextMenu.createContextMenu(viewer.getControl()); viewer.getControl().setMenu(menu); getSite().registerContextMenu(contextMenu, viewer); } public void setFocus() { } public class WorkspaceContentProvider implements ITreeContentProvider { public Object[] getChildren(Object parent) { if (parent instanceof File) { File file = (File) parent; return sortDirectoriesAndFiles(file.listFiles(new ContentFilter())); } return null; } public Object[] getElements(Object inputElement) { return (Object[]) inputElement; } public Object getParent(Object element) { File file = (File) element; return file.getParentFile(); } public boolean hasChildren(Object parent) { File file = (File) parent; return file.isDirectory(); } public void dispose() { } public void inputChanged(Viewer arg0, Object arg1, Object arg2) { } } public class WorkspaceLabelProvider extends LabelProvider { public Image getImage(Object element) { if (element instanceof File) { File file = (File)element; if (file.isDirectory()) { return Images.folder; } String fileName = ((File) element).getName(); if (fileName.length() > 0) { if(SaveProfileJob.profileFileName.equals(fileName)){ return Images.PROFILE_FULL; }else if(SaveProfileJob.profileSummaryFileName.equals(fileName)){ return Images.PROFILE_SUMMARY; } } ImageDescriptor ds = PlatformUI.getWorkbench().getEditorRegistry().getSystemExternalEditorImageDescriptor(file.getName()); if (ds != null) { return ds.createImage(); } return Images.unknown; } return super.getImage(element); } public String getText(Object element) { String fileName = ((File) element).getName(); if (fileName.length() > 0) { if(SaveProfileJob.profileFileName.equals(fileName)){ return "Full Profiles"; } else if(SaveProfileJob.profileSummaryFileName.equals(fileName)){ return "Profile Summary"; } else if(SaveProfileJob.xLogFileName.equals(fileName)){ return null; } return fileName; } return ((File) element).getPath(); } } public class ContentFilter implements FileFilter { public boolean accept(File file){ String fileName = file.getName(); if(fileName.endsWith(".index") || fileName.endsWith(".zip") || fileName.endsWith(".threads")){ return false; } return file.isFile() || !fileName.startsWith("."); } } public class OpenSelectedFileAction extends Action { File file; public OpenSelectedFileAction(File file) { super("&Open"); this.file = file; } public void run() { openFile(file); } } public class DeleteSelectedFileAction extends Action { public DeleteSelectedFileAction() { super("&Delete"); } public void run() { ISelection sel = viewer.getSelection(); if (sel instanceof StructuredSelection) { @SuppressWarnings("unchecked") Iterator<File> i = ((StructuredSelection)sel).iterator(); while (i.hasNext()) { File file = i.next(); if (file.isDirectory()) { deleteDirectory(file); } else { file.delete(); } } } refreshViewer(); } public void deleteDirectory(File path) { File[] files = path.listFiles(); for (File file : files) { if (file.isDirectory()) { deleteDirectory(file); } else { file.delete(); } } path.delete(); } } public class CopyWSPathSelectedFilesAction extends Action { private String sep = System.getProperty("line.separator").toString(); public CopyWSPathSelectedFilesAction() { super("&Copy Path"); } public void run() { ISelection sel = viewer.getSelection(); if (sel instanceof StructuredSelection) { StringBuilder sb = new StringBuilder(); @SuppressWarnings("unchecked") Iterator<File> i = ((StructuredSelection)sel).iterator(); while (i.hasNext()) { File file = i.next(); sb.append(file.getAbsolutePath().replace("\\", "/")); if (i.hasNext()) { sb.append(sep); } } Clipboard clipboard = new Clipboard(Display.getDefault()); clipboard.setContents(new Object[] { sb.toString() }, new Transfer[] { TextTransfer.getInstance() }); clipboard.dispose(); } } } public class CopySelectedFilesAction extends Action { public CopySelectedFilesAction() { super("&Copy"); } public void run() { ISelection sel = viewer.getSelection(); if (sel instanceof StructuredSelection) { if (sel.isEmpty()) return; List<String> paths = new ArrayList<String>(); @SuppressWarnings("unchecked") Iterator<File> i = ((StructuredSelection)sel).iterator(); while (i.hasNext()) { File file = i.next(); if (file.isDirectory()) continue; paths.add(file.getAbsolutePath()); } Clipboard clipboard = new Clipboard(Display.getDefault()); clipboard.setContents(new Object[] { (String[])paths.toArray(new String[paths.size()]) }, new Transfer[] { FileTransfer.getInstance() }); clipboard.dispose(); } } } public void afterDescriptionCreated() { refreshViewer(); } }