package tk.eclipse.plugin.jseditor.launch;
import java.io.File;
import java.util.ArrayList;
import java.util.List;
import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.IWorkspaceRoot;
import org.eclipse.core.resources.ResourcesPlugin;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.Status;
import org.eclipse.jface.dialogs.Dialog;
import org.eclipse.jface.viewers.ILabelProviderListener;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.jface.viewers.ITableLabelProvider;
import org.eclipse.jface.viewers.TableViewer;
import org.eclipse.swt.SWT;
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.Control;
import org.eclipse.swt.widgets.FileDialog;
import org.eclipse.ui.dialogs.ElementTreeSelectionDialog;
import org.eclipse.ui.dialogs.ISelectionStatusValidator;
import org.eclipse.ui.model.WorkbenchContentProvider;
import org.eclipse.ui.model.WorkbenchLabelProvider;
import org.objectstyle.wolips.baseforuiplugins.utils.ListContentProvider;
import tk.eclipse.plugin.htmleditor.HTMLPlugin;
/**
* The table component to edit JavaScript libraries.
*
* @author Naoki Takezoe
*/
public class JavaScriptLibraryTable {
public static final String PREFIX = "entry:";
private TableViewer _tableViewer;
private List<Object> _tableModel = new ArrayList<Object>();
private Composite _composite;
private Button _add;
private Button _addExternal;
private Button _remove;
private Button _up;
private Button _down;
/**
* The constructor.
*
* @param parent the parent component
*/
public JavaScriptLibraryTable(final Composite parent){
_composite = new Composite(parent, SWT.NULL);
_composite.setLayout(new GridLayout(2, false));
_composite.setLayoutData(new GridData(GridData.FILL_BOTH));
// list
_tableViewer = new TableViewer(_composite);
GridData gd = new GridData(GridData.FILL_BOTH);
gd.widthHint = 250;
_tableViewer.getTable().setLayoutData(gd);
_tableViewer.getTable().addSelectionListener(new SelectionAdapter(){
@Override
public void widgetSelected(SelectionEvent evt){
updateButtons();
}
});
_tableViewer.setContentProvider(new ListContentProvider());
_tableViewer.setLabelProvider(new ITableLabelProvider(){
public Image getColumnImage(Object element, int columnIndex) {
if(element instanceof File){
return HTMLPlugin.getDefault().getImageRegistry().get(HTMLPlugin.ICON_JAR_EXT);
} else if(element instanceof IFile){
return HTMLPlugin.getDefault().getImageRegistry().get(HTMLPlugin.ICON_JAR);
}
return null;
}
public String getColumnText(Object element, int columnIndex) {
if(element instanceof File){
return ((File)element).getAbsolutePath();
} else if(element instanceof IFile){
return ((IFile)element).getFullPath().toString();
}
return element.toString();
}
public void addListener(ILabelProviderListener listener) {
}
public void dispose() {
}
public boolean isLabelProperty(Object element, String property) {
return false;
}
public void removeListener(ILabelProviderListener listener) {
}
});
_tableViewer.setInput(_tableModel);
// buttons
Composite buttons = new Composite(_composite, SWT.NULL);
GridLayout layout = new GridLayout();
layout.marginHeight = 0;
layout.marginWidth = 0;
buttons.setLayout(layout);
buttons.setLayoutData(new GridData(GridData.VERTICAL_ALIGN_BEGINNING));
_add = new Button(buttons, SWT.PUSH);
_add.setText(HTMLPlugin.getResourceString("Button.Add"));
_add.setLayoutData(createButtonGridData());
_add.addSelectionListener(new SelectionAdapter(){
@Override
public void widgetSelected(SelectionEvent evt){
IWorkspaceRoot wsroot = ResourcesPlugin.getWorkspace().getRoot();
ElementTreeSelectionDialog dialog = new ElementTreeSelectionDialog(
parent.getShell(),
new WorkbenchLabelProvider(),
new WorkbenchContentProvider());
dialog.setTitle(HTMLPlugin.getResourceString("JavaScriptPropertyPage.ChooseJavaScript"));
dialog.setMessage(HTMLPlugin.getResourceString("JavaScriptPropertyPage.ChooseJavaScript.Description"));
dialog.setInput(wsroot);
dialog.setValidator(new ISelectionStatusValidator(){
private IStatus okStatus = new Status(Status.OK, HTMLPlugin.getDefault().getPluginId(), Status.OK, "", null);
private IStatus ngStatus = new Status(Status.ERROR, HTMLPlugin.getDefault().getPluginId(), Status.ERROR, "", null);
public IStatus validate(Object[] selection) {
for(int i=0;i<selection.length;i++){
if(!(selection[i] instanceof IFile)){
return ngStatus;
}
if(!((IFile)selection[i]).getName().endsWith(".js")){
return ngStatus;
}
if(_tableModel.contains(selection[i])){
return ngStatus;
}
}
if(selection.length==0){
return ngStatus;
}
return okStatus;
}
});
if (dialog.open() == Dialog.OK) {
Object[] results = dialog.getResult();
for(int i=0;i<results.length;i++){
_tableModel.add(results[i]);
}
_tableViewer.refresh();
modelChanged();
}
}
});
_addExternal = new Button(buttons, SWT.PUSH);
_addExternal.setText(HTMLPlugin.getResourceString("Button.AddExternal"));
_addExternal.setLayoutData(createButtonGridData());
_addExternal.addSelectionListener(new SelectionAdapter(){
@Override
public void widgetSelected(SelectionEvent evt){
FileDialog dialog = new FileDialog(parent.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++){
_tableModel.add(new File(dir, fileNames[i]));
}
_tableViewer.refresh();
modelChanged();
}
}
});
_remove = new Button(buttons, SWT.PUSH);
_remove.setText(HTMLPlugin.getResourceString("Button.Remove"));
_remove.setLayoutData(createButtonGridData());
_remove.addSelectionListener(new SelectionAdapter(){
@Override
public void widgetSelected(SelectionEvent evt){
IStructuredSelection sel = (IStructuredSelection)_tableViewer.getSelection();
_tableModel.removeAll(sel.toList());
updateButtons();
_tableViewer.refresh();
modelChanged();
}
});
_up = new Button(buttons, SWT.PUSH);
_up.setText(HTMLPlugin.getResourceString("Button.Up"));
_up.setLayoutData(createButtonGridData());
_up.addSelectionListener(new SelectionAdapter(){
@Override
public void widgetSelected(SelectionEvent evt){
int index = _tableViewer.getTable().getSelectionIndex();
if(index > 0){
_tableModel.add(index, _tableModel.remove(index - 1));
_tableViewer.refresh();
modelChanged();
updateButtons();
}
}
});
_down = new Button(buttons, SWT.PUSH);
_down.setText(HTMLPlugin.getResourceString("Button.Down"));
_down.setLayoutData(createButtonGridData());
_down.addSelectionListener(new SelectionAdapter(){
@Override
public void widgetSelected(SelectionEvent evt){
int index = _tableViewer.getTable().getSelectionIndex();
if(index < _tableModel.size() - 1){
_tableModel.add(index, _tableModel.remove(index + 1));
_tableViewer.refresh();
modelChanged();
updateButtons();
}
}
});
updateButtons();
}
/**
* Updates button status.
*/
protected void updateButtons(){
_remove.setEnabled(_tableViewer.getTable().getSelectionCount() != 0);
_up.setEnabled(_tableViewer.getTable().getSelectionCount() == 1 &&
_tableViewer.getTable().getSelectionIndex() > 0);
_down.setEnabled(_tableViewer.getTable().getSelectionCount() == 1 &&
_tableViewer.getTable().getSelectionIndex() < _tableModel.size() - 1);
}
/**
* This method would be invoked when the table model changed.
* <p>
* Please override this method at the subclass, if you want to
* do any processing by the table model modifications.
*/
protected void modelChanged(){
}
/**
* Returns the control.
*
* @return the control
*/
public Control getControl(){
return _composite;
}
/**
* Returns the table model.
*
* @return the table model
*/
public List getModel(){
return _tableModel;
}
/**
* Refreshes the <code>TableViewer</code>.
*/
public void refresh(){
_tableViewer.refresh();
}
/**
* Creates <code>GridData</code> for buttons.
*
* @return the <code>GridData</code> which has a widthHint(=100)
*/
private static GridData createButtonGridData(){
GridData gd = new GridData(GridData.FILL_HORIZONTAL);
gd.widthHint = 100;
return gd;
}
}