I'm building an flex app that is basically a wrapper for a few websites. One of them is a google docs website, and I'm trying to get flex to allow downloads or popups or something that will allow me to do it. I've tried a whole bunch of solutions online and none of them have worked out. Here's the code so far:
<?xml version="1.0" encoding="utf-8"?>
<s:WindowedApplication xmlns:fx="http://ns.adobe.com/mxml/2009"
xmlns:s="library://ns.adobe.com/flex/spark"
xmlns:mx="library://ns.adobe.com/flex/mx"
width="100%" height="100%"
creationComplete="onCreationComplete()">
<s:layout>
<s:HorizontalLayout/>
</s:layout>
<fx:Style source="style.css"/>
<fx:Script>
<![CDATA[
include "CustomHTMLLoader.as";
private function onCreationComplete():void
{
// ... other stuff ...
var custom:object;
custom.htmlHost = new MyHTMLHost();
}
]]>
</fx:Script>
<fx:Declarations>
<!-- Place non-visual elements (e.g., services, value objects) here -->
</fx:Declarations>
<s:BorderContainer width="100%" height="100%" backgroundColor="#87BED0" styleName="container">
<s:Panel x="188" y="17" width="826" height="112" borderAlpha="0.15" chromeColor="#0C5A74"
color="#FFFFFF" cornerRadius="20" dropShadowVisible="false" enabled="true"
title="Customer Service Control Panel">
<s:controlBarContent/>
<s:Button id="home" x="13" y="10" height="44" label="Phones"
click="myViewStack.selectedChild=Home;" enabled="true"
icon="#Embed('assets/iconmonstr-mobile-phone-6-icon-32.png')"/>
<s:Button id="liveagent" x="131" y="10" height="44" label="Live Agent"
click="myViewStack.selectedChild=live_agent;"
icon="#Embed('assets/iconmonstr-speech-bubble-11-icon-32.png')"/>
<s:Button id="bigcommerce" x="260" y="10" width="158" height="44" label="Big Commerce"
click="myViewStack.selectedChild=bigcommerce_home;"
icon="#Embed('assets/iconmonstr-coin-6-icon-48.png')"/>
<s:Button id="faq" x="436" y="10" width="88" height="44" label="FAQ"
click="myViewStack.selectedChild=freqaskquestions;" fontFamily="Arial"
icon="#Embed('assets/iconmonstr-help-4-icon-32.png')"/>
<s:Button id="call" x="540" y="10" width="131" height="44" label="Google Docs"
click="myViewStack.selectedChild=call_notes;"
icon="#Embed('assets/iconmonstr-text-file-4-icon-32.png')"/>
<s:Button id="hoot" x="684" y="10" width="122" height="44" label="HootSuite"
click="myViewStack.selectedChild=hoot_suite;"
icon="#Embed('assets/iconmonstr-facebook-icon-32.png')"/>
</s:Panel>
<mx:ViewStack id="myViewStack" x="0" y="140" width="100%" height="100%" borderStyle="solid">
<s:NavigatorContent id="Home">
<s:BorderContainer width="100%" height="100%">
<mx:HTML x="0" y="0" width="100%" height="100%" borderVisible="false"
horizontalScrollPolicy="off"
location="http://mbvphone.mtbakervapor.org/vbx/messages/inbox"
/>
</s:BorderContainer>
</s:NavigatorContent>
<s:NavigatorContent id="bigcommerce_home">
<s:BorderContainer width="100%" height="100%">
<mx:HTML x="0" y="0" width="100%" height="100%" borderVisible="false"
horizontalScrollPolicy="off"
location="http://www.mtbakervapor.com/admin"
/>
</s:BorderContainer>
</s:NavigatorContent>
<s:NavigatorContent id="live_agent">
<s:BorderContainer width="100%" height="100%">
<mx:HTML x="0" y="0" width="100%" height="100%" borderVisible="false"
horizontalScrollPolicy="off"
location="http://mbvphone.mtbakervapor.org/liveagent/agent/#login"
/>
</s:BorderContainer>
</s:NavigatorContent>
<s:NavigatorContent id="freqaskquestions">
<s:BorderContainer width="100%" height="100%">
<mx:HTML x="0" y="0" width="100%" height="100%" borderVisible="false"
horizontalScrollPolicy="off"
location="http://mbvphone.mtbakervapor.org/liveagent/"
/>
</s:BorderContainer>
</s:NavigatorContent>
<s:NavigatorContent id="call_notes">
<s:BorderContainer width="100%" height="100%">
<mx:HTML id="html" x="0" y="0" width="100%" height="100%" borderVisible="false"
horizontalScrollPolicy="off"
location="https://drive.google.com/a/mtbakervapor.com/"
htmlHost="{new CustomHost()}"
/>
</s:BorderContainer>
</s:NavigatorContent>
<s:NavigatorContent id="hoot_suite">
<s:BorderContainer width="100%" height="100%">
<mx:HTML x="0" y="0" width="100%" height="100%" borderVisible="false"
horizontalScrollPolicy="off"
location="https://hootsuite.com/login"
/>
</s:BorderContainer>
</s:NavigatorContent>
</mx:ViewStack>
<s:Image x="0" y="0" width="180" height="140" scaleMode="letterbox" smooth="false"
source="assets/mbvlogo_black.png"/>
</s:BorderContainer>
</s:WindowedApplication>
and the custom class code:
package
{
import flash.html.HTMLHost;
import flash.html.HTMLWindowCreateOptions;
import flash.html.HTMLLoader;
public class MyHTMLHost extends HTMLHost
{
public function MyHTMLHost(defaultBehaviors:Boolean=true)
{
super(defaultBehaviors);
}
override public function createWindow(windowCreateOptions:HTMLWindowCreateOptions):HTMLLoader
{
// all JS calls and HREFs to open a new window should use the existing window
return HTMLLoader.createRootWindow();
}
}
}
any help would be appreciated.
Related
I have a TabNavigator and before that a ViewStack with TabBar that would not clip it's contents. It over flows the border or appears under other components positioned further down the screen. Has anyone run into this before?
Here is my code:
<mx:VDividedBox width="300" height="100%">
<mx:TabNavigator id="firstViewStack"
borderStyle="solid"
width="100%"
height="100%"
clipContent="true">
<s:NavigatorContent id="content1"
label="ITEMS">
<views:Items height="550" width="100%" />
</s:NavigatorContent>
<s:NavigatorContent id="eventsContent" label="ITEMS 2">
<views:Items height="880" width="100%"/>
</s:NavigatorContent>
</mx:TabNavigator>
</mx:VDividedBox>
UPDATE
I've included a animated gif of me resizing the tab content. As you can see the mask appears to be sized to the content rather than the available area??? Notice the border of the tab navigator along the size is being overlapped when resizing.
I set the minimum height on all of the content to lower values and height to 100% on all the content so it is not as high but you can see the content is still not getting clipped.
I also tried with a VGroup rather than a VDividedBox and it doesn't matter.
Here is another code example:
<s:VGroup top="50" left="50" width="400">
<mx:TabNavigator width="100%" height="300">
<s:NavigatorContent label="TAB">
<s:Group width="100%" height="400">
<s:Rect width="100%" height="100%">
<s:fill>
<s:SolidColor color="#ff0000"/>
</s:fill>
</s:Rect>
</s:Group>
</s:NavigatorContent>
<s:NavigatorContent label="TAB">
<s:Group width="100%" height="400">
<s:Rect width="100%" height="100%">
<s:fill>
<s:SolidColor color="#0000ff"/>
</s:fill>
</s:Rect>
</s:Group>
</s:NavigatorContent>
</mx:TabNavigator>
<s:Button width="100%" label="HELLO WORLD"/>
<s:Button width="100%" label="HELLO WORLD"/>
</s:VGroup>
I have implemented 2 approaches - one with a Scroller and another with autosize.
Here is an example
Here is the code:
<?xml version="1.0" encoding="utf-8"?>
<s:Application xmlns:fx="http://ns.adobe.com/mxml/2009"
xmlns:s="library://ns.adobe.com/flex/spark"
xmlns:mx="library://ns.adobe.com/flex/mx"
minWidth="955" minHeight="600">
<s:HGroup width="100%" height="100%" left="50" top="50">
<!-- Using Scroller-->
<s:VGroup width="400">
<mx:TabNavigator width="100%" height="300">
<s:NavigatorContent label="TAB" width="100%" height="100%">
<s:Scroller width="100%" height="100%">
<s:Group>
<s:Group width="100%" height="400">
<s:Rect width="100%" height="100%">
<s:fill>
<s:SolidColor color="#ff0000"/>
</s:fill>
</s:Rect>
</s:Group>
</s:Group>
</s:Scroller>
</s:NavigatorContent>
<s:NavigatorContent label="TAB" width="100%" height="100%">
<s:Scroller width="100%" height="100%">
<s:Group>
<s:Group width="100%" height="600">
<s:Rect width="100%" height="100%">
<s:fill>
<s:SolidColor color="#0000ff"/>
</s:fill>
</s:Rect>
</s:Group>
</s:Group>
</s:Scroller>
</s:NavigatorContent>
</mx:TabNavigator>
<s:Button width="100%" label="HELLO WORLD"/>
<s:Button width="100%" label="HELLO WORLD"/>
</s:VGroup>
<s:Spacer width="60"/>
<!-- Using Autosize-->
<s:VGroup top="50" left="50" width="400">
<mx:TabNavigator width="100%" minHeight="300" resizeToContent="true" >
<s:NavigatorContent label="TAB" width="100%" height="100%">
<s:Group width="100%" height="400">
<s:Rect width="100%" height="100%">
<s:fill>
<s:SolidColor color="#ff0000"/>
</s:fill>
</s:Rect>
</s:Group>
</s:NavigatorContent>
<s:NavigatorContent label="TAB" width="100%" height="100%">
<s:Group width="100%" height="500">
<s:Rect width="100%" height="100%">
<s:fill>
<s:SolidColor color="#0000ff"/>
</s:fill>
</s:Rect>
</s:Group>
</s:NavigatorContent>
</mx:TabNavigator>
<s:Button width="100%" label="HELLO WORLD"/>
<s:Button width="100%" label="HELLO WORLD"/>
</s:VGroup>
</s:HGroup>
</s:Application>
I am having a tabbednavigation application and inside one of the tabs I have 2 states "planner" and "Login". I want the Login state to be first, and after they logged in it will change to the planner state.
The thing is when it is in the login State I don7t want the tab bar to be visible, and when it changes to the Planner state it should become visible. I am trying to use the If clause but I can't get it to work.
Anyone an idea?
<?xml version="1.0" encoding="utf-8"?>
<s:View xmlns:fx="http://ns.adobe.com/mxml/2009"
xmlns:s="library://ns.adobe.com/flex/spark"
xmlns:ns1="*"
currentState="Login" preinitialize="view2_creationCompleteHandler(event)" title="Planner">
<fx:Script>
<![CDATA[
import mx.events.FlexEvent;
protected function view2_creationCompleteHandler(event:FlexEvent):void
{
if (this.currentState == "Login") {
// TODO Auto-generated method stub
this.tabBarVisible = false;
}
else {
this.tabBarVisible = true;
}
}
]]>
</fx:Script>
<s:states>
<s:State name="planner"/>
<s:State name="Login"/>
</s:states>
<fx:Declarations>
<!-- Place non-visual elements (e.g., services, value objects) here -->
</fx:Declarations>
<s:BorderContainer includeIn="Login" width="320" height="364" >
</s:BorderContainer>
<s:HGroup includeIn="planner" y="10" width="320" height="46" horizontalAlign="center"
textAlign="center">
<ns1:Lbtn width="34" height="35"/>
<ns1:weekdisplay height="35"/>
<ns1:Rbtn width="34" height="35"/>
</s:HGroup>
<s:VGroup includeIn="planner" y="55" width="100%" gap="-1" paddingBottom="0" paddingLeft="0"
paddingRight="0" paddingTop="0">
<s:BorderContainer x="0" y="319" width="100%" height="45" backgroundColor="#E6E6E6"
borderStyle="inset" borderWeight="1">
<s:Label width="70" height="45" text="Mon" textAlign="center" verticalAlign="middle"/>
<s:Label x="70" width="250" height="45" text="Click to add dish" textAlign="center"
verticalAlign="middle"/>
</s:BorderContainer>
<s:BorderContainer x="0" y="319" width="100%" height="45" borderStyle="inset" borderWeight="1" >
<s:Label width="70" height="45" text="Tue" textAlign="center" verticalAlign="middle"/>
<s:Label x="70" width="250" height="45" text="Click to add dish " textAlign="center"
verticalAlign="middle"/>
</s:BorderContainer>
<s:BorderContainer x="0" y="319" width="100%" height="45" backgroundColor="#E6E6E6"
borderStyle="inset" borderWeight="1">
<s:Label width="70" height="45" text="Wed" textAlign="center" verticalAlign="middle"/>
<s:Label x="70" width="250" height="45" text="Click to add dish" textAlign="center"
verticalAlign="middle"/>
</s:BorderContainer>
<s:BorderContainer x="0" y="319" width="100%" height="45" borderStyle="inset" borderWeight="1" >
<s:Label width="70" height="45" text="Thu" textAlign="center" verticalAlign="middle"/>
<s:Label x="70" width="250" height="45" text="Click to add dish" textAlign="center"
verticalAlign="middle"/>
</s:BorderContainer>
<s:BorderContainer x="0" y="319" width="100%" height="45" backgroundColor="#E6E6E6"
borderStyle="inset" borderWeight="1">
<s:Label width="70" height="45" text="Fri" textAlign="center" verticalAlign="middle"/>
<s:Label width="250" height="45" text="Click to add dish" textAlign="center"
x="70" verticalAlign="middle"/>
</s:BorderContainer>
<s:BorderContainer x="0" y="319" width="100%" height="45" borderStyle="inset" borderWeight="1" >
<s:Label width="70" height="45" text="Sat" textAlign="center" verticalAlign="middle"/>
<s:Label x="70" width="250" height="45" text="Click to add dish" textAlign="center"
verticalAlign="middle"/>
</s:BorderContainer>
<s:BorderContainer x="0" y="319" width="100%" height="45" backgroundColor="#E6E6E6"
borderStyle="inset" borderWeight="1">
<s:Label width="70" height="45" text="Sun" textAlign="center" verticalAlign="middle"/>
<s:Label x="70" width="250" height="45" text="Click to add dish" textAlign="center"
verticalAlign="middle"/>
</s:BorderContainer>
</s:VGroup>
<s:TextInput id="LoginName" includeIn="Login" y="192" left="15" right="15" text="Email address"/>
<s:TextInput id="LoginPassword" includeIn="Login" y="247" left="15" right="15" text="Password"/>
<s:Button id="LoginLogin" includeIn="Login" y="306" right="15" width="100" height="30"
label="Login" click="this.currentState="planner""/>
<s:Button id="LoginCreate" includeIn="Login" y="306" left="15" width="100" height="30"
label="Create"/>
<s:Label includeIn="Login" x="166" y="39" width="113" height="101" fontSize="30"
text="Menu
Planner"/>
</s:View>
<?xml version="1.0" encoding="utf-8"?>
<s:View xmlns:fx="http://ns.adobe.com/mxml/2009"
xmlns:s="library://ns.adobe.com/flex/spark"
currentState="login" tabBarVisible="{currentState!='login'}">
<s:actionContent>
<s:Button includeIn="login" label="login" click="currentState='planner'"/>
</s:actionContent>
<s:states>
<s:State name="login"/>
<s:State name="planner"/>
</s:states>
</s:View>
In following code, I have one large component, and I'd like only the level4 panel to be scrollable, but instead, the whole application become scrollable.
Any suggestion ? Thanks
<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml">
<mx:Panel width="100%" height="100%" title="level1">
<mx:Panel width="100%" height="100%" title="level2">
<mx:HDividedBox width="100%" height="100%">
<mx:TextArea width="200" height="100%"/>
<mx:Panel width="100%" height="100%" title="level3">
<mx:ApplicationControlBar width="100%" dock="true">
<mx:Spacer width="30"/>
<mx:LegendItem width="80" height="20" fill="#CC9900" label="test1"/>
</mx:ApplicationControlBar>
<mx:Panel width="100%" height="100%" title="level4">
<mx:UIComponent width="2000" height="2000"/>
</mx:Panel>
</mx:Panel>
</mx:HDividedBox>
</mx:Panel>
</mx:Panel>
</mx:Application>
If I set ScrollPolicy, then no scrollbar will be shown up. Please check the following, thanks.
<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" horizontalScrollPolicy="off" verticalScrollPolicy="off">
<mx:Panel width="100%" height="100%" title="level1" horizontalScrollPolicy="off" verticalScrollPolicy="off">
<mx:Panel width="100%" height="100%" title="level2" horizontalScrollPolicy="off" verticalScrollPolicy="off">
<mx:HDividedBox width="100%" height="100%">
<mx:TextArea width="200" height="100%"/>
<mx:Panel width="100%" height="100%" title="level3" horizontalScrollPolicy="off" verticalScrollPolicy="off">
<mx:ApplicationControlBar width="100%" dock="true">
<mx:Spacer width="30"/>
<mx:LegendItem width="80" height="20" fill="#CC9900" label="test1"/>
</mx:ApplicationControlBar>
<mx:Panel width="100%" height="100%" title="level4" horizontalScrollPolicy="auto" verticalScrollPolicy="auto">
<mx:UIComponent width="2000" height="2000"/>
</mx:Panel>
</mx:Panel>
</mx:HDividedBox>
</mx:Panel>
</mx:Panel>
</mx:Application>
Set layout="absolute" for the level4 panel.
You can change the value of .verticalScrollBarPolicy for each Panel, setting it to "off" for the Panels that should not scroll, and to "on" or "auto" for the Panels that should scroll. There is also a .horizontalScrollBarPolicy parameter if you need that as well.
I'm having the hardest time finding a way to simply add rounded tabs to a TabNavigator control.
I have seen examples which seem to be really simple but they don't seem to work in Flex 4.5. Here is some sample code:
<?xml version="1.0" encoding="utf-8"?>
<s:Application xmlns:fx="http://ns.adobe.com/mxml/2009"
xmlns:s="library://ns.adobe.com/flex/spark"
xmlns:mx="library://ns.adobe.com/flex/mx" minWidth="955" minHeight="600">
<fx:Declarations>
<!-- Place non-visual elements (e.g., services, value objects) here -->
</fx:Declarations>
<fx:Style source="style.css"/>
<mx:TabNavigator x="93" y="90" width="571" height="293" tabStyleName="tabstyle">
<s:NavigatorContent width="100%" height="100%" label="Tab 1">
</s:NavigatorContent>
</mx:TabNavigator>
</s:Application>
and the css:
/* CSS file */
#namespace s "library://ns.adobe.com/flex/spark";
#namespace mx "library://ns.adobe.com/flex/mx";
.tabstyle
{
corner-radius: 10;
}
I have also tried cornerRadius: 10;
Any ideas why this does not work? Any easy to follow solution (I'm a beginner).
Thanks.
You could create a skin for your app/tab navigator, use the 'create copy of' option in Flash Builder, and in the Rect section, set the radiusX, radiusY values. Then use that skin for the component
This is the best and easiest workaround I know for this problem. It seems Adobe never solved this bug.
<s:VGroup width="100%" height="100%" gap="0" >
<s:Group width="100%">
<s:TabBar left="4" dataProvider="{tabNav}" cornerRadius="4" />
</s:Group>
<s:BorderContainer width="100%" height="100%" cornerRadius="4">
<mx:ViewStack id="tabNav" paddingBottom="10" width="100%" height="100%" >
<s:NavigatorContent label="Form" width="100%" height="100%">
...
</s:NavigatorContent>
<mx:Canvas id="treeNode" label="TreeNodeComponent" width="100%" height="100%">
...
</mx:Canvas>
<mx:Canvas id="melding" label="Melding" width="100%" height="100%" visible="{authorisation.moduleHasUserAutorization('melding')}" includeInLayout="{melding.visible}">
...
</mx:Canvas>
</mx:ViewStack>
</s:BorderContainer>
</s:VGroup>
It's the equivalent of this but with rounded corners in the tabs (and body):
<mx:TabNavigator id="tabNav" paddingBottom="10" width="100%" height="100%" >
<s:NavigatorContent label="Form" width="100%" height="100%">
...
</s:NavigatorContent>
<mx:Canvas id="treeNode" label="TreeNodeComponent" width="100%" height="100%">
...
</mx:Canvas>
<mx:Canvas id="melding" label="Melding" width="100%" height="100%" visible="{authorisation.moduleHasUserAutorization('melding')}" includeInLayout="{melding.visible}">
...
</mx:Canvas>
</mx:TabNavigator>
Try this!
<mx:TabNavigator id="tabNavigator" tabOffset="20" cornerRadius="10" height="100%" width="100%">
This is the sample code you can copy and run
<s:NavigatorContent id="search" label="Search" width="100%" height="100%" fontWeight="bold"
>
<s:layout>
<s:VerticalLayout horizontalAlign="center"
paddingTop="5" paddingLeft="5"
paddingRight="5" paddingBottom="5" />
</s:layout>
<s:Label text="Search Panel" />
<s:HGroup >
<s:TextInput id="Searchtxt" width="200" />
<mx:Button label="search" click="Searchtxt.text=''" />
</s:HGroup>
</s:NavigatorContent>
<s:NavigatorContent id="custInfo" label="Customer Info" backgroundColor="0xDCDCDC"
width="100%" height="100%" fontWeight="bold" >
<s:layout>
<s:VerticalLayout horizontalAlign="center"
paddingTop="5" paddingLeft="5"
paddingRight="5" paddingBottom="5" />
</s:layout>
<s:Label text="Customer Info" />
<s:HGroup>
<s:Label text="Email Address"/>
<s:TextInput id="email" width="200"/>
<s:Button label="Submit" click="email.text='';" />
</s:HGroup>
</s:NavigatorContent>
<s:NavigatorContent id="accountInfo" label="Account Info" backgroundColor="0xDCDCDC" width="100%" height="100%" fontWeight="bold" >
<s:layout>
<s:VerticalLayout horizontalAlign="center"
paddingTop="5" paddingLeft="5"
paddingRight="5" paddingBottom="5" />
</s:layout>
<s:Label text="Account Info" />
<s:HGroup>
<s:Button label="Purchases" />
<s:Button label="Sales" />
<s:Button label="Reports" />
</s:HGroup>
</s:NavigatorContent>
</mx:ViewStack>
No matter what value I put in the horizontalCenter property of the "Browse" button, it just follows the horizontalAlign property of the VGroup. Why is that ?
Thanks
<s:Group width="100%" height="100%" left="0" right="0" top="0" bottom="0">
<s:Panel id="mainPanel" title="File uploader" width="75%" height="75%" horizontalCenter="0" verticalCenter="0">
<s:controlBarContent> <s:Label text="foo"/> </s:controlBarContent>
<mx:HDividedBox width="100%" height="100%">
<s:VGroup width="25%" height="100%" paddingLeft="10" paddingRight="10" paddingTop="10" paddingBottom="10">
<s:TextArea width="100%" height="100%" />
<s:Button label="Browse" horizontalCenter="30"/>
</s:VGroup>
<s:TextArea width="100%" height="100%" />
</mx:HDividedBox>
</s:Panel>
</s:Group>
The VGroup in Flex 4 uses spark.layouts.VerticalLayout which doesn't take into account horizontalCenter/verticalCenter :/. I don't like that myself.
But since your VGroup's child TextArea is 100% width/height, you can use the VerticalLayout/VGroup horizontalAlign property: horizontalAlign="center". That works:
<s:Group width="100%" height="100%" left="0" right="0" top="0" bottom="0">
<s:Panel id="mainPanel" title="File uploader" width="75%" height="75%" horizontalCenter="0" verticalCenter="0">
<s:controlBarContent>
<s:Label text="foo"/>
</s:controlBarContent>
<mx:HDividedBox width="100%" height="100%">
<s:VGroup width="25%" height="100%" paddingLeft="10" horizontalAlign="center" paddingRight="10" paddingTop="10" paddingBottom="10">
<s:TextArea width="100%" height="100%" />
<s:Button label="Browse" horizontalCenter="30"/>
</s:VGroup>
<s:TextArea width="100%" height="100%" />
</mx:HDividedBox>
</s:Panel>
</s:Group>