/*******************************************************************************
* Copyright (c) 2007 Exadel, Inc. and Red Hat, Inc.
* Distributed under license by Red Hat, Inc. All rights reserved.
* This program is 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:
* Exadel, Inc. and Red Hat, Inc. - initial API and implementation
******************************************************************************/
package org.jboss.tools.common.propertieseditor;
import java.util.ArrayList;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.events.SelectionListener;
import org.eclipse.swt.graphics.Image;
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.Label;
import org.jboss.tools.common.meta.action.XActionInvoker;
import org.jboss.tools.common.model.XModelObject;
import org.jboss.tools.common.model.impl.bundle.CountriesHelper;
import org.jboss.tools.common.model.ui.ModelUIMessages;
import org.jboss.tools.common.model.ui.action.CommandBar;
import org.jboss.tools.common.model.ui.action.CommandBarLayout;
import org.jboss.tools.common.model.ui.action.CommandBarListener;
import org.jboss.tools.common.model.util.EclipseResourceUtil;
import org.jboss.tools.common.propertieseditor.bundlemodel.BundleModel;
public class BundleLanguagesEditor implements CommandBarListener, SelectionListener {
static String CREATE = ModelUIMessages.BundleLanguagesEditor_Add;
static String DELETE = ModelUIMessages.BundleLanguagesEditor_Delete;
public Image IMAGE_DELETE = EclipseResourceUtil.getImage("images/actions/delete.gif"); //$NON-NLS-1$
public Image IMAGE_EDIT = EclipseResourceUtil.getImage("images/actions/edit.gif"); //$NON-NLS-1$
public Image IMAGE_CREATE = EclipseResourceUtil.getImage("images/actions/new.gif"); //$NON-NLS-1$
BundleModel bundleModel;
protected Composite control;
protected ComboModel combomodel = new ComboModel();
protected Combo combo;
protected CommandBar bar = createBar();
BundleLocaleEditor listener;
public void dispose() {
listener = null;
if (combomodel!=null) combomodel.dispose();
combomodel = null;
if (bar!=null) bar.dispose();
bar = null;
}
public void setBundleModel(BundleModel bundleModel) {
this.bundleModel = bundleModel;
}
public void addListener(BundleLocaleEditor listener) {
this.listener = listener;
}
public Control createControl(Composite parent) {
control = new Composite(parent, SWT.NONE);
control.setLayout(new GridLayout(2, false));
createComboControl(control);
bar.createControl(control);
return control;
}
private Control createComboControl(Composite parent) {
Composite control = new Composite(parent, SWT.NONE);
control.setLayout(new GridLayout(2, false));
Label label = new Label(control, SWT.NONE);
label.setText(ModelUIMessages.BundleLanguagesEditor_LanguageCountry);
combo = new Combo(control, SWT.DROP_DOWN | SWT.READ_ONLY);
combomodel.setCombo(combo);
update();
combo.addSelectionListener(this);
return control;
}
private CommandBar createBar() {
CommandBar c = new CommandBar();
CommandBarLayout layout = c.getLayout();
layout.iconsOnly = true;
layout.asToolBar = true;
c.setCommands(new String[]{CREATE, DELETE});
c.setEnabled(CREATE, true);
c.setEnabled(DELETE, true);
c.addCommandBarListener(this);
c.setImage(CREATE, IMAGE_CREATE);
c.setImage(DELETE, IMAGE_DELETE);
return c;
}
public Control getControl() {
return control;
}
boolean lock = false;
public void update() {
if(combo == null || combo.isDisposed()) return;
if(lock) return;
lock = true;
String[] ls = bundleModel.getLocales();
String lc = bundleModel.getCurrentLocale();
if(isChanged(ls, combomodel)) setBoxValues(ls, combomodel, lc);
else combomodel.refresh();
control.getParent().update();
control.redraw();
lock = false;
}
private boolean isChanged(Object[] vs, ComboModel combomodel) {
if(combomodel.getSize() != vs.length) return true;
for (int i = 0; i < vs.length; i++)
if(vs[i] != combomodel.getElementAt(i)) return true;
return false;
}
private Object setBoxValues(Object[] vs,ComboModel combomodel, Object selected) {
boolean e = false;
combomodel.removeAllElements();
for (int i = 0; i < vs.length; i++) {
if(vs[i] == selected) e = true;
combomodel.addElement(vs[i]);
}
if(!e) selected = (vs.length > 0) ? vs[0] : null;
if(selected != null) combomodel.setSelectedItem(selected);
return selected;
}
public void action(String command) {
if(CREATE.equals(command)) add();
else if(DELETE.equals(command)) delete();
}
private void add() {
CountriesHelper.init(bundleModel.getModelObject().getModel());
XModelObject o = bundleModel.getModelObject().getModel().createModelObject("BundleList", null); //$NON-NLS-1$
XActionInvoker.invoke("CreateActions.AddBundle", o, null); //$NON-NLS-1$
XModelObject[] os = o.getChildren();
if(os.length == 0) return;
String lg = os[0].getAttributeValue("language"); //$NON-NLS-1$
String ct = os[0].getAttributeValue("country"); //$NON-NLS-1$
String locale = ((lg + ct).length() == 0) ? "" : lg + "_" + ct; //$NON-NLS-1$ //$NON-NLS-2$
bundleModel.addLocale(locale);
update();
widgetSelected(null);
}
private void delete() {
int i = combo.getSelectionIndex();
Object o = combomodel.getSelectedItem();
if(o == null) return;
bundleModel.removeLocale(o.toString());
String[] is = bundleModel.getLocales();
if(is.length <= i) i = is.length - 1;
if(i >= 0) bundleModel.setCurrentLocale(is[i]);
update();
widgetSelected(null);
}
public void widgetSelected(SelectionEvent e) {
if(lock) return;
Object o = combomodel.getSelectedItem();
String locale = (o == null) ? "" : o.toString(); //$NON-NLS-1$
bundleModel.setCurrentLocale(locale);
if(listener != null) listener.update();
}
public void widgetDefaultSelected(SelectionEvent e) {}
class ComboModel extends DefaultComboModel {
public String getPresentation(Object object) {
String s = super.getPresentation(object);
return (s.length() == 0) ? "default" : s; //$NON-NLS-1$
}
}
}
class DefaultComboModel {
protected Combo combo;
protected ArrayList<Object> list = new ArrayList<Object>();
public DefaultComboModel() {}
public void dispose() {
if (list!=null) list.clear();
list = null;
}
public void setCombo(Combo combo) {
this.combo = combo;
}
public int getIndexOf(Object object) {
for (int i = 0; i < list.size(); i++) if(list.get(i) == object) return i;
return -1;
}
public void removeAllElements() {
if(combo != null) combo.removeAll();
list.clear();
}
public Object getSelectedItem() {
return (combo == null) ? null : getElementAt(combo.getSelectionIndex());
}
public void setSelectedItem(Object o) {
if(combo == null) return;
int i = getIndexOf(o);
if(i < 0) combo.setText(""); else combo.setText(combo.getItem(i)); //$NON-NLS-1$
}
public Object getElementAt(int i) {
return (i < 0 || i >= list.size()) ? null : list.get(i);
}
public int getSize() {
return list.size();
}
public void addElement(Object o) {
list.add(o);
if(combo != null) combo.add(getPresentation(o));
}
public String getPresentation(Object object) {
return (object == null) ? "" : object.toString(); //$NON-NLS-1$
}
public void refresh() {
if(combo == null || isUpToDate()) return;
Object selected = getSelectedItem();
combo.removeAll();
int s = getSize();
for (int i = 0; i < s; i++)
combo.add(getPresentation(getElementAt(i)));
if(selected != null) setSelectedItem(selected);
combo.pack(true);
}
private boolean isUpToDate() {
int s = getSize();
if(combo.getItemCount() != s) return false;
for (int i = 0; i < s; i++) {
String s1 = getPresentation(getElementAt(i));
String s2 = combo.getItem(i);
if(s1 == null || !s1.equals(s2)) return false;
}
return true;
}
}