http://git-wip-us.apache.org/repos/asf/flex-radii8/blob/f370bfcf/Radii8Library/src/com/flexcapacitor/views/panels/CodeInspector.mxml ---------------------------------------------------------------------- diff --git a/Radii8Library/src/com/flexcapacitor/views/panels/CodeInspector.mxml b/Radii8Library/src/com/flexcapacitor/views/panels/CodeInspector.mxml new file mode 100644 index 0000000..77f80b8 --- /dev/null +++ b/Radii8Library/src/com/flexcapacitor/views/panels/CodeInspector.mxml @@ -0,0 +1,1480 @@ +<?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" + xmlns:c="com.flexcapacitor.controls.*" + xmlns:handlers="com.flexcapacitor.handlers.*" + xmlns:clipboard="com.flexcapacitor.effects.clipboard.*" + xmlns:status="com.flexcapacitor.effects.status.*" + xmlns:flexiframe="com.google.code.flexiframe.*" + xmlns:controls="com.riaspace.controls.*" + + minWidth="200" + minHeight="100" + implements="com.flexcapacitor.views.IInspector" + resize="editor_resizeHandler(event)" + > + + + <!-- + Notes: + + It may be worth investigating Moonshine project. + + ******************************* + Code highlighting + ******************************* + Currently there are 3 editors, a spark textarea with no + syntax highlighting, a mx text area with syntax highlighting + but some redraw issues and no undo or redo support and + an html based editor called ace editor that is awesome + but has a bug in firefox where the code cannot be edited. + when it becomes uneditable you have to click on the flex + application and then click back into the editor. + it also does not resize correctly but that may be a + flex issue. it also is being erased when hidden and revealed. + + + + ******************************* + Writing code + ******************************* + the code editor only shows the code of the selection or document. + it is not yet tied to the component to allow the user to enter + code and have it be retained. + + in the future there may be a second code window to show or edit the + code of the selected event. this would listen for an event like + the property or style selected event that the metadata panel uses. + and / or there may be a option to show all document code or + only event code. + + what most likely will happen is that this panel will be used to show + the selected objects generated code and or the event code. + then there would be full sized editors that open up in new + tabs that show the complete document code. or for purposes of + split view this would continue to server both purposes. + + + ******************************* + Generating Code: + ******************************* + this is the second or third iteration of generating source code + but it is inadequate. + there is code already started in the ComponentDecription class that + should be better. the component description would have a static + property called exporter. this would be a class that would be + used to generate the code. it would return the correct code through + the componentDescription.toString() method. + + There would be a HTML exporter, MXML exporter and so on. + + Currently the properties and the styles are not set on the + componentDescription instance. This is why we are using the current + method. + --> + + <fx:Script> + <![CDATA[ + import com.flexcapacitor.controller.Radiate; + import com.flexcapacitor.events.RadiateEvent; + import com.flexcapacitor.model.IDocument; + import com.flexcapacitor.model.IProject; + import com.flexcapacitor.utils.AndroidDocumentExporter; + import com.flexcapacitor.utils.ClassUtils; + import com.flexcapacitor.utils.DisplayObjectUtils; + import com.flexcapacitor.utils.HTMLDocumentExporter; + import com.flexcapacitor.utils.SyntaxHighlighter; + import com.flexcapacitor.utils.XMLUtils; + import com.flexcapacitor.utils.supportClasses.ComponentDescription; + import com.google.code.flexiframe.IFrame; + + import mx.collections.ArrayList; + import mx.events.FlexEvent; + import mx.events.ResizeEvent; + + import spark.components.Application; + import spark.events.IndexChangeEvent; + import spark.events.TextOperationEvent; + + public static const HTML:String = "HTML"; + public static const MXML:String = "MXML"; + public static const ANDROID:String = "Android"; + public static const XAML:String = "XAML"; + + /** + * Reference to Radiate + * */ + public var radiate:Radiate; + + [Bindable] + public var exportWindow:Boolean; + + + + /** + * Indicates if XML is invalid + * */ + [Bindable] + public var isValid:Boolean; + + /** + * Error event, if any occurs, from generated code + * */ + [Bindable] + public var error:Error; + + /** + * Error message, if any occurs, from generated code + * */ + [Bindable] + public var errorMessage:String; + + /** + * Error messages, if any, from generated code + * */ + [Bindable] + public var errors:Array = []; + + /** + * Warning messages, if any, from generated code + * */ + [Bindable] + public var warnings:Array = []; + + + public function activate():void { + radiate = Radiate.getInstance(); + + radiate.addEventListener(RadiateEvent.TARGET_CHANGE, handleTargetChange, false, 0, true); + radiate.addEventListener(RadiateEvent.PROPERTY_CHANGED, handlePropertyChange, false, 0, true); + radiate.addEventListener(RadiateEvent.MOVE_ITEM, handlePropertyChange, false, 0, true); + radiate.addEventListener(RadiateEvent.ADD_ITEM, handlePropertyChange, false, 0, true); + radiate.addEventListener(RadiateEvent.REMOVE_ITEM, handlePropertyChange, false, 0, true); + radiate.addEventListener(RadiateEvent.DOCUMENT_CHANGE, handleDocumentChange, false, 0, true); + + if (radiate.target) { + update(); + } + } + + public function deactivate():void { + if (radiate) { + radiate.removeEventListener(RadiateEvent.TARGET_CHANGE, handleTargetChange); + radiate.removeEventListener(RadiateEvent.PROPERTY_CHANGED, handlePropertyChange); + radiate.removeEventListener(RadiateEvent.MOVE_ITEM, handlePropertyChange); + radiate.removeEventListener(RadiateEvent.ADD_ITEM, handlePropertyChange); + radiate.removeEventListener(RadiateEvent.REMOVE_ITEM, handlePropertyChange); + radiate.removeEventListener(RadiateEvent.DOCUMENT_CHANGE, handleDocumentChange); + } + } + + public function reamoveListeners():void { + radiate = Radiate.getInstance(); + radiate.removeEventListener(RadiateEvent.TARGET_CHANGE, handleTargetChange); + radiate.removeEventListener(RadiateEvent.PROPERTY_CHANGED, handlePropertyChange); + radiate.removeEventListener(RadiateEvent.MOVE_ITEM, handlePropertyChange); + radiate.removeEventListener(RadiateEvent.ADD_ITEM, handlePropertyChange); + radiate.removeEventListener(RadiateEvent.REMOVE_ITEM, handlePropertyChange); + radiate.removeEventListener(RadiateEvent.DOCUMENT_CHANGE, handleDocumentChange); + + } + + /** + * Handle target change + * */ + protected function handleTargetChange(event:RadiateEvent):void { + + // if code is not modified by the user + // and show selection + // we only want to update the view on selection change when we are + // paying attention when we have show selected component code option enabled + if (!isCodeModifiedByUser) { + if (showSelection.selected) { + update(); + } + } + + if (updateCodeLive.selected) { + radiate.dispatchCodeUpdatedEvent(sourceCode, HTML); + } + } + + /** + * Updates the code when the document changes. + * */ + protected function handleDocumentChange(event:RadiateEvent):void { + var selectedDocument:IDocument = IDocument(event.selectedItem); + + + if (radiate.isPreviewVisible) { + //return; + } + + if (!isCodeModifiedByUser) { + update(true); + } + + if (updateCodeLive.selected) { + radiate.dispatchCodeUpdatedEvent(sourceCode, HTML); + } + } + + /** + * Updates the code when a property change happens. + * If the text has been modified by the user then we don't update the code. + * They have to press the resync button. + * */ + protected function handlePropertyChange(event:RadiateEvent):void { + + if (!isCodeModifiedByUser) { + update(true); + } + + if (updateCodeLive.selected) { + radiate.dispatchCodeUpdatedEvent(sourceCode, HTML); + } + } + + /** + * Updates the code to reflect the selected language + * */ + protected function codeType_changeHandler(event:IndexChangeEvent):void { + + update(true); + + // if HTML preview is visible then dispatch an event to + // so that preview can be changed else where + // needs refactoring + if (radiate.isPreviewDocumentVisible() && String(codeType.selectedItem)!=HTML) { + radiate.dispatchPreviewEvent(sourceCode, String(codeType.selectedItem)); + radiate.openDocument(radiate.selectedDocument); + radiate.closeDocument(radiate.selectedDocument, true); + } + + } + + /** + * Generate the code for the provided target component. + * */ + public function updateTarget(target:Object):void { + var iDocument:IDocument = radiate.selectedDocument; + var targetDescription:ComponentDescription; + var output:String = ""; + var noCodeMessage:String = "Enable Show Source Code to see source code."; + var xml:XML; + + + // find target in display list and get it's code + targetDescription = DisplayObjectUtils.getTargetInComponentDisplayList(target, iDocument.componentDescription); + + + if (targetDescription) { + + if (codeType.selectedItem==MXML) { + //output = getMXMLOutputString(targetDescription, true); + output = iDocument.getSource(targetDescription); + errorMessage = iDocument.exporter.errorMessage; + } + else if (codeType.selectedItem==HTML) { + var includePreviewCode:Boolean = true; + + if (htmlExporter==null) { + htmlExporter = new HTMLDocumentExporter(); + } + + //htmlExporter.document = iDocument; + htmlExporter.showFullHTMLPageSource = showFullHTMLPageSource; + htmlExporter.useInlineStyles = setStylesInline.selected; + htmlExporter.showBorders = showBorders; + htmlExporter.showBordersCSS = showBordersCSS; + htmlExporter.addZoom = exportWindow ? false : setZoom.selected; + htmlExporter.zoomCSS = zoomCSS; + htmlExporter.useSVGButtonClass = useSVGButtonClass; + htmlExporter.css = css; + htmlExporter.stylesheets = stylesheets; + htmlExporter.target = target; + htmlExporter.buttonCSS2 = buttonCSS2; + htmlExporter.includePreviewCode = includePreviewCode; + htmlExporter.template = html5boilerplate; + htmlExporter.showOnlyHTML = showOnlyHTML; + htmlExporter.showOnlyCSS = showOnlyCSS; + htmlExporter.showScreenshotBackground = showBackgroundImage; + + output = htmlExporter.export(iDocument, false, target); + + errorMessage = htmlExporter.errorMessage; + } + else if (codeType.selectedItem==ANDROID) { + //output = getAndroidOutputString(targetDescription, true, "", true); + + if (androidExporter==null) { + androidExporter = new AndroidDocumentExporter(); + } + + output = androidExporter.exportXMLString(iDocument, false, target); + } + + + + if (codeType.selectedItem==HTML) { + + try { + // don't use XML for HTML output because it converts this: + // <div ></div> + // to this: + // <div /> + // and that breaks the html page + + // we can still try it to make sure it's valid + xml = new XML(output); // check if valid + + sourceCode = output; + + // passing the raw string not the xml + if (showSourceCode) { + setTextareaCode(output); + } + else { + setTextareaCode(noCodeMessage); + } + } + catch (error:Error) { + // Error #1083: The prefix "s" for element "Group" is not bound. + // <s:Group x="93" y="128"> + // <s:Button x="66" y="17"/> + //</s:Group> + sourceCode = output; + + // passing the raw string not the xml + if (showSourceCode) { + setTextareaCode(output); + } + else { + setTextareaCode(noCodeMessage); + } + } + } + else { + sourceCode = output; + // passing the raw string not the xml + //if (showSourceCode) { + setTextareaCode(output); + //} + //else { + // setTextareaCode(noCodeMessage); + //} + } + + } + else { + sourceCode = ""; + setTextareaCode(""); + } + } + + + /** + * Get application code + * */ + public function getDocumentCode():String { + updateTarget(radiate.selectedDocument.instance); + + return sourceCode; + } + + /** + * Get the vertical position string for HTML + * */ + /*public function getVerticalPositionHTML(instance:IVisualElement, propertyModel:Styles, stylesValue:String = "", isBasicLayout:Boolean = true):String { + + if (!isBasicLayout) return stylesValue; + + if (instance.verticalCenter!=null) { + stylesValue += "display:block;margin:" + instance.verticalCenter + " auto;"; + stylesValue = stylesValue.replace("absolute", "relative"); + + propertyModel.display = Styles.BLOCK; + propertyModel.position = Styles.RELATIVE; + propertyModel.margin = instance.verticalCenter + " auto;"; + + return stylesValue; + } + else if (instance.top!=null || instance.bottom!=null) { + stylesValue += instance.top!=null ? "top:" + instance.top + "px;" : ""; + stylesValue += instance.bottom!=null ? "bottom:" + instance.bottom + "px;" : ""; + if (instance.top!=null) propertyModel.top = instance.top + "px"; + if (instance.bottom!=null) propertyModel.bottom = instance.bottom + "px"; + return stylesValue; + } + else { + stylesValue += "top:" + instance.y + "px;"; + propertyModel.top = instance.y + "px;"; + } + + return stylesValue; + }*/ + + + /** + * Get the document code and dispatch a preview event. + * */ + protected function previewButton_clickHandler(event:MouseEvent):void { + var document:Object; + + if (!radiate.selectedDocument) return; + + if (!isCodeModifiedByUser) { + var code:String = getDocumentCode(); // puts document code into text area + } + + // allow to swap between preview and non preview + if (!radiate.isPreviewDocumentVisible()) { + radiate.openDocumentPreview(radiate.selectedDocument, true); + document = radiate.getDocumentPreview(radiate.selectedDocument); + + if (document is IFrame) { + document.content = wrapInPreview(sourceCode); + } + + //radiate.dispatchPreviewEvent(codeModelTextArea.text, String(codeType.selectedItem)); + } + else { + radiate.openDocument(radiate.selectedDocument); + //radiate.dispatchPreviewEvent(codeModelTextArea.text, ""); + } + } + + + /** + * Text has changed in the textarea. Update preview if visible + * */ + protected function sparkTextArea_changeHandler(event:TextOperationEvent = null):void { + //Radiate.log.info("Text area code changed"); + + updatePreviewDocument(); + + if (sparkSyntaxHighlighter) { + //sparkSyntaxHighlighter.highlightCode(); + } + + if (codeType.selectedItem == HTML) { + isCodeModifiedByUser = true; + } + + lastTextAreaValue = sparkTextArea.text; + + } + + /** + * MX TextArea change + * */ + private function mxTextAreaChangeHandler():void { + updatePreviewDocument(); + mxSyntaxHighlighter.highlightCode(); + // saveData(); this was attempt to add undo history to mxTextArea - didn't work + lastTextAreaValue = mxTextArea.text; + + + if (codeType.selectedItem == HTML) { + isCodeModifiedByUser = true; + } + + isValid = XMLUtils.isValidXML(lastTextAreaValue); + + if (!isValid) { + error = XMLUtils.validationError; + errorMessage = XMLUtils.validationErrorMessage; + } + else { + error = null; + errorMessage = null; + } + } + + /** + * AS3 TextArea change + * */ + protected function as3TextArea_changeHandler(event:TextOperationEvent):void { + + updatePreviewDocument(); + + + if (codeType.selectedItem == HTML) { + isCodeModifiedByUser = true; + } + + lastTextAreaValue = as3TextArea.text; + } + + + /** + * Handle updating preview and set if code is modified by user + * */ + public function updatePreviewDocument():void { + + if (updateCodeLive.selected) { + + if (radiate.isPreviewDocumentVisible()) { + var preview:Object = radiate.getDocumentPreview(radiate.selectedDocument); + + if (preview is IFrame) { + preview.content = wrapInPreview(getTextAreaCode()); + } + + //radiate.dispatchPreviewEvent(codeModelTextArea.text, String(codeType.selectedItem)); + } + //radiate.dispatchCodeUpdatedEvent(codeModelTextArea.text, HTML); + } + + } + + /** + * + * */ + protected function showSelection_clickHandler(event:MouseEvent):void { + update(true); + } + + /** + * Indicates when the user has typed in the text area + * */ + [Bindable] + public var isCodeModifiedByUser:Boolean; + + /** + * Show borders around HTML elements + * */ + [Bindable] + public var showBorders:Boolean; + + /** + * Use SVG button class + * */ + [Bindable] + public var useSVGButtonClass:Boolean = true; + + /** + * Show full HTML page source + * */ + [Bindable] + public var showFullHTMLPageSource:Boolean = false; + + /** + * Show only HTML + * */ + [Bindable] + public var showOnlyHTML:Boolean = false; + + /** + * Do not show source code. Syntax highlighting source code can be + * performance intensive so we allow the option to disable it. + * */ + [Bindable] + public var showSourceCode:Boolean = true; + + /** + * Show only CSS + * */ + [Bindable] + public var showOnlyCSS:Boolean = false; + + /** + * Create screen shot and add as background image of HTML page + * */ + [Bindable] + public var showBackgroundImage:Boolean = false; + + /** + * + * */ + protected function resyncButton_clickHandler(event:MouseEvent):void { + isCodeModifiedByUser = false; + update(true); + } + + /** + * Updates the code to show the selected item or document + * */ + public function update(dispatchCodeUpdatedEvent:Boolean = false):void { + radiate = Radiate.getInstance(); + + if (!radiate.target && !radiate.selectedDocument) return; + + if (showSelection.selected) { + updateTarget(radiate.target); + } + else { + updateTarget(radiate.selectedDocument.instance); + } + + if (dispatchCodeUpdatedEvent) { + + //if (radiate.isPreviewDocumentVisible()) { + document = radiate.getDocumentPreview(radiate.selectedDocument); + + if (document is IFrame) { + document.content = wrapInPreview(sourceCode); + } + + //radiate.dispatchPreviewEvent(codeModelTextArea.text, String(codeType.selectedItem)); + //} + + radiate.dispatchCodeUpdatedEvent(sourceCode, HTML, openInSeparateWindow.selected); + } + + if (radiate.target is Application) { + targetNameLabel.text = "Application"; + } + else { + targetNameLabel.text = ClassUtils.getIdentifierOrName(radiate.target, true, true); + } + /* + var functionName:String = "createEditor"; + var result:Object; + if (currentState=="iframe" && !createdEditor) { + editor.content = "<div id='editor' style='display:block;position:absolute;top:0px;left:0px;right:0px;bottom:0px;height:100%;'></div>"; + editor.validateNow(); + result = ExternalInterface.call(functionName); + result = ExternalInterface.call("setEditorText", codeModelTextArea.text); + createdEditor = true; + }*/ + + return; + + } + + private function callback():void { + trace("CALLBACK"); + } + + private var aceEditorCreated:Boolean; + private var aceEditorVisible:Boolean; + + /** + * Get a tag with less than or greater than wrapped around it. + * */ + private function getWrapperTag(wrapperTag:String = "", end:Boolean = false, styles:String = ""):String { + var output:String = ""; + + if (wrapperTag=="") return ""; + + if (end) { + output = "</" + wrapperTag + ">"; + return output; + } + + output += "<" + wrapperTag; + + if (styles) { + output += " style=\"" + styles + "\"" ; + } + + output += ">"; + + return output; + } + + /** + * Enable or disable live updating as on target change, property change and + * user code changes. + * + * If user unchecks and is modified then do not update. + * Resync button will visible for them to update themselves. + * */ + protected function updateCodeLive_changeHandler(event:Event):void { + + + if (updateCodeLive.selected) { + radiate.dispatchCodeUpdatedEvent(sourceCode, HTML); + } + else { + if (!isCodeModifiedByUser) { + radiate.dispatchCodeUpdatedEvent(sourceCode, HTML); + } + } + } + + + protected function openInSeparateWindow_changeHandler(event:Event):void { + + update(); + } + + protected function editor_updateCompleteHandler(event:FlexEvent):void { + + var result:Object = ExternalInterface.call("updateHeight", editor.height); + //trace(result); + } + + private var dataArray:Array= new Array(); + + private var currentData:int; + + private function saveData():void { + + if (dataArray.length<10) { + dataArray.push(mxTextArea.text); + } + else { + dataArray.splice(0,1); + dataArray.push(mxTextArea.text); + } + + currentData= dataArray.length-1; + } + + private function undo():void { + + if (currentData>0) { + mxTextArea.text=dataArray[currentData-1]; + currentData=currentData-1; + } + } + + private function redo():void { + if (currentData<dataArray.length-1){ + mxTextArea.text=dataArray[currentData+1]; + currentData=currentData+1; + } + } + + /** + * Last source code + * */ + [Bindable] + public var sourceCode:String; + + public var lastTextAreaValue:String; + + public var mxSyntaxHighlighter:SyntaxHighlighter; + public var sparkSyntaxHighlighter:SyntaxHighlighter; + + public function getTextAreaCode():String { + + if (currentState=="normal") { + return sparkTextArea.text; + } + else if (currentState=="highlight2") { + return as3TextArea.text; + } + else if (currentState=="highlight") { + return mxTextArea.text; + } + else if (currentState=="editor") { + var result:String = ExternalInterface.call("getEditorText"); + return result; + } + + return null; + } + + /** + * Put the generated code into a text area + * */ + public function setTextareaCode(value:String):void { + var createEditor:String = "createEditor"; + var result:Object; + + if (currentState=="normal") { + sparkTextArea.text = value; + + if (lastTextAreaValue==value) { + return; + } + + sparkTextArea.text = value; + lastTextAreaValue = value; + + if (!sparkSyntaxHighlighter) { + sparkSyntaxHighlighter = new SyntaxHighlighter(sparkTextArea); + sparkSyntaxHighlighter.timerInterval = 200; + sparkSyntaxHighlighter.cssString = SyntaxHighlighter.CRIMSON_EDITOR_CSS; + } + + sparkSyntaxHighlighter.highlightCode(); + aceEditorVisible = false; // temp for now + } + + else if (currentState=="highlight2") { + as3TextArea.text = value; + + if (lastTextAreaValue==value) { + return; + } + + as3TextArea.text = value; + lastTextAreaValue = value; +/* + if (!sparkSyntaxHighlighter) { + sparkSyntaxHighlighter = new SyntaxHighlighter(sparkTextArea); + sparkSyntaxHighlighter.timerInterval = 1; + sparkSyntaxHighlighter.cssString = SyntaxHighlighter.CRIMSON_EDITOR_CSS; + } + + sparkSyntaxHighlighter.highlightCode();*/ + aceEditorVisible = false; // temp for now + } + else if (currentState=="highlight") { + + if (lastTextAreaValue==value && mxSyntaxHighlighter) { + return; + } + + if (mxTextArea) { + mxTextArea.text = value; + } + + lastTextAreaValue = value; + + if (!mxSyntaxHighlighter) { + mxSyntaxHighlighter = new SyntaxHighlighter(mxTextArea); + mxSyntaxHighlighter.timerInterval = 20; + mxSyntaxHighlighter.cssString = SyntaxHighlighter.CRIMSON_EDITOR_CSS; + } + + mxSyntaxHighlighter.highlightCode(); + aceEditorVisible = false; // temp for now + } + else if (currentState=="editor") { + + if (!aceEditorCreated) { + editor.content = "<div id='editor1' style='display:block;position:absolute;top:0px;left:0px;right:0px;bottom:0px;height:100%;width:100%'></div>"; + //editor.content = " "; + editor.validateNow(); + result = ExternalInterface.call(createEditor, "editor0", ExternalInterface.objectID); + ExternalInterface.addCallback("editorChange", editorChange); + ExternalInterface.addCallback("cursorChange", cursorChange); + aceEditorCreated = true; + } + + settingEditorText = true; + result = ExternalInterface.call("setEditorText", value); + settingEditorText = false; + + } + + } + + protected function editorType_changeHandler(event:IndexChangeEvent):void { + currentState = event.currentTarget.selectedItem.name; + setTextareaCode(sourceCode); + } + + public function editorChange(value:String = ""):void { + if (settingEditorText || value==sourceCode) return; + updatePreviewDocument(); + } + + public function cursorChange(value:String = ""):void { + //trace("cursor change:" + getTimer()); + } + + protected function editor_resizeHandler(event:ResizeEvent):void { + //trace("resize from : " + event.currentTarget); + ExternalInterface.call("resizeEditor"); + } + + public var settingEditorText:Boolean; + + private var htmlExporter:HTMLDocumentExporter; + + private var androidExporter:AndroidDocumentExporter; + + private function wrapInPreview(source:String):String { + var componentTree:ComponentDescription = radiate.selectedDocument.componentDescription; + var targetDescription:ComponentDescription; + + if (showSelection.selected) { + targetDescription = DisplayObjectUtils.getTargetInComponentDisplayList(radiate.target, componentTree); + } + else { + targetDescription = DisplayObjectUtils.getTargetInComponentDisplayList(radiate.selectedDocument.instance, componentTree); + } + + if (targetDescription==null || radiate.target == componentTree.instance) { + targetDescription = componentTree; + } + + var output:String = "<div id=\"applicationContainer\" style=\"position:absolute;"; + //output += "width:" + (component.instance.width + 40) + "px;"; + output += "width:100%;"; + output += "height:" + (targetDescription.instance.height + 40) + "px;"; + output += "background-color:#666666;\">" + source + "</div>"; + + return output; + } + + protected function mxTextArea_keyUpHandler(event:KeyboardEvent):void { + if (event.keyCode==Keyboard.Z) { + if (event.ctrlKey && !event.shiftKey) { + undo(); + } + if (event.ctrlKey && event.shiftKey) { + redo(); + } + } + } + + protected function getHTMLButton_clickHandler(event:MouseEvent):void { + var htmlText:String = mxTextArea.htmlText; + trace(htmlText); + } + + protected function showBorders_clickHandler(event:MouseEvent):void { + showBorders = showBordersCheckbox.selected; + update(true); + } + + protected function useSVGButtonClassCheckbox_changeHandler(event:Event):void { + useSVGButtonClass = useSVGButtonClassCheckbox.selected; + update(true); + } + + protected function showFullHTMLCheckbox_clickHandler(event:MouseEvent):void { + showFullHTMLPageSource = showFullHTMLCheckbox.selected; + update(true); + } + + protected function setStylesInline_clickHandler(event:MouseEvent):void { + update(true); + } + + protected function setZoom_clickHandler(event:MouseEvent):void { + update(true); + } + + protected function showOnlyHTML_clickHandler(event:MouseEvent):void { + showOnlyHTML = showOnlyHTMLCheckbox.selected; + update(true); + } + + protected function showOnlyCSS_clickHandler(event:MouseEvent):void { + showOnlyCSS = showOnlyCSSCheckbox.selected; + update(true); + } + + protected function showBackgroundImageCheckbox_clickHandler(event:MouseEvent):void { + showBackgroundImage = showBackgroundImageCheckbox.selected; + update(true); + } + + protected function showSourceCodeCheckbox_clickHandler(event:MouseEvent):void { + showSourceCode = showSourceCodeCheckbox.selected; + update(true); + } + + protected function showOriginalSourceLabel_clickHandler(event:MouseEvent):void { + var selectedDocument:IDocument = radiate.selectedDocument as IDocument; + + if (selectedDocument) { + Radiate.log.info(selectedDocument.originalSource); + } + else { + Radiate.log.info("Please select a document"); + } + } + + protected function showProjectSourceLabel_clickHandler(event:MouseEvent):void { + var selectedProject:IProject = radiate.selectedProject as IProject; + + if (selectedProject) { + Radiate.log.info(selectedProject.source); + } + else { + Radiate.log.info("Please select a project"); + } + } + + ]]> + </fx:Script> + + <fx:Declarations> + + <fx:Object id="as3TextArea"/> + + <handlers:EventHandler eventName="click" target="{copyIcon}" setTriggerEvent="true"> + + <clipboard:CopyToClipboard data="{sourceCode}" + targetAncestor="{this}" + allowNullData="true"> + <clipboard:successEffect> + <status:ShowStatusMessage message="Code copied to the clipboard"/> + </clipboard:successEffect> + <clipboard:noDataEffect> + <status:ShowStatusMessage message="Nothing to copy to the clipboard"/> + </clipboard:noDataEffect> + <clipboard:errorEffect> + <status:ShowStatusMessage message="An error occurred while attempting to copy to the clipboard"/> + </clipboard:errorEffect> + </clipboard:CopyToClipboard> + + </handlers:EventHandler> + + <fx:String id="html5boilerplate"> +<![CDATA[<!DOCTYPE html> +<!--[if lt IE 7]> <html class="no-js lt-ie9 lt-ie8 lt-ie7"> <![endif]--> +<!--[if IE 7]> <html class="no-js lt-ie9 lt-ie8"> <![endif]--> +<!--[if IE 8]> <html class="no-js lt-ie9"> <![endif]--> +<!--[if gt IE 8]><!--> <html class="no-js"> <!--<![endif]--> + <head> + <meta charset="utf-8"> + <meta http-equiv="X-UA-Compatible" content="IE=edge"> + <title></title> + <meta name="description" content=""> + <meta name="viewport" content="width=device-width, initial-scale=1"> + + <!-- Place favicon.ico and apple-touch-icon.png in the root directory --> + + <link rel="stylesheet" href="css/normalize.css"> + <link rel="stylesheet" href="css/main.css"> + <script src="js/vendor/modernizr-2.6.2.min.js"></script> + </head> + <body> + <!--[if lt IE 7]> + <p class="browsehappy">You are using an <strong>outdated</strong> browser. Please <a href="http://browsehappy.com/">upgrade your browser</a> to improve your experience.</p> + <![endif]--> + +<!--template_content--> + + <script src="//ajax.googleapis.com/ajax/libs/jquery/1.10.2/jquery.min.js"></script> + <script>window.jQuery || document.write('<script src="js/vendor/jquery-1.10.2.min.js"><\\/script>')</script> + <script src="js/plugins.js"></script> + <script src="js/main.js"></script> + + <!-- Google Analytics: change UA-XXXXX-X to be your site's ID. --> + <script> + (function(b,o,i,l,e,r){b.GoogleAnalyticsObject=l;b[l]||(b[l]= + function(){(b[l].q=b[l].q||[]).push(arguments)});b[l].l=+new Date; + e=o.createElement(i);r=o.getElementsByTagName(i)[0]; + e.src='//www.google-analytics.com/analytics.js'; + r.parentNode.insertBefore(e,r)}(window,document,'script','ga')); + ga('create','UA-XXXXX-X');ga('send','pageview'); + </script> + </body> +</html> +]]> + </fx:String> + + <!--<![CDATA[<link rel="stylesheet" href="css/normalize/2.1.2/normalize.css"/>]]>--> + <fx:String id="stylesheets"> + <![CDATA[]]> + </fx:String> + <fx:String id="css"> + <![CDATA[ +*, *:before, *:after { + -moz-box-sizing: border-box; -webkit-box-sizing: border-box; box-sizing: border-box; +} +]]> + </fx:String> + <fx:String id="showBordersCSS"> + <![CDATA[ +*, *:before, *:after { + outline:1px dotted red; +} +]]> + </fx:String> + + <!--- cause all padding and borders to be inside width and height + http://www.paulirish.com/2012/box-sizing-border-box-ftw/ + --> + <fx:String id="borderBoxCSS"> + <![CDATA[ +*, *:before, *:after { + -moz-box-sizing: border-box; -webkit-box-sizing: border-box; box-sizing: border-box; +} +]]> + </fx:String> + + <!--- + adds zoom css for replicating preview + --> + <fx:String id="zoomCSS"> + <![CDATA[ +IFRAME_ID { + zoom: ZOOM_VALUE; + -moz-transform: scale(ZOOM_VALUE); + -moz-transform-origin: 0 0; + -o-transform: scale(ZOOM_VALUE); + -o-transform-origin: 0 0; + -webkit-transform: scale(ZOOM_VALUE); + -webkit-transform-origin: 0 0; +} +]]> + </fx:String> + + + <!-- If you use .button it causes sizing issues where the size of the button is 0 + Firefox: + Paste the following code into the editor after all other html code (from style tag to style tag). + And the class of the HTML button is set to class="button" + + Fix: + Rename "button" to "buttonSkin" and set class="buttonSkin". In time this will point to actual skins and defined styles. + Look at buttonCSS2. + --> + <fx:String id="buttonCSS"> + <![CDATA[ +.button { + position: absolute; + background: url(assets/svg/button_skin_up.svg) 0 0 no-repeat; + border: 0px; +} + +.button:hover { + background: url(assets/svg/button_skin_over.svg) 0 0 no-repeat; +} + +.button:active { + background: url(assets/svg/button_skin_down.svg) 0 0 no-repeat; +} +]]> + </fx:String> + + + <fx:String id="buttonCSS2"> + <![CDATA[ +.buttonSkin { + background: url(assets/svg/button_skin_up.svg) 0 0 no-repeat; + border: 0px; +} + +.buttonSkin:hover { + background: url(assets/svg/button_skin_over.svg) 0 0 no-repeat; + border: 0px; +} + +.buttonSkin:active { + background: url(assets/svg/button_skin_down.svg) 0 0 no-repeat; + border: 0px; +} +]]> + </fx:String> + </fx:Declarations> + + <s:states> + <s:State name="highlight"/> + <s:State name="normal"/> + <s:State name="highlight2"/> + <s:State name="editor"/> + </s:states> + + <s:layout> + <s:VerticalLayout gap="8"/> + </s:layout> + + + <!-- FIRST ROW --> + <s:HGroup left="0" right="0" + width="100%" + clipAndEnableScrolling="true" + paddingLeft="6" + paddingRight="10" + verticalAlign="baseline" + > + + <s:Label id="targetNameLabel" + minWidth="150" + color="#999999" + /> + + + <!-- + <s:Label minWidth="150" + color="#A6a5a5" + includeIn="editor" + text="This editor cannot edit in Firefox" + visible="false" + /> + + <s:Label minWidth="150" + color="#A6a5a5" + includeIn="highlight" + text="This editor has no undo or redo" + visible="false" + /> + + + <s:Label minWidth="150" + color="#A6a5a5" + includeIn="normal" + text="This editor has no syntax highlighting" + visible="false" + />--> + + <s:Spacer width="100%"/> + + <s:CheckBox id="updateCodeLive" + selected="true" + label="Update Live" + visible="{!exportWindow && codeType.selectedItem==HTML}" + includeInLayout="{!exportWindow}" + change="updateCodeLive_changeHandler(event)"/> + + <s:Button id="resyncButton" + label="Resync" + enabled="{isCodeModifiedByUser}" + click="resyncButton_clickHandler(event)" + visible="{!exportWindow && codeType.selectedItem==HTML}" + includeInLayout="{!exportWindow}" + /> + + <s:Button label="Preview HTML" + enabled="{codeType.selectedItem==HTML}" + visible="{!exportWindow && codeType.selectedItem==HTML}" + includeInLayout="{!exportWindow}" + click="previewButton_clickHandler(event)"/> + + <s:Label text="Editor type:" + color="#A6a5a5" + visible="false" + includeInLayout="false" + /> + + <s:ButtonBar id="editorType" + requireSelection="true" + selectedIndex="0" + labelField="name" + initialize="editorType.dataProvider = new ArrayList(states);editorType.selectedIndex = 0;" + change="editorType_changeHandler(event)" + visible="false" + includeInLayout="false"> + </s:ButtonBar> + + <s:Label text="Language type:" + color="#A6a5a5" + /> + + + <s:ButtonBar id="codeType" + selectedIndex="0" + change="codeType_changeHandler(event)"> + <s:dataProvider> + <s:ArrayList> + <fx:String>{MXML}</fx:String> + <fx:String>{HTML}</fx:String> + <fx:String>{ANDROID}</fx:String> + </s:ArrayList> + </s:dataProvider> + </s:ButtonBar> + + <c:ImageButton id="copyIcon" + source="{Radii8LibraryAssets.copy}" + toolTip="Copy the code to the Clipboard" + verticalAlign="middle" + useHandCursor="true" + /> + </s:HGroup> + + <!-- SECOND ROW --> + <s:TileGroup left="0" + right="0" + top="28" + width="100%" + clipAndEnableScrolling="true" + paddingLeft="6" + paddingRight="10" + verticalAlign="top" + verticalGap="6" + horizontalGap="6" + maxHeight="45" + minHeight="24" + visible="{codeType.selectedItem==HTML}" + includeInLayout="{codeType.selectedItem==HTML}" + > + + + <s:Button id="getHTMLButton" + label="GetHTML" + click="getHTMLButton_clickHandler(event)" + includeInLayout="false" + visible="false" + /> + + <s:CheckBox id="openInSeparateWindow" + label="Open in Window" + visible="{codeType.selectedItem==HTML}" + includeInLayout="{codeType.selectedItem==HTML}" + change="openInSeparateWindow_changeHandler(event)"/> + + <s:CheckBox id="useSVGButtonClassCheckbox" + label="Use SVG Button" + visible="{codeType.selectedItem=='htmll'}" + includeInLayout="{codeType.selectedItem=='htmll'}" + change="useSVGButtonClassCheckbox_changeHandler(event)"/> + + + <s:CheckBox id="showSourceCodeCheckbox" + selected="true" + label="Show Source Code" + click="showSourceCodeCheckbox_clickHandler(event)"/> + + <s:CheckBox id="showFullHTMLCheckbox" + selected="false" + label="Show Full HTML" + click="showFullHTMLCheckbox_clickHandler(event)"/> + + <s:CheckBox id="showBackgroundImageCheckbox" + selected="false" + label="Show Background Image" + click="showBackgroundImageCheckbox_clickHandler(event)"/> + + <s:CheckBox id="setStylesInline" + selected="false" + label="Set styles inline" + click="setStylesInline_clickHandler(event)"/> + + <s:CheckBox id="showOnlyCSSCheckbox" + selected="false" + label="Show only styles" + click="showOnlyCSS_clickHandler(event)"/> + + <s:CheckBox id="showOnlyHTMLCheckbox" + selected="false" + label="Show only markup" + click="showOnlyHTML_clickHandler(event)"/> + + <s:CheckBox id="showBordersCheckbox" + selected="false" + label="Show Outlines" + visible="{!exportWindow}" + includeInLayout="{!exportWindow}" + click="showBorders_clickHandler(event)"/> + + <s:CheckBox id="setZoom" + selected="true" + label="Set zoom" + visible="{!exportWindow}" + includeInLayout="{!exportWindow}" + click="setZoom_clickHandler(event)"/> + + <s:CheckBox id="showSelection" + selected="false" + label="Show Selected Item" + visible="{!exportWindow}" + includeInLayout="{!exportWindow}" + click="showSelection_clickHandler(event)"/> + + <!--<s:Spacer width="100%"/>--> + + <s:Spacer width="16"/> + + </s:TileGroup> + + <s:Group width="100%" height="100%" > + + <s:TextArea id="sparkTextArea" + top="55" + focusColor="#585858" + width="100%" height="100%" + fontFamily="Monaco,Menlo,Ubuntu Mono,Consolas,source-code-pro,monospace" + borderVisible="false" + paddingTop="8" + fontSize="12" + includeIn="normal" + change="sparkTextArea_changeHandler(event)" + > + <s:keyFocusChange> + event.preventDefault(); + event.currentTarget.insertText("\t"); + </s:keyFocusChange> + </s:TextArea> + + <!--<controls:AS3TextArea id="as3TextArea" + top="55" + focusColor="#585858" + width="100%" height="100%" + fontFamily="Monaco,Menlo,Ubuntu Mono,Consolas,source-code-pro,monospace" + borderVisible="false" + paddingTop="8" + fontSize="12" + includeIn="highlight2" + change="as3TextArea_changeHandler(event)" + > + <controls:keyFocusChange> + event.preventDefault(); + event.currentTarget.insertText("\t"); + </controls:keyFocusChange> + </controls:AS3TextArea>--> + + <mx:TextArea id="mxTextArea" + top="0" + focusAlpha="0" + fontFamily="Monaco,Menlo,Ubuntu Mono,Consolas,source-code-pro,monospace" + borderVisible="false" + paddingTop="8" + fontSize="12" + width="100%" height="100%" + keyUp="mxTextArea_keyUpHandler(event)" + change="mxTextAreaChangeHandler()" + editable="true" + includeIn="highlight" + leading="0" + > + <mx:keyFocusChange> + event.preventDefault(); + //mx.controls.TextArea(event.currentTarget).insertText("\t"); + </mx:keyFocusChange> + </mx:TextArea> + + + <flexiframe:IFrame id="editor" + top="50" left="0" + width="100%" height="100%" + includeIn="editor" + resize="editor_resizeHandler(event)" + overlayDetection="true" + > + </flexiframe:IFrame> + + </s:Group> + + <s:Label id="showOriginalSourceLabel" + paddingLeft="8" + paddingBottom="4" + color="#888888" + toolTip="Show original source code" + text="Show original document source code" + includeInLayout="false" + visible="false" + click="showOriginalSourceLabel_clickHandler(event)" + /> + + <s:Label id="showProjectSourceLabel" + paddingLeft="8" + paddingBottom="4" + color="#888888" + toolTip="Show project source code" + text="Show project source code" + includeInLayout="false" + visible="false" + click="showProjectSourceLabel_clickHandler(event)" + /> + + <s:Label id="errorLabel" + paddingLeft="8" + color="#f00000" + text="{errorMessage}" + includeInLayout="false" + visible="false" + width="100%" + /> +</s:Group> \ No newline at end of file
http://git-wip-us.apache.org/repos/asf/flex-radii8/blob/f370bfcf/Radii8Library/src/com/flexcapacitor/views/panels/ComponentsInspector.mxml ---------------------------------------------------------------------- diff --git a/Radii8Library/src/com/flexcapacitor/views/panels/ComponentsInspector.mxml b/Radii8Library/src/com/flexcapacitor/views/panels/ComponentsInspector.mxml new file mode 100644 index 0000000..a4e2779 --- /dev/null +++ b/Radii8Library/src/com/flexcapacitor/views/panels/ComponentsInspector.mxml @@ -0,0 +1,371 @@ +<?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" + xmlns:handlers="com.flexcapacitor.handlers.*" + xmlns:collections="com.flexcapacitor.effects.collections.*" + + implements="com.flexcapacitor.views.IInspector" + width="400" height="300" + > + + <!-- + + The list of components to include come from spark-manifest-defaults.xml + in Radii8LibrarySparkAssets. The include attribute must be set to true for them to be visible. + + The component classes are included by creating a reference to them in Radii8LibrarySparkAssets. + + We create an instance of the class in the mouse down handler. + + + --> + + + <fx:Script> + <![CDATA[ + import com.flexcapacitor.controller.Radiate; + import com.flexcapacitor.events.DragDropEvent; + import com.flexcapacitor.events.RadiateEvent; + import com.flexcapacitor.managers.layoutClasses.LayoutDebugHelper; + import com.flexcapacitor.model.IDocument; + import com.flexcapacitor.utils.DragManagerUtil; + import com.flexcapacitor.utils.supportClasses.ComponentDefinition; + import com.flexcapacitor.views.IInspector; + + import mx.core.ClassFactory; + import mx.events.DragEvent; + import mx.managers.ISystemManager; + import mx.managers.SystemManagerGlobals; + + import spark.components.Application; + import spark.components.Group; + import spark.components.Label; + + private var target:Object; + private var radiate:Radiate; + private var dragManagerInstance:DragManagerUtil; + + + public function activate():void { + radiate = Radiate.getInstance(); + + components.source = Radiate.componentDefinitions.source; + } + + public function deactivate():void { + + } + + protected function targetChangeHandler(event:RadiateEvent):void { + target = event.selectedItem; + } + + /** + * Listen for drag movement and start dragging if drag tolerance is met + * */ + public function rowGroupMouseDownHandler(event:MouseEvent, data:Object, itemIndex:int):void { + var classFactory:ClassFactory; + var item:ComponentDefinition; + var application:Application; + var component:Object; + var document:IDocument = radiate.selectedDocument; + var rowGroup:Group; + + item = ComponentDefinition(data); + + dropTargetLabel.text = ""; + + rowGroup = event.currentTarget as Group; + + event.stopImmediatePropagation(); + //list.dragEnabled = false; + + application = document && document.instance ? document.instance as Application : null; + + if (!application) return; + + component = Radiate.createComponentForAdd(document, item); + + + if (!dragManagerInstance) { + dragManagerInstance = new DragManagerUtil(); + } + + rowGroup.removeEventListener(MouseEvent.MOUSE_UP, mouseUpHandler); + rowGroup.addEventListener(MouseEvent.MOUSE_UP, mouseUpHandler, false, 0, true); + + //dragManagerInstance.listenForDragBehavior(rowGroup, application, event, component); + dragManagerInstance.listenForDragBehavior(rowGroup, document, event, component); + dragManagerInstance.removeEventListener(DragDropEvent.DRAG_DROP, handleDragDrop); + dragManagerInstance.removeEventListener(DragEvent.DRAG_OVER, handleDragOver); + dragManagerInstance.removeEventListener(DragDropEvent.DRAG_DROP_COMPLETE, handleDragDropComplete); + + dragManagerInstance.addEventListener(DragDropEvent.DRAG_DROP, handleDragDrop); + dragManagerInstance.addEventListener(DragEvent.DRAG_OVER, handleDragOver); + dragManagerInstance.addEventListener(DragDropEvent.DRAG_DROP_COMPLETE, handleDragDropComplete); + + // DRAG DROP + // is continued in + // DragManagerUtil.dragDropHandler() + + // and then in handleDragDrop() here + } + + /** + * Remove mouse handlers from row + * */ + protected function mouseUpHandler(event:MouseEvent):void + { + // we need a custom FlexSprite class to do this + /*if (event.currentTarget.eventListeners) { + event.currentTarget.removeAllEventListeners(); + }*/ + + //list.dragEnabled = true; + event.currentTarget.removeEventListener(MouseEvent.MOUSE_UP, mouseUpHandler); + + } + + /** + * Handles drag drop event. This is only the first part of adding to the stage. + * We can prevent automatic adding by calling event.preventDefault(). + * If we do not call preventDefault dragDropComplete is the next event to be called. + * */ + protected function handleDragDrop(event:DragDropEvent):void + { + var component:Object = event.draggedItem; + + // if text based or combo box we need to prevent + // interaction with cursor + + // UPDATE THIS IN DRAG DROP COMPLETE + /* + if (component is TextBase || component is SkinnableTextBase) { + component.mouseChildren = false; + + if ("textDisplay" in component && component.textDisplay) { + component.textDisplay.enabled = false; + } + }*/ + + dragManagerInstance.removeEventListener(DragDropEvent.DRAG_DROP, handleDragDrop); + dropTargetLabel.text = "Drag drop to:" + dragManagerInstance.dropTargetName; + + dragManagerInstance.removeEventListener(DragEvent.DRAG_OVER, handleDragOver); + } + + private static var _layoutDebugHelper:LayoutDebugHelper; + + public static function get debugHelper():LayoutDebugHelper + { + if (!_layoutDebugHelper) + { + _layoutDebugHelper = new LayoutDebugHelper(); + _layoutDebugHelper.mouseEnabled = false; + var sm:ISystemManager = SystemManagerGlobals.topLevelSystemManagers[0] + sm.addChild(_layoutDebugHelper); + } + return _layoutDebugHelper; + } + + private function deferredInstanceFromFunction():Array { + var label:Label = new Label(); + return [label]; + } + + /** + * Dispatched after drag drop event. Drag drop can be canceled. If it + * is not canceled this event happens. + * */ + protected function handleDragDropComplete(event:DragDropEvent):void + { + var o:LayoutDebugHelper = debugHelper; + var component:Object = event.draggedItem; + + + /* + // if text based or combo box we need to prevent + // interaction with cursor + if (component is TextBase || component is SkinnableTextBase) { + component.mouseChildren = false; + + if ("textDisplay" in component && component.textDisplay) { + component.textDisplay.enabled = false; + } + } + + if (component is ComboBox) { + if ("textInput" in component && component.textInput.textDisplay) { + component.textInput.textDisplay.enabled = false; + } + } + + // we can't add elements if skinnablecontainer._deferredContentCreated is false + if (component is BorderContainer) { + var factory:DeferredInstanceFromFunction = new DeferredInstanceFromFunction(deferredInstanceFromFunction); + BorderContainer(component).mxmlContentFactory = factory; + //BorderContainer(component).initialize(); + BorderContainer(component).createDeferredContent(); + BorderContainer(component).removeAllElements(); + + // we could probably also do this: + //BorderContainer(component).addElement(new Button()); + + } + + // we need a custom FlexSprite class to do this + // do this after drop + if ("eventListeners" in component && !(component is GroupBase)) { + component.removeAllEventListeners(); + }*/ + + //o.addElement(component as ILayoutElement); + dragManagerInstance.removeEventListener(DragDropEvent.DRAG_DROP_COMPLETE, handleDragDropComplete); + dropTargetLabel.text = "Drag Complete to:" + dragManagerInstance.dropTargetName; + + + dragManagerInstance.removeEventListener(DragEvent.DRAG_OVER, handleDragOver); + } + + protected function addItemHandler(event:RadiateEvent):void { + //trace("item addedd"); + + //radiate.target = event.eventTarget; + + } + + protected function handleDragOver(event:Event):void { + + //Radiate.log.info("target: " + dragManagerInstance.lastTargetCandidate); + dropTargetLabel.text = "Drag over: " + dragManagerInstance.dropTargetName; + } + + protected function list_dragStartHandler(event:DragEvent):void { + + } + + public function filterComponentsFunction(item:Object):Boolean { + + if (item && item.enabled) { + return true; + } + + return false; + } + ]]> + </fx:Script> + + <fx:Declarations> + <s:ArrayCollection id="components" filterFunction="filterComponentsFunction"/> + + + + <!-- FILTER BY NAME --> + <handlers:EventHandler eventName="creationComplete" + target="{this}" + > + </handlers:EventHandler> + </fx:Declarations> + + <!-- + <s:Rect> + <s:fill> + <s:SolidColor color="" + </s:fill> + </s:Rect>--> + + <s:layout> + <s:VerticalLayout gap="6"/> + </s:layout> + + <s:List id="list" + width="100%" + height="100%" + labelField="name" + dragEnabled="true" + borderVisible="false" + interactionMode="mouse" + dataProvider="{components}" + dragStart="list_dragStartHandler(event)" + > + <s:itemRenderer> + <fx:Component> + <s:ItemRenderer width="100%" height="100%" minHeight="22" > + <fx:Script> + <![CDATA[ + import com.flexcapacitor.controller.Radiate; + import com.flexcapacitor.utils.supportClasses.ComponentDefinition; + + override public function set data(value:Object):void { + super.data = value; + var definition:ComponentDefinition = value as ComponentDefinition; + var path:String; + + + if (definition) { + if (definition.icon) { + iconImage.source = definition.icon; + } + else { + path = "assets/images/components/" + definition.name + ".png"; + iconImage.source = path; + } + } + } + + protected function iconImage_ioErrorHandler(event:Event):void { + iconImage.source = "assets/images/components/BorderContainer.png"; + } + + protected function groupMouseDownHandler(event:MouseEvent):void + { + outerDocument.rowGroupMouseDownHandler(event, data, itemIndex); + } + + ]]> + </fx:Script> + + <s:HGroup id="rowGroup" + width="100%" + height="100%" + verticalAlign="middle" + paddingLeft="5" + mouseDown="groupMouseDownHandler(event)"> + <s:Image id="iconImage" + contentLoader="{Radiate.contentCache}" + ioError="iconImage_ioErrorHandler(event)" + securityError="iconImage_ioErrorHandler(event)" + width="16" height="16"/> + <s:Label id="labelDisplay" + fontSize="11" + typographicCase="lowercaseToSmallCaps"/> + </s:HGroup> + + </s:ItemRenderer> + </fx:Component> + + </s:itemRenderer> + </s:List> + + <s:Label id="dropTargetLabel" width="100%" paddingLeft="4" visible="false" includeInLayout="false"/> + <s:Spacer height="4"/> +</s:Group> http://git-wip-us.apache.org/repos/asf/flex-radii8/blob/f370bfcf/Radii8Library/src/com/flexcapacitor/views/panels/ConsoleInspector.mxml ---------------------------------------------------------------------- diff --git a/Radii8Library/src/com/flexcapacitor/views/panels/ConsoleInspector.mxml b/Radii8Library/src/com/flexcapacitor/views/panels/ConsoleInspector.mxml new file mode 100644 index 0000000..1b7a14c --- /dev/null +++ b/Radii8Library/src/com/flexcapacitor/views/panels/ConsoleInspector.mxml @@ -0,0 +1,139 @@ +<?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" + xmlns:controls="com.flexcapacitor.controls.*" + + width="200" height="100" + creationComplete="group1_creationCompleteHandler(event)" + > + + + <!-- to use + + + Radiate.log.info("Document SHOW event"); + Radiate.log.error(event.text); + + --> + <fx:Script> + <![CDATA[ + import com.flexcapacitor.controller.Radiate; + + import mx.events.FlexEvent; + import mx.logging.AbstractTarget; + + import spark.components.VScrollBar; + import spark.events.TextOperationEvent; + + private var radiate:Radiate; + + [Bindable] + public var logTarget:AbstractTarget; + + /** + * The more text in the text area the slower everything runs. + * + * In one test during debug in Properties view, the time to call describe type + * on a target increased by 1 or 3 ms for each line of text. + * + * If the font size is 10 px and max position is 200 lines + * since 2000/10. + * */ + public var maxScrollPosition:int = 3000; + + protected function group1_creationCompleteHandler(event:FlexEvent):void { + + /* + logTarget = new RadiateLogTarget(); + Radiate.setLoggingTarget(logTarget, null, consoleTextArea); + */ + + logTarget = Radiate.logTarget; + Radiate.setLoggingTarget(logTarget, null, consoleTextArea); + + } + + protected function clearTextAreaHandler(event:MouseEvent):void { + consoleTextArea.text = ""; + } + + protected function consoleTextArea_valueCommitHandler(event:FlexEvent):void { + scrollToTheBottom(); + } + + protected function consoleTextArea_changeHandler(event:TextOperationEvent):void { + scrollToTheBottom() + } + + public function scrollToTheBottom():void { + var scrollBar:VScrollBar = consoleTextArea.scroller.verticalScrollBar; + scrollBar.value = scrollBar.maximum; + consoleTextArea.validateNow(); + + if (scrollBar.value != scrollBar.maximum) { + scrollBar.value = scrollBar.maximum; + consoleTextArea.validateNow(); + } + + if (scrollBar.maximum>maxScrollPosition) { + consoleTextArea.text = ""; + } + } + + ]]> + </fx:Script> + + <s:Label text="" + height="14" + right="4" + fontSize="10" + typographicCase="uppercase" + textAlign="center" + verticalAlign="middle" + fontWeight="bold" + backgroundAlpha=".15" + backgroundColor="#000000" + useHandCursor="true" + buttonMode="true" + click="clearTextAreaHandler(event)" + /> + <s:TextArea id="consoleTextArea" + top="12" + width="100%" height="100%" + tabFocusEnabled="false" + fontWeight="normal" + fontSize="13" + focusAlpha="0" + fontFamily="Courier New" + borderVisible="false" + change="consoleTextArea_changeHandler(event)" + valueCommit="consoleTextArea_valueCommitHandler(event)" + /> + <controls:ImageButton source="{Radii8LibraryAssets.clear}" + right="8" + click="clearTextAreaHandler(event)" + width="18" + height="18" + horizontalAlign="center" + verticalAlign="middle" + /> +</s:Group>