package tk.eclipse.plugin.htmleditor; import java.util.ArrayList; import java.util.Iterator; import java.util.List; import java.util.Map; import org.eclipse.jface.dialogs.Dialog; import org.eclipse.jface.preference.IPreferenceStore; 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.Composite; import org.eclipse.swt.widgets.Control; import org.eclipse.swt.widgets.FileDialog; 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.TableItem; import org.eclipse.swt.widgets.Text; import org.eclipse.ui.IWorkbench; import org.eclipse.ui.IWorkbenchPreferencePage; import org.objectstyle.wolips.preferences.TableViewerSupport; import tk.eclipse.plugin.xmleditor.editors.ElementSchemaMapping; /** * The preference page to configure DTD settings. * * @author Naoki Takezoe */ public class DTDPreferencePage extends PreferencePage implements IWorkbenchPreferencePage { private Table table; private Button buttonAdd; private Button buttonEdit; private Button buttonRemove; private Button buttonCache; private CustomSchemaTableViewer customSchemaViewer; private List<ElementSchemaMapping> customSchemaModel = new ArrayList<ElementSchemaMapping>(); public DTDPreferencePage() { super(HTMLPlugin.getResourceString("HTMLEditorPreferencePage.DTD")); setPreferenceStore(HTMLPlugin.getDefault().getPreferenceStore()); setDescription(HTMLPlugin.getResourceString("HTMLEditorPreferencePage.LocalDTD")); } @Override protected Control createContents(Composite parent) { TabFolder folder = new TabFolder(parent, SWT.NULL); folder.setLayoutData(new GridData(GridData.FILL_BOTH)); Composite composite = new Composite(folder, SWT.NONE); composite.setLayout(new GridLayout(2,false)); TabItem tab1 = new TabItem(folder, SWT.NULL); tab1.setControl(composite); tab1.setText(HTMLPlugin.getResourceString("HTMLEditorPreferencePage.tab.LocalSchema")); // create table table = new Table(composite,SWT.MULTI|SWT.FULL_SELECTION|SWT.BORDER|SWT.H_SCROLL|SWT.V_SCROLL); table.setLayoutData(new GridData(GridData.FILL_BOTH)); table.setHeaderVisible(true); table.setLinesVisible(true); table.addSelectionListener(new SelectionAdapter(){ @Override public void widgetSelected(SelectionEvent evt){ TableItem[] items = table.getSelection(); boolean enable = false; if(items.length > 0){ String path = items[0].getText(1); if(!path.equals("[Default]")){ enable = true; } } buttonEdit.setEnabled(enable); buttonRemove.setEnabled(enable); } }); TableColumn col1 = new TableColumn(table,SWT.LEFT); col1.setText(HTMLPlugin.getResourceString("HTMLEditorPreferencePage.Uri")); col1.setWidth(100); TableColumn col2 = new TableColumn(table,SWT.LEFT); col2.setText(HTMLPlugin.getResourceString("HTMLEditorPreferencePage.LocalPath")); col2.setWidth(150); // create buttons Composite buttons = new Composite(composite,SWT.NONE); buttons.setLayoutData(new GridData(GridData.FILL_VERTICAL)); GridLayout layout = new GridLayout(); layout.marginHeight = 0; layout.marginWidth = 0; buttons.setLayout(layout); buttonAdd = new Button(buttons,SWT.PUSH); buttonAdd.setText(HTMLPlugin.getResourceString("Button.Add")); buttonAdd.setLayoutData(createButtonGridData()); buttonAdd.addSelectionListener( new SelectionAdapter(){ @Override public void widgetSelected(SelectionEvent evt){ DTDDialog dialog = new DTDDialog(getShell()); if(dialog.open()==Dialog.OK){ TableItem item = new TableItem(table,SWT.NONE); item.setText(new String[]{dialog.getName(),dialog.getPath()}); } } }); buttonEdit = new Button(buttons,SWT.PUSH); buttonEdit.setText(HTMLPlugin.getResourceString("Button.Edit")); buttonEdit.setLayoutData(createButtonGridData()); buttonEdit.setEnabled(false); buttonEdit.addSelectionListener( new SelectionAdapter(){ @Override public void widgetSelected(SelectionEvent evt){ TableItem[] items = table.getSelection(); if(items.length > 0){ String uri = items[0].getText(0); String path = items[0].getText(1); DTDDialog dialog = new DTDDialog(getShell(),uri,path); if(dialog.open()==Dialog.OK){ items[0].setText(new String[]{dialog.getName(),dialog.getPath()}); } } } }); buttonRemove = new Button(buttons,SWT.PUSH); buttonRemove.setText(HTMLPlugin.getResourceString("Button.Remove")); buttonRemove.setLayoutData(createButtonGridData()); buttonRemove.setEnabled(false); buttonRemove.addSelectionListener( new SelectionAdapter(){ @Override public void widgetSelected(SelectionEvent evt){ int[] indices = table.getSelectionIndices(); table.remove(indices); } }); // DTD cache buttonCache = new Button(composite,SWT.CHECK); buttonCache.setText(HTMLPlugin.getResourceString("HTMLEditorPreferencePage.Dialog.Cache")); GridData gd = new GridData(); gd.horizontalSpan = 2; buttonCache.setLayoutData(gd); // Custom Schema Mappings customSchemaModel = ElementSchemaMapping.loadFromPreference(); customSchemaViewer = new CustomSchemaTableViewer(customSchemaModel, folder); TabItem tab2 = new TabItem(folder, SWT.NULL); tab2.setText(HTMLPlugin.getResourceString("HTMLEditorPreferencePage.tab.ElementMapping")); tab2.setControl(customSchemaViewer.getControl()); // set initial values performDefaults(); return composite; } @Override public boolean performOk() { IPreferenceStore store = getPreferenceStore(); TableItem[] items = table.getItems(); StringBuffer uri = new StringBuffer(); StringBuffer path = new StringBuffer(); for(int i=0;i<items.length;i++){ if(!items[i].getText(1).equals("[Default]")){ uri.append(items[i].getText(0)).append("\n"); path.append(items[i].getText(1)).append("\n"); } } store.setValue(HTMLPlugin.PREF_DTD_URI,uri.toString()); store.setValue(HTMLPlugin.PREF_DTD_PATH,path.toString()); store.setValue(HTMLPlugin.PREF_DTD_CACHE,buttonCache.getSelection()); ElementSchemaMapping.saveToPreference(customSchemaModel); return true; } @Override protected void performDefaults() { IPreferenceStore store = getPreferenceStore(); table.removeAll(); Map innerDTD = HTMLPlugin.getInnerDTD(); Iterator ite = innerDTD.keySet().iterator(); while(ite.hasNext()){ TableItem item = new TableItem(table,SWT.NONE); item.setText(new String[]{(String)ite.next(),"[Default]"}); } String[] uri = store.getString(HTMLPlugin.PREF_DTD_URI).split("\n"); String[] path = store.getString(HTMLPlugin.PREF_DTD_PATH).split("\n"); for(int i=0;i<uri.length;i++){ if(!uri[i].trim().equals("") && !path[i].trim().equals("")){ TableItem item = new TableItem(table,SWT.NONE); item.setText(new String[]{uri[i].trim(),path[i].trim()}); } } buttonCache.setSelection(store.getBoolean(HTMLPlugin.PREF_DTD_CACHE)); } private class CustomSchemaTableViewer extends TableViewerSupport { public CustomSchemaTableViewer(List model, Composite parent){ super(model, parent); } @Override protected ITableLabelProvider createLabelProvider() { return new ITableLabelProvider(){ public Image getColumnImage(Object element, int columnIndex) { return null; } public String getColumnText(Object element, int columnIndex) { if(columnIndex==0){ return ((ElementSchemaMapping)element).getRootElement(); } else if(columnIndex==1){ return ((ElementSchemaMapping)element).getFilePath(); } return null; } public void addListener(ILabelProviderListener listener) { } public void dispose() { } public boolean isLabelProperty(Object element, String property) { return false; } public void removeListener(ILabelProviderListener listener) { } }; } @Override protected Object doAdd() { CustomSchemaDialog dialog = new CustomSchemaDialog(getShell()); if(dialog.open()==Dialog.OK){ ElementSchemaMapping mapping = new ElementSchemaMapping( dialog.getName(), dialog.getPath()); return mapping; } return null; } @Override protected void doEdit(Object obj) { ElementSchemaMapping mapping = (ElementSchemaMapping)obj; CustomSchemaDialog dialog = new CustomSchemaDialog( getShell(), mapping.getRootElement(), mapping.getFilePath()); if(dialog.open()==Dialog.OK){ mapping.setRootElement(dialog.getName()); mapping.setFilePath(dialog.getPath()); } } @Override protected void initTableViewer(TableViewer viewer) { Table viewerTable = viewer.getTable(); TableColumn col1 = new TableColumn(viewerTable,SWT.LEFT); col1.setText(HTMLPlugin.getResourceString("HTMLEditorPreferencePage.RootElement")); col1.setWidth(100); TableColumn col2 = new TableColumn(viewerTable,SWT.LEFT); col2.setText(HTMLPlugin.getResourceString("HTMLEditorPreferencePage.LocalPath")); col2.setWidth(150); } } /** * Create LayoutData for "add", "edit" and "remove" buttons. * @return GridData */ private static GridData createButtonGridData(){ GridData gd = new GridData(GridData.FILL_HORIZONTAL); gd.widthHint = 100; return gd; } public void init(IWorkbench workbench) { } /** * The dialog to add or edit custom schema mappings. */ private class CustomSchemaDialog extends DTDDialog { public CustomSchemaDialog(Shell parentShell) { super(parentShell); } public CustomSchemaDialog(Shell parentShell,String name,String path) { super(parentShell, name, path); } @Override protected String getNameLabel(){ return HTMLPlugin.getResourceString("HTMLEditorPreferencePage.Dialog.RootElement"); } } /** * The dialog to add or edit local schema mappings. */ private class DTDDialog extends AbstractValidationDialog { private Text textName; private Text textPath; private String name = ""; private String path = ""; public DTDDialog(Shell parentShell) { super(parentShell); } public DTDDialog(Shell parentShell,String name,String path) { super(parentShell); this.name = name; this.path = path; } @Override protected Point getInitialSize() { Point size = super.getInitialSize(); size.x = 400; return size; } protected String getNameLabel(){ return HTMLPlugin.getResourceString("HTMLEditorPreferencePage.Dialog.Uri"); } @Override protected Control createDialogArea(Composite parent) { getShell().setText(HTMLPlugin.getResourceString("HTMLEditorPreferencePage.DTD")); Composite container = new Composite(parent,SWT.NULL); container.setLayoutData(new GridData(GridData.FILL_BOTH)); container.setLayout(new GridLayout(3,false)); Label label = new Label(container,SWT.NULL); label.setText(getNameLabel()); textName = new Text(container,SWT.BORDER); textName.setLayoutData(new GridData(GridData.FILL_HORIZONTAL)); textName.setText(name); // fill GridLayout label = new Label(container,SWT.NONE); label = new Label(container,SWT.NULL); label.setText(HTMLPlugin.getResourceString("HTMLEditorPreferencePage.Dialog.LocalPath")); textPath = new Text(container,SWT.BORDER); textPath.setLayoutData(new GridData(GridData.FILL_HORIZONTAL)); textPath.setText(path); Button button = new Button(container,SWT.PUSH); button.setText("..."); button.addSelectionListener( new SelectionAdapter(){ @Override public void widgetSelected(SelectionEvent evt){ FileDialog openDialog = new FileDialog(getShell(),SWT.OPEN); openDialog.setFileName(textPath.getText()); String openFile = openDialog.open(); if(openFile!=null){ textPath.setText(openFile); } } }); add(textName); add(textPath); return container; } @Override protected void validate(){ if(textName.getText().equals("")){ setErrorMessage(HTMLPlugin.createMessage( HTMLPlugin.getResourceString("Error.Required"), new String[]{ getNameLabel() } )); return; } else if(textPath.getText().equals("")){ setErrorMessage(HTMLPlugin.createMessage( HTMLPlugin.getResourceString("Error.Required"), new String[]{ HTMLPlugin.getResourceString("HTMLEditorPreferencePage.LocalPath") } )); return; } setErrorMessage(null); } @Override protected void okPressed() { name = textName.getText(); path = textPath.getText(); super.okPressed(); } public String getName(){ return name; } public String getPath(){ return path; } } }