/*
* -----------------------------------------------------------------------
* File: $HeadURL: http://keith-laptop/svn/krs/LanguageTest/trunk/org.thanlwinsoft.languagetest/src/org/thanlwinsoft/languagetest/eclipse/views/TestView.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.views;
import java.io.File;
import java.text.DecimalFormat;
import java.text.NumberFormat;
import java.util.Date;
import java.util.HashSet;
import java.util.Iterator;
import org.eclipse.core.resources.IContainer;
import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.IFolder;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.resources.IWorkspace;
import org.eclipse.core.resources.ResourcesPlugin;
import org.eclipse.core.runtime.IPath;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.Path;
import org.eclipse.jface.action.Action;
import org.eclipse.jface.dialogs.MessageDialog;
import org.eclipse.jface.text.Document;
import org.eclipse.jface.text.TextViewer;
import org.eclipse.jface.viewers.ISelectionChangedListener;
import org.eclipse.jface.viewers.ISelectionProvider;
import org.eclipse.jface.viewers.SelectionChangedEvent;
import org.eclipse.jface.viewers.StructuredSelection;
import org.eclipse.jface.viewers.TableViewer;
import org.eclipse.swt.SWT;
import org.eclipse.swt.SWTException;
import org.eclipse.swt.custom.SashForm;
import org.eclipse.swt.custom.StyledTextContent;
import org.eclipse.swt.events.ControlEvent;
import org.eclipse.swt.events.ControlListener;
import org.eclipse.swt.graphics.Font;
import org.eclipse.swt.graphics.FontData;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.graphics.ImageData;
import org.eclipse.swt.graphics.ImageLoader;
import org.eclipse.swt.graphics.Rectangle;
import org.eclipse.swt.graphics.TextLayout;
import org.eclipse.swt.layout.FillLayout;
import org.eclipse.swt.layout.FormAttachment;
import org.eclipse.swt.layout.FormData;
import org.eclipse.swt.layout.FormLayout;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Group;
import org.eclipse.swt.widgets.Label;
import org.eclipse.ui.IEditorPart;
import org.eclipse.ui.IPerspectiveDescriptor;
import org.eclipse.ui.IViewReference;
import org.eclipse.ui.IWorkbenchPage;
import org.eclipse.ui.IWorkbenchWindow;
import org.eclipse.ui.PartInitException;
import org.eclipse.ui.PlatformUI;
import org.eclipse.ui.actions.ActionFactory;
import org.eclipse.ui.part.FileEditorInput;
import org.eclipse.ui.part.ViewPart;
import org.thanlwinsoft.eclipse.widgets.SoundPlayer;
import org.thanlwinsoft.languagetest.MessageUtil;
import org.thanlwinsoft.languagetest.eclipse.LanguageTestPlugin;
import org.thanlwinsoft.languagetest.eclipse.EditPerspective;
import org.thanlwinsoft.languagetest.eclipse.editors.TestItemEditor;
import org.thanlwinsoft.languagetest.eclipse.editors.TestModuleEditor;
import org.thanlwinsoft.languagetest.language.test.Test;
import org.thanlwinsoft.languagetest.language.test.TestHistory;
import org.thanlwinsoft.languagetest.language.test.TestHistoryStorageException;
import org.thanlwinsoft.languagetest.language.test.TestItem;
import org.thanlwinsoft.languagetest.language.test.TestManager;
import org.thanlwinsoft.languagetest.language.test.TestType;
import org.thanlwinsoft.languagetest.language.test.UniversalLanguage;
import org.thanlwinsoft.schemas.languagetest.module.ForeignLangType;
import org.thanlwinsoft.schemas.languagetest.module.LangType;
import org.thanlwinsoft.schemas.languagetest.module.LangTypeType;
import org.thanlwinsoft.schemas.languagetest.module.LanguageModuleType;
import org.thanlwinsoft.schemas.languagetest.module.NativeLangType;
import org.thanlwinsoft.schemas.languagetest.module.TestItemType;
/**
* @author keith
*
*/
public class TestView extends ViewPart implements ISelectionChangedListener
{
public final static String ID = "org.thanlwinsoft.languagetest.TestView";
private TextViewer nativeViewer = null;
private TextViewer foreignViewer = null;
private Document nativeDoc = null;
private Document foreignDoc = null;
private Group nativeGroup = null;
private Group foreignGroup = null;
private Label picture = null;
private TestControlPanel controlPanel = null;
private SashForm horizontalSash = null;
private Action copyAction = null;
public final static int HIDE_BOTH = 0;
public final static int NATIVE_ID = 1;
public final static int FOREIGN_ID = 2;
public final static int SHOW_BOTH = NATIVE_ID | FOREIGN_ID;
private int promptView = 0;
private Font nativeFont = null; // @jve:decl-index=0:
private Font foreignFont = null;
private HashSet<ISelectionProvider> selectionProviders = null;
public final static int [] EQUAL_WEIGHT = new int [] { 50, 50};
private final static int [] NO_PICTURE_WEIGHTS = new int [] {99,1};
private final static float MIN_WEIGHT = 0.1f;
private int [] pictureWeights = new int [] {50,50};
private ImageData imageData = null;
private Test test = null; // @jve:decl-index=0:
private TestItem currentItem = null; // @jve:decl-index=0:
private TestManager manager = null;
public final static String FLIP_PERIOD_PREF = "FlipPeriod";
public final static String FLIP_REPEAT_PREF = "FlipRepeat";
private SashForm phraseForm = null;
private boolean centering = false;
public TestView()
{
selectionProviders = new HashSet<ISelectionProvider>();
LanguageTestPlugin.getPrefStore().setDefault(FLIP_PERIOD_PREF, 10000);
LanguageTestPlugin.getPrefStore().setDefault(FLIP_REPEAT_PREF, 5);
}
/* (non-Javadoc)
* @see org.eclipse.ui.part.WorkbenchPart#createPartControl(org.eclipse.swt.widgets.Composite)
*/
public void createPartControl(Composite parent)
{
Group mainControl = new Group(parent, SWT.SHADOW_ETCHED_IN);
// horizontally: phraseForm | picture | controlPanel
horizontalSash = new SashForm(mainControl, SWT.HORIZONTAL | SWT.SMOOTH);
phraseForm = new SashForm(horizontalSash, SWT.VERTICAL | SWT.SMOOTH);
phraseForm.setLayout(new FillLayout());
FormLayout mainLayout = new FormLayout();
mainControl.setLayout(mainLayout);
// control panel should not be resized
controlPanel = new TestControlPanel(this, mainControl, SWT.NONE);
// layout data
FormData controlFD = new FormData();
controlFD.top = new FormAttachment(0,0);
controlFD.bottom = new FormAttachment(100,0);
controlFD.right = new FormAttachment(100,0);
controlPanel.setLayoutData(controlFD);
FormData horizontalFD = new FormData();
horizontalFD.top = new FormAttachment(0,0);
horizontalFD.bottom = new FormAttachment(100,0);
horizontalFD.left = new FormAttachment(0,0);
horizontalFD.right = new FormAttachment(controlPanel);
horizontalSash.setLayoutData(horizontalFD);
picture = new Label(horizontalSash, SWT.CENTER | SWT.WRAP);
picture.addControlListener(new ControlListener(){
public void controlMoved(ControlEvent e) {}
public void controlResized(ControlEvent e) {
setPicture();
//centerViewer(nativeViewer);
//centerViewer(foreignViewer);
}
});
//picture.setText(MessageUtil.getString("No picture"));
// phrase viewers top: native, bottom: foreign
nativeGroup = new Group(phraseForm, SWT.SHADOW_ETCHED_IN);
nativeGroup.setBackground(parent.getDisplay().getSystemColor(SWT.COLOR_WHITE));
// RowLayout layout = new RowLayout(SWT.VERTICAL);
// layout.fill = true;
// layout.justify = true;
//nativeGroup.setLayout(layout);
nativeGroup.setLayout(new FillLayout());
//nativeSpacer = new Composite(nativeGroup, SWT.NONE);
nativeViewer = new TextViewer(nativeGroup, SWT.WRAP | SWT.H_SCROLL
| SWT.V_SCROLL);
nativeViewer.getTextWidget().setAlignment(SWT.CENTER);
nativeDoc = new Document();
nativeViewer.setDocument(nativeDoc);
nativeViewer.setEditable(false);
nativeViewer.getTextWidget().setVisible(true);
//Color color = getViewSite().getShell().getDisplay()
// .getSystemColor(SWT.COLOR_DARK_BLUE);
//nativeViewer.getTextWidget().setBackground(color);
//Composite foreignComposite = new Composite(phraseForm, SWT.NONE);
//foreignComposite.setLayout(new FillLayout());
foreignGroup = new Group(phraseForm, SWT.SHADOW_ETCHED_IN);
foreignGroup.setBackground(parent.getDisplay().getSystemColor(SWT.COLOR_WHITE));
// layout = new RowLayout(SWT.VERTICAL);
// layout.fill = true;
// layout.justify = true;
//foreignGroup.setLayout(layout);
foreignGroup.setLayout(new FillLayout());
//foreignSpacer = new Composite(foreignGroup, SWT.NONE);
foreignViewer = new TextViewer(foreignGroup, SWT.WRAP |
SWT.H_SCROLL | SWT.V_SCROLL);
foreignViewer.getTextWidget().setAlignment(SWT.CENTER);
foreignDoc = new Document();
foreignViewer.setDocument(foreignDoc);
foreignViewer.setEditable(false);
phraseForm.setWeights(new int[]{1,1});
horizontalSash.setWeights(NO_PICTURE_WEIGHTS);
nativeGroup.addControlListener(new ControlListener() {
public void controlMoved(ControlEvent e) {
centerViewer(nativeViewer);
}
public void controlResized(ControlEvent e) {
centerViewer(nativeViewer);
}
});
foreignGroup.addControlListener(new ControlListener() {
public void controlMoved(ControlEvent e) {
centerViewer(foreignViewer);
}
public void controlResized(ControlEvent e) {
centerViewer(foreignViewer);
}
});
makeActions();
getViewSite().getActionBars().setGlobalActionHandler(
ActionFactory.COPY.getId(),
copyAction);
IEditorPart editor = getSite().getPage().getActiveEditor();
if (editor instanceof TestModuleEditor)
{
TestModuleEditor tme = (TestModuleEditor)editor;
TestItemEditor tie = (TestItemEditor) tme.getAdapter(TestItemEditor.class);
addSelectionProvider(tie);
}
}
/**
*
*/
private void makeActions()
{
copyAction = new Action() {
public void run()
{
nativeViewer.getTextWidget().copy();
}
};
copyAction.setText(MessageUtil.getString("copy.text"));
copyAction.setToolTipText(MessageUtil.getString("copy.tooltip"));
copyAction.setEnabled(false);
}
/* (non-Javadoc)
* @see org.eclipse.ui.part.WorkbenchPart#setFocus()
*/
public void setFocus()
{
}
public void setText(int type, String text, Font font)
{
if (type == NATIVE_ID)
setText(nativeViewer, nativeDoc, text, font);
else if (type == FOREIGN_ID)
setText(foreignViewer, foreignDoc, text, font);
else
throw new IllegalArgumentException("Unknown type " + type);
}
protected void setText(TextViewer viewer, Document doc, String text, Font font)
{
if (font != null) viewer.getTextWidget().setFont(font);
doc.set(text);
// compute the new margin before setting the text,
// otherwise the new margin value is ignored
centerViewer(viewer, text, viewer.getTextWidget().getFont());
viewer.setDocument(doc);
}
protected void centerViewer(TextViewer viewer)
{
centerViewer(viewer, viewer.getTextWidget().getText(), viewer.getTextWidget().getFont());
}
protected void centerViewer(TextViewer viewer, String text, Font font)
{
if (centering) return;
centering = true;
FillLayout layout = (FillLayout)viewer.getTextWidget().getParent().getLayout();
StyledTextContent tc = viewer.getTextWidget().getContent();
if (tc.getCharCount() > 0)
{
//RowLayout layout = (RowLayout)viewer.getTextWidget().getParent().getLayout();
viewer.getTextWidget().layout();
//Rectangle textRect = viewer.getTextWidget().getTextBounds(0, tc.getCharCount() - 1);
Group group = (Group)viewer.getTextWidget().getParent();
Rectangle availableRect = group.getClientArea();
int dx = 0;
int dy = 0;
if (viewer.getTextWidget().getVerticalBar() != null)
dx = viewer.getTextWidget().getVerticalBar().getSize().x;
if (viewer.getTextWidget().getHorizontalBar() != null)
dy = viewer.getTextWidget().getHorizontalBar().getSize().y;
TextLayout textLayout = new TextLayout(viewer.getTextWidget().getDisplay());
textLayout.setWidth(availableRect.width - dx);
textLayout.setFont(font);
textLayout.setText(text);
Rectangle textRect = textLayout.getBounds(0, text.length());
// System.out.println("Phrase form " + phraseForm.getClientArea());
// System.out.println("Group " + group.getClientArea());
// System.out.println("Textrect " + textRect + textLayout.getText());
//Rectangle textBounds = viewer.getTextWidget().getClientArea();
//int groupBorder = group.getBounds().width - group.getClientArea().width;
if (textRect.height < availableRect.height)
{
layout.marginHeight = (availableRect.height - textRect.height - dy) / 2;
// System.out.println("available " + availableRect.height + " " +
// textRect.height + " margin " + layout.marginHeight);
// work around for layout not updating immediately - move the
// sash a bit
int [] weights = horizontalSash.getWeights();
if (weights.length == 2 && weights[0] > 0 && weights[1] > 0)
{
weights[0]++;
weights[1]--;
horizontalSash.setWeights(weights);
weights[0]--;
weights[1]++;
horizontalSash.setWeights(weights);
}
}
else
{
layout.marginHeight = 0;
}
}
else
{
layout.marginHeight = 0;
}
//System.out.println(" margin " + layout.marginHeight);
controlPanel.redraw();
centering = false;
}
public void hide(int type)
{
switch (type)
{
case HIDE_BOTH:
nativeViewer.getTextWidget().setVisible(false);
foreignViewer.getTextWidget().setVisible(false);
break;
case NATIVE_ID:
nativeViewer.getTextWidget().setVisible(false);
break;
case FOREIGN_ID:
foreignViewer.getTextWidget().setVisible(false);
break;
default:
throw new IllegalArgumentException("Unknown type " + type);
}
}
public void show(int type)
{
switch (type)
{
case HIDE_BOTH:
nativeViewer.getTextWidget().setVisible(false);
foreignViewer.getTextWidget().setVisible(false);
break;
case NATIVE_ID:
nativeViewer.getTextWidget().setVisible(true);
foreignViewer.getTextWidget().setVisible(false);
break;
case FOREIGN_ID:
foreignViewer.getTextWidget().setVisible(true);
nativeViewer.getTextWidget().setVisible(false);
break;
case (NATIVE_ID | FOREIGN_ID):
nativeViewer.getTextWidget().setVisible(true);
foreignViewer.getTextWidget().setVisible(true);
break;
default:
throw new IllegalArgumentException("Unknown type " + type);
}
}
public void setPicture(Image image)
{
picture.setImage(image);
}
protected void setPicture()
{
if (imageData == null)
{
picture.setImage(null);
return;
}
ImageData id = imageData;
float ratio = ((float)imageData.width) /((float)imageData.height);
if (picture.getSize().x < id.width)
{
id = imageData.scaledTo(picture.getSize().x,
(int)Math.round((float)picture.getSize().x / ratio));
}
if (picture.getSize().y < id.height)
{
id = imageData.scaledTo((int)Math.round((float)picture.getSize().y * ratio),
picture.getSize().y);
}
Display display = getSite().getShell().getDisplay();
Image image = new Image(display, id);
picture.setImage(image);
}
/* (non-Javadoc)
* @see org.eclipse.jface.viewers.ISelectionChangedListener#selectionChanged(org.eclipse.jface.viewers.SelectionChangedEvent)
*/
public void selectionChanged(SelectionChangedEvent event)
{
if (phraseForm.isDisposed()) return;
if (event.getSource() instanceof TableViewer)
{
show(NATIVE_ID | FOREIGN_ID);
IEditorPart editor =
PlatformUI.getWorkbench().getActiveWorkbenchWindow()
.getActivePage().getActiveEditor();
TestModuleEditor tme =
(TestModuleEditor)editor.getAdapter(TestModuleEditor.class);
if (tme != null && tme.getDocument() != null)
{
setTestModule(tme.getDocument().getLanguageModule());
}
}
//System.out.println(event.getSource().getClass().getName());
if (event.getSelection() instanceof StructuredSelection)
{
StructuredSelection ss = (StructuredSelection)event.getSelection();
if (ss.getFirstElement() instanceof TestItemType)
{
TestItemType ti = (TestItemType)ss.getFirstElement();
setTestItem(ti);
}
}
}
/**
* A safe way to retreive a font and not worry about disposal
* @param faceName
* @param size
* @return
*/
protected Font getFont(String faceName, int size)
{
FontData fd = new FontData(faceName, size, SWT.NORMAL);
return LanguageTestPlugin.getFont(fd);
}
public void setTestModule(LanguageModuleType module)
{
if (module == null)
return;
LangType [] langs = module.getLangArray();
for (int i = 0; i < langs.length; i++)
{
int fontSize = langs[i].getFontSize().intValue();
if (langs[i].getType().equals(LangTypeType.NATIVE))
{
if (nativeFont == null ||
nativeFont.getFontData()[0].getName()
.equals(langs[i].getFont()) == false ||
nativeFont.getFontData()[0].getHeight() != fontSize)
{
nativeFont = getFont(langs[i].getFont(), fontSize);
if (nativeFont != null)
nativeViewer.getTextWidget().setFont(nativeFont);
}
UniversalLanguage ul = new UniversalLanguage(langs[i].getLang());
nativeGroup.setText(ul.getDescription());
}
else if (langs[i].getType().equals(LangTypeType.FOREIGN))
{
if (foreignFont == null ||
foreignFont.getFontData()[0].getName()
.equals(langs[i].getFont()) == false ||
foreignFont.getFontData()[0].getHeight() != fontSize)
{
foreignFont = getFont(langs[i].getFont(), fontSize);
if (foreignFont != null)
foreignViewer.getTextWidget().setFont(foreignFont);
}
UniversalLanguage ul = new UniversalLanguage(langs[i].getLang());
foreignGroup.setText(ul.getDescription());
}
}
}
private void savePictureWeights()
{
// cache old weights before we remove the picture
if (picture.getImage() != null)
{
int [] weights = horizontalSash.getWeights();
if (weights[1] > MIN_WEIGHT * weights[0])
pictureWeights = weights;
}
}
public void setTestItem(TestItemType ti)
{
if (ti == null) return;
try
{
savePictureWeights();
IEditorPart editor = getSite().getPage().getActiveEditor();
IContainer basePath = null;
if (editor != null && editor.getEditorInput() != null &&
editor.getEditorInput() instanceof FileEditorInput)
{
FileEditorInput fei = (FileEditorInput)editor.getEditorInput();
basePath = fei.getFile().getParent();
}
if (ti.isSetImg() && ti.getImg() != null)
{
if (basePath != null)
{
ImageLoader loader = new ImageLoader();
try
{
IFile imgFile = null;
try
{
if (basePath instanceof IFolder)
{
imgFile = ((IFolder)basePath).getFile(ti.getImg());
}
else if (basePath instanceof IProject)
{
imgFile = ((IProject)basePath).getFile(ti.getImg());
}
}
catch (IllegalArgumentException e) {}
ImageData [] imageDatas = null;
if (imgFile != null && imgFile.exists())
{
imageDatas = loader.load(imgFile.getRawLocation()
.toOSString());
}
else
{
//picture.setText(MessageUtil.getString("FileNotFound",
// imgFile.toString()));
File file = new File(ti.getImg());
if (file.exists())
imageDatas = loader.load(ti.getImg());
}
if (imageDatas != null)
{
horizontalSash.setWeights(pictureWeights);
//Image image = new Image(display, imageData[0]);
imageData = imageDatas[0];
setPicture();
}
else
{
picture.setImage(null);
}
if (nativeViewer.getTextWidget().isVisible())
picture.setToolTipText(ti.getImg());
else
picture.setToolTipText("");
}
catch (SWTException e)
{
picture.setImage(null);
picture.setToolTipText(e.getLocalizedMessage());
horizontalSash.setWeights(NO_PICTURE_WEIGHTS);
LanguageTestPlugin.log(IStatus.WARNING,
e.getLocalizedMessage(), e);
}
}
}
else
{
imageData = null;
picture.setImage(null);
picture.setToolTipText("");
horizontalSash.setWeights(NO_PICTURE_WEIGHTS);
}
NativeLangType [] nLang = ti.getNativeLangArray();
if (nLang.length > 0)
{
setText(NATIVE_ID, nLang[0].getStringValue(), null);
}
else
{
setText(NATIVE_ID, "", null);
}
ForeignLangType [] fLang = ti.getForeignLangArray();
if (fLang.length > 0)
{
setText(FOREIGN_ID, fLang[0].getStringValue(), null);
}
else
{
setText(FOREIGN_ID, "", null);
}
if (ti.isSetSoundFile() &&
ti.getSoundFile().getStringValue() != null)
{
IPath path = new Path(ti.getSoundFile().getStringValue());
if (path.isAbsolute() && path.toFile().exists())
{
controlPanel.player().setFile(ti.getSoundFile().getStringValue());
}
else if (basePath != null && basePath.exists(path) && path.segmentCount() > 0)
{
IFile file = basePath.getFile(path);
controlPanel.player().setFile(file.getRawLocation().toOSString());
}
else
{
controlPanel.player().setFile(null);
}
long start = 0;
long end = -1;
if (ti.getSoundFile().isSetStart())
{
start = ti.getSoundFile().getStart();
}
if (ti.getSoundFile().isSetEnd())
{
end = ti.getSoundFile().getEnd();
}
controlPanel.player().seek(start);
if (end > start)
controlPanel.player().stopAfter(end - start);
}
else
controlPanel.player().setFile(null);
nativeViewer.refresh();
foreignViewer.refresh();
//nativeViewer.getTextWidget().redraw();
picture.redraw();
}
catch (org.apache.xmlbeans.XmlRuntimeException xmlE)
{
LanguageTestPlugin.log(IStatus.WARNING,
xmlE.getLocalizedMessage(), xmlE);
}
}
public void addSelectionProvider(ISelectionProvider provider)
{
provider.addSelectionChangedListener(this);
selectionProviders.add(provider);
}
/* (non-Javadoc)
* @see org.eclipse.ui.part.WorkbenchPart#dispose()
*/
public void dispose()
{
Iterator<ISelectionProvider> i = selectionProviders.iterator();
while (i.hasNext())
{
ISelectionProvider p = (ISelectionProvider)i.next();
if (p != null)
p.removeSelectionChangedListener(this);
}
super.dispose();
}
/**
* @param test
*/
public void startTest(TestManager manager, Test test)
{
this.manager = manager;
this.test = test;
if (test.getType().equals(TestType.LISTENING_FOREIGN_NATIVE))
{
promptView = HIDE_BOTH;
showAnswer(false);
controlPanel.setTestControlVisible(true);
}
else if (test.getType().equals(TestType.READING_FOREIGN_NATIVE))
{
promptView = FOREIGN_ID;
showAnswer(false);
controlPanel.setTestControlVisible(true);
}
else if (test.getType().equals(TestType.READING_NATIVE_FOREIGN))
{
promptView = NATIVE_ID;
showAnswer(false);
controlPanel.setTestControlVisible(true);
}
else if (test.getType().equals(TestType.FLIP_CARD))
{
promptView = NATIVE_ID | FOREIGN_ID;
showAnswer(true);
controlPanel.setFlipControlVisible(true);
flipOnTime();
}
// shouldn't happen
else throw new IllegalArgumentException("Unknown test type:" + test);
UniversalLanguage ul = new UniversalLanguage(manager.getNativeLang());
nativeGroup.setText(ul.getDescription());
ul = new UniversalLanguage(manager.getForeignLang());
foreignGroup.setText(ul.getDescription());
controlPanel.setStatusVisible(true);
controlPanel.setStatus(MessageUtil.getString("TestStatus",
Integer.toString(test.getPassCount()),
Integer.toString(test.getNumTests()),
Integer.toString(test.getNumRetests())));
currentItem = test.getNextItem();
setTestItem(currentItem);
}
protected void flipOnTime()
{
final int maxShowCount = LanguageTestPlugin.getPrefStore().getInt(FLIP_REPEAT_PREF);
Runnable runnable = new Runnable() {
public void run()
{
if (controlPanel.isDisposed()) return;
if (controlPanel.isTestPaused())
{
flipOnTime();
}
else
{
test.setPassStatus(false);// increments test count
if (currentItem.getTestCount() >= maxShowCount)
{
test.removeCurrentItem();
}
currentItem = test.getNextItem();
if (currentItem == null)
{
// finished
controlPanel.setStatusVisible(false);
controlPanel.setFlipControlVisible(false);
restoreView();
}
else
{
setTestItem(currentItem);
StringBuilder sb = new StringBuilder();
sb.append(MessageUtil.getString("FlipCardCount",
Integer.toString(test.getNumTests())));
sb.append("\r\n");
sb.append(MessageUtil.getString("FlipCardTotalShows",
Integer.toString(test.getTestCount())));
sb.append("\r\n");
sb.append(MessageUtil.getString("FlipCardThisCardShowsOfTotal",
Integer.toString(currentItem.getTestCount()),
Integer.toString(maxShowCount)));
controlPanel.setStatus(sb.toString());
flipOnTime();
}
}
}
};
int milliseconds = LanguageTestPlugin.getPrefStore().getInt(FLIP_PERIOD_PREF);
controlPanel.getDisplay().timerExec(milliseconds, runnable);
}
protected void testFinished()
{
float percent = (float)(test.getNumFirstTimePasses()) /
(float)test.getNumTests();
NumberFormat nf = new DecimalFormat("0%");
if (test.getNumRetests() == 0)
{
MessageDialog.openInformation(getSite().getShell(),
MessageUtil.getString("TestFinishedTitle"),
MessageUtil.getString("TestFinishedMessage",
Integer.toString(test.getNumFirstTimePasses()),
Integer.toString(test.getNumTests()),
nf.format(percent)));
}
else if (MessageDialog.openConfirm(this.getSite().getShell(),
MessageUtil.getString("RetestConfirmTitle"),
MessageUtil.getString("RetestConfirmMessage",
Integer.toString(test.getNumFirstTimePasses()),
Integer.toString(test.getNumTests()),
nf.format(percent),
Integer.toString(test.getNumTests() - test.getNumFirstTimePasses())
)))
{
test.retestUnknown();
setTestStatus();
setTestItem(test.getNextItem());
return;
}
setText(nativeViewer, nativeDoc, "", null);
setText(foreignViewer, foreignDoc, "", null);
show(SHOW_BOTH);
restoreView();
test = null;
controlPanel.setTestControlVisible(false);
controlPanel.setFlipControlVisible(false);
controlPanel.setStatusVisible(false);
}
protected void restoreView()
{
IWorkbenchWindow window = PlatformUI.getWorkbench().getActiveWorkbenchWindow();
IWorkbenchPage page = window.getActivePage();
try
{
IPerspectiveDescriptor editPerspective =
PlatformUI.getWorkbench().getPerspectiveRegistry()
.findPerspectiveWithId(EditPerspective.ID);
page.setPerspective(editPerspective);
page.showView(EditPerspective.TEST_VIEW);
IViewReference viewRef = (IViewReference)page.getReference(this);
if (viewRef != null && page.isPageZoomed() == true)
{
// should we add a page listener to watch for when the zoom is lost?
page.toggleZoom(viewRef);
}
}
catch (PartInitException e)
{
e.printStackTrace();
}
}
protected void setTestItem(TestItem ti)
{
if (ti == null)
{
testFinished();
return;
}
savePictureWeights();
nativeFont = null;
if (ti.getNativeFontData() != null)
nativeFont = LanguageTestPlugin.getFont(ti.getNativeFontData());
foreignFont = null;
if (ti.getForeignFontData() != null)
foreignFont = LanguageTestPlugin.getFont(ti.getForeignFontData());
setText(nativeViewer, nativeDoc, ti.getNativeText(), nativeFont);
setText(foreignViewer, foreignDoc, ti.getForeignText(), foreignFont);
IWorkspace workspace = ResourcesPlugin.getWorkspace();
IFile moduleFile = workspace.getRoot().getFile(ti.getModulePath());
if (ti.getSoundFile() != null)
{
if (ti.getSoundFile().toFile().exists())
{
controlPanel.player().setFile(ti.getSoundFile().toOSString());
}
else if (moduleFile.exists() &&
moduleFile.getParent().getFile(ti.getSoundFile()).exists())
{
IFile soundFile = moduleFile.getParent().getFile(ti.getSoundFile());
controlPanel.player().setFile(soundFile.getRawLocation().toOSString());
}
else controlPanel.player().setFile(null);
long start = ti.getPlayStart();
long end = ti.getPlayEnd();
if (start > 0)
controlPanel.player().seek(start);
if (end > start)
controlPanel.player().stopAfter(end - start);
}
else
{
controlPanel.player().setFile(null);
}
if (ti.getImagePath() != null)
{
ImageLoader loader = new ImageLoader();
ImageData [] imageDatae = null;
if (ti.getImagePath().toFile().exists())
{
imageDatae = loader.load(ti.getImagePath().toOSString());
}
else if (moduleFile.exists())
{
IFile file = moduleFile.getParent().getFile(ti.getImagePath());
if (file.exists())
{
imageDatae = loader.load(file.getRawLocation().toOSString());
}
}
if (imageDatae != null && imageDatae.length > 0)
{
imageData = imageDatae[0];
if (foreignViewer.getTextWidget().isVisible())
horizontalSash.setWeights(pictureWeights);
}
else
{
horizontalSash.setWeights(NO_PICTURE_WEIGHTS);
}
}
else
{
horizontalSash.setWeights(NO_PICTURE_WEIGHTS);
imageData = null;
}
setPicture();
centerViewer(nativeViewer);
centerViewer(foreignViewer);
}
public void markTest(boolean pass)
{
test.setPassStatus(pass);
if (test.isRetest() == false && currentItem.getTestCount() == 1)
{
TestHistory history =
manager.getTestHistory(Integer.toHexString(currentItem.getModuleId()),
currentItem.getModuleCreationTime(), currentItem.getModulePath());
try
{
if (history == null)
{
MessageDialog.openWarning(this.getSite().getShell(),
MessageUtil.getString("SaveHistoryFailTitle"),
MessageUtil.getString("SaveHistoryFailMessage", ""));
}
else
{
history.saveResult(currentItem, test.getType(),
new Date().getTime(), pass);
}
}
catch (TestHistoryStorageException e)
{
MessageDialog.openWarning(this.getSite().getShell(),
MessageUtil.getString("SaveHistoryFailTitle"),
MessageUtil.getString("SaveHistoryFailMessage", e.getLocalizedMessage()));
LanguageTestPlugin.log(IStatus.WARNING,
e.getLocalizedMessage(), e);
}
}
setTestStatus();
showAnswer(false);
currentItem = test.getNextItem();
// hack to get refresh to work
phraseForm.setWeights(new int [] { 45, 55});
phraseForm.setWeights(EQUAL_WEIGHT);
setTestItem(currentItem);
}
/**
* Set the test status text in the status box.
*
*/
protected void setTestStatus()
{
controlPanel.setStatus(MessageUtil.getString("TestStatus",
Integer.toString(test.getPassCount()),
Integer.toString(test.getNumTests()),
Integer.toString(test.getNumRetests())));
}
public void showAnswer(boolean showAns)
{
if (showAns)
{
show(SHOW_BOTH);
if (imageData != null) horizontalSash.setWeights(pictureWeights);
}
else
{
show(promptView);
if (promptView != NATIVE_ID || imageData == null)
{
horizontalSash.setWeights(NO_PICTURE_WEIGHTS);
}
}
}
/* (non-Javadoc)
* @see org.eclipse.ui.part.WorkbenchPart#getAdapter(java.lang.Class)
*/
@SuppressWarnings("unchecked")
public Object getAdapter(Class adapter)
{
if (adapter == this.getClass()) return this;
if (adapter == SoundPlayer.class)
{
return controlPanel.player();
}
return super.getAdapter(adapter);
}
}