File:  [mozdev] / chimera / ContentClickListener.mm
Revision 1.9: download - view: text, annotated - select for diffs - revision graph
Sun Apr 14 08:43:03 2002 UTC (17 years, 7 months ago) by hyatt
Branches: MAIN
CVS tags: HEAD
So many changes I can't even go into it. :)

    1: /* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
    2: /* ***** BEGIN LICENSE BLOCK *****
    3:  * Version: NPL 1.1/GPL 2.0/LGPL 2.1
    4:  *
    5:  * The contents of this file are subject to the Netscape Public License
    6:  * Version 1.1 (the "License"); you may not use this file except in
    7:  * compliance with the License. You may obtain a copy of the License at
    8:  * http://www.mozilla.org/NPL/
    9:  *
   10:  * Software distributed under the License is distributed on an "AS IS" basis,
   11:  * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
   12:  * for the specific language governing rights and limitations under the
   13:  * License.
   14:  *
   15:  * The Original Code is mozilla.org code.
   16:  *
   17:  * The Initial Developer of the Original Code is 
   18:  * Netscape Communications Corporation.
   19:  * Portions created by the Initial Developer are Copyright (C) 2002
   20:  * the Initial Developer. All Rights Reserved.
   21:  *
   22:  * Contributor(s):
   23:  *
   24:  * Alternatively, the contents of this file may be used under the terms of
   25:  * either the GNU General Public License Version 2 or later (the "GPL"), or 
   26:  * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
   27:  * in which case the provisions of the GPL or the LGPL are applicable instead
   28:  * of those above. If you wish to allow use of your version of this file only
   29:  * under the terms of either the GPL or the LGPL, and not to allow others to
   30:  * use your version of this file under the terms of the NPL, indicate your
   31:  * decision by deleting the provisions above and replace them with the notice
   32:  * and other provisions required by the GPL or the LGPL. If you do not delete
   33:  * the provisions above, a recipient may use your version of this file under
   34:  * the terms of any one of the NPL, the GPL or the LGPL.
   35:  *
   36:  * ***** END LICENSE BLOCK ***** */
   37: 
   38: #include "nsCOMPtr.h"
   39: #include "ContentClickListener.h"
   40: #include "nsIDOMEventTarget.h"
   41: #include "nsIContent.h"
   42: #include "nsIAtom.h"
   43: #include "nsIDOMElement.h"
   44: #include "nsString.h"
   45: #include "nsUnicharUtils.h"
   46: #include "nsIPrefBranch.h"
   47: #include "nsIDOMMouseEvent.h"
   48: #include "nsEmbedAPI.h"
   49: 
   50: // Common helper routines (also used by the context menu code)
   51: #include "GeckoUtils.h"
   52: 
   53: NS_IMPL_ISUPPORTS2(ContentClickListener, nsIDOMMouseListener, nsIDOMEventListener);
   54: 
   55: ContentClickListener::ContentClickListener(id aBrowserController)
   56: :mBrowserController(aBrowserController)
   57: {
   58:   NS_INIT_ISUPPORTS();
   59: }
   60: 
   61: ContentClickListener::~ContentClickListener()
   62: {
   63: 
   64: }
   65: 
   66: NS_IMETHODIMP
   67: ContentClickListener::MouseClick(nsIDOMEvent* aEvent)
   68: {
   69:   nsCOMPtr<nsIDOMEventTarget> target;
   70:   aEvent->GetTarget(getter_AddRefs(target));
   71:   if (!target)
   72:     return NS_OK;
   73:   nsCOMPtr<nsIDOMNode> content(do_QueryInterface(target));
   74: 
   75:   nsCOMPtr<nsIDOMElement> linkContent;
   76:   nsAutoString href;
   77:   GeckoUtils::GetEnclosingLinkElementAndHref(content, getter_AddRefs(linkContent), href);
   78:   
   79:   // XXXdwh Handle simple XLINKs if we want to be compatible with Mozilla, but who
   80:   // really uses these anyway? :)
   81:   if (!linkContent || href.IsEmpty())
   82:     return NS_OK;
   83: 
   84:   nsCOMPtr<nsIPrefBranch> pref(do_GetService("@mozilla.org/preferences-service;1"));
   85:   if (!pref)
   86:     return NS_OK; // Something bad happened if we can't get prefs.
   87:     
   88:   PRUint16 button;
   89:   nsCOMPtr<nsIDOMMouseEvent> mouseEvent(do_QueryInterface(aEvent));
   90:   mouseEvent->GetButton(&button);
   91: 
   92:   PRBool metaKey, shiftKey, altKey;
   93:   mouseEvent->GetMetaKey(&metaKey);
   94:   mouseEvent->GetShiftKey(&shiftKey);
   95:   mouseEvent->GetAltKey(&altKey);
   96: 
   97:   NSString* hrefStr = [NSString stringWithCharacters: href.get() length:nsCRT::strlen(href.get())];
   98:   NSURL* linkURL = [NSURL URLWithString: hrefStr];
   99: 
  100:   if ((metaKey && button == 0) || button == 1) {
  101:     // The command key is down or we got a middle click.  Open the link in a new window or tab.
  102:     PRBool useTab;
  103:     pref->GetBoolPref("browser.tabs.opentabfor.middleclick", &useTab);
  104:     PRBool loadInBackground;
  105:     pref->GetBoolPref("browser.tabs.loadInBackground", &loadInBackground);
  106:     if (shiftKey)
  107:       loadInBackground = !loadInBackground;
  108:     if (useTab)
  109:       [mBrowserController openNewTabWithURL: linkURL loadInBackground: loadInBackground];
  110:     else
  111:       [mBrowserController openNewWindowWithURL: linkURL loadInBackground: loadInBackground];
  112:   }
  113:   else if (altKey) {
  114:     // The user wants to save this link.
  115:     nsAutoString text;
  116:     GeckoUtils::GatherTextUnder(content, text);
  117: 
  118:     [mBrowserController saveURL: nil filterList: nil
  119:               url: linkURL suggestedFilename: [NSString stringWithCharacters: text.get()
  120:                                                                       length: nsCRT::strlen(text.get())]];
  121:   }
  122: 
  123:   return NS_OK;
  124: }

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>