package tk.eclipse.plugin.jseditor.launch; import java.io.File; import java.util.ArrayList; import java.util.Collections; import java.util.List; import org.eclipse.core.resources.IFile; import org.eclipse.core.resources.IFolder; import org.eclipse.core.resources.IProject; import org.eclipse.core.resources.IResource; import org.eclipse.core.resources.IWorkspaceRoot; import org.eclipse.core.resources.ResourcesPlugin; import org.eclipse.debug.core.ILaunchConfiguration; import org.eclipse.debug.core.ILaunchConfigurationWorkingCopy; import org.eclipse.debug.ui.AbstractLaunchConfigurationTab; import org.eclipse.jface.dialogs.Dialog; import org.eclipse.jface.viewers.Viewer; import org.eclipse.jface.viewers.ViewerFilter; import org.eclipse.swt.SWT; import org.eclipse.swt.events.ModifyEvent; import org.eclipse.swt.events.ModifyListener; import org.eclipse.swt.events.SelectionAdapter; import org.eclipse.swt.events.SelectionEvent; import org.eclipse.swt.graphics.Image; import org.eclipse.swt.layout.GridData; import org.eclipse.swt.layout.GridLayout; import org.eclipse.swt.widgets.Button; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Group; import org.eclipse.swt.widgets.Text; import org.eclipse.ui.PlatformUI; import org.eclipse.ui.dialogs.ElementTreeSelectionDialog; import org.eclipse.ui.model.WorkbenchContentProvider; import org.eclipse.ui.model.WorkbenchLabelProvider; import tk.eclipse.plugin.htmleditor.HTMLPlugin; /** * * @author Naoki Takezoe */ public class JavaScriptMainTab extends AbstractLaunchConfigurationTab { private JavaScriptLibraryTable tableViewer; private Text file; public void createControl(Composite parent) { Composite composite = new Composite(parent, SWT.NULL); composite.setLayout(new GridLayout(1, false)); composite.setLayoutData(new GridData(GridData.FILL_BOTH)); createFileGroup(composite); createIncludeGroup(composite); setControl(composite); } private void createFileGroup(Composite composite){ Group fileGroup = new Group(composite, SWT.NULL); fileGroup.setText(HTMLPlugin.getResourceString("Launcher.JavaScript.Label.ScriptFile")); fileGroup.setLayout(new GridLayout(2, false)); fileGroup.setLayoutData(new GridData(GridData.FILL_HORIZONTAL)); file = new Text(fileGroup, SWT.BORDER); file.setLayoutData(new GridData(GridData.FILL_HORIZONTAL)); file.addModifyListener(new ModifyListener(){ public void modifyText(ModifyEvent e) { updateLaunchConfigurationDialog(); } }); Button browseFile = new Button(fileGroup, SWT.PUSH); browseFile.setText(HTMLPlugin.getResourceString("Button.Browse")); browseFile.addSelectionListener(new SelectionAdapter(){ @Override public void widgetSelected(SelectionEvent evt){ String text = browseJavaScriptFile(); if(text!=null){ file.setText(text); updateLaunchConfigurationDialog(); } } }); } private void createIncludeGroup(Composite composite){ Group includeGroup = new Group(composite, SWT.NULL); includeGroup.setText(HTMLPlugin.getResourceString("Launcher.JavaScript.Label.IncludeFiles")); includeGroup.setLayout(new GridLayout(2, false)); includeGroup.setLayoutData(new GridData(GridData.FILL_HORIZONTAL)); tableViewer = new JavaScriptLibraryTable(includeGroup){ @Override protected void modelChanged(){ updateLaunchConfigurationDialog(); } }; // GridData gd = new GridData(GridData.FILL_HORIZONTAL); // gd.heightHint = 80; // includeList.setLayoutData(gd); // // Composite includeButtons = new Composite(includeGroup, SWT.NULL); // GridLayout layout = new GridLayout(1, false); // layout.marginHeight = 0; // layout.marginWidth = 0; // includeButtons.setLayout(layout); // includeButtons.setLayoutData(new GridData(GridData.VERTICAL_ALIGN_BEGINNING)); // // Button addInclude = new Button(includeButtons, SWT.PUSH); // addInclude.setText(HTMLPlugin.getResourceString("Button.Add")); // addInclude.setLayoutData(new GridData(GridData.FILL_HORIZONTAL)); // addInclude.addSelectionListener(new SelectionAdapter(){ // public void widgetSelected(SelectionEvent evt){ // FileDialog dialog = new FileDialog(getShell(), SWT.OPEN|SWT.MULTI); // dialog.setFilterExtensions(new String[]{"*.js"}); // String result = dialog.open(); // if(result!=null){ // String dir = dialog.getFilterPath(); // String[] fileNames = dialog.getFileNames(); // for(int i=0;i<fileNames.length;i++){ // includeList.add(new File(dir, fileNames[i]).getAbsolutePath()); // } // updateLaunchConfigurationDialog(); // } // } // }); // // Button removeInclude = new Button(includeButtons, SWT.PUSH); // removeInclude.setText(HTMLPlugin.getResourceString("Button.Remove")); // removeInclude.setLayoutData(new GridData(GridData.FILL_HORIZONTAL)); // removeInclude.addSelectionListener(new SelectionAdapter(){ // public void widgetSelected(SelectionEvent evt){ // includeList.remove(includeList.getSelectionIndices()); // updateLaunchConfigurationDialog(); // } // }); } public void setDefaults(ILaunchConfigurationWorkingCopy configuration) { } @SuppressWarnings("unchecked") public void initializeFrom(ILaunchConfiguration configuration) { try { String scriptFile = configuration.getAttribute( JavaScriptLaunchConstants.ATTR_JAVASCRIPT_FILE, ""); file.setText(scriptFile); java.util.List includes = configuration.getAttribute( JavaScriptLaunchConstants.ATTR_JAVASCRIPT_INCLUDES, Collections.EMPTY_LIST); List<Object> tableModel = tableViewer.getModel(); tableModel.clear(); IWorkspaceRoot wsroot = ResourcesPlugin.getWorkspace().getRoot(); for(int i=0;i<includes.size();i++){ String path = (String)includes.get(i); if(path.startsWith(JavaScriptLibraryTable.PREFIX)){ IResource resource = wsroot.findMember(path.substring(JavaScriptLibraryTable.PREFIX.length())); if(resource!=null && resource instanceof IFile && resource.exists()){ tableModel.add(resource); } } else { tableModel.add(new File(path)); } } tableViewer.refresh(); } catch(Exception ex){ HTMLPlugin.logException(ex); } } public void performApply(ILaunchConfigurationWorkingCopy configuration) { configuration.setAttribute(JavaScriptLaunchConstants.ATTR_JAVASCRIPT_FILE, file.getText()); List tableModel = tableViewer.getModel(); List<String> includeFiles = new ArrayList<String>(); for(int i=0;i<tableModel.size();i++){ Object obj = tableModel.get(i); if(obj instanceof File){ includeFiles.add(((File)obj).getAbsolutePath()); } else if(obj instanceof IFile){ includeFiles.add(JavaScriptLibraryTable.PREFIX + ((IFile)obj).getFullPath().toString()); } } configuration.setAttribute(JavaScriptLaunchConstants.ATTR_JAVASCRIPT_INCLUDES, includeFiles); } public String getName() { return HTMLPlugin.getResourceString("Launcher.JavaScript.Tabs.Main"); } @Override public Image getImage() { return HTMLPlugin.getDefault().getImageRegistry().get(HTMLPlugin.ICON_JAVASCRIPT); } /** * Browse the JavaScript from the workspace and * returns the absolute path of selected JavaScript file. * * @return the absolute path of selected JavaScript file. */ private static String browseJavaScriptFile() { ElementTreeSelectionDialog dialog = new ElementTreeSelectionDialog( PlatformUI.getWorkbench().getActiveWorkbenchWindow().getShell(), new WorkbenchLabelProvider(), new WorkbenchContentProvider()); dialog.setInput(ResourcesPlugin.getWorkspace()); dialog.addFilter(new ViewerFilter(){ @Override public boolean select(Viewer viewer, Object parentElement, Object element){ if(element instanceof IProject || element instanceof IFolder){ return true; } if(element instanceof IFile){ if(((IFile)element).getName().endsWith(".js")){ return true; } } return false; } }); dialog.setAllowMultiple(false); dialog.setTitle(HTMLPlugin.getResourceString("Launcher.JavaScript.Dialog.SelectFile")); if (dialog.open() == Dialog.OK) { IFile file = (IFile) dialog.getFirstResult(); return file.getLocation().toString(); } return null; } }