ca.mcgill.cs.swevo.qualyzer.editors.pages.InvestigatorEditorPage.java Source code

Java tutorial

Introduction

Here is the source code for ca.mcgill.cs.swevo.qualyzer.editors.pages.InvestigatorEditorPage.java

Source

/*******************************************************************************
 * Copyright (c) 2010 McGill University
 * All rights reserved. This program and the accompanying materials
 * are made available under the terms of the Eclipse Public License v1.0
 * which accompanies this distribution, and is available at
 * http://www.eclipse.org/legal/epl-v10.html
 *
 * Contributors:
 *     Jonathan Faubert
 *     Martin Robillard
 *******************************************************************************/
/**
 * 
 */
package ca.mcgill.cs.swevo.qualyzer.editors.pages;

import org.eclipse.jface.dialogs.IMessageProvider;
import org.eclipse.swt.events.KeyAdapter;
import org.eclipse.swt.events.KeyEvent;
import org.eclipse.swt.events.KeyListener;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Text;
import org.eclipse.ui.forms.IManagedForm;
import org.eclipse.ui.forms.editor.FormEditor;
import org.eclipse.ui.forms.editor.FormPage;
import org.eclipse.ui.forms.events.ExpansionAdapter;
import org.eclipse.ui.forms.events.ExpansionEvent;
import org.eclipse.ui.forms.events.HyperlinkAdapter;
import org.eclipse.ui.forms.events.HyperlinkEvent;
import org.eclipse.ui.forms.widgets.FormText;
import org.eclipse.ui.forms.widgets.FormToolkit;
import org.eclipse.ui.forms.widgets.ScrolledForm;
import org.eclipse.ui.forms.widgets.Section;
import org.eclipse.ui.forms.widgets.TableWrapData;
import org.eclipse.ui.forms.widgets.TableWrapLayout;

import ca.mcgill.cs.swevo.qualyzer.editors.InvestigatorFormEditor;
import ca.mcgill.cs.swevo.qualyzer.editors.inputs.InvestigatorEditorInput;
import ca.mcgill.cs.swevo.qualyzer.model.CodeEntry;
import ca.mcgill.cs.swevo.qualyzer.model.Facade;
import ca.mcgill.cs.swevo.qualyzer.model.Fragment;
import ca.mcgill.cs.swevo.qualyzer.model.Investigator;
import ca.mcgill.cs.swevo.qualyzer.model.InvestigatorListener;
import ca.mcgill.cs.swevo.qualyzer.model.ListenerManager;
import ca.mcgill.cs.swevo.qualyzer.model.Memo;
import ca.mcgill.cs.swevo.qualyzer.model.MemoListener;
import ca.mcgill.cs.swevo.qualyzer.model.PersistenceManager;
import ca.mcgill.cs.swevo.qualyzer.model.Project;
import ca.mcgill.cs.swevo.qualyzer.model.ProjectListener;
import ca.mcgill.cs.swevo.qualyzer.model.Transcript;
import ca.mcgill.cs.swevo.qualyzer.model.TranscriptListener;
import ca.mcgill.cs.swevo.qualyzer.model.ListenerManager.ChangeType;
import ca.mcgill.cs.swevo.qualyzer.model.validation.InvestigatorValidator;
import ca.mcgill.cs.swevo.qualyzer.model.validation.StringLengthValidator;
import ca.mcgill.cs.swevo.qualyzer.ui.ResourcesUtil;

/**
 * The main page of the Investigator editor.
 *
 */
public class InvestigatorEditorPage extends FormPage
        implements ProjectListener, InvestigatorListener, MemoListener, TranscriptListener {

    private static final String DELIMITER = ":"; //$NON-NLS-1$
    private static final String INVESTIGATOR = Messages
            .getString("editors.pages.InvestigatorEditorPage.investigator"); //$NON-NLS-1$
    private Text fNickname;
    private Text fFullname;
    private Text fInstitution;
    private FormToolkit fToolkit;

    private Investigator fInvestigator;
    private boolean fIsDirty;
    private ScrolledForm fForm;
    private FormText fTranscriptText;
    private FormText fMemoText;

    /**
     * @param editor
     * @param investigator 
     */
    public InvestigatorEditorPage(FormEditor editor, Investigator investigator) {
        super(editor, INVESTIGATOR, INVESTIGATOR);
        fInvestigator = investigator;
        fIsDirty = false;

        ListenerManager listenerManager = Facade.getInstance().getListenerManager();
        Project project = fInvestigator.getProject();
        listenerManager.registerProjectListener(project, this);
        listenerManager.registerInvestigatorListener(project, this);
        listenerManager.registerMemoListener(project, this);
        listenerManager.registerTranscriptListener(project, this);
    }

    @Override
    public void createFormContent(IManagedForm managed) {
        fForm = managed.getForm();
        fToolkit = managed.getToolkit();
        fForm.setText(INVESTIGATOR);

        TableWrapLayout layout = new TableWrapLayout();
        layout.numColumns = 2;
        Composite body = fForm.getBody();
        body.setLayout(layout);

        @SuppressWarnings("unused")
        Label label = fToolkit.createLabel(body,
                Messages.getString("editors.pages.InvestigatorEditorPage.nickname")); //$NON-NLS-1$
        fNickname = createText(fInvestigator.getNickName(), body);

        label = fToolkit.createLabel(body, Messages.getString("editors.pages.InvestigatorEditorPage.fullName")); //$NON-NLS-1$
        fFullname = createText(fInvestigator.getFullName(), body);
        fFullname.addKeyListener(createStringLengthValidator(fForm,
                Messages.getString("editors.pages.InvestigatorEditorPage.fullName"), fFullname)); //$NON-NLS-1$

        fNickname.addKeyListener(createKeyAdapter(fForm));

        label = fToolkit.createLabel(body, Messages.getString("editors.pages.InvestigatorEditorPage.institution")); //$NON-NLS-1$
        fInstitution = createText(fInvestigator.getInstitution(), body);
        fInstitution.addKeyListener(createStringLengthValidator(fForm,
                Messages.getString("editors.pages.InvestigatorEditorPage.institution"), fInstitution)); //$NON-NLS-1$

        createCodedSection(body);

        createMemoSection(fForm, body);

        fToolkit.paintBordersFor(body);
    }

    /**
     * @param form 
     * @return
     */
    private KeyAdapter createKeyAdapter(final ScrolledForm form) {
        return new KeyAdapter() {
            private ScrolledForm fForm = form;

            @Override
            public void keyReleased(KeyEvent event) {
                InvestigatorValidator lValidator = new InvestigatorValidator(fNickname.getText().trim(),
                        fInvestigator.getNickName(), fInvestigator.getProject());

                if (!lValidator.isValid()) {
                    fForm.setMessage(lValidator.getErrorMessage(), IMessageProvider.ERROR);
                    notDirty();
                } else {
                    fForm.setMessage(null, IMessageProvider.NONE);
                }
            }
        };
    }

    private KeyAdapter createStringLengthValidator(final ScrolledForm form, final String pLabel, final Text pText) {
        return new KeyAdapter() {

            @Override
            public void keyReleased(KeyEvent event) {
                StringLengthValidator lValidator = new StringLengthValidator(pLabel, pText.getText().trim());

                if (!lValidator.isValid()) {
                    form.setMessage(lValidator.getErrorMessage(), IMessageProvider.ERROR);
                    notDirty();
                } else {
                    form.setMessage(null, IMessageProvider.NONE);
                }
            }
        };
    }

    /**
     * @param form
     * @param toolkit
     * @param body
     */
    private void createMemoSection(final ScrolledForm form, Composite body) {
        TableWrapData td;
        Section section;
        GridLayout grid;
        section = fToolkit.createSection(body, Section.EXPANDED | Section.TITLE_BAR | Section.TWISTIE);
        td = new TableWrapData(TableWrapData.FILL_GRAB);
        td.colspan = 2;
        section.setLayoutData(td);
        section.setText(Messages.getString("editors.pages.InvestigatorEditorPage.memos")); //$NON-NLS-1$
        section.addExpansionListener(createExpansionListener(form));
        Composite sectionClient = fToolkit.createComposite(section);
        grid = new GridLayout();
        grid.numColumns = 1;
        sectionClient.setLayout(grid);
        fMemoText = fToolkit.createFormText(sectionClient, true);
        fMemoText.addHyperlinkListener(openMemoListener());
        buildMemos();
        section.setClient(sectionClient);
    }

    /**
     * Sets the text of the FormText widget that links to all the memos.
     * @param sectionClient
     * @param toolkit
     */
    private void buildMemos() {
        StringBuffer buf = new StringBuffer();
        buf.append(FormTextConstants.FORM_START);
        buf.append(FormTextConstants.PARAGRAPH_START);

        for (Memo memo : fInvestigator.getProject().getMemos()) {
            if (fInvestigator.equals(memo.getAuthor())) {
                buf.append(FormTextConstants.LINK_START_HEAD
                        + Messages.getString("editos.pages.InvestigatorEditorPage.memoKey") + //$NON-NLS-1$
                        memo.getName() + FormTextConstants.LINK_START_TAIL);
                buf.append(memo.getName());
                buf.append(FormTextConstants.LINK_END + FormTextConstants.LINE_BREAK);
            } else {
                Memo lMemo = Facade.getInstance().forceMemoLoad(memo);
                for (Fragment fragment : lMemo.getFragments().values()) {
                    boolean found = false;
                    for (CodeEntry entry : fragment.getCodeEntries()) {
                        if (fInvestigator.equals(entry.getInvestigator())) {
                            buf.append(FormTextConstants.LINK_START_HEAD
                                    + Messages.getString("editos.pages.InvestigatorEditorPage.memoKey") + //$NON-NLS-1$
                                    memo.getName() + FormTextConstants.LINK_START_TAIL);
                            buf.append(memo.getName());
                            buf.append(FormTextConstants.LINK_END + FormTextConstants.LINE_BREAK);
                            found = true;
                            break;
                        }
                    }

                    if (found) {
                        break;
                    }
                }
            }
        }

        buf.append(FormTextConstants.PARAGRAPH_END);
        buf.append(FormTextConstants.FORM_END);

        fMemoText.setText(buf.toString(), true, false);

        fForm.reflow(true);
    }

    /**
     * Parses the href of the link to determine which memo to open and then opens it.
     * @return
     */
    private HyperlinkAdapter openMemoListener() {
        return new HyperlinkAdapter() {

            @Override
            public void linkActivated(HyperlinkEvent e) {
                String key = (String) e.getHref();
                String[] strings = key.split(DELIMITER);
                for (Memo memo : fInvestigator.getProject().getMemos()) {
                    if (memo.getName().equals(strings[1])) {
                        ResourcesUtil.openEditor(getSite().getPage(), memo);
                    }
                }
            }
        };
    }

    /**
     * @param form
     * @param toolkit
     * @param body
     */
    private void createCodedSection(Composite body) {
        TableWrapData td;
        Section section;
        section = fToolkit.createSection(body, Section.EXPANDED | Section.TITLE_BAR | Section.TWISTIE);
        td = new TableWrapData(TableWrapData.FILL_GRAB);
        td.colspan = 2;
        section.setLayoutData(td);
        section.setText(Messages.getString("editors.pages.InvestigatorEditorPage.codedTranscripts")); //$NON-NLS-1$
        section.addExpansionListener(createExpansionListener(fForm));
        Composite sectionClient = fToolkit.createComposite(section);
        sectionClient.setLayout(new TableWrapLayout());
        fTranscriptText = fToolkit.createFormText(sectionClient, true);
        fTranscriptText.addHyperlinkListener(openTranscriptListener());
        buildTranscripts();
        section.setClient(sectionClient);
    }

    /**
     * Sets the contents of the FormText widget that displays all the transcripts.
     */
    private void buildTranscripts() {
        StringBuffer buf = new StringBuffer();
        buf.append(FormTextConstants.FORM_START);
        buf.append(FormTextConstants.PARAGRAPH_START);

        for (Transcript transcript : fInvestigator.getProject().getTranscripts()) {
            Transcript lTranscript = Facade.getInstance().forceTranscriptLoad(transcript);
            for (Fragment fragment : lTranscript.getFragments().values()) {
                boolean found = false;
                for (CodeEntry entry : fragment.getCodeEntries()) {
                    if (fInvestigator.equals(entry.getInvestigator())) {
                        buf.append(FormTextConstants.LINK_START_HEAD
                                + Messages.getString("editos.pages.InvestigatorEditorPage.transcriptKey") + //$NON-NLS-1$
                                transcript.getName() + FormTextConstants.LINK_START_TAIL);
                        buf.append(transcript.getName());
                        buf.append(FormTextConstants.LINK_END + FormTextConstants.LINE_BREAK);
                        found = true;
                        break;
                    }
                }

                if (found) {
                    break;
                }
            }
        }

        buf.append(FormTextConstants.PARAGRAPH_END);
        buf.append(FormTextConstants.FORM_END);

        fTranscriptText.setText(buf.toString(), true, false);

        fForm.reflow(true);
    }

    /**
     * Parses the href to determine which transcript to open and then does so.
     * @param transcript
     * @return
     */
    private HyperlinkAdapter openTranscriptListener() {
        return new HyperlinkAdapter() {

            @Override
            public void linkActivated(HyperlinkEvent e) {
                String key = (String) e.getHref();
                String[] strings = key.split(DELIMITER);
                for (Transcript transcript : fInvestigator.getProject().getTranscripts()) {
                    if (transcript.getName().equals(strings[1])) {
                        ResourcesUtil.openEditor(getSite().getPage(), transcript);
                        break;
                    }
                }
            }
        };
    }

    /**
     * @param form
     * @return
     */
    private ExpansionAdapter createExpansionListener(final ScrolledForm form) {
        return new ExpansionAdapter() {
            public void expansionStateChanged(ExpansionEvent e) {
                form.reflow(true);
            }
        };
    }

    private Text createText(String data, Composite parent) {
        Text text = fToolkit.createText(parent, data);
        TableWrapData td = new TableWrapData(TableWrapData.FILL_GRAB);
        text.setLayoutData(td);
        text.addKeyListener(createKeyListener());

        return text;
    }

    @Override
    public boolean isDirty() {
        return fIsDirty;
    }

    /**
     * Get the Nickname that was entered for this Investigator.
     * @return The Nickname field.
     */
    public String getNickname() {
        return fNickname.getText().trim();
    }

    /**
     * Get the full name that was entered for this Investigator.
     * @return The full name field.
     */
    public String getFullname() {
        return fFullname.getText().trim();
    }

    /**
     * Get the Institution that was entered for this Investigator.
     * @return The Institution field.
     */
    public String getInstitution() {
        return fInstitution.getText().trim();
    }

    /**
     * Handles updates to the dirty state as values change.
     * @return
     */
    private KeyListener createKeyListener() {
        return new KeyListener() {

            @Override
            public void keyPressed(KeyEvent e) {
            }

            @Override
            public void keyReleased(KeyEvent e) {
                if (!fIsDirty && fieldHasChanged()) {
                    fIsDirty = true;
                    getEditor().editorDirtyStateChanged();
                }
            }

            private boolean fieldHasChanged() {
                boolean hasChanged = false;
                if (!fNickname.getText().trim().equals(fInvestigator.getNickName())) {
                    hasChanged = true;
                } else if (!fFullname.getText().trim().equals(fInvestigator.getFullName())) {
                    hasChanged = true;
                } else if (!fInstitution.getText().trim().equals(fInvestigator.getInstitution())) {
                    hasChanged = true;
                }
                return hasChanged;
            }

        };
    }

    /**
     * Set dirty to false.
     */
    public void notDirty() {
        fIsDirty = false;
        getEditor().editorDirtyStateChanged();
    }

    /* (non-Javadoc)
     * @see ca.mcgill.cs.swevo.qualyzer.model.ProjectListener#projectChanged(
     * ca.mcgill.cs.swevo.qualyzer.model.ListenerManager.ChangeType, 
     * ca.mcgill.cs.swevo.qualyzer.model.Project, ca.mcgill.cs.swevo.qualyzer.model.Facade)
     */
    @Override
    public void projectChanged(ChangeType cType, Project project, Facade facade) {
        if (cType == ChangeType.DELETE) {
            getEditor().close(false);
        } else if (cType == ChangeType.RENAME) {
            ResourcesUtil.closeEditor(getSite().getPage(), getEditorInput().getName());
        }
    }

    /* (non-Javadoc)
     * @see org.eclipse.ui.forms.editor.FormPage#dispose()
     */
    @Override
    public void dispose() {
        ListenerManager listenerManager = Facade.getInstance().getListenerManager();
        Project project = fInvestigator.getProject();
        listenerManager.unregisterProjectListener(project, this);
        listenerManager.unregisterInvestigatorListener(project, this);
        listenerManager.unregisterMemoListener(project, this);
        listenerManager.unregisterTranscriptListener(project, this);
        super.dispose();
    }

    /* (non-Javadoc)
     * @see ca.mcgill.cs.swevo.qualyzer.model.InvestigatorListener#investigatorChanged(
     * ca.mcgill.cs.swevo.qualyzer.model.ListenerManager.ChangeType, ca.mcgill.cs.swevo.qualyzer.model.Investigator[], 
     * ca.mcgill.cs.swevo.qualyzer.model.Facade)
     */
    @Override
    public void investigatorChanged(ChangeType cType, Investigator[] investigators, Facade facade) {
        if (cType == ChangeType.DELETE) {
            for (Investigator investigator : investigators) {
                if (fInvestigator.equals(investigator)) {
                    getEditor().close(false);
                    break;
                }
            }
        }

    }

    /* (non-Javadoc)
     * @see ca.mcgill.cs.swevo.qualyzer.model.MemoListener#memoChanged(
     * ca.mcgill.cs.swevo.qualyzer.model.ListenerManager.ChangeType, 
     * ca.mcgill.cs.swevo.qualyzer.model.Memo[], ca.mcgill.cs.swevo.qualyzer.model.Facade)
     */
    @Override
    public void memoChanged(ChangeType cType, Memo[] memos, Facade facade) {
        Project project;
        if (ChangeType.DELETE == cType) {
            project = PersistenceManager.getInstance().getProject(fInvestigator.getProject().getName());
        } else {
            project = memos[0].getProject();
        }

        for (Investigator investigator : project.getInvestigators()) {
            if (fInvestigator.getPersistenceId().equals(investigator.getPersistenceId())) {
                setInput(new InvestigatorEditorInput(investigator));
                fInvestigator = investigator;
                ((InvestigatorFormEditor) getEditor()).setInvestigator(fInvestigator);
                break;
            }
        }

        buildMemos();

    }

    /* (non-Javadoc)
     * @see ca.mcgill.cs.swevo.qualyzer.model.TranscriptListener#transcriptChanged(
     * ca.mcgill.cs.swevo.qualyzer.model.ListenerManager.ChangeType, ca.mcgill.cs.swevo.qualyzer.model.Transcript[], 
     * ca.mcgill.cs.swevo.qualyzer.model.Facade)
     */
    @Override
    public void transcriptChanged(ChangeType cType, Transcript[] transcripts, Facade facade) {
        if (cType != ChangeType.ADD) {
            Project project;
            if (ChangeType.DELETE == cType) {
                project = PersistenceManager.getInstance().getProject(fInvestigator.getProject().getName());
            } else {
                project = transcripts[0].getProject();
            }

            for (Investigator investigator : project.getInvestigators()) {
                if (fInvestigator.getPersistenceId().equals(investigator.getPersistenceId())) {
                    setInput(new InvestigatorEditorInput(investigator));
                    fInvestigator = investigator;
                    ((InvestigatorFormEditor) getEditor()).setInvestigator(fInvestigator);
                    break;
                }
            }

            buildTranscripts();
        }
    }
}