/*
* � 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.applicationlayout;
import static com.ibm.xsp.extlib.designer.tooling.constants.IExtLibAttrNames.*;
import static com.ibm.xsp.extlib.designer.tooling.constants.IExtLibRegistry.*;
import static com.ibm.xsp.extlib.designer.tooling.constants.IExtLibTagNames.*;
import java.util.HashMap;
import java.util.Map;
import org.eclipse.core.resources.IFile;
import org.eclipse.jface.dialogs.IMessageProvider;
import org.eclipse.jface.dialogs.MessageDialog;
import org.eclipse.jface.layout.GridDataFactory;
import org.eclipse.jface.wizard.WizardPage;
import org.eclipse.swt.SWT;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import com.ibm.commons.iloader.node.DataNode;
import com.ibm.commons.iloader.node.IClassDef;
import com.ibm.commons.iloader.node.ILoader;
import com.ibm.commons.iloader.node.collections.SingleCollection;
import com.ibm.commons.swt.SWTLayoutUtils;
import com.ibm.commons.swt.data.controls.DCComboBox;
import com.ibm.commons.swt.data.controls.DCPanel;
import com.ibm.commons.swt.data.controls.DCUtils;
import com.ibm.commons.util.StringUtil;
import com.ibm.designer.domino.product.ProductUtil;
import com.ibm.designer.domino.xsp.api.panels.IPanelExtraData;
import com.ibm.designer.domino.xsp.api.panels.complex.ComplexPanelComposite;
import com.ibm.designer.domino.xsp.api.panels.complex.IComplexPanel;
import com.ibm.designer.domino.xsp.api.util.XPagesPropertiesViewUtils;
import com.ibm.xsp.extlib.designer.common.properties.ContentFacadeFactory;
import com.ibm.xsp.extlib.designer.common.properties.PreservingProperties;
import com.ibm.xsp.extlib.designer.common.properties.PreservingProperties.ContentFacade;
import com.ibm.xsp.extlib.designer.tooling.palette.applicationlayout.AlwStartPage.LayoutConfig;
import com.ibm.xsp.extlib.designer.tooling.panels.applicationlayout.ConfigurationField;
import com.ibm.xsp.extlib.designer.tooling.utils.ExtLibRegistryUtil;
import com.ibm.xsp.extlib.designer.tooling.utils.ExtLibToolingLogger;
import com.ibm.xsp.extlib.designer.tooling.utils.ExtLibToolingUtil;
import com.ibm.xsp.extlib.designer.tooling.utils.WizardUtils;
import com.ibm.xsp.library.StandardRegistryMaintainer;
import com.ibm.xsp.registry.FacesRegistry;
/**
* @author Gary Marjoram
*
*/
public class AlwPropertiesPage extends WizardPage {
private Composite _mainPanel = null;
private boolean _propsOpenInEditor = false;
private LayoutConfig _currLayout = null;
private DCComboBox _combo;
private ComplexPanelComposite _dynamicComposite;
private IPanelExtraData _panelData;
private DataNode _dnAppLayout;
/*
* Constructor
*/
protected AlwPropertiesPage() {
super("");
setMessage("Choose the options for this configuration.", IMessageProvider.INFORMATION); // $NLX-AlwPropertiesPage.Choosetheoptionsforthisconfigurat-1$
}
/*
* Function invoked to create the wizard UI
*/
@Override
public void createControl(final Composite root) {
DCPanel parent = new DCPanel(root, SWT.NONE);
GridLayout layout = WizardUtils.createGridLayout(1, 0);
layout.marginHeight = 0;
layout.marginWidth = 0;
layout.verticalSpacing = 0;
layout.horizontalSpacing = 0;
parent.setLayout(layout);
_panelData = ((ApplicationLayoutDropWizard) getWizard()).getPanelData();
_propsOpenInEditor = ExtLibToolingUtil.isPropertiesOpenInEditor(_panelData.getDesignerProject());
initData(parent);
// Create the main panel
_mainPanel = new Composite(parent, SWT.NONE);
layout = SWTLayoutUtils.createLayoutDefaultSpacing(1);
_mainPanel.setLayout(layout);
GridData data = SWTLayoutUtils.createGDFill();
data.horizontalSpan = 1;
_mainPanel.setLayoutData(data);
// Create the dynamic panel
_dynamicComposite = new ComplexPanelComposite(_mainPanel, SWT.NONE);
GridData gd = GridDataFactory.copyData(data);
_dynamicComposite.updatePanelData(_panelData);
addingThemeControlInfo();
_dynamicComposite.setLayoutData(gd);
initControlDataNode(_dynamicComposite, _dnAppLayout.getClassDef());
// Create the hidden combo for changing configurations
_combo = new DCComboBox(_mainPanel, SWT.DROP_DOWN | SWT.READ_ONLY , "applayout.config.id"); //$NON-NLS-1$
ConfigurationField configField = new ConfigurationField(_dnAppLayout, StandardRegistryMaintainer.getStandardRegistry());
_combo.setAttributeName(configField.getName());
_combo.setLookup(configField.getLookup());
_combo.setVisible(false);
parent.layout(true);
parent.pack();
setControl(parent);
setPageComplete(true);
}
/*
* Initialises the parent datanode
*/
private void initData(final Composite parent) {
Node appLayoutNode = _panelData.getNode();
ILoader loader = XPagesPropertiesViewUtils.getXPagesMultiDomLoader(_panelData.getDesignerProject());
DataNode dn = DCUtils.findDataNode(parent, true);
IClassDef appLayoutClassDef = ExtLibRegistryUtil.getClassDef(loader, EXT_LIB_NAMESPACE_URI, EXT_LIB_TAG_APPLICATION_LAYOUT);
if (appLayoutNode != null) {
dn.setClassDef(appLayoutClassDef);
dn.setDataProvider(new SingleCollection(appLayoutNode));
}
_dnAppLayout = dn;
}
/*
* currently always adds the theme controls
*/
private boolean addingThemeControlInfo() {
// create a PreservingProperties object for the panels to use if they choose
IFile ifile = _panelData.getDesignerProject().getProject().getFile("/WebContent/WEB-INF/xsp.properties"); //$NON-NLS-1$
ContentFacade cf = ContentFacadeFactory.instance().getFacadeForObject(ifile);
PreservingProperties pp = new PreservingProperties(cf, false); // false means we must call pp.save() (on OK)
java.util.Properties props = pp.getProperties();
String theme = props.getProperty("xsp.theme"); //$NON-NLS-1$
_dynamicComposite.setData("pprops", pp); //$NON-NLS-1$
_dynamicComposite.setData("ppropsopen", Boolean.valueOf(_propsOpenInEditor)); //$NON-NLS-1$
if (null != theme){
_dynamicComposite.setData("ppropstheme", theme); //$NON-NLS-1$
}
return true;
}
/*
* Function to save the data
*/
protected void saveData() {
if (hasFooter()) {
addFooterLinks();
}
Object o = _dynamicComposite.getData("pprops"); //$NON-NLS-1$
if (o instanceof PreservingProperties) {
PreservingProperties pp = (PreservingProperties)o;
if (pp.isDirty()) {
if (_propsOpenInEditor) {
MessageDialog.openWarning(getShell(), ProductUtil.getProductName(),
"The Xsp Properties editor is currently open for editing. Therefore the application theme you specified will not be applied.\n\nPlease choose a theme in the Xsp Properties editor (General tab)."); // $NLX-ApplicationLayoutDropDialog.Youcannotchangetheapplicationtheme-1$
}
else {
pp.save();
}
}
}
}
/*
* Gets the element corresponding to the appication configuration
*/
private Element getConfigObject() {
IComplexPanel complex = _dynamicComposite.getCurrentPanel();
if (complex instanceof Control) {
DataNode cn = DCUtils.findDataNode((Control)complex, true);
if (null != cn && cn.getCurrentObject() instanceof Element) {
Element e = (Element)cn.getCurrentObject();
return e;
}
}
else {
if(ExtLibToolingLogger.EXT_LIB_TOOLING_LOGGER.isErrorEnabled()){
ExtLibToolingLogger.EXT_LIB_TOOLING_LOGGER.error("Unable to get Configuration node to add Footer defaults"); // $NLE-ApplicationLayoutDropDialog.UnabletogetConfigurationnodetoadd-1$
}
}
return null;
}
/*
* Checks the configuration for a footer
*/
private boolean hasFooter() {
Element config = getConfigObject();
if (null == config) {
return false;
}
String footer = config.getAttribute(EXT_LIB_ATTR_FOOTER);
FacesRegistry registry = _panelData.getDesignerProject().getFacesRegistry();
ExtLibRegistryUtil.Default defFooter = ExtLibRegistryUtil.getDefaultValue(registry, EXT_LIB_TAG_ONEUI_CONFIGURATION, EXT_LIB_ATTR_FOOTER, String.valueOf(true));
return (footer == null ? defFooter.toBoolean() : StringUtil.isTrueValue(footer));
}
/*
* Adds the footer links for configurations with a footer
*/
private void addFooterLinks() {
try {
ILoader loader = XPagesPropertiesViewUtils.getXPagesMultiDomLoader(_panelData.getDesignerProject());
for (int i = 1; i < 3; i++) {
Element config = getConfigObject();
Map<String, String> props = new HashMap<String, String>();
props.put(EXT_LIB_ATTR_LABEL, StringUtil.format("Container {0}", i)); // $NLX-ApplicationLayoutDropDialog.Subsection-1$
Object container = ExtLibRegistryUtil.createCollectionValue(loader, EXT_LIB_TAG_ONEUI_CONFIGURATION, config, EXT_LIB_ATTR_FOOTER_LINKS, EXT_LIB_TAG_BASIC_CONTAINER_NODE, props);
if (container instanceof Element) {
for (int j = 1; j < 3; j++) {
Map<String, String> leafprops = new HashMap<String, String>();
leafprops.put(EXT_LIB_ATTR_LABEL, StringUtil.format("Link {0}", j)); // $NLX-ApplicationLayoutDropDialog.Link-1$
leafprops.put(EXT_LIB_ATTR_HREF, "/");
ExtLibRegistryUtil.createCollectionValue(loader, EXT_LIB_TAG_BASIC_CONTAINER_NODE, (Element)container, EXT_LIB_ATTR_CHILDREN, EXT_LIB_TAG_BASIC_LEAF_NODE, leafprops);
}
}
}
}
catch(Exception e) {
if(ExtLibToolingLogger.EXT_LIB_TOOLING_LOGGER.isErrorEnabled()){
ExtLibToolingLogger.EXT_LIB_TOOLING_LOGGER.error(e, e.toString());
}
}
}
/*
* Propagates the parent's data node to the the control.
*/
private void initControlDataNode(final Control control, final IClassDef def) {
if (def != null) {
DCUtils.initDataBinding(control);
DataNode newNode = DCUtils.findDataNode(control, true);
newNode.setClassDef(def);
newNode.setDataProvider(new SingleCollection(_dnAppLayout.getCurrentObject()));
}
}
/*
* Invoked when this wizard page is shown, show the correct panel for the selected configuration
*/
@Override
public void setVisible(final boolean visible) {
super.setVisible(visible);
if (visible) {
// Get the selected configuration from the start wizard page
LayoutConfig lc = ((ApplicationLayoutDropWizard)this.getWizard()).getStartPage().getSelectedLayoutConfig();
// Has the configuration changed ?
if (!lc.equals(_currLayout)) {
// Yes
_currLayout = lc;
// Change the hidden combo
_combo.setValue(ConfigurationField.makeCode(_currLayout.facesDef.getNamespaceUri(), _currLayout.tagName));
setTitle(_currLayout.title);
// Update the datanode and show the correct panel for the configuration
initControlDataNode(_dynamicComposite, _dnAppLayout.getClassDef());
_dynamicComposite.updatePanel(_currLayout.facesDef.getNamespaceUri(), _currLayout.tagName);
}
}
}
}