root/platform/air/wasaco/src/wasaco.mxml @ 15729

Revision 15729, 12.3 kB (checked in by kan, 6 years ago)

panelを使って角丸ウインドウを実現してみた。ウインドウカラーが単色になるけど気にしない

Line 
1<?xml version="1.0" encoding="utf-8"?>
2<mx:Application
3        xmlns:mx="http://www.adobe.com/2006/mxml"
4        layout="absolute"
5        height="504"
6        width="400"
7        cornerRadius="4"
8        applicationComplete="init()"
9        >
10    <mx:Script>
11    <![CDATA[
12        import flash.net.URLRequestDefaults;
13        import mx.events.ResizeEvent;
14        import mx.managers.SystemManager;
15        import mx.controls.Alert;
16                import mx.controls.Text;
17                import mx.controls.Image;
18                import mx.containers.TitleWindow;
19        import mx.managers.PopUpManager;
20        import vc.kan.net.Wassr;
21        import vc.kan.data.DBObject;
22            import mx.formatters.DateFormatter;
23       
24        private const feedStyle:String = "<style>" +
25                "* { color: white; font-size: 11px; }" +
26                "img.profile { width: 32px; height: 32px; margin: 2px; }" +
27                "a.reply { color: #aaaaff; font-size: 9px; }" +
28                "table { border: none; }" +
29                "td.status { text-align: right; margin-bottom: 10px; }" +
30                "span.time,span.user,span.area_name { font-size: 9px; }" +
31                "img.btn { width: 12px; height: 12px; padding: 1px; vertical-align:text-bottom; }" +
32        "</style>";
33       
34        private const feedTemplate:XML =
35                <div>
36                        <tr>
37                                <td rowspan="2">
38                                        <a><img class="profile" src="" /></a>
39                                </td>
40                                <td></td>
41                        </tr>
42                        <tr>
43                                <td class="status">
44                                        <span class="user"></span>
45                                        <span class="time"></span>
46                                        <a class="comment" href="javascript:void(0)"><img class="btn" src="app:assets/comment.png" /></a>
47                                        <a class="iine" href="javascript:void(0)"><img class="btn" src="app:/assets/normal.png" /></a>
48                                        <a href="#"><img class="btn" src="app:/assets/camera.png" /></a>
49                                        <a href="#"><img class="btn" src="app:/assets/map.png" /><span class="area_name"></span></a>
50                                        <a href="#"><img class="btn" src="app:/assets/world.png" /></a>
51                                </td>
52                        </tr>
53                        <tr>
54                                <td colspan="2" style="height: 5px">
55                                </td>
56                        </tr>
57                </div>;
58
59                public var timer:Timer = new Timer(60000);
60               
61                private var feed_view:Array = new Array(20);
62               
63                private var wassr:Wassr;
64               
65                public var user_id:String;
66                public var password:String;
67               
68                public var feed_item:Object;
69
70                private var settingDb:DBObject = new DBObject(Setting);
71               
72                private function init():void
73                {
74                        URLRequestDefaults.userAgent = "wasaco/2.0.4; http://fushihara.net/wasaco.html";
75                       
76                        this.panel.addEventListener( MouseEvent.MOUSE_DOWN, doDrag );
77                        this.panel.addEventListener( MouseEvent.MOUSE_UP, savePosition );
78                        this.minimizeBtn.addEventListener( MouseEvent.MOUSE_UP, onMinimize );
79                        this.closeBtn.addEventListener( MouseEvent.MOUSE_UP, onClose );
80                        this.resizeBtn.addEventListener( MouseEvent.MOUSE_DOWN, startResize );
81                        this.resizeBtn.addEventListener( MouseEvent.MOUSE_UP, saveWindowSize );
82                        stage.addEventListener(Event.RESIZE, onResize);
83                        this.feedCanvas.addEventListener( Event.COMPLETE, feedLinkHook );
84                        this.feedCanvas.htmlLoader.paintsDefaultBackground = false;
85                        this.feedCanvas.htmlLoader.navigateInSystemBrowser = true;
86                        XML.prettyPrinting = false;
87                       
88                        var mine:wasaco = this;
89                        settingDb.find(function (settings:Array):void {
90                                var setting_map:Object = {
91                                        backColor: 0,
92                                        backAlpha: 0.8,
93                                        windowWidth: 400,
94                                        windowHeight: 500,
95                                        windowX: 100,
96                                        windowY: 100
97                                };
98                                settings.forEach(function(conf:*, idx:Number, arr:Array):void {
99                                        setting_map[conf.key] = conf.value;
100                                });
101                                panel.setStyle("backgroundColor", setting_map.backColor);
102                                panel.setStyle("backgroundAlpha", setting_map.backAlpha);
103                                stage.nativeWindow.width = setting_map.windowWidth;
104                                stage.nativeWindow.height = setting_map.windowHeight;
105                                stage.nativeWindow.x = setting_map.windowX;
106                                stage.nativeWindow.y = setting_map.windowY;
107                        });
108                        showLoginWindow();
109                }
110               
111                private function doDrag(event:MouseEvent):void {
112                        if ( this.panel.contains(event.target as DisplayObject) ) return;
113                        applicationDragHandler(event);
114                }
115               
116                private function feedLinkHook(event:Event):void {
117                        var links:Object = feedCanvas.htmlLoader.window.document.links;
118                        for (var i:uint=0; i < links.length; i++) {
119                                if ( links[i].className == "comment" ) {
120                                        links[i].addEventListener("click", replyClick);
121                                } else if ( links[i].className == "iine" ) {
122                                        links[i].addEventListener("click", iineClick);
123                                }
124                        }
125                }
126
127                private function replyClick(evt:Object):void {
128                        var comment:commentWindow = commentWindow(
129                                PopUpManager.createPopUp(this, commentWindow, true)
130                        );
131                        comment.target = this;
132                        comment.res_rid = evt.target.title;
133                        PopUpManager.centerPopUp(comment);
134                }
135
136                private function iineClick(evt:Object):void {
137                        favStatus(evt.target.title, function():void{
138                                evt.target.src = "app:/assets/good.png";
139                        });
140                }
141               
142                public function saveSetting(key:String, value:*):void
143                {
144                        settingDb.find(function(settings:Array):void{
145                                if ( settings[0] ) {
146                                        settings[0].update({
147                                                "value": value
148                                        });
149                                }
150                        }, { "key": key }, null,
151                        function():void {
152                                settingDb.create({
153                                        "key": key,
154                                        "value": value
155                                }, function ():void {});
156                        });
157                }
158               
159                public function startAutoGetFeed():void
160                {
161                        timer.addEventListener(TimerEvent.TIMER, timerHandler);
162                        timer.start();
163                }
164               
165                private function showLoginWindow():void
166                {
167                        var login:loginWindow = loginWindow(
168                                PopUpManager.createPopUp(this, loginWindow, true)
169                        );
170                        login.target = this;
171                        login.loadProfile();
172                        PopUpManager.centerPopUp(login);
173                }
174               
175                private function showSettingWindow():void
176                {
177                        var setting:settingWindow = settingWindow(
178                                PopUpManager.createPopUp(this, settingWindow, true)
179                        );
180                        setting.target = this;
181                        setting.loadSetting()
182                        PopUpManager.centerPopUp(setting);
183                }
184               
185                public function get_feed ():void
186                {
187                        if (!wassr) {
188                                wassr = new Wassr(user_id, password, URLRequestDefaults.userAgent);
189                                wassr.addEventListener(IOErrorEvent.IO_ERROR, function (evt:IOErrorEvent):void { });
190                        }
191                        wassr.getFeed(displayFeed);
192                }
193               
194                public function timerHandler(evt:TimerEvent):void
195                {
196                        get_feed();
197                }
198               
199                private function displayFeed(feed_item:Object):void
200                {
201                        var html:String = feedStyle;
202                        var pattern:RegExp = /(?<!src=")https?:\/\/[-_.!~*'()\w;\/?:@&=+$,%#]+/g;
203                        html += "<table>";
204                        for (var j:int=0; j<20; j++) {
205                                if (feed_item[j]) {
206                                        var reply:String = "";
207                                        if (feed_item[j].reply_message) {
208                                                reply = "<a class=\"reply\" href=\"" + feed_item[j].reply_status_url + "\"> &gt;" +
209                                                                feed_item[j].reply_message + " by " +
210                                                                feed_item[j].reply_user_nick + "</a><br />";
211                                        }
212                                        var tmpl:XML = feedTemplate.copy();
213                                        var text:String = feed_item[j].html;
214                                        tmpl.tr[0].td[0].a.img.@src = feed_item[j].user.profile_image_url;
215                                        tmpl.tr[0].td[0].a.@href = "http://wassr.jp/user/" + feed_item[j].user_login_id
216                                        tmpl.tr[0].td[1] = XML("<td class=\"text\">" + reply + text.replace(pattern, "<a href=\"$&\" target=\"_blank\">$&</a>")+"</td>");
217                                        tmpl.tr[1].td.span[0] = XML("<span class=\"user\">by " + feed_item[j].user.screen_name + "&nbsp;</span>");
218                                        var fmt:DateFormatter = new DateFormatter();
219                                        fmt.formatString = "YYYY/MM/DD JJ:NN";
220                                        tmpl.tr[1].td.span[1] = XML("<span class=\"time\">" + fmt.format(new Date(int(feed_item[j].epoch) * 1000)) + "</span>");
221                                        tmpl.tr[1].td.a[0].img.@title = feed_item[j].rid;
222                                        if (feed_item[j].user.protected) {
223                                                tmpl.tr[1].td.a[1].href = "javascript:void(0)";
224                                                tmpl.tr[1].td.a[1].img.@src = "app:/assets/secret.png";
225                                        } else {
226                                                tmpl.tr[1].td.a[1].img.@title = feed_item[j].rid;
227                                        }
228                                        if (feed_item[j].photo_url) {
229                                                tmpl.tr[1].td.a[2].@href = feed_item[j].photo_url;
230                                        } else {
231                                                tmpl.tr[1].td.a[2].@style = "display:none";
232                                        }
233                                        if (feed_item[j].areacode) {
234                                                tmpl.tr[1].td.a[3].@href = "http://wassr.jp/area/code/" + feed_item[j].areacode;
235                                                tmpl.tr[1].td.a[3].span = XML("<span class=\"area_name\">" + feed_item[j].areaname + "</span>");
236                                        } else {
237                                                tmpl.tr[1].td.a[3].@style = "display:none";
238                                        }
239                                        if (feed_item[j].slurl) {
240                                                tmpl.tr[1].td.a[4].@href = feed_item[j].slurl;
241                                        } else {
242                                                tmpl.tr[1].td.a[4].@style = "display:none";
243                                        }
244                                        trace(tmpl.toXMLString());
245                                        html += tmpl.toXMLString();
246                                }
247                        }
248                        feedCanvas.htmlText = html + "</table>";
249                }
250               
251                private function displayParentComment(evt:Event):void
252                {
253                        Alert.show(evt.currentTarget.data);
254                }
255
256                public function applicationDragHandler(event:MouseEvent):void
257                {
258                        stage.nativeWindow.startMove();
259                }
260                   
261                private function onClose(evt:MouseEvent):void
262                {
263                        stage.nativeWindow.close();
264                }
265               
266                private function onMinimize(evt:MouseEvent):void
267                {
268                        stage.nativeWindow.minimize();
269                }
270               
271                private function showPictWindow(evt:MouseEvent):void
272                {
273                        var pict:pictWindow = pictWindow(
274                                PopUpManager.createPopUp(this, pictWindow, true)
275                        );
276                        pict.load(stat);
277                        PopUpManager.centerPopUp(pict);
278                }
279
280                public function statusUpdate(res_rid:String=null):void
281                {
282                        if (stat.text == "") {
283                                get_feed();
284                                return;
285                        }
286                        wassr.statusUpdate(stat.text, function ():void {get_feed();}, res_rid);
287                        stat.text = "";
288                }
289               
290                public function favStatus(status_rid:String, callback:Function):void
291                {
292                        wassr.favStatus(status_rid, callback);
293                }
294               
295                public function startResize(event:MouseEvent):void
296                {
297                        stage.nativeWindow.startResize(NativeWindowResize.BOTTOM_RIGHT);
298                }
299               
300                public function onResize(event:Event):void
301                {
302                        this.height = stage.nativeWindow.height;
303                        this.width = stage.nativeWindow.width;
304                        this.panel.height = stage.nativeWindow.height;
305                        this.panel.width = stage.nativeWindow.width;
306                        this.ControlArea.width = this.panel.width - 20;
307                        this.feedCanvas.width = this.panel.width - 20;
308                        this.feedCanvas.height = this.height - 145;
309                        this.stat.width = this.width - 94;
310                }
311               
312                public function alwaysFront(event:Event):void
313                {
314                        if (this.alwaysFrontChk.selected == true) {
315                                stage.nativeWindow.alwaysInFront = true;
316                        } else {
317                                stage.nativeWindow.alwaysInFront = false;
318                        }
319                }
320               
321                private function saveWindowSize(event:Event):void
322                {
323                        saveSetting("windowWidth", stage.nativeWindow.width);
324                        saveSetting("windowHeight", stage.nativeWindow.height);
325                }
326
327                private function savePosition(event:MouseEvent):void {
328                        if ( this.panel.contains(event.target as DisplayObject) ) return;
329                        saveSetting("windowX", stage.nativeWindow.x);
330                        saveSetting("windowY", stage.nativeWindow.y);
331                }
332
333        ]]>
334        </mx:Script>
335        <mx:Style>
336                Application {
337                        background-image: "";
338                        background-color: "";
339                        background-alpha: 0;
340                }
341                Panel {
342                        color: #ffffff;
343                        borderStyle: solid;
344                        roundedBottomCorners: true;
345                        cornerRadius: 15;
346                        shadowDirection: right;
347                        width: 400px;
348                        height: 500px;
349                }
350        </mx:Style>
351        <mx:Panel id="panel" x="0" y="0" title="wasaco ver 2.0.5" titleIcon="@Embed(source='assets/wasaco.png')" width="374">
352                <mx:Canvas x="0" y="0" width="100%" height="70" id="ControlArea">
353                        <mx:TextInput x="10" y="10" width="263" id="stat" color="#111111" enter="statusUpdate();"  height="22"/>
354                        <mx:Button x="10" y="38" label="Pictogram" width="111" click="showPictWindow(event);" icon="@Embed('assets/heart.png')" />
355                        <mx:Button x="129" y="38" label="Post/Update" click="statusUpdate();" width="118" icon="@Embed('assets/action_refresh_blue.gif')"/>
356                        <mx:Image id="minimizeBtn" source="assets/minimize_icon.png" width="16" height="16" right="16" y="0"/>
357                        <mx:Image id="closeBtn" source="assets/close_icon.png" width="16" height="16" right="0" y="0"/>
358                        <mx:Button id="settingBtn" x="255" y="38" label="Setting" width="70" click="showSettingWindow()" />
359                </mx:Canvas>
360                <mx:HTML x="0" y="70" width="100%" height="356" color="#ffffff" id="feedCanvas" backgroundAlpha="0.0" />
361                <mx:Canvas bottom="0" width="100%" height="20" color="#ffffff" id="statusBar" backgroundAlpha="0.0">
362                        <mx:Image id="resizeBtn" source="assets/resize_icon.png" width="16" height="16" right="0" bottom="0" />
363                        <mx:CheckBox id="alwaysFrontChk" x="0" y="0" label="常に最前面に表示する" click="alwaysFront(event)" />
364                </mx:Canvas>
365        </mx:Panel>
366</mx:Application>
Note: See TracBrowser for help on using the browser.