/*
* -----------------------------------------------------------------------
* File: $HeadURL$
* Revision $LastChangedRevision$
* Last Modified: $LastChangedDate$
* Last Change by: $LastChangedBy$
* -----------------------------------------------------------------------
* 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.util.LinkedList;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import org.eclipse.jface.dialogs.MessageDialog;
import org.eclipse.jface.viewers.ArrayContentProvider;
import org.eclipse.jface.viewers.ComboViewer;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.ModifyEvent;
import org.eclipse.swt.events.ModifyListener;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.events.SelectionListener;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Combo;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.Group;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.swt.widgets.Text;
import org.eclipse.swt.widgets.TreeItem;
import org.thanlwinsoft.languagetest.MessageUtil;
import org.thanlwinsoft.languagetest.eclipse.workspace.WorkspaceLanguageManager;
import org.thanlwinsoft.languagetest.language.test.UniversalLanguage;
import org.thanlwinsoft.languagetest.language.test.meta.MetaNode;
import org.thanlwinsoft.schemas.languagetest.module.DescType;
import org.thanlwinsoft.schemas.languagetest.module.LangType;
import org.thanlwinsoft.schemas.languagetest.module.MetaDataType;
public class EditTagDialog extends MessageDialog
{
/**
*
*/
//private final TagFilterComposite composite;
private Combo langCombo;
private Text tagId;
private Text tagDesc;
private LinkedList<MetaNode> metaNodeList;
private int parentNodeLevel = 0;
private UniversalLanguage language = null;
private boolean isNew;
private boolean idDescInSync = true;
private MetaDataType metaData = null;
private MetaNode metaNode = null;
private static final int CONTROL_WIDTH = 200;
private final static Pattern ILLEGAL_ID_CHAR = Pattern.compile("[\\\\/*?;:]");
/**
* @param parentShell
* @param dialogTitle
* @param dialogMessage
* @param isNew
*/
public EditTagDialog(Shell parentShell, String dialogTitle,
String dialogMessage, boolean isNew)
{
super(parentShell, dialogTitle, null, dialogMessage,
MessageDialog.NONE, new String[]
{
MessageUtil.getString("OK"), MessageUtil.getString("Cancel")
}, 0);
this.isNew = isNew;
}
/* (non-Javadoc)
* @see org.eclipse.jface.dialogs.MessageDialog#createCustomArea(org.eclipse.swt.widgets.Composite)
*/
@Override
protected Control createDialogArea(Composite parent)
{
Composite c = (Composite)super.createDialogArea(parent);
//c.setSize(400, SWT.DEFAULT);
Group group = new Group(c, SWT.SHADOW_ETCHED_IN);
GridLayout layout = new GridLayout();
layout.numColumns = 2;
group.setLayout(layout);
new Label(group, SWT.LEAD).setText(MessageUtil.getString("TagParent"));
final Combo parentPathCombo = new Combo(group, SWT.LEAD | SWT.READ_ONLY);
parentPathCombo.setLayoutData(new GridData(CONTROL_WIDTH, SWT.DEFAULT));
parentPathCombo.setToolTipText(MessageUtil.getString("TagParentPath"));
final ComboViewer pathCV = new ComboViewer(parentPathCombo);
pathCV.setContentProvider(new ArrayContentProvider());
parentPathCombo.setEnabled(isNew);
new Label(group, SWT.LEAD).setText(MessageUtil.getString("TagId"));
tagId = new Text(group, SWT.LEAD);
tagId.setLayoutData(new GridData(CONTROL_WIDTH, SWT.DEFAULT));
tagId.setEnabled(isNew);
if (!isNew)
{
tagId.setText(metaNodeList.getLast().getId());
}
new Label(group, SWT.LEAD).setText(MessageUtil.getString("TagLang"));
langCombo = new Combo(group, SWT.LEAD | SWT.READ_ONLY);
ComboViewer langCV = new ComboViewer(langCombo);
langCV.setContentProvider(new ArrayContentProvider());
new Label(group, SWT.LEAD).setText(MessageUtil.getString("TagDesc"));
tagDesc = new Text(group, SWT.LEAD);
tagDesc.setLayoutData(new GridData(CONTROL_WIDTH, SWT.DEFAULT));
LangType [] langs = WorkspaceLanguageManager.findUserLanguages();
final UniversalLanguage [] uLangs = new UniversalLanguage[langs.length];
for (int i = 0; i < langs.length; i++)
{
UniversalLanguage ul = new UniversalLanguage(langs[i].getLang());
uLangs[i] = ul;
}
langCV.setInput(uLangs);
langCombo.select(0);
language = uLangs[0];
pathCV.setInput(getPathList(language.getCode()));
if (isNew)
parentPathCombo.select(parentNodeLevel);
else
parentPathCombo.select(0); // can't be changed
parentPathCombo.addSelectionListener(new SelectionListener()
{
public void widgetDefaultSelected(SelectionEvent e){}
public void widgetSelected(SelectionEvent e)
{
parentNodeLevel = parentPathCombo.getSelectionIndex();
if (parentNodeLevel == 0)
metaNode = new MetaNode(null, metaData);
else
metaNode = new MetaNode(metaNodeList.get(parentNodeLevel - 1),
metaData);
}
});
langCombo.addSelectionListener(new SelectionListener(){
public void widgetDefaultSelected(SelectionEvent e){}
public void widgetSelected(SelectionEvent e)
{
int i = langCombo.getSelectionIndex();
if (i > -1)
{
language = uLangs[i];
String langName =
new UniversalLanguage(uLangs[i].getLanguageCode()).getDescription();
tagDesc.setToolTipText(MessageUtil.getString("TagDescription", langName));
pathCV.setInput(getPathList(language.getCode()));
for (DescType d : metaData.getDescArray())
{
if (d.getLang().equals(language.getCode()))
{
tagDesc.setText(d.getStringValue());
idDescInSync = false;
return;
}
}
}
}});
tagId.setToolTipText(MessageUtil.getString("TagID"));
tagId.addModifyListener(new ModifyListener(){
public void modifyText(ModifyEvent e)
{
String id = tagId.getText();
Matcher m = ILLEGAL_ID_CHAR.matcher(id);
if (m.find())
{
id = m.replaceAll("");
tagId.setText(id);
}
metaData.setMetaId(id);
// if the tagDesc is null, set it to the same as the id
if (tagDesc.getText().length() == 0 || idDescInSync)
{
tagDesc.setText(tagId.getText());
setLangDesc();
}
}});
langCombo.setToolTipText(MessageUtil.getString("TagLanguage"));
tagDesc.setToolTipText(MessageUtil.getString("TagDescription",
new UniversalLanguage(uLangs[0].getLanguageCode()).getDescription()));
if (isNew == false && metaNodeList.size() > 0)
{
tagDesc.setText(metaNodeList.getLast().getName(language.getCode()));
if (tagDesc.getText().equals(tagId.getText()))
idDescInSync = true;
else
idDescInSync = false;
}
tagDesc.addModifyListener(new ModifyListener() {
public void modifyText(ModifyEvent e)
{
if (tagDesc.getText().equals(tagId.getText()) ||
tagDesc.getText().length() == 0)
idDescInSync = true;
else
idDescInSync = false;
setLangDesc();
}});
c.pack();
// set the focus
if (isNew)
tagId.setFocus();
else
tagDesc.setFocus();
return c;
}
/**
* set the description on the MetaData object for the current language
*/
protected void setLangDesc()
{
for (DescType d : metaData.getDescArray())
{
if (d.getLang().equals(language.getCode()))
{
d.setStringValue(tagDesc.getText());
return;
}
}
DescType desc = metaData.addNewDesc();
desc.setLang(language.getCode());
desc.setStringValue(tagDesc.getText());
}
private String [] getPathList(String langCode)
{
// get the list of alternative paths
if (metaNodeList != null)
{
if (isNew)
{
String [] paths = new String[metaNodeList.size() + 1];
int i = 0;
paths[i++] = "/";
for (MetaNode mn : metaNodeList)
{
paths[i++] = mn.getPath(langCode);
}
return paths;
}
else
{
// we are editing the node, so the parent path can't be changed
if (metaNodeList.size() > 1)
{
// We want the parent node of the one being edited
MetaNode mn = metaNodeList.get(metaNodeList.size() - 2);
return new String [] {mn.getPath(langCode)};
}
return new String [] {"/"};
}
}
return null;
}
public void setSelection(TreeItem [] selection)
{
if (selection.length > 0)
{
// Note: the metaNodeList excludes the root node
metaNodeList = new LinkedList<MetaNode>();
Object o = selection[0].getData();
if (o instanceof MetaNode)
{
MetaNode mn = (MetaNode)o;
metaNodeList.push(mn);
while (mn.getParent() != null)
{
mn = mn.getParent();
metaNodeList.push(mn);
}
}
}
if (isNew)
{
// start with parent as first selected node
// 0 = root note, hence parentNodeLevel = size of node list
parentNodeLevel = metaNodeList.size();
metaData = MetaDataType.Factory.newInstance();
metaNode = new MetaNode(metaNodeList.getLast(), metaData);
}
else
{
// editing first selected node, so its parent is one above
// 0 = root note, hence parentNodeLevel = size of node list - 1
parentNodeLevel = metaNodeList.size() - 1;
metaNode = metaNodeList.getLast();
metaData = metaNode.getData();
}
}
public MetaNode getMetaNode()
{
return metaNode;
}
}