1. Shuge Lee
  2. iBlah

Commits

Shuge Lee  committed b4c5b8c

Clean up files.

  • Participants
  • Parent commits 150bdb7
  • Branches master

Comments (0)

Files changed (15)

File .gitignore

View file
 *.pyc
 *.pyo
-build
-dist
+build/
+dist/
 .DS_Store
 .hg
 .hgignore
 .idea
 .ropeproject
-BUGS.txt
-mockup
-tests/results.xml
-demos/my_account.py
-demos/tmp
-libblah/tmp
-tests/test_user_info.py
-screenshots
-docs
+*old.py
+*copy.py
+t.*
+resources.qrc
+BUGS.*
+TODO
 resources
-experimental/cracking_captcha
-experimental/cmcc-fetion-resources
+ignore/
+demos/__init__.py
+demos/my_account.py
+demos/tmp/
+demos/latest_sys_config.json
+libblah/tmp/
+libblah/settings.json
+libblah/resources.py
 experimental/info_log.txt
 experimental/error_log.txt
 experimental/zwiki
-TODO
-ignore
+tests/results.xml
+tests/test_user_info.py
 tests/results_ii.xml
 tests/sys_config.xml
 tests/test_method_bn_event_presencev4*
-tests/custom_config.xml
-*old.py
-t.xml
-t.py
-*copy.py
-demos/latest_sys_config.json
-libblah/settings.json
-resources.qrc
+tests/custom_config.xml

File BUILD.md

View file
+# How to Building
+
+requirements
+
+ - Python
+ - Qt
+ - Qt Python binding(PyQt or PySide)
+ - BeautifulSoup
+ - lxml
+ - web.py

File README.md

View file
 # About iBlah
 
-(outdated)
-
-iBlah is a free instant messaging application for KDE and Mac OS X.
-
+iBlah is a open SMS client for Mac OS X and KDE, it is published under MIT license.
 China Mobile Fetion Protocol compatible with iBlah.
 
-iBlah is publish under BSD license.
-
-iBlah - 是一个即时通信自由软件。
+iBlah 是一个开放的 SMS 客户端软件,
 中国移动飞信协议兼容 iBlah 。
-iBlah 使用 BSD 许可发布。
 
-## FEATURES
 
-- smart, nice and easy to use
+## FEATURES
 
-- sign in with {cellphone,fetion} No.
-- auto choose last signin account and fill passwd in encryption
-- send message to desktop client, receive from desktop client and cellphone
-- switch status to available, away, busy, invisible
-- add friend by {cellphone,fetion} No.
-- view contact information
+ - smart, nice and easy to use
 
-* 使用手机号或飞信号登陆
-* 自动填充上一次登陆的帐号和密码(非明文)
-* 发送好友信息,接收好友从手机或电脑回复的信息
-* 变更用户状态(在线,离开,忙碌,隐身)
-* 通过手机号、飞信号添加好友
-* 查看联系人信息
+ - sign in with cellphone No. or Fetion No.
+ - chat with CMCC client or iBlah client
+ - manage contacts, view contact's information
+ - update personal information
 
+特性
 
-## How to Building & Running
+ * 聪明,漂亮并且简单易用
 
-requirements
+ * 支持通过移动手机号或飞信号登陆
+ * 与中国移动客户端或者 iBlah 客户端聊天
+ * 管理联系人, 查看和修改联系人信息
+ * 修改个人信息
 
-- BeautifulSoup
-- lxml
-- web.py
-- PyQt4
 
-TBD.

File libblah/__init__.py

View file
     "Shuge Lee <shuge.lee@gmail.com>",
 ]
 __license__ = "MIT License"
-__contributors__ = "see http://iblah.org/changes"
+__contributors__ = "see http://bitbucket.org/shuge/iblah"
 
 
 import captcha_dlg

File libblah/chat_win.py

View file
     from PyQt4 import QtGui
 
 from commons import funcutils, timeutils
-#import resources
 
 
 __all__ = ["ChatWin"]

File libblah/contact_list_win.py

View file
 import contact_list_widget
 from commons import threadutils
 import fetion
-#import resources
 from qcommons import winutils, qthreadutils
 
 
-PWD = os.path.dirname(os.path.realpath(__file__))
-g_sock_debug_log_path_prefix = os.path.join(PWD, "tmp")
-g_sock_log_filename = 0
-
-if not os.path.exists(g_sock_debug_log_path_prefix):
-    os.makedirs(g_sock_debug_log_path_prefix)
-
-def save_sock_debug_log_into_file(buf):
-    global g_sock_debug_log_path_prefix
-    global g_sock_log_filename
-
-    g_sock_log_filename += 1
-    filename = str(g_sock_log_filename)
-
-    path = os.path.join(g_sock_debug_log_path_prefix, filename)
-
-    with open(path, 'w') as f:
-        f.write(buf)
-
-    sys.stdout.write('\n' + path + '\n')
+#PWD = os.path.dirname(os.path.realpath(__file__))
+#g_sock_debug_log_path_prefix = os.path.join(PWD, "tmp")
+#g_sock_log_filename = 0
+#
+#if not os.path.exists(g_sock_debug_log_path_prefix):
+#    os.makedirs(g_sock_debug_log_path_prefix)
+#
+#def save_sock_debug_log_into_file(buf):
+#    global g_sock_debug_log_path_prefix
+#    global g_sock_log_filename
+#
+#    g_sock_log_filename += 1
+#    filename = str(g_sock_log_filename)
+#
+#    path = os.path.join(g_sock_debug_log_path_prefix, filename)
+#
+#    with open(path, 'w') as f:
+#        f.write(buf)
+#
+#    sys.stdout.write('\n' + path + '\n')
 
 
 class MyMSGCustomer(QtCore.QObject):

File mockup/README

-png files is here, http://www.douban.com/photos/album/48747359/

File mockup/add-buddy.bmml

-<mockup version="1.0" skin="sketch" measuredW="660" measuredH="485" mockupW="634" mockupH="465">
-  <controls>
-    <control controlID="0" controlTypeID="com.balsamiq.mockups::TitleWindow" x="26" y="20" w="352" h="465" measuredW="450" measuredH="400" zOrder="0" locked="false" isInGroup="-1">
-      <controlProperties>
-        <bottomheight>47</bottomheight>
-        <close>true</close>
-        <dragger>true</dragger>
-        <minimize>true</minimize>
-        <text>Add%20buddy</text>
-        <topheight>27</topheight>
-      </controlProperties>
-    </control>
-    <control controlID="8" controlTypeID="com.balsamiq.mockups::Button" x="215" y="448" w="-1" h="-1" measuredW="61" measuredH="28" zOrder="1" locked="false" isInGroup="-1">
-      <controlProperties>
-        <text>cancel</text>
-      </controlProperties>
-    </control>
-    <control controlID="9" controlTypeID="com.balsamiq.mockups::Button" x="285" y="448" w="63" h="28" measuredW="51" measuredH="28" zOrder="2" locked="false" isInGroup="-1">
-      <controlProperties>
-        <text>send</text>
-      </controlProperties>
-    </control>
-    <control controlID="11" controlTypeID="com.balsamiq.mockups::RadioButtonGroup" x="41" y="59" w="-1" h="-1" measuredW="106" measuredH="46" zOrder="3" locked="false" isInGroup="-1">
-      <controlProperties>
-        <text>%28o%29%20cellphone%20NO.%0A%28%20%29%20fetion%20NO.</text>
-      </controlProperties>
-    </control>
-    <control controlID="13" controlTypeID="com.balsamiq.mockups::FieldSet" x="41" y="125" w="322" h="102" measuredW="200" measuredH="170" zOrder="4" locked="false" isInGroup="-1">
-      <controlProperties>
-        <backgroundAlpha>1</backgroundAlpha>
-        <text>Contact%20Info</text>
-      </controlProperties>
-    </control>
-    <control controlID="18" controlTypeID="com.balsamiq.mockups::FieldSet" x="39" y="241" w="322" h="185" measuredW="200" measuredH="170" zOrder="5" locked="false" isInGroup="-1">
-      <controlProperties>
-        <text>Send%20a%20Request</text>
-      </controlProperties>
-    </control>
-    <control controlID="19" controlTypeID="com.balsamiq.mockups::TextInput" x="169" y="57" w="-1" h="-1" measuredW="88" measuredH="27" zOrder="6" locked="false" isInGroup="-1">
-      <controlProperties>
-        <text>13800000000</text>
-      </controlProperties>
-    </control>
-    <control controlID="20" controlTypeID="com.balsamiq.mockups::TextInput" x="169" y="86" w="-1" h="-1" measuredW="79" measuredH="27" zOrder="7" locked="false" isInGroup="-1">
-      <controlProperties>
-        <state>disabled</state>
-        <text/>
-      </controlProperties>
-    </control>
-    <control controlID="21" controlTypeID="com.balsamiq.mockups::TextInput" x="164" y="145" w="79" h="27" measuredW="79" measuredH="27" zOrder="8" locked="false" isInGroup="-1">
-      <controlProperties>
-        <state>up</state>
-        <text/>
-      </controlProperties>
-    </control>
-    <control controlID="24" controlTypeID="com.balsamiq.mockups::Label" x="74" y="146" w="-1" h="-1" measuredW="82" measuredH="23" zOrder="9" locked="false" isInGroup="-1">
-      <controlProperties>
-        <text>display%20name</text>
-      </controlProperties>
-    </control>
-    <control controlID="25" controlTypeID="com.balsamiq.mockups::Label" x="86" y="179" w="67" h="23" measuredW="38" measuredH="23" zOrder="10" locked="false" isInGroup="-1">
-      <controlProperties>
-        <text>group</text>
-      </controlProperties>
-    </control>
-    <control controlID="26" controlTypeID="com.balsamiq.mockups::ComboBox" x="164" y="181" w="77" h="50" measuredW="32" measuredH="24" zOrder="11" locked="false" isInGroup="-1">
-      <controlProperties>
-        <text/>
-      </controlProperties>
-    </control>
-    <control controlID="33" controlTypeID="__group__" x="416" y="113" w="244" h="155" measuredW="244" measuredH="155" zOrder="12" locked="false" isInGroup="-1">
-      <groupChildrenDescriptors>
-        <control controlID="0" controlTypeID="com.balsamiq.mockups::TitleWindow" x="0" y="0" w="244" h="155" measuredW="450" measuredH="400" zOrder="0" locked="false" isInGroup="33">
-          <controlProperties>
-            <bottomheight>43</bottomheight>
-            <close>true</close>
-            <text>create%20a%20group</text>
-          </controlProperties>
-        </control>
-        <control controlID="1" controlTypeID="com.balsamiq.mockups::Button" x="126" y="121" w="48" h="28" measuredW="61" measuredH="28" zOrder="1" locked="false" isInGroup="33">
-          <controlProperties>
-            <text>cancel</text>
-          </controlProperties>
-        </control>
-        <control controlID="2" controlTypeID="com.balsamiq.mockups::Button" x="182" y="121" w="50" h="28" measuredW="63" measuredH="28" zOrder="2" locked="false" isInGroup="33">
-          <controlProperties>
-            <text>create</text>
-          </controlProperties>
-        </control>
-        <control controlID="3" controlTypeID="com.balsamiq.mockups::TextInput" x="111" y="57" w="110" h="27" measuredW="75" measuredH="27" zOrder="3" locked="false" isInGroup="33"/>
-        <control controlID="4" controlTypeID="com.balsamiq.mockups::Label" x="38" y="60" w="59" h="23" measuredW="74" measuredH="23" zOrder="4" locked="false" isInGroup="33">
-          <controlProperties>
-            <text>group%20name</text>
-          </controlProperties>
-        </control>
-      </groupChildrenDescriptors>
-    </control>
-    <control controlID="34" controlTypeID="com.balsamiq.mockups::Button" x="277" y="178" w="-1" h="-1" measuredW="63" measuredH="28" zOrder="13" locked="false" isInGroup="-1">
-      <controlProperties>
-        <italic>false</italic>
-        <text>create</text>
-      </controlProperties>
-    </control>
-    <control controlID="35" controlTypeID="com.balsamiq.mockups::Label" x="56" y="262" w="-1" h="-1" measuredW="29" measuredH="23" zOrder="14" locked="false" isInGroup="-1">
-      <controlProperties>
-        <text>I%27m%20</text>
-      </controlProperties>
-    </control>
-    <control controlID="36" controlTypeID="com.balsamiq.mockups::TextInput" x="92" y="259" w="79" h="27" measuredW="31" measuredH="27" zOrder="15" locked="false" isInGroup="-1">
-      <controlProperties>
-        <state>up</state>
-        <text>foo</text>
-      </controlProperties>
-    </control>
-    <control controlID="39" controlTypeID="com.balsamiq.mockups::ComboBox" x="50" y="300" w="-1" h="-1" measuredW="304" measuredH="105" zOrder="16" locked="false" isInGroup="-1">
-      <controlProperties>
-        <text>using%20China%20Fetion%2C%20want%20to%20add%20you%20as%20friend%0Awant%20to%20add%20you%20as%20fetion%20friend%0Afetion%20is%20nice%2C%20want%20to%20add%20you%20as%20friend%0Awant%20you%20become%20my%20fetion%20friend%0Afetion%20could%20send%20message%20without%20fee</text>
-      </controlProperties>
-    </control>
-  </controls>
-</mockup>

File mockup/main.bmml

-<mockup version="1.0" skin="sketch" measuredW="849" measuredH="514" mockupW="830" mockupH="500">
-  <controls>
-    <control controlID="0" controlTypeID="com.balsamiq.mockups::TitleWindow" x="162" y="14" w="300" h="500" measuredW="450" measuredH="400" zOrder="0" locked="false" isInGroup="-1">
-      <controlProperties>
-        <bottomheight>56</bottomheight>
-        <close>true</close>
-        <dragger>true</dragger>
-        <maximizeRestore>false</maximizeRestore>
-        <minimize>true</minimize>
-        <text>Contacts</text>
-        <topheight>77</topheight>
-        <value>0</value>
-        <verticalScrollbar>false</verticalScrollbar>
-      </controlProperties>
-    </control>
-    <control controlID="1" controlTypeID="com.balsamiq.mockups::Image" x="209" y="35" w="50" h="48" measuredW="77" measuredH="79" zOrder="1" locked="false" isInGroup="-1">
-      <controlProperties>
-        <borderStyle>none</borderStyle>
-        <text/>
-      </controlProperties>
-    </control>
-    <control controlID="5" controlTypeID="com.balsamiq.mockups::Button" x="325" y="466" w="-1" h="-1" measuredW="56" measuredH="40" zOrder="2" locked="false" isInGroup="-1">
-      <controlProperties>
-        <icon>AddPageIcon%7Cmedium</icon>
-        <size>16</size>
-        <text/>
-      </controlProperties>
-    </control>
-    <control controlID="13" controlTypeID="com.balsamiq.mockups::HRule" x="173" y="98" w="231" h="5" measuredW="100" measuredH="5" zOrder="6" locked="false" isInGroup="-1"/>
-    <control controlID="30" controlTypeID="com.balsamiq.mockups::Button" x="389" y="466" w="-1" h="-1" measuredW="56" measuredH="40" zOrder="8" locked="false" isInGroup="-1">
-      <controlProperties>
-        <icon>SearchIcon%7Cmedium</icon>
-        <size>16</size>
-        <text/>
-      </controlProperties>
-    </control>
-    <control controlID="31" controlTypeID="__group__" x="469" y="203" w="380" h="25" measuredW="380" measuredH="25" zOrder="7" locked="false" isInGroup="-1">
-      <groupChildrenDescriptors>
-        <control controlID="0" controlTypeID="com.balsamiq.mockups::SearchBox" x="0" y="0" w="380" h="25" measuredW="349" measuredH="25" zOrder="0" locked="false" isInGroup="31">
-          <controlProperties>
-            <text>search%20by%20%7Bcellphone.%2C%20fetion%7D%20NO.%2C%20%7Bfull%2C%20display%7D%20name</text>
-          </controlProperties>
-        </control>
-        <control controlID="1" controlTypeID="com.balsamiq.mockups::Icon" x="350" y="0" w="-1" h="-1" measuredW="24" measuredH="24" zOrder="1" locked="false" isInGroup="31">
-          <controlProperties>
-            <icon>BackSpaceIcon%7Csmall</icon>
-          </controlProperties>
-        </control>
-      </groupChildrenDescriptors>
-    </control>
-    <control controlID="32" controlTypeID="com.balsamiq.mockups::Button" x="173" y="466" w="-1" h="-1" measuredW="56" measuredH="40" zOrder="9" locked="false" isInGroup="-1">
-      <controlProperties>
-        <icon>HelpIcon%7Cmedium</icon>
-        <size>16</size>
-        <text/>
-      </controlProperties>
-    </control>
-    <control controlID="33" controlTypeID="com.balsamiq.mockups::Arrow" x="417" y="103" w="242" h="85" measuredW="150" measuredH="100" zOrder="15" locked="false" isInGroup="-1">
-      <controlProperties>
-        <curvature>1</curvature>
-        <direction>top</direction>
-        <leftArrow>true</leftArrow>
-        <text>switch</text>
-      </controlProperties>
-    </control>
-    <control controlID="34" controlTypeID="com.balsamiq.mockups::Arrow" x="445" y="237" w="246" h="245" measuredW="150" measuredH="100" zOrder="13" locked="false" isInGroup="-1">
-      <controlProperties>
-        <curvature>-1</curvature>
-        <direction>bottom</direction>
-        <leftArrow>false</leftArrow>
-        <text>click</text>
-      </controlProperties>
-    </control>
-    <control controlID="37" controlTypeID="com.balsamiq.mockups::Arrow" x="108" y="404" w="62" h="56" measuredW="150" measuredH="100" zOrder="11" locked="false" isInGroup="-1">
-      <controlProperties>
-        <backgroundAlpha>0.5</backgroundAlpha>
-        <rightArrow>false</rightArrow>
-        <text/>
-      </controlProperties>
-    </control>
-    <control controlID="39" controlTypeID="com.balsamiq.mockups::StickyNote" x="19" y="303" w="-1" h="-1" measuredW="109" measuredH="123" zOrder="10" locked="false" isInGroup="-1">
-      <controlProperties>
-        <text>report%20bug%2C%20request%20new%20feature</text>
-      </controlProperties>
-    </control>
-    <control controlID="40" controlTypeID="com.balsamiq.mockups::Button" x="261" y="466" w="-1" h="-1" measuredW="56" measuredH="40" zOrder="14" locked="false" isInGroup="-1">
-      <controlProperties>
-        <icon>ContactsIcon%7Cmedium</icon>
-        <size>16</size>
-        <text/>
-      </controlProperties>
-    </control>
-    <control controlID="44" controlTypeID="com.balsamiq.mockups::Accordion" x="167" y="107" w="290" h="334" measuredW="150" measuredH="242" zOrder="12" locked="false" isInGroup="-1">
-      <controlProperties>
-        <selectedIndex>0</selectedIndex>
-        <text>OpenFetion%20Team%0AShuge%20Lab.%0A-%20Sub-Item%202.1%0AShuge%20Force%20SA%0A...</text>
-        <value>1</value>
-        <verticalScrollbar>true</verticalScrollbar>
-      </controlProperties>
-    </control>
-    <control controlID="56" controlTypeID="com.balsamiq.mockups::ComboBox" x="311" y="60" w="-1" h="-1" measuredW="84" measuredH="23" zOrder="3" locked="false" isInGroup="-1">
-      <controlProperties>
-        <text>available</text>
-      </controlProperties>
-    </control>
-    <control controlID="57" controlTypeID="com.balsamiq.mockups::Label" x="318" y="36" w="-1" h="-1" measuredW="80" measuredH="23" zOrder="4" locked="false" isInGroup="-1">
-      <controlProperties>
-        <text>user%20name%20..</text>
-      </controlProperties>
-    </control>
-    <control controlID="61" controlTypeID="__group__" x="196" y="261" w="239" h="52" measuredW="239" measuredH="52" zOrder="16" locked="false" isInGroup="-1">
-      <groupChildrenDescriptors>
-        <control controlID="0" controlTypeID="com.balsamiq.mockups::Image" x="189" y="4" w="50" h="48" measuredW="77" measuredH="79" zOrder="0" locked="false" isInGroup="61">
-          <controlProperties>
-            <borderStyle>none</borderStyle>
-            <text/>
-          </controlProperties>
-        </control>
-        <control controlID="1" controlTypeID="com.balsamiq.mockups::Icon" x="0" y="9" w="24" h="24" measuredW="24" measuredH="24" zOrder="1" locked="false" isInGroup="61">
-          <controlProperties>
-            <icon>PowerIcon%7Csmall</icon>
-          </controlProperties>
-        </control>
-        <control controlID="2" controlTypeID="com.balsamiq.mockups::Paragraph" x="36" y="0" w="131" h="41" measuredW="200" measuredH="140" zOrder="2" locked="false" isInGroup="61">
-          <controlProperties>
-            <text>Lee%20Li%0Asign%20...%20blah%20blah</text>
-          </controlProperties>
-        </control>
-      </groupChildrenDescriptors>
-    </control>
-    <control controlID="62" controlTypeID="com.balsamiq.mockups::Paragraph" x="232" y="324" w="131" h="41" measuredW="200" measuredH="140" zOrder="17" locked="false" isInGroup="-1">
-      <controlProperties>
-        <text>....</text>
-      </controlProperties>
-    </control>
-    <control controlID="63" controlTypeID="__group__" x="196" y="203" w="239" h="48" measuredW="239" measuredH="48" zOrder="18" locked="false" isInGroup="-1">
-      <groupChildrenDescriptors>
-        <control controlID="0" controlTypeID="com.balsamiq.mockups::Image" x="189" y="0" w="50" h="48" measuredW="77" measuredH="79" zOrder="0" locked="false" isInGroup="63">
-          <controlProperties>
-            <borderStyle>none</borderStyle>
-            <text/>
-          </controlProperties>
-        </control>
-        <control controlID="1" controlTypeID="com.balsamiq.mockups::IconLabel" x="0" y="8" w="95" h="24" measuredW="95" measuredH="24" zOrder="1" locked="false" isInGroup="63">
-          <controlProperties>
-            <icon>PowerIcon%7Csmall</icon>
-            <labelPosition>right</labelPosition>
-            <text>Xiaoxiao%20Li</text>
-          </controlProperties>
-        </control>
-      </groupChildrenDescriptors>
-    </control>
-    <control controlID="65" controlTypeID="com.balsamiq.mockups::Image" x="385" y="139" w="50" h="48" measuredW="77" measuredH="79" zOrder="19" locked="false" isInGroup="-1">
-      <controlProperties>
-        <borderStyle>none</borderStyle>
-        <text/>
-      </controlProperties>
-    </control>
-    <control controlID="66" controlTypeID="__group__" x="196" y="143" w="167" h="41" measuredW="167" measuredH="41" zOrder="20" locked="false" isInGroup="-1">
-      <groupChildrenDescriptors>
-        <control controlID="0" controlTypeID="com.balsamiq.mockups::Icon" x="0" y="9" w="24" h="24" measuredW="24" measuredH="24" zOrder="0" locked="false" isInGroup="66">
-          <controlProperties>
-            <icon>PowerIcon%7Csmall</icon>
-          </controlProperties>
-        </control>
-        <control controlID="1" controlTypeID="com.balsamiq.mockups::Paragraph" x="36" y="0" w="131" h="41" measuredW="200" measuredH="140" zOrder="1" locked="false" isInGroup="66">
-          <controlProperties>
-            <text>Mumu%20P.%0Asign%20...%20blah%20blah</text>
-          </controlProperties>
-        </control>
-      </groupChildrenDescriptors>
-    </control>
-    <control controlID="67" controlTypeID="com.balsamiq.mockups::Arrow" x="72" y="139" w="117" h="21" measuredW="150" measuredH="100" zOrder="21" locked="false" isInGroup="-1">
-      <controlProperties>
-        <backgroundAlpha>1</backgroundAlpha>
-        <direction>top</direction>
-        <rightArrow>true</rightArrow>
-        <text>double%20click</text>
-      </controlProperties>
-    </control>
-    <control controlID="68" controlTypeID="__group__" x="404" y="20" w="303" h="91" measuredW="303" measuredH="105" zOrder="5" locked="false" isInGroup="-1">
-      <groupChildrenDescriptors>
-        <control controlID="0" controlTypeID="com.balsamiq.mockups::ComboBox" x="219" y="0" w="84" h="105" measuredW="84" measuredH="105" zOrder="0" locked="false" isInGroup="68">
-          <controlProperties>
-            <text>available%0Ahidden%0Aaway%0Ainvisible%0Aoffline</text>
-          </controlProperties>
-        </control>
-        <control controlID="1" controlTypeID="com.balsamiq.mockups::Arrow" x="0" y="29" w="204" h="23" measuredW="150" measuredH="100" zOrder="1" locked="false" isInGroup="68">
-          <controlProperties>
-            <curvature>1</curvature>
-            <direction>bottom</direction>
-            <leftArrow>false</leftArrow>
-            <text>click</text>
-          </controlProperties>
-        </control>
-      </groupChildrenDescriptors>
-    </control>
-  </controls>
-</mockup>

File mockup/modify-settings.bmml

-<mockup version="1.0" skin="sketch" measuredW="318" measuredH="488" mockupW="289" mockupH="465">
-  <controls>
-    <control controlID="78" controlTypeID="__group__" x="29" y="23" w="289" h="465" measuredW="289" measuredH="465" zOrder="0" locked="false" isInGroup="-1">
-      <groupChildrenDescriptors>
-        <control controlID="0" controlTypeID="com.balsamiq.mockups::TitleWindow" x="0" y="0" w="289" h="465" measuredW="450" measuredH="400" zOrder="0" locked="false" isInGroup="78">
-          <controlProperties>
-            <bottomheight>47</bottomheight>
-            <close>true</close>
-            <dragger>true</dragger>
-            <minimize>true</minimize>
-            <text>Settings</text>
-            <topheight>27</topheight>
-          </controlProperties>
-        </control>
-        <control controlID="1" controlTypeID="com.balsamiq.mockups::VerticalTabBar" x="5" y="30" w="277" h="380" measuredW="200" measuredH="117" zOrder="1" locked="false" isInGroup="78">
-          <controlProperties>
-            <position>right</position>
-            <text>basic</text>
-          </controlProperties>
-        </control>
-        <control controlID="2" controlTypeID="com.balsamiq.mockups::Button" x="13" y="425" w="118" h="28" measuredW="132" measuredH="28" zOrder="2" locked="false" isInGroup="78">
-          <controlProperties>
-            <text>Reset%20to%20Defaults</text>
-          </controlProperties>
-        </control>
-        <control controlID="3" controlTypeID="com.balsamiq.mockups::CheckBoxGroup" x="26" y="46" w="164" h="230" measuredW="200" measuredH="230" zOrder="3" locked="false" isInGroup="78">
-          <controlProperties>
-            <text>-%5B%5D%20minimize%20to%20tray-%0A-%5Bx%5D%20close%20to%20tray-%0A-%5Bx%5D%20disable%20system%20message-%0A%20%0A-%5B%5D%20mute-%0A-%5B%5D%20disable%20messsage%20notification-%0A%20%0A-%5B%5D%20auto%20popup%20message-%0A-%5B%5D%20auto%20away%20when%20idle-%0A-%5B%5D%20auto%20reply%20enable-</text>
-          </controlProperties>
-        </control>
-        <control controlID="4" controlTypeID="com.balsamiq.mockups::RadioButtonGroup" x="128" y="311" w="101" h="46" measuredW="122" measuredH="46" zOrder="4" locked="false" isInGroup="78">
-          <controlProperties>
-            <text>%28o%29%20return%0A%28%20%29%20control%20+%20return</text>
-          </controlProperties>
-        </control>
-        <control controlID="5" controlTypeID="com.balsamiq.mockups::Label" x="26" y="311" w="101" h="23" measuredW="122" measuredH="23" zOrder="5" locked="false" isInGroup="78">
-          <controlProperties>
-            <text>send%20message%20with%20</text>
-          </controlProperties>
-        </control>
-      </groupChildrenDescriptors>
-    </control>
-  </controls>
-</mockup>

File mockup/receive-messages.bmml

-<mockup version="1.0" skin="sketch" measuredW="753" measuredH="355" mockupW="713" mockupH="333">
-  <controls>
-    <control controlID="11" controlTypeID="com.balsamiq.mockups::Canvas" x="40" y="22" w="662" h="123" measuredW="100" measuredH="70" zOrder="0" locked="false" isInGroup="-1">
-      <controlProperties>
-        <backgroundAlpha>1</backgroundAlpha>
-      </controlProperties>
-    </control>
-    <control controlID="12" controlTypeID="com.balsamiq.mockups::Image" x="180" y="33" w="100" h="100" measuredW="77" measuredH="79" zOrder="1" locked="false" isInGroup="-1">
-      <controlProperties>
-        <borderStyle>none</borderStyle>
-      </controlProperties>
-    </control>
-    <control controlID="15" controlTypeID="com.balsamiq.mockups::Image" x="338" y="33" w="100" h="100" measuredW="77" measuredH="79" zOrder="2" locked="false" isInGroup="-1">
-      <controlProperties>
-        <borderStyle>none</borderStyle>
-      </controlProperties>
-    </control>
-    <control controlID="16" controlTypeID="com.balsamiq.mockups::Image" x="480" y="33" w="100" h="100" measuredW="77" measuredH="79" zOrder="3" locked="false" isInGroup="-1">
-      <controlProperties>
-        <borderStyle>none</borderStyle>
-      </controlProperties>
-    </control>
-    <control controlID="17" controlTypeID="com.balsamiq.mockups::Canvas" x="40" y="172" w="662" h="123" measuredW="100" measuredH="70" zOrder="4" locked="false" isInGroup="-1">
-      <controlProperties>
-        <backgroundAlpha>1</backgroundAlpha>
-      </controlProperties>
-    </control>
-    <control controlID="18" controlTypeID="com.balsamiq.mockups::Image" x="182" y="183" w="100" h="100" measuredW="77" measuredH="79" zOrder="5" locked="false" isInGroup="-1">
-      <controlProperties>
-        <borderStyle>none</borderStyle>
-      </controlProperties>
-    </control>
-    <control controlID="19" controlTypeID="com.balsamiq.mockups::Icon" x="182" y="235" w="-1" h="-1" measuredW="48" measuredH="48" zOrder="6" locked="false" isInGroup="-1">
-      <controlProperties>
-        <icon>PowerIcon%7Clarge</icon>
-      </controlProperties>
-    </control>
-    <control controlID="21" controlTypeID="com.balsamiq.mockups::Image" x="344" y="183" w="100" h="100" measuredW="77" measuredH="79" zOrder="7" locked="false" isInGroup="-1">
-      <controlProperties>
-        <borderStyle>none</borderStyle>
-      </controlProperties>
-    </control>
-    <control controlID="22" controlTypeID="com.balsamiq.mockups::Image" x="480" y="183" w="100" h="100" measuredW="77" measuredH="79" zOrder="8" locked="false" isInGroup="-1">
-      <controlProperties>
-        <borderStyle>none</borderStyle>
-      </controlProperties>
-    </control>
-    <control controlID="23" controlTypeID="com.balsamiq.mockups::StickyNote" x="595" y="273" w="158" h="82" measuredW="109" measuredH="123" zOrder="9" locked="false" isInGroup="-1">
-      <controlProperties>
-        <text>receive%20message%28s%29</text>
-      </controlProperties>
-    </control>
-    <control controlID="24" controlTypeID="com.balsamiq.mockups::Label" x="626" y="71" w="-1" h="-1" measuredW="20" measuredH="27" zOrder="10" locked="false" isInGroup="-1">
-      <controlProperties>
-        <size>16</size>
-        <text>...</text>
-      </controlProperties>
-    </control>
-    <control controlID="25" controlTypeID="com.balsamiq.mockups::Label" x="626" y="229" w="20" h="27" measuredW="20" measuredH="27" zOrder="11" locked="false" isInGroup="-1">
-      <controlProperties>
-        <size>16</size>
-        <text>...</text>
-      </controlProperties>
-    </control>
-    <control controlID="26" controlTypeID="com.balsamiq.mockups::Arrow" x="213" y="283" w="33" h="72" measuredW="150" measuredH="100" zOrder="12" locked="false" isInGroup="-1">
-      <controlProperties>
-        <curvature>0</curvature>
-        <leftArrow>false</leftArrow>
-        <text/>
-      </controlProperties>
-    </control>
-    <control controlID="27" controlTypeID="com.balsamiq.mockups::CallOut" x="249" y="215" w="-1" h="-1" measuredW="79" measuredH="39" zOrder="13" locked="false" isInGroup="-1">
-      <controlProperties>
-        <text>1%20%28count%29</text>
-      </controlProperties>
-    </control>
-    <control controlID="29" controlTypeID="com.balsamiq.mockups::Label" x="55" y="56" w="-1" h="-1" measuredW="64" measuredH="23" zOrder="14" locked="false" isInGroup="-1">
-      <controlProperties>
-        <text>tray%20icons</text>
-      </controlProperties>
-    </control>
-  </controls>
-</mockup>

File mockup/send-message.bmml

-<mockup version="1.0" skin="sketch" measuredW="870" measuredH="514" mockupW="838" mockupH="495">
-  <controls>
-    <control controlID="0" controlTypeID="com.balsamiq.mockups::TitleWindow" x="32" y="20" w="364" h="417" measuredW="450" measuredH="400" zOrder="0" locked="false" isInGroup="-1">
-      <controlProperties>
-        <bottomheight>25</bottomheight>
-        <close>true</close>
-        <dragger>true</dragger>
-        <minimize>true</minimize>
-        <text>current%20contact%27s%20name%20</text>
-        <verticalScrollbar>true</verticalScrollbar>
-      </controlProperties>
-    </control>
-    <control controlID="2" controlTypeID="com.balsamiq.mockups::TabBar" x="41" y="314" w="338" h="95" measuredW="257" measuredH="100" zOrder="1" locked="false" isInGroup="-1">
-      <controlProperties>
-        <backgroundAlpha>0.75</backgroundAlpha>
-        <selectedIndex>0</selectedIndex>
-        <tabHPosition>right</tabHPosition>
-        <tabVPosition>bottom</tabVPosition>
-        <text>xiaoxiao%2C%20mumu%2C%20anayous</text>
-      </controlProperties>
-    </control>
-    <control controlID="9" controlTypeID="com.balsamiq.mockups::TextArea" x="41" y="56" w="338" h="67" measuredW="200" measuredH="140" zOrder="2" locked="false" isInGroup="-1">
-      <controlProperties>
-        <bold>false</bold>
-        <text>xiaoxiao%3A%20blah%20blah%20...</text>
-      </controlProperties>
-    </control>
-    <control controlID="11" controlTypeID="com.balsamiq.mockups::TextArea" x="41" y="127" w="338" h="67" measuredW="200" measuredH="140" zOrder="3" locked="false" isInGroup="-1">
-      <controlProperties>
-        <bold>false</bold>
-        <text>me%3A%20blah%20blah%20...</text>
-      </controlProperties>
-    </control>
-    <control controlID="12" controlTypeID="com.balsamiq.mockups::TextArea" x="41" y="200" w="338" h="67" measuredW="200" measuredH="140" zOrder="4" locked="false" isInGroup="-1">
-      <controlProperties>
-        <align>left</align>
-        <bold>false</bold>
-        <text>xiaoxiao%3A%20blah%20blah%20...</text>
-      </controlProperties>
-    </control>
-    <control controlID="14" controlTypeID="com.balsamiq.mockups::Label" x="195" y="282" w="-1" h="-1" measuredW="17" measuredH="23" zOrder="5" locked="false" isInGroup="-1">
-      <controlProperties>
-        <text>...</text>
-      </controlProperties>
-    </control>
-    <control controlID="15" controlTypeID="com.balsamiq.mockups::StickyNote" x="356" y="439" w="252" h="75" measuredW="109" measuredH="123" zOrder="6" locked="false" isInGroup="-1">
-      <controlProperties>
-        <text>swtich%20with%20Command-%5B0-9%5D%20</text>
-      </controlProperties>
-    </control>
-    <control controlID="16" controlTypeID="com.balsamiq.mockups::Paragraph" x="50" y="326" w="229" h="101" measuredW="200" measuredH="140" zOrder="7" locked="false" isInGroup="-1">
-      <controlProperties>
-        <text>typing%20...%20%2C%20A%20paragraph%20of%20text.%0AA%20_second_%20%5Brow%5D%20of%20*text*.</text>
-      </controlProperties>
-    </control>
-    <control controlID="17" controlTypeID="com.balsamiq.mockups::TitleWindow" x="506" y="19" w="364" h="417" measuredW="450" measuredH="400" zOrder="8" locked="false" isInGroup="-1">
-      <controlProperties>
-        <bottomheight>25</bottomheight>
-        <close>true</close>
-        <dragger>true</dragger>
-        <minimize>true</minimize>
-        <text>current%20contact%27s%20name%20</text>
-        <verticalScrollbar>true</verticalScrollbar>
-      </controlProperties>
-    </control>
-    <control controlID="18" controlTypeID="com.balsamiq.mockups::TabBar" x="515" y="313" w="338" h="95" measuredW="257" measuredH="100" zOrder="9" locked="false" isInGroup="-1">
-      <controlProperties>
-        <backgroundAlpha>0.75</backgroundAlpha>
-        <selectedIndex>1</selectedIndex>
-        <tabHPosition>right</tabHPosition>
-        <tabVPosition>bottom</tabVPosition>
-        <text>xiaoxiao%2C%20mumu%2C%20anayous</text>
-      </controlProperties>
-    </control>
-    <control controlID="19" controlTypeID="com.balsamiq.mockups::TextArea" x="515" y="55" w="338" h="67" measuredW="200" measuredH="140" zOrder="10" locked="false" isInGroup="-1">
-      <controlProperties>
-        <bold>false</bold>
-        <text>mumu%3A%20blah%20blah%20...</text>
-      </controlProperties>
-    </control>
-    <control controlID="20" controlTypeID="com.balsamiq.mockups::TextArea" x="515" y="126" w="338" h="67" measuredW="200" measuredH="140" zOrder="11" locked="false" isInGroup="-1">
-      <controlProperties>
-        <bold>false</bold>
-        <text>me%3A%20blah%20blah%20...</text>
-      </controlProperties>
-    </control>
-    <control controlID="22" controlTypeID="com.balsamiq.mockups::Label" x="669" y="281" w="-1" h="-1" measuredW="17" measuredH="23" zOrder="12" locked="false" isInGroup="-1">
-      <controlProperties>
-        <text>...</text>
-      </controlProperties>
-    </control>
-    <control controlID="23" controlTypeID="com.balsamiq.mockups::Paragraph" x="524" y="325" w="229" h="101" measuredW="200" measuredH="140" zOrder="13" locked="false" isInGroup="-1">
-      <controlProperties>
-        <text>typing%20...%20%2C%20A%20paragraph%20of%20text.%0AA%20_second_%20%5Brow%5D%20of%20*text*.</text>
-      </controlProperties>
-    </control>
-  </controls>
-</mockup>

File mockup/send-messages.bmml

-<mockup version="1.0" skin="sketch" measuredW="955" measuredH="507" mockupW="923" mockupH="500">
-  <controls>
-    <control controlID="0" controlTypeID="com.balsamiq.mockups::TitleWindow" x="32" y="20" w="550" h="400" measuredW="450" measuredH="400" zOrder="0" locked="false" isInGroup="-1">
-      <controlProperties>
-        <bottomheight>25</bottomheight>
-        <close>true</close>
-        <dragger>true</dragger>
-        <minimize>true</minimize>
-        <text>part%20of%20current%20contacts%27%20names</text>
-        <verticalScrollbar>true</verticalScrollbar>
-      </controlProperties>
-    </control>
-    <control controlID="2" controlTypeID="com.balsamiq.mockups::TabBar" x="46" y="302" w="510" h="91" measuredW="281" measuredH="100" zOrder="1" locked="false" isInGroup="-1">
-      <controlProperties>
-        <backgroundAlpha>0.75</backgroundAlpha>
-        <selectedIndex>0</selectedIndex>
-        <tabHPosition>right</tabHPosition>
-        <tabVPosition>bottom</tabVPosition>
-        <text>...%2C%20xiaoxiao%2C%20mumu%2C%20anayous</text>
-      </controlProperties>
-    </control>
-    <control controlID="12" controlTypeID="com.balsamiq.mockups::TextArea" x="46" y="203" w="510" h="64" measuredW="200" measuredH="140" zOrder="2" locked="false" isInGroup="-1">
-      <controlProperties>
-        <align>left</align>
-        <bold>false</bold>
-        <text>me%3A%20blah%20blah%20...</text>
-      </controlProperties>
-    </control>
-    <control controlID="14" controlTypeID="com.balsamiq.mockups::Label" x="278" y="272" w="46" h="23" measuredW="17" measuredH="23" zOrder="3" locked="false" isInGroup="-1">
-      <controlProperties>
-        <text>...</text>
-      </controlProperties>
-    </control>
-    <control controlID="16" controlTypeID="com.balsamiq.mockups::Paragraph" x="59" y="314" w="-1" h="-1" measuredW="200" measuredH="140" zOrder="4" locked="false" isInGroup="-1">
-      <controlProperties>
-        <text>typing%20...%20%2C%20A%20paragraph%20of%20text.%0AA%20_second_%20%5Brow%5D%20of%20*text*.</text>
-      </controlProperties>
-    </control>
-    <control controlID="19" controlTypeID="com.balsamiq.mockups::TitleWindow" x="655" y="7" w="300" h="500" measuredW="450" measuredH="400" zOrder="5" locked="false" isInGroup="-1">
-      <controlProperties>
-        <bottomheight>56</bottomheight>
-        <close>true</close>
-        <dragger>true</dragger>
-        <maximizeRestore>false</maximizeRestore>
-        <minimize>true</minimize>
-        <text>Contacts</text>
-        <topheight>77</topheight>
-        <value>0</value>
-        <verticalScrollbar>false</verticalScrollbar>
-      </controlProperties>
-    </control>
-    <control controlID="20" controlTypeID="com.balsamiq.mockups::Accordion" x="660" y="100" w="290" h="334" measuredW="150" measuredH="242" zOrder="6" locked="false" isInGroup="-1">
-      <controlProperties>
-        <selectedIndex>0</selectedIndex>
-        <text>OpenFetion%20Team%0AShuge%20Lab.%0A-%20Sub-Item%202.1%0AShuge%20Force%20SA%0A...</text>
-        <value>1</value>
-        <verticalScrollbar>true</verticalScrollbar>
-      </controlProperties>
-    </control>
-    <control controlID="21" controlTypeID="__group__" x="689" y="254" w="239" h="52" measuredW="239" measuredH="52" zOrder="7" locked="false" isInGroup="-1">
-      <groupChildrenDescriptors>
-        <control controlID="0" controlTypeID="com.balsamiq.mockups::Image" x="189" y="4" w="50" h="48" measuredW="77" measuredH="79" zOrder="0" locked="false" isInGroup="21">
-          <controlProperties>
-            <borderStyle>none</borderStyle>
-            <text/>
-          </controlProperties>
-        </control>
-        <control controlID="1" controlTypeID="com.balsamiq.mockups::Icon" x="0" y="9" w="24" h="24" measuredW="24" measuredH="24" zOrder="1" locked="false" isInGroup="21">
-          <controlProperties>
-            <icon>PowerIcon%7Csmall</icon>
-          </controlProperties>
-        </control>
-        <control controlID="2" controlTypeID="com.balsamiq.mockups::Paragraph" x="36" y="0" w="131" h="41" measuredW="200" measuredH="140" zOrder="2" locked="false" isInGroup="21">
-          <controlProperties>
-            <text>Lee%20Li%0Asign%20...%20blah%20blah</text>
-          </controlProperties>
-        </control>
-      </groupChildrenDescriptors>
-    </control>
-    <control controlID="22" controlTypeID="com.balsamiq.mockups::Paragraph" x="725" y="317" w="131" h="41" measuredW="200" measuredH="140" zOrder="8" locked="false" isInGroup="-1">
-      <controlProperties>
-        <text>....</text>
-      </controlProperties>
-    </control>
-    <control controlID="23" controlTypeID="__group__" x="689" y="196" w="239" h="48" measuredW="239" measuredH="48" zOrder="9" locked="false" isInGroup="-1">
-      <groupChildrenDescriptors>
-        <control controlID="0" controlTypeID="com.balsamiq.mockups::Image" x="189" y="0" w="50" h="48" measuredW="77" measuredH="79" zOrder="0" locked="false" isInGroup="23">
-          <controlProperties>
-            <borderStyle>none</borderStyle>
-            <text/>
-          </controlProperties>
-        </control>
-        <control controlID="1" controlTypeID="com.balsamiq.mockups::IconLabel" x="0" y="8" w="95" h="24" measuredW="95" measuredH="24" zOrder="1" locked="false" isInGroup="23">
-          <controlProperties>
-            <icon>PowerIcon%7Csmall</icon>
-            <labelPosition>right</labelPosition>
-            <text>Xiaoxiao%20Li</text>
-          </controlProperties>
-        </control>
-      </groupChildrenDescriptors>
-    </control>
-    <control controlID="24" controlTypeID="com.balsamiq.mockups::Image" x="878" y="132" w="50" h="48" measuredW="77" measuredH="79" zOrder="10" locked="false" isInGroup="-1">
-      <controlProperties>
-        <borderStyle>none</borderStyle>
-        <text/>
-      </controlProperties>
-    </control>
-    <control controlID="25" controlTypeID="__group__" x="689" y="136" w="167" h="41" measuredW="167" measuredH="41" zOrder="11" locked="false" isInGroup="-1">
-      <groupChildrenDescriptors>
-        <control controlID="0" controlTypeID="com.balsamiq.mockups::Icon" x="0" y="9" w="24" h="24" measuredW="24" measuredH="24" zOrder="0" locked="false" isInGroup="25">
-          <controlProperties>
-            <icon>PowerIcon%7Csmall</icon>
-          </controlProperties>
-        </control>
-        <control controlID="1" controlTypeID="com.balsamiq.mockups::Paragraph" x="36" y="0" w="131" h="41" measuredW="200" measuredH="140" zOrder="1" locked="false" isInGroup="25">
-          <controlProperties>
-            <text>Mumu%20P.%0Asign%20...%20blah%20blah</text>
-          </controlProperties>
-        </control>
-      </groupChildrenDescriptors>
-    </control>
-    <control controlID="34" controlTypeID="com.balsamiq.mockups::Arrow" x="375" y="100" w="299" h="61" measuredW="150" measuredH="100" zOrder="14" locked="false" isInGroup="-1">
-      <controlProperties>
-        <text>drag%20and%20drop%20contact%28s%29%20to%20here</text>
-      </controlProperties>
-    </control>
-    <control controlID="35" controlTypeID="com.balsamiq.mockups::Canvas" x="39" y="54" w="517" h="130" measuredW="100" measuredH="70" zOrder="12" locked="false" isInGroup="-1">
-      <controlProperties>
-        <backgroundAlpha>0.25</backgroundAlpha>
-        <borderColor>13421772</borderColor>
-        <borderStyle>roundedDotted</borderStyle>
-        <color>15658734</color>
-      </controlProperties>
-    </control>
-    <control controlID="37" controlTypeID="__group__" x="164" y="63" w="205" h="118" measuredW="205" measuredH="118" zOrder="13" locked="false" isInGroup="-1">
-      <groupChildrenDescriptors>
-        <control controlID="0" controlTypeID="com.balsamiq.mockups::Image" x="0" y="10" w="50" h="48" measuredW="77" measuredH="79" zOrder="0" locked="false" isInGroup="37">
-          <controlProperties>
-            <borderStyle>none</borderStyle>
-            <text/>
-          </controlProperties>
-        </control>
-        <control controlID="1" controlTypeID="com.balsamiq.mockups::Image" x="20" y="30" w="50" h="48" measuredW="77" measuredH="79" zOrder="1" locked="false" isInGroup="37">
-          <controlProperties>
-            <borderStyle>none</borderStyle>
-            <text/>
-          </controlProperties>
-        </control>
-        <control controlID="2" controlTypeID="com.balsamiq.mockups::Image" x="40" y="50" w="50" h="48" measuredW="77" measuredH="79" zOrder="2" locked="false" isInGroup="37">
-          <controlProperties>
-            <borderStyle>none</borderStyle>
-            <text/>
-          </controlProperties>
-        </control>
-        <control controlID="3" controlTypeID="com.balsamiq.mockups::Image" x="95" y="0" w="50" h="48" measuredW="77" measuredH="79" zOrder="3" locked="false" isInGroup="37">
-          <controlProperties>
-            <borderStyle>none</borderStyle>
-            <text/>
-          </controlProperties>
-        </control>
-        <control controlID="4" controlTypeID="com.balsamiq.mockups::Image" x="115" y="20" w="50" h="48" measuredW="77" measuredH="79" zOrder="4" locked="false" isInGroup="37">
-          <controlProperties>
-            <borderStyle>none</borderStyle>
-            <text/>
-          </controlProperties>
-        </control>
-        <control controlID="5" controlTypeID="com.balsamiq.mockups::Image" x="135" y="40" w="50" h="48" measuredW="77" measuredH="79" zOrder="5" locked="false" isInGroup="37">
-          <controlProperties>
-            <borderStyle>none</borderStyle>
-            <text/>
-          </controlProperties>
-        </control>
-        <control controlID="6" controlTypeID="com.balsamiq.mockups::Image" x="155" y="60" w="50" h="48" measuredW="77" measuredH="79" zOrder="6" locked="false" isInGroup="37">
-          <controlProperties>
-            <borderStyle>none</borderStyle>
-            <text/>
-          </controlProperties>
-        </control>
-        <control controlID="7" controlTypeID="com.balsamiq.mockups::Image" x="60" y="70" w="50" h="48" measuredW="77" measuredH="79" zOrder="7" locked="false" isInGroup="37">
-          <controlProperties>
-            <borderStyle>none</borderStyle>
-            <text/>
-          </controlProperties>
-        </control>
-      </groupChildrenDescriptors>
-    </control>
-  </controls>
-</mockup>

File mockup/update-profile.bmml

-<mockup version="1.0" skin="sketch" measuredW="839" measuredH="487" mockupW="804" mockupH="465">
-  <controls>
-    <control controlID="106" controlTypeID="com.balsamiq.mockups::Arrow" x="330" y="121" w="221" h="31" measuredW="150" measuredH="100" zOrder="23" locked="false" isInGroup="-1">
-      <controlProperties>
-        <text>click</text>
-      </controlProperties>
-    </control>
-    <control controlID="107" controlTypeID="com.balsamiq.mockups::TitleWindow" x="35" y="22" w="352" h="465" measuredW="450" measuredH="400" zOrder="10" locked="false" isInGroup="-1">
-      <controlProperties>
-        <bottomheight>47</bottomheight>
-        <close>true</close>
-        <dragger>true</dragger>
-        <minimize>true</minimize>
-        <text>Profile</text>
-        <topheight>27</topheight>
-      </controlProperties>
-    </control>
-    <control controlID="108" controlTypeID="com.balsamiq.mockups::VerticalTabBar" x="42" y="52" w="338" h="380" measuredW="200" measuredH="117" zOrder="11" locked="false" isInGroup="-1">
-      <controlProperties>
-        <position>right</position>
-        <text>basic</text>
-      </controlProperties>
-    </control>
-    <control controlID="109" controlTypeID="com.balsamiq.mockups::Button" x="50" y="447" w="-1" h="-1" measuredW="132" measuredH="28" zOrder="12" locked="false" isInGroup="-1">
-      <controlProperties>
-        <text>Reset%20to%20Defaults</text>
-      </controlProperties>
-    </control>
-    <control controlID="110" controlTypeID="com.balsamiq.mockups::Paragraph" x="50" y="179" w="255" h="281" measuredW="200" measuredH="140" zOrder="13" locked="false" isInGroup="-1">
-      <controlProperties>
-        <state>up</state>
-        <text>mood%20phrase</text>
-      </controlProperties>
-    </control>
-    <control controlID="111" controlTypeID="com.balsamiq.mockups::Image" x="246" y="67" w="-1" h="-1" measuredW="77" measuredH="79" zOrder="14" locked="false" isInGroup="-1">
-      <controlProperties/>
-    </control>
-    <control controlID="112" controlTypeID="com.balsamiq.mockups::TextInput" x="146" y="71" w="-1" h="-1" measuredW="69" measuredH="27" zOrder="15" locked="false" isInGroup="-1">
-      <controlProperties>
-        <state>disabled</state>
-        <text>12345678</text>
-      </controlProperties>
-    </control>
-    <control controlID="113" controlTypeID="com.balsamiq.mockups::TextInput" x="146" y="125" w="-1" h="-1" measuredW="49" measuredH="27" zOrder="16" locked="false" isInGroup="-1">
-      <controlProperties>
-        <text>Lee%20Li</text>
-      </controlProperties>
-    </control>
-    <control controlID="114" controlTypeID="com.balsamiq.mockups::Label" x="58" y="73" w="-1" h="-1" measuredW="67" measuredH="23" zOrder="17" locked="false" isInGroup="-1">
-      <controlProperties>
-        <text>fetion%20NO.</text>
-      </controlProperties>
-    </control>
-    <control controlID="115" controlTypeID="com.balsamiq.mockups::Label" x="58" y="126" w="-1" h="-1" measuredW="57" measuredH="23" zOrder="18" locked="false" isInGroup="-1">
-      <controlProperties>
-        <text>fullname</text>
-      </controlProperties>
-    </control>
-    <control controlID="116" controlTypeID="com.balsamiq.mockups::TextInput" x="146" y="98" w="-1" h="-1" measuredW="69" measuredH="27" zOrder="19" locked="false" isInGroup="-1">
-      <controlProperties>
-        <state>disabled</state>
-        <text>12345678</text>
-      </controlProperties>
-    </control>
-    <control controlID="117" controlTypeID="com.balsamiq.mockups::Label" x="58" y="99" w="-1" h="-1" measuredW="87" measuredH="23" zOrder="20" locked="false" isInGroup="-1">
-      <controlProperties>
-        <text>cellphone%20NO.</text>
-      </controlProperties>
-    </control>
-    <control controlID="119" controlTypeID="com.balsamiq.mockups::TextArea" x="58" y="213" w="265" h="204" measuredW="200" measuredH="140" zOrder="21" locked="false" isInGroup="-1">
-      <controlProperties>
-        <backgroundAlpha>0.75</backgroundAlpha>
-        <color>14540253</color>
-        <text>Some%20text%0AA%20second%20line%20of%20text%0A...</text>
-      </controlProperties>
-    </control>
-    <control controlID="120" controlTypeID="com.balsamiq.mockups::ScratchOut" x="81" y="287" w="-1" h="-1" measuredW="205" measuredH="107" zOrder="22" locked="false" isInGroup="-1">
-      <controlProperties>
-        <color>3355443</color>
-      </controlProperties>
-    </control>
-    <control controlID="121" controlTypeID="com.balsamiq.mockups::TitleWindow" x="560" y="93" w="279" h="359" measuredW="450" measuredH="400" zOrder="0" locked="false" isInGroup="-1">
-      <controlProperties>
-        <text>Update%20Avatar</text>
-      </controlProperties>
-    </control>
-    <control controlID="122" controlTypeID="com.balsamiq.mockups::Image" x="731" y="319" w="81" h="72" measuredW="77" measuredH="79" zOrder="1" locked="false" isInGroup="-1"/>
-    <control controlID="123" controlTypeID="com.balsamiq.mockups::Label" x="733" y="299" w="50" h="18" measuredW="50" measuredH="23" zOrder="2" locked="false" isInGroup="-1">
-      <controlProperties>
-        <text>preview</text>
-      </controlProperties>
-    </control>
-    <control controlID="124" controlTypeID="com.balsamiq.mockups::Button" x="761" y="146" w="45" h="22" measuredW="45" measuredH="28" zOrder="3" locked="false" isInGroup="-1">
-      <controlProperties>
-        <text>add</text>
-      </controlProperties>
-    </control>
-    <control controlID="125" controlTypeID="com.balsamiq.mockups::Button" x="761" y="171" w="66" h="22" measuredW="66" measuredH="28" zOrder="4" locked="false" isInGroup="-1">
-      <controlProperties>
-        <text>remove</text>
-      </controlProperties>
-    </control>
-    <control controlID="126" controlTypeID="com.balsamiq.mockups::List" x="584" y="136" w="159" h="148" measuredW="100" measuredH="159" zOrder="5" locked="false" isInGroup="-1">
-      <controlProperties>
-        <rowHeight>53</rowHeight>
-        <text>avatar%20One%0Aavatar%20Two%0Aavatar%20Three</text>
-        <verticalScrollbar>true</verticalScrollbar>
-      </controlProperties>
-    </control>
-    <control controlID="128" controlTypeID="com.balsamiq.mockups::Image" x="673" y="146" w="37" h="31" measuredW="77" measuredH="79" zOrder="6" locked="false" isInGroup="-1"/>
-    <control controlID="129" controlTypeID="com.balsamiq.mockups::Image" x="673" y="192" w="37" h="31" measuredW="77" measuredH="79" zOrder="7" locked="false" isInGroup="-1"/>
-    <control controlID="130" controlTypeID="com.balsamiq.mockups::Image" x="673" y="236" w="37" h="31" measuredW="77" measuredH="79" zOrder="8" locked="false" isInGroup="-1"/>
-    <control controlID="131" controlTypeID="com.balsamiq.mockups::StickyNote" x="509" y="331" w="126" h="77" measuredW="109" measuredH="123" zOrder="9" locked="false" isInGroup="-1">
-      <controlProperties>
-        <text>DND%20area</text>
-      </controlProperties>
-    </control>
-  </controls>
-</mockup>

File setup.py

View file
+#!/usr/bin/env python
+"""
+
+TODO:
+ - strip dist/iBlah.app/Contents/Frameworks
+"""
 import os
 from setuptools import setup, find_packages
 import shutil
 import sys
-import glob
-from libblah import consts
+import time
 
+import libblah
 
 PWD = os.path.dirname(os.path.realpath(__file__))
 
-APP_NAME = consts.NAME
-MAIN_APP_NAME = '%s.py' % APP_NAME
-RES_PATH = os.path.join(PWD, 'dist', '%s.app' % APP_NAME, 'Contents', 'Resources')
+APP_NAME = "iBlah"
+APP_VERSION = libblah.__version__
+APP_SCRIPT_NAME = '%s.py' % APP_NAME.lower()
 
-data_files = [
-        ("icons", glob.glob(os.path.join(PWD, "icons", "*"))),
-        ("scripts", glob.glob(os.path.join(PWD, "scripts", "*"))),
-        ("resource", glob.glob(os.path.join(PWD, "resource", "*.nib"))),
-        #('/usr/share/applications',['iBlah.desktop']),
-    ]
 
-packages = find_packages()
+def get_py2app_options():
+    try:
+        import PySide
+    except ImportError:
+        PySide = None
+        try:
+            import PyQt4
+        except ImportError:
+            exit(-1)
+
+    python_qt = PySide or PyQt4
+
+    qt_gui = "%s.QtGui" % python_qt.__name__
+    qt_core = "%s.QtCore" % python_qt.__name__
+
+    packages = ["lxml"]
+    includes = ["sip", qt_gui, qt_core, "web", "BeautifulSoup", "lxml.etree"]
+    excludes = ["PyQt4.QtCLucene", "PyQt4.QtDeclarative", 'PyQt4.QtDesigner', "PyQt4.QtHelp",
+                "PyQt4.QtMultimedia", 'PyQt4.QtNetwork', 'PyQt4.QtOpenGL', 'PyQt4.QtScript',
+                'PyQt4.QtSql', "PyQt4.QtSvg", 'PyQt4.QtTest', 'PyQt4.QtWebKit', 'PyQt4.QtXml', 'PyQt4.QtXmlPatterns',
+                "bz2"]
+    frameworks = ["/opt/local/lib/libxml2.2.dylib"]
+
+
+    py2app_options = {
+        "packages" : packages,
+        "includes" : includes,
+        "excludes" : excludes,
+        "frameworks" : frameworks,
+        }
+
+    return py2app_options
+
 
 plist = dict(
     CFBundleName = APP_NAME,
-    CFBundleShortVersionString = consts.version,
-    CFBundleGetInfoString = ' '.join([APP_NAME, consts.version]),
+    CFBundleShortVersionString = APP_VERSION,
+    CFBundleGetInfoString = ' '.join([APP_NAME, APP_VERSION]),
     CFBundleExecutable = APP_NAME,
-    CFBundleIdentifier = 'org.shuge.fetion',
+    CFBundleIdentifier = 'org.shuge-lab.%s' % APP_NAME,
 )
 
-
-def delete_old():
-    BUILD_PATH = os.path.join(PWD, "build")
-    DIST_PATH = os.path.join(PWD, "dist")
-    if os.path.exists(BUILD_PATH):
-         shutil.rmtree(BUILD_PATH)
-    if os.path.exists(DIST_PATH):
-        shutil.rmtree(DIST_PATH)
-
 def create_app():
-    apps = [
+    app_option = [
         {
-            "script" : MAIN_APP_NAME,
+            "script" : APP_SCRIPT_NAME,
             "plist" : plist,
         }
     ]
-    OPTIONS = {'includes': ['sip', 'PyQt4.QtCore', 'PyQt4.QtGui']}
 
     setup(
         name = APP_NAME,
-        version = consts.version,
-        description = consts.DESCRIPTION_EN,
-        author = consts.AUTHOR,
-        author_email = consts.AUTHOR_EMAIL,
-        platforms = ["Mac OSX"],
-        license = "Shuge Property License",
+        version = APP_VERSION,
+        description = "The Missing SMS client for Mac OS X",
+        author = "Shuge Lee",
+        author_email = "shuge.lee@gmail.com",
+        platforms = ["Mac OS X"],
+        license = "MIT License",
         url = "http://bitbucket.org/shugelee/iblah/",
-        scripts = [MAIN_APP_NAME],
-
-        app = apps,
-        options = {'py2app': OPTIONS},
-        # setup_requires = ['py2app'],
-        data_files = data_files,
-        packages = packages,
+        
+        scripts = [APP_SCRIPT_NAME],
+        packages = find_packages(exclude = ("demos", )),
+        
+        app = app_option,
+        options = {'py2app': get_py2app_options()},
     )
 
-def qt_menu_patch():
-    src = os.path.join(PWD, 'resource', 'qt_menu.nib')
-    dst = os.path.join(RES_PATH, 'qt_menu.nib')
+
+APP_RESOURCES_PATH = os.path.join(PWD, 'dist', '%s.app' % APP_NAME.lower(), 'Contents', 'Resources')
+
+def patch_qt_menu():
+    t1 = "/Library/Frameworks/QtGui.framework/Versions/4/Resources/qt_menu.nib"
+    t2 = "/opt/local/lib/Resources/qt_menu.nib"
+    
+    if os.path.exists(t1):
+        src = t1
+    elif os.path.exists(t2):
+        src = t2
+    else:
+        msg = "ERROR: qt_menu.nib not found"
+        print msg
+        exit(-1)
+    
+    dst = os.path.join(APP_RESOURCES_PATH, 'qt_menu.nib')
     if not os.path.exists(dst):
         shutil.copytree(src, dst)
 
-_RUN_IN_TERM_PATCH = """import os
+
+_ENABLE_IT_RUN_IN_TERMINAL = """import os
 import sys
 
 os.environ['RESOURCEPATH'] = os.path.dirname(os.path.realpath(__file__))
 
 """
 
-#paths = []
-#for i in sys.path:
-#    if not i.startswith("/opt/") or not i.startswith("/sw/"):
-#        paths.append(i)
-#sys.path = paths
-#from pprint import pprint as pp
-#pp(sys.path)
-
-
-# TODO: fix error about /opt/local/lib/libQtGui.4.dylib
-# sys.path.remove(i) for i in sys.path if i.startswith("/opt")
-
-def run_in_term_patch():
-    BOOT_FILE_PATH = os.path.join(RES_PATH, "__boot__.py")
+def patch_enable_it_run_in_terminal():
+    BOOT_FILE_PATH = os.path.join(APP_RESOURCES_PATH, "__boot__.py")
     with open(BOOT_FILE_PATH) as f:
         old = f.read()
 
-    new = _RUN_IN_TERM_PATCH + old
+    new = _ENABLE_IT_RUN_IN_TERMINAL + old
 
     with open(BOOT_FILE_PATH, 'w') as f:
         f.write(new)
 
-def data_files_patch():
-    for item in data_files:
-        if isinstance(item, tuple):
-            folder_name = item[0]
-        else:
-            folder_name = item
-
-        src = os.path.join(PWD, folder_name)
-        dst = os.path.join(RES_PATH, folder_name)
-        if not os.path.exists(dst):
-            shutil.copytree(src, dst)
 
+def delete_old_app():
+    BUILD_PATH = os.path.join(PWD, "build")
+    DIST_PATH = os.path.join(PWD, "dist")
+    if os.path.exists(BUILD_PATH):
+         shutil.rmtree(BUILD_PATH)
+    if os.path.exists(DIST_PATH):
+        shutil.rmtree(DIST_PATH)
         
-#ACTION_CREATE = len(sys.argv) == 3 and sys.argv[-1] == "build"
-#
-#if ACTION_CREATE:
-#    delete_old()
-#    create_app()
-#    qt_menu_patch()
-#    run_in_term_patch()
-#    data_files_patch()
-#else:
-#    create_app()
-#     print "Usage: python setup.py py2app build"
-
-
-argv = sys.argv[1:]
-
-if argv[0] == "test":
-    import unittest
+        
+if __name__ == "__main__":
+    args = sys.argv[1:]
     
-    tl = unittest.TestLoader()
-    test_suits = tl.discover('tests')
+    if len(args) != 2 or args[-1] != "build":
+        print "Usage: python setup.py py2app build"
+        exit(0)
+
+    delete_old_app()
+    time.sleep(5)
+    create_app()
 
-    testRunner = unittest.TextTestRunner()
-    testRunner.run(test_suits)
+    patch_qt_menu()
+#    patch_enable_it_run_in_terminal()