package tk.eclipse.plugin.htmleditor.tasktag; import java.util.ArrayList; import java.util.List; import org.eclipse.core.resources.IProject; import org.eclipse.core.resources.IWorkspaceRoot; import org.eclipse.core.resources.ResourcesPlugin; 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.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.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.Table; import org.eclipse.swt.widgets.TableColumn; 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.htmleditor.HTMLPlugin; import tk.eclipse.plugin.htmleditor.HTMLProjectBuilder; import tk.eclipse.plugin.htmleditor.HTMLProjectNature; /** * The preference page to add / edit / remove TaskTags. * * @author Naoki Takezoe * @see tk.eclipse.plugin.htmleditor.tasktag.ITaskTagDetector * @see tk.eclipse.plugin.htmleditor.tasktag.TaskTag * @see tk.eclipse.plugin.htmleditor.HTMLProjectBuilder */ public class HTMLTaskTagPreferencePage extends PreferencePage implements IWorkbenchPreferencePage { private TableViewer _viewer; private List<TaskTag> _model = new ArrayList<TaskTag>(); private List<TaskTag> _oldModel = new ArrayList<TaskTag>(); public HTMLTaskTagPreferencePage(){ setPreferenceStore(HTMLPlugin.getDefault().getPreferenceStore()); setTitle(HTMLPlugin.getResourceString("HTMLEditorPreferencePage.TaskTag")); } @Override protected Control createContents(Composite parent) { TableViewerSupport support = new TableViewerSupport(_model, parent){ @Override protected void initTableViewer(TableViewer viewer) { Table table = viewer.getTable(); TableColumn col1 = new TableColumn(table,SWT.LEFT); col1.setText(HTMLPlugin.getResourceString("HTMLEditorPreferencePage.Tag")); col1.setWidth(100); TableColumn col2 = new TableColumn(table,SWT.LEFT); col2.setText(HTMLPlugin.getResourceString("HTMLEditorPreferencePage.Priority")); col2.setWidth(100); } @Override protected Object doAdd() { TaskTagDialog dialog = new TaskTagDialog(getShell()); if(dialog.open()==Dialog.OK){ return dialog.getTaskTag(); } return null; } @Override protected void doEdit(Object obj) { TaskTag element = (TaskTag)obj; TaskTagDialog dialog = new TaskTagDialog(getShell(), element); if(dialog.open()==Dialog.OK){ TaskTag newElement = dialog.getTaskTag(); element.setTag(newElement.getTag()); element.setPriority(newElement.getPriority()); } } @Override protected ITableLabelProvider createLabelProvider() { return new ITableLabelProvider(){ public Image getColumnImage(Object element, int columnIndex){ return null; } public String getColumnText(Object element, int columnIndex){ switch(columnIndex){ case 0: return ((TaskTag)element).getTag(); case 1: return ((TaskTag)element).getPriorityName(); default: 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) { } }; } }; _viewer = support.getTableViewer(); _model.addAll(TaskTag.loadFromPreference(false)); syncModels(); _viewer.refresh(); return support.getControl(); } @Override protected void performDefaults() { _model.clear(); _model.addAll(TaskTag.loadFromPreference(true)); _viewer.refresh(); processChange(); } @Override public boolean performOk() { TaskTag.saveToPreference(_model); processChange(); return true; } private void syncModels(){ try { _oldModel.clear(); for(int i=0;i<_model.size();i++){ _oldModel.add(_model.get(i).clone()); } } catch(Exception ex){ HTMLPlugin.logException(ex); } } public void init(IWorkbench workbench) { } private void processChange(){ if(TaskTag.hasChange(_oldModel, _model)){ syncModels(); try { IWorkspaceRoot root = ResourcesPlugin.getWorkspace().getRoot(); IProject[] projects = root.getProjects(); for(int i=0;i<projects.length;i++){ if(projects[i].hasNature(HTMLProjectNature.HTML_NATURE_ID)){ HTMLProjectBuilder.doBuild(projects[i]); } } } catch(Exception ex){ HTMLPlugin.logException(ex); } } } /** * The dialog to add / edit TaskTags. */ private class TaskTagDialog extends Dialog { private Text textTag; private Combo comboPriority; private TaskTag element; public TaskTagDialog(Shell parentShell) { super(parentShell); setShellStyle(getShellStyle()|SWT.RESIZE); } public TaskTagDialog(Shell parentShell, TaskTag element) { super(parentShell); this.element = element; } @Override protected Point getInitialSize() { Point size = super.getInitialSize(); size.x = 300; return size; } @Override protected Control createDialogArea(Composite parent) { getShell().setText(HTMLPlugin.getResourceString("HTMLEditorPreferencePage.TaskTag")); 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(HTMLPlugin.getResourceString("HTMLEditorPreferencePage.Dialog.Tag")); textTag = new Text(composite, SWT.BORDER); if(element!=null){ textTag.setText(element.getTag()); } textTag.setLayoutData(new GridData(GridData.FILL_HORIZONTAL)); label = new Label(composite, SWT.NULL); label.setText(HTMLPlugin.getResourceString("HTMLEditorPreferencePage.Dialog.Priority")); comboPriority = new Combo(composite, SWT.READ_ONLY); comboPriority.setLayoutData(new GridData(GridData.FILL_HORIZONTAL)); for(int i=0; i<TaskTag.PRIORITIES.length; i++){ comboPriority.add(TaskTag.PRIORITIES[i]); } if(element!=null){ comboPriority.setText(element.getPriorityName()); } else { comboPriority.setText(TaskTag.NORMAL); } return composite; } @Override protected void okPressed() { if(textTag.getText().length()==0){ HTMLPlugin.openAlertDialog(HTMLPlugin.createMessage( HTMLPlugin.getResourceString("Error.Required"), new String[]{ HTMLPlugin.getResourceString("HTMLEditorPreferencePage.Tag") })); return; } element = new TaskTag(textTag.getText(), TaskTag.convertPriority(comboPriority.getText())); super.okPressed(); } public TaskTag getTaskTag(){ return element; } } }