/* ****************************************************************************** * Copyright (c) 2006-2012 XMind Ltd. and others. * * This file is a part of XMind 3. XMind releases 3 and * above are dual-licensed under the Eclipse Public License (EPL), * which is available at http://www.eclipse.org/legal/epl-v10.html * and the GNU Lesser General Public License (LGPL), * which is available at http://www.gnu.org/licenses/lgpl.html * See http://www.xmind.net/license.html for details. * * Contributors: * XMind Ltd. - initial API and implementation *******************************************************************************/ package org.xmind.ui.internal.spelling; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import org.eclipse.core.runtime.IProgressMonitor; import org.eclipse.core.runtime.IStatus; import org.eclipse.core.runtime.Status; import org.eclipse.core.runtime.SubProgressMonitor; import org.eclipse.core.runtime.jobs.IJobChangeEvent; import org.eclipse.core.runtime.jobs.IJobChangeListener; import org.eclipse.core.runtime.jobs.Job; import org.eclipse.jface.action.Action; import org.eclipse.jface.action.IMenuListener; import org.eclipse.jface.action.IMenuManager; import org.eclipse.jface.action.MenuManager; import org.eclipse.jface.action.Separator; import org.eclipse.jface.dialogs.MessageDialog; import org.eclipse.jface.resource.ImageDescriptor; import org.eclipse.jface.viewers.DoubleClickEvent; import org.eclipse.jface.viewers.IDoubleClickListener; import org.eclipse.jface.viewers.ISelection; import org.eclipse.jface.viewers.IStructuredSelection; import org.eclipse.jface.viewers.ITableLabelProvider; import org.eclipse.jface.viewers.ITreeContentProvider; import org.eclipse.jface.viewers.LabelProvider; import org.eclipse.jface.viewers.TreeViewer; import org.eclipse.jface.viewers.Viewer; import org.eclipse.swt.SWT; import org.eclipse.swt.events.DisposeEvent; import org.eclipse.swt.events.DisposeListener; 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.Event; import org.eclipse.swt.widgets.Label; import org.eclipse.swt.widgets.Listener; import org.eclipse.swt.widgets.TreeColumn; import org.eclipse.ui.IEditorPart; import org.eclipse.ui.IEditorReference; import org.eclipse.ui.IPartListener; import org.eclipse.ui.IWorkbenchPart; import org.eclipse.ui.part.PageBook; import org.eclipse.ui.part.ViewPart; import org.xmind.ui.IWordContext; import org.xmind.ui.IWordContextProvider; import com.swabunga.spell.event.SpellCheckEvent; import com.swabunga.spell.event.SpellCheckListener; import com.swabunga.spell.event.SpellChecker; import com.swabunga.spell.event.StringWordTokenizer; /** * @author Frank Shaka */ @Deprecated public class SpellingCheckView extends ViewPart implements IJobChangeListener, IPartListener { private static class SpellingViewContent { private static final SpellingViewContent instance = new SpellingViewContent(); private SpellingCheckViewerInput input = null; private List<SpellingCheckView> views = new ArrayList<SpellingCheckView>(); private SpellingViewContent() { } public void addView(SpellingCheckView view) { this.views.add(view); } public void removeView(SpellingCheckView view) { this.views.remove(view); } public void setInput(SpellingCheckViewerInput input) { this.input = input; fireInputChanged(); } public SpellingCheckViewerInput getInput() { return this.input; } private void fireInputChanged() { for (Object view : views.toArray()) { ((SpellingCheckView) view).inputChanged(input); } } public void update(Object element) { for (Object view : views.toArray()) { ((SpellingCheckView) view).update(element); } } public static SpellingViewContent getInstance() { return instance; } } private static class SpellingCheckViewerInput { public List<WorkbookItem> elements = new ArrayList<WorkbookItem>(); } private static class WorkbookItem { public SpellingCheckViewerInput parent; public IEditorPart editor; public IWordContextProvider provider; public List<WordContextItem> children = new ArrayList<WordContextItem>(); /** * */ public WorkbookItem(SpellingCheckViewerInput parent, IEditorPart editor, IWordContextProvider provider) { this.parent = parent; this.editor = editor; this.provider = provider; } } private static class WordContextItem { public WorkbookItem parent; public IWordContext context; public List<WordItem> children = new ArrayList<WordItem>(); /** * */ public WordContextItem(WorkbookItem parent, IWordContext context) { this.parent = parent; this.context = context; } } private static class WordItem { public WordContextItem parent; public int start; public String invalidWord; public List suggestions; /** * */ public WordItem(WordContextItem parent, SpellCheckEvent range) { this.parent = parent; this.start = range.getWordContextPosition(); this.invalidWord = range.getInvalidWord(); this.suggestions = range.getSuggestions(); } public void reveal() { parent.context.revealWord(start, invalidWord.length()); } } private static class NoSpellingErrorItem { public WorkbookItem parent; public NoSpellingErrorItem(WorkbookItem parent) { this.parent = parent; } /* * (non-Javadoc) * @see java.lang.Object#equals(java.lang.Object) */ @Override public boolean equals(Object obj) { if (obj == null) return false; if (obj == this) return true; if (!(obj instanceof NoSpellingErrorItem)) return false; return ((NoSpellingErrorItem) obj).parent == this.parent; } } private static class SpellingCheckContentProvider implements ITreeContentProvider { /* * (non-Javadoc) * @see * org.eclipse.jface.viewers.ITreeContentProvider#getChildren(java.lang * .Object) */ public Object[] getChildren(Object parentElement) { if (parentElement instanceof WorkbookItem) { WorkbookItem item = (WorkbookItem) parentElement; if (item.children.isEmpty()) { return new Object[] { new NoSpellingErrorItem(item) }; } return item.children.toArray(); } else if (parentElement instanceof WordContextItem) { return ((WordContextItem) parentElement).children.toArray(); } return new Object[0]; } /* * (non-Javadoc) * @see * org.eclipse.jface.viewers.ITreeContentProvider#getParent(java.lang * .Object) */ public Object getParent(Object element) { if (element instanceof WordItem) { return ((WordItem) element).parent; } else if (element instanceof WordContextItem) { return ((WordContextItem) element).parent; } else if (element instanceof WorkbookItem) { return ((WorkbookItem) element).parent; } else if (element instanceof NoSpellingErrorItem) { return ((NoSpellingErrorItem) element).parent; } return null; } /* * (non-Javadoc) * @see * org.eclipse.jface.viewers.ITreeContentProvider#hasChildren(java.lang * .Object) */ public boolean hasChildren(Object element) { if (element instanceof WorkbookItem) { return true; } else if (element instanceof WordContextItem) { return !((WordContextItem) element).children.isEmpty(); } else if (element instanceof SpellingCheckViewerInput) { return !((SpellingCheckViewerInput) element).elements.isEmpty(); } return false; } /* * (non-Javadoc) * @see * org.eclipse.jface.viewers.IStructuredContentProvider#getElements( * java.lang.Object) */ public Object[] getElements(Object inputElement) { if (inputElement instanceof SpellingCheckViewerInput) { return ((SpellingCheckViewerInput) inputElement).elements .toArray(); } return new Object[0]; } /* * (non-Javadoc) * @see org.eclipse.jface.viewers.IContentProvider#dispose() */ public void dispose() { } /* * (non-Javadoc) * @see * org.eclipse.jface.viewers.IContentProvider#inputChanged(org.eclipse * .jface.viewers.Viewer, java.lang.Object, java.lang.Object) */ public void inputChanged(Viewer viewer, Object oldInput, Object newInput) { } } private static class SpellingCheckLabelProvider extends LabelProvider implements ITableLabelProvider { private Map<ImageDescriptor, Image> images = new HashMap<ImageDescriptor, Image>(); /* * (non-Javadoc) * @see * org.eclipse.jface.viewers.ITableLabelProvider#getColumnImage(java * .lang.Object, int) */ public Image getColumnImage(Object element, int columnIndex) { if (element instanceof WordContextItem) { if (columnIndex == 0) { return getImageFor( ((WordContextItem) element).context.getIcon()); } } else if (element instanceof WorkbookItem) { if (columnIndex == 0) { return ((WorkbookItem) element).editor.getTitleImage(); } } return null; } private Image getImageFor(ImageDescriptor icon) { if (icon == null) return null; Image image = images.get(icon); if (image == null) { image = icon.createImage(); images.put(icon, image); } return image; } /* * (non-Javadoc) * @see org.eclipse.jface.viewers.BaseLabelProvider#dispose() */ @Override public void dispose() { for (Image image : images.values()) { image.dispose(); } images.clear(); super.dispose(); } /* * (non-Javadoc) * @see * org.eclipse.jface.viewers.ITableLabelProvider#getColumnText(java. * lang.Object, int) */ public String getColumnText(Object element, int columnIndex) { if (element instanceof WordItem) { WordItem item = (WordItem) element; if (columnIndex == 0) { return item.invalidWord; } StringBuffer sb = new StringBuffer( item.suggestions.size() * 10); for (Object s : item.suggestions) { if (sb.length() > 0) { sb.append(", "); //$NON-NLS-1$ } sb.append(s.toString()); } return sb.toString(); } else if (element instanceof WordContextItem) { if (columnIndex == 0) { return ((WordContextItem) element).context.getName(); } } else if (element instanceof WorkbookItem) { if (columnIndex == 0) { return ((WorkbookItem) element).editor.getTitle(); } } else if (element instanceof NoSpellingErrorItem) { if (columnIndex == 0) { return Messages.SpellingCheckView_NoSpellingError_text; } } return ""; //$NON-NLS-1$ } } private static class WordDoubleClickListener implements IDoubleClickListener { /* * (non-Javadoc) * @see org.eclipse.jface.viewers.IDoubleClickListener#doubleClick(org. * eclipse .jface.viewers.DoubleClickEvent) */ public void doubleClick(DoubleClickEvent event) { if (event.getSelection() instanceof IStructuredSelection) { Object element = ((IStructuredSelection) event.getSelection()) .getFirstElement(); if (element instanceof WordItem) { ((WordItem) element).reveal(); } else if (element instanceof WordContextItem) { ((WordContextItem) element).context.reveal(); } else if (element instanceof WorkbookItem) { IEditorPart editor = ((WorkbookItem) element).editor; editor.getSite().getPage().activate(editor); } } } } private static class CheckSpellingJob extends Job implements SpellCheckListener { private static final CheckSpellingJob instance = new CheckSpellingJob(); private SpellingCheckViewerInput input = null; private SpellChecker spellChecker = null; private WordContextItem currentWordContextItem = null; /** */ private CheckSpellingJob() { super(Messages.CheckSpellingJob_name); } public void setInput(SpellingCheckViewerInput input) { this.input = input; } /** * @return the input */ public SpellingCheckViewerInput getInput() { return input; } /* * (non-Javadoc) * @seeorg.eclipse.core.runtime.jobs.Job#run(org.eclipse.core.runtime. * IProgressMonitor) */ @Override protected IStatus run(IProgressMonitor monitor) { spellChecker = null; SpellCheckerAgent.visitSpellChecker(new ISpellCheckerVisitor() { public void handleWith(SpellChecker theSpellChecker) { spellChecker = theSpellChecker; } }); while (spellChecker == null) { try { Thread.sleep(0); } catch (InterruptedException e) { return Status.CANCEL_STATUS; } } if (monitor.isCanceled()) return Status.CANCEL_STATUS; monitor.beginTask(Messages.CheckSpellingJob_task_Scanning, input.elements.size()); SpellChecker theSpellChecker = spellChecker; theSpellChecker.addSpellCheckListener(this); try { for (WorkbookItem item : input.elements) { if (monitor.isCanceled()) return Status.CANCEL_STATUS; monitor.subTask(item.editor.getTitle()); scan(new SubProgressMonitor(monitor, 1), item); if (monitor.isCanceled()) return Status.CANCEL_STATUS; monitor.worked(1); } } finally { theSpellChecker.removeSpellCheckListener(this); } monitor.done(); SpellingPlugin.getDefault().getUsageDataCollector() .increase("SpellingCheckCount"); //$NON-NLS-1$ return Status.OK_STATUS; } private void scan(IProgressMonitor monitor, WorkbookItem parent) { List<IWordContext> contexts = parent.provider.getWordContexts(); monitor.beginTask(null, contexts.size()); for (IWordContext context : contexts) { if (monitor.isCanceled()) return; WordContextItem item = new WordContextItem(parent, context); monitor.subTask(parent.editor.getTitle() + " - " //$NON-NLS-1$ + item.context.getName()); scan(new SubProgressMonitor(monitor, 1), item); if (monitor.isCanceled()) return; if (!item.children.isEmpty()) { parent.children.add(item); } monitor.worked(1); } monitor.done(); } private void scan(IProgressMonitor monitor, WordContextItem parent) { monitor.beginTask(null, 1); String content = parent.context.getContent(); if (monitor.isCanceled()) return; currentWordContextItem = parent; spellChecker.checkSpelling(new StringWordTokenizer(content)); if (monitor.isCanceled()) return; monitor.done(); } /* * (non-Javadoc) * @see com.swabunga.spell.event.SpellCheckListener#spellingError(com. * swabunga .spell.event.SpellCheckEvent) */ public void spellingError(SpellCheckEvent event) { currentWordContextItem.children .add(new WordItem(currentWordContextItem, event)); } public static CheckSpellingJob getInstance() { return instance; } public static void start(SpellingCheckViewerInput input) { instance.setInput(input); instance.schedule(); } public static boolean isRunning() { return instance.getState() == Job.RUNNING; } } private static class SuggestionMenu implements DisposeListener, IMenuListener { private TreeViewer viewer; private MenuManager menu; /** * */ public SuggestionMenu(TreeViewer viewer) { this.viewer = viewer; this.menu = new MenuManager(); this.menu.addMenuListener(this); this.menu.setRemoveAllWhenShown(true); viewer.getTree() .setMenu(this.menu.createContextMenu(viewer.getTree())); viewer.getTree().addDisposeListener(this); } /* * (non-Javadoc) * @see * org.eclipse.jface.action.IMenuListener#menuAboutToShow(org.eclipse * .jface.action.IMenuManager) */ public void menuAboutToShow(IMenuManager manager) { if (manager != this.menu) return; ISelection selection = this.viewer.getSelection(); if (selection instanceof IStructuredSelection) { Object o = ((IStructuredSelection) selection).getFirstElement(); if (o != null && o instanceof WordItem) { fillMenu(this.menu, (WordItem) o); } } } private void fillMenu(IMenuManager menu, WordItem item) { for (Object suggestion : item.suggestions) { menu.add(new ReplaceAction(item, suggestion.toString())); } menu.add(new Separator()); menu.add(new AddToDictionaryAction(item)); } /* * (non-Javadoc) * @see * org.eclipse.swt.events.DisposeListener#widgetDisposed(org.eclipse * .swt.events.DisposeEvent) */ public void widgetDisposed(DisposeEvent e) { this.menu.dispose(); } } private static class ReplaceAction extends Action { private WordItem item; private String suggestion; /** * */ public ReplaceAction(WordItem item, String suggestion) { this.item = item; this.suggestion = suggestion; setText(item.invalidWord + " -> " + suggestion); //$NON-NLS-1$ } /* * (non-Javadoc) * @see org.eclipse.jface.action.Action#run() */ @Override public void run() { if (item.parent.context.replaceWord(item.start, item.invalidWord.length(), suggestion)) { Object toUpdate = item.parent; item.parent.children.remove(item); if (item.parent.children.isEmpty()) { toUpdate = item.parent.parent; item.parent.parent.children.remove(item.parent); } else { int offset = suggestion.length() - item.invalidWord.length(); if (offset != 0) { for (WordItem sibling : item.parent.children) { if (sibling.start > item.start) { sibling.start += offset; } } } } SpellingViewContent.getInstance().update(toUpdate); } } } private static class AddToDictionaryAction extends Action { private WordItem item; /** * */ public AddToDictionaryAction(WordItem item) { this.item = item; setText(Messages.addToDictionary); } /* * (non-Javadoc) * @see org.eclipse.jface.action.Action#run() */ @Override public void run() { SpellCheckerAgent.visitSpellChecker(new ISpellCheckerVisitor() { public void handleWith(SpellChecker spellChecker) { spellChecker.addToDictionary(item.invalidWord); Object toUpdate = item.parent; item.parent.children.remove(item); if (item.parent.children.isEmpty()) { toUpdate = item.parent.parent; item.parent.parent.children.remove(item.parent); } SpellingViewContent.getInstance().update(toUpdate); } }); } } private Composite composite; private PageBook bannerBar; private Control buttonBar; private Control statusBar; private TreeViewer viewer; /* * (non-Javadoc) * @see org.eclipse.ui.part.WorkbenchPart#createPartControl(org.eclipse.swt. * widgets .Composite) */ @Override public void createPartControl(Composite parent) { composite = new Composite(parent, SWT.NONE); GridLayout layout = new GridLayout(1, true); layout.marginHeight = 0; layout.marginWidth = 0; layout.verticalSpacing = 0; layout.horizontalSpacing = 0; composite.setLayout(layout); createBannerBar(composite); createResultViewer(composite); if (SpellingViewContent.getInstance().getInput() != null) { viewer.setInput(SpellingViewContent.getInstance().getInput()); } SpellingViewContent.getInstance().addView(this); if (CheckSpellingJob.isRunning()) { showScanning(); } else { showButtons(); } CheckSpellingJob.getInstance().addJobChangeListener(this); getSite().getPage().addPartListener(this); } private void createBannerBar(Composite parent) { bannerBar = new PageBook(parent, SWT.NONE); bannerBar.setLayoutData(new GridData(SWT.FILL, SWT.TOP, true, false)); createButtonBar(bannerBar); createStatusBar(bannerBar); } private void createButtonBar(Composite parent) { Composite buttonBar = new Composite(parent, SWT.NONE); this.buttonBar = buttonBar; GridLayout layout = new GridLayout(2, false); layout.marginHeight = 3; layout.marginWidth = 3; layout.verticalSpacing = 0; layout.horizontalSpacing = 5; buttonBar.setLayout(layout); Button scanAllButton = new Button(buttonBar, SWT.PUSH); scanAllButton .setText(Messages.SpellingCheckView_button_ScanAllWorkbooks); scanAllButton.setLayoutData( new GridData(SWT.LEFT, SWT.CENTER, false, false)); scanAllButton.addListener(SWT.Selection, new Listener() { public void handleEvent(Event event) { scanAll(); } }); Button scanButton = new Button(buttonBar, SWT.PUSH); scanButton.setText(Messages.SpellingCheckView_button_ScanWorkbook); scanButton.setLayoutData( new GridData(SWT.LEFT, SWT.CENTER, false, false)); scanButton.addListener(SWT.Selection, new Listener() { public void handleEvent(Event event) { scanWorkbook(); } }); } private void createStatusBar(Composite parent) { Composite statusBar = new Composite(parent, SWT.NONE); this.statusBar = statusBar; GridLayout layout = new GridLayout(1, true); layout.marginWidth = 3; layout.marginHeight = 3; layout.verticalSpacing = 0; layout.horizontalSpacing = 0; statusBar.setLayout(layout); Label label = new Label(statusBar, SWT.CENTER); label.setText(Messages.SpellingCheckView_Scanning); label.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, true)); } private void createResultViewer(Composite parent) { viewer = new TreeViewer(parent, SWT.FULL_SELECTION | SWT.SINGLE | SWT.BORDER); viewer.getTree() .setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true)); viewer.getTree().setLinesVisible(true); viewer.getTree().setHeaderVisible(true); TreeColumn col1 = new TreeColumn(viewer.getTree(), SWT.NONE); col1.setText(Messages.SpellingCheckView_column_Word); col1.setWidth(150); TreeColumn col2 = new TreeColumn(viewer.getTree(), SWT.NONE); col2.setText(Messages.SpellingCheckView_column_Suggestions); col2.setWidth(220); viewer.setContentProvider(new SpellingCheckContentProvider()); viewer.setLabelProvider(new SpellingCheckLabelProvider()); viewer.addDoubleClickListener(new WordDoubleClickListener()); viewer.setAutoExpandLevel(TreeViewer.ALL_LEVELS); new SuggestionMenu(viewer); } private void showScanning() { bannerBar.showPage(statusBar); } private void showButtons() { bannerBar.showPage(buttonBar); } public void scanAll() { IEditorReference[] ers = getSite().getPage().getEditorReferences(); if (ers.length == 0) { MessageDialog.openInformation(getSite().getShell(), Messages.SpellingCheckView_dialogTitle, Messages.SpellingCheckView_NoEditors_message); return; } SpellingCheckViewerInput input = new SpellingCheckViewerInput(); for (IEditorReference er : ers) { IEditorPart editor = er.getEditor(false); if (editor != null) { IWordContextProvider provider = (IWordContextProvider) editor .getAdapter(IWordContextProvider.class); if (provider != null) { input.elements .add(new WorkbookItem(input, editor, provider)); } } } if (input.elements.isEmpty()) { MessageDialog.openInformation(getSite().getShell(), Messages.SpellingCheckView_dialogTitle, Messages.SpellingCheckView_NoProviders_message); } else { CheckSpellingJob.start(input); } } public void scanWorkbook() { IEditorPart editor = getSite().getPage().getActiveEditor(); if (editor == null) { MessageDialog.openInformation(getSite().getShell(), Messages.SpellingCheckView_dialogTitle, Messages.SpellingCheckView_NoEditors_message); return; } IWordContextProvider provider = (IWordContextProvider) editor .getAdapter(IWordContextProvider.class); if (provider == null) { MessageDialog.openInformation(getSite().getShell(), Messages.SpellingCheckView_dialogTitle, Messages.SpellingCheckView_NoProviders_message); } else { SpellingCheckViewerInput input = new SpellingCheckViewerInput(); input.elements.add(new WorkbookItem(input, editor, provider)); CheckSpellingJob.start(input); } } /* * (non-Javadoc) * @see org.eclipse.ui.part.WorkbenchPart#setFocus() */ @Override public void setFocus() { viewer.getTree().setFocus(); } /* * (non-Javadoc) * @see org.eclipse.ui.part.WorkbenchPart#dispose() */ @Override public void dispose() { getSite().getPage().removePartListener(this); SpellingViewContent.getInstance().removeView(this); CheckSpellingJob.getInstance().removeJobChangeListener(this); super.dispose(); } /* * (non-Javadoc) * @see * org.eclipse.core.runtime.jobs.IJobChangeListener#aboutToRun(org.eclipse * .core.runtime.jobs.IJobChangeEvent) */ public void aboutToRun(IJobChangeEvent event) { getSite().getShell().getDisplay().asyncExec(new Runnable() { public void run() { showScanning(); } }); } /* * (non-Javadoc) * @see * org.eclipse.core.runtime.jobs.IJobChangeListener#awake(org.eclipse.core * .runtime.jobs.IJobChangeEvent) */ public void awake(IJobChangeEvent event) { } /* * (non-Javadoc) * @see * org.eclipse.core.runtime.jobs.IJobChangeListener#done(org.eclipse.core * .runtime.jobs.IJobChangeEvent) */ public void done(final IJobChangeEvent event) { getSite().getShell().getDisplay().asyncExec(new Runnable() { public void run() { showButtons(); if (event.getResult().isOK()) { SpellingViewContent.getInstance().setInput( ((CheckSpellingJob) event.getJob()).getInput()); } } }); } /* * (non-Javadoc) * @see * org.eclipse.core.runtime.jobs.IJobChangeListener#running(org.eclipse. * core.runtime.jobs.IJobChangeEvent) */ public void running(IJobChangeEvent event) { } /* * (non-Javadoc) * @see * org.eclipse.core.runtime.jobs.IJobChangeListener#scheduled(org.eclipse * .core.runtime.jobs.IJobChangeEvent) */ public void scheduled(IJobChangeEvent event) { } /* * (non-Javadoc) * @see * org.eclipse.core.runtime.jobs.IJobChangeListener#sleeping(org.eclipse * .core.runtime.jobs.IJobChangeEvent) */ public void sleeping(IJobChangeEvent event) { } public void inputChanged(SpellingCheckViewerInput input) { this.viewer.setInput(input); } public void update(Object element) { this.viewer.refresh(element); } /* * (non-Javadoc) * @see * org.eclipse.ui.IPartListener#partActivated(org.eclipse.ui.IWorkbenchPart) */ public void partActivated(IWorkbenchPart part) { } /* * (non-Javadoc) * @see org.eclipse.ui.IPartListener#partBroughtToTop(org.eclipse.ui. * IWorkbenchPart ) */ public void partBroughtToTop(IWorkbenchPart part) { } /* * (non-Javadoc) * @see * org.eclipse.ui.IPartListener#partClosed(org.eclipse.ui.IWorkbenchPart) */ public void partClosed(IWorkbenchPart part) { SpellingCheckViewerInput input = SpellingViewContent.getInstance() .getInput(); if (input != null) { Object[] workbookItems = input.elements.toArray(); for (Object workbookItem : workbookItems) { WorkbookItem item = (WorkbookItem) workbookItem; if (item.editor == part) { input.elements.remove(item); SpellingViewContent.getInstance().update(input); } } } } /* * (non-Javadoc) * @see org.eclipse.ui.IPartListener#partDeactivated(org.eclipse.ui. * IWorkbenchPart ) */ public void partDeactivated(IWorkbenchPart part) { } /* * (non-Javadoc) * @see * org.eclipse.ui.IPartListener#partOpened(org.eclipse.ui.IWorkbenchPart) */ public void partOpened(IWorkbenchPart part) { } }