/* * ----------------------------------------------------------------------- * File: $HeadURL: http://keith-laptop/svn/krs/LanguageTest/trunk/org.thanlwinsoft.languagetest/src/org/thanlwinsoft/languagetest/eclipse/search/TestItemSearchViewPage.java $ * Revision $LastChangedRevision: 1387 $ * Last Modified: $LastChangedDate: 2009-01-30 22:15:16 +0700 (Fri, 30 Jan 2009) $ * Last Change by: $LastChangedBy: keith $ * ----------------------------------------------------------------------- * Copyright (C) 2007 Keith Stribley <devel@thanlwinsoft.org> * * This library 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.1 of the License, or (at your option) any later version. * * This library 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 * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, * MA 02110-1301 USA * ----------------------------------------------------------------------- */ package org.thanlwinsoft.languagetest.eclipse.search; import java.util.Collection; import java.util.Iterator; import java.util.Vector; import org.eclipse.core.resources.IFile; import org.eclipse.jface.resource.JFaceResources; import org.eclipse.jface.text.IRegion; import org.eclipse.jface.text.Region; import org.eclipse.jface.viewers.IFontProvider; import org.eclipse.jface.viewers.ISelection; import org.eclipse.jface.viewers.IStructuredContentProvider; import org.eclipse.jface.viewers.IStructuredSelection; import org.eclipse.jface.viewers.ITableFontProvider; import org.eclipse.jface.viewers.ITableLabelProvider; import org.eclipse.jface.viewers.ITreeContentProvider; import org.eclipse.jface.viewers.LabelProvider; import org.eclipse.jface.viewers.TableViewer; import org.eclipse.jface.viewers.TreeViewer; import org.eclipse.jface.viewers.Viewer; import org.eclipse.search.ui.ISearchResult; import org.eclipse.search.ui.ISearchResultListener; import org.eclipse.search.ui.SearchResultEvent; import org.eclipse.search.ui.text.AbstractTextSearchViewPage; import org.eclipse.search.ui.text.Match; import org.eclipse.swt.SWT; import org.eclipse.swt.graphics.Font; import org.eclipse.swt.graphics.FontData; import org.eclipse.swt.graphics.Image; import org.eclipse.swt.widgets.TableColumn; import org.eclipse.ui.IEditorPart; import org.eclipse.ui.IFileEditorInput; import org.eclipse.ui.IMemento; import org.eclipse.ui.IWorkbenchPage; import org.eclipse.ui.PartInitException; import org.eclipse.ui.PlatformUI; import org.eclipse.ui.part.FileEditorInput; import org.thanlwinsoft.languagetest.MessageUtil; import org.thanlwinsoft.languagetest.eclipse.LanguageTestPlugin; import org.thanlwinsoft.languagetest.eclipse.editors.ColumnListener; import org.thanlwinsoft.languagetest.eclipse.editors.TestItemEditor; import org.thanlwinsoft.languagetest.eclipse.editors.TestItemSorter; import org.thanlwinsoft.languagetest.eclipse.editors.TestModuleEditor; import org.thanlwinsoft.languagetest.language.test.UniversalLanguage; import org.thanlwinsoft.schemas.languagetest.module.LangEntryType; import org.thanlwinsoft.schemas.languagetest.module.TestItemType; /** * @author keith * */ public class TestItemSearchViewPage extends AbstractTextSearchViewPage { private IStructuredContentProvider provider; private TreeViewer treeViewer = null; private TableViewer tableViewer = null; private TestItemSearchResult result = null; private String [] colLangId = null; public final static String ROW_FONT_PREF = TestItemEditor.ROW_FONT_PREF; public final static String TABLE_FONT_PREF = TestItemEditor.TABLE_FONT_PREF; private static int ROW_FONT_SIZE = 12; private static int TABLE_FONT_SIZE = 14; TestItemSorter sorter = new TestItemSorter(); public TestItemSearchViewPage() { LanguageTestPlugin.getPrefStore().setDefault(TABLE_FONT_PREF, TABLE_FONT_SIZE); LanguageTestPlugin.getPrefStore().setDefault(ROW_FONT_PREF, ROW_FONT_SIZE); TABLE_FONT_SIZE = LanguageTestPlugin.getPrefStore().getInt(TABLE_FONT_PREF); ROW_FONT_SIZE = LanguageTestPlugin.getPrefStore().getInt(ROW_FONT_PREF); } /* (non-Javadoc) * @see org.eclipse.search.ui.text.AbstractTextSearchViewPage#clear() */ protected void clear() { // result = null; // provider = null; // tableViewer = null; // treeViewer = null; } /* (non-Javadoc) * @see org.eclipse.search.ui.text.AbstractTextSearchViewPage#configureTableViewer(org.eclipse.jface.viewers.TableViewer) */ protected void configureTableViewer(TableViewer viewer) { if (viewer.getTable().isDisposed()) return; //System.out.println(this + "ConfigureTableViewer " + viewer); if (viewer.getContentProvider() == null) { provider = new TableContentProvider(); viewer.setContentProvider(provider); viewer.setLabelProvider(new TestItemTableLabelProvider()); viewer.getTable().setHeaderVisible(true); FontData fd = JFaceResources.getDialogFont().getFontData()[0]; // deliberately up the size because if the font size is too small // bigger table cell fonts are truncated FontData fdBig = new FontData(fd.getName(), TABLE_FONT_SIZE, fd.getStyle()); Font font = LanguageTestPlugin.getFont(fdBig); viewer.getTable().setFont(font); } this.tableViewer = viewer; if (result != null) { // for some reason this needs to be async to get anything displayed updateTableViewerInputs(true); } } /* (non-Javadoc) * @see org.eclipse.search.ui.text.AbstractTextSearchViewPage#configureTreeViewer(org.eclipse.jface.viewers.TreeViewer) */ protected void configureTreeViewer(TreeViewer viewer) { //System.out.println(this + "ConfigureTreeViewer " + viewer); this.treeViewer = viewer; if (viewer.getTree().isDisposed()) return; if (viewer.getContentProvider() == null) { viewer.setContentProvider(new TestItemSearchTreeProvider()); viewer.setLabelProvider(new TestItemTableLabelProvider()); } if (result != null) { // for some reason this needs to be async to get anything displayed updateTreeViewerInputs(true); } } /* (non-Javadoc) * @see org.eclipse.search.ui.text.AbstractTextSearchViewPage#getCurrentMatch() */ public Match getCurrentMatch() { ISelection s = null; if (tableViewer != null) { s = tableViewer.getSelection(); } if (s == null && treeViewer != null) { s = treeViewer.getSelection(); } if (s != null && s instanceof IStructuredSelection) { IStructuredSelection ss = (IStructuredSelection)s; Object o = ss.getFirstElement(); if (o instanceof Match) return (Match)o; } return null; } /* (non-Javadoc) * @see org.eclipse.search.ui.text.AbstractTextSearchViewPage#getCurrentMatchLocation(org.eclipse.search.ui.text.Match) */ public IRegion getCurrentMatchLocation(Match match) { return new Region(match.getOffset(), match.getLength()); } /* (non-Javadoc) * @see org.eclipse.search.ui.text.AbstractTextSearchViewPage#elementsChanged(java.lang.Object[]) */ protected void elementsChanged(Object[] objects) { if (result != null) { updateTreeViewerInputs(true); updateTableViewerInputs(true); } } public class TestItemSearchTreeProvider implements ITreeContentProvider { /* (non-Javadoc) * @see org.eclipse.jface.viewers.ITreeContentProvider#getChildren(java.lang.Object) */ public Object[] getChildren(Object parentElement) { if (parentElement instanceof IFile) { return result.getMatches(parentElement); } return null; } /* (non-Javadoc) * @see org.eclipse.jface.viewers.ITreeContentProvider#getParent(java.lang.Object) */ public Object getParent(Object element) { if (element instanceof Match) { return ((Match)element).getElement(); } return null; } /* (non-Javadoc) * @see org.eclipse.jface.viewers.ITreeContentProvider#hasChildren(java.lang.Object) */ public boolean hasChildren(Object element) { if (result != null && element instanceof IFile) { return (result.getMatches(element).length > 0); } return false; } /* (non-Javadoc) * @see org.eclipse.jface.viewers.IStructuredContentProvider#getElements(java.lang.Object) */ public Object[] getElements(Object inputElement) { if (inputElement instanceof Object[]) { return (Object[])inputElement; } return null; } /* (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) { //viewer.setInput(newInput); } } /* (non-Javadoc) * @see org.eclipse.search.ui.text.AbstractTextSearchViewPage#restoreState(org.eclipse.ui.IMemento) */ public void restoreState(IMemento memento) { super.restoreState(memento); } /* (non-Javadoc) * @see org.eclipse.search.ui.text.AbstractTextSearchViewPage#saveState(org.eclipse.ui.IMemento) */ public void saveState(IMemento memento) { super.saveState(memento); } /* (non-Javadoc) * @see org.eclipse.search.ui.text.AbstractTextSearchViewPage#getLabel() */ public String getLabel() { if (result != null) { result.getLabel(); } return super.getLabel(); } private void updateTableViewerInputs(boolean async) { Runnable runnable = new Runnable() { public void run() { //System.out.println("updateTableViewer" + result.getMatchCount()); if (tableViewer != null && !tableViewer.getTable().isDisposed()) { if (tableViewer.getTable().getColumnCount() == 0) { int width = 200; if (getControl() != null) { // allow room for a scroll bar int totalWidth = getControl().getSize().x - 25; width = (int)Math.floor((float)totalWidth / (float)(result.getLanguageCount() + 1)); } Iterator<String> i = result.getLanguages().iterator(); colLangId = new String[result.getLanguageCount()]; int c = 0; //Font font = JFaceResources.getTextFont(); while (i.hasNext()) { TableColumn tc = new TableColumn(tableViewer.getTable(), SWT.LEFT); tc.setResizable(true); UniversalLanguage lang = new UniversalLanguage(i.next().toString()); tc.setText(lang.getDescription()); tc.setToolTipText(lang.getDescription()); //tc.setText(MessageUtil.getString("Matches")); //tc.setToolTipText(MessageUtil.getString("Matches")); tc.setWidth(width); tc.addSelectionListener(new ColumnListener(tableViewer, sorter, c, lang.getCode(), lang.getICUlocaleID())); colLangId[c++] = lang.getCode(); } TableColumn tc = new TableColumn(tableViewer.getTable(), SWT.LEFT); tc.setResizable(true); tc.setText(MessageUtil.getString("FileColName")); tc.setToolTipText(MessageUtil.getString("FileColName")); tc.setWidth(width); tc.addSelectionListener(new ColumnListener(tableViewer, sorter, c, "File", null)); } Object [] files = result.getElements(); Vector<Match> v = new Vector<Match>(files.length); for (int i = 0; i < files.length; i++) { Match [] matches = result.getMatches(files[i]); for (int j = 0; j < matches.length; j++) { v.add(matches[j]); } } tableViewer.setInput(v); tableViewer.refresh(true); tableViewer.getTable().redraw(); tableViewer.getTable().setToolTipText(result.getLabel()); //System.out.println("updatedTableViewer" + tableViewer.getTable().getItemCount() + tableViewer); } //else System.out.println("no table viewer update"); } }; if (async) this.getControl().getDisplay().asyncExec(runnable); else { runnable.run(); } } private void updateTreeViewerInputs(boolean async) { Runnable runnable = new Runnable() { public void run() { //System.out.println("updateTreeViewer" + result.getMatchCount()); if (treeViewer != null && !treeViewer.getTree().isDisposed()) { treeViewer.setInput(result.getElements()); treeViewer.refresh(); treeViewer.getTree().redraw(); treeViewer.getTree().setToolTipText(result.getLabel()); } //else System.out.println("no tree viewer update"); } }; if (async) this.getControl().getDisplay().asyncExec(runnable); else { runnable.run(); } } /* (non-Javadoc) * @see org.eclipse.search.ui.text.AbstractTextSearchViewPage#handleSearchResultChanged(org.eclipse.search.ui.SearchResultEvent) */ protected void handleSearchResultChanged(SearchResultEvent e) { if (e.getSource() instanceof TestItemSearchResult) { result = (TestItemSearchResult)e.getSource(); //System.out.println("handleSearchResult " + result); } if (result != null) { updateTreeViewerInputs(true); updateTableViewerInputs(true); } super.handleSearchResultChanged(e); } /* (non-Javadoc) * @see org.eclipse.search.ui.text.AbstractTextSearchViewPage#setInput(org.eclipse.search.ui.ISearchResult, java.lang.Object) */ public void setInput(ISearchResult newSearch, Object viewState) { if (newSearch instanceof TestItemSearchResult) { result = (TestItemSearchResult)newSearch; //System.out.println("setInput" + newSearch); result.addListener(new ISearchResultListener() { public void searchResultChanged(SearchResultEvent e) { handleSearchResultChanged(e); } }); updateTreeViewerInputs(false); updateTableViewerInputs(false); } } /* (non-Javadoc) * @see org.eclipse.search.ui.text.AbstractTextSearchViewPage#showMatch(org.eclipse.search.ui.text.Match, int, int, boolean) */ protected void showMatch(Match match, int currentOffset, int currentLength, boolean activate) throws PartInitException { IWorkbenchPage page = PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage(); IFileEditorInput input = new FileEditorInput((IFile)match.getElement()); IEditorPart part = page.openEditor(input, "org.thanlwinsoft.languagetest.eclipse.editors.TestModuleEditor"); if (part instanceof TestModuleEditor) { TestModuleEditor editor = (TestModuleEditor)part; editor.setActivePage(TestModuleEditor.TEST_ITEM_PAGE_INDEX); editor.selectTestItem(((TestItemMatch)match).getTestItemIndex()); } } public class TableContentProvider implements IStructuredContentProvider { /* (non-Javadoc) * @see org.eclipse.jface.viewers.IStructuredContentProvider#getElements(java.lang.Object) */ public Object[] getElements(Object inputElement) { if (inputElement instanceof Collection<?>) { return ((Collection<?>)inputElement).toArray(); } return null; } /* (non-Javadoc) * @see org.eclipse.jface.viewers.IContentProvider#dispose() */ public void dispose() { // TODO Auto-generated method stub } /* (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) { // TODO Auto-generated method stub } } public class TestItemTableLabelProvider extends LabelProvider implements ITableLabelProvider, IFontProvider, ITableFontProvider { private Image image = null; //private HashMap<String,FontData> fontMap = new HashMap<String,FontData>(); public TestItemTableLabelProvider() { image = LanguageTestPlugin.getImageDescriptor("icons/module.png").createImage(); } /* (non-Javadoc) * @see org.eclipse.jface.viewers.ITableLabelProvider#getColumnImage(java.lang.Object, int) */ public Image getColumnImage(Object element, int columnIndex) { if (element instanceof TestItemMatch && columnIndex == result.getLanguageCount()) { return image; } return null; } /* (non-Javadoc) * @see org.eclipse.jface.viewers.ITableLabelProvider#getColumnText(java.lang.Object, int) */ public String getColumnText(Object element, int columnIndex) { if (element instanceof TestItemMatch) { TestItemMatch match = (TestItemMatch)element; if (result == null || columnIndex == result.getLanguageCount()) { if (match.getElement() instanceof IFile) { IFile f = (IFile)match.getElement(); return f.getName(); } return ""; } if (colLangId == null || columnIndex > colLangId.length) return match.toString(); String langCode = colLangId[columnIndex]; // last column is the filename if (columnIndex == colLangId.length) return ((IFile)match.getElement()).getName(); TestItemType ti = match.getTestItem(); for (int i = 0; i < ti.sizeOfNativeLangArray(); i++) { LangEntryType entry = ti.getNativeLangArray(i); if (entry.getLang().equals(langCode)) { return entry.getStringValue(); } } for (int i = 0; i < ti.sizeOfForeignLangArray(); i++) { LangEntryType entry = ti.getForeignLangArray(i); if (entry.getLang().equals(langCode)) { return entry.getStringValue(); } } } return ""; } /* (non-Javadoc) * @see org.eclipse.jface.viewers.IBaseLabelProvider#dispose() */ public void dispose() { image.dispose(); } /* (non-Javadoc) * @see org.eclipse.jface.viewers.IFontProvider#getFont(java.lang.Object) */ public Font getFont(Object element) { if (element instanceof TestItemMatch) { TestItemMatch m = (TestItemMatch)element; FontData fd = m.getFontData(); fd.setHeight(ROW_FONT_SIZE); return getFontFromData(fd); } return JFaceResources.getTextFont(); } private Font getFontFromData(FontData fd) { return LanguageTestPlugin.getFont(fd); } /* (non-Javadoc) * @see org.eclipse.jface.viewers.ITableFontProvider#getFont(java.lang.Object, int) */ public Font getFont(Object element, int columnIndex) { if (element instanceof TestItemMatch && colLangId != null && columnIndex < colLangId.length) { TestItemMatch m = (TestItemMatch)element; FontData fd = (FontData)m.getFontMap().get(colLangId[columnIndex]); if (fd != null) { fd.setHeight(ROW_FONT_SIZE); return getFontFromData(fd); } } return JFaceResources.getDialogFont(); } } }