/**
* @version $Id: CheckboxWith.java 1839 2014-04-16 02:33:51Z yukihiro-kinjyo $
*
* 2011/11/25 19:30:29
* @author kousuke-morishima
*
* Copyright 2011-2014 TIDAコンソーシアム All Rights Reserved.
*/
package com.tida_okinawa.corona.internal.ui.component;
import org.eclipse.core.runtime.ListenerList;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.events.SelectionListener;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
/**
* チェックボックスの値によってコントロールの有効/無効を切り替える
*
* @author kousuke-morishima
*/
public abstract class CheckboxWith extends AbstractWidget {
public CheckboxWith(Composite parent, String label, int withControlStyle) {
root = CompositeUtil.defaultComposite(parent, 2);
root.setLayoutData(new GridData(SWT.FILL, SWT.NONE, true, false));
createControl(root, label, withControlStyle);
setChecked(false);
}
Button check;
protected Control withControl;
private void createControl(Composite parent, String label, int withControlStyle) {
check = CompositeUtil.createBtn(parent, SWT.CHECK, label, listener);
withControl = createWithControl(parent, withControlStyle);
}
/**
* @return コントロールが有効ならばtrue
*/
public boolean isEnabled() {
return check.isEnabled();
}
/**
* このウィジェット全体の有効/無効を切り替える
*
* @param enabled
*/
public void setEnabled(boolean enabled) {
check.setEnabled(enabled);
if (withControl != null) {
withControl.setEnabled(enabled);
}
}
/**
* @return チェックボックスがチェックされていればtrue
*/
public boolean isChecked() {
return check.getSelection();
}
/**
* 入力欄の有効/無効を切り替える
*
* @param checked
*/
public void setChecked(boolean checked) {
check.setSelection(checked);
if (withControl != null) {
withControl.setEnabled(checked);
}
}
/**
* チェックボックスの横につけるコントロールを作る。
* Compositeじゃないほうが都合がいい。
*
* @param parent
* @param style
* @return may be null
*/
protected abstract Control createWithControl(Composite parent, int style);
/* ****************************************
* getter/setter
*/
private Composite root;
public Composite getRoot() {
return root;
}
/**
* @return rootCompositeのレイアウトデータ
*/
public Object getLayoutData() {
return root.getLayoutData();
}
/**
* @param layoutData
* rootCompositeのレイアウトデータ
*/
public void setLayoutData(Object layoutData) {
root.setLayoutData(layoutData);
}
/**
* @return withControlの値。コントロールが無効でも、値が入っていればその値を返す。may be null.
*/
public abstract Object getValue();
/* ****************************************
* Listeners
*/
ListenerList listeners = new ListenerList();
public void addCheckStateChangedListener(SelectionListener listener) {
listeners.add(listener);
}
public void removeCheckStateChangedListener(SelectionListener listener) {
listeners.remove(listener);
}
private SelectionListener listener = new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e) {
setChecked(((Button) e.widget).getSelection());
for (Object l : listeners.getListeners()) {
((SelectionListener) l).widgetSelected(e);
}
}
};
/* ****************************************
* other
*/
@Override
public void setFocus() {
if (withControl != null) {
withControl.setFocus();
} else {
check.setFocus();
}
}
@Override
public void dispose() {
check.removeSelectionListener(listener);
}
@Override
protected int handling() {
return 0;
};
}