/***************************************************************************** * This file is part of Rinzo * * Author: Claudio Cancinos * WWW: https://sourceforge.net/projects/editorxml * Copyright (C): 2008, Claudio Cancinos * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this program; If not, see <http://www.gnu.org/licenses/> ****************************************************************************/ package ar.com.tadp.xml.rinzo.jdt.preferences; import java.util.ArrayList; import java.util.List; import org.eclipse.jface.dialogs.Dialog; import org.eclipse.jface.preference.PreferencePage; import org.eclipse.jface.viewers.ILabelProviderListener; 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.graphics.Point; import org.eclipse.swt.layout.GridData; import org.eclipse.swt.layout.GridLayout; import org.eclipse.swt.widgets.Button; import org.eclipse.swt.widgets.Combo; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Control; import org.eclipse.swt.widgets.Label; import org.eclipse.swt.widgets.Shell; import org.eclipse.swt.widgets.TabFolder; import org.eclipse.swt.widgets.TabItem; import org.eclipse.swt.widgets.Table; import org.eclipse.swt.widgets.TableColumn; import org.eclipse.swt.widgets.Text; import org.eclipse.ui.IWorkbench; import org.eclipse.ui.IWorkbenchPreferencePage; import ar.com.tadp.xml.rinzo.jdt.RinzoJDTPlugin; /** * Preference Page for JDT integration. It will configure: * * <ul> * <li>Severity used to mark errors (Error, Warning, Info, Ignore).</li> * <li>Switch between validating all attributes and tag's bodies or just the ones configured for such a task.</li> * <li>In configured tag's and attributes it is possible to define from which class/interface should extend/implement the written values.</li> * </ul> * * @author ccancinos */ public class ClassNamesPreferencePage extends PreferencePage implements IWorkbenchPreferencePage { private Button enableClassName; private TabFolder tabFolder; private TableViewer attributeTableViewer; private TableViewer elementTableViewer; private List<ClassElement> elementModel = new ArrayList<ClassElement>(); private List<ClassAttribute> attributeModel = new ArrayList<ClassAttribute>(); private Combo severityCombo; public ClassNamesPreferencePage(){ super("ClassNames"); setPreferenceStore(RinzoJDTPlugin.getDefault().getPreferenceStore()); setDescription("Add Elements/Attributes containing Class names."); } public void init(IWorkbench workbench) { } protected Control createContents(Composite parent) { Composite composite = new Composite(parent, SWT.NULL); composite.setLayoutData(new GridData(GridData.FILL_BOTH)); composite.setLayout(new GridLayout(1, false)); Composite labelCombo = new Composite(composite, SWT.NULL); labelCombo.setLayoutData(new GridData(GridData.FILL_HORIZONTAL)); labelCombo.setLayout(new GridLayout(2, false)); Label label = new Label(labelCombo, SWT.NULL); label.setText("&Severity:"); severityCombo = new Combo (labelCombo, SWT.READ_ONLY); severityCombo.setItems (new String [] {"Error", "Warning", "Info", "Ignore"}); severityCombo.setText(RinzoJDTPlugin.getCompilationSeverity()); // checkbox to toggle the classname support enableClassName = new Button(composite, SWT.CHECK); enableClassName.setText("&Validation and content assist only for configured Tags and Attributes."); enableClassName.setSelection(RinzoJDTPlugin.isEnableClassName()); enableClassName.addSelectionListener(new SelectionAdapter(){ public void widgetSelected(SelectionEvent e){ updateControls(); } }); GridData gd = new GridData(); gd.horizontalSpan = 2; enableClassName.setLayoutData(gd); tabFolder = new TabFolder(composite, SWT.NULL); tabFolder.setLayoutData(new GridData(GridData.FILL_BOTH)); TabItem attributeTab = new TabItem(tabFolder,SWT.NULL); attributeTab.setText("Attributes"); attributeTab.setControl(createAttributeArea(tabFolder)); TabItem elementTab = new TabItem(tabFolder,SWT.NULL); elementTab.setText("Tags"); elementTab.setControl(createElementArea(tabFolder)); // set initial values attributeModel.addAll(ClassAttribute.loadFromPreference(false)); attributeTableViewer.refresh(); elementModel.addAll(ClassElement.loadFromPreference(false)); elementTableViewer.refresh(); this.updateControls(); return composite; } private Control createElementArea(Composite parent){ TableViewerSupport<ClassElement> support = new TableViewerSupport<ClassElement>(elementModel, parent){ protected void initTableViewer(TableViewer viewer) { Table table = viewer.getTable(); TableColumn col1 = new TableColumn(table, SWT.NULL); col1.setText("Tag Name"); col1.setWidth(100); TableColumn col2 = new TableColumn(table, SWT.NULL); col2.setText("Extends"); col2.setWidth(220); } protected ClassElement doAdd() { ClassElementDialog dialog = new ClassElementDialog(getShell()); if(dialog.open()==Dialog.OK){ return dialog.getCustomElement(); } return null; } protected void doEdit(ClassElement element) { ClassElementDialog dialog = new ClassElementDialog(getShell(), element); if(dialog.open()==Dialog.OK){ ClassElement newElement = dialog.getCustomElement(); element.setDisplayName(newElement.getDisplayName()); element.setExtending(newElement.getExtending()); } } protected ITableLabelProvider createLabelProvider() { return new ClassAssistLabelProvider(); } }; elementTableViewer = support.getTableViewer(); return support.getControl(); } private Control createAttributeArea(Composite parent){ TableViewerSupport<ClassAttribute> support = new TableViewerSupport<ClassAttribute>(attributeModel, parent){ protected void initTableViewer(TableViewer viewer) { Table table = viewer.getTable(); TableColumn col1 = new TableColumn(table, SWT.NULL); col1.setText("Target Tag"); col1.setWidth(90); TableColumn col2 = new TableColumn(table, SWT.NULL); col2.setText("Attribute Name"); col2.setWidth(90); TableColumn col3 = new TableColumn(table, SWT.NULL); col3.setText("Extends"); col3.setWidth(220); } protected ClassAttribute doAdd() { ClassAttributeDialog dialog = new ClassAttributeDialog(getShell()); if(dialog.open()==Dialog.OK){ return dialog.getCustomAttribute(); } return null; } protected void doEdit(ClassAttribute attrInfo) { ClassAttributeDialog dialog = new ClassAttributeDialog(getShell(), attrInfo); if(dialog.open()==Dialog.OK){ ClassAttribute newAttrInfo = dialog.getCustomAttribute(); attrInfo.setTargetTag(newAttrInfo.getTargetTag()); attrInfo.setAttributeName(newAttrInfo.getAttributeName()); attrInfo.setExtending(newAttrInfo.getExtending()); } } protected ITableLabelProvider createLabelProvider() { return new ClassAssistLabelProvider(); } }; attributeTableViewer = support.getTableViewer(); return support.getControl(); } protected void performDefaults() { attributeModel.clear(); attributeModel.addAll(ClassAttribute.loadFromPreference(true)); attributeTableViewer.refresh(); elementModel.clear(); elementModel.addAll(ClassElement.loadFromPreference(true)); elementTableViewer.refresh(); enableClassName.setSelection(RinzoJDTPlugin.isEnableClassName()); severityCombo.setText(RinzoJDTPlugin.getCompilationSeverity()); this.updateControls(); } public boolean performOk() { ClassAttribute.saveToPreference(attributeModel); ClassElement.saveToPreference(elementModel); RinzoJDTPlugin.setEnableClassName(enableClassName.getSelection()); RinzoJDTPlugin.setCompilationSeverity(this.severityCombo.getText()); return true; } /** * Updates controls status. */ private void updateControls(){ boolean enabled = this.enableClassName.getSelection(); tabFolder.setEnabled(enabled); attributeTableViewer.getControl().setEnabled(enabled); elementTableViewer.getControl().setEnabled(enabled); } /** * LabelProvider for TableViewers */ private static class ClassAssistLabelProvider implements ITableLabelProvider { public Image getColumnImage(Object element, int columnIndex) { return null; } public String getColumnText(Object element, int columnIndex) { if(element instanceof ClassAttribute){ ClassAttribute attr = (ClassAttribute)element; if(columnIndex==0){ return attr.getTargetTag(); } else if(columnIndex==1){ return attr.getAttributeName(); } else if(columnIndex == 2) { return attr.getExtending(); } } else if(element instanceof ClassElement){ ClassElement elem = (ClassElement)element; if(columnIndex==0){ return elem.getDisplayName(); } else if(columnIndex==1){ return elem.getExtending(); } } return null; } public void addListener(ILabelProviderListener listener) { } public void dispose() { } public boolean isLabelProperty(Object element, String property) { return false; } public void removeListener(ILabelProviderListener listener) { } } /** * The dialog to add / edit the code completion proposal for elements. */ private static class ClassElementDialog extends Dialog { private Text displayName; private Text extending; private ClassElement element; public ClassElementDialog(Shell parentShell) { super(parentShell); setShellStyle(getShellStyle()|SWT.RESIZE); } public ClassElementDialog(Shell parentShell, ClassElement element) { super(parentShell); this.element = element; } protected Point getInitialSize() { Point size = super.getInitialSize(); size.x = 300; return size; } protected Control createDialogArea(Composite parent) { getShell().setText("Elements"); Composite composite = new Composite(parent, SWT.NULL); composite.setLayoutData(new GridData(GridData.FILL_BOTH)); composite.setLayout(new GridLayout(2,false)); Label label = new Label(composite, SWT.NULL); label.setText("Tag Name"); displayName = new Text(composite, SWT.BORDER); if(element!=null){ displayName.setText(element.getDisplayName()); } displayName.setLayoutData(new GridData(GridData.FILL_HORIZONTAL)); label = new Label(composite, SWT.NULL); label.setText("Extends"); extending = new Text(composite, SWT.BORDER); if(element!=null){ extending.setText(element.getExtending()); } extending.setLayoutData(new GridData(GridData.FILL_HORIZONTAL)); return composite; } protected void okPressed() { if(displayName.getText().length()==0){ RinzoJDTPlugin.openAlertDialog("Required: Display Name"); return; } element = new ClassElement(displayName.getText(), extending.getText()); super.okPressed(); } public ClassElement getCustomElement(){ return element; } } /** * The dialog to add / edit the code completion proposal for attributes. */ private static class ClassAttributeDialog extends Dialog { private Text target; private Text attributeName; private Text extending; private ClassAttribute attrInfo; public ClassAttributeDialog(Shell parentShell) { super(parentShell); setShellStyle(getShellStyle()|SWT.RESIZE); } public ClassAttributeDialog(Shell parentShell, ClassAttribute attrInfo) { super(parentShell); this.attrInfo = attrInfo; } protected Point getInitialSize() { Point size = super.getInitialSize(); size.x = 300; return size; } protected Control createDialogArea(Composite parent) { getShell().setText("Attributes"); Composite composite = new Composite(parent, SWT.NULL); composite.setLayoutData(new GridData(GridData.FILL_BOTH)); composite.setLayout(new GridLayout(2,false)); Label label = new Label(composite, SWT.NULL); label.setText("Target Tag"); target = new Text(composite, SWT.BORDER); if(attrInfo != null){ target.setText(attrInfo.getTargetTag()); } else { target.setText("*"); } target.setLayoutData(new GridData(GridData.FILL_HORIZONTAL)); label = new Label(composite, SWT.NULL); label.setText("Attribute Name"); attributeName = new Text(composite, SWT.BORDER); attributeName.setLayoutData(new GridData(GridData.FILL_HORIZONTAL)); if(attrInfo != null){ attributeName.setText(attrInfo.getAttributeName()); } label = new Label(composite, SWT.NULL); label.setText("Extends"); extending = new Text(composite, SWT.BORDER); extending.setLayoutData(new GridData(GridData.FILL_HORIZONTAL)); if(attrInfo != null){ extending.setText(attrInfo.getExtending()); } return composite; } protected void okPressed() { if(target.getText().length()==0){ RinzoJDTPlugin.openAlertDialog("Required: Target Tag"); return; } if(attributeName.getText().length()==0){ RinzoJDTPlugin.openAlertDialog("Required: Attribute Name"); return; } attrInfo = new ClassAttribute(target.getText(), attributeName.getText(), extending.getText()); super.okPressed(); } public ClassAttribute getCustomAttribute(){ return attrInfo; } } }