/* * Copyright (C) 2012-2016 NS Solutions Corporation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * */ package com.htmlhifive.tools.jslint.view; import java.util.ArrayList; import java.util.List; import org.apache.commons.lang.ArrayUtils; import org.eclipse.jface.viewers.ArrayContentProvider; import org.eclipse.jface.viewers.CellEditor; import org.eclipse.jface.viewers.CheckStateChangedEvent; import org.eclipse.jface.viewers.CheckboxTableViewer; import org.eclipse.jface.viewers.ColumnLabelProvider; import org.eclipse.jface.viewers.ColumnPixelData; import org.eclipse.jface.viewers.ComboBoxCellEditor; import org.eclipse.jface.viewers.EditingSupport; import org.eclipse.jface.viewers.ICheckStateListener; import org.eclipse.jface.viewers.IStructuredSelection; import org.eclipse.jface.viewers.TableLayout; import org.eclipse.jface.viewers.TableViewerColumn; import org.eclipse.jface.viewers.TextCellEditor; import org.eclipse.swt.SWT; import org.eclipse.swt.events.SelectionAdapter; import org.eclipse.swt.events.SelectionEvent; import org.eclipse.swt.layout.GridData; import org.eclipse.swt.layout.GridLayout; import org.eclipse.swt.widgets.Button; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Label; import com.htmlhifive.tools.jslint.configure.FilterBean; import com.htmlhifive.tools.jslint.configure.FilterBean.FilterLevel; import com.htmlhifive.tools.jslint.event.FilterBeanListChangeEvent; import com.htmlhifive.tools.jslint.event.FilterBeanListChangeListener; import com.htmlhifive.tools.jslint.messages.Messages; /** * 説明文でフィルタリング、グルーピング設定をするコンポジット. * * @author NS Solutions Corporation * */ public class DescriptionGroupComposite { /** * 正規表現を入力、設定するテーブル. */ private CheckboxTableViewer tableViewer; /** * テーブルの内容. */ private List<FilterBean> tableElemList; /** * 削除ボタン. */ private Button btnDel; /** * 追加ボタン. */ private Button btnAdd; /** * リスナリスト. */ private List<FilterBeanListChangeListener> listenerList; /** * {@link DescriptionGroupComposite}のベースとなるコンポジット. */ private Composite baseComp; /** * コンストラクタ. * * @param parent 親コンポジット. * @param style スタイル. */ public DescriptionGroupComposite(Composite parent, int style) { tableElemList = new ArrayList<FilterBean>(); listenerList = new ArrayList<FilterBeanListChangeListener>(); baseComp = new Composite(parent, style); baseComp.setLayoutData(new GridData(GridData.FILL_BOTH)); GridLayout glBaseComp = new GridLayout(2, false); glBaseComp.verticalSpacing = -1; baseComp.setLayout(glBaseComp); Label top = new Label(baseComp, SWT.None); top.setLayoutData(new GridData(SWT.LEFT, SWT.CENTER, false, false, 2, 1)); top.setText(Messages.DL0007.getText()); createTable(baseComp); new Label(baseComp, SWT.NONE); new Label(baseComp, SWT.NONE); } /** * テーブルを作成する. * * @param comp コンポジット */ private void createTable(Composite comp) { // テーブルビューアの作成 tableViewer = CheckboxTableViewer.newCheckList(comp, SWT.FULL_SELECTION | SWT.H_SCROLL | SWT.V_SCROLL | SWT.SINGLE | SWT.CHECK); tableViewer.getTable().setLayoutData(new GridData(GridData.FILL_BOTH)); TableLayout layout = new TableLayout(); layout.addColumnData(new ColumnPixelData(50)); layout.addColumnData(new ColumnPixelData(300)); layout.addColumnData(new ColumnPixelData(130)); tableViewer.getTable().setLayout(layout); tableViewer.getTable().setHeaderVisible(true); tableViewer.getTable().setLinesVisible(true); TableViewerColumn columnState = new TableViewerColumn(tableViewer, SWT.CENTER); columnState.getColumn().setText(Messages.TC0000.getText()); columnState.setLabelProvider(new ColumnLabelProvider() { @Override public String getText(Object element) { return ""; } }); TableViewerColumn columnRegex = new TableViewerColumn(tableViewer, SWT.LEFT); columnRegex.getColumn().setText(Messages.TC0004.getText()); columnRegex.setLabelProvider(new ColumnLabelProvider() { @Override public String getText(Object element) { FilterBean bean = (FilterBean) element; return bean.getRegex(); } }); columnRegex.setEditingSupport(new EditingSupport(tableViewer) { @Override protected void setValue(Object element, Object value) { FilterBean bean = (FilterBean) element; bean.setRegex((String) value); updateVariable(); } @Override protected Object getValue(Object element) { String regEx = ((FilterBean) element).getRegex(); return regEx == null ? "" : regEx; } @Override protected CellEditor getCellEditor(Object element) { return new TextCellEditor(tableViewer.getTable()); } @Override protected boolean canEdit(Object element) { return true; } }); TableViewerColumn columnCombo = new TableViewerColumn(tableViewer, SWT.LEFT); columnCombo.getColumn().setText(Messages.TC0005.getText()); columnCombo.setLabelProvider(new ColumnLabelProvider() { @Override public String getText(Object element) { FilterBean bean = (FilterBean) element; return bean.getRevel().getLabel(); } }); columnCombo.setEditingSupport(new EditingSupport(tableViewer) { @Override protected void setValue(Object element, Object value) { FilterBean bean = (FilterBean) element; Integer selectNum = (Integer) value; // TODO 本当は設定したセルエディタから取りたい。。。 bean.setLevel(FilterLevel.getRevelFromLabel(FilterLevel.getAllLabels()[selectNum])); updateVariable(); } @Override protected Object getValue(Object element) { FilterBean bean = (FilterBean) element; return ArrayUtils.indexOf(FilterLevel.getAllLabels(), bean.getRevel().getLabel()); } @Override protected CellEditor getCellEditor(Object element) { CellEditor cellEditor = new ComboBoxCellEditor(tableViewer.getTable(), FilterLevel.getAllLabels(), SWT.READ_ONLY); cellEditor.getLayoutData().minimumWidth = 10; return cellEditor; } @Override protected boolean canEdit(Object element) { return true; } }); tableViewer.setContentProvider(ArrayContentProvider.getInstance()); tableViewer.addCheckStateListener(new ICheckStateListener() { @Override public void checkStateChanged(CheckStateChangedEvent event) { FilterBean bean = (FilterBean) event.getElement(); bean.setState(event.getChecked()); updateVariable(); } }); Composite composite = new Composite(baseComp, SWT.NONE); composite.setLayoutData(new GridData(SWT.FILL, SWT.FILL, false, false, 1, 1)); composite.setLayout(new GridLayout(1, false)); // 追加ボタンの作成 btnAdd = new Button(composite, SWT.None); GridData gdBtnAdd = new GridData(SWT.LEFT, SWT.CENTER, false, false, 1, 1); gdBtnAdd.widthHint = 60; btnAdd.setLayoutData(gdBtnAdd); btnAdd.setText(Messages.B0002.getText()); btnAdd.addSelectionListener(new SelectionAdapter() { @Override public void widgetSelected(SelectionEvent e) { tableElemList.add(new FilterBean()); updateVariable(); } }); // 削除ボタンの作成 btnDel = new Button(composite, SWT.None); GridData gdBtnDel = new GridData(SWT.LEFT, SWT.CENTER, false, false, 1, 1); gdBtnDel.widthHint = 60; btnDel.setLayoutData(gdBtnDel); btnDel.setText(Messages.B0003.getText()); btnDel.addSelectionListener(new SelectionAdapter() { @Override public void widgetSelected(SelectionEvent e) { FilterBean bean = (FilterBean) ((IStructuredSelection) tableViewer.getSelection()).getFirstElement(); tableElemList.remove(bean); updateVariable(); } }); } /** * リスナを追加する. * * @param listener 追加するリスナ. */ public void addFilterBeanListChangeListener(FilterBeanListChangeListener listener) { listenerList.add(listener); } /** * リスナを削除する. * * @param listener 削除するリスナ. */ public void removeFilterBeanListChangeListener(FilterBeanListChangeListener listener) { listenerList.remove(listener); } /** * テーブルに設定されているフィルタビーンを取得する. * * @return 設定されているフィルタビーン. */ public FilterBean[] getFilterBeans() { return (FilterBean[]) tableElemList.toArray(new FilterBean[tableElemList.size()]); } /** * フィルタビーンをセットする. * * @param input テーブルにセットするフィルタビーン. */ public void setUpTableElement(FilterBean[] input) { tableElemList.clear(); for (FilterBean filterBean : input) { tableElemList.add(filterBean); } tableViewer.setInput(tableElemList); for (FilterBean filterBean : tableElemList) { tableViewer.setChecked(filterBean, filterBean.isState()); } updateVariable(); } /** * テーブルを更新する. */ private void updateVariable() { tableViewer.setInput(tableElemList); tableViewer.refresh(); for (FilterBeanListChangeListener listener : listenerList) { listener.modify(new FilterBeanListChangeEvent((FilterBean[]) tableElemList .toArray(new FilterBean[tableElemList.size()]))); } } /** * ボタン、ビューアの活性、非活性を操作する. * * @param enabled 活性するかどうか. */ public void setEnabled(boolean enabled) { btnAdd.setEnabled(enabled); btnDel.setEnabled(enabled); tableViewer.getTable().setEnabled(enabled); } }