/* * ==================================================================== * * The ObjectStyle Group Software License, Version 1.0 * * Copyright (c) 2006 The ObjectStyle Group and individual authors of the * software. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: 1. * Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. 2. Redistributions in * binary form must reproduce the above copyright notice, this list of * conditions and the following disclaimer in the documentation and/or other * materials provided with the distribution. 3. The end-user documentation * included with the redistribution, if any, must include the following * acknowlegement: "This product includes software developed by the ObjectStyle * Group (http://objectstyle.org/)." Alternately, this acknowlegement may * appear in the software itself, if and wherever such third-party * acknowlegements normally appear. 4. The names "ObjectStyle Group" and * "Cayenne" must not be used to endorse or promote products derived from this * software without prior written permission. For written permission, please * contact andrus@objectstyle.org. 5. Products derived from this software may * not be called "ObjectStyle" nor may "ObjectStyle" appear in their names * without prior written permission of the ObjectStyle Group. * * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED WARRANTIES, * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * OBJECTSTYLE GROUP OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, * EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * ==================================================================== * * This software consists of voluntary contributions made by many individuals * on behalf of the ObjectStyle Group. For more information on the ObjectStyle * Group, please see <http://objectstyle.org/> . * */ package org.objectstyle.wolips.componenteditor.part; import org.eclipse.core.runtime.IProgressMonitor; import org.eclipse.jface.viewers.ISelectionChangedListener; import org.eclipse.jface.viewers.SelectionChangedEvent; import org.eclipse.swt.SWT; import org.eclipse.swt.events.ControlEvent; import org.eclipse.swt.events.ControlListener; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Event; import org.eclipse.swt.widgets.Label; import org.eclipse.swt.widgets.Listener; import org.eclipse.ui.IEditorInput; import org.eclipse.ui.IEditorPart; import org.eclipse.ui.IEditorSite; import org.eclipse.ui.IPropertyListener; import org.eclipse.ui.PartInitException; import org.objectstyle.wolips.componenteditor.ComponenteditorPlugin; import org.objectstyle.wolips.components.input.ComponentEditorFileEditorInput; import org.objectstyle.wolips.templateeditor.TemplateEditor; import org.objectstyle.wolips.wodclipse.WodclipsePlugin; import org.objectstyle.wolips.wodclipse.core.Activator; import org.objectstyle.wolips.wodclipse.editor.WodEditor; public class HtmlWodTab extends ComponentEditorTab { private static final String SASH_WEIGHTS_KEY = "org.objectstyle.wolips.componenteditor.sashWeights"; private TemplateEditor templateEditor; private WodEditor wodEditor; private boolean htmlActive; private IEditorInput htmlInput; private IEditorInput wodInput; private Composite _templateContainer; private Composite _wodContainer; private Label nonEmptyWodWarning; public HtmlWodTab(ComponentEditorPart componentEditorPart, int tabIndex, IEditorInput htmlInput, IEditorInput wodInput) { super(componentEditorPart, tabIndex); this.htmlInput = htmlInput; this.wodInput = wodInput; } public IEditorPart getActiveEmbeddedEditor() { if (htmlActive) { return templateEditor; } return wodEditor; } public void createTab() { templateEditor = new TemplateEditor(); IEditorSite htmlSite = this.getComponentEditorPart().publicCreateSite(templateEditor); try { templateEditor.init(htmlSite, htmlInput); } catch (PartInitException e) { ComponenteditorPlugin.getDefault().log(e); } _templateContainer = createInnerPartControl(getParentSashForm(), templateEditor); templateEditor.addPropertyListener(new IPropertyListener() { public void propertyChanged(Object source, int propertyId) { HtmlWodTab.this.getComponentEditorPart().publicHandlePropertyChange(propertyId); } }); if (wodInput != null && ((ComponentEditorFileEditorInput)wodInput).getFile().exists()) { wodEditor = new WodEditor(); IEditorSite wodSite = this.getComponentEditorPart().publicCreateSite(wodEditor); try { wodEditor.init(wodSite, wodInput); } catch (PartInitException e) { ComponenteditorPlugin.getDefault().log(e); } _wodContainer = createInnerPartControl(getParentSashForm(), wodEditor); _wodContainer.setBackground(_wodContainer.getDisplay().getSystemColor(SWT.COLOR_WHITE)); wodEditor.addPropertyListener(new IPropertyListener() { public void propertyChanged(Object source, int propertyId) { HtmlWodTab.this.getComponentEditorPart().publicHandlePropertyChange(propertyId); } }); wodEditor.getSelectionProvider().addSelectionChangedListener(new ISelectionChangedListener() { public void selectionChanged(SelectionChangedEvent event) { WodclipsePlugin.getDefault().updateWebObjectsTagNames(null); } }); WodclipsePlugin.getDefault().updateWebObjectsTagNames(wodEditor); _templateContainer.addListener(SWT.Activate, new Listener() { public void handleEvent(Event event) { // Frank if (HtmlWodTab.this.getComponentEditorPart()._tabsInitialized) { setHtmlActive(true); HtmlWodTab.this.getComponentEditorPart().pageChange(HtmlWodTab.this.getTabIndex()); HtmlWodTab.this.getComponentEditorPart().updateOutline(); } } }); _wodContainer.addListener(SWT.Activate, new Listener() { public void handleEvent(Event event) { // Frank if (HtmlWodTab.this.getComponentEditorPart()._tabsInitialized) { setHtmlActive(false); HtmlWodTab.this.getComponentEditorPart().pageChange(HtmlWodTab.this.getTabIndex()); HtmlWodTab.this.getComponentEditorPart().updateOutline(); } } }); } restoreSashWeights(); hideWodIfNecessary(); _templateContainer.addControlListener(new ControlListener() { public void controlMoved(ControlEvent e) { // DO NOTHING } public void controlResized(ControlEvent e) { HtmlWodTab.this.saveSashWeights(); HtmlWodTab.this.hideWodIfNecessary(); } }); templateEditor.initEditorInteraction(this.getComponentEditorPart().getEditorInteraction()); if (wodEditor != null) { wodEditor.initEditorInteraction(this.getComponentEditorPart().getEditorInteraction()); } this.addWebObjectsTagNamesListener(); } public boolean isHtmlActive() { return this.htmlActive; } protected void setHtmlActive(boolean htmlActive) { this.htmlActive = htmlActive; } protected void hideWodIfNecessary() { if (this._wodContainer == null) { int[] weights = new int[] { 100 }; getParentSashForm().setWeights(weights); return; } int[] weights = getParentSashForm().getWeights(); if (weights.length >= 2 && weights[1] < 132) { if (this.nonEmptyWodWarning == null) { this._wodContainer.getChildren()[0].setVisible(false); this.nonEmptyWodWarning = new Label(this._wodContainer, SWT.CENTER); this.nonEmptyWodWarning.setBackground(this._wodContainer.getBackground()); this.nonEmptyWodWarning.setForeground(this._wodContainer.getDisplay().getSystemColor(SWT.COLOR_GRAY)); if (this.wodEditor.getWodEditDocument().getLength() > 0) { this.nonEmptyWodWarning.setText("wod file is not empty"); } else { this.nonEmptyWodWarning.setText(""); } this.nonEmptyWodWarning.moveAbove(this._wodContainer.getChildren()[0]); // MS: If the wod shrinks, force focus to the template if (!isHtmlActive()) { _templateContainer.forceFocus(); } } } else if (this.nonEmptyWodWarning != null) { this.nonEmptyWodWarning.dispose(); this.nonEmptyWodWarning = null; this._wodContainer.getChildren()[0].setVisible(true); } } protected void restoreSashWeights() { String sashWeightsStr = Activator.getDefault().getPluginPreferences().getString(HtmlWodTab.SASH_WEIGHTS_KEY); if (sashWeightsStr != null && sashWeightsStr.length() > 0) { String[] sashWeightStrs = sashWeightsStr.split(","); int[] sashWeights = new int[sashWeightStrs.length]; for (int sashWeightNum = 0; sashWeightNum < sashWeightStrs.length; sashWeightNum++) { sashWeights[sashWeightNum] = Integer.parseInt(sashWeightStrs[sashWeightNum]); } if (sashWeights.length == getParentSashForm().getWeights().length) { if (sashWeights[1] / (float)sashWeights[0] < 0.15) { sashWeights[0] = 85; sashWeights[1] = 15; } getParentSashForm().setWeights(sashWeights); } } } protected void saveSashWeights() { int[] weights = getParentSashForm().getWeights(); StringBuffer weightsBuffer = new StringBuffer(); for (int weight : weights) { weightsBuffer.append(weight); weightsBuffer.append(","); } if (weightsBuffer.length() > 0) { weightsBuffer.setLength(weightsBuffer.length() - 1); } Activator.getDefault().getPluginPreferences().setValue(HtmlWodTab.SASH_WEIGHTS_KEY, weightsBuffer.toString()); } /** * @return the template editor for this html/wod composite. */ public TemplateEditor templateEditor() { return templateEditor; } /** * @return the wod editor for this html/wod composite. */ public WodEditor wodEditor() { return wodEditor; } public void doSave(IProgressMonitor monitor) { if (wodEditor != null && wodEditor.isDirty()) { wodEditor.doSave(monitor); } if (templateEditor.isDirty()) { templateEditor.doSave(monitor); } } public void close(boolean save) { if (wodEditor != null) { wodEditor.close(save); } // templateEditor.close(save); } @Override public void dispose() { if (wodEditor != null) { wodEditor.dispose(); } templateEditor.dispose(); super.dispose(); } public boolean isDirty() { return (wodEditor != null && wodEditor.isDirty()) || templateEditor.isDirty(); } private void addWebObjectsTagNamesListener() { // templateEditor.getSelectionProvider().addSelectionChangedListener(new // ISelectionChangedListener() { // public void selectionChanged(SelectionChangedEvent event) { // WodclipsePlugin.getDefault().updateWebObjectsTagNames(null); // } // }); if (wodEditor == null) { return; } final WodEditor finalWodEditor = wodEditor; wodEditor.getSelectionProvider().addSelectionChangedListener(new ISelectionChangedListener() { public void selectionChanged(SelectionChangedEvent event) { WodclipsePlugin.getDefault().updateWebObjectsTagNames(finalWodEditor); } }); WodclipsePlugin.getDefault().updateWebObjectsTagNames(wodEditor); } public void setHtmlActive() { setHtmlActive(true); } public void setWodActive() { setHtmlActive(false); } public IEditorInput getActiveEditorInput() { if (this.htmlActive) { return this.htmlInput; } return this.wodInput; } }