zoukankan      html  css  js  c++  java
  • C语言注释符号

    同学们认为注释很简单,那我来看看下面的代码是否正确?

    1.似是而非的问题

     1 int main()
     2 {
     3     int/*...*/i;  
     4     char* s = "abcdefgh      //hijklmn"; 
     5     //Is it a             //
     6     valid comment?    
     7     in/*...*/t i;   
     8     return 0;
     9     
    10 }

    你的答案是什么呢?

    答案:

      只有第七行出错。

    2.注释规则

      编译器在编译过程中使用空格替换整个注释

      字符串字符串字面量中的 // 和 /*...*/不代表注释符号

      /*......*/型注释不能被嵌套(在分段排除异常往往被忽略)

     3.有趣的问题

    你觉得y=x/*p是什么意思?

    作者本意:

      把x除以*p的结果赋值给y。

    编译器:

      将/*作为一段注释的开始,把/* 后面的内容都当成注释内容,直到*/出现为止。

      在编译器看来,注释和其它程序元素是平等的,因此,作为工程师不能轻视注释,可以用x/ *p表示(空格的重要性)

    (1)、教科书式注释:

    1     r = n / 2; //r是n的一半
    2     while( ( r - n / r ) <= t) //循环,仅当r-n/r不大于t
    3     {
    4         
    5     } 
    6     r=r+n*t; //对变量r进行赋值
    7     
    8     n++; //变量n自增1

    注释用于阐述原因和意图而不是描述程序的运行过程!上面的注释一点用都没有!!!!

    (2)、迷惑型注释:

    1     init();
    2     
    3     //......
    4     
    5     sad = 0x723; //R.I.P.L.V.B.
    6     
    7     //......
    8   
    9     finalize();

    解释:Rest in piece , Ludwig Van Benthoven, 0x723(16)=1827(10) 原作者看到这行代码,怀恋贝多芬!!

    写注释不是晒心情,必须无二义性,起到对代码进行提示的作用,避免使用缩写

    (3)、忽悠型注释:

     1     // ... ...
     2     // ... ...
     3     
     4     // BOB 07/24/1995
     5     /* 我知道这个问题很难解决而且
     6     * 现在必须依赖于这个 contains 函数,
     7     * 但我以后会用一种更加直观优雅有意义的方式
     8     * 重写着段代码。
     9     * 现在这么做只是由于时间紧迫,但我一定会解决。
    10     */
    11     
    12     if( contains(s, "error" ) ) 
    13     {
    14         exit(1);
    15     }
    16     // ... ...
    17     
    18     // ... ...

    然而一直没改

    注释是对代码的提示,避免臃肿和喧兵夺主

    (4)、搞笑型注释:

     1 /* 2  *                             _ooOoo_ 
     3  *                            o8888888o 
     4  *                            88" . "88 
     5  *                            (| -_- |) 
     6  *                            O  =  /O 
     7  *                         ____/`---'\____ 
     8  *                       .'  \|     |//  `. 
     9  *                      /  \|||  :  |||//   
    10  *                     /  _||||| -:- |||||-   
    11  *                     |   | \  -  /// |   | 
    12  *                     | \_|  ''---/''  |   | 
    13  *                       .-\__  `-`  ___/-. / 
    14  *                   ___`. .'  /--.--  `. . __ 
    15  *                ."" '<  `.___\_<|>_/___.'  >'"". 
    16  *               | | :  `- \`.;` _ /`;.`/ - ` : | | 
    17  *                  `-.   \_ __ /__ _/   .-` /  / 
    18  *          ======`-.____`-.___\_____/___.-`____.-'====== 
    19  *                             `=---=' 
    20  *          ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 
    21  *                     佛祖保佑        永无BUG 
    22  *            佛曰: 
    23  *                   写字楼里写字间,写字间里程序员; 
    24  *                   程序人员写程序,又拿程序换酒钱。 
    25  *                   酒醒只在网上坐,酒醉还来网下眠; 
    26  *                   酒醉酒醒日复日,网上网下年复年。 
    27  *                   但愿老死电脑间,不愿鞠躬老板前; 
    28  *                   奔驰宝马贵者趣,公交自行程序员。 
    29  *                   别人笑我忒疯癫,我笑自己命太贱; 
    30  *                   不见满街漂亮妹,哪个归得程序员? 
    31 */  

    4.小结

    注释应该精准易懂,防止二义性,错误的注释有害无利

                   注释是对代码的提示,避免臃肿和喧兵夺主

                   一目了然的代码避免加注释

                   不要用缩写来注释代码,这样可能产生误解

                   注释用来阐述原因和意图而不是描述程序的运行机制
    5.漂亮的注释

       1 /* 
       2   ======================================================================== 
       3  
       4   FILE:  Form.c 
       5    
       6   SERVICES:   
       7  
       8   GENERAL DESCRIPTION: Concrete implementation of RootForm and base IForm 
       9   methods 
      10  
      11   ======================================================================== 
      12   ======================================================================== 
      13      
      14                Copyright ?1999-2005 QUALCOMM Incorporated  
      15                      All Rights Reserved. 
      16                    QUALCOMM Proprietary/GTDR 
      17      
      18   ======================================================================== 
      19   ======================================================================== 
      20 */  
      21   
      22   
      23 /*================================================================================== 
      24                          XXXXXXX Confidential Proprietary 
      25                    (c) Copyright XXXXXXX - All Rights Reserved 
      26  
      27 Revision History: 
      28                          Modification 
      29   Author                     Date        CR Number      Major Changes 
      30 ----------------------   ------------   ------------   ---------------------------- 
      31 Daniel Rossler            01/18/2007     LIBkk94550    Add check for NULL pointers 
      32                                                        in order to avoid a panic 
      33 ==================================================================================*/  
      34   
      35   
      36   
      37 #include "FormBase.h"  
      38   
      39 #include "AEESoftkeyWidget.h"  
      40 #include "AEEImageWidget.h"  
      41 #include "AEEStaticWidget.h"  
      42 #include "AEEImageStaticWidget.h"  
      43 #include "AEERootContainer.h"  
      44 #include "AEEWProperties.h"  
      45 #include "AEEVectorModel.h"  
      46   
      47 #include "AEEWeb.h"  
      48   
      49 #include "AEERootForm.h"  
      50 #include "AEEResFile.h"  
      51   
      52 #include "FormUtil.h"  
      53 #include "AEEDisplayCanvas.h"  
      54   
      55 #define FORMSTACK_MIN  10  
      56 #define FORMSTACK_GROW 2  
      57   
      58 /////////////////////////////////////////////////////////////////  
      59 // RootForm  
      60   
      61 typedef struct RootForm {  
      62    Form              base;  
      63   
      64    IRootContainer *  piContainer;  
      65    AEERect           rcContainer;  
      66    AEERect           rcClient;  
      67   
      68    IVectorModel *    piForms;  
      69    ModelListener     mlFormActive;  
      70    ModelListener     mlFormTopmostNonPopup;  
      71   
      72    IWidget *         piTitle;  
      73    ImageStaticInfo   titleInfo;  
      74    IWidget *         piSoftkeys;  
      75    IWidget *         piBackground;  
      76   
      77    IWidget *         piActiveWidget;    
      78   
      79    IResFile *        piThemeFile;  
      80    const char *      themeFile;  
      81 } RootForm;  
      82   
      83 #define DECL(c) c* me = (c *)po  
      84   
      85 static __inline IForm *ROOTFORM_TO_IFORM(RootForm *me) {  
      86    return (IForm *)me;  
      87 }  
      88   
      89 static __inline Form *ROOTFORM_TO_FORM(RootForm *me) {  
      90    return (Form *)me;  
      91 }  
      92   
      93 static __inline IRootForm *ROOTFORM_TO_IROOTFORM(RootForm *me) {  
      94    return (IRootForm *)me;  
      95 }  
      96   
      97 static void RootForm_FreeFormEntry(IForm *po)  
      98 {  
      99    IFORM_Release(po);  
     100 }  
     101   
     102 static void RootForm_UpdateClientArea(RootForm *me)  
     103 {  
     104    WidgetPos pos;  
     105    WExtent titleExtent, skExtent;  
     106   
     107    if (me->piSoftkeys) {  
     108       IWIDGET_GetExtent(me->piSoftkeys, &skExtent);  
     109    
     110       // Adjust softkey position based on current height  
     111       IROOTCONTAINER_GetPos(me->piContainer, me->piSoftkeys, &pos);  
     112       pos.y = me->rcContainer.dy - skExtent.height;  
     113       IROOTCONTAINER_SetPos(me->piContainer, me->piSoftkeys, WIDGET_ZNORMAL, &pos);  
     114    } else {  
     115       SETWEXTENT(&skExtent, 00);  
     116    }  
     117   
     118    if (me->piTitle) {  
     119       IWIDGET_GetExtent(me->piTitle, &titleExtent);  
     120    } else {  
     121       SETWEXTENT(&titleExtent, 00);  
     122    }  
     123      
     124    // Calculate client area  
     125    SETAEERECT(&me->rcClient, 0, titleExtent.height,  
     126               me->rcContainer.dx,  
     127               me->rcContainer.dy - skExtent.height - titleExtent.height);  
     128 }  
     129   
     130   
     131 static void RootForm_UpdateTheme(RootForm *me, const char *baseName)  
     132 {  
     133    WExtent wextent;  
     134   
     135    BUIT_LOG("FORMS EVT: Update Theme Started for %s", baseName);  
     136   
     137    if (!me->piThemeFile)  
     138       return;  
     139   
     140    if (me->piTitle) {  
     141       IWIDGET_SetProperties(me->piTitle, me->piThemeFile, baseName, "Title""Properties"0);  
     142       IWIDGET_GetPreferredExtent(me->piTitle, &wextent);  
     143       wextent.width = me->rcContainer.dx;  
     144       IWIDGET_SetExtent(me->piTitle, &wextent);  
     145    }  
     146   
     147    if (me->piSoftkeys) {  
     148       IWIDGET_SetProperties(me->piSoftkeys, me->piThemeFile, baseName, "Softkeys""Properties"0);  
     149       IWIDGET_GetPreferredExtent(me->piSoftkeys, &wextent);  
     150       wextent.width = me->rcContainer.dx;  
     151       IWIDGET_SetExtent(me->piSoftkeys, &wextent);  
     152    }  
     153   
     154    if (me->piBackground) {  
     155       IWIDGET_SetProperties(me->piBackground, me->piThemeFile, baseName, "Background""Properties"0);  
     156    }  
     157   
     158    // Update client area since sizes may have changed  
     159    RootForm_UpdateClientArea(me);  
     160   
     161    BUIT_LOG("FORMS EVT: Update Theme Finished for %s", baseName);  
     162 }  
     163   
     164 // updates the rootform with the background image, softkey and   
     165 // title text of the TOS form.  
     166 static void RootForm_Update(RootForm *me, uint32 dwItemMask, IForm* piForm)  
     167 {  
     168    boolean bPopup = 0;  
     169   
     170    // get form's popup flag  
     171    bPopup = IFORM_GetIsPopup(piForm);  
     172   
     173    // if the form's widget has changed, update the scroll model  
     174    // for the scroll indicator in the softkey widget  
     175    if (dwItemMask & FORMITEM_WIDGET) {  
     176         
     177       IWidget *piWidget = NULL;  
     178       // get form's widget  
     179       IFORM_GetWidget(piForm, WID_FORM, &piWidget);  
     180   
     181       // update the widget and the scroll model  
     182       if (piWidget) {  
     183   
     184          // if the active widget has been changed underneath us...  
     185            
     186          if (me->piActiveWidget && piWidget != me->piActiveWidget) {  
     187             // this block will only be executed when the form widget is changed  
     188             // by the application logic while the form is active  
     189             WidgetPos pos;  
     190             WExtent we;  
     191      
     192             IWIDGET_MoveFocus(FORM_WIDGET(me), (IWidget*)WIDGET_FOCUS_NONE);  
     193      
     194             IWIDGET_GetExtent(me->piActiveWidget, &we);  
     195             IWIDGET_SetExtent(piWidget, &we);  
     196      
     197             // remove the previously active widget from the root container  
     198             if (AEE_SUCCESS == IROOTCONTAINER_GetPos(me->piContainer, me->piActiveWidget, &pos)) {  
     199                IROOTCONTAINER_Remove(me->piContainer, me->piActiveWidget);  
     200             }  
     201               
     202             // add the new widget to the root container  
     203             IROOTCONTAINER_Insert(me->piContainer, piWidget, WIDGET_ZTOPMOST, &pos);  
     204             // and remember it fondly  
     205             RELEASEIF(me->piActiveWidget);  
     206             me->piActiveWidget = piWidget;  
     207             ADDREFIF(piWidget);  
     208   
     209             // set focus to the new widget  
     210             IWIDGET_MoveFocus(FORM_WIDGET(me), piWidget);  
     211            
     212          } else if (!me->piActiveWidget) {  
     213             me->piActiveWidget = piWidget;  
     214             ADDREFIF(piWidget);  
     215          }  
     216   
     217       }  
     218   
     219       RELEASEIF(piWidget);  
     220    }  
     221   
     222   
     223    // if the form's background image has changed...  
     224    // if form is a popup, then retain the background image   
     225    // from the previous form  
     226    if (dwItemMask & FORMITEM_BACKGROUND && me->piBackground && !bPopup) {        
     227       IImage *pii = NULL;  
     228         
     229       // Try to grab the image from the new form.    
     230       IFORM_GetBGImage(piForm, &pii);  
     231   
     232       // If non-existent, try defaulting to the root form  
     233       if (!pii) IFORM_GetBGImage(ROOTFORM_TO_IFORM(me), &pii);  
     234         
     235       // Apply the result (NULL or otherwise) to our background widget  
     236       IWIDGET_SetImage(me->piBackground, pii);  
     237       RELEASEIF(pii);  
     238    }  
     239      
     240    // if the form's title text has changed...  retain previous title  
     241    // if we are a popup   
     242   
     243    if ((dwItemMask & FORMITEM_TITLE) && me->piTitle && !bPopup) {  
     244       // Release image. Text is owned by form  
     245       RELEASEIF(me->titleInfo.piImage);  
     246       IFORM_GetTextPtr(piForm, FID_TITLE, &me->titleInfo.pwText);  
     247       IFORM_GetTitleImage(piForm, &me->titleInfo.piImage);  
     248   
     249       // Set title info  
     250       IWIDGET_SetImageStaticInfo(me->piTitle, &me->titleInfo, 0);  
     251    }  
     252   
     253    // if the form's softkey text has changed...  
     254    if ((dwItemMask & FORMITEM_SOFTKEY) && me->piSoftkeys) {  
     255   
     256       IForm* piTopForm = IROOTFORM_GetTopForm(ROOTFORM_TO_IROOTFORM(me));  
     257   
     258       AECHAR *pwsz = NULL;  
     259       IWidget *piKey = NULL;  
     260   
     261       if (piTopForm == piForm) {  
     262          // set softkey 1 text  
     263          IFORM_GetTextPtr(piForm, FID_SOFTKEY1, &pwsz);  
     264          if (AEE_SUCCESS == IWIDGET_GetSoftkey(me->piSoftkeys, PROP_SOFTKEY1, &piKey)) {  
     265             IWIDGET_SetText(piKey, pwsz, 0);  
     266          }  
     267          RELEASEIF(piKey);  
     268      
     269          // set softkey 2 text  
     270          IFORM_GetTextPtr(piForm, FID_SOFTKEY2, &pwsz);  
     271          if (AEE_SUCCESS == IWIDGET_GetSoftkey(me->piSoftkeys, PROP_SOFTKEY2, &piKey)) {  
     272             IWIDGET_SetText(piKey, pwsz, 0);  
     273          }  
     274       }  
     275       RELEASEIF(piKey);  
     276    }  
     277   
     278    if ((dwItemMask & FORMITEM_THEME_BASENAME)) {  
     279       char *baseName = 0;  
     280   
     281       IFORM_GetThemeBaseName(piForm, &baseName);  
     282       RootForm_UpdateTheme(me, baseName);  
     283    }  
     284   
     285 }  
     286   
     287 static boolean RootForm_ReplaceWidget(RootForm *me, IWidget **piw, IWidget *piwNew, IWidget *piwBefore)  
     288 {  
     289    int        result = AEE_SUCCESS;  
     290    WidgetPos  pos;  
     291   
     292    if (*piw) {  
     293       (void) IROOTCONTAINER_GetPos(me->piContainer, *piw, &pos);  
     294       (void) IROOTCONTAINER_Remove(me->piContainer, *piw);  
     295       IWIDGET_Release(*piw);  
     296    }  
     297   
     298    if (piwNew) {  
     299       result = IROOTCONTAINER_Insert(me->piContainer, piwNew, piwBefore, &pos);  
     300         
     301       if (result == AEE_SUCCESS) {  
     302          IWIDGET_AddRef(piwNew);  
     303       } else {  
     304          piwNew = NULL;  
     305       }  
     306    }  
     307   
     308    *piw = piwNew;  
     309   
     310    // Do an update since extents may have changed  
     311    RootForm_UpdateClientArea(me);  
     312   
     313    return (AEE_SUCCESS == result);  
     314 }  
     315   
     316 static int RootForm_SetThemeName(RootForm *me, const char *themeFile)  
     317 {  
     318    if (!me->piThemeFile)  
     319       return EBADSTATE;  
     320      
     321    FREEIF(me->themeFile);  
     322    me->themeFile = STRDUP(themeFile);  
     323      
     324    IRESFILE_Close(me->piThemeFile);  
     325    if (themeFile)  
     326       return IRESFILE_Open(me->piThemeFile, themeFile);  
     327    else  
     328       return AEE_SUCCESS;  
     329 }  
     330   
     331 static int RootForm_SetDisplay(RootForm *me, IDisplay *piDisplay)  
     332 {  
     333    int nErr = AEE_SUCCESS;  
     334    IDisplayCanvas *piCanvas = 0;  
     335   
     336    nErr = ISHELL_CreateInstance(FORM_SHELL(me), AEECLSID_DISPLAYCANVAS, (void **)&piCanvas);  
     337         
     338    if (!nErr) {  
     339       WExtent extent;  
     340       WidgetPos pos;  
     341         
     342   
     343       IDISPLAY_SetClipRect(piDisplay, NULL); // reset the clipping rectangle  
     344       IDISPLAY_GetClipRect(piDisplay, &me->rcContainer);  
     345       SETAEERECT(&me->rcClient, 00, me->rcContainer.dx, me->rcContainer.dy);  
     346   
     347       IDISPLAYCANVAS_SetDisplay(piCanvas, piDisplay);  
     348       IROOTCONTAINER_SetCanvas(me->piContainer, (ICanvas *)piCanvas, &me->rcContainer);  
     349   
     350       if (me->piTitle) {  
     351          // Set extent, title is already positioned at 0, 0  
     352          IWIDGET_GetExtent(me->piTitle, &extent);  
     353          extent.width = me->rcContainer.dx;  
     354          IWIDGET_SetExtent(me->piTitle, &extent);  
     355       }  
     356   
     357       if (me->piBackground) {  
     358          // Set extent, background is already positioned at 0, 0  
     359          extent.width = me->rcContainer.dx;  
     360          extent.height = me->rcContainer.dy;  
     361          IWIDGET_SetExtent(me->piBackground, &extent);  
     362       }  
     363   
     364       if (me->piSoftkeys) {  
     365          // Set extent  
     366          IWIDGET_GetExtent(me->piSoftkeys, &extent);  
     367          extent.width = me->rcContainer.dx;  
     368          IWIDGET_SetExtent(me->piSoftkeys, &extent);  
     369          // And position at bottom of screen  
     370          IROOTCONTAINER_GetPos(me->piContainer, me->piSoftkeys, &pos);  
     371          pos.y = me->rcContainer.dy - extent.height;  
     372          IROOTCONTAINER_SetPos(me->piContainer, WIDGET_ZNORMAL, me->piSoftkeys, &pos);  
     373       }  
     374    }  
     375   
     376    RELEASEIF(piCanvas);  
     377   
     378    return nErr;  
     379 }  
     380   
     381   
     382 static void RootForm_ApplyTheme(RootForm *me)  
     383 {  
     384    int nrForms, i;  
     385   
     386    if (!me->piThemeFile)   
     387       return;  
     388      
     389    nrForms = IVECTORMODEL_Size(me->piForms);  
     390    for (i = 0; i < nrForms; i++) {  
     391       IForm *piForm;  
     392       char* pTheme = 0;  
     393       IVECTORMODEL_GetAt(me->piForms, i, (void **)&piForm);  
     394         
     395       IFORM_GetThemeBaseName(ROOTFORM_TO_IFORM(me), &pTheme);  
     396       pTheme = (pTheme) ? pTheme : "(None)";  
     397         
     398       BUIT_LOG("FORMS EVT: Apply Theme Started for %s", pTheme);  
     399         
     400       IFORM_ApplyTheme(piForm);  
     401         
     402       BUIT_LOG("FORMS EVT: Apply Theme Finished for %s", pTheme);  
     403    }  
     404   
     405    if (nrForms == 0) {  
     406       char *baseName = 0;  
     407         
     408       IFORM_GetThemeBaseName(ROOTFORM_TO_IFORM(me), &baseName);  
     409 #ifdef FEATURE_MOT_BREW  
     410       if (baseName != NULL) {  
     411           RootForm_UpdateTheme(me, baseName);  
     412       }  
     413 #else  
     414       RootForm_UpdateTheme(me, baseName);  
     415 #endif /*FEATURE_MOT_BREW*/  
     416    }  
     417 }  
     418   
     419 boolean RootForm_HandleEvent(IRootForm *po, AEEEvent evt, uint16 wParam, uint32 dwParam)  
     420 {  
     421    DECL(RootForm);  
     422   
     423    if (FORM_WIDGET(me)  
     424       && IWIDGET_HandleEvent(FORM_WIDGET(me), evt, wParam, dwParam))  
     425       return TRUE;  
     426   
     427    if (evt == EVT_WDG_GETPROPERTY) {  
     428       switch(wParam) {  
     429       case FID_THEME_FNAME:  
     430          *(const char **)dwParam = me->themeFile;  
     431          return TRUE;  
     432   
     433       case FID_THEME_FILE:  
     434          *(IResFile **)dwParam = me->piThemeFile;  
     435          ADDREFIF(me->piThemeFile);  
     436          return TRUE;  
     437   
     438       case WID_TITLE:  
     439          *(IWidget **)dwParam = me->piTitle;  
     440          ADDREFIF(me->piTitle);  
     441          return TRUE;  
     442   
     443       case WID_SOFTKEYS:  
     444          *(IWidget **)dwParam = me->piSoftkeys;  
     445          ADDREFIF(me->piSoftkeys);  
     446          return TRUE;  
     447   
     448       case WID_BACKGROUND:  
     449          *(IWidget **)dwParam = me->piBackground;  
     450          ADDREFIF(me->piBackground);  
     451          return TRUE;  
     452   
     453       case WID_FORM:  
     454          IROOTCONTAINER_QueryInterface(me->piContainer, AEEIID_WIDGET, (void **)dwParam);  
     455          return TRUE;  
     456   
     457       case WID_CONTAINER:  
     458          *(IContainer **)dwParam = IROOTCONTAINER_TO_ICONTAINER(me->piContainer);  
     459          ADDREFIF(me->piContainer);  
     460          return TRUE;  
     461   
     462       default:  
     463          // Fall back on formbase  
     464          return Form_HandleEvent(ROOTFORM_TO_IFORM(me), evt, wParam, dwParam);  
     465       }  
     466   
     467    } else if (evt == EVT_WDG_SETPROPERTY) {  
     468       IForm *piForm = 0;  
     469   
     470       switch(wParam) {  
     471       case FID_ACTIVE:  
     472          piForm = IROOTFORM_GetTopForm(po);  
     473          if (piForm) {  
     474             // Activate or de-activate the top form  
     475             IFORM_SetProperty(piForm, FID_ACTIVE, dwParam);  
     476          }  
     477          // and invalidate root container on activation  
     478          if ((boolean)dwParam) {  
     479             IROOTCONTAINER_Invalidate(me->piContainer, 000);  
     480          }  
     481          return TRUE;  
     482   
     483       case FID_THEME:  
     484          RootForm_ApplyTheme(me);  
     485          return TRUE;  
     486   
     487       case FID_THEME_FNAME:  
     488          if (AEE_SUCCESS == RootForm_SetThemeName(me, (const char *)dwParam)) {  
     489             RootForm_ApplyTheme(me);  
     490             return TRUE;  
     491          }  
     492          return FALSE;  
     493   
     494       case FID_BACKGROUND:  
     495          // If we have a background widget, set the image into it  
     496          if (me->piBackground) {  
     497             IWIDGET_SetFormImage(me->piBackground, FORM_SHELL(me), (FormRes *)dwParam);  
     498          }  
     499          // Also load the image into our internal form, which will hold it as a default for other forms  
     500          return Form_HandleEvent(ROOTFORM_TO_IFORM(me), evt, wParam, dwParam);  
     501   
     502       case FID_DISPLAY:  
     503          return AEE_SUCCESS == RootForm_SetDisplay(me, (IDisplay *)dwParam);  
     504   
     505       case FID_WPROPS: {  
     506          WPropDesc *pdesc = (WPropDesc *)dwParam;  
     507          WResPropDesc wd;  
     508                     
     509          wd.piResFile = me->piThemeFile;  
     510          if (pdesc) {  
     511             wd.args = pdesc->args;  
     512             wd.piWidget = pdesc->piWidget;  
     513          }  
     514          return IWIDGET_SetProperty(pdesc->piWidget, PROP_APPLYWPROPS, (uint32)&wd);  
     515       }  
     516   
     517       case WID_TITLE:  
     518          return RootForm_ReplaceWidget(me, &me->piTitle, (IWidget *)dwParam, WIDGET_ZNORMAL);  
     519   
     520       case WID_SOFTKEYS:  
     521          return RootForm_ReplaceWidget(me, &me->piSoftkeys, (IWidget *)dwParam, WIDGET_ZNORMAL);  
     522   
     523       case WID_BACKGROUND:  
     524          return RootForm_ReplaceWidget(me, &me->piBackground, (IWidget *)dwParam, WIDGET_ZBOTTOMMOST);  
     525   
     526       default:  
     527          // Fall back on formbase  
     528          return Form_HandleEvent(ROOTFORM_TO_IFORM(me), evt, wParam, dwParam);  
     529       }  
     530    }  
     531   
     532    // Non get/set property events are sent on to the topmost form  
     533    {  
     534       IForm *piForm = IROOTFORM_GetTopForm(po);  
     535       if (!piForm)  
     536          return FALSE;  
     537       else  
     538          return IFORM_HandleEvent(piForm, evt, wParam, dwParam);  
     539    }    
     540 }  
     541   
     542   
     543 static void RootForm_UpdateActiveListenerCB(RootForm *me, FormEvent *pEvent)  
     544 {  
     545    if (pEvent->base.evCode == EVT_MDL_FORM_CHANGE) {  
     546       RootForm_Update(me, pEvent->dwItemMask, pEvent->piForm);  
     547    }  
     548 }  
     549   
     550 static void RootForm_UpdateTopmostNonPopupListenerCB(RootForm *me, FormEvent *pEvent)  
     551 {  
     552    uint32 dwItemMask = pEvent->dwItemMask & (FORMITEM_BACKGROUND | FORMITEM_TITLE | FORMITEM_SOFTKEY);  
     553   
     554    if (pEvent->base.evCode == EVT_MDL_FORM_CHANGE && dwItemMask) {  
     555       RootForm_Update(me, dwItemMask, pEvent->piForm);  
     556    }  
     557 }  
     558   
     559 static void RootForm_ShowFormWidget(IRootForm *po, IForm *piForm, boolean bShow, boolean bFocus)  
     560 {  
     561    DECL(RootForm);  
     562    WidgetPos pos;  
     563    IWidget *piWidget;  
     564   
     565    if (!piForm)  
     566       return;  
     567   
     568    IFORM_GetWidget(piForm, WID_FORM, &piWidget);  
     569      
     570    if (!piWidget)  
     571       return;  
     572   
     573    // Set visibility   
     574    IROOTCONTAINER_GetPos(me->piContainer, piWidget, &pos);  
     575    pos.bVisible = bShow;  
     576    IROOTCONTAINER_SetPos(me->piContainer, piWidget, WIDGET_ZNORMAL, &pos);  
     577   
     578    // and set focus to the widget  
     579    if (bShow && bFocus) {  
     580       IWIDGET_MoveFocus(FORM_WIDGET(me), piWidget);  
     581    } else {  
     582       IWIDGET_MoveFocus(FORM_WIDGET(me), WIDGET_FOCUS_NONE);  
     583    }  
     584      
     585    IWIDGET_Release(piWidget);  
     586 }  
     587   
     588   
     589 /** Activates a given form.  Previous form should have been 
     590  deactivated before this is called with bActivate set 
     591  */  
     592 static void RootForm_ActivateForm(IRootForm *po, IForm *piForm, boolean bActivate)  
     593 {  
     594    DECL(RootForm);  
     595   
     596    if (!piForm)  
     597       return;  
     598   
     599    if (bActivate) {  
     600       // Undo the currently known active widget  
     601       RELEASEIF(me->piActiveWidget);  
     602       IFORM_GetWidget(piForm, WID_FORM, &me->piActiveWidget);  
     603       // Then go update all the items except the forms widget as this is not the   
     604       // form updating its own widget. Need to update first since theme information  
     605       // affect client area which affects form activation  
     606       RootForm_Update(me, FORMITEM_ALL & ~FORMITEM_WIDGET, piForm);  
     607       // then activate  
     608       IFORM_Activate(piForm);  
     609    } else {  
     610       IFORM_Deactivate(piForm);  
     611    }  
     612 }  
     613   
     614 static int RootForm_GetFormIndex(RootForm *me, IForm **ppiForm)   
     615 {  
     616    IForm *piForm;  
     617    int nrForms;  
     618   
     619    nrForms = IVECTORMODEL_Size(me->piForms);  
     620   
     621    if (nrForms > 0) {  
     622   
     623       if (*ppiForm == FORM_LAST || *ppiForm == FORM_DEFAULT) {  
     624   
     625          IVECTORMODEL_GetAt(me->piForms, nrForms - 1, (void **)ppiForm);  
     626          return nrForms - 1;  
     627   
     628       } else if (*ppiForm == FORM_FIRST) {  
     629   
     630          IVECTORMODEL_GetAt(me->piForms, 0, (void **)ppiForm);  
     631          return 0;  
     632   
     633       } else {  
     634   
     635          int i;  
     636          for (i = 0; i < nrForms; i++) {  
     637             IVECTORMODEL_GetAt(me->piForms, i, (void **)&piForm);  
     638             if (piForm == *ppiForm)  
     639                return i;  
     640          }  
     641   
     642       }  
     643    }  
     644   
     645    return -1;  
     646 }  
     647   
     648 static __inline int RootForm_GetFormInsertionIndex(RootForm *me, IForm **ppiForm)  
     649 {  
     650    int delta;  
     651   
     652    if (*ppiForm == FORM_FIRST)  
     653       return 0;  
     654   
     655    if (*ppiForm == FORM_LAST || *ppiForm == FORM_DEFAULT) {  
     656       delta = 1;  
     657    } else {  
     658       delta = 0;  
     659    }  
     660   
     661    return RootForm_GetFormIndex(me, ppiForm) + delta;  
     662 }  
     663   
     664 static void RootForm_StackChange(IRootForm *po)  
     665 {  
     666    DECL(RootForm);  
     667    IForm* piTopForm = IROOTFORM_GetTopForm(po);  
     668      
     669    LISTENER_Cancel(&me->mlFormActive);  
     670    LISTENER_Cancel(&me->mlFormTopmostNonPopup);  
     671   
     672    // If there are still forms on the stack, then we need to set up several things:  
     673    //   1. The topmost form is the active form  
     674    //   2. All other forms are not active  
     675    //   3. The topmost form is being listened to via mlFormActive  
     676    //   4. The topmost non-popup form is being listened to via mlFormTopmostNonPopup  
     677    //   5. The topmost non-popup form and all popup forms on top of it are shown  
     678    //   6. Forms below the topmost non-popup form are now shown  
     679    if (piTopForm)  
     680    {  
     681       boolean bFoundTopmostNonPopup = FALSE;  
     682       IModel* piModel = NULL;  
     683       IForm*  pif;  
     684   
     685       // Logging stack change begin  
     686       BUIT_LOG("FORMS EVT: Stack Change Starting..."1);  
     687   
     688       // Need to deal with the non-active forms first, then the active form  
     689       for (pif = piTopForm; pif; pif = IROOTFORM_GetForm(po, pif, FALSE, FALSE))  
     690       {  
     691          boolean bPopup;  
     692   
     693          bPopup = IFORM_GetIsPopup(pif);  
     694          IFORM_GetFormModel(pif, &piModel);  
     695          if (piModel)  
     696          {  
     697             if (pif != piTopForm)  
     698             {  
     699                RootForm_ShowFormWidget(po, pif, (boolean)(bFoundTopmostNonPopup? FALSE : TRUE), FALSE);  
     700                if (IFORM_IsActive(pif))  
     701                {  
     702                   RootForm_ActivateForm(po, pif, FALSE);  
     703                }  
     704             }  
     705   
     706             if (!bPopup && !bFoundTopmostNonPopup)  
     707             {  
     708                IMODEL_AddListenerEx(piModel, &me->mlFormTopmostNonPopup, (PFNLISTENER)RootForm_UpdateTopmostNonPopupListenerCB, me);  
     709                if (pif != piTopForm)  
     710                   // Only update if not the topmost form since the  
     711                   // Activate below applies theme again The topmost  
     712                   // non-popup (but not the top!) influences the  
     713                   // background, title ans associated themes  
     714                   RootForm_Update(me, FORMITEM_BACKGROUND | FORMITEM_TITLE | FORMITEM_THEME_BASENAME, pif);  
     715                bFoundTopmostNonPopup = TRUE;  
     716             }  
     717          }  
     718          RELEASEIF(piModel);  
     719       }  
     720   
     721       RootForm_ActivateForm(po, piTopForm, TRUE);  
     722       RootForm_ShowFormWidget(po, piTopForm, TRUE, TRUE);  
     723       IFORM_GetFormModel(piTopForm, &piModel);  
     724       if (piModel)  
     725          IMODEL_AddListenerEx(piModel, &me->mlFormActive, (PFNLISTENER)RootForm_UpdateActiveListenerCB, me);  
     726       RELEASEIF(piModel);  
     727         
     728       // Log that the form is about to be activated - all theme stuff has happened by now)  
     729       BUIT_LOG("FORMS EVT: Stack Change Finished"1);  
     730   
     731    }  
     732   
     733     // Notify change in stack  
     734    Form_Notify(ROOTFORM_TO_FORM(me), FORMITEM_STACK);  
     735 }  
     736   
     737   
     738 int RootForm_InsertForm(IRootForm *po, IForm *piForm, IForm *pifBefore)  
     739 {  
     740    DECL(RootForm);  
     741    IWidget *piWidget = 0;  
     742    IWidget *piwBefore = 0;  
     743    IForm *pifCurrent;  
     744    int nrForms, formIndex, nErr;  
     745   
     746    if (!piForm)  
     747       return EBADPARM;  
     748   
     749    // Make sure we can insert, get the index we want to insert at  
     750    formIndex = RootForm_GetFormInsertionIndex(me, &pifBefore);  
     751   
     752    if (formIndex < 0)  
     753       return EBADPARM;  
     754   
     755    nrForms = IVECTORMODEL_Size(me->piForms);  
     756    pifCurrent = IROOTFORM_GetTopForm(po);  
     757   
     758    // Get widget to insert  
     759    IFORM_GetWidget(piForm, WID_FORM, &piWidget);  
     760   
     761    // Get widget insertion point.   
     762    if (formIndex == nrForms || !nrForms) {  
     763       piwBefore = WIDGET_ZTOPMOST;  
     764    } else if (pifBefore == FORM_FIRST) {  
     765       if (me->piBackground != NULL) {  
     766        
     767          // If we have a background widget, try to insert the form's widget  
     768          // above the background widget  
     769          piwBefore = IROOTCONTAINER_GetWidget(me->piContainer, me->piBackground, TRUE, FALSE);  
     770          if (piwBefore) {  
     771             // Add a reference, so it can be released below.  
     772             IWIDGET_AddRef(piwBefore);  
     773          }  
     774       }   
     775   
     776       if (!piwBefore) {  
     777          // No background widget, insert the form's widget at the bottom.  
     778          piwBefore = WIDGET_ZBOTTOMMOST;  
     779       }  
     780   
     781    } else {  
     782       IFORM_GetWidget(pifBefore, WID_FORM, &piwBefore);  
     783    }  
     784   
     785    // Make sure we have space for the new form  
     786    nErr = IVECTORMODEL_EnsureCapacity(me->piForms, MAX(FORMSTACK_MIN, nrForms + 1), FORMSTACK_GROW);  
     787   
     788    // Now insert  
     789    if (!nErr && piWidget && piwBefore) {  
     790       WidgetPos pos;  
     791   
     792       // Not really needed here since Activate does this to, but since  
     793       // we need to give a position on insert we may as well do it  
     794       // right  
     795       pos.x = me->rcClient.x;   
     796       pos.y = me->rcClient.y;  
     797       pos.bVisible = (piwBefore == WIDGET_ZTOPMOST);  
     798         
     799       // Insert widget into widget stack  
     800       nErr = IROOTCONTAINER_Insert(me->piContainer, piWidget, piwBefore, &pos);  
     801    }  
     802   
     803    if (!nErr) {  
     804       char* pTheme = 0;  
     805   
     806       // Add form to formstack  
     807       IVECTORMODEL_InsertAt(me->piForms, formIndex, piForm);  
     808       IFORM_AddRef(piForm);  
     809   
     810       // Set rootform  
     811       IFORM_SetProperty(piForm, FID_ROOT, (uint32)po);  
     812   
     813       // Log info  
     814       IFORM_GetThemeBaseName(ROOTFORM_TO_IFORM(me), &pTheme);  
     815       pTheme = (pTheme) ? pTheme : "(None)";  
     816   
     817       BUIT_LOG("FORMS EVT: Insert Set Theme Started for %s", pTheme);  
     818   
     819       // Set theme on new form  
     820       IFORM_ApplyTheme(piForm);  
     821   
     822       BUIT_LOG("FORMS EVT: Insert Set Theme Finished for %s", pTheme);  
     823       //RootForm_Update(me, FORMITEM_THEME, piForm);  
     824   
     825       RootForm_StackChange(po);  
     826   
     827 }  
     828   
     829    RELEASEIF(piWidget);  
     830    if (piwBefore != WIDGET_ZTOPMOST && piwBefore != WIDGET_ZBOTTOMMOST)  
     831       RELEASEIF(piwBefore);  
     832    return nErr;  
     833 }  
     834   
     835 int RootForm_RemoveForm(IRootForm *po, IForm *piForm)  
     836 {  
     837    DECL(RootForm);  
     838    IWidget *piWidget = 0;  
     839    IForm *piF = 0;  
     840    int nrForms = 0;  
     841    int formIndex;  
     842    boolean bOnlyPopups = 1;  
     843   
     844    if (me->piForms)  
     845       nrForms = IVECTORMODEL_Size(me->piForms);  
     846   
     847    if (piForm == FORM_ALL) {  
     848       while (nrForms > 0) {  
     849          IROOTFORM_RemoveForm(po, FORM_LAST);  
     850          nrForms = IVECTORMODEL_Size(me->piForms);  
     851       }  
     852   
     853    } else {  
     854       formIndex = RootForm_GetFormIndex(me, &piForm);  
     855         
     856       if (formIndex < 0)  
     857          return EBADPARM;  
     858         
     859       IFORM_GetWidget(piForm, WID_FORM, &piWidget);  
     860         
     861       if (piWidget) {  
     862          IROOTCONTAINER_Remove(me->piContainer, piWidget);  
     863       }  
     864         
     865       // Hide form widget  
     866       RootForm_ShowFormWidget(po, piForm, FALSE, FALSE);  
     867       // Deactivate form  
     868       RootForm_ActivateForm(po, piForm, FALSE);  
     869       // Tell it of rootform departure  
     870       IFORM_SetProperty(piForm, FID_ROOT, 0);  
     871       // Delete it from the stack  
     872       IVECTORMODEL_DeleteAt(me->piForms, formIndex);  
     873   
     874       RootForm_StackChange(po);  
     875   
     876       RELEASEIF(piWidget);  
     877   
     878       // Now many forms do we now have?  
     879       nrForms = IVECTORMODEL_Size(me->piForms);  
     880    }  
     881   
     882    // Cycle through remaining forms to determine type  
     883    for (piF = IROOTFORM_GetTopForm(po); piF && bOnlyPopups; piF = IROOTFORM_GetForm(po, piF, FALSE, FALSE))  
     884    {  
     885       bOnlyPopups &= IFORM_GetIsPopup(piF);  
     886    }    
     887   
     888   
     889    if ((0 == nrForms) || bOnlyPopups)  
     890    {  
     891       // If we don't have any more forms, or the only forms we do have are popups,   
     892       // ensure the title has been cleaned (the title memory is owned by the last full screen form,   
     893       // which may no longer exist).  
     894       if (me->piTitle) {  
     895          // Release image. Text is owned by form  
     896          RELEASEIF(me->titleInfo.piImage);  
     897          me->titleInfo.pwText = NULL;  
     898   
     899          // Set title info  
     900          IWIDGET_SetImageStaticInfo(me->piTitle, &me->titleInfo, 0);  
     901       }  
     902    }  
     903   
     904    if (0 == nrForms) {  
     905         
     906       // There are no more forms, ensure the softkey labels  
     907       // have been cleaned (the softkey memory is owned by the form, which may no   
     908       // longer exist).  
     909       if (me->piSoftkeys) {  
     910          IWidget *piKey = NULL;  
     911   
     912          (void) IWIDGET_GetSoftkey(me->piSoftkeys, PROP_SOFTKEY1, &piKey);  
     913          if (piKey) {  
     914             IWIDGET_SetText(piKey, NULL, 0);  
     915             IWIDGET_Release(piKey);  
     916             piKey = NULL;  
     917          }  
     918   
     919          (void) IWIDGET_GetSoftkey(me->piSoftkeys, PROP_SOFTKEY2, &piKey);  
     920          if (piKey) {  
     921             IWIDGET_SetText(piKey, NULL, 0);  
     922             IWIDGET_Release(piKey);  
     923             piKey = NULL;  
     924          }  
     925   
     926       }  
     927    } else {  
     928       RootForm_Update(me, FORMITEM_THEME_BASENAME, IROOTFORM_GetTopForm(po));  
     929    }  
     930   
     931    return AEE_SUCCESS;  
     932 }  
     933   
     934   
     935 void RootForm_GetClientRect(IRootForm *po, IXYContainer **ppo, AEERect *rc)  
     936 {  
     937    DECL(RootForm);  
     938   
     939    if (rc) {  
     940       *rc = me->rcClient;  
     941    }  
     942   
     943    if (ppo && me->piContainer) {  
     944       *ppo = IROOTCONTAINER_TO_IXYCONTAINER(me->piContainer);  
     945       IROOTCONTAINER_AddRef(me->piContainer);  
     946    }  
     947 }  
     948   
     949 IForm *RootForm_GetForm(IRootForm *po, IForm *pifRef, boolean bNext, boolean bWrap)  
     950 {  
     951    DECL(RootForm);  
     952    IForm *piForm = 0;  
     953    int nrForms, formIndex;  
     954      
     955    if (me->piForms == NULL)  
     956       return NULL;  
     957   
     958    nrForms = IVECTORMODEL_Size(me->piForms);  
     959   
     960    if (pifRef == NULL) {  
     961       formIndex = bNext ? 0 : nrForms - 1;  
     962       IVECTORMODEL_GetAt(me->piForms, formIndex, (void **)&piForm);  
     963       return piForm;  
     964    }  
     965   
     966    formIndex = RootForm_GetFormIndex(me, &pifRef);  
     967   
     968    if (formIndex < 0)  
     969       return NULL;  
     970   
     971    formIndex += bNext ? 1 : -1;  
     972    if (formIndex < 0) {  
     973       formIndex = bWrap ? nrForms - 1 : -1;  
     974    } else if (formIndex >= nrForms) {  
     975       formIndex = bWrap ? 0 : - 1;  
     976    }  
     977      
     978    if (formIndex < 0)  
     979       return NULL;  
     980   
     981    IVECTORMODEL_GetAt(me->piForms, formIndex, (void **)&piForm);  
     982    return piForm;  
     983 }  
     984   
     985 int RootForm_ResolveForm(IRootForm *po, char const *szFormUrl, IForm **ppiForm)  
     986 {  
     987    DECL(RootForm);  
     988    IWebUtil *piWebUtil = 0;  
     989    AEECLSID formClsId;  
     990    int result;  
     991    UrlParts parts;  
     992    char *path = 0;  
     993   
     994    if (!ppiForm || !szFormUrl)  
     995       return EBADPARM;  
     996   
     997    // Assume failure  
     998    *ppiForm = 0;  
     999   
    1000    // Parse the URL  
    1001    result = ISHELL_CreateInstance(FORM_SHELL(me), AEECLSID_WEBUTIL, (void **) &piWebUtil);  
    1002   
    1003    if (result == 0)   
    1004       result = IWEBUTIL_ParseUrl(piWebUtil, szFormUrl, &parts);  
    1005   
    1006       // Check the scheme  
    1007    if (result == 0  
    1008        && (!UP_HASSCHM(&parts) || STRNCMP(parts.cpcSchm,FORM_URL_SCHEME,sizeof(FORM_URL_SCHEME)-1)))  
    1009        result = ESCHEMENOTSUPPORTED;  
    1010   
    1011       // Do we have a path?  
    1012    if (result == 0  
    1013        && (!UP_HASPATH(&parts) || UP_PATHLEN(&parts) <= 0))  
    1014       result = ESCHEMENOTSUPPORTED;  
    1015   
    1016    // Extract the path (we need it to be NULL terminated)  
    1017    if (result == 0   
    1018        && 0 == (path = MALLOC(UP_PATHLEN(&parts)+1)))  
    1019       result = ENOMEMORY;  
    1020   
    1021    if (result == 0) {  
    1022       STRNCPY(path, parts.cpcHost, UP_PATHLEN(&parts)+1);  
    1023   
    1024       // Does a handler exist for this path, of type AEEIID_FORM?  
    1025       if (0 == (formClsId = ISHELL_GetHandler(FORM_SHELL(me), AEEIID_FORM, path)))  
    1026          // Nope...  
    1027          result = ESCHEMENOTSUPPORTED;  
    1028    }  
    1029   
    1030    if (result == 0)  
    1031       // Got the actual class id, lets create the form  
    1032       result = ISHELL_CreateInstance(FORM_SHELL(me), formClsId, (void **) ppiForm);  
    1033   
    1034    //  
    1035    // TODO: We could use IWEBUTIL_ParseFormFields() to parse parts.cpcSrch   
    1036    //       for known Form properties and apply them here...  
    1037   
    1038    RELEASEIF(piWebUtil);  
    1039    FREEIF(path);  
    1040   
    1041    return result;  
    1042 }  
    1043   
    1044 void RootForm_Dtor(RootForm *me)  
    1045 {  
    1046    IROOTFORM_RemoveForm(ROOTFORM_TO_IROOTFORM(me), FORM_ALL);  
    1047   
    1048    RELEASEIF(me->piTitle);  
    1049    RELEASEIF(me->piSoftkeys);  
    1050    RELEASEIF(me->piContainer);  
    1051    RELEASEIF(me->piBackground);  
    1052    RELEASEIF(me->titleInfo.piImage);  
    1053    RELEASEIF(me->piForms);  
    1054    RELEASEIF(me->piActiveWidget);  
    1055    RELEASEIF(me->piThemeFile);  
    1056    FREEIF(me->themeFile);  
    1057   
    1058    Form_Dtor(&me->base);    
    1059 }  
    1060   
    1061 uint32 RootForm_Release(IRootForm *po)  
    1062 {  
    1063    DECL(RootForm);  
    1064      
    1065    if (FORM_NREFS(me) == 1)  
    1066       RootForm_Dtor(me);  
    1067   
    1068    return Form_Release(IROOTFORM_TO_IFORM(po));  
    1069 }  
    1070   
    1071 int RootForm_QueryInterface(IRootForm *po, AEECLSID clsid, void **ppo)  
    1072 {  
    1073    if (clsid == AEEIID_ROOTFORM) {  
    1074       *ppo = po;  
    1075       Form_AddRef(IROOTFORM_TO_IFORM(po));  
    1076       return AEE_SUCCESS;  
    1077    }  
    1078   
    1079    return Form_QueryInterface(IROOTFORM_TO_IFORM(po), clsid, ppo);  
    1080 }  
    1081   
    1082 int RootForm_Construct(RootForm *me, AEEVTBL(IRootForm) *pvt, IModule *piModule, IShell *piShell)  
    1083 {  
    1084    int result;  
    1085    WExtent extent;  
    1086    WidgetPos pos;  
    1087    IDisplay *piDisplay = 0;  
    1088    ICanvas *piCanvas = 0;  
    1089   
    1090    Form_Ctor(&me->base, (AEEVTBL(IForm) *)pvt, piModule, piShell,   
    1091              (PFNHANDLER)RootForm_HandleEvent);  
    1092   
    1093    pos.x = 0;  
    1094    pos.y = 0;  
    1095    pos.bVisible = TRUE;  
    1096    SETWEXTENT(&extent, 00);  
    1097   
    1098    // Form overrides  
    1099    pvt->Release         = RootForm_Release;  
    1100    pvt->QueryInterface  = RootForm_QueryInterface;  
    1101    // RootForm definitions  
    1102    pvt->InsertForm      = RootForm_InsertForm;  
    1103    pvt->RemoveForm      = RootForm_RemoveForm;  
    1104    pvt->GetClientRect   = RootForm_GetClientRect;  
    1105    pvt->GetForm         = RootForm_GetForm;  
    1106    pvt->ResolveForm     = RootForm_ResolveForm;  
    1107   
    1108    result = ISHELL_CreateInstance(piShell, AEECLSID_VECTORMODEL, (void **)&me->piForms);  
    1109   
    1110    if (result == 0) {  
    1111       IVECTORMODEL_SetPfnFree(me->piForms, (PFNNOTIFY)RootForm_FreeFormEntry);  
    1112   
    1113       result = ISHELL_CreateInstance(piShell, AEECLSID_DISPLAY, (void **)&piDisplay);  
    1114    }  
    1115   
    1116    if (result == 0)  
    1117       result = ISHELL_CreateInstance(piShell, AEECLSID_ROOTCONTAINER, (void **)&me->piContainer);  
    1118   
    1119    if (result == 0)  
    1120       result = IROOTCONTAINER_QueryInterface(me->piContainer, AEEIID_WIDGET, (void **)&me->base.piWidget);  
    1121   
    1122    if (result == 0)  
    1123       result = ISHELL_CreateInstance(piShell, AEECLSID_RESFILE, (void **)&me->piThemeFile);  
    1124   
    1125    if (result == 0)  
    1126       result = ISHELL_CreateInstance(piShell, AEECLSID_IMAGEWIDGET, (void **)&me->piBackground);  
    1127   
    1128    if (result == 0) {  
    1129       IWIDGET_SetFlags(me->piBackground, IDF_ALIGN_RIGHT | IDF_ALIGN_BOTTOM);  
    1130   
    1131       // Insert, extent will be fixed up in SetDisplay below  
    1132       result = IROOTCONTAINER_Insert(me->piContainer, me->piBackground, WIDGET_ZBOTTOMMOST, &pos);  
    1133    }  
    1134   
    1135    if (result == 0)  
    1136       // Construct title  
    1137       result = ISHELL_CreateInstance(piShell, AEECLSID_IMAGESTATICWIDGET, (void **)&me->piTitle);  
    1138   
    1139    if (result == 0) {  
    1140       extent.height = 15;  
    1141       // Set title font to bold by default.  Apps and themes can override it.  
    1142       IWIDGET_SetFontClass(me->piTitle, AEECLSID_FONTSYSBOLD);  
    1143   
    1144       IWIDGET_SetShadowOffsetY(me->piTitle, 0);  
    1145       IWIDGET_SetBorderWidth(me->piTitle, 0);  
    1146       IWIDGET_SetExtent(me->piTitle, &extent);  
    1147       // Add to container  
    1148       result = IROOTCONTAINER_Insert(me->piContainer, me->piTitle, WIDGET_ZTOPMOST, &pos);  
    1149    }  
    1150   
    1151    if (result == 0)  
    1152       // Construct Softkeys  
    1153       result = ISHELL_CreateInstance(piShell, AEECLSID_SOFTKEYWIDGET, (void **)&me->piSoftkeys);  
    1154   
    1155    if (result == 0) {  
    1156       IWIDGET_SetShadowOffsetY(me->piSoftkeys, -1);  
    1157       IWIDGET_SetBorderWidth(me->piSoftkeys, 0);  
    1158       IWIDGET_SetExtent(me->piSoftkeys, &extent);  
    1159       IWIDGET_SetLeftPadding(me->piSoftkeys, 2);  
    1160       IWIDGET_SetRightPadding(me->piSoftkeys, 2);  
    1161   
    1162       // Insert at 0, 0. Correct positioning will happen in SetDisplay  
    1163       result = IROOTCONTAINER_Insert(me->piContainer, me->piSoftkeys, WIDGET_ZTOPMOST, &pos);  
    1164    }  
    1165   
    1166    if (result == 0)  
    1167       result = RootForm_SetDisplay(me, piDisplay);  
    1168   
    1169    if (result == 0) {     
    1170       char* pTheme = 0;  
    1171       IFORM_SetThemeBaseName(ROOTFORM_TO_IFORM(me), "Root");  
    1172   
    1173       IFORM_GetThemeBaseName(ROOTFORM_TO_IFORM(me), &pTheme);  
    1174       pTheme = (pTheme) ? pTheme : "(None)";  
    1175   
    1176       BUIT_LOG("FORMS EVT: Construct Set Theme Started for %s", pTheme);  
    1177   
    1178       IROOTFORM_SetThemeFileName(ROOTFORM_TO_IROOTFORM(me), "theme.bar");  
    1179   
    1180       BUIT_LOG("FORMS EVT: Construct Set Theme Finished for %s", pTheme);  
    1181   
    1182    } else {  
    1183       RootForm_Dtor(me);  
    1184    }  
    1185   
    1186    RELEASEIF(piDisplay);  
    1187    RELEASEIF(piCanvas);  
    1188      
    1189    return result;  
    1190 }  
    1191   
    1192   
    1193 int RootForm_New(IRootForm **ppo, IModule *piModule, IShell *piShell)  
    1194 {  
    1195    RootForm *me = MALLOCREC_VTBL(RootForm, IRootForm);  
    1196    int result;  
    1197   
    1198    *ppo = (IRootForm *)me;  
    1199   
    1200    if (!me)  
    1201       return ENOMEMORY;  
    1202   
    1203    result = RootForm_Construct(me, GETVTBL(me, IRootForm), piModule, piShell);  
    1204      
    1205    if (result != 0) {  
    1206       *ppo = NULL;  
    1207       FREE(me);  
    1208    }  
    1209      
    1210    return result;  
    1211 }  
    View Code
  • 相关阅读:
    例子:动能并不是特别强(2-3)后,下M5的同时,也是恢复期到期的前一天
    .NET 自带的动态代理+Expression 实现AOP
    自旋锁-SpinLock(.NET 4.0+)
    使用Nito.AsyncEx实现异步锁
    C# 两行代码实现 延迟加载的单例模式(线程安全)
    C++ 用于大型程序的工具
    C++ 模板与泛型编程
    C++ 面向对象编程
    C++ 重载操作符与转换
    C++ 复制控制
  • 原文地址:https://www.cnblogs.com/lemaden/p/10123427.html
Copyright © 2011-2022 走看看