Package com.google.gdt.eclipse.designer.smart.model.live

Source Code of com.google.gdt.eclipse.designer.smart.model.live.FormItemLiveManager

/*******************************************************************************
* Copyright 2011 Google Inc. All Rights Reserved.
*
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* 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.google.gdt.eclipse.designer.smart.model.live;

import com.google.gdt.eclipse.designer.model.widgets.live.GwtLiveCacheEntry;
import com.google.gdt.eclipse.designer.model.widgets.panels.RootPanelInfo;
import com.google.gdt.eclipse.designer.model.widgets.support.UIObjectUtils;
import com.google.gdt.eclipse.designer.smart.model.form.DynamicFormInfo;
import com.google.gdt.eclipse.designer.smart.model.form.FormItemInfo;

import org.eclipse.wb.core.model.AbstractComponentInfo;
import org.eclipse.wb.core.model.JavaInfo;
import org.eclipse.wb.core.model.broadcast.JavaInfoSetObjectAfter;
import org.eclipse.wb.draw2d.geometry.Dimension;
import org.eclipse.wb.draw2d.geometry.Point;
import org.eclipse.wb.draw2d.geometry.Rectangle;
import org.eclipse.wb.internal.core.model.JavaInfoUtils;
import org.eclipse.wb.internal.core.model.clipboard.ComponentInfoMemento;
import org.eclipse.wb.internal.core.model.creation.ConstructorCreationSupport;
import org.eclipse.wb.internal.core.model.util.live.AbstractLiveManager;
import org.eclipse.wb.internal.core.model.util.live.ILiveCacheEntry;

import org.eclipse.swt.graphics.GC;
import org.eclipse.swt.graphics.Image;

/**
* Default live components manager for SmartGWT <code>FormItem</code>.
*
* @author sablin_aa
* @coverage SmartGWT.model
*/
public class FormItemLiveManager extends AbstractLiveManager {
  private final UIObjectUtils m_utils;

  ////////////////////////////////////////////////////////////////////////////
  //
  // Constructor
  //
  ////////////////////////////////////////////////////////////////////////////
  public FormItemLiveManager(FormItemInfo formItem) {
    super(formItem);
    m_utils = formItem.getState().getUIObjectUtils();
  }

  ////////////////////////////////////////////////////////////////////////////
  //
  // AbstractLiveComponentsManager
  //
  ////////////////////////////////////////////////////////////////////////////
  @Override
  protected FormItemInfo createLiveComponent() throws Exception {
    m_utils.setLiveManager(true);
    // prepare empty RootPanel
    RootPanelInfo panel;
    {
      String[] sourceLines =
          new String[]{
              "  com.google.gwt.user.client.ui.RootPanel __wbp_panel = com.google.gwt.user.client.ui.RootPanel.get();",
              "  __wbp_panel.setPixelSize(800, 600);",};
      panel = (RootPanelInfo) parse(sourceLines);
    }
    // prepare Canvas
    final DynamicFormInfo parentCanvas =
        (DynamicFormInfo) JavaInfoUtils.createJavaInfo(
            m_editor,
            "com.smartgwt.client.widgets.form.DynamicForm",
            new ConstructorCreationSupport());
    {
      // drop Canvas on RootPanel
      panel.command_CREATE2(parentCanvas, null);
      panel.command_BOUNDS(parentCanvas, new Point(10, 10), new Dimension(700, 500));
      // broadcast for set widget as "live"
      parentCanvas.addBroadcastListener(new JavaInfoSetObjectAfter() {
        public void invoke(JavaInfo target, Object o) throws Exception {
          if (target == parentCanvas) {
            parentCanvas.removeBroadcastListener(this);
            m_utils.setLiveWidget(o);
          }
        }
      });
    }
    // prepare component
    FormItemInfo formItem = createClone();
    // add component on Canvas
    parentCanvas.command_CREATE(formItem, null);
    // remove "live" mark from RootPanel,
    // because only one instance of RootPanel exists, so we update it also for "main" hierarchy
    panel.getPropertyByTitle("title").setValue(null);
    // ready to get live values
    return formItem;
  }

  @Override
  protected void cleanupLiveComponent(AbstractComponentInfo liveComponentInfo) throws Exception {
    super.cleanupLiveComponent(liveComponentInfo);
    // reset "live" state of UIObjectManipulations
    {
      FormItemInfo formItem = (FormItemInfo) liveComponentInfo;
      DynamicFormInfo form = formItem.getForm();
      if (form != null) {
        m_utils.setLiveWidget(null);
      }
    }
    m_utils.setLiveManager(false);
  }

  @Override
  protected ILiveCacheEntry createComponentCacheEntry(AbstractComponentInfo component) {
    FormItemInfo formItem = (FormItemInfo) component;
    // do create cache entry
    GwtLiveCacheEntry entry = new GwtLiveCacheEntry();
    entry.setImage(getWidgetImage(formItem));
    entry.shouldSetSize(false);
    return entry;
  }

  /**
   * @return the {@link Image} of {@link FormItemInfo}.
   */
  private Image getWidgetImage(final FormItemInfo formItem) {
    Rectangle bounds = formItem.getAbsoluteBounds();
    Image componentImage = new Image(null, bounds.width, bounds.height);
    GC gc = new GC(componentImage);
    try {
      RootPanelInfo rootPanel = (RootPanelInfo) formItem.getForm().getRootJava();
      gc.drawImage(
          rootPanel.getImage(),
          bounds.x,
          bounds.y,
          bounds.width,
          bounds.height,
          0,
          0,
          bounds.width,
          bounds.height);
    } finally {
      gc.dispose();
    }
    return componentImage;
  }

  @Override
  protected ILiveCacheEntry createComponentCacheEntryEx(Throwable e) {
    GwtLiveCacheEntry cacheEntry = new GwtLiveCacheEntry();
    // set image
    {
      Image image = createImageForException(e);
      cacheEntry.setImage(image);
    }
    // done
    return cacheEntry;
  }

  ////////////////////////////////////////////////////////////////////////////
  //
  // Access
  //
  ////////////////////////////////////////////////////////////////////////////
  /**
   * @return the copy of "live" {@link Image} of component, must be disposed by caller.
   */
  public Image getImage() {
    // get image from memento during paste
    {
      Image image = ComponentInfoMemento.getImage(m_component);
      if (image != null) {
        return image;
      }
    }
    // prepare image
    return getEntry().getImage();
  }

  ////////////////////////////////////////////////////////////////////////////
  //
  // LiveComponentsCacheEntry
  //
  ////////////////////////////////////////////////////////////////////////////
  private GwtLiveCacheEntry getEntry() {
    // check if we have LiveComponentsCacheEntry set externally
    {
      GwtLiveCacheEntry entry =
          (GwtLiveCacheEntry) m_component.getArbitraryValue(GwtLiveCacheEntry.class);
      if (entry != null) {
        return entry;
      }
    }
    // use code parsing
    return (GwtLiveCacheEntry) getCachedEntry();
  }
}
TOP

Related Classes of com.google.gdt.eclipse.designer.smart.model.live.FormItemLiveManager

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.