Hi Thomas, 

the reason why I want to use an iframe is the following. I want to create a 
JavaScript widget which is integrated into another third party page. Have a 
look at this: https://www.livechatinc.com/ They have a chat widget which 
has the following structure: 

<div class="some-outer-div-stype">
  <iframe>
   // widget content
  </iframe>
</div>

I guess they use the iframe such that the page containing the widget does 
not change the css or html tree of the widget. 

Do you see how such a technique can be used with GWT?


 

Am Dienstag, 5. Januar 2016 10:16:39 UTC+1 schrieb Thomas Broyer:
>
>
>
> On Monday, January 4, 2016 at 8:31:56 PM UTC+1, confile wrote:
>>
>> I want to insert GWT Widgets like FlowPanel, HTMLPanel inside and iframe 
>> using GWT.
>>
>
> TL;DR: you can't.
>
>  
>
>> I find out how to insert GWT Widgets and Panels programmatically into 
>> GWT. Here is how I do it:
>>
>>
>>   public interface Resources extends ClientBundle {
>>
>>     @Source({Css.DEFAULT_CSS})
>>     Css css();
>>
>>   }
>>
>>   public interface Css extends CssResource {
>>
>>     String DEFAULT_CSS = "test/client/app/start/StartView.gss";
>>
>>     String outerBox();
>>     String iframe();
>>     String test();
>>
>>   }
>>
>>   @UiField(provided = true)
>>   Resources resources;
>>
>>   @UiField(provided = true)
>>   Messages messages;
>>
>>   @Inject
>>   public StartView(final Binder binder, Resources resources, Messages 
>> messages)    
>>   {
>>     this.resources = resources;
>>     resources.css().ensureInjected();
>>     this.messages = messages;
>>     initWidget(binder.createAndBindUi(this));
>>
>>     final IFrameElement iframe = Document.get().createIFrameElement();
>>     FlowPanel innerBox = new FlowPanel() {
>>        @Override
>>        protected void onLoad() {
>>          super.onLoad();
>>
>>          FlowPanel p1 = new FlowPanel();
>>          p1.addStyleName(resources.css().test());
>>
>>          HTMLPanel panel = new HTMLPanel("Hello World!");
>>          panel.setStyleName(resources.css().test());  // does not work
>>          p1.add(panel);
>>
>>          final Document doc = iframe.getContentDocument();
>>          BodyElement body = doc.getBody();
>>
>>          body.appendChild(p1.getElement());
>>
>>
> When doing this, you're neutralizing event handling on the widgets, making 
> many of them unusable.
>
> What you need to do is either:
>
>    - load a GWT app into the iframe and communicate with it to make it 
>    build the UI you're expecting
>    - or only "inject" elements into the frame, not widgets.
>
> But one has to wonder why you want to use an iframe to begin with…
>
>  
>
>>
>>          panel.setStyleName(resources.css().test());  // does not work
>>          p1.getElement().addClassName(resources.css().test()); // does not 
>> work
>>
>>        }
>>     };
>>   }
>>
>> The former code inserts GWT Panels into an iframe. The problem is that I 
>> cannot set any css style. Even if I set the style with:
>>
>> panel.setStyleName(resources.css().test());  // does not work
>> p1.getElement().addClassName(resources.css().test()); // does not work
>>
>> both variants do not work. I know I can inject a general css file in the 
>> head of the iframe document, but I want to use the GWT resources.
>>
>> *How can I set the styles using CSS/GSS Resources for the Panels inside 
>> the iframe?*
>>
> As Grzegorz Nowak said, you need to inject your stylesheet into the iframe 
> first; it's as easy as creating a <style> element and setting its content 
> to resources.css().getText() (which is basically what ensureInjected() does 
> in $doc / Document.get()) 
>

-- 
You received this message because you are subscribed to the Google Groups "GWT 
Contributors" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
To view this discussion on the web visit 
https://groups.google.com/d/msgid/google-web-toolkit-contributors/31d3bf3a-06f9-4044-b539-4fec5710432d%40googlegroups.com.
For more options, visit https://groups.google.com/d/optout.

Reply via email to