package tk.eclipse.plugin.htmleditor;
import java.util.ArrayList;
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.core.runtime.CoreException;
import org.eclipse.jdt.internal.ui.wizards.TypedElementSelectionValidator;
import org.eclipse.jdt.internal.ui.wizards.TypedViewerFilter;
import org.eclipse.jdt.internal.ui.wizards.buildpaths.FolderSelectionDialog;
import org.eclipse.jface.dialogs.Dialog;
import org.eclipse.jface.viewers.ViewerFilter;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
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.Group;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Table;
import org.eclipse.swt.widgets.TableItem;
import org.eclipse.swt.widgets.Text;
import org.eclipse.ui.dialogs.ISelectionStatusValidator;
import org.eclipse.ui.dialogs.PropertyPage;
import org.eclipse.ui.model.WorkbenchContentProvider;
import org.eclipse.ui.model.WorkbenchLabelProvider;
/**
* This is a project preference page.
*
* @author Naoki Takezoe
*/
public class HTMLProjectPropertyPage extends PropertyPage {
private Text textWebAppRoot;
private TableItem checkValidateXML;
private TableItem checkValidateHTML;
private TableItem checkValidateJSP;
private TableItem checkValidateDTD;
private TableItem checkValidateJS;
private TableItem checkTaskTag;
private Button checkUseDTD;
private Button checkRemoveMarkers;
private HTMLProjectParams params;
private Table table;
public HTMLProjectPropertyPage() {
super();
}
@Override
protected Control createContents(Composite parent) {
Composite composite = new Composite(parent, SWT.NONE);
GridLayout layout = new GridLayout();
composite.setLayout(layout);
composite.setLayoutData(new GridData(GridData.FILL_BOTH));
addControls(composite);
try {
params = new HTMLProjectParams(getProject());
fillControls();
} catch (Exception ex) {
HTMLPlugin.logException(ex);
}
return composite;
}
private void addControls(Composite parent) {
Composite composite = createDefaultComposite(parent);
Composite panel = new Composite(composite, SWT.NULL);
panel.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
panel.setLayout(new GridLayout(3, false));
Label labelWebAppRoot = new Label(panel, SWT.NONE);
labelWebAppRoot.setText(HTMLPlugin.getResourceString("HTMLProjectPropertyPage.Root"));
textWebAppRoot = new Text(panel, SWT.SINGLE | SWT.BORDER);
textWebAppRoot.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
Button button = new Button(panel, SWT.BUTTON1);
button.setText(HTMLPlugin.getResourceString("Button.Browse"));
button.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e) {
selectFolder();
}
});
checkUseDTD = new Button(composite,SWT.CHECK);
checkUseDTD.setText(HTMLPlugin.getResourceString("HTMLProjectPropertyPage.UseDTD"));
// spacer
new Label(composite, SWT.NULL);
Group group = new Group(composite, SWT.NULL);
group.setText(HTMLPlugin.getResourceString("HTMLProjectPropertyPage.Validation"));
group.setLayoutData(new GridData(GridData.FILL_BOTH));
group.setLayout(new GridLayout(1, false));
table = new Table(group, SWT.CHECK|SWT.BORDER);
table.setLayoutData(new GridData(GridData.FILL_BOTH));
checkValidateHTML = new TableItem(table, SWT.NULL);
checkValidateHTML.setText(HTMLPlugin.getResourceString("HTMLProjectPropertyPage.ValidateHTML"));
checkValidateJSP = new TableItem(table,SWT.NULL);
checkValidateJSP.setText(HTMLPlugin.getResourceString("HTMLProjectPropertyPage.ValidateJSP"));
checkValidateXML = new TableItem(table,SWT.NULL);
checkValidateXML.setText(HTMLPlugin.getResourceString("HTMLProjectPropertyPage.ValidateXML"));
checkValidateDTD = new TableItem(table, SWT.NULL);
checkValidateDTD.setText(HTMLPlugin.getResourceString("HTMLProjectPropertyPage.ValidateDTD"));
checkValidateJS = new TableItem(table, SWT.NULL);
checkValidateJS.setText(HTMLPlugin.getResourceString("HTMLProjectPropertyPage.ValidateJS"));
checkTaskTag = new TableItem(table, SWT.NULL);
checkTaskTag.setText(HTMLPlugin.getResourceString("HTMLProjectPropertyPage.DetectTaskTags"));
checkRemoveMarkers = new Button(group, SWT.CHECK);
checkRemoveMarkers.setText(HTMLPlugin.getResourceString("HTMLProjectPropertyPage.RemoveMarkers"));
}
private Composite createDefaultComposite(Composite parent) {
Composite composite = new Composite(parent, SWT.NULL);
GridLayout layout = new GridLayout(1, false);
composite.setLayout(layout);
composite.setLayoutData(new GridData(GridData.FILL_BOTH));
return composite;
}
/**
* Sets values of HTMLProjectParams to controls.
*/
private void fillControls() {
textWebAppRoot.setText(params.getRoot());
checkUseDTD.setSelection(params.getUseDTD());
checkValidateHTML.setChecked(params.getValidateHTML());
checkValidateJSP.setChecked(params.getValidateJSP());
checkValidateXML.setChecked(params.getValidateXML());
checkValidateDTD.setChecked(params.getValidateDTD());
checkValidateJS.setChecked(params.getValidateJavaScript());
checkRemoveMarkers.setSelection(params.getRemoveMarkers());
checkTaskTag.setChecked(params.getDetectTaskTag());
}
@Override
protected void performDefaults() {
params = new HTMLProjectParams();
fillControls();
}
@Override
public boolean performOk() {
// TODO input check?
try {
// save configuration
params = new HTMLProjectParams(getProject());
params.setRoot(textWebAppRoot.getText());
params.setUseDTD(checkUseDTD.getSelection());
params.setValidateHTML(checkValidateHTML.getChecked());
params.setValidateJSP(checkValidateJSP.getChecked());
params.setValidateXML(checkValidateXML.getChecked());
params.setValidateDTD(checkValidateDTD.getChecked());
params.setValidateJavaScript(checkValidateJS.getChecked());
params.setDetectTaskTag(checkTaskTag.getChecked());
params.setRemoveMarkers(checkRemoveMarkers.getSelection());
params.save(getProject());
} catch (Exception ex) {
HTMLPlugin.logException(ex);
return false;
}
return true;
}
private void selectFolder() {
try {
IProject currProject = getProject();
IWorkspaceRoot wsroot = ResourcesPlugin.getWorkspace().getRoot();
IResource init = null;
if (params.getRoot() != null) {
init = wsroot.findMember(currProject.getName() + params.getRoot());
}
Class[] acceptedClasses = new Class[] { IProject.class, IFolder.class };
ISelectionStatusValidator validator = new TypedElementSelectionValidator(acceptedClasses, false);
IProject[] allProjects = wsroot.getProjects();
ArrayList<IProject> rejectedElements = new ArrayList<IProject>(allProjects.length);
for (int i = 0; i < allProjects.length; i++) {
if (!allProjects[i].equals(currProject)) {
rejectedElements.add(allProjects[i]);
}
}
ViewerFilter filter = new TypedViewerFilter(acceptedClasses, rejectedElements.toArray());
FolderSelectionDialog dialog = new FolderSelectionDialog(
getShell(),
new WorkbenchLabelProvider(),
new WorkbenchContentProvider());
dialog.setTitle(HTMLPlugin.getResourceString("HTMLProjectPropertyPage.WebRoot"));
dialog.setMessage(HTMLPlugin.getResourceString("HTMLProjectPropertyPage.WebRoot"));
dialog.setInput(wsroot);
dialog.setValidator(validator);
dialog.addFilter(filter);
dialog.setInitialSelection(init);
if (dialog.open() == Dialog.OK) {
textWebAppRoot.setText(getFolderName(dialog.getFirstResult()));
}
} catch (Throwable t) {
HTMLPlugin.openAlertDialog(t.toString());
}
}
private IProject getProject(){
return (IProject)getElement(); //.getAdapter(IProject.class);
}
private String getFolderName(Object result) throws CoreException {
if (result instanceof IFolder) {
IFolder folder = (IFolder) result;
String folderName = folder.getLocation().toString();
String projectPath = getProject().getLocation().toString();
if (folderName.length() <= projectPath.length()) {
return folderName;
} else {
return folderName.substring(projectPath.length());
}
}
return "/";
}
}