package creamtec.webcream.examples; import java.awt.*; import creamtec.core.TraceMgr; import creamtec.webcream.rendering.*; import creamtec.webcream.rendering.html.*; import creamtec.webcream.core.HttpRequestData; import creamtec.webcream.core.ActionData; import creamtec.webcream.ui.*; import creamtec.webcream.gui.*; /** * Example of implementing a custom renderer, custom updater and action emulator * See WebCream documentation and javadoc for more information. */ public class CustomControlProcessor implements ComponentRenderer, ComponentUpdater, ActionEmulator { public CustomControlProcessor() { TraceMgr.trace(this, "Loaded"); } public void renderComponent (Document document, Object component) throws Exception { TraceMgr.trace(this, "Rendering custom control"); CustomControl control = (CustomControl)component; HTMLPage page = (HTMLPage)document; // Because custom control contains other elements, it will be rendered as a div for proper children positioning page.append(""); // Name the checkbox to be the same as the control so that the events generated // by the checkbox appear as if they come from the control // control.getCheckBox().setName(page.getComponentName(control)); // boolean oldUseComponentNames = page.getRenderContext().useComponentNames; // Make sure that the names of components are used to identify them in HTML // page.getRenderContext().useComponentNames = true; // Delegate rendering of checkbox to WebCream engine for simplicity page.getPageRenderer().renderComponent(page, control.getCheckBox()); // page.getRenderContext().useComponentNames = oldUseComponentNames; // Render text ourselves because we want to support 3D effect if (control.is3D()) { // Only draw the shadow if we need 3D look page.append(""); page.append(control.getText()); page.appendln(""); } // Always display text using main color page.append(""); page.append(control.getText()); page.appendln(""); page.appendln(""); } /** * Called by WebCream to apply the data from HTML page to the GUI component */ public boolean updateComponent (Component comp, HttpRequestData data, ActionData actionData) throws Exception { CustomControl control = (CustomControl)comp; String checkBoxName = WindowUpdater.getComponentName(control.getCheckBox()); Object value = data.getParams().get(checkBoxName); boolean isSelected = value != null; TraceMgr.trace(this, "updateComponent for custom control, new state = " + (isSelected? "selected":"not selected")); // Only change the checkbox state when needed if (control.getCheckBox().isSelected() != isSelected) { control.getCheckBox().doClick(0); } // If the page submit was triggered by an event from our checkbox, mark // the action as processed because otherwise WebCream would try to find // the event component, update it with data and then process the action. // Since we did the rendering of the checkbox ourselves, we have to take care of // its events and actions if (actionData.getActionString().equals("/event/" + checkBoxName)) actionData.setProcessed(true); return false; } /** * Called by WebCream to emulate a standard or custom action */ public boolean emulateAction(HTMLPage page, ActionData actionData) throws Exception { TraceMgr.trace(this, "emulateAction called for page " + page.getTitle()); if (actionData.getActionString().equals("close")) { TraceMgr.trace("Intercepted Close window attempt"); Window window = page.getClientAgent().getUIManager().getWindowInFocus(); if (window instanceof FixedDialog) { FixedDialog dlg = (FixedDialog)window; dlg.setTitle("Intercepted Close action"); // Mark action as processed and stop emulation actionData.setProcessed(true); return true; } } return false; // Keep going } public void postUpdateComponent(Component comp, HttpRequestData data, ActionData actionData) { } }