2011年9月24日

Java Final修飾子定義


Final變數
Final變數一辦設定後變數的值就無法再被更改。
Final物件變數
物件裡面的變數可以被更改,但是變數的參考無法被更改。
Final成員變數
成員變數只能透過初始值定義,如果沒有定義則會出現編譯錯誤。
Final類別
該類別無法被繼承。

2011年9月15日

TinyMCE 自定插件


Creating your own plugins
Creating your own plugins for the TinyMCE application is fairly easy if you know the basics of HTML, CSS and JavaScript. There is an example plugin that is made to be easy to modify and has the basic things you need for a custom plugin. This example plugin is called "example" and is located in the plugins directory, copy this one to make your own plugin and change all references to example to match your new plugin name.


Plugin options
If you want, you may add plugin specific options and settings, but remember to prefix their names in the following format in order to create a unique name space: "<your plugin>_<option>" ("yourplugin_someoption", for example). Use getParam to retrieve a custom plugin option value.


Plugin directory structure
/css Plugin specific CSS files. /img Plugin specific images. /js Plugin specific javascripts for HTML dialogs etc. /langs Plugin specific language files. These will be two files namely: 1. en.js which contains only the description of the plugin when the mouse cursor hovers over the plugin's button in the UI 2. en_dlg.js which contains all the dialogue strings you want to display in the plugin's pop-up window. /editor_plugin.js Editor plugin file (compressed) gets loaded when tiny_mce.js is used. /editor_plugin_src.js Editor plugin file (source) gets loaded when tiny_mce_src.js or tiny_mce_dev.js is used. /somedialog.htm Plugin specific dialog HTML file.


Compiling JavaScript (editor_plugin_src.js -> editor_plugin.js)
TinyMCE不會去理會editor_plugin_src.js這個文件,因為這是為壓縮版本的,它建議使用壓縮後的版本,因此editor_plugin_src.js是用來編輯的,如果編輯完成請使用 jstrim來壓縮js文件,將文件存檔為editor_plugin.js,TinyMCE會去讀去這份壓縮好的檔案。


Plugin example source
Replace all instances of "Example" with your own plugin name
(function() {
       
// Load plugin specific language pack
        tinymce
.PluginManager.requireLangPack('example');

        tinymce
.create('tinymce.plugins.ExamplePlugin', {
               
/**
                 * Initializes the plugin, this will be executed after the plugin has been created.
                 * This call is done before the editor instance has finished it's initialization so use the onInit event
                 * of the editor instance to intercept that event.
                 *
                 * @param {tinymce.Editor} ed Editor instance that the plugin is initialized in.
                 * @param {string} url Absolute URL to where the plugin is located.
                 */

                init
: function(ed, url) {
                       
// Register the command so that it can be invoked by using tinyMCE.activeEditor.execCommand('mceExample');
                        ed
.addCommand('mceExample', function() {
                                ed
.windowManager.open({
                                        file
: url + '/dialog.htm',
                                        width
: 320 + ed.getLang('example.delta_width', 0),
                                        height
: 120 + ed.getLang('example.delta_height', 0),
                                       
inline : 1
                               
}, {
                                        plugin_url
: url, // Plugin absolute URL
                                        some_custom_arg
: 'custom arg' // Custom argument
                               
});
                       
});

                       
// Register example button
                        ed
.addButton('example', {
                                title
: 'example.desc',
                                cmd
: 'mceExample',
                                image
: url + '/img/example.gif'
                       
});

                       
// Add a node change handler, selects the button in the UI when a image is selected
                        ed
.onNodeChange.add(function(ed, cm, n) {
                                cm
.setActive('example', n.nodeName == 'IMG');
                       
});
               
},

               
/**
                 * Creates control instances based in the incomming name. This method is normally not
                 * needed since the addButton method of the tinymce.Editor class is a more easy way of adding buttons
                 * but you sometimes need to create more complex controls like listboxes, split buttons etc then this
                 * method can be used to create those.
                 *
                 * @param {String} n Name of the control to create.
                 * @param {tinymce.ControlManager} cm Control manager to use inorder to create new control.
                 * @return {tinymce.ui.Control} New control instance or null if no control was created.
                 */

                createControl
: function(n, cm) {
                       
return null;
               
},

               
/**
                 * Returns information about the plugin as a name/value array.
                 * The current keys are longname, author, authorurl, infourl and version.
                 *
                 * @return {Object} Name/value array containing information about the plugin.
                 */

                getInfo
: function() {
                       
return {
                                longname
: 'Example plugin',
                                author
: 'Some author',
                                authorurl
: 'http://tinymce.moxiecode.com',
                                infourl
: 'http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/example',
                                version
: "1.0"
                       
};
               
}
       
});

       
// Register plugin
        tinymce
.PluginManager.add('example', tinymce.plugins.ExamplePlugin);
})();

2011年9月1日

免費的SVN Google Project Host






免費的SVN Google Project Host


簡介



最近開發自己的專案需要有一個SVN伺服器,一時間找不到免費的可以使用,因此就去使用DropBox這個好用的軟體作為SVN檔案庫,但這在多次測試後發現這樣子的方法,很容易產生錯誤,或是一些難以解決的問題。

因此就使用GOOGLE大神搜尋了一下,發現Google code本身就提供這樣的服務,但是是有條件的,在上面的專案必須是開源的,提供免費1G版本控制空間以及2G的檔案空間,實在是非常棒。

開始配置

前置條件 : 必須在自己的機器上擁有任一款svn client,這裡使用TortoiseSVN。

接下來就趕快開始Free SVN配置之路吧。

首先到google code網頁,點選左方的「專案託管」



進入頁面後選擇「搜尋開放原始碼專案」,在來點選中間的「Create a new project」


進入頁面後,填寫專案的一些基本資料,在Version control system選擇Subversion,在Source code license選項選擇Apache License,最後給這個專案一些關鍵詞標籤點選Create project。



這樣就建立完成囉!!
接下來趕快來看看我們的專案網頁,首頁會顯示這個專案的熱門程度、以及一些資訊,這些不是我們要的,因此我們把畫面切換到Source這邊。


這裡有會顯示我們要的svn連結,將它複製起來

使用SVN Repo-Browser,進入這個網址。



如果網址沒有輸入錯誤會顯示下面的畫面,這時候將我們的專案資料夾拖入右邊的區塊


哀呀!!! 是不是彈跳出一個視窗,別緊張,趕緊回到我們的網站,在剛才SVN網址列的地方,有個超連結,「googlecode.com.password」,點進去,你可以得到Username及Password。



好的! 你得到了密碼了,這時候趕緊使用它來上傳的專案,
完成!!


這時候創建一個資料夾,資料夾點選右鍵,SVN Checkout
在URL of repository中輸入我們剛才複製的網址,點選OK



 如果沒輸入錯誤會顯示下面訊息,完成囉!!!



相信有使用過SVN的朋友對這些步驟都不陌生,本篇主要是介紹Google專案託管免費SVNN伺服器的功能,如果對於以上SVN工具操作有疑惑的朋友,請你使用Google搜尋一下相關知識吧!!

感謝收看 ~ 打完收工!!

2011年8月30日

Flex in Mobile(第五篇、Mobile Guesture使用方法)


在Flex中要使用手勢也是非常簡單的,我們只要為我們的應用添加手勢的監聽器,然後在監聽器中進行項對應的處理即可完成,這與Android上的Guesture操作上來比較的話,的確簡單了許多,趕快來看怎麼實現吧。

<fx:Script>
        <!
[CDATA[
            protected function init
():void
            
{
                addEventListener
(TransformGestureEvent.GESTURE_SWIPE, swipeHandler);
            
}
            
            protected function swipeHandler
(event:TransformGestureEvent):void
            
{
                
if(event.offsetX == -1)
                
{
                    navigator.
pushView(views.Tour3);
                
}
                
else if(event.offsetX == 1) 
                
{

                    navigator.popView();
                
}
            
}
            
        
]]>
    </fx:Script>

使用方法非常簡單,只需要讓我們的應用監聽TransformGestureEvent.GESTURE_SWIPE事件,然後從event中取得offsetX 即可得知我們的手勢是向左或是向右做滑動囉。

Flex in Mobile(第四篇、Mobile觸碰螢幕操作方法)


首先創建一個新的Moblie專案,在views中添加新的view,命名為MultiTouchView
,然後在MXML中天下以下程式碼 :


<fx:Declarations>
        <fx
:Component className="Circle">
            <s
:Ellipse width="140" height="140">
                <s
:fill>
                    <s
:SolidColor color="blue" />
                </s
:fill>
            </s
:Ellipse>
        </fx
:Component>
</fx
:Declarations> 


在Script區塊新增下面程式碼
<![CDATA[

            protected var circles:
Object = new Object();
            
            protected function init
():void
            
{

                Multitouch.
inputMode = MultitouchInputMode.TOUCH_POINT;
                

                
this.stage.addEventListener(TouchEvent.TOUCH_BEGIN, onTouchBegin);
                
this.stage.addEventListener(TouchEvent.TOUCH_END, onTouchEnd);
                
this.stage.addEventListener(TouchEvent.TOUCH_MOVE, onTouchMove);
            
}

            protected function onTouchBegin
(event:TouchEvent):void
            
{
                var c:Circle = new Circle
();
                c.
x = event.localX -70;
                c.
y = event.localY -70;
                addElement
(c);
                circles
[event.touchPointID] = c;
            
}
            

            protected function onTouchEnd
(event:TouchEvent):void
            
{
                
if (circles[event.touchPointID] != null)
                
{
                    removeElement
(circles[event.touchPointID]);
                    
delete circles[event.touchPointID];
                
}
            
}


            protected function onTouchMove
(event:TouchEvent):void
            
{
                
if (circles[event.touchPointID] != null)
                
{
                    circles
[event.touchPointID].x = event.localX -70;
                    circles
[event.touchPointID].y = event.localY - 70;
                
}
            
}
        
]]>

這段程式碼首先定義了一個自訂元件Circle,並使用橢圓形繪製,然後在程式碼區塊中宣告了它的引用,在初始化函式中我將螢幕的inputMode更改為MultitouchInputMode.TOUCH_POINT模式才能支援多點,並且讓我們的顯示螢幕(stage)監聽了三個事件,分別為觸碰開始、觸碰移動、觸碰結束,分別對這些事件使用不同方式處理。

完成!!
將它運行在你的實體機器上,就可以測試了!!

ShareThis