/*
* � Copyright IBM Corp. 2014
*
* 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.singlepageapp;
import java.text.MessageFormat;
import java.util.ArrayList;
import org.eclipse.jface.dialogs.IMessageProvider;
import org.eclipse.jface.dialogs.TitleAreaDialog;
import org.eclipse.jface.viewers.ArrayContentProvider;
import org.eclipse.jface.viewers.ColumnLabelProvider;
import org.eclipse.jface.viewers.DoubleClickEvent;
import org.eclipse.jface.viewers.IDoubleClickListener;
import org.eclipse.jface.viewers.TableViewer;
import org.eclipse.jface.viewers.TableViewerColumn;
import org.eclipse.jface.window.Window;
import org.eclipse.swt.SWT;
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.Control;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.swt.widgets.Text;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import com.ibm.designer.domino.xsp.utils.FormModelUtil;
import com.ibm.xsp.extlib.designer.tooling.constants.IExtLibAttrNames;
import com.ibm.xsp.extlib.designer.tooling.constants.IExtLibTagLib;
import com.ibm.xsp.extlib.designer.tooling.constants.IExtLibTagNames;
import com.ibm.xsp.extlib.designer.tooling.utils.WizardUtils;
import com.ibm.xsp.registry.FacesRegistry;
/**
* @author Gary Marjoram
*
*/
public class WizardSubPageNav extends WizardSubPage {
private Button newBtn;
private Button editBtn;
private Button deleteBtn;
private Button moveUpBtn;
private Button moveDownBtn;
private TableViewer tableViewer;
private ArrayList <NavTarget> targetList;
protected WizardSubPageNav(WizardDataSub pd) {
super(pd);
targetList = new ArrayList<NavTarget>();
}
@Override
public void createControl(Composite parent) {
container = new Composite(parent, SWT.NONE);
GridLayout layout = WizardUtils.createGridLayout(2, 5);
container.setLayout(layout);
tableViewer = WizardUtils.createTableViewer(container, 1, 2, null);
// Create Label column
TableViewerColumn col = new TableViewerColumn(tableViewer, SWT.LEFT);
col.getColumn().setText("Entry"); // $NLX-WizardSubPageNav.Entry-1$
col.getColumn().setResizable(false);
col.setLabelProvider(new ColumnLabelProvider() {
@Override
public String getText(Object element) {
return ((NavTarget)element).label;
}
});
// Create Target the column
col = new TableViewerColumn(tableViewer, SWT.LEFT);
col.getColumn().setText("Target Page"); // $NLX-WizardSubPageNav.TargetPage-1$
col.getColumn().setResizable(false);
col.setLabelProvider(new ColumnLabelProvider() {
@Override
public String getText(Object element) {
if (((NavTarget)element).page >= 0) {
return wizardData.getPageNameList()[((NavTarget)element).page];
}
return "";
}
});
tableViewer.setContentProvider(new ArrayContentProvider());
tableViewer.addDoubleClickListener(new IDoubleClickListener() {
public void doubleClick(DoubleClickEvent event) {
editNavEntry();
}
});
Composite buttonComposite = new Composite(container, SWT.NONE);
layout = new GridLayout();
layout.numColumns = 1;
buttonComposite.setLayout(layout);
newBtn = WizardUtils.createButton(buttonComposite, "New", this); // $NLX-WizardSubPageNav.New-1$
deleteBtn = WizardUtils.createButton(buttonComposite, "Delete", this); // $NLX-WizardSubPageNav.Delete-1$
editBtn = WizardUtils.createButton(buttonComposite, "Edit", this); // $NLX-WizardSubPageNav.Edit-1$
moveUpBtn = WizardUtils.createButton(buttonComposite, "Move Up", this); // $NLX-WizardSubPageNav.MoveUp-1$
moveDownBtn = WizardUtils.createButton(buttonComposite, "Move Down", this); // $NLX-WizardSubPageNav.MoveDown-1$
GridData buttonLayoutData = new GridData(GridData.HORIZONTAL_ALIGN_BEGINNING | GridData.VERTICAL_ALIGN_BEGINNING);
buttonComposite.setLayoutData(buttonLayoutData);
refreshButtonState();
setControl(container);
setPageComplete(true);
}
//
// Displays the Edit Entry Dialog
//
private void editNavEntry() {
int sel = tableViewer.getTable().getSelectionIndex();
if (sel >= 0) {
EditNavigatorDialog dialog = new EditNavigatorDialog(getShell(), "Edit Application Navigator Entry", "Edit Application Navigator Entry details.", targetList.get(sel)); // $NLX-WizardSubPageNav.EditApplicationNavigatorEntry-1$ $NLX-WizardSubPageNav.EditApplicationNavigatorEntrydeta-2$
dialog.create();
if (dialog.open() == Window.OK) {
NavTarget nt;
nt = dialog.getNavTarget();
targetList.set(sel, nt);
tableViewer.setInput(targetList.toArray());
tableViewer.getTable().setSelection(sel);
}
}
}
@Override
public void refreshData() {
super.refreshData();
setMessage(getStepTxt() + MessageFormat.format("Configure the Application Navigator for the \"{0}\" Application Page.", pageData.name), IMessageProvider.INFORMATION); // $NLX-WizardSubPageNav.ConfiguretheApplicationNavigatorf-1$
tableViewer.setInput(targetList.toArray());
}
private void refreshButtonState() {
boolean state = tableViewer.getTable().getSelectionIndex() >= 0;
deleteBtn.setEnabled(state);
editBtn.setEnabled(state);
moveUpBtn.setEnabled(state);
moveDownBtn.setEnabled(state);
}
@Override
public void widgetSelected(SelectionEvent event) {
NavTarget nt;
int sel = tableViewer.getTable().getSelectionIndex();
if (event.widget == newBtn) {
EditNavigatorDialog dialog = new EditNavigatorDialog(getShell(), "New Application Navigator Entry", "Enter new Application Navigator Entry details.", null); // $NLX-WizardSubPageNav.NewApplicationNavigatorEntry-1$ $NLX-WizardSubPageNav.EnternewApplicationNavigatorEntry-2$
dialog.create();
if (dialog.open() == Window.OK) {
nt = dialog.getNavTarget();
targetList.add(nt);
tableViewer.setInput(targetList.toArray());
tableViewer.getTable().setSelection(targetList.size()-1);
}
} else if (event.widget == deleteBtn) {
if (sel >=0) {
targetList.remove(sel);
tableViewer.setInput(targetList.toArray());
tableViewer.getTable().setSelection(sel <= targetList.size()-1 ? sel : targetList.size()-1);
}
} else if (event.widget == editBtn) {
editNavEntry();
} else if (event.widget == moveUpBtn) {
if (sel > 0) {
NavTarget tmp = targetList.get(sel-1);
targetList.set(sel-1, targetList.get(sel));
targetList.set(sel, tmp);
tableViewer.setInput(targetList.toArray());
tableViewer.getTable().setSelection(sel-1);
}
} else if (event.widget == moveDownBtn) {
if (sel < targetList.size()-1) {
NavTarget tmp = targetList.get(sel+1);
targetList.set(sel+1, targetList.get(sel));
targetList.set(sel, tmp);
tableViewer.setInput(targetList.toArray());
tableViewer.getTable().setSelection(sel+1);
}
}
refreshButtonState();
}
public int getNavItemCount() {
return targetList.size();
}
public String getNavItemLabel(int idx) {
if (idx < getNavItemCount()) {
return targetList.get(idx).label;
}
return "";
}
public int getNavItemPage(int idx) {
if (idx < getNavItemCount()) {
return targetList.get(idx).page;
}
return -1;
}
@Override
public void pageDeleted(int idx) {
for (int i=0; i < targetList.size(); i++) {
NavTarget nt = targetList.get(i);
if (nt.page == idx) {
nt.page = -1;
} else if (nt.page > idx) {
nt.page -= 1;
}
}
}
@Override
public void addElementMarkup(Element base, FacesRegistry registry) {
Document doc = base.getOwnerDocument();
Element outline = FormModelUtil.createElement(doc, registry, IExtLibTagLib.EXT_LIB_NAMESPACE_URI, IExtLibTagNames.EXT_LIB_TAG_OUTLINE);
Element treeNodes = FormModelUtil.createElement(doc, registry, IExtLibTagLib.EXT_LIB_NAMESPACE_URI, IExtLibTagNames.EXT_LIB_TAG_THIS_TREE_NODES);
for (int i=0; i < getNavItemCount(); i++) {
Element leaf = FormModelUtil.createElement(doc, registry, IExtLibTagLib.EXT_LIB_NAMESPACE_URI, IExtLibTagNames.EXT_LIB_TAG_BASIC_LEAF_NODE);
FormModelUtil.setAttribute(leaf, IExtLibAttrNames.EXT_LIB_ATTR_LABEL, getNavItemLabel(i));
if (getNavItemPage(i) >= 0) {
FormModelUtil.setAttribute(leaf, IExtLibAttrNames.EXT_LIB_ATTR_HREF, "#" + wizardData.getSubPageName(getNavItemPage(i)));
}
treeNodes.appendChild(leaf);
}
outline.appendChild(treeNodes);
base.appendChild(outline);
}
//
// Class for Edit/Add Navigator Item
//
private class EditNavigatorDialog extends TitleAreaDialog {
private Text txtLabel;
private WizardPageCombo comboTarget;
private String label;
private int page;
private String dialogTitle;
private String dialogDesc;
private NavTarget navTarget;
public EditNavigatorDialog(Shell parentShell, String title, String desc, NavTarget nt) {
super(parentShell);
dialogTitle = title;
dialogDesc = desc;
if (nt == null) {
navTarget = new NavTarget("", -1);
} else {
navTarget = nt;
}
}
@Override
public void create() {
super.create();
setTitle(dialogTitle);
setMessage(dialogDesc, IMessageProvider.INFORMATION);
}
@Override
protected Control createDialogArea(Composite parent) {
Composite area = (Composite) super.createDialogArea(parent);
Composite container = new Composite(area, SWT.NONE);
container.setLayoutData(new GridData(GridData.FILL_BOTH));
GridLayout layout = new GridLayout(2, false);
container.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
container.setLayout(layout);
WizardUtils.createLabel(container, "Entry :", 1); // $NLX-WizardSubPageNav.Entry.1-1$
txtLabel = WizardUtils.createText(container);
txtLabel.setText(navTarget.label);
WizardUtils.createLabel(container, "Target Page :", 1); // $NLX-WizardSubPageNav.TargetPage.1-1$
comboTarget = new WizardPageCombo(container, 1, pageData, true, WizardData.PAGE_TYPE_INVALID);
comboTarget.refresh();
comboTarget.setSelectedIndex(navTarget.page);
return area;
}
@Override
protected boolean isResizable() {
return true;
}
// save content of the fields because they get disposed
// as soon as the Dialog closes
private void saveInput() {
label = txtLabel.getText();
page = comboTarget.getSelectedIndex();
}
@Override
protected void okPressed() {
saveInput();
super.okPressed();
}
public NavTarget getNavTarget() {
return new NavTarget(label, page);
}
}
//
// Models a Navigation Item
//
private class NavTarget {
public String label;
public int page;
public NavTarget(String lbl, int pg) {
label = lbl;
page = pg;
}
}
}