From 41fa09724b2e5ab379ea9eeb06ad526058b6bfee Mon Sep 17 00:00:00 2001 From: "conrad%ingress.com" Date: Mon, 17 Apr 2000 12:19:56 +0000 Subject: [PATCH] First Checked In. git-svn-id: svn://10.0.0.236/trunk@66196 18797224-902f-48f8-a5cc-f745e15eee43 --- .../browser/powerplant/PP Browser.mcp | Bin 0 -> 251388 bytes .../precompiled header/BrowserHeaders.pch++ | 11 + .../precompiled header/BrowserHeaders.pch.h | 73 +++ .../BrowserHeadersDebug.pch++ | 11 + .../browser/powerplant/resources/Browser.ppob | Bin 0 -> 3805 bytes .../browser/powerplant/resources/Browser.rsrc | Bin 0 -> 3829 bytes .../powerplant/resources/cfmAlias.rsrc | Bin 0 -> 794 bytes .../powerplant/resources/cfmAliasDebug.rsrc | Bin 0 -> 824 bytes .../browser/powerplant/source/ApplIDs.h | 51 ++ .../browser/powerplant/source/CBrowserApp.cp | 383 +++++++++++ .../browser/powerplant/source/CBrowserApp.h | 82 +++ .../powerplant/source/CBrowserShell.cpp | 605 ++++++++++++++++++ .../browser/powerplant/source/CBrowserShell.h | 143 +++++ .../powerplant/source/CBrowserWindow.cp | 376 +++++++++++ .../powerplant/source/CBrowserWindow.h | 111 ++++ 15 files changed, 1846 insertions(+) create mode 100644 mozilla/embedding/browser/powerplant/PP Browser.mcp create mode 100755 mozilla/embedding/browser/powerplant/precompiled header/BrowserHeaders.pch++ create mode 100644 mozilla/embedding/browser/powerplant/precompiled header/BrowserHeaders.pch.h create mode 100644 mozilla/embedding/browser/powerplant/precompiled header/BrowserHeadersDebug.pch++ create mode 100644 mozilla/embedding/browser/powerplant/resources/Browser.ppob create mode 100644 mozilla/embedding/browser/powerplant/resources/Browser.rsrc create mode 100644 mozilla/embedding/browser/powerplant/resources/cfmAlias.rsrc create mode 100644 mozilla/embedding/browser/powerplant/resources/cfmAliasDebug.rsrc create mode 100644 mozilla/embedding/browser/powerplant/source/ApplIDs.h create mode 100644 mozilla/embedding/browser/powerplant/source/CBrowserApp.cp create mode 100644 mozilla/embedding/browser/powerplant/source/CBrowserApp.h create mode 100644 mozilla/embedding/browser/powerplant/source/CBrowserShell.cpp create mode 100644 mozilla/embedding/browser/powerplant/source/CBrowserShell.h create mode 100644 mozilla/embedding/browser/powerplant/source/CBrowserWindow.cp create mode 100644 mozilla/embedding/browser/powerplant/source/CBrowserWindow.h diff --git a/mozilla/embedding/browser/powerplant/PP Browser.mcp b/mozilla/embedding/browser/powerplant/PP Browser.mcp new file mode 100644 index 0000000000000000000000000000000000000000..0f9c7ffff6223bd024b39c5aa7882f37cfeba20f GIT binary patch literal 251388 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 rrLeL+YJc2= 0x2100 + // slightly larger but much faster generation of pch files + #pragma faster_pch_gen on + #endif + + + // Option for using PowerPlant namespace + #define PP_Uses_PowerPlant_Namespace 0 // off, don't use PowerPlant namespace + + // establish some essential PowerPlant macros: + #define PP_StdDialogs_Option PP_StdDialogs_ClassicOnly // use classic standard dialog implementation + + // include powerplant headers + #if wantDebugging + #include + #else + #include + #endif + + + #if wantDebugging + #define DEBUG 1 + #else + #undef DEBUG + #endif + + #include "DefinesMac.h" + #include "DefinesMozilla.h" + + + // Support for automatically naming the precompiled header file ... + #if __POWERPC__ + #if wantDebugging + #pragma precompile_target "BrowserHeadersDebug_pch" + #else + #pragma precompile_target "BrowserHeaders_pch" + #endif + #else + #error "target currently unsupported" + #endif + +#else + + // Load the precompiled header file + #if __POWERPC__ + #if wantDebugging + #include "BrowserHeadersDebug_pch" + #else + #include "BrowserHeaders_pch" + #endif + #else + #error "target currently unsupported" + #endif + + +#endif + +#endif // __BROWSERHEADERS_PCH_H__ diff --git a/mozilla/embedding/browser/powerplant/precompiled header/BrowserHeadersDebug.pch++ b/mozilla/embedding/browser/powerplant/precompiled header/BrowserHeadersDebug.pch++ new file mode 100644 index 00000000000..a03d8d7b28e --- /dev/null +++ b/mozilla/embedding/browser/powerplant/precompiled header/BrowserHeadersDebug.pch++ @@ -0,0 +1,11 @@ +//-------------------------------------------------------------------------------- +// +// BrowserHeadersDebug.pch++ +// +// Includes BrowserHeaders.pch.h, which generates or loads the precompiled header file +// Flags could be set here to control that compilation +// +//-------------------------------------------------------------------------------- + +#define wantDebugging 1 +#include "BrowserHeaders.pch.h" diff --git a/mozilla/embedding/browser/powerplant/resources/Browser.ppob b/mozilla/embedding/browser/powerplant/resources/Browser.ppob new file mode 100644 index 0000000000000000000000000000000000000000..57f1c5401d1a8659c900afe10d541a03dd8ac1f6 GIT binary patch literal 3805 zcmbtXO>7(25uPO}S{D5y2dbUAhVlFd(JBzAI04zY6xa>yZvG(-4mWCbzgUyvgmoPaZc){^n;?;Y(M#A(Xfd8 zz;Dhq$|r%oC9VDFZa;dl{TB}?@F_OhGKfz(;b*|<9+JRqoJ_m$}jTyqoV{F4<8peo# z5ee|efE3d@NE_QdVYuB;)Z11d5Q96(+dpE%f#Sck+>B+*?7ZyJJT|%LN#_n-gtf<6 zXQ*tufusgZsOd|RYS@<rs8T-3XEC>E+0@R~HOQgMyF?J)GlOQl|~ zSM0dIvus;0x_*n+iKJr&7)9td@7`2VQo-Gv>XbcEJOQQb@v8;{CzRloY|AKh^kzwR z3~8E{(<*tKY#x7j$(MoK^_w!lvL{rC3o!tv$4-o07`rh>F=)ne%$fORjzw1`6bos6 z{o8xFY10aG3y$g1l_U(=ayO)3BCKWCyGBUrp^6^hv|d&*hr@aCNKM+Zi4eex6UoXU z-sld^Ap4jT^AdZWWp$$c^cal!RQr|6RwY7uIVQcq8LG@wLi$n>lKl6Si9>O;W!kMF z_;Hwhb%xGx7BlgRi|2(XJ54(kx}VE%Ijm!IZH!K6%KuR0tW_r@S;?yt(v$`3A{%cx z-E14nWgQ9rGCeYY_%YP+wd}iS^JF>ZjP@ej&P$NvPGE)Bl8nKg31E*>Jw~GgFg~$- zQnvylO~BjipYa64>jrK9RvM?V1ViI0@CS?-Bl{}z327dJ$QVibpJoj9RT_g(s_(;i zEm_YqW8}+Rp>2vSnPk^AeBHyU4cGh=%9Fg}yIfP?C1S#NyU4caIG$ysNxgZMu5UtG z_&%i38j`Tt7QC{j`(|=tm0{CP=#!m-C1bv-d!g&o+nm(VWY{9* zsW+%pN4Zk%EKmAwFTfQOS1UY5)#^N*2Sh66|KDnrJxdwW^=$0Wh@*3$$H%iznbR-e z1M75~Bg=%H`>CxjL9fjpnz=%UH71n}8iw>sx?^>MV?Q}*7F*ULR1fmeiEUOH0U2d3 zaJ_@g8shXV@cJxGGK2XP#T%w1irt(MPjNBjGo<~8c0}ON<3gHY{jIF+%CjOU`CV$8+P;eZS?MiQ~SU8 zDPJcCv>Q}-3r#q9qrQylnk8p$a-xdozs@x~Cj5S5ZhC$J^C#RL!BPK4IhevuBUQ`1 zfcbE*8A7g&*Xq?HFriwmKUcwx`Fy9j1f#Uom*8~ZMYN)(ocisnhWCexU!@;l=GKbn z6>dzlS;eoYwJ}czAyd}}N*B5q`i;_Ar9UG=3bQH4JmAp?S%B zWC+rpSNsa@E7GnjzE2-P=d|Ki=`%zr^1})`H_E6kuTZ;&cB~_2Tqhhx-y1Q}9|!UD z5O>0IME#06>2%SGp%YddH+za3OF@XTbdY7zOex}cIVRt%!%3^WZ%%KPFW1Cn{69mF zEs{LlKEN!fmT$_^ZMXF>{Eqb9Hk=%hU9nU&aQV2s|LHOLvl!h!%7w9iF=_qIe*st9 BCsP0b literal 0 HcmV?d00001 diff --git a/mozilla/embedding/browser/powerplant/resources/Browser.rsrc b/mozilla/embedding/browser/powerplant/resources/Browser.rsrc new file mode 100644 index 0000000000000000000000000000000000000000..aa1065625240b6d18bf75df10a1c6f91b64b1ba9 GIT binary patch literal 3829 zcmb7HO>7)j9slpH?b@-ESjCM)W7OxWfqd=~wM|o0Y8*SzP&+ZUsTENb-p;(;9XvB{ z^4?p2DM&^_CE`GPtKbyDC6;=ugal^`0SO6l>@`w{u`n({OE5P&CtW2W@A`?w)aLx z4Z8JPT6ibjZ$A9d^dCkBPR?eTl18S1svB#9Ad{goww?u@ix=z7h-i6bd2V^-#yq$^ z^ZIn<_xm~E#K84*{~uq!M<49}``dLIZ7<#VsPR@1s*Rbq{w4MvTwdFMy!R`S?mvET zp4Tq}o~_N0p_vN)fCIh$l2sej7!&W_`ndj*$Gy;~gYMTqpz8a8|NWu6^HG6&F57R= z-o10*7h`RzzRl8zMz6Aya1ESTR(HFRQK4ArMowK^RVJ~*b)*w&Lz!(Mvn-AR=^~v9 z+tJ-P6tSt6xG5L(m3*A$jXf#L{}FK224Xj-u3d@QW`pIMzinBg1=91XP*aJB5ab<7VVK-Vy8!_Ka65 zN+TD^xbRS+X+ebOpY&9j(HR&b^D+}Uv>1{TnQ|W{8GdY6!9<5L z&ag7x#LYvRdl+Ml7=_NwR%XWTFy`sQm_0aS5ASH5Ff!!tB#b?I7`uc6d5G`X6Faa4 zm@hnyslu6Y8sOkjhBb0qZj!CfopZ?eae8hevJvZvo%x-L4p~${y_T7_XmL6vobvWN z^O+Mk@8Ql^wQzE3ZNey(#VJtAdi$RI6<(i+?e`!Wma|5zGObR82Ld zT8J;qYd;tG5-t#G(yrrQOwD3pjk`D_dV@r9^wZ>GWCIn)GF7^3ML7Z4OW(Ds)s1T&eDRd{1n8jKSc_~2&&h0nbKk6TC!`)4jrjMcHa;T?orgPWXdmp#4Q z5BeVr5oe8Rp>g?uBVuTTp4$;-yEJ6c+yZxI#cy8j(Ua4A%f`VWZyo8vITymrad4fW zb2LFeuiT?Y^YdRl2EbM^0pF-h)1Auq2CBE;_2|dw7G0~ne}8RJB^u2V6$htq{}ITH zxGt7rB{94?zz`l8$7&-&VR?1Yw^6ML=EZUv&BIU@fvt;QKuWI7R^^wpTWDj7@1jO! zhUO~UJ#CKDBu!U7ynlX4Zz{8dgmoN%;=6_u*I-chF)7CVC2z$v=w7FP-hXlL%A0S# zei_R(v8bG3F6&m@Oane@ga7=FYS{g^z|rp|s$HpH0kC#?z3F)tOFhv$5lW{KN6khe zgN8!e4$)oOjf~l6tYiZ%RCi6F?9tD*(W_@3zV;LFnxYS>CKc+4=;hgkd>fi6ub$l#( zhdg%!=Urqw&oAgrIKoGEO_~&1KjYQNEY3 O$916ZF5gyuoctFVY`-G_ literal 0 HcmV?d00001 diff --git a/mozilla/embedding/browser/powerplant/resources/cfmAlias.rsrc b/mozilla/embedding/browser/powerplant/resources/cfmAlias.rsrc new file mode 100644 index 0000000000000000000000000000000000000000..2fa48eef01b87abc57dfbae6eba1db5fb1b2b737 GIT binary patch literal 794 zcmb8t?@JUx7{KwFI}$`9kVuJ$?GMO9h+gcALcM%vFV2u&347~QL$hw|+z%>5kBW#0 zi3o`(39*QXh$A8_A|xUrL?R+GA|j%H!8g};Ztqa)RS$gTnVp%P8J=CSWrq+M@o!`q zk~q+sa%<>ko|8Mt>truok{KsMj0;O!Mir-V7E_o;4d-wH7jX%faRsxuifg!zIo!Za z+`>HWU;&G`hx>Sdhj@g?sN)Hq;u)6k0x$6j%Xp19c#C& z2Y%ugenZG+?PxPXcI8z?nfO$sCQEK^bJTmf4-e)Uk#o!24q3|*9T;y|8|7;De<9}& z){oA*il-r)U#k7o&K(u4sw!b_yE_$Bq4zGRX76ooJh17){z!aA8xwfNvNjXGO+r6P zNBjwGOMbeU|M%4!jplJj)|W(}TcNA7!-YsgaySM{pTq8SN q+cOe`Lt~@fm`bdUC%uBQaXAT9VYD!mkIToUXb^5?8Z$1*TJ#4|U63;X literal 0 HcmV?d00001 diff --git a/mozilla/embedding/browser/powerplant/resources/cfmAliasDebug.rsrc b/mozilla/embedding/browser/powerplant/resources/cfmAliasDebug.rsrc new file mode 100644 index 0000000000000000000000000000000000000000..20a5a290a1a7ccb5a4fd03f49cc1ccfbcb54957f GIT binary patch literal 824 zcma))ze~eF6vyACI7p>J5i2N?&B=y>I0UTLR-NjQ`UABn`Ef0Wm!u?Z1#zh0?&9L0 zZsP9fKjG}3;Uc)ycg=|xU3~EF-S_2lckf;f#-;%@_-h$V5%jYBBp94)Zy3h`GBX(U z1ko-qqQkMJi6y8AtPs#g}Uul_Zs>hjbauCx+S-_8dkLy_Syu7Xo5^^AOgAc FzW@lEeJub0 literal 0 HcmV?d00001 diff --git a/mozilla/embedding/browser/powerplant/source/ApplIDs.h b/mozilla/embedding/browser/powerplant/source/ApplIDs.h new file mode 100644 index 00000000000..6dfbdd08d1e --- /dev/null +++ b/mozilla/embedding/browser/powerplant/source/ApplIDs.h @@ -0,0 +1,51 @@ +/* -*- Mode: C++; tab-width: 3; indent-tabs-mode: nil; c-basic-offset: 2 -*- + * + * The contents of this file are subject to the Mozilla Public + * License Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.mozilla.org/MPL/ + * + * Software distributed under the License is distributed on an "AS + * IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or + * implied. See the License for the specific language governing + * rights and limitations under the License. + * + * The Original Code is the Mozilla browser. + * + * The Initial Developer of the Original Code is Netscape + * Communications, Inc. Portions created by Netscape are + * Copyright (C) 1999, Mozilla. All Rights Reserved. + * + * Contributor(s): + * Conrad Carlen + */ + +/* + * Declares application dependent IDs for resources, messages, on so on + * It is meant to be replaced or added to by any application using the + * classes in this project. The file name name should not be changed though or + * source files that include it will have to be changed. + */ + +#ifndef __ApplIDs__ +#define __ApplIDs__ + +//***************************************************************************** +//*** Resource IDs +//***************************************************************************** + +// Windows +const PP_PowerPlant::ResIDT wind_BrowserWindow = 129; + +// Dialogs +const PP_PowerPlant::ResIDT dlog_FindDialog = 1281; + + +//***************************************************************************** +//*** Message IDs +//***************************************************************************** + +const MessageT msg_OnStartLoadDocument = 1000; +const MessageT msg_OnEndLoadDocument = 1001; + +#endif // __ApplIDs__ diff --git a/mozilla/embedding/browser/powerplant/source/CBrowserApp.cp b/mozilla/embedding/browser/powerplant/source/CBrowserApp.cp new file mode 100644 index 00000000000..746da66affa --- /dev/null +++ b/mozilla/embedding/browser/powerplant/source/CBrowserApp.cp @@ -0,0 +1,383 @@ +/* -*- Mode: C++; tab-width: 3; indent-tabs-mode: nil; c-basic-offset: 2 -*- + * + * The contents of this file are subject to the Mozilla Public + * License Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.mozilla.org/MPL/ + * + * Software distributed under the License is distributed on an "AS + * IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or + * implied. See the License for the specific language governing + * rights and limitations under the License. + * + * The Original Code is the Mozilla browser. + * + * The Initial Developer of the Original Code is Netscape + * Communications, Inc. Portions created by Netscape are + * Copyright (C) 1999, Mozilla. All Rights Reserved. + * + * Contributor(s): + * Conrad Carlen + */ + +#include "CBrowserApp.h" + +#include +#include +#include +#include +#include +#include + +#include +#include + +#include +#include +#include + +#include + +#include "ApplIDs.h" +#include "CBrowserWindow.h" +#include "CBrowserShell.h" +#include "CUrlField.h" +#include "CThrobber.h" +#include "UMacUnicode.h" +#include "nsIImageManager.h" +#include "nsIServiceManager.h" +#include "nsIEventQueueService.h" +#include "nsIPref.h" +#include "macstdlibextras.h" +#include "SIOUX.h" + +#include + +extern "C" void NS_SetupRegistry(); + + +static NS_DEFINE_CID(kPrefCID, NS_PREF_CID); +static NS_DEFINE_IID(kIPrefIID, NS_IPREF_IID); + + +// =========================================================================== +// ¥ Main Program +// =========================================================================== + +int main() +{ + + SetDebugThrow_(PP_PowerPlant::debugAction_Alert); // Set Debugging options + SetDebugSignal_(PP_PowerPlant::debugAction_Alert); + + PP_PowerPlant::InitializeHeap(3); // Initialize Memory Manager + // Parameter is number of Master Pointer + // blocks to allocate + + + PP_PowerPlant::UQDGlobals::InitializeToolbox(&qd); // Initialize standard Toolbox managers + +#if DEBUG + ::InitializeSIOUX(false); +#endif + + ::InitTSMAwareApplication(); + + new PP_PowerPlant::LGrowZone(20000); // Install a GrowZone function to catch low memory situations. + + { + CBrowserApp theApp; // create instance of your application + + theApp.Run(); + } + + ::CloseTSMAwareApplication(); + + return 0; +} + + +// --------------------------------------------------------------------------- +// MMozillaApp constructor +// --------------------------------------------------------------------------- + +MMozillaApp::MMozillaApp() : + mpIEventQueueService(nsnull), mpIServiceManager(nsnull), + mpIPref(nsnull) +{ + nsresult rv = InitWebShellApp(); + if (rv != NS_OK) + ThrowOSErr_(rv); +} + +// --------------------------------------------------------------------------- +// MMozillaApp destructor +// --------------------------------------------------------------------------- + +MMozillaApp::~MMozillaApp() +{ + TermWebShellApp(); +} + +// --------------------------------------------------------------------------- +// MMozillaApp::InitWebShell +// --------------------------------------------------------------------------- +// Does once only initialization of WebShell. +// Called at application startup. + +nsresult MMozillaApp::InitWebShellApp() +{ + //RegisterClass_(CWebShell); + RegisterClass_(CBrowserShell); + RegisterClass_(CBrowserWindow); + RegisterClass_(CUrlField); + RegisterClass_(CThrobber); + + nsresult rv; + + // Initialize XPCOM + NS_InitXPCOM(&mpIServiceManager, nsnull); + + rv = nsComponentManager::AutoRegister(nsIComponentManager::NS_Startup, NULL /* default */); + if (NS_OK != rv) { + NS_ASSERTION(PR_FALSE, "Could not AutoRegister"); + return rv; + } + + // Initialize the Registry + NS_SetupRegistry(); + + // Create the Event Queue for the UI thread... + rv = nsServiceManager::GetService(NS_EVENTQUEUESERVICE_PROGID, + NS_GET_IID(nsIEventQueueService), + (nsISupports **)&mpIEventQueueService); + if (NS_OK != rv) { + NS_ASSERTION(PR_FALSE, "Could not obtain the event queue service"); + return rv; + } + + rv = mpIEventQueueService->CreateThreadEventQueue(); + if (NS_OK != rv) { + NS_ASSERTION(PR_FALSE, "Could not create the event queue for the thread"); + return rv; + } + + // Load preferences + rv = nsComponentManager::CreateInstance(kPrefCID, NULL, kIPrefIID, + (void **) &mpIPref); + if (NS_OK != rv) { + NS_ASSERTION(PR_FALSE, "Could not create prefs object"); + return rv; + } + + mpIPref->StartUp(); + mpIPref->ReadUserPrefs(); + + // HACK ALERT: Since we don't have profiles, we don't have prefs + // Reduce the default font size here by hand + mpIPref->SetIntPref("font.size.variable.x-western", 12); + mpIPref->SetIntPref("font.size.fixed.x-western", 9); + + return NS_OK; +} + + +// --------------------------------------------------------------------------- +// MMozillaApp::TermWebShell +// --------------------------------------------------------------------------- +// Does once per application run initialization of WebShell. +// Called at application quit time. + +void MMozillaApp::TermWebShellApp() +{ + nsresult rv; + + UMacUnicode::ReleaseUnit(); + + if (nsnull != mpIEventQueueService) { + nsServiceManager::ReleaseService(NS_EVENTQUEUESERVICE_PROGID, mpIEventQueueService); + mpIEventQueueService = nsnull; + } + + if (nsnull != mpIPref) { + mpIPref->ShutDown(); + NS_RELEASE(mpIPref); + } + + // Shutdown XPCOM? + rv = NS_ShutdownXPCOM(nsnull); + NS_ASSERTION(NS_SUCCEEDED(rv), "NS_ShutdownXPCOM failed"); + +} + + +// --------------------------------------------------------------------------- +// ¥ CBrowserApp +// --------------------------------------------------------------------------- +// Constructor + +CBrowserApp::CBrowserApp() +{ + if ( PP_PowerPlant::UEnvironment::HasFeature( PP_PowerPlant::env_HasAppearance ) ) { + ::RegisterAppearanceClient(); + } + + RegisterClass_(PP_PowerPlant::LWindow); // You must register each kind of + RegisterClass_(PP_PowerPlant::LCaption); // PowerPlant classes that you use in your PPob resource. + + // Register the Appearance Manager/GA classes + PP_PowerPlant::UControlRegistry::RegisterClasses(); + + SetSleepTime(0); +} + + +// --------------------------------------------------------------------------- +// ¥ ~CBrowserApp +// --------------------------------------------------------------------------- +// Destructor +// + +CBrowserApp::~CBrowserApp() +{ +} + +// --------------------------------------------------------------------------- +// ¥ StartUp +// --------------------------------------------------------------------------- +// This method lets you do something when the application starts up +// without a document. For example, you could issue your own new command. + +void +CBrowserApp::StartUp() +{ + ObeyCommand(PP_PowerPlant::cmd_New, nil); // EXAMPLE, create a new window +} + + +// --------------------------------------------------------------------------- +// ¥ ProcessNextEvent [public] +// --------------------------------------------------------------------------- +// Retrieve and handle the next event in the event queue + +void +CBrowserApp::ProcessNextEvent() +{ + EventRecord macEvent; + + // When on duty (application is in the foreground), adjust the + // cursor shape before waiting for the next event. Except for the + // very first time, this is the same as adjusting the cursor + // after every event. + + if (IsOnDuty()) { + + // Calling OSEventAvail with a zero event mask will always + // pass back a null event. However, it fills the EventRecord + // with the information we need to set the cursor shape-- + // the mouse location in global coordinates and the state + // of the modifier keys. + + ::OSEventAvail(0, &macEvent); + AdjustCursor(macEvent); + } + + // Retrieve the next event. Context switch could happen here. + + SetUpdateCommandStatus(false); + Boolean gotEvent = ::WaitNextEvent(everyEvent, &macEvent, mSleepTime, + mMouseRgn); + +#if DEBUG + // NOTE: SIOUX doesn't get any nullEvents because it rudely sets the + // cursor on nullEvents - even if the mouse is not over its window + if (gotEvent && SIOUXHandleOneEvent(&macEvent)) + return; +#endif + + // Let Attachments process the event. Continue with normal + // event dispatching unless suppressed by an Attachment. + + if (LAttachable::ExecuteAttachments(msg_Event, &macEvent)) { + if (gotEvent) { + DispatchEvent(macEvent); + } else { + UseIdleTime(macEvent); + } + } + + // Repeaters get time after every event + LPeriodical::DevoteTimeToRepeaters(macEvent); + + // Update status of menu items + if (IsOnDuty() && GetUpdateCommandStatus()) { + UpdateMenus(); + } +} + + +// --------------------------------------------------------------------------- +// ¥ ObeyCommand +// --------------------------------------------------------------------------- +// This method lets the application respond to commands like Menu commands + +Boolean +CBrowserApp::ObeyCommand( + PP_PowerPlant::CommandT inCommand, + void *ioParam) +{ + Boolean cmdHandled = true; + + switch (inCommand) { + + // Handle command messages (defined in PP_Messages.h). + case PP_PowerPlant::cmd_New: + + PP_PowerPlant::LWindow *theWindow = + PP_PowerPlant::LWindow::CreateWindow(wind_BrowserWindow, this); + ThrowIfNil_(theWindow); + + // LWindow is not initially visible in PPob resource + theWindow->Show(); + break; + + // Any that you don't handle, such as cmd_About and cmd_Quit, + // will be passed up to LApplication + default: + cmdHandled = PP_PowerPlant::LApplication::ObeyCommand(inCommand, ioParam); + break; + } + + return cmdHandled; +} + +// --------------------------------------------------------------------------- +// ¥ FindCommandStatus +// --------------------------------------------------------------------------- +// This function enables menu commands. +// + +void +CBrowserApp::FindCommandStatus( + PP_PowerPlant::CommandT inCommand, + Boolean &outEnabled, + Boolean &outUsesMark, + PP_PowerPlant::Char16 &outMark, + Str255 outName) +{ + + switch (inCommand) { + + // Return menu item status according to command messages. + case PP_PowerPlant::cmd_New: + outEnabled = true; + break; + + // Any that you don't handle, such as cmd_About and cmd_Quit, + // will be passed up to LApplication + default: + PP_PowerPlant::LApplication::FindCommandStatus(inCommand, outEnabled, + outUsesMark, outMark, outName); + break; + } +} diff --git a/mozilla/embedding/browser/powerplant/source/CBrowserApp.h b/mozilla/embedding/browser/powerplant/source/CBrowserApp.h new file mode 100644 index 00000000000..75bedfecdec --- /dev/null +++ b/mozilla/embedding/browser/powerplant/source/CBrowserApp.h @@ -0,0 +1,82 @@ +/* -*- Mode: C++; tab-width: 3; indent-tabs-mode: nil; c-basic-offset: 2 -*- + * + * The contents of this file are subject to the Mozilla Public + * License Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.mozilla.org/MPL/ + * + * Software distributed under the License is distributed on an "AS + * IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or + * implied. See the License for the specific language governing + * rights and limitations under the License. + * + * The Original Code is the Mozilla browser. + * + * The Initial Developer of the Original Code is Netscape + * Communications, Inc. Portions created by Netscape are + * Copyright (C) 1999, Mozilla. All Rights Reserved. + * + * Contributor(s): + * Conrad Carlen + */ + +#pragma once + +#include +#include + +#ifndef nsError_h +#include "nsError.h" +#endif + +class nsIEventQueueService; +class nsIServiceManager; +class nsIPref; + +// --------------------------------------------------------------------------- +// MMozillaApp - A class that can be mixed into an application class. It +// handles the startup and shutdown of mozilla. +// --------------------------------------------------------------------------- + +class MMozillaApp +{ + protected: + MMozillaApp(); + virtual ~MMozillaApp(); + + nsresult InitWebShellApp(); + void TermWebShellApp(); + + nsIEventQueueService *mpIEventQueueService; + nsIServiceManager *mpIServiceManager; + nsIPref *mpIPref; +}; + +// WARNING: CBrowserApp must descend from these in this order - we need +// the destructor for MMozillaApp to be called AFTER that of LApplication + +class CBrowserApp : public MMozillaApp, + public PP_PowerPlant::LApplication +{ + +public: + CBrowserApp(); // constructor registers PPobs + virtual ~CBrowserApp(); // stub destructor + + + virtual void ProcessNextEvent(); + + // this overriding method handles application commands + virtual Boolean ObeyCommand(PP_PowerPlant::CommandT inCommand, void* ioParam); + + + // this overriding method returns the status of menu items + virtual void FindCommandStatus(PP_PowerPlant::CommandT inCommand, + Boolean &outEnabled, Boolean &outUsesMark, + PP_PowerPlant::Char16 &outMark, Str255 outName); + +protected: + + virtual void StartUp(); // override startup functions + +}; diff --git a/mozilla/embedding/browser/powerplant/source/CBrowserShell.cpp b/mozilla/embedding/browser/powerplant/source/CBrowserShell.cpp new file mode 100644 index 00000000000..6e073da4e95 --- /dev/null +++ b/mozilla/embedding/browser/powerplant/source/CBrowserShell.cpp @@ -0,0 +1,605 @@ +/* -*- Mode: C++; tab-width: 3; indent-tabs-mode: nil; c-basic-offset: 2 -*- + * + * The contents of this file are subject to the Mozilla Public + * License Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.mozilla.org/MPL/ + * + * Software distributed under the License is distributed on an "AS + * IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or + * implied. See the License for the specific language governing + * rights and limitations under the License. + * + * The Original Code is the Mozilla browser. + * + * The Initial Developer of the Original Code is Netscape + * Communications, Inc. Portions created by Netscape are + * Copyright (C) 1999, Mozilla. All Rights Reserved. + * + * Contributor(s): + * Conrad Carlen + */ + +#ifndef __CBrowserShell__ +#include "CBrowserShell.h" +#endif + +#include "nsCWebBrowser.h" +#include "nsIComponentManager.h" +#include "nsComponentManagerUtils.h" +#include "nsWidgetsCID.h" +#include "nsRepeater.h" +#include "nsString.h" +#include "nsIWebBrowserChrome.h" +#include "nsIDocShell.h" +#include "nsIDocShellTreeOwner.h" +#include "nsIInterfaceRequestor.h" +#include "nsIWebProgressListener.h" + +#include "ApplIDs.h" +#include "CBrowserWindow.h" +#include "CFindComponent.h" +#include "UMacUnicode.h" + +// PowerPlant +#ifndef _H_LEditText +#include "LEditText.h" +#endif + +#ifndef _H_LCheckBox +#include "LCheckBox.h" +#endif + +static NS_DEFINE_IID(kWindowCID, NS_WINDOW_CID); + +// CBrowserShell static variables +nsMacMessageSink CBrowserShell::mMessageSink; + + +//***************************************************************************** +//*** CBrowserShell: constructors/destructor +//***************************************************************************** + +CBrowserShell::CBrowserShell() : + mFinder(nsnull) +{ + nsresult rv = CommonConstruct(); + if (rv != NS_OK) + Throw_Err(NS_ERROR_GET_CODE(rv)); // If this fails, there's no reason to live anymore :( +} + + +CBrowserShell::CBrowserShell(LStream* inStream) : + LView(inStream), + mFinder(nsnull) +{ + *inStream >> (StringPtr) mInitURL; + + nsresult rv = CommonConstruct(); + if (rv != NS_OK) + Throw_Err(NS_ERROR_GET_CODE(rv)); // If this fails, there's no reason to live anymore :( +} + + +CBrowserShell::~CBrowserShell() +{ + delete mFinder; + + // nsCOMPtr destructors, do your thing +} + + +NS_IMETHODIMP CBrowserShell::CommonConstruct() +{ + nsresult rv; + + mWebBrowser = do_CreateInstance(NS_WEBBROWSER_PROGID, &rv); + NS_ENSURE_SUCCESS(rv, NS_ERROR_FAILURE); + + nsCOMPtr baseWin(do_QueryInterface(mWebBrowser)); + NS_ENSURE_TRUE(baseWin, NS_ERROR_FAILURE); + mWebBrowserAsBaseWin = baseWin; + + nsCOMPtr webNav(do_QueryInterface(mWebBrowser)); + NS_ENSURE_TRUE(webNav, NS_ERROR_FAILURE); + mWebBrowserAsWebNav = webNav; + + nsCOMPtr treeItem(do_QueryInterface(mWebBrowser)); + NS_ENSURE_TRUE(treeItem, NS_ERROR_FAILURE); + mWebBrowserAsTreeItem = treeItem; + + nsCOMPtr asProgress(do_QueryInterface(mWebBrowser)); + NS_ENSURE_TRUE(asProgress, NS_ERROR_FAILURE); + mWebBrowserAsProgress = asProgress; + + return NS_OK; +} + + +//***************************************************************************** +//*** CBrowserShell: LPane overrides +//***************************************************************************** + +void CBrowserShell::FinishCreateSelf() +{ + FocusDraw(); + + CBrowserWindow *ourWindow = dynamic_cast(LWindow::FetchWindowObject(GetMacPort())); + ThrowIfNil_(ourWindow); + ourWindow->AddListener(this); + + nsCOMPtr aWidget; + ourWindow->GetWidget(getter_AddRefs(aWidget)); + ThrowIfNil_(aWidget); + + Rect portFrame; + CalcPortFrameRect(portFrame); + nsRect r(portFrame.left, portFrame.top, portFrame.right - portFrame.left, portFrame.bottom - portFrame.top); + + mWebBrowserAsBaseWin->InitWindow(aWidget->GetNativeData(NS_NATIVE_WIDGET), nsnull, r.x, r.y, r.width, r.height); + mWebBrowserAsBaseWin->Create(); + + AdjustFrame(); + StartRepeating(); + StartListening(); +} + + +void CBrowserShell::ResizeFrameBy(SInt16 inWidthDelta, + SInt16 inHeightDelta, + Boolean inRefresh) +{ + LView::ResizeFrameBy(inWidthDelta, inHeightDelta, inRefresh); + AdjustFrame(); +} + + +void CBrowserShell::MoveBy(SInt32 inHorizDelta, + SInt32 inVertDelta, + Boolean inRefresh) +{ + LView::MoveBy(inHorizDelta, inVertDelta, inRefresh); + AdjustFrame(); +} + + +void CBrowserShell::ShowSelf() +{ + mWebBrowserAsBaseWin->SetVisibility(PR_TRUE); +} + + +void CBrowserShell::DrawSelf() +{ + EventRecord osEvent; + osEvent.what = updateEvt; + mMessageSink.DispatchOSEvent(osEvent, GetMacPort()); +} + + +void CBrowserShell::ClickSelf(const SMouseDownEvent &inMouseDown) +{ + if (!IsTarget()) + SwitchTarget(this); + + FocusDraw(); + mMessageSink.DispatchOSEvent((EventRecord&)inMouseDown.macEvent, GetMacPort()); +} + + +void CBrowserShell::EventMouseUp(const EventRecord &inMacEvent) +{ + FocusDraw(); + mMessageSink.DispatchOSEvent((EventRecord&)inMacEvent, GetMacPort()); +} + + +void CBrowserShell::AdjustCursorSelf(Point /* inPortPt */, + const EventRecord& /* inMacEvent */) +{ + // Do nothing - mozilla takes care of this during null events on mouse moved events +} + + +//***************************************************************************** +//*** CBrowserShell: LCommander overrides +//***************************************************************************** + +void CBrowserShell::DontBeTarget() +{ +} + + +Boolean CBrowserShell::HandleKeyPress(const EventRecord &inKeyEvent) +{ + // set the QuickDraw origin + FocusDraw(); + + // dispatch the event + Boolean keyHandled = mMessageSink.DispatchOSEvent((EventRecord&)inKeyEvent, GetMacPort()); + + return keyHandled; +} + + + +//***************************************************************************** +//*** CBrowserShell: LPeriodical overrides +//***************************************************************************** + +void CBrowserShell::SpendTime(const EventRecord& inMacEvent) +{ + + switch (inMacEvent.what) + { + case osEvt: + { + // The MacMessageSink will not set the cursor if we are in the background - which is right. + // We have to feed it suspendResumeMessages for it to know + + unsigned char eventType = ((inMacEvent.message >> 24) & 0x00ff); + if (eventType == mouseMovedMessage) + HandleMouseMoved(inMacEvent); + else if (eventType == suspendResumeMessage) + mMessageSink.DispatchOSEvent(const_cast(inMacEvent), GetMacPort()); + } + break; + + case nullEvent: + { + static Point lastWhere = {0, 0}; + + if ((*(long*)&lastWhere != *(long*)&inMacEvent.where)) + { + HandleMouseMoved(inMacEvent); + lastWhere = inMacEvent.where; + } + + Repeater::DoIdlers(inMacEvent); + // yield to other threads + ::PR_Sleep(PR_INTERVAL_NO_WAIT); + } + break; + } + + Repeater::DoRepeaters(inMacEvent); + +} + +//***************************************************************************** +//*** CBrowserShell: LListener overrides +//***************************************************************************** + +void CBrowserShell::ListenToMessage(MessageT inMessage, + void* ioParam) +{ + switch (inMessage) + { + case msg_OnStartLoadDocument: + case msg_OnEndLoadDocument: + break; + } +} + + +//***************************************************************************** +//*** CBrowserShell: +//***************************************************************************** + +NS_IMETHODIMP CBrowserShell::SetTopLevelWindow(nsIWebBrowserChrome * aTopLevelWindow) +{ + // Get the required interfaces from the chrome + nsCOMPtr windowAsProgListener(do_GetInterface(aTopLevelWindow)); + NS_ENSURE_TRUE(windowAsProgListener, NS_ERROR_INVALID_ARG); + + nsCOMPtr windowAsObserver(do_GetInterface(aTopLevelWindow)); + NS_ENSURE_TRUE(windowAsObserver, NS_ERROR_INVALID_ARG); + + mWebBrowser->SetTopLevelWindow(aTopLevelWindow); + mWebBrowserAsProgress->AddProgressListener(windowAsProgListener); + + // Get the docshell - we need to do some things directly to it + nsCOMPtr aDocShell; + mWebBrowser->GetDocShell(getter_AddRefs(aDocShell)); + NS_ENSURE_TRUE(aDocShell, NS_ERROR_FAILURE); + + aDocShell->SetDocLoaderObserver(windowAsObserver); + + return NS_OK; +} + + +//***************************************************************************** +//*** CBrowserShell: Navigation +//***************************************************************************** + +Boolean CBrowserShell::CanGoBack() +{ + PRBool canDo; + nsresult rv; + + rv = mWebBrowserAsWebNav->GetCanGoBack(&canDo); + return (NS_SUCCEEDED(rv) && canDo); +} + + +Boolean CBrowserShell::CanGoForward() +{ + PRBool canDo; + nsresult rv; + + rv = mWebBrowserAsWebNav->GetCanGoForward(&canDo); + return (NS_SUCCEEDED(rv) && canDo); +} + + +Boolean CBrowserShell::IsLoading() +{ + return false; +} + + +void CBrowserShell::Back() +{ + if (CanGoBack()) + mWebBrowserAsWebNav->GoBack(); + else + ::SysBeep(5); +} + +void CBrowserShell::Forward() +{ + if (CanGoForward()) + mWebBrowserAsWebNav->GoForward(); + else + ::SysBeep(5); +} + +void CBrowserShell::Stop() +{ + mWebBrowserAsWebNav->Stop(); +} + +//***************************************************************************** +//*** CBrowserShell: URL Loading +//***************************************************************************** + +void CBrowserShell::LoadURL(Ptr urlText, SInt32 urlTextLen) +{ + nsAutoString urlString(urlText, urlTextLen); + LoadURL(urlString); +} + + +void CBrowserShell::LoadURL(const nsString& urlText) +{ + nsresult rv = mWebBrowserAsWebNav->LoadURI(urlText.GetUnicode()); + if (NS_FAILED(rv)) + Throw_(NS_ERROR_GET_CODE(rv)); +} + + +//***************************************************************************** +//*** CBrowserShell: Text Searching +//***************************************************************************** + +Boolean CBrowserShell::Find() +{ + // Make sure we have a finder + nsresult rv = EnsureFinder(); + if (NS_FAILED(rv)) // Throw an exception?? + return FALSE; + + // Get the current find params from it + nsString searchString; + PRBool caseSensitive; + PRBool wrapSearch; + PRBool seachBackwards; + PRBool entireWord; + + mFinder->GetLastSearchString(searchString); + mFinder->GetLastCaseSensitive(caseSensitive); + mFinder->GetLastWrapSearch(wrapSearch); + mFinder->GetLastSearchBackwards(seachBackwards); + mFinder->GetLastEntireWord(entireWord); + + Boolean result = FALSE; + + if (GetFindParams(searchString, caseSensitive, seachBackwards, wrapSearch, entireWord)) + { + PRBool didFind; + + mFinder->Find(searchString, caseSensitive, seachBackwards, wrapSearch, entireWord, didFind); + result = (NS_SUCCEEDED(rv) && didFind); + if (!result) + ::SysBeep(1); + } + return result; +} + + +Boolean CBrowserShell::Find(const nsString& searchString, + Boolean caseSensitive, + Boolean searchBackwards, + Boolean wrapSearch, + Boolean entireWord) +{ + // Make sure we have a finder + nsresult rv = EnsureFinder(); + if (NS_FAILED(rv)) // Throw an exception?? + return FALSE; + + Boolean result; + PRBool didFind; + + rv = mFinder->Find(searchString, caseSensitive, searchBackwards, wrapSearch, entireWord, didFind); + result = (NS_SUCCEEDED(rv) && didFind); + if (!result) + ::SysBeep(1); + + return result; +} + +Boolean CBrowserShell::CanFindNext() +{ + if (!mFinder) + return FALSE; + + nsresult rv; + PRBool canDo; + + rv = mFinder->CanFindNext(canDo); + return (NS_SUCCEEDED(rv) && canDo); +} + + +Boolean CBrowserShell::FindNext() +{ + if (!mFinder) + { + SignalStringLiteral_("This should not be called until Find is called"); + return FALSE; + } + + Boolean result; + PRBool didFind; + + nsresult rv = mFinder->FindNext(didFind); + result = (NS_SUCCEEDED(rv) && didFind); + if (!result) + ::SysBeep(1); + + return result; +} + + +void CBrowserShell::HandleMouseMoved(const EventRecord& inMacEvent) +{ + if (IsActive()) + { + FocusDraw(); + mMessageSink.DispatchOSEvent(const_cast(inMacEvent), GetMacPort()); + } +} + + +void CBrowserShell::AdjustFrame() +{ + FocusDraw(); + + Rect portFrame; + CalcPortFrameRect(portFrame); + nsRect r(portFrame.left, portFrame.top, portFrame.right - portFrame.left, portFrame.bottom - portFrame.top); + + mWebBrowserAsBaseWin->SetPositionAndSize(r.x, r.y, r.width, r.height, PR_TRUE); +} + + +NS_METHOD CBrowserShell::EnsureFinder() +{ + nsCOMPtr ourDocShell; + mWebBrowser->GetDocShell(getter_AddRefs(ourDocShell)); + + if (mFinder) + { + // For now, we have to clear the context each time. + // The finder should be a nsIDocumentLoaderObserver and then + // it could clear itself when the contents of our docshell changed. + + mFinder->SetContext(nsnull); + mFinder->SetContext(ourDocShell); + return NS_OK; + } + + mFinder = new CFindComponent; + NS_ENSURE_TRUE(mFinder, NS_ERROR_OUT_OF_MEMORY); + mFinder->SetContext(ourDocShell); + + return NS_OK; +} + + +Boolean CBrowserShell::GetFindParams(nsString& searchText, + PRBool& caseSensitive, + PRBool& searchBackwards, + PRBool& wrapSearch, + PRBool& entireWord) +{ + enum + { + kSearchTextEdit = FOUR_CHAR_CODE('Text'), + kCaseSensitiveCheck = FOUR_CHAR_CODE('Case'), + kWrapAroundCheck = FOUR_CHAR_CODE('Wrap'), + kSearchBackwardsCheck = FOUR_CHAR_CODE('Back'), + kEntireWordCheck = FOUR_CHAR_CODE('Entr') + }; + + Boolean result; + + try + { + // Create stack-based object for handling the dialog box + + StDialogHandler theHandler(dlog_FindDialog, this); + LWindow *theDialog = theHandler.GetDialog(); + Str255 aStr; + + // Set initial text for string in dialog box + + UMacUnicode::StringToStr255(searchText, aStr); + + LEditText *editField = dynamic_cast(theDialog->FindPaneByID(kSearchTextEdit)); + editField->SetDescriptor(aStr); + theDialog->SetLatentSub(editField); + + LCheckBox *caseSensCheck, *entireWordCheck, *wrapAroundCheck, *backwardsCheck; + + caseSensCheck = dynamic_cast(theDialog->FindPaneByID(kCaseSensitiveCheck)); + ThrowIfNot_(caseSensCheck); + caseSensCheck->SetValue(caseSensitive ? 1 : 0); + entireWordCheck = dynamic_cast(theDialog->FindPaneByID(kEntireWordCheck)); + ThrowIfNot_(entireWordCheck); + entireWordCheck->SetValue(entireWord ? 1 : 0); + wrapAroundCheck = dynamic_cast(theDialog->FindPaneByID(kWrapAroundCheck)); + ThrowIfNot_(wrapAroundCheck); + wrapAroundCheck->SetValue(wrapSearch ? 1 : 0); + backwardsCheck = dynamic_cast(theDialog->FindPaneByID(kSearchBackwardsCheck)); + ThrowIfNot_(backwardsCheck); + backwardsCheck->SetValue(searchBackwards ? 1 : 0); + + theDialog->Show(); + + while (true) // This is our modal dialog event loop + { + MessageT hitMessage = theHandler.DoDialog(); + + if (hitMessage == msg_Cancel) + { + result = FALSE; + break; + + } + else if (hitMessage == msg_OK) + { + editField->GetDescriptor(aStr); + UMacUnicode::Str255ToString(aStr, searchText); + + caseSensitive = caseSensCheck->GetValue() ? TRUE : FALSE; + entireWord = entireWordCheck->GetValue() ? TRUE : FALSE; + wrapSearch = wrapAroundCheck->GetValue() ? TRUE : FALSE; + searchBackwards = backwardsCheck->GetValue() ? TRUE : FALSE; + + result = TRUE; + break; + } + } + } + catch (...) + { + result = FALSE; + // Don't propagate the error. + } + + return result; +} + diff --git a/mozilla/embedding/browser/powerplant/source/CBrowserShell.h b/mozilla/embedding/browser/powerplant/source/CBrowserShell.h new file mode 100644 index 00000000000..4d2f255d5c4 --- /dev/null +++ b/mozilla/embedding/browser/powerplant/source/CBrowserShell.h @@ -0,0 +1,143 @@ +/* -*- Mode: C++; tab-width: 3; indent-tabs-mode: nil; c-basic-offset: 2 -*- + * + * The contents of this file are subject to the Mozilla Public + * License Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.mozilla.org/MPL/ + * + * Software distributed under the License is distributed on an "AS + * IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or + * implied. See the License for the specific language governing + * rights and limitations under the License. + * + * The Original Code is the Mozilla browser. + * + * The Initial Developer of the Original Code is Netscape + * Communications, Inc. Portions created by Netscape are + * Copyright (C) 1999, Mozilla. All Rights Reserved. + * + * Contributor(s): + * Conrad Carlen + */ + +#ifndef __CBrowserShell__ +#define __CBrowserShell__ + +#include "nsIWebBrowser.h" +#include "nsIBaseWindow.h" +#include "nsIWebNavigation.h" +#include "nsIWidget.h" +#include "nsMacMessageSink.h" +#include "nsIDocShellTreeItem.h" +#include "nsIWebProgress.h" + +#ifndef nsCOMPtr_h___ +#include "nsCOMPtr.h" +#endif + +class CBrowserWindow; +class CURIContentListener; +class CFindComponent; + +//***************************************************************************** +//*** CBrowserShell +//***************************************************************************** + +class CBrowserShell : public LView, + public LCommander, + public LPeriodical, + public LListener +{ + +private: + typedef LView Inherited; + +public: + enum { class_ID = FOUR_CHAR_CODE('BroS') }; + + enum { cmd_Find = 'Find', cmd_FindNext = 'FNxt' }; + + CBrowserShell(); + CBrowserShell(LStream* inStream); + + virtual ~CBrowserShell(); + + + // LPane + virtual void FinishCreateSelf(); + virtual void ResizeFrameBy(SInt16 inWidthDelta, + SInt16 inHeightDelta, + Boolean inRefresh); + virtual void MoveBy(SInt32 inHorizDelta, + SInt32 inVertDelta, + Boolean inRefresh); + virtual void ShowSelf(); + virtual void DrawSelf(); + virtual void ClickSelf(const SMouseDownEvent &inMouseDown); + virtual void EventMouseUp(const EventRecord &inMacEvent); + virtual void AdjustCursorSelf(Point inPortPt, + const EventRecord& inMacEvent); + + // LCommander + virtual void DontBeTarget(); + virtual Boolean HandleKeyPress(const EventRecord &inKeyEvent); + + // LPeriodical + virtual void SpendTime(const EventRecord& inMacEvent); + + // LListener + virtual void ListenToMessage(MessageT inMessage, + void* ioParam); + + // CBrowserShell + NS_METHOD SetTopLevelWindow(nsIWebBrowserChrome * aTopLevelWindow); + + Boolean CanGoBack(); + Boolean CanGoForward(); + Boolean IsLoading(); + void Back(); + void Forward(); + void Stop(); + + void LoadURL(Ptr urlText, SInt32 urlTextLen); + void LoadURL(const nsString& urlText); + + // Puts up a find dialog and does the find operation + Boolean Find(); + // Does the find operation with the given params - no UI + Boolean Find(const nsString& searchStr, + Boolean caseSensitive, + Boolean searchBackward, + Boolean wrapSearch, + Boolean wholeWordOnly); + Boolean CanFindNext(); + Boolean FindNext(); + +protected: + NS_METHOD CommonConstruct(); + + void HandleMouseMoved(const EventRecord& inMacEvent); + void AdjustFrame(); + NS_METHOD EnsureFinder(); + virtual Boolean GetFindParams(nsString& searchText, + PRBool& caseSensitive, + PRBool& searchBackwards, + PRBool& wrapSearch, + PRBool& entireWord); + +protected: + static nsMacMessageSink mMessageSink; + + LStr255 mInitURL; + + nsCOMPtr mWebBrowser; // The thing we actually create + nsCOMPtr mWebBrowserAsBaseWin; // Convenience interface to above + nsCOMPtr mWebBrowserAsWebNav; // Ditto + nsCOMPtr mWebBrowserAsTreeItem; // Ditto + nsCOMPtr mWebBrowserAsProgress; // Ditto + + CFindComponent* mFinder; +}; + + +#endif // __CBrowserShell__ diff --git a/mozilla/embedding/browser/powerplant/source/CBrowserWindow.cp b/mozilla/embedding/browser/powerplant/source/CBrowserWindow.cp new file mode 100644 index 00000000000..5301a8af33e --- /dev/null +++ b/mozilla/embedding/browser/powerplant/source/CBrowserWindow.cp @@ -0,0 +1,376 @@ + +#include "nsString.h" +#include "nsWidgetsCID.h" +#include "nsIComponentManager.h" +#include "nsComponentManagerUtils.h" +#include "nsIChannel.h" +#include "nsIURI.h" +#include "nsXPIDLString.h" + +#include "CBrowserWindow.h" +#include "CBrowserShell.h" +#include "CWebBrowserChrome.h" +#include "CThrobber.h" +#include "ApplIDs.h" +#include "UMacUnicode.h" + +#include +#include +#include +#include + +// CBrowserWindow: +// A simple browser window that hooks up a CWebShell to a minimal set of controls +// (Back, Forward and Stop buttons + URL field + status bar). + + +enum +{ + paneID_BackButton = 'Back' +, paneID_ForwardButton = 'Forw' +, paneID_StopButton = 'Stop' +, paneID_URLField = 'gUrl' +, paneID_WebShellView = 'WebS' +, paneID_StatusBar = 'Stat' +, paneID_Throbber = 'THRB' +}; + +// CIDs +static NS_DEFINE_IID(kWindowCID, NS_WINDOW_CID); + +// --------------------------------------------------------------------------- +// ¥ CBrowserWindow Default Constructor [public] +// --------------------------------------------------------------------------- + +CBrowserWindow::CBrowserWindow() : + mBrowserShell(NULL), mBrowserChrome(NULL), + mURLField(NULL), mStatusBar(NULL), mThrobber(NULL), + mBackButton(NULL), mForwardButton(NULL), mStopButton(NULL) +{ + nsresult rv = CommonConstruct(); + if (NS_FAILED(rv)) + Throw_(NS_ERROR_GET_CODE(rv)); +} + + + +// --------------------------------------------------------------------------- +// ¥ CBrowserWindow Stream Constructor [public] +// --------------------------------------------------------------------------- + +CBrowserWindow::CBrowserWindow(LStream* inStream) + : LWindow(inStream), + mBrowserShell(NULL), mBrowserChrome(NULL), + mURLField(NULL), mStatusBar(NULL), mThrobber(NULL), + mBackButton(NULL), mForwardButton(NULL), mStopButton(NULL) +{ + nsresult rv = CommonConstruct(); + if (NS_FAILED(rv)) + Throw_(NS_ERROR_GET_CODE(rv)); +} + + +// --------------------------------------------------------------------------- +// ¥ ~CBrowserWindow Destructor [public] +// --------------------------------------------------------------------------- + +CBrowserWindow::~CBrowserWindow() +{ + if (mBrowserChrome) + { + mBrowserChrome->BrowserWindow(NULL); + NS_RELEASE(mBrowserChrome); + } +} + + +NS_IMETHODIMP CBrowserWindow::CommonConstruct() +{ + nsresult rv; + + // Make the base widget + mWindow = do_CreateInstance(kWindowCID, &rv); + NS_ENSURE_SUCCESS(rv, NS_ERROR_FAILURE); + + // Make our CWebBrowserChrome + mBrowserChrome = new CWebBrowserChrome; + NS_ENSURE_TRUE(mBrowserChrome, NS_ERROR_OUT_OF_MEMORY); + NS_ADDREF(mBrowserChrome); + mBrowserChrome->BrowserWindow(this); + + return NS_OK; +} + + +void CBrowserWindow::FinishCreate() +{ + // Initialize the top level widget + // This needs to be done AFTER the subviews are constructed + // but BEFORE the subviews do FinishCreateSelf. + + Rect portRect = GetMacPort()->portRect; + nsRect r(0, 0, portRect.right - portRect.left, portRect.bottom - portRect.top); + + nsresult rv = mWindow->Create((nsNativeWidget)GetMacPort(), r, nsnull, nsnull, nsnull, nsnull, nsnull); + if (NS_FAILED(rv)) + Throw_(NS_ERROR_GET_CODE(rv)); + + Inherited::FinishCreate(); +} + + +// --------------------------------------------------------------------------- +// ¥ FinishCreateSelf +// --------------------------------------------------------------------------- + +void CBrowserWindow::FinishCreateSelf() +{ + mBrowserShell = dynamic_cast(FindPaneByID(paneID_WebShellView)); + ThrowIfNULL_(mBrowserShell); // Curtains if we don't have this + + // Tell our CBrowserShell about ourself + mBrowserShell->SetTopLevelWindow(mBrowserChrome); + + // Find our subviews - When we have a way of creating this + // window with various chrome flags, we may or may not have + // all of these subviews so don't fail if they don't exist + mURLField = dynamic_cast(FindPaneByID(paneID_URLField)); + if (mURLField) + SwitchTarget(mURLField); + + mStatusBar = dynamic_cast(FindPaneByID(paneID_StatusBar)); + mThrobber = dynamic_cast(FindPaneByID(paneID_Throbber)); + + mBackButton = dynamic_cast(FindPaneByID(paneID_BackButton)); + if (mBackButton) + mBackButton->Disable(); + mForwardButton = dynamic_cast(FindPaneByID(paneID_ForwardButton)); + if (mForwardButton) + mForwardButton->Disable(); + mStopButton = dynamic_cast(FindPaneByID(paneID_StopButton)); + if (mStopButton) + mStopButton->Disable(); + + UReanimator::LinkListenerToControls(this, this, mUserCon); + StartListening(); + StartBroadcasting(); + + // Just for demo sake, load a URL + LStr255 urlString("http://www.mozilla.org"); + mBrowserShell->LoadURL((Ptr)&urlString[1], urlString.Length()); +} + + +void CBrowserWindow::ResizeFrameBy(SInt16 inWidthDelta, + SInt16 inHeightDelta, + Boolean inRefresh) +{ + Inherited::ResizeFrameBy(inWidthDelta, inHeightDelta, inRefresh); + + Rect portRect = GetMacPort()->portRect; + mWindow->Resize(portRect.right - portRect.left, portRect.bottom - portRect.top, inRefresh); +} + + +void CBrowserWindow::ShowSelf() +{ + Inherited::ShowSelf(); + mWindow->Show(PR_TRUE); +} + + +// --------------------------------------------------------------------------- +// ¥ ListenToMessage +// --------------------------------------------------------------------------- + +void CBrowserWindow::ListenToMessage(MessageT inMessage, + void* ioParam) +{ + ProcessCommand(inMessage, ioParam); +} + +// --------------------------------------------------------------------------- +// ¥ ObeyCommand +// --------------------------------------------------------------------------- + +Boolean CBrowserWindow::ObeyCommand(CommandT inCommand, + void *ioParam) +{ +#pragma unused(ioParam) + + Boolean cmdHandled = true; + + switch (inCommand) + { + case paneID_BackButton: + mBrowserShell->Back(); + break; + + case paneID_ForwardButton: + mBrowserShell->Forward(); + break; + + case paneID_StopButton: + mBrowserShell->Stop(); + break; + + case paneID_URLField: + { + SInt32 urlTextLen; + mURLField->GetText(nil, 0, &urlTextLen); + StPointerBlock urlTextPtr(urlTextLen, true, false); + mURLField->GetText(urlTextPtr.Get(), urlTextLen, &urlTextLen); + mBrowserShell->LoadURL(urlTextPtr.Get(), urlTextLen); + } + break; + + case CBrowserShell::cmd_Find: + mBrowserShell->Find(); + break; + + case CBrowserShell::cmd_FindNext: + mBrowserShell->FindNext(); + break; + + default: + cmdHandled = false; + break; + } + + if (!cmdHandled) + cmdHandled = Inherited::ObeyCommand(inCommand, ioParam); + return cmdHandled; +} + + +// --------------------------------------------------------------------------- +// ¥ FindCommandStatus +// --------------------------------------------------------------------------- +// This function enables menu commands. +// Although cmd_Find and cmd_FindNext are handled by CBrowserShell, we handle them +// here because we want them to be enabled even when the CBrowserShell is not in +// the target chain. + +void +CBrowserWindow::FindCommandStatus( + PP_PowerPlant::CommandT inCommand, + Boolean &outEnabled, + Boolean &outUsesMark, + PP_PowerPlant::Char16 &outMark, + Str255 outName) +{ + + switch (inCommand) + { + case CBrowserShell::cmd_Find: + outEnabled = true; + break; + + case CBrowserShell::cmd_FindNext: + outEnabled = mBrowserShell->CanFindNext(); + break; + + default: + PP_PowerPlant::LCommander::FindCommandStatus(inCommand, outEnabled, + outUsesMark, outMark, outName); + break; + } +} + + +NS_METHOD CBrowserWindow::GetWidget(nsIWidget** aWidget) +{ + NS_ENSURE_ARG_POINTER(aWidget); + + *aWidget = mWindow; + NS_IF_ADDREF(*aWidget); + + return NS_OK; +} + + +//***************************************************************************** +//*** Chrome Interraction +//***************************************************************************** + +NS_METHOD CBrowserWindow::SetStatus(const PRUnichar* aStatus) +{ + if (mStatusBar) + { + nsAutoString statusStr(aStatus); + Str255 aStr; + + UMacUnicode::StringToStr255(statusStr, aStr); + mStatusBar->SetDescriptor(aStr); + } + return NS_OK; +} + +NS_METHOD CBrowserWindow::SetLocation(const nsString& aLocation) +{ + if (mURLField) + { + Str255 aStr; + + UMacUnicode::StringToStr255(aLocation, aStr); + mURLField->SetDescriptor(aStr); + } + return NS_OK; +} + +NS_METHOD CBrowserWindow::BeginDocumentLoad(nsIDocumentLoader *aLoader, nsIURI *aURL, const char *aCommand) +{ + // Stop the throbber + if (mThrobber) + mThrobber->Start(); + + if (mStopButton) + mStopButton->Enable(); + + // Inform any other interested parties + // Actually, all of the above stuff should done through + // broadcasters and listeners. But for demo's sake this + // better shows what's happening. + LBroadcaster::BroadcastMessage(msg_OnStartLoadDocument, 0); + + return NS_OK; +} + +NS_METHOD CBrowserWindow::EndDocumentLoad(nsIDocumentLoader *loader, nsIChannel *aChannel, PRUint32 aStatus) +{ + // Stop the throbber + if (mThrobber) + mThrobber->Stop(); + + // Enable back, forward, stop + if (mBackButton) + mBrowserShell->CanGoBack() ? mBackButton->Enable() : mBackButton->Disable(); + if (mForwardButton) + mBrowserShell->CanGoForward() ? mForwardButton->Enable() : mForwardButton->Disable(); + if (mStopButton) + mStopButton->Disable(); + + // Inform any other interested parties + // Actually, all of the above stuff should done through + // broadcasters and listeners. But for demo's sake this + // better shows what's happening. + LBroadcaster::BroadcastMessage(msg_OnEndLoadDocument, 0); + + return NS_OK; +} + + +NS_METHOD CBrowserWindow::OnStatusNetStart(nsIChannel *aChannel) +{ + return NS_OK; +} + +NS_METHOD CBrowserWindow::OnStatusNetStop(nsIChannel *aChannel) +{ + return NS_OK; +} + +NS_METHOD CBrowserWindow::OnStatusDNS(nsIChannel *aChannel) +{ + return NS_OK; +} diff --git a/mozilla/embedding/browser/powerplant/source/CBrowserWindow.h b/mozilla/embedding/browser/powerplant/source/CBrowserWindow.h new file mode 100644 index 00000000000..70bf6feb036 --- /dev/null +++ b/mozilla/embedding/browser/powerplant/source/CBrowserWindow.h @@ -0,0 +1,111 @@ + +#include +#include + +#ifndef nsError_h +#include "nsError.h" +#endif + +#ifndef nsCom_h__ +#include "nsCom.h" +#endif + +#ifndef nsCOMPtr_h___ +#include "nsCOMPtr.h" +#endif + +#ifndef nscore_h___ +#include "nscore.h" +#endif + +#ifndef nsIWidget_h__ +#include "nsIWidget.h" +#endif + +class CBrowserShell; +class CWebBrowserChrome; +class LEditText; +class LStaticText; +class CThrobber; +class LBevelButton; +class nsIDocumentLoader; +class nsIURI; +class nsIChannel; + +// CBrowserWindow: +// A simple browser window that hooks up a CBrowserShell to a minimal set of controls +// (Back, Forward and Stop buttons + URL field + status bar). + + +class CBrowserWindow : public LWindow, + public LListener, + public LBroadcaster +{ +private: + typedef LWindow Inherited; + + friend class CWebBrowserChrome; + +public: + enum { class_ID = FOUR_CHAR_CODE('BroW') }; + + CBrowserWindow(); + CBrowserWindow(LStream* inStream); + + virtual ~CBrowserWindow(); + + + virtual void FinishCreate(); + virtual void FinishCreateSelf(); + virtual void ResizeFrameBy(SInt16 inWidthDelta, + SInt16 inHeightDelta, + Boolean inRefresh); + virtual void ShowSelf(); + + virtual void ListenToMessage(MessageT inMessage, + void* ioParam); + + virtual Boolean ObeyCommand(CommandT inCommand, + void *ioParam); + + virtual void FindCommandStatus(PP_PowerPlant::CommandT inCommand, + Boolean &outEnabled, + Boolean &outUsesMark, + PP_PowerPlant::Char16 &outMark, + Str255 outName); + + NS_METHOD GetWidget(nsIWidget** aWidget); +protected: + + // Called by both constructors + NS_METHOD CommonConstruct(); + + // ----------------------------------- + // Methods called by CWebBrowserChrome + // ----------------------------------- + + NS_METHOD SetStatus(const PRUnichar* aStatus); + NS_METHOD SetOverLink(const PRUnichar* aStatus) + { return SetStatus(aStatus); } + + NS_METHOD SetLocation(const nsString& aLocation); + + NS_METHOD BeginDocumentLoad(nsIDocumentLoader *aLoader, nsIURI *aURL, const char *aCommand); + NS_METHOD EndDocumentLoad(nsIDocumentLoader *loader, nsIChannel *aChannel, PRUint32 aStatus); + + NS_METHOD OnStatusNetStart(nsIChannel *aChannel); + NS_METHOD OnStatusNetStop(nsIChannel *aChannel); + NS_METHOD OnStatusDNS(nsIChannel *aChannel); + +protected: + nsCOMPtr mWindow; + + CBrowserShell* mBrowserShell; + CWebBrowserChrome* mBrowserChrome; + LEditText* mURLField; + LStaticText* mStatusBar; + CThrobber* mThrobber; + LBevelButton *mBackButton, *mForwardButton, *mStopButton; +}; + +