精彩的人生

          好好工作,好好生活

          BlogJava 首頁 新隨筆 聯系 聚合 管理
            147 Posts :: 0 Stories :: 250 Comments :: 0 Trackbacks

          #

          原文地址:http://www.duduwolf.com/post/chatroom_for_AJAX.asp


          Aether之邀寫一個基礎點的AJAX操作實例,想來想去就寫一個聊天室吧,以前寫AJAX時一來偷懶,二來為了簡單,都用純文本或者javascript數組進行交互,這次改成純粹的xml操作。想得時候很簡單,無非就處理發送消息,接收消息,登陸和退出這幾種事件,但真正要寫的時候還是頗費周折,主要是ASP對Session間的消息(對象)傳遞功能太弱了,只能在Application、數據庫、自定義服務端組件三種方法中挑一個,自定義服務端組件先Pass了,既然要寫一個輕量級的,數據庫能不用就不用了,最后還是盯上了Application。

          聊天室最重要的功能就是一個用戶發出消息后所有用戶都要能接收到,接受到消息后應該給這則消息一個標記或者刪除操作。ASP的Application對象可以實現Session間的數據交互,再結合類似于Map的Scripting.Dictionary這個內置對象,應該就能實現我想要的效果。但是在實際編寫過程中發現Scripting.Dictionary對象實例根本無法存儲到Application中,查了MSDN后才知不允許將OBJECT和自定義組件以外的對象存儲到Application中,包括自定義Class,暈,只得另想辦法,最后選定用數組方式解決。

          客戶端我用javascript的prototype(原型)功能寫了一個ChatRoom類,用面向對象的方式實現了發送接收消息,登錄和退出。下面就是聊天窗口,請輸入昵稱登錄后就能開始聊天了:)程序還有很多bug,實在無心調試了。

          下載:http://www.duduwolf.com/test/chatRoom.asp.txt

          <script language="javascript" type="text/javascript" src="http://www.duduwolf.com/test/chatRoom.asp?act=script"></script>
          <div id="chatRoom"></div>
          <script>var chat = new ChatRoom('chat', document.getElementById('chatRoom'), 500, 400);</script>

          posted @ 2006-01-20 11:57 hopeshared 閱讀(532) | 評論 (0)編輯 收藏

          前言

          這三天來,一直在為一個問題所困擾。

          我做的項目是將emf和gef結合的一個典型實例。其實我接觸這些東西也才4,5個月,兩個Eclipse工具都很熟悉,但是并不能說是精通。

          在項目制作的過程中,編輯器的布局問題并沒有拿到桌面上來討論。畢竟,功能沒有實現,編輯器作的再漂亮也不起作用。

          現在,所有的功能點全部按要求實現了,可是再看看編輯器,就會覺得很外行,呵呵。

          盡管老大不在公司,但是我想他肯定支持我的這個想法:將界面作的professional一點。

          于是,我浪費了3天時間來重新做布局。



          搜索icon

          項目組沒有給我配備美工,所有的圖片都是臨時的,我就采用了一些qq表情圖,所以編輯器很“可愛”?,F在需要根據每個模型的實際含義來配備icon,于是利用google & baidu搜了一些圖片下來。好在我還會點ps,那二十多個圖標就算定了。


          研究布局

          這次的代碼大改造,需要嚴重的感謝一個人:reload_cn。非常感謝他能耐心的聽我不停的發牢騷,并給于正確的指導。這對后來的改造成功起決定性作用。盡管他將社區里的帥照改成了黑猩猩......

          好,轉入正題。目前的編輯器功能已經實現了,但是為什么要改布局呢?因為現在編輯器采用的是xyLayout,創建一個對象之后,將它的xywh保存在模型對象中,然后再refreshVisual的時候設置Figure的Bound。這么做的問題是,首先,沒有很好的計算坐標,所以坐標有點出入(有的時候坐標出入大的難以接受),其次,本工具定義的主要是流程,所以編輯器里的“內容”很多,每創建一個對象都需要手工拖拽到合適的位置上。

          在reload_cn的提示下,我研究了一下GEF的Flow例子。由于時間關系(元旦之后就會發布最終版本,要不加班,要不加快腳步干活),我直接就將flow里的GraphLayoutManager拿過來用了...

          結果是,經常報些莫名其妙的錯誤。

          所謂心急吃不了熱豆腐。

          繼續在reload_cn的提示下,研究了他的sequnce diagram的例子。在這個例子中,他做了個很簡單的布局處理。

          從這里例子中,我領悟出了真諦:
          ??????在EditPart中設置的Layout Policy其實主要處理的是創建對象等等request,并不處理真正的編輯器布局。又或者說它的布局是邏輯意義上的。真正處理布局,來讓我們看到效果的,是Figure的布局。而這個正好是我常常忽略的。

          Figure怎么布局??我一般用的就是xyLayout和ToolbarLayout。但是如果要作出漂亮的效果,這些還是不夠的。八進制的blog中提到了draw2d的tree example。我看過了,然后研究了一下,覺得太簡單了,不能符合本項目的需求。

          回頭再看看flow,覺得這個例子本身就是流程定義,并且跟我的項目在Figure上有很多共同點。。。

          仍然心有余悸,畢竟用flow的代碼作的所有嘗試(用了1天的時間)全部失敗了,而且還敗的莫名其妙。


          開始嘗試

          不能因為失敗,所以放棄(但是可以有放棄的想法,呵呵)。我決定一點一點地來嘗試。

          首先,我替換了所有的icon,至少圖標看起來已經舒服多了。

          接著,根據flow中figure的做法,更新了項目中的所有Figure。運行一下看看,呵呵,至少圖標很象了。

          我很喜歡flow中自動計算Figure位置的功能和動態移動效果。怎么辦?繼續改裝代碼。

          將GraphLayoutManager小心翼翼的搬了過來。沒有效果。但是至少沒有出錯。

          開始使用GraphLayoutManager來進行坐標計算。(這個過程漫長而痛苦,不停的報異常,不停的對比代碼,不停的跟蹤,不停的發牢騷....)

          最后出的問題最有意思,假如編輯器根模型的Figure采用flow中的figure,那么編輯器中只顯示連線。為什么呢?因為我的編輯器中使用的是viewer.setRootEditPart(new ScalableFreeformRootEditPart());而flow中用的是getGraphicalViewer().setRootEditPart(new ScalableRootEditPart());所以在我這邊,figure采用FreeformLayer就no problem了。

          最終得結果是改好了,一切都跟flow那么象

          結果

          1.GIF???? 2.GIF


          結論

          假如你和我一樣,在項目制作后期修改編輯器的布局,這里有幾個建議:

          1 研究一下例子,從簡單的開始,一直到難的,讓理論知識根深蒂固。
          2 作個小例子,或者將你已經作的小例子進行類似的改編,看看出什么問題,為什么出問題。
          3 例子沒做出來沒關系,這些跟頭栽在小例子上比栽在項目中讓人欣慰的多。
          4 先修改Figure。盡量接近你想要的效果。
          5 引入布局,暫時不要使用它,只要他的流程走下來沒有問題就成功了一半。
          6 使用布局。會出現很多問題,但是很容易定位問題。調試吧。

          暫時就這么多吧,剛剛的改動導致了編輯器中的刪除功能拋異常,我得看看去

          posted @ 2005-12-30 14:58 hopeshared 閱讀(1990) | 評論 (8)編輯 收藏

          兩天前GEF發布了3.1M7版本,但使用下來發現和M6沒有什么區別,是不是主要為了和Eclipse版本相配套?希望3.1正式版早日發布,應該會新增不少內容。上一篇帖子介紹了如何實現表格功能,在開發過程中,另一個經常用到的功能就是樹,雖然SWT提供了標準的樹控件,但使用它完成如組織結構圖這樣的應用還是不夠直觀和方便。在目前版本(3.1M7)的GEF中雖然沒有直接支持樹的實現,但Draw2D提供的例子程序里卻有我們可以利用的代碼(org.eclipse.draw2d.examples.tree.TreeExample,運行界面見下圖),通過它可以節約不少工作量。

          treeexample.gif
          圖1 Draw2D例子中的TreeExample

          記得數年前曾用Swing做過一個組織結構圖的編輯工具,當時的實現方式是讓畫布使用XYLayout,在適當的時候計算和刷新每個樹節點的位置,算法的思想則是深度優先搜索,非樹葉節點的位置由其子節點的數目和位置決定。我想這應該是比較直觀的方法吧,但是這次看了Draw2D例子里的實現覺得也很有道理,以前沒想到過。在這個例子里樹節點圖形稱為TreeBranch,它包含一個PageNode(表現為帶有折角的矩形)和一個透明容器contentsPane,(一個Layer,用來放置子節點)。在一般情況下,TreeBranch本身使用名為NormalLayout的布局管理器將PageNode放在子節點的正上方,而contentsPane則使用名為TreeLayout的布局管理器計算每個子節點應在的位置。所以我們看到的整個樹實際上是由很多層子樹疊加而成的,任何一個非葉節點對應的圖形的尺寸都等于以它為根節點的子樹所占區域的大小。

          從這個例子里我們還看到,用戶可以選擇使用橫向或縱向組織樹(見圖2),可以壓縮各節點之間的空隙,每個節點可以橫向或縱向排列子節點,還可以展開或收起子節點,等等,這為我們實現一個方便好用的樹編輯器提供了良好的基礎(視圖部分的工作大大簡化了)。

          treevertical.gif
          圖2 縱向組織的樹

          這里要插一句,Draw2D例子中提供的這些類的具體內容我沒有仔細研究,相當于把它們當作Draw2D API的一部分來用了(包括TreeRoot、TreeBranch、TreeLayout、BranchLayout、NormalLayout、HangingLayout、PageNode等幾個類,把代碼拷到你的項目中即可使用),因為按照GEF 3.1的計劃表,它們很有可能以某種形式出現在正式版的GEF 3.1里。下面介紹一下我是如何把它們轉換為GEF應用程序的視圖部分從而實現樹編輯器的。

          首先從模型部分開始。因為樹是由一個個節點構成的,所以模型中最主要的就是節點類(我稱為TreeNode),它和例子里的TreeBranch圖形相對應,它應該至少包含nodes(子節點列表)和text(顯示文本)這兩個屬性;例子里有一個TreeRoot是TreeBranch的子類,用來表示根節點,在TreeRoot里多了一些屬性,如horizontal、majorSpacing等等用來控制整個樹的外觀,所以模型里也應該有一個繼承TreeNode的子類,而實際上這個類就應該是編輯器的contents,它對應的圖形TreeRoot也就是一般GEF應用程序里的畫布,這個地方要想想清楚。同時,雖然看起來節點間有線連接,但這里我們并不需要Connection對象,這些線是由布局管理器繪制的,畢竟我們并不需要手動改變線的走向。所以,模型部分就是這么簡單,當然別忘了要實現通知機制,下面看看都有哪些EditPart。

          與模型相對應,我們有TreeNodePart和TreeRootPart,后者和前者之間也是繼承關系。在getContentPane()方法里,要返回TreeBranch圖形所包含的contentsPane部分;在getModelChildren()方法里,要返回TreeNode的nodes屬性;在createFigure()方法里,TreeNodePart應返回TreeBranch實例,而TreeRootPart要覆蓋這個方法,返回TreeRoot實例;另外要注意在refreshVisuals()方法里,要把模型的當前屬性正確反映到圖形中,例如TreeNode里有反映節點當前是否展開的布爾變量expanded,則refreshVisuals()方法里一定要把這個屬性的當前值賦給圖形才可以。以下是TreeNodePart的部分代碼:

          public IFigure getContentPane() {
              
          return ((TreeBranch) getFigure()).getContentsPane();
          }


          protected List getModelChildren() {
              
          return ((TreeNode) getModel()).getNodes();
          }


          protected IFigure createFigure() {
              
          return new TreeBranch();
          }


          protected void createEditPolicies() {
              installEditPolicy(EditPolicy.COMPONENT_ROLE, 
          new TreeNodeEditPolicy());
              installEditPolicy(EditPolicy.LAYOUT_ROLE, 
          new TreeNodeLayoutEditPolicy());
              installEditPolicy(EditPolicy.SELECTION_FEEDBACK_ROLE, 
          new ContainerHighlightEditPolicy());
          }

          上面代碼中用到了幾個EditPolicy,這里說一下它們各自的用途。實際上,從Role中已經可以看出來,TreeNodeEditPolicy是用來負責節點的刪除,沒有什么特別;TreeNodeLayoutEditPolicy則復雜一些,我把它實現為ConstrainedLayoutEditPolicy的一個子類,并實現createAddCommand()和getCreateCommand()方法,分別返回改變節點的父節點和創建新節點的命令,另外我讓createChildEditPolicy()方法返回NonResizableEditPolicy的實例,并覆蓋其createSelectionHandles()方法如下,以便在用戶選中一個節點時用一個控制點表示選中狀態,不用缺省邊框的原因是,邊框會將整個子樹包住,不夠美觀,并且在多選的時候界面比較混亂。

          protected List createSelectionHandles() {
              List list
          =new ArrayList();
              list.add(
          new ResizeHandle((GraphicalEditPart)getHost(), PositionConstants.NORTH));
              
          return list;
          }

          選中節點的效果如下圖,我根據需要改變了樹節點的顯示(修改PageNode類):

          treeselection.gif
          圖3 同時選中三個節點(Node2、Node3和Node8)

          最后一個ContainerHighlightEditPolicy的唯一作用是當用戶拖動節點到另一個節點區域中時,加亮顯示后者,方便用戶做出是否應該放開鼠標的選擇。它是GraphicalEditPolicy的子類,部分代碼如下,如果你看過Logic例子的話,應該不難發現這個類就是我從那里拿過來然后修改一下得到的。

          protected void showHighlight() {
              ((TreeBranch) getContainerFigure()).setSelected(
          true);
          }


          public void eraseTargetFeedback(Request request) {
              ((TreeBranch) getContainerFigure()).setSelected(
          false);
          }

          好了,現在樹編輯器應該已經能夠工作了。為了讓用戶使用更方便,你可以實現展開/收起子節點、橫向/縱向排列子節點等等功能,在視圖部分Draw2D的例子代碼已經內置了這些功能,你要做的就是給模型增加適當的屬性。我這里的一個截圖如下所示,其中Node1是收起狀態,Node6縱向排列子節點(以節省橫向空間)。

          treeeditor.gif
          圖4 樹編輯器的運行界面

          這個編輯器我花一天時間就完成了,但如果不是利用Draw2D的例子,相信至少要四至六天,而且缺陷會比較多,功能上也不會這么完善。我感覺在GEF中遇到沒有實現過的功能前最好先找一找有沒有可以利用的資源,比如GEF提供的幾個例子就很好,當然首先要理解它們才談得上利用。


          原文地址: http://bjzhanghao.cnblogs.com/archive/2005/05/27/163277.html

          posted @ 2005-12-28 16:55 hopeshared 閱讀(531) | 評論 (0)編輯 收藏

          在使用GEF進行開發的時候,對于需要繪制的圖形的節點,往往除了模型對象本身之外,還需要有一個相應的“圖”對象來保存圖中這個節點的位置,以及大小等圖相關,但是與業務模型無關的一個對象。而在一開始希望顯示一個初始模型文件的時候,再對應保存圖信息的文件不存在的情況下,如何能夠很好的顯示這個圖,是一個比較麻煩的問題,涉及到對布局算法的一些分析與實現。這片文章就是介紹,如何使用GEF內的DirectedGraph這個類以及其相應的布局算法類DirectedGraphLayout,來解決這個問題。
          基本思想是:為
          GEFEditPart模型生成一個DirectedGraph,然后使用DirectedGraphLayout來計算布局,最后將布局的結果通過GEF顯示出來。

           

          在參考了GEFflow example之后,對其代碼作了部分重構,寫了這片文章,希望對遇到同樣問題的同志能夠有一定的幫助。

           

          首先引入一個接口:

          public interface GraphBuilder {

                 public void contributeNodesToGraph(DirectedGraph graph, Map map);

                 public void contributeEdgesToGraph(DirectedGraph graph, Map map);

                 public void applyGraphResults(DirectedGraph graph, Map map);

          }

          這個接口中定義了幾個方法,其含義從其方法名中可以猜出:

          contributeNodesToGraph:將當前對象作為節點(Node)添加到DirectedGraph中。

          contributeEdgesToGraph:將當前對象所對應的連線作為邊(Edge)添加到DirectedGraph中。

          applyGraphResults:將圖中生成的布局信息取出,對本對象進行重新布局。

          接口中的graph參數就是保存的圖的信息,map參數維持一個對象到節點/邊的映射,使得每個對象能夠方便的找到其對應的圖中的節點或者邊。這個接口的使用,在后面會有涉及。下面先看看顯示圖的容器是如何構建的。

           

          圖的容器定義為GraphDiagramEditPart,這個EditPart對應于要顯示的有向圖的容器。它實現了GraphBuider接口,這也是我們主要需要關注的接口:

          public class GraphDiagramEditPart extends AbstractGraphicalEditPart implements

                        GraphBuilder.

           

          contributeNodesToGraph方法將自身作為節點添加到圖中,但是因為GraphDiagramEditPart對應的是容器,因此它不需要向圖中添加信息,只是調用其子EditPart,將其添加到圖中。

                 public void contributeNodesToGraph(DirectedGraph graph, Map map) {

                        for (int i = 0; i < getChildren().size(); i++) {

                               NodeEditPart activity = (NodeEditPart)getChildren().get(i);

                               activity.contributeNodesToGraph(graph, map);

                        }

                 }

           

          contributeEdgesToGraph方法將這個EditPart的所有子EditPart取出,調用其contributeEdgesToGraph方法,通過這個方法,就可以將所有的邊添加到圖中了:

                 public void contributeEdgesToGraph(DirectedGraph graph, Map map) {

                        for (int i = 0; i < getChildren().size(); i++) {

                               NodeEditPart child = (NodeEditPart)children.get(i);

                               child.contributeEdgesToGraph(graph, map);

                        }

                 }

           

          applyGraphResults方法將所有取出所有的子EditPart,并調用其applyGraphResults,使得圖中所生成的布局信息能夠被應用到顯示上。

                 public void applyGraphResults(DirectedGraph graph, Map map) {

                        applyChildrenResults(graph, map);

                 }

                 protected void applyChildrenResults(DirectedGraph graph, Map map) {

                        for (int i = 0; i < getChildren().size(); i++) {

                               GraphBuilder part = (GraphBuilder) getChildren().get(i);

                               part.applyGraphResults(graph, map);

                        }

                 }

           

          下面要介紹的是NodeEditPart,它作圖中所有節點所對應的EditPart的抽象父類,也實現了GraphBuilder接口。每一個要做為節點添加到圖中的EditPart,應該繼承這個類。

          public abstract class NodeEditPart extends AbstractGraphicalEditPart implements

                        GraphBuilder{

           

                 public void contributeNodesToGraph(DirectedGraph graph,

                               Map map) {

                        Node n = new Node(this);

                        n.outgoingOffset = 7;

                        n.incomingOffset = 7;

                        n.width = getFigure().getPreferredSize().width;

                        n.height = getFigure().getPreferredSize().height;

                        n.setPadding(new Insets(10,8,10,12));

                        map.put(this, n);

                        graph.nodes.add(n);

                 }

           

                 public void contributeEdgesToGraph(DirectedGraph graph, Map map) {

                        List outgoing = getSourceConnections();

                        for (int i = 0; i < outgoing.size(); i++) {

                               EdgeEditPart part = (EdgeEditPart)getSourceConnections().get(i);

                               part.contributeEdgesToGraph(graph, map);

                        }

                 }

           

                 public void applyGraphResults(DirectedGraph graph, Map map) {

                        Node n = (Node)map.get(this);

                        getFigure().setBounds(new Rectangle(n.x, n.y, n.width, n.height));

                        for (int i = 0; i < getSourceConnections().size(); i++) {

                               EdgeEditPart trans = (EdgeEditPart) getSourceConnections().get(i);

                               trans.applyGraphResults(graph, map);

                        }

                 }

          }

           

          再就是邊所對應EditPart的抽象類EdgeEditPart。每一個要作為邊添加到圖中的EditPart,需要繼承這個類。在上面NodeEditPart中對其所對應的Figure其實并沒有什么要求,但是對EdgeEditPart所對應的Figure,要求其Figure必須由一個BendpointConnectionRouter,作為其ConnectionRoutersetConnectionRouter(new BendpointConnectionRouter())。這樣圖的邊的路徑信息才能夠被顯示出來。

          public abstract class EdgeEditPart extends AbstractConnectionEditPart implements

                        GraphBuilder {

           

                 public void contributeEdgesToGraph(DirectedGraph graph, Map map) {

                        Node source = (Node)map.get(getSource());

                        Node target = (Node)map.get(getTarget());

                        Edge e = new Edge(this, source, target);

                        e.weight = 2;

                        graph.edges.add(e);

                        map.put(this, e);

                 }

           

                 public void applyGraphResults(DirectedGraph graph, Map map) {

                        Edge e = (Edge)map.get(this);

                        NodeList nodes = e.vNodes;

                        PolylineConnection conn = (PolylineConnection)getConnectionFigure();

                        conn.setTargetDecoration(new PolygonDecoration());

                        if (nodes != null) {

                               List bends = new ArrayList();

                               for (int i = 0; i < nodes.size(); i++) {

                                      Node vn = nodes.getNode(i);

                                      int x = vn.x;

                                      int y = vn.y;

                                      if (e.isFeedback) {

                                             bends.add(new AbsoluteBendpoint(x, y + vn.height));

                                             bends.add(new AbsoluteBendpoint(x, y));

           

                                      } else {

                                             bends.add(new AbsoluteBendpoint(x, y));

                                             bends.add(new AbsoluteBendpoint(x, y + vn.height));

                                      }

                               }

                               conn.setRoutingConstraint(bends);

                        } else {

                               conn.setRoutingConstraint(Collections.EMPTY_LIST);

                        }

                 }

          }

           

          最后的就是一個LayoutManager來初始化圖的創建,以及對圖的信息進行解釋了,生成最終布局了。這個GraphLayoutManager作為GraphDiagramEditPart所對應的GraphDiagramLayoutManager,來顯示圖的內容。

          public class GraphLayoutManager extends AbstractLayout {

                 private GraphBuilder diagram;

           

                 GraphLayoutManager(GraphBuilder diagram) {

                        this.diagram = diagram;

                 }

           

                 protected Dimension calculatePreferredSize(IFigure container, int wHint,

                               int hHint) {

                        container.validate();

                        List children = container.getChildren();

                        Rectangle result = new Rectangle().setLocation(container

                                      .getClientArea().getLocation());

                        for (int i = 0; i < children.size(); i++)

                               result.union(((IFigure) children.get(i)).getBounds());

                        result.resize(container.getInsets().getWidth(), container.getInsets()

                                      .getHeight());

                        return result.getSize();

                 }

           

                 public void layout(IFigure container) {

                        DirectedGraph graph = new DirectedGraph();

                        Map partsToNodes = new HashMap();

                        diagram.contributeNodesToGraph(graph, partsToNodes);

                        diagram.contributeEdgesToGraph(graph, partsToNodes);

                        new DirectedGraphLayout().visit(graph);

                        diagram.applyGraphResults(graph, partsToNodes);

                 }

          }

          可以看到在layout方法中,首先生成了一個DirectedGraph,并調用了contributeNodesToGraph以及contributeEdgesToGraph方法,將節點和邊的信息添加到這個生成的DirectedGraphGraph中,然后使用布局算法DirectedGraphLayout().visit(graph)來計算生成圖的信息(這里使用了visitor模式)最后調用applyGraphResults將圖的信息應用到圖形的顯示上。

           

          至此,所有框架的工作做完了,如果要將模型作為一個有向圖顯示的話,只需要將模型的容器對象對應于GraphDiagramEditPart(在EditPartFactory中進行映射),為每一個需要表示為節點的對象,對應到一個繼承于NodeEditPartEditPart,為每一個需要表示為邊的模型對象,對應到一個繼承于EdgeEditPartEditPart。這樣,就能夠將圖的布局算法,應用到GEF框架中了。

           

          這里寫的比較簡單,使用起來也會有一些具體的約束。例如在有向圖中,是不能夠有孤立的節點的。如果使用CompoundDirectedGraph,就不會有這樣的問題,CompoundDirectedGraph可以包括子圖,可以支持更為復雜的圖形。在Flow Example中使用的就是CompoundDirectedGraph。在后面,我或許會將這個框架進行改寫,以使其支持CompoundDirectedGraph來進行布局算法。下面的圖是一個生成的例子,大家可以看一下效果:

          example_1.JPG

          這是從OWL文件中讀取內容之后生成的一個圖的表示。可以看到,OWL的節點通過自動圖的自動布局之后,已經有了較好的視覺效果。如果沒有這樣的布局的話,因為單純的OWL文件中并不會包含節點的圖的信息,圖顯示出來會變得非常的亂,所有的節點都會堆在一起。





          原文地址:http://www.aygfsteel.com/eclipshine/archive/2005/07/22/8195.aspx

          posted @ 2005-12-28 16:53 hopeshared 閱讀(665) | 評論 (0)編輯 收藏

          第一次聽這首歌是坐在班車上的時候,覺得很有意思,很喜歡。奇怪的是居然從sogua和baidu.music上都down不到這首歌,放在這里吧

          居然從下載歌曲的站點把上面的控件代碼給弄了過來,而且居然能用

          歌詞如下:

          請多指教美女
          五十億人難得遇見了我
          你運氣還不錯
          專情我也不是故意想要推薦自己
          放眼沒人能比
          遠遠就看穿你不溫馴
          卻有一種魅力
          我不是痞只是很有本事有個性
          能讓你動心
          oh yeah
          my girl 別懷疑
          我們的頻率現在最靠近
          想愛我的數不清我想愛的是你
          不是chance chance而已
          my girl 看著戲
          裝深情加體貼多的是蒼蠅
          我沒有那種敵機讓你滿意
          一看見你我就心神不寧喔~
          我才不會忘記你
          他們缺少溫柔不夠幽默沒有體力
          不可能跟我匹敵
          你是天生明星只是我
          也沒那么容易
          愛不是游戲
          給我機會表現來讓你動心
          我們的頻率現在就拉近
          我的頭彩就是你愛是高額獎金
          my girl 想約你
          牽狗狗逛河濱吃碗芒果冰
          我只有這點本領逗你開心
          有信心就要感動你
          直到痛哭流涕
          現在就打開最強電力
          my girl

          posted @ 2005-12-23 11:28 hopeshared 閱讀(444) | 評論 (0)編輯 收藏

          僅列出標題
          共30頁: First 上一頁 21 22 23 24 25 26 27 28 29 下一頁 Last 
          主站蜘蛛池模板: 游戏| 名山县| 铜鼓县| 庆城县| 寿光市| 朝阳县| 南宁市| 固始县| 武威市| 金溪县| 电白县| 陕西省| 左权县| 兰溪市| 竹山县| 团风县| 乌鲁木齐县| 武鸣县| 色达县| 韶山市| 三明市| 呼和浩特市| 交口县| 灵丘县| 蓬溪县| 江北区| 界首市| 原平市| 梅州市| 高阳县| 通城县| 定西市| 沛县| 汉阴县| 定远县| 托克逊县| 兴山县| 田阳县| 广安市| 资阳市| 习水县|