This won't work in WSRP Portal environments that may use distributed
portlets. This is because the portlets may exist on different servers.
Furthermore different portlets may have different skinning extensions.
This will hose the styling if a portlet with no skinning extensions gets
added before portlets WITH skinning extensions. The skinning extensions
will not be available
Martin Marinschek wrote:
Sure, this would work.
Everyone agreeing we should do it this way?
regards,
Martin
On 7/28/07, Simon Lessard <[EMAIL PROTECTED]> wrote:
Yeah, that would imply every single renderers. In a non-portlet environment
the performance hit would not be big though as it would only be on method
call and checking if we run in a portlet environment would not be an
expensive operation compared to the overall job done by renderers. However
in the portlet environment, it would be a tad more...
What about a ResponseWriter decorator applied by the renderkit if it get
called by a portlet environment? The decorator could inject the JavaScript
style copy just before the first non <html>, <head> or <body> element then
set a boolean flag to false to inhibit itself. The overhaul would then be a
single if evaluation per startElement. It would be called often, but a if
with a boolean flag get evaluated in 2 ticks, which is nothing for all
practical purposes.
On 7/28/07, Martin Marinschek <[EMAIL PROTECTED]> wrote:
But you'd need to do this check in every renderer then, right? I
wonder if this is good performance wise.
regards,
Martin
On 7/27/07, Simon Lessard < [EMAIL PROTECTED]> wrote:
One way would be to have something along those line:
CoreRenderer.java
public void encodeBegin(FacesContext context, UIComponent component)
{
if (isPortlet(context) && !isXhtmlRootElement() &&
!isStyleSheetCopied())
{
pushStyleSheet(context);
}
// Do normal processing
}
protected abstract boolean isXhtmlRootElement();
Then we would simply have to make isXhtmlRootElement() return true for
document, head and body renderers and false for the others. But it's not
extremely clean.
Regards,
~ Simon
On 7/27/07, Martin Marinschek <[EMAIL PROTECTED]> wrote:
Sure, it would be better for the user if it works out of the box.
As much as I think, I don't find a central place where to put it,
though.
Ideas anyone?
regards,
Martin
On 7/27/07, Simon Lessard <[EMAIL PROTECTED]> wrote:
Hello Martin,
Yeah I thought about a new component and we actually already have
<trh:styleSheet/> that could be slightly altered to do that work,
but I
would prefer a way not involving any action from users.
On 7/27/07, Martin Marinschek < [EMAIL PROTECTED]> wrote:
Hi Simon,
true. The form-render was good for my nice small example, but is
no
general solution of course.
I wonder if this would mandate a special component which does
nothing
but adding the stylesheet to the head?
Eventually, the component could be generalized, so that all kinds
of
stylesheets can be added, if a link is provided and the stylesheet
hasn't been added so far - I think this solution might be
interesting
for the portlet-developer in general.
regards,
Martin
On 7/27/07, Simon Lessard <[EMAIL PROTECTED]> wrote:
Issue with #3 is not very hard, we already have a
RenderingContext
that
can
be used for that. We could probably hook that code in
CoreRenderer
or
XhtmlRenderer. The only issue left then would be to not have
document,
head
and body renderer to execute it. Placing it in FormRenderer only
does
not
seems right in case your page does not contain a form at all or
use
a
basic
JSF form (extremely unlikely though).
On 7/27/07, Martin Marinschek < [EMAIL PROTECTED]>
wrote:
For the discussion on if and how to integrate this into
Trinidad -
I
see three cases:
1) people only want basic skinning, Trinidad uses
simple.portlet,
and
emits portlet-standard compliant skinning hooks
2) people want normal Trinidad skinning, portlet container
provides
CSS file in the head, Trinidad doesn't have to do anything
(especially
not switch to portlet-standard compliant skinning hooks)
3) people want Trinidad skinning, portlet container does not
provide
the CSS file, Trinidad portlet needs to add the CSS file with
JavaScript itself. Issue to solve: CSS file needs to be added
only
once.
regards,
Martin
On 7/27/07, Martin Marinschek < [EMAIL PROTECTED] >
wrote:
Hi Simon, Scott,
I've made skinning work now in any container - this is the
code
that
I've used, for other users as a reference. We should carry
on
the
discussion if and how to integrate this into Trinidad
itself,
though.
regards,
Martin
--------------------
use a binding attribute on your tr:form:
<tr:form id="helloForm" binding="#{ personPage.form}">
provide a getter for this form in your backing-bean:
public CoreForm getForm() {
CoreForm coreForm = new MyCoreForm();
return coreForm;
}
write the class MyCoreForm, extending Trinidad's CoreForm -
with
that,
you should be good.
public static class MyCoreForm extends CoreForm {
@Override
public void encodeBegin(FacesContext context) throws
IOException
{
StyleContext styleContext =
((CoreRenderingContext)
RenderingContext.getCurrentInstance
()).getStyleContext();
String uri =
styleContext.getStyleProvider
().getStyleSheetURI(styleContext);
String contextUri =
context.getExternalContext ().getRequestContextPath();
String baseURL = contextUri +
XhtmlConstants.STYLES_CACHE_DIRECTORY;
String finalUri = context.getExternalContext
().encodeResourceURL(baseURL+uri);
StringBuffer buf = new StringBuffer();
buf.append("<script type=\"text/javascript\">\n"
+
"\n" +
"//<![CDATA[\n" +
"\n" +
"if( document.createStyleSheet) {\n" +
"\n" +
"
document.createStyleSheet('"+finalUri+"');\n"
+
"\n" +
"}\n" +
"\n" +
"else {\n" +
"\n" +
"var styles = \"@import
url('"+finalUri+"');\";\n" +
"\n" +
"var newSS= document.createElement
('link');\n" +
"\n" +
" newSS.rel='stylesheet' ;\n" +
"\n" +
" newSS.href='"+finalUri+"';\n" +
"\n" +
"document.getElementsByTagName(\"head\")[0].appendChild(newSS);\n"
+
"\n" +
"}\n" +
"\n" +
"//]]>\n" +
"\n" +
"</script>");
context.getResponseWriter().write(buf.toString());
super.encodeBegin(context);
}
}
On 7/26/07, Simon Lessard < [EMAIL PROTECTED]>
wrote:
Thus linking Portal-Trinidad users to specific portal
vendor(s)...
Ok,
I see
the issue now... bleh...
On 7/26/07, Scott O'Bryan < [EMAIL PROTECTED] > wrote:
Simon, you are correct. The portal would be able to
push a
parameter to
Trinidad. Always in a portal environment the skin is
uncompressed
so
that is also not an issue. But currently changing the
stylesheet
provided by the Portal is a modification that needs to
be
made
to
the
portal itself. I think that's where Martin is coming
from.
An
unmodified portal container doesn't look very good when
displaying
faces
and forcing every portal container to provide a skin
that is
not
based
off a standard is not going to be very successful in the
general
case.
I totally agree with this, but we're sort of between a
rock
and
a
hard
place. :)
Simon Lessard wrote:
Not really, I think we detect a specific parameter
pushed
by
the
container. So only container supporting skinning would
push
it,
effectively synchronizing all portlet LaF. For other
container
I
think
we simply use the normal code path... That or I had
some
serious
hallucinations in the past months and imagined all
this...
On 7/26/07, *Martin Marinschek* <
[EMAIL PROTECTED]
<mailto: [EMAIL PROTECTED] >> wrote:
Hi Simon,
well, but this would then be portlet container
dependent,
right?
You'd
effectively need to implement trinidad skinning in
every
portlet
container.
regards,
Martin
On 7/26/07, Simon Lessard <
[EMAIL PROTECTED]
<mailto: [EMAIL PROTECTED]>> wrote:
> Personally, I don't see why the portal should
not be
able to
provide all
> selectors.
>
> Aren't we just not compressing the selector
names
when
we
detect
a portal
> environment or did I miss something? I think
that
strategy
cannot provides
> the icons though.
>
>
> On 7/26/07, Martin Marinschek <
[EMAIL PROTECTED]
<mailto: [EMAIL PROTECTED] >> wrote:
> > Does the portlet container really provide
every
styleclass
that
is
> > necessary for Trinidad components to look like
they
normally
look?
> >
> > I'm just thinking that what is currently being
done is
not
enough to
> > have the full skinning features available, and
that
going
the
> > direction of adding the CSS dynamically would
allow to
do
so.
> >
> > regards,
> >
> > Martin
> >
> > On 7/26/07, Scott O'Bryan <
[EMAIL PROTECTED]
<mailto: [EMAIL PROTECTED]>> wrote:
> > > Hey Martin,
> > >
> > > Does the simple-portlet skin render any
better?
I
*THINK*
that when
> > > running in a portal environment you always
get
the
simple-portlet skin
> > > unless your portal provides one of the
necessary
skin
extensions which,
> > > right now, it trinidad proprietary. Maybe
this
is
just
a
case of us
> > > needing to bug-fix the portlet skin.
> > >
> > > That article is interesting, but I think
that
Trinidad
has
attempted to
> > > do the same thing only in a different way.
Instead
of
using
javascript
> > > to copy in the styles, we actually change
the
class
names
that get
> > > rendered on the client to use the portal
styles
where
appropriate.
> > > Still, I'm not sure that this has been
tested
extensively
because before
> > > we started looking at 301, much of
Trinidad's
portal
work
has been done
> > > with a Proof of Concept environment.
> > >
> > > Scott
> > >
> > > Martin Marinschek wrote:
> > > > After playing around for a while and
finally
finding
out
that it was
> > > > as easy as setting:
> > > >
> > > >
<skin-family>simple</skin-family>
> > > >
> > > > in the trinidad-config.xml I got skinning
to
run
in
the
portlet
> > > > environment. In the end, I'm not very
happy
with
what
I
see, though.
> > > >
> > > > I'm attaching a screenshot - basically,
not
much
change
happens by
> > > > applying skinning - obviously due to the
fact
that
the
portlet
> > > > containers don't offer many default
style-class
hooks.
> > > > Have I been getting this wrong or does it
really
look
like
this?
> > > >
> > > > If I have been doing the right thing,
wouldn't
it
be
nice
to have a
> > > > way of adding the stylesheet with
javascript
dynamically
in the body?
> > > >
> > > > Something like this:
> > > >
> > > >
>
http://cse-mjmcl.cse.bris.ac.uk/blog/2005/08/18/1124396539593.html
<
http://cse-mjmcl.cse.bris.ac.uk/blog/2005/08/18/1124396539593.html
> > > >
> > > > might be in order to have full skinning
available,
and
still be
> > > > standards compliant.
> > > >
> > > > I'd implement this in a component, if
nobody
has
better
ideas...
> > > >
> > > > regards,
> > > >
> > > > Martin
> > > >
> > > >
> > > >
> > > >
>
------------------------------------------------------------------------
> > > >
> > >
> > >
> >
> >
> > --
> >
> > http://www.irian.at
> >
> > Your JSF powerhouse -
> > JSF Consulting, Development and
> > Courses in English and German
> >
> > Professional Support for Apache MyFaces
> >
>
>
--
http://www.irian.at
Your JSF powerhouse -
JSF Consulting, Development and
Courses in English and German
Professional Support for Apache MyFaces
--
http://www.irian.at
Your JSF powerhouse -
JSF Consulting, Development and
Courses in English and German
Professional Support for Apache MyFaces
--
http://www.irian.at
Your JSF powerhouse -
JSF Consulting, Development and
Courses in English and German
Professional Support for Apache MyFaces
--
http://www.irian.at
Your JSF powerhouse -
JSF Consulting, Development and
Courses in English and German
Professional Support for Apache MyFaces
--
http://www.irian.at
Your JSF powerhouse -
JSF Consulting, Development and
Courses in English and German
Professional Support for Apache MyFaces
--
http://www.irian.at
Your JSF powerhouse -
JSF Consulting, Development and
Courses in English and German
Professional Support for Apache MyFaces