/* * ----------------------------------------------------------------------- * File: $HeadURL: http://keith-laptop/svn/krs/LanguageTest/trunk/org.thanlwinsoft.languagetest/src/org/thanlwinsoft/languagetest/eclipse/editors/ModuleLanguagePart.java $ * Revision $LastChangedRevision: 1388 $ * Last Modified: $LastChangedDate: 2009-01-31 19:32:00 +0700 (Sat, 31 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.editors; import java.util.HashMap; import java.util.HashSet; import org.apache.xmlbeans.XmlObject; import org.eclipse.core.resources.IProject; import org.eclipse.core.runtime.IProgressMonitor; import org.eclipse.swt.SWT; import org.eclipse.swt.events.ModifyEvent; import org.eclipse.swt.events.ModifyListener; import org.eclipse.swt.widgets.Composite; import org.eclipse.ui.IEditorInput; import org.eclipse.ui.IEditorSite; import org.eclipse.ui.PartInitException; import org.eclipse.ui.forms.events.ExpansionAdapter; import org.eclipse.ui.forms.events.ExpansionEvent; import org.eclipse.ui.forms.widgets.ColumnLayout; import org.eclipse.ui.forms.widgets.ExpandableComposite; 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.part.EditorPart; import org.eclipse.ui.part.FileEditorInput; import org.thanlwinsoft.languagetest.MessageUtil; import org.thanlwinsoft.languagetest.eclipse.workspace.WorkspaceLanguageManager; import org.thanlwinsoft.schemas.languagetest.module.LangType; import org.thanlwinsoft.schemas.languagetest.module.LangTypeType; /** * @author keith * */ public class ModuleLanguagePart extends EditorPart implements ModifyListener { private TestModuleEditor parent = null; private FormToolkit toolkit = null; private LanguageTable nativeTable = null; private LanguageTable foreignTable = null; private IProject project = null; public ModuleLanguagePart(TestModuleEditor parent) { super(); this.parent = parent; } /* (non-Javadoc) * @see org.eclipse.ui.part.EditorPart#doSave(org.eclipse.core.runtime.IProgressMonitor) */ public void doSave(IProgressMonitor monitor) { parent.doSave(monitor); } /* (non-Javadoc) * @see org.eclipse.ui.part.EditorPart#doSaveAs() */ public void doSaveAs() { parent.doSaveAs(); } /* (non-Javadoc) * @see org.eclipse.ui.part.EditorPart#init(org.eclipse.ui.IEditorSite, org.eclipse.ui.IEditorInput) */ public void init(IEditorSite site, IEditorInput input) throws PartInitException { setSite(site); setPartName(MessageUtil.getString("LanguagesTab")); setInput(input); } /* (non-Javadoc) * @see org.eclipse.ui.part.EditorPart#isDirty() */ public boolean isDirty() { if (nativeTable.isDirty() || foreignTable.isDirty()) { parent.setDirty(true); } return parent.isDirty(); } /* (non-Javadoc) * @see org.eclipse.ui.part.EditorPart#isSaveAsAllowed() */ public boolean isSaveAsAllowed() { return parent.isSaveAsAllowed(); } /* (non-Javadoc) * @see org.eclipse.ui.part.WorkbenchPart#createPartControl(org.eclipse.swt.widgets.Composite) */ public void createPartControl(Composite parent) { toolkit = new FormToolkit(parent.getDisplay()); final ScrolledForm form = toolkit.createScrolledForm(parent); form.getBody().setLayout(new ColumnLayout()); form.setText(MessageUtil.getString("ModuleLanguages")); ExpandableComposite nec = toolkit.createExpandableComposite(form.getBody(), ExpandableComposite.TWISTIE | ExpandableComposite.EXPANDED); nec.setText(MessageUtil.getString("NativeLanguages")); nec.setToolTipText(MessageUtil.getString("NativeLanguageDesc")); nativeTable = new LanguageTable(nec, SWT.SHADOW_ETCHED_IN); nativeTable.addModifyListener(this); toolkit.adapt(nativeTable); nec.setClient(nativeTable); ExpandableComposite fec = toolkit.createExpandableComposite(form.getBody(), ExpandableComposite.TWISTIE| ExpandableComposite.EXPANDED); fec.setText(MessageUtil.getString("ForeignLanguages")); fec.setToolTipText(MessageUtil.getString("ForeignLanguageDesc")); foreignTable = new LanguageTable(fec, SWT.SHADOW_ETCHED_IN); foreignTable.addModifyListener(this); toolkit.adapt(foreignTable); fec.setClient(foreignTable); nec.addExpansionListener(new ExpansionAdapter() { public void expansionStateChanged(ExpansionEvent e) { form.reflow(true); } }); fec.addExpansionListener(new ExpansionAdapter() { public void expansionStateChanged(ExpansionEvent e) { form.reflow(true); } }); FormText introText = toolkit.createFormText(form.getBody(), true); introText.setText(MessageUtil.getString("ModuleLanguageIntro"), true, false); } /** * Set the Input for the Language Tables. The input is expected to be * a FileEditorInput for a Language Module file. * @param input */ public void setInput(Object input) { project = null; if (input instanceof FileEditorInput) { FileEditorInput fei = (FileEditorInput)input; project = fei.getFile().getProject(); if (parent.getDocument() == null) return; LangType[] enabled = parent.getDocument().getLanguageModule().getLangArray(); HashSet<XmlObject> enabledNative = new HashSet<XmlObject>(); HashSet<XmlObject> enabledForeign = new HashSet<XmlObject>(); // TBD: optimise to have one call to find Active languages that // supplies both in one call HashMap<String, LangType> nLangs = WorkspaceLanguageManager.findActiveLanguages(project, LangTypeType.NATIVE); HashMap<String, LangType> fLangs = WorkspaceLanguageManager.findActiveLanguages(project, LangTypeType.FOREIGN); // Loop over module languages and see which languages are enabled // for this module. Add languages which are not already in the // project to the project list. boolean added = false; for (int i = 0; i < enabled.length; i++) { if (enabled[i].getType().equals(LangTypeType.NATIVE)) { // remove link to source file by copying other wise strange // effects happen enabledNative.add(enabled[i].copy()); if (nLangs.containsKey(enabled[i].getLang()) == false) { WorkspaceLanguageManager.addLanguage(project, enabled[i], null); added = true; } } else { enabledForeign.add(enabled[i].copy()); if (fLangs.containsKey(enabled[i].getLang()) == false) { WorkspaceLanguageManager.addLanguage(project, enabled[i], null); added = true; } } } // reget the active languages incase some languages were added if (added) { nLangs = WorkspaceLanguageManager.findActiveLanguages(project, LangTypeType.NATIVE); fLangs = WorkspaceLanguageManager.findActiveLanguages(project, LangTypeType.FOREIGN); } nativeTable.setProjectLangs(nLangs); foreignTable.setProjectLangs(fLangs); nativeTable.setModuleLangs(enabledNative.toArray(new LangType[enabledNative.size()])); foreignTable.setModuleLangs(enabledForeign.toArray(new LangType[enabledForeign.size()])); } } /* (non-Javadoc) * @see org.eclipse.ui.part.WorkbenchPart#setFocus() */ public void setFocus() { //form.setFocus(); } /* (non-Javadoc) * @see org.eclipse.swt.events.ModifyListener#modifyText(org.eclipse.swt.events.ModifyEvent) */ public void modifyText(ModifyEvent e) { LangType [] nLangArray = nativeTable.getModuleLangs(); LangType [] fLangArray = foreignTable.getModuleLangs(); LangType [] langArray = new LangType[nLangArray.length + fLangArray.length]; int i = 0; for (; i < nLangArray.length; i++) { langArray[i] = (LangType)nLangArray[i].copy(); } for (; i < langArray.length; i++) { langArray[i] = (LangType)fLangArray[i - nLangArray.length].copy(); } parent.getDocument().getLanguageModule().setLangArray(langArray); nativeTable.saveProjectLangs(project, null, true); foreignTable.saveProjectLangs(project, null, true); parent.setLanguageChanged(); parent.firePropertyChange(PROP_DIRTY); } }