/*
* � Copyright IBM Corp. 2014, 2016
*
* 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.ibm.xsp.extlib.designer.tooling.palette.calendarview;
import java.util.Arrays;
import java.util.List;
import org.eclipse.jface.viewers.ArrayContentProvider;
import org.eclipse.jface.viewers.CellEditor;
import org.eclipse.jface.viewers.ColumnLabelProvider;
import org.eclipse.jface.viewers.ColumnViewerToolTipSupport;
import org.eclipse.jface.viewers.ComboBoxCellEditor;
import org.eclipse.jface.viewers.EditingSupport;
import org.eclipse.jface.viewers.TableViewer;
import org.eclipse.jface.viewers.TableViewerColumn;
import org.eclipse.jface.window.ToolTip;
import org.eclipse.swt.SWT;
import org.eclipse.swt.custom.CCombo;
import org.eclipse.swt.events.ControlEvent;
import org.eclipse.swt.events.ControlListener;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Table;
import com.ibm.commons.util.StringUtil;
import com.ibm.designer.domino.navigator.NavigatorPlugin;
import com.ibm.designer.domino.xsp.utils.PropertyPanelTooltipUtil;
import com.ibm.xsp.extlib.designer.tooling.utils.AbstractWizardPage;
import com.ibm.xsp.extlib.designer.tooling.utils.WizardUtils;
import com.ibm.xsp.registry.FacesDefinition;
import com.ibm.xsp.registry.FacesRegistry;
import static com.ibm.xsp.extlib.designer.tooling.constants.IExtLibAttrNames.*;
import static com.ibm.xsp.extlib.designer.tooling.constants.IExtLibTagLib.*;
import static com.ibm.xsp.extlib.designer.tooling.constants.IExtLibTagNames.*;
/**
* @author Gary Marjoram
*
*/
public class CvwRestPage extends AbstractWizardPage implements ControlListener {
private static final Image _WARNING_ICON = NavigatorPlugin.getImage("design/error_column.png"); // $NON-NLS-1$
private final RestColumn[] _restCols = {new RestColumn("Calendar Date", Calendar.ATTR_COL_CALENDAR_DATE, "$134", true), // $NLX-CvwRestPage.CalendarDate-1$
new RestColumn("Start Time", Calendar.ATTR_COL_START_TIME, "$144", false), // $NLX-CvwRestPage.StartTime-1$
new RestColumn("End Time", Calendar.ATTR_COL_END_TIME, "$146", false), // $NLX-CvwRestPage.EndTime-1$
new RestColumn("Subject", Calendar.ATTR_COL_SUBJECT, "$147", true), // $NLX-CvwRestPage.Subject-1$
new RestColumn("Chair", Calendar.ATTR_COL_CHAIR, "$153", false), // $NLX-CvwRestPage.Chair-1$
new RestColumn("Entry Icon", Calendar.ATTR_COL_ENTRY_ICON, "$149", false), // $NLX-CvwRestPage.EntryIcon-1$
new RestColumn("Alt Subject", Calendar.ATTR_COL_ALT_SUBJECT, "$151", false), // $NLX-CvwRestPage.AltSubject-1$
new RestColumn("Confidential", Calendar.ATTR_COL_CONFIDENTIAL, "$154", false), // $NLX-CvwRestPage.Confidential-1$
new RestColumn("Custom Data", Calendar.ATTR_COL_CUSTOM_DATA, "$UserData", false), // $NON-NLS-2$ $NLX-CvwRestPage.CustomData-1$
new RestColumn("Entry Type", Calendar.ATTR_COL_ENTRY_TYPE, "$152", false), // $NLX-CvwRestPage.EntryType-1$
new RestColumn("Status", Calendar.ATTR_COL_STATUS, "$160", false)}; // $NLX-CvwRestPage.Status-1$
private TableViewer _tableViewer;
private TableViewerColumn _editCol;
private String[][] _viewColumns;
public CvwRestPage(String pageName) {
super(pageName);
}
@Override
protected String getPageTitle() {
return "Calendar REST Service"; // $NLX-CvwRestPage.CalendarRESTService-1$
}
@Override
protected String getPageMsg() {
return "Choose the view columns containing the required calendar data items"; // $NLX-CvwRestPage.Choosetheviewcolumnscontainingthe-1$
}
@Override
public void createControl(Composite parent) {
super.createControl(parent);
Composite container = new Composite(parent, SWT.NONE);
container.setLayout(WizardUtils.createGridLayout(2, 5));
// Create the Table Viewer
int[] colWeights = {5, 40, 55};
_tableViewer = WizardUtils.createTableViewer(container, 2, 3, colWeights);
_tableViewer.setContentProvider(new ArrayContentProvider());
_tableViewer.getTable().addControlListener(this);
GridData gd = (GridData) _tableViewer.getTable().getLayoutData();
gd.heightHint = (_tableViewer.getTable().getItemHeight() * _restCols.length) + _tableViewer.getTable().getHeaderHeight();
ColumnViewerToolTipSupport.enableFor(_tableViewer, ToolTip.NO_RECREATE);
// Create the Warning column
TableViewerColumn col = new TableViewerColumn(_tableViewer, SWT.LEFT);
col.getColumn().setText("");
col.getColumn().setResizable(false);
col.setLabelProvider(new ColumnLabelProvider() {
@Override
public String getText(Object element) {
return null;
}
@Override
public Image getImage(Object element) {
if (((RestColumn)element).showWarning()) {
return _WARNING_ICON;
}
return null;
}
@Override
public String getToolTipText(Object element) {
if (((RestColumn)element).showWarning()) {
return "It is recommended to set a view column for this data item"; // $NLX-CvwRestPage.Itisrecommendedtosetaviewcolumnfo-1$
}
return null;
}
});
// Create the Data Item column
col = new TableViewerColumn(_tableViewer, SWT.LEFT);
col.getColumn().setText("Data Item"); // $NLX-CvwRestPage.DataItem-1$
col.getColumn().setResizable(false);
col.setLabelProvider(new ColumnLabelProvider() {
@Override
public String getText(Object element) {
return ((RestColumn)element).getLabel();
}
@Override
public String getToolTipText(Object element) {
return (((RestColumn)element).getTooltip());
}
});
// Create the View Column column
_editCol = new TableViewerColumn(_tableViewer, SWT.LEFT);
_editCol.getColumn().setText("View Column"); // $NLX-CvwRestPage.ViewColumn-1$
_editCol.getColumn().setResizable(false);
_editCol.setLabelProvider(new ColumnLabelProvider() {
@Override
public String getText(Object element) {
return ((RestColumn)element).getTextValue();
}
});
setControl(container);
setPageComplete(true);
}
@Override
protected void initialisePageState() {
// load the view data
loadViewData();
// Initialise the table viewer
_editCol.setEditingSupport(new CellEditingSupport());
_tableViewer.setInput(_restCols);
}
public void loadViewData() {
// Get the view column information
// Column names are in the first array
// Column titles in the second
CvwViewPage viewPage = ((CalendarViewDropWizard)this.getWizard()).getViewPage();
String[][] cols = viewPage.getViewColumns();
int colLen = cols == null ? 0 : cols[0].length;
// Copy the arrays leaving an empty string in the first position
_viewColumns = new String[2][colLen+1];
_viewColumns[0][0] = "";
_viewColumns[1][0] = "";
for (int i=0; i < colLen; i++) {
_viewColumns[0][i+1] = cols[0][i];
// check if title and name are the same
if (StringUtil.equals(cols[0][i], cols[1][i])) {
_viewColumns[1][i+1] = cols[1][i];
} else {
_viewColumns[1][i+1] = StringUtil.format("{0} ({1})", cols[1][i], cols[0][i]);
}
}
// Setup _restCols
List<String> colNames = Arrays.asList(_viewColumns[0]);
for(RestColumn col:_restCols) {
col.setValue(colNames.indexOf(col.getDefaultCol()));
}
}
public int getRestColCount() {
return _restCols.length;
}
public String getRestColAttr(int idx) {
return _restCols[idx].getAttr();
}
public String getRestColViewCol(int idx) {
if (_viewColumns != null) {
int val = _restCols[idx].getValue();
if (val >= 0 && val < _viewColumns[0].length) {
return _viewColumns[0][val];
}
}
return "";
}
@Override
public void controlMoved(ControlEvent arg0) {
}
@Override
public void controlResized(ControlEvent event) {
if (event.widget == _tableViewer.getTable()) {
Table table = (Table) event.widget;
table.getColumn(2).setWidth(table.getClientArea().width - table.getColumn(0).getWidth() - table.getColumn(1).getWidth());
}
}
private class RestColumn {
private final String _label;
private final String _attr;
private final String _defaultCol;
private final boolean _required;
private int _value;
public RestColumn(String label, String attr, String defaultCol, boolean required) {
_label = label;
_attr = attr;
_defaultCol = defaultCol;
_required = required;
_value = -1;
}
public String getLabel() {
return _label;
}
public String getAttr() {
return _attr;
}
public String getDefaultCol() {
return _defaultCol;
}
public String getTooltip() {
// Get the tooltip from the FacesRegistry
FacesRegistry fr = _wiz.project.getFacesRegistry();
if (fr != null) {
FacesDefinition fd = fr.findDef(EXT_LIB_NAMESPACE_URI, EXT_LIB_TAG_CALENDAR_JSON_LEGACY_SERVICE);
if (fd != null) {
return StringUtil.format("{0}\n{1}", _attr, PropertyPanelTooltipUtil.getTooltipString(fd, _attr)); // $NON-NLS-1$
}
}
return _attr;
}
public int getValue() {
return _value;
}
public String getTextValue() {
if (_value >= 0 && (_value < _viewColumns[1].length)) {
return _viewColumns[1][_value];
}
return "";
}
public void setValue(int value) {
_value = value;
}
public boolean showWarning() {
if (_required && _value <= 0) {
return true;
}
return false;
}
}
private class CellEditingSupport extends EditingSupport {
public CellEditingSupport() {
super(_tableViewer);
}
@Override
protected CellEditor getCellEditor(Object element) {
ComboBoxCellEditor ce = new ComboBoxCellEditor(_tableViewer.getTable(), _viewColumns[1], SWT.READ_ONLY);
((CCombo)ce.getControl()).setVisibleItemCount(10);
return ce;
}
@Override
protected boolean canEdit(Object element) {
return true;
}
@Override
protected Object getValue(Object element) {
return ((RestColumn)element).getValue();
}
@Override
protected void setValue(Object element, Object value) {
((RestColumn)element).setValue((Integer) value);
_tableViewer.refresh();
}
}
}