/*
* � 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 org.eclipse.jface.dialogs.PageChangingEvent;
import org.eclipse.swt.widgets.Shell;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.CDATASection;
import com.ibm.commons.util.StringUtil;
import com.ibm.designer.domino.ide.resources.extensions.DesignerProject;
import com.ibm.designer.domino.ide.resources.project.IDominoDesignerProject;
import com.ibm.designer.domino.xsp.api.panels.PanelExtraData;
import com.ibm.designer.domino.xsp.utils.FormModelUtil;
import com.ibm.xsp.extlib.designer.tooling.utils.AbstractWizard;
import com.ibm.xsp.extlib.designer.tooling.utils.ExtLibToolingUtil;
import com.ibm.xsp.extlib.designer.tooling.utils.WizardUtils;
import com.ibm.xsp.registry.FacesRegistry;
import static com.ibm.designer.domino.constants.XSPAttributeNames.*;
import static com.ibm.designer.domino.constants.XSPTagNames.*;
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.*;
import static com.ibm.xsp.extlib.designer.tooling.visualizations.AbstractCommonControlVisualizer.*;
/**
* @author Gary Marjoram
*
*/
public class CalendarViewDropWizard extends AbstractWizard {
private static final String _WIZARD_TITLE = "iNotes Calendar Wizard"; // $NLX-CalendarViewDropWizard.iNotesCalendarWizard-1$
private static final String _BUTTON_ID = "%BUTTON-ID%"; // $NON-NLS-1$
private static final String _SERVER_NAME = "%SERVER-NAME%"; // $NON-NLS-1$
private static final String _DATABASE_NAME = "%DATABASE-NAME%"; // $NON-NLS-1$
private static final String _TARGET_XPAGE = "%TARGET-XPAGE%"; // $NON-NLS-1$
private final PanelExtraData _panelData;
private final Document _doc;
private final DesignerProject _prj;
private final FacesRegistry _reg;
private final CvwEventPage _eventPage;
private final CvwViewPage _viewPage;
private final CvwRestPage _restPage;
private final CvwActionPage _actionPage;
public CalendarViewDropWizard(Shell shell, PanelExtraData panelData) {
super(null);
project = (IDominoDesignerProject) panelData.getDesignerProject();
_panelData = panelData;
_doc = panelData.getDocument();
_prj = panelData.getDesignerProject();
_reg = _prj.getFacesRegistry();
// Create the Wizard Pages
_viewPage = new CvwViewPage("viewPage"); // $NON-NLS-1$
_restPage = new CvwRestPage("restPage"); // $NON-NLS-1$
_actionPage = new CvwActionPage("actionPage"); // $NON-NLS-1$
_eventPage = new CvwEventPage("eventPage"); // $NON-NLS-1$
}
@Override
protected String getTitle() {
return _WIZARD_TITLE;
}
@Override
public void addPages() {
super.addPages();
// Add the four Wizard Pages
addPage(_viewPage);
addPage(_restPage);
addPage(_actionPage);
addPage(_eventPage);
}
@Override
public boolean performFinish() {
if (_viewPage.isPageCurrent() && _viewPage.hasChanged()) {
// User clicked finsh after selecting a view. Load the view data so
// that we can generate markup with view column defaults
_restPage.loadViewData();
}
generateMarkup();
return true;
}
@Override
public boolean canFinish() {
return true;
}
public PanelExtraData getPanelData() {
return _panelData;
}
public CvwViewPage getViewPage() {
return _viewPage;
}
@Override
public void handlePageChanging(PageChangingEvent event) {
event.doit = true;
advancing = false;
if (event.getCurrentPage() == _viewPage) {
if (event.getTargetPage() == _restPage) {
if (_viewPage.hasChanged()) {
// We want the rest page to reload it's data
_restPage.setFirstDisplay(true);
_viewPage.setHasChanged(false);
}
advancing = true;
}
} else if (event.getCurrentPage() == _restPage) {
if (event.getTargetPage() == _actionPage) {
advancing = true;
}
} else if (event.getCurrentPage() == _actionPage) {
if (event.getTargetPage() == _eventPage) {
advancing = true;
}
}
}
private void generateMarkup() {
CDATASection cdataSection;
// Add the extlib namespace to the document
_panelData.getDocument().getDocumentElement().setAttribute("xmlns:" + XE_PREFIX, EXT_LIB_NAMESPACE_URI); // $NON-NLS-1$
String initialDateRange = _actionPage.getInitialDateRange().getId();
// Create the panel container
Element panelEl = FormModelUtil.createElement(_doc, _reg, XP_CORE_NAMESPACE, XSP_TAG_PANEL);
FormModelUtil.ensureUniqueIdsGenerateIfRequested(_doc, panelEl, _reg, true);
String panelId = panelEl.getAttribute(XSP_ATTR_ID);
String panelIdAddition = "For" + WizardUtils.capitalizeFirstLetter(panelId); // $NON-NLS-1$
String btnId = "";
if (_eventPage.addDeleteEvent()) {
// Add a hidden button for deletions
Element btnEl = FormModelUtil.createElement(_doc, _reg, XP_CORE_NAMESPACE, XSP_TAG_BUTTON);
btnEl.setAttribute(XSP_ATTR_STYLE, "display:none"); // $NON-NLS-1$
FormModelUtil.ensureUniqueIdsGenerateIfRequested(_doc, btnEl, _reg, true);
btnId = btnEl.getAttribute(XSP_ATTR_ID);
Element eventEl = FormModelUtil.createElement(_doc, _reg, XP_CORE_NAMESPACE, XSP_TAG_EVENT_HANDLER);
eventEl.setAttribute(XSP_ATTR_EVENT, "onclick"); // $NON-NLS-1$
eventEl.setAttribute(XSP_ATTR_SUBMIT, "true"); // $NON-NLS-1$
eventEl.setAttribute(XSP_ATTR_REFRESH_MODE, "partial"); // $NON-NLS-1$
eventEl.setAttribute("refreshId", panelId); // $NON-NLS-1$
Element actionEl = FormModelUtil.createElement(_doc, _reg, XP_CORE_NAMESPACE, "this.action"); // $NON-NLS-1$
Element actionGroupEl = FormModelUtil.createElement(_doc, _reg, XP_CORE_NAMESPACE, "actionGroup"); // $NON-NLS-1$
if (StringUtil.isNotEmpty(_eventPage.getDeleteEventConfirmMsg())) {
Element confirmEl = FormModelUtil.createElement(_doc, _reg, XP_CORE_NAMESPACE, "confirm"); // $NON-NLS-1$
confirmEl.setAttribute(XSP_ATTR_VALIDATOR_MESSAGE, _eventPage.getDeleteEventConfirmMsg());
actionGroupEl.appendChild(confirmEl);
}
Element executeEl = FormModelUtil.createElement(_doc, _reg, XP_CORE_NAMESPACE, "executeScript"); // $NON-NLS-1$
Element scriptEl = FormModelUtil.createElement(_doc, _reg, XP_CORE_NAMESPACE, "this.script"); // $NON-NLS-1$
String deleteHandler;
if (StringUtil.isEmpty(_viewPage.getServerName()) && StringUtil.isEmpty(_viewPage.getDbName())) {
deleteHandler = ExtLibToolingUtil.getFileContents("cvwDeleteHandlerLocal.tpl"); // $NON-NLS-1$
} else {
deleteHandler = ExtLibToolingUtil.getFileContents("cvwDeleteHandler.tpl").replace(_SERVER_NAME, _viewPage.getServerName()).replace(_DATABASE_NAME, _viewPage.getDbName()); // $NON-NLS-1$
}
cdataSection = _doc.createCDATASection("#{javascript:" + deleteHandler + "}"); // $NON-NLS-1$
scriptEl.appendChild(cdataSection);
executeEl.appendChild(scriptEl);
actionGroupEl.appendChild(executeEl);
actionEl.appendChild(actionGroupEl);
eventEl.appendChild(actionEl);
btnEl.appendChild(eventEl);
panelEl.appendChild(btnEl);
}
if (_actionPage.isActionMarkupRequired()) {
// Create the Table
Element tableEl = FormModelUtil.createElement(_doc, _reg, XP_CORE_NAMESPACE, XSP_TAG_TABLE);
tableEl.setAttribute(XSP_ATTR_STYLE, "width:100%"); // $NON-NLS-1$
panelEl.appendChild(tableEl);
// Create the <tr>
Element trEl = FormModelUtil.createElement(_doc, _reg, XP_CORE_NAMESPACE, XSP_TAG_TABLE_ROW);
tableEl.appendChild(trEl);
// Create the 3 <td>s
Element tdEl = FormModelUtil.createElement(_doc, _reg, XP_CORE_NAMESPACE, XSP_TAG_TABLE_CELL);
tdEl.setAttribute(XSP_ATTR_STYLE, "width:20%"); // $NON-NLS-1$
trEl.appendChild(tdEl);
tdEl = FormModelUtil.createElement(_doc, _reg, XP_CORE_NAMESPACE, XSP_TAG_TABLE_CELL);
tdEl.setAttribute(XSP_ATTR_STYLE, "width:60%; text-align: center"); // $NON-NLS-1$
trEl.appendChild(tdEl);
// Create the date-range actions if required
if (_actionPage.isDateRangeMarkupRequired()) {
createDateRangeImageSelect(tdEl, panelId, panelIdAddition, initialDateRange);
}
tdEl = FormModelUtil.createElement(_doc, _reg, XP_CORE_NAMESPACE, XSP_TAG_TABLE_CELL);
tdEl.setAttribute(XSP_ATTR_STYLE, "width:20%; text-align: right; padding-right:5px;"); // $NON-NLS-1$
trEl.appendChild(tdEl);
// Create the display format actions if required
if (_actionPage.getDisplayFormat()) {
createDisplayFormatImageSelect(tdEl, panelId, panelIdAddition);
}
}
// Create and add the REST element to the panel
Element restEl = createRestElement();
panelEl.appendChild(restEl);
// Get the calendarView that's already been created by the Wizard initialisation
Element calendarEl = (Element) _panelData.getNode();
WizardUtils.setAttributeIfNotEmpty(calendarEl, "storeComponentId", restEl.getAttribute(XSP_ATTR_ID)); // $NON-NLS-1$
calendarEl.setAttribute(XSP_ATTR_STYLE, "width:100%"); // $NON-NLS-1$
calendarEl.setAttribute(XSP_ATTR_TYPE, "#{javascript:viewScope.calendarViewType" + panelIdAddition + " || '" + initialDateRange + "'}"); // $NON-NLS-1$
if (_actionPage.getDisplayFormat()) {
Element summaryEl = FormModelUtil.createElement(_doc, _reg, EXT_LIB_NAMESPACE_URI, "this.summarize"); // $NON-NLS-1$
cdataSection = _doc.createCDATASection("#{javascript:summarize = viewScope.calendarViewDisplay" + panelIdAddition + " == \"true\";}"); // $NON-NLS-1$ $NON-NLS-2$
summaryEl.appendChild(cdataSection);
calendarEl.appendChild(summaryEl);
}
// onDeleteEntry
if (_eventPage.addDeleteEvent()) {
Element onDeleteEl = FormModelUtil.createElement(_doc, _reg, EXT_LIB_NAMESPACE_URI, "this.onDeleteEntry"); // $NON-NLS-1$
String onDeleteEntry = ExtLibToolingUtil.getFileContents("cvwOnDeleteEntry.tpl").replace(_BUTTON_ID, btnId); // $NON-NLS-1$
cdataSection = _doc.createCDATASection(onDeleteEntry);
onDeleteEl.appendChild(cdataSection);
calendarEl.appendChild(onDeleteEl);
}
// onOpenEntry
if (_eventPage.addOpenEvent()) {
Element onOpenEl = FormModelUtil.createElement(_doc, _reg, EXT_LIB_NAMESPACE_URI, "this.onOpenEntry"); // $NON-NLS-1$
String onOpenEntry = ExtLibToolingUtil.getFileContents("cvwOnOpenEntry.tpl").replace(_TARGET_XPAGE, _eventPage.getOpenEventXPage()); // $NON-NLS-1$
cdataSection = _doc.createCDATASection(onOpenEntry);
onOpenEl.appendChild(cdataSection);
calendarEl.appendChild(onOpenEl);
}
// onRescheduleEntry
if (_eventPage.addReschedEvent()) {
Element onReschedEl = FormModelUtil.createElement(_doc, _reg, EXT_LIB_NAMESPACE_URI, "this.onRescheduleEntry"); // $NON-NLS-1$
String onReschedEntry = ExtLibToolingUtil.getFileContents("cvwOnRescheduleEntry.tpl").replace(_TARGET_XPAGE, _eventPage.getReschedEventXPage()); // $NON-NLS-1$
cdataSection = _doc.createCDATASection(onReschedEntry);
onReschedEl.appendChild(cdataSection);
calendarEl.appendChild(onReschedEl);
}
// onNewEntry
if (_eventPage.addNewEvent()) {
Element onNewEl = FormModelUtil.createElement(_doc, _reg, EXT_LIB_NAMESPACE_URI, "this.onNewEntry"); // $NON-NLS-1$
String onNewEntry = ExtLibToolingUtil.getFileContents("cvwOnNewEntry.tpl").replace(_TARGET_XPAGE, _eventPage.getNewEventXPage()); // $NON-NLS-1$
cdataSection = _doc.createCDATASection(onNewEntry);
onNewEl.appendChild(cdataSection);
calendarEl.appendChild(onNewEl);
}
// Add the calendarView to the panel
panelEl.appendChild(calendarEl);
// Replace the node in the panelData so we drop a panel instead of a calendarView
_panelData.setNode(panelEl);
}
private Element createRestElement() {
Element restEl = FormModelUtil.createElement(_doc, _reg, EXT_LIB_NAMESPACE_URI, EXT_LIB_TAG_REST_SERVICE);
restEl.setAttribute(EXT_LIB_ATTR_PATH_INFO, "/inoteslegacyjson"); // $NON-NLS-1$
Element serviceEl = FormModelUtil.createElement(_doc, _reg, EXT_LIB_NAMESPACE_URI, EXT_LIB_TAG_THIS_SERVICE);
Element jsonServiceEl = FormModelUtil.createElement(_doc, _reg, EXT_LIB_NAMESPACE_URI, EXT_LIB_TAG_CALENDAR_JSON_LEGACY_SERVICE);
WizardUtils.setAttributeIfNotEmpty(jsonServiceEl, XSP_ATTR_DATABASE_NAME, _viewPage.getFullDbName());
WizardUtils.setAttributeIfNotEmpty(jsonServiceEl, XSP_ATTR_VIEW_NAME, _viewPage.getViewName());
for (int i=0; i < _restPage.getRestColCount(); i++) {
WizardUtils.setAttributeIfNotEmpty(jsonServiceEl, _restPage.getRestColAttr(i), _restPage.getRestColViewCol(i));
}
serviceEl.appendChild(jsonServiceEl);
restEl.appendChild(serviceEl);
// Give the control a unique id, the calendarView will need this
FormModelUtil.ensureUniqueIds(_doc, restEl, _reg);
return restEl;
}
private void createDateRangeImageSelect(Element root, String panelId, String panelIdAddition, String format) {
Element isEl = FormModelUtil.createElement(_doc, _reg, EXT_LIB_NAMESPACE_URI, "djextImageSelect"); // $NON-NLS-1$
root.appendChild(isEl);
isEl.setAttribute(EXT_LIB_ATTR_VALUE, "#{viewScope.calendarViewType" + panelIdAddition + "}"); // $NON-NLS-1$
isEl.setAttribute(XSP_ATTR_DEFAULT_VALUE, format);
Element thisImageValuesEl = FormModelUtil.createElement(_doc, _reg, EXT_LIB_NAMESPACE_URI, "this.imageValues"); // $NON-NLS-1$
isEl.appendChild(thisImageValuesEl);
if (_actionPage.getToday()) {
thisImageValuesEl.appendChild(createSelectImageElement("/.ibmxspres/.extlib/icons/calendar/1_Day_selected_24.gif", // $NON-NLS-1$
"/.ibmxspres/.extlib/icons/calendar/1_Day_deselected_24.gif", // $NON-NLS-1$
CalendarFormat.TODAY.getLabel(), CalendarFormat.TODAY.getId()));
}
if (_actionPage.getTodayTomorrow()) {
thisImageValuesEl.appendChild(createSelectImageElement("/.ibmxspres/.extlib/icons/calendar/2_Days_selected_24.gif", // $NON-NLS-1$
"/.ibmxspres/.extlib/icons/calendar/2_Days_deselected_24.gif", // $NON-NLS-1$
CalendarFormat.TODAY_TOMORROW.getLabel(), CalendarFormat.TODAY_TOMORROW.getId()));
}
if (_actionPage.getWorkWeek()) {
thisImageValuesEl.appendChild(createSelectImageElement("/.ibmxspres/.extlib/icons/calendar/1_Work_Week_selected_24.gif", // $NON-NLS-1$
"/.ibmxspres/.extlib/icons/calendar/1_Work_Week_deselected_24.gif", // $NON-NLS-1$
CalendarFormat.WORK_WEEK.getLabel(), CalendarFormat.WORK_WEEK.getId()));
}
if (_actionPage.getFullWeek()) {
thisImageValuesEl.appendChild(createSelectImageElement("/.ibmxspres/.extlib/icons/calendar/1_Week_selected_24.gif", // $NON-NLS-1$
"/.ibmxspres/.extlib/icons/calendar/1_Week_deselected_24.gif", // $NON-NLS-1$
CalendarFormat.FULL_WEEK.getLabel(), CalendarFormat.FULL_WEEK.getId()));
}
if (_actionPage.getTwoWeeks()) {
thisImageValuesEl.appendChild(createSelectImageElement("/.ibmxspres/.extlib/icons/calendar/2_Weeks_selected_24.gif", // $NON-NLS-1$
"/.ibmxspres/.extlib/icons/calendar/2_Weeks_deselected_24.gif", // $NON-NLS-1$
CalendarFormat.TWO_WEEKS.getLabel(), CalendarFormat.TWO_WEEKS.getId()));
}
if (_actionPage.getMonth()) {
thisImageValuesEl.appendChild(createSelectImageElement("/.ibmxspres/.extlib/icons/calendar/Month_selected_24.gif", // $NON-NLS-1$
"/.ibmxspres/.extlib/icons/calendar/Month_deselected_24.gif", // $NON-NLS-1$
CalendarFormat.MONTH.getLabel(), CalendarFormat.MONTH.getId()));
}
if (_actionPage.getYear()) {
thisImageValuesEl.appendChild(createSelectImageElement("/.ibmxspres/.extlib/icons/calendar/All_Entries_selected_24.gif", // $NON-NLS-1$
"/.ibmxspres/.extlib/icons/calendar/All_Entries_deselected_24.gif", // $NON-NLS-1$
CalendarFormat.YEAR.getLabel(), CalendarFormat.YEAR.getId()));
}
Element eventHandler = FormModelUtil.createElement(_doc, _reg, XP_CORE_NAMESPACE, "eventHandler"); // $NON-NLS-1$
isEl.appendChild(eventHandler);
eventHandler.setAttribute(XSP_ATTR_EVENT, "onClick"); // $NON-NLS-1$
eventHandler.setAttribute(XSP_ATTR_SUBMIT, "true"); // $NON-NLS-1$
eventHandler.setAttribute(XSP_ATTR_REFRESH_MODE, "partial"); // $NON-NLS-1$
eventHandler.setAttribute(EXT_LIB_ATTR_REFRESH_ID, panelId);
}
private void createDisplayFormatImageSelect(Element root, String panelId, String panelIdAddition) {
Element isEl = FormModelUtil.createElement(_doc, _reg, EXT_LIB_NAMESPACE_URI, "djextImageSelect"); // $NON-NLS-1$
root.appendChild(isEl);
isEl.setAttribute(EXT_LIB_ATTR_VALUE, "#{viewScope.calendarViewDisplay" + panelIdAddition + "}"); // $NON-NLS-1$
isEl.setAttribute(XSP_ATTR_DEFAULT_VALUE, "false"); // $NON-NLS-1$
Element thisImageValuesEl = FormModelUtil.createElement(_doc, _reg, EXT_LIB_NAMESPACE_URI, "this.imageValues"); // $NON-NLS-1$
isEl.appendChild(thisImageValuesEl);
thisImageValuesEl.appendChild(createSelectImageElement("/.ibmxspres/.extlib/icons/calendar/timeblock_selected_1.gif", // $NON-NLS-1$
"/.ibmxspres/.extlib/icons/calendar/timeblock_deselected_1.gif", // $NON-NLS-1$
"Calendar Time", "false")); // $NON-NLS-2$ $NLX-CalendarViewDropWizard.CalendarTime-1$
thisImageValuesEl.appendChild(createSelectImageElement("/.ibmxspres/.extlib/icons/calendar/list_selected_1.gif", // $NON-NLS-1$
"/.ibmxspres/.extlib/icons/calendar/list_deselected_1.gif", // $NON-NLS-1$
"Calendar List", "true")); // $NON-NLS-2$ $NLX-CalendarViewDropWizard.CalendarList-1$
Element eventHandler = FormModelUtil.createElement(_doc, _reg, XP_CORE_NAMESPACE, "eventHandler"); // $NON-NLS-1$
isEl.appendChild(eventHandler);
eventHandler.setAttribute(XSP_ATTR_EVENT, "onClick"); // $NON-NLS-1$
eventHandler.setAttribute(XSP_ATTR_SUBMIT, "true"); // $NON-NLS-1$
eventHandler.setAttribute(XSP_ATTR_REFRESH_MODE, "partial"); // $NON-NLS-1$
eventHandler.setAttribute(EXT_LIB_ATTR_REFRESH_ID, panelId);
}
private Element createSelectImageElement(String selImage, String deselImage, String imageAlt, String selectedValue) {
Element selectEl = FormModelUtil.createElement(_doc, _reg, EXT_LIB_NAMESPACE_URI, "selectImage"); // $NON-NLS-1$
selectEl.setAttribute(EXT_LIB_ATTR_SELECTED_IMAGE, selImage);
selectEl.setAttribute(XSP_ATTR_IMAGE, deselImage);
selectEl.setAttribute(EXT_LIB_ATTR_IMAGE_ALT, imageAlt);
selectEl.setAttribute(EXT_LIB_ATTR_SELECTED_VALUE, selectedValue);
return selectEl;
}
}