blob: bae7a4d49fca9f6198b41bd7c2d8313da47b0e5b [file] [log] [blame]
<?xml version="1.0" encoding="utf-8"?>
<!--
Licensed to the Apache Software Foundation (ASF) under one or more
contributor license agreements. See the NOTICE file distributed with
this work for additional information regarding copyright ownership.
The ASF licenses this file to You under the Apache License, Version 2.0
(the "License"); you may not use this file except in compliance with
the License. You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
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.
-->
<s:Group xmlns:fx="http://ns.adobe.com/mxml/2009"
xmlns:s="library://ns.adobe.com/flex/spark"
xmlns:mx="library://ns.adobe.com/flex/mx"
implements="com.flexcapacitor.views.IInspector"
xmlns:renderers="com.flexcapacitor.views.renderers.*"
styleName="inspectablePanel">
<fx:Script>
<![CDATA[
import com.flexcapacitor.controller.Radiate;
import com.flexcapacitor.events.RadiateEvent;
import com.flexcapacitor.model.StyleMetaData;
import com.flexcapacitor.utils.ClassUtils;
import mx.core.FlexGlobals;
import mx.core.UIComponent;
import mx.managers.ISystemManager;
public var radiate:Radiate;
public var target:Object;
public var data:Object;
public var fonts:Array;
public function activate():void {
radiate = Radiate.getInstance();
radiate.addEventListener(RadiateEvent.TARGET_CHANGE, handleTargetChange, false, 0, true);
radiate.addEventListener(RadiateEvent.PROPERTY_CHANGED, propertyChangeHandler, false, 0, true);
if (radiate.target) {
target = radiate.target;
}
update();
}
public function deactivate():void {
radiate.removeEventListener(RadiateEvent.TARGET_CHANGE, handleTargetChange);
radiate.removeEventListener(RadiateEvent.PROPERTY_CHANGED, propertyChangeHandler);
}
protected function handleTargetChange(event:RadiateEvent):void {
if (target!=event.selectedItem) {
target = event.selectedItem;
update();
}
}
protected function propertyChangeHandler(event:RadiateEvent):void {
callLater(update);
}
public function update():void {
var fontFamilyStyle:StyleMetaData = ClassUtils.getMetaDataOfStyle(target, "fontFamily"); // font
var fontSizeStyle:StyleMetaData = ClassUtils.getMetaDataOfStyle(target, "fontSize"); // size
var fontWeightStyle:StyleMetaData = ClassUtils.getMetaDataOfStyle(target, "fontWeight"); // bold
var fontStyleStyle:StyleMetaData = ClassUtils.getMetaDataOfStyle(target, "fontStyle"); // italic
var textDecorationStyle:StyleMetaData = ClassUtils.getMetaDataOfStyle(target, "textDecoration"); // underline
var colorStyle:StyleMetaData = ClassUtils.getMetaDataOfStyle(target, "color"); // color
if (fonts==null) {
fonts = getFontInformationDetails(target);
}
fontFamilyStyle.enumeration = fonts;
//fontsRenderer.data = data;
fontsRenderer.data = fontFamilyStyle;
fontSizeRenderer.data = fontSizeStyle;
fontWeightRenderer.data = fontWeightStyle;
fontStyleRenderer.data = fontStyleStyle;
colorRenderer.data = colorStyle;
}
/**
* Gets details about the embedded fonts
* */
public function getFontInformationDetails(target:Object, showDeviceFontInformation:Boolean = true):Array {
var component:UIComponent = target as UIComponent;
var systemManager:ISystemManager = component ? component.systemManager : null;
var dictionary:Dictionary = new Dictionary(true);
var fontList:Array = Font.enumerateFonts(showDeviceFontInformation);
var length:int = fontList.length;
var output:String = "";
var fontObject:Object;
var paddedName:String;
var name:String;
var font:Font;
if (systemManager==null && FlexGlobals.topLevelApplication.systemManager) {
output += systemManager==null ? "Warning: Target system manager is null. Using FlexGlobals top level application system manager\n" : "";
systemManager = FlexGlobals.topLevelApplication.systemManager;
}
else if (systemManager==null) {
output += "Could not find system manager";
return [];
}
for (var i:int;i<length;i++)
{
font = Font(fontList[i]);
name = font.fontName;
if (dictionary[name]==1) continue;
dictionary[name] = 1;
paddedName = name; //padString(name, minimumStyleNamePadding);
fontObject = getFontFamilyEmbedded(name, systemManager);
//output += prespace + paddedName;
if (fontObject.embeddedCFF.length>0) {
output += "Embedded CFF: " + fontObject.embeddedCFF.join(", ");
}
if (fontObject.embedded.length>0) {
if (fontObject.embeddedCFF.length>0) {
output+= "; ";
output+= "Embedded : ";
}
else {
output+= "Embedded: ";
}
output += fontObject.embedded.join(", ");
}
output += "\n";
}
return fontList;
}
/**
* Returns an object that contains an array of embedding information for the font with the given name.
* Includes embedded and embeddedCFF information. If null then the font and that style of the font
* are not embedded.<br/><br/>
* Example, <br/>
* <pre>
* var object:Object = getFontFamilyEmbedded("MyFont", myButton.systemManager);
* trace(object); // {embedded:[regular, italic], embeddedCFF:[regular, bold, italic, boldItalic]}
* </pre>
**/
public function getFontFamilyEmbedded(name:String, systemManager:ISystemManager):Object {
var textFormat:TextFormat = new TextFormat();
var fontDescription:String = "";
var embeddedCFF:Array = [];
var embedded:Array = [];
var boldItalic:Boolean;
var regular:Boolean;
var italic:Boolean;
var bold:Boolean;
textFormat.font = name;
// check for regular
regular = systemManager.isFontFaceEmbedded(textFormat);
if (regular) {
fontDescription = "regular";
if (isFontFaceEmbeddedCFF(textFormat, systemManager)) {
embeddedCFF.push(fontDescription);
}
if (!isFontFaceEmbeddedCFF(textFormat, systemManager)) {
embedded.push(fontDescription);
}
}
// check for bold
textFormat.bold = true;
bold = systemManager.isFontFaceEmbedded(textFormat);
if (bold) {
fontDescription = "bold";
if (isFontFaceEmbeddedCFF(textFormat, systemManager)) {
embeddedCFF.push(fontDescription);
}
if (!isFontFaceEmbeddedCFF(textFormat, systemManager)) {
embedded.push(fontDescription);
}
}
// check for bold and italic
textFormat.italic = true;
boldItalic = systemManager.isFontFaceEmbedded(textFormat);
if (boldItalic) {
fontDescription = "boldItalic";
if (isFontFaceEmbeddedCFF(textFormat, systemManager)) {
embeddedCFF.push(fontDescription);
}
if (!isFontFaceEmbeddedCFF(textFormat, systemManager)) {
embedded.push(fontDescription);
}
}
// check for italic
textFormat.bold = false;
italic = systemManager.isFontFaceEmbedded(textFormat);
if (italic) {
fontDescription = "italic";
if (isFontFaceEmbeddedCFF(textFormat, systemManager)) {
embeddedCFF.push(fontDescription);
}
if (!isFontFaceEmbeddedCFF(textFormat, systemManager)) {
embedded.push(fontDescription);
}
}
// there's probably alot of optimization that could go into this call
// but for now we are using this
return {embedded:embedded, embeddedCFF:embeddedCFF};
}
/**
* Checks if font is embedded and is also embeddedCFF.
* Does not run all methods system manager function runs.
*/
public function isFontFaceEmbeddedCFF(textFormat:TextFormat, systemManager:ISystemManager):Boolean
{
var fontName:String = textFormat.font;
var bold:Boolean = textFormat.bold;
var italic:Boolean = textFormat.italic;
var fontList:Array = Font.enumerateFonts();
var n:int = fontList.length;
for (var i:int = 0; i < n; i++)
{
var font:Font = Font(fontList[i]);
if (font.fontName == fontName)
{
var style:String = "regular";
if (bold && italic)
style = "boldItalic";
else if (bold)
style = "bold";
else if (italic)
style = "italic";
if (font.fontStyle == style ) {
if (font.fontType=="embeddedCFF") {
return true;
}
else {
return false;
}
}
}
}
return false;
}
]]>
</fx:Script>
<s:layout>
<s:VerticalLayout />
</s:layout>
<s:HGroup width="100%" verticalAlign="baseline" gap="{getStyle('gap')}">
<s:Label text="Font Family" styleName="inspectablePanelLabel" width="{getStyle('labelWidth')}"/>
<renderers:ComboBoxRenderer id="fontsRenderer" height="24" labelField="fontName"
valueIsField="true" fieldIsValue="true"
minWidth="180"/>
</s:HGroup>
<s:HGroup width="100%" verticalAlign="baseline" gap="{getStyle('gap')}">
<s:Label text="Font Weight" styleName="inspectablePanelLabel" width="{getStyle('labelWidth')}"/>
<renderers:DropDownListRenderer id="fontWeightRenderer" height="24" />
</s:HGroup>
<s:HGroup width="100%" verticalAlign="baseline" gap="{getStyle('gap')}">
<s:Label text="Font Size" styleName="inspectablePanelLabel" width="{getStyle('labelWidth')}"/>
<renderers:NumberRenderer id="fontSizeRenderer" height="24" showClearButton="true"/>
</s:HGroup>
<s:HGroup width="100%" verticalAlign="baseline" gap="{getStyle('gap')}">
<s:Label text="Font Style" styleName="inspectablePanelLabel" width="{getStyle('labelWidth')}"/>
<renderers:DropDownListRenderer id="fontStyleRenderer" height="24"/>
</s:HGroup>
<s:HGroup width="100%" verticalAlign="baseline" gap="{getStyle('gap')}">
<s:Label text="Color" styleName="inspectablePanelLabel" width="{getStyle('labelWidth')}"/>
<renderers:ColorPickerRenderer id="colorRenderer" height="24" includeCopyIcon="false"/>
</s:HGroup>
</s:Group>