1.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000 1.2 +++ b/editor/libeditor/base/nsEditorCommands.cpp Wed Dec 31 06:09:35 2014 +0100 1.3 @@ -0,0 +1,922 @@ 1.4 +/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ 1.5 +/* This Source Code Form is subject to the terms of the Mozilla Public 1.6 + * License, v. 2.0. If a copy of the MPL was not distributed with this 1.7 + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ 1.8 + 1.9 + 1.10 +#include "mozFlushType.h" 1.11 +#include "mozilla/Assertions.h" 1.12 +#include "nsCOMPtr.h" 1.13 +#include "nsCRT.h" 1.14 +#include "nsDebug.h" 1.15 +#include "nsEditorCommands.h" 1.16 +#include "nsError.h" 1.17 +#include "nsIClipboard.h" 1.18 +#include "nsICommandParams.h" 1.19 +#include "nsID.h" 1.20 +#include "nsIDOMDocument.h" 1.21 +#include "nsIDocument.h" 1.22 +#include "nsIEditor.h" 1.23 +#include "nsIEditorMailSupport.h" 1.24 +#include "nsIPlaintextEditor.h" 1.25 +#include "nsISelection.h" 1.26 +#include "nsISelectionController.h" 1.27 +#include "nsITransferable.h" 1.28 +#include "nsString.h" 1.29 +#include "nsAString.h" 1.30 + 1.31 +class nsISupports; 1.32 + 1.33 + 1.34 +#define STATE_ENABLED "state_enabled" 1.35 +#define STATE_DATA "state_data" 1.36 + 1.37 + 1.38 +nsBaseEditorCommand::nsBaseEditorCommand() 1.39 +{ 1.40 +} 1.41 + 1.42 +NS_IMPL_ISUPPORTS(nsBaseEditorCommand, nsIControllerCommand) 1.43 + 1.44 + 1.45 +NS_IMETHODIMP 1.46 +nsUndoCommand::IsCommandEnabled(const char * aCommandName, 1.47 + nsISupports *aCommandRefCon, 1.48 + bool *outCmdEnabled) 1.49 +{ 1.50 + NS_ENSURE_ARG_POINTER(outCmdEnabled); 1.51 + nsCOMPtr<nsIEditor> editor = do_QueryInterface(aCommandRefCon); 1.52 + if (editor) 1.53 + { 1.54 + bool isEnabled, isEditable = false; 1.55 + nsresult rv = editor->GetIsSelectionEditable(&isEditable); 1.56 + NS_ENSURE_SUCCESS(rv, rv); 1.57 + if (isEditable) 1.58 + return editor->CanUndo(&isEnabled, outCmdEnabled); 1.59 + } 1.60 + 1.61 + *outCmdEnabled = false; 1.62 + return NS_OK; 1.63 +} 1.64 + 1.65 + 1.66 +NS_IMETHODIMP 1.67 +nsUndoCommand::DoCommand(const char *aCommandName, nsISupports *aCommandRefCon) 1.68 +{ 1.69 + nsCOMPtr<nsIEditor> editor = do_QueryInterface(aCommandRefCon); 1.70 + if (editor) 1.71 + return editor->Undo(1); 1.72 + 1.73 + return NS_ERROR_FAILURE; 1.74 +} 1.75 + 1.76 +NS_IMETHODIMP 1.77 +nsUndoCommand::DoCommandParams(const char *aCommandName, 1.78 + nsICommandParams *aParams, 1.79 + nsISupports *aCommandRefCon) 1.80 +{ 1.81 + return DoCommand(aCommandName, aCommandRefCon); 1.82 +} 1.83 + 1.84 +NS_IMETHODIMP 1.85 +nsUndoCommand::GetCommandStateParams(const char *aCommandName, 1.86 + nsICommandParams *aParams, 1.87 + nsISupports *aCommandRefCon) 1.88 +{ 1.89 + bool canUndo; 1.90 + IsCommandEnabled(aCommandName, aCommandRefCon, &canUndo); 1.91 + return aParams->SetBooleanValue(STATE_ENABLED,canUndo); 1.92 +} 1.93 + 1.94 +NS_IMETHODIMP 1.95 +nsRedoCommand::IsCommandEnabled(const char * aCommandName, 1.96 + nsISupports *aCommandRefCon, 1.97 + bool *outCmdEnabled) 1.98 +{ 1.99 + NS_ENSURE_ARG_POINTER(outCmdEnabled); 1.100 + nsCOMPtr<nsIEditor> editor = do_QueryInterface(aCommandRefCon); 1.101 + if (editor) 1.102 + { 1.103 + bool isEnabled, isEditable = false; 1.104 + nsresult rv = editor->GetIsSelectionEditable(&isEditable); 1.105 + NS_ENSURE_SUCCESS(rv, rv); 1.106 + if (isEditable) 1.107 + return editor->CanRedo(&isEnabled, outCmdEnabled); 1.108 + } 1.109 + 1.110 + *outCmdEnabled = false; 1.111 + return NS_OK; 1.112 +} 1.113 + 1.114 + 1.115 +NS_IMETHODIMP 1.116 +nsRedoCommand::DoCommand(const char *aCommandName, nsISupports *aCommandRefCon) 1.117 +{ 1.118 + nsCOMPtr<nsIEditor> editor = do_QueryInterface(aCommandRefCon); 1.119 + if (editor) 1.120 + return editor->Redo(1); 1.121 + 1.122 + return NS_ERROR_FAILURE; 1.123 +} 1.124 + 1.125 +NS_IMETHODIMP 1.126 +nsRedoCommand::DoCommandParams(const char *aCommandName, 1.127 + nsICommandParams *aParams, 1.128 + nsISupports *aCommandRefCon) 1.129 +{ 1.130 + return DoCommand(aCommandName, aCommandRefCon); 1.131 +} 1.132 + 1.133 +NS_IMETHODIMP 1.134 +nsRedoCommand::GetCommandStateParams(const char *aCommandName, 1.135 + nsICommandParams *aParams, 1.136 + nsISupports *aCommandRefCon) 1.137 +{ 1.138 + bool canUndo; 1.139 + IsCommandEnabled(aCommandName, aCommandRefCon, &canUndo); 1.140 + return aParams->SetBooleanValue(STATE_ENABLED,canUndo); 1.141 +} 1.142 + 1.143 +NS_IMETHODIMP 1.144 +nsClearUndoCommand::IsCommandEnabled(const char * aCommandName, 1.145 + nsISupports *refCon, bool *outCmdEnabled) 1.146 +{ 1.147 + NS_ENSURE_ARG_POINTER(outCmdEnabled); 1.148 + nsCOMPtr<nsIEditor> editor = do_QueryInterface(refCon); 1.149 + if (editor) 1.150 + return editor->GetIsSelectionEditable(outCmdEnabled); 1.151 + 1.152 + *outCmdEnabled = false; 1.153 + return NS_OK; 1.154 +} 1.155 + 1.156 + 1.157 +NS_IMETHODIMP 1.158 +nsClearUndoCommand::DoCommand(const char *aCommandName, nsISupports *refCon) 1.159 +{ 1.160 + nsCOMPtr<nsIEditor> editor = do_QueryInterface(refCon); 1.161 + NS_ENSURE_TRUE(editor, NS_ERROR_NOT_IMPLEMENTED); 1.162 + 1.163 + editor->EnableUndo(false); // Turning off undo clears undo/redo stacks. 1.164 + editor->EnableUndo(true); // This re-enables undo/redo. 1.165 + 1.166 + return NS_OK; 1.167 +} 1.168 + 1.169 +NS_IMETHODIMP 1.170 +nsClearUndoCommand::DoCommandParams(const char *aCommandName, 1.171 + nsICommandParams *aParams, 1.172 + nsISupports *refCon) 1.173 +{ 1.174 + return DoCommand(aCommandName, refCon); 1.175 +} 1.176 + 1.177 +NS_IMETHODIMP 1.178 +nsClearUndoCommand::GetCommandStateParams(const char *aCommandName, 1.179 + nsICommandParams *aParams, 1.180 + nsISupports *refCon) 1.181 +{ 1.182 + NS_ENSURE_ARG_POINTER(aParams); 1.183 + 1.184 + bool enabled; 1.185 + nsresult rv = IsCommandEnabled(aCommandName, refCon, &enabled); 1.186 + NS_ENSURE_SUCCESS(rv, rv); 1.187 + 1.188 + return aParams->SetBooleanValue(STATE_ENABLED, enabled); 1.189 +} 1.190 + 1.191 +NS_IMETHODIMP 1.192 +nsCutCommand::IsCommandEnabled(const char * aCommandName, 1.193 + nsISupports *aCommandRefCon, 1.194 + bool *outCmdEnabled) 1.195 +{ 1.196 + NS_ENSURE_ARG_POINTER(outCmdEnabled); 1.197 + nsCOMPtr<nsIEditor> editor = do_QueryInterface(aCommandRefCon); 1.198 + if (editor) 1.199 + { 1.200 + bool isEditable = false; 1.201 + nsresult rv = editor->GetIsSelectionEditable(&isEditable); 1.202 + NS_ENSURE_SUCCESS(rv, rv); 1.203 + if (isEditable) 1.204 + return editor->CanCut(outCmdEnabled); 1.205 + } 1.206 + 1.207 + *outCmdEnabled = false; 1.208 + return NS_OK; 1.209 +} 1.210 + 1.211 + 1.212 +NS_IMETHODIMP 1.213 +nsCutCommand::DoCommand(const char *aCommandName, nsISupports *aCommandRefCon) 1.214 +{ 1.215 + nsCOMPtr<nsIEditor> editor = do_QueryInterface(aCommandRefCon); 1.216 + if (editor) 1.217 + return editor->Cut(); 1.218 + 1.219 + return NS_ERROR_FAILURE; 1.220 +} 1.221 + 1.222 +NS_IMETHODIMP 1.223 +nsCutCommand::DoCommandParams(const char *aCommandName, 1.224 + nsICommandParams *aParams, 1.225 + nsISupports *aCommandRefCon) 1.226 +{ 1.227 + return DoCommand(aCommandName, aCommandRefCon); 1.228 +} 1.229 + 1.230 +NS_IMETHODIMP 1.231 +nsCutCommand::GetCommandStateParams(const char *aCommandName, 1.232 + nsICommandParams *aParams, 1.233 + nsISupports *aCommandRefCon) 1.234 +{ 1.235 + bool canUndo; 1.236 + IsCommandEnabled(aCommandName, aCommandRefCon, &canUndo); 1.237 + return aParams->SetBooleanValue(STATE_ENABLED,canUndo); 1.238 +} 1.239 + 1.240 + 1.241 +NS_IMETHODIMP 1.242 +nsCutOrDeleteCommand::IsCommandEnabled(const char * aCommandName, 1.243 + nsISupports *aCommandRefCon, 1.244 + bool *outCmdEnabled) 1.245 +{ 1.246 + NS_ENSURE_ARG_POINTER(outCmdEnabled); 1.247 + nsCOMPtr<nsIEditor> editor = do_QueryInterface(aCommandRefCon); 1.248 + if (editor) 1.249 + return editor->GetIsSelectionEditable(outCmdEnabled); 1.250 + 1.251 + *outCmdEnabled = false; 1.252 + return NS_OK; 1.253 +} 1.254 + 1.255 + 1.256 +NS_IMETHODIMP 1.257 +nsCutOrDeleteCommand::DoCommand(const char *aCommandName, 1.258 + nsISupports *aCommandRefCon) 1.259 +{ 1.260 + nsCOMPtr<nsIEditor> editor = do_QueryInterface(aCommandRefCon); 1.261 + if (editor) 1.262 + { 1.263 + nsCOMPtr<nsISelection> selection; 1.264 + nsresult rv = editor->GetSelection(getter_AddRefs(selection)); 1.265 + if (NS_SUCCEEDED(rv) && selection && selection->Collapsed()) { 1.266 + return editor->DeleteSelection(nsIEditor::eNext, nsIEditor::eStrip); 1.267 + } 1.268 + return editor->Cut(); 1.269 + } 1.270 + 1.271 + return NS_ERROR_FAILURE; 1.272 +} 1.273 + 1.274 +NS_IMETHODIMP 1.275 +nsCutOrDeleteCommand::DoCommandParams(const char *aCommandName, 1.276 + nsICommandParams *aParams, 1.277 + nsISupports *aCommandRefCon) 1.278 +{ 1.279 + return DoCommand(aCommandName, aCommandRefCon); 1.280 +} 1.281 + 1.282 +NS_IMETHODIMP 1.283 +nsCutOrDeleteCommand::GetCommandStateParams(const char *aCommandName, 1.284 + nsICommandParams *aParams, 1.285 + nsISupports *aCommandRefCon) 1.286 +{ 1.287 + bool canUndo; 1.288 + IsCommandEnabled(aCommandName, aCommandRefCon, &canUndo); 1.289 + return aParams->SetBooleanValue(STATE_ENABLED,canUndo); 1.290 +} 1.291 + 1.292 +NS_IMETHODIMP 1.293 +nsCopyCommand::IsCommandEnabled(const char * aCommandName, 1.294 + nsISupports *aCommandRefCon, 1.295 + bool *outCmdEnabled) 1.296 +{ 1.297 + NS_ENSURE_ARG_POINTER(outCmdEnabled); 1.298 + nsCOMPtr<nsIEditor> editor = do_QueryInterface(aCommandRefCon); 1.299 + if (editor) 1.300 + return editor->CanCopy(outCmdEnabled); 1.301 + 1.302 + *outCmdEnabled = false; 1.303 + return NS_OK; 1.304 +} 1.305 + 1.306 + 1.307 +NS_IMETHODIMP 1.308 +nsCopyCommand::DoCommand(const char *aCommandName, nsISupports *aCommandRefCon) 1.309 +{ 1.310 + nsCOMPtr<nsIEditor> editor = do_QueryInterface(aCommandRefCon); 1.311 + if (editor) 1.312 + return editor->Copy(); 1.313 + 1.314 + return NS_ERROR_FAILURE; 1.315 +} 1.316 + 1.317 +NS_IMETHODIMP 1.318 +nsCopyCommand::DoCommandParams(const char *aCommandName, 1.319 + nsICommandParams *aParams, 1.320 + nsISupports *aCommandRefCon) 1.321 +{ 1.322 + return DoCommand(aCommandName, aCommandRefCon); 1.323 +} 1.324 + 1.325 +NS_IMETHODIMP 1.326 +nsCopyCommand::GetCommandStateParams(const char *aCommandName, 1.327 + nsICommandParams *aParams, 1.328 + nsISupports *aCommandRefCon) 1.329 +{ 1.330 + bool canUndo; 1.331 + IsCommandEnabled(aCommandName, aCommandRefCon, &canUndo); 1.332 + return aParams->SetBooleanValue(STATE_ENABLED,canUndo); 1.333 +} 1.334 + 1.335 +NS_IMETHODIMP 1.336 +nsCopyOrDeleteCommand::IsCommandEnabled(const char * aCommandName, 1.337 + nsISupports *aCommandRefCon, 1.338 + bool *outCmdEnabled) 1.339 +{ 1.340 + NS_ENSURE_ARG_POINTER(outCmdEnabled); 1.341 + nsCOMPtr<nsIEditor> editor = do_QueryInterface(aCommandRefCon); 1.342 + if (editor) 1.343 + return editor->GetIsSelectionEditable(outCmdEnabled); 1.344 + 1.345 + *outCmdEnabled = false; 1.346 + return NS_OK; 1.347 +} 1.348 + 1.349 + 1.350 +NS_IMETHODIMP 1.351 +nsCopyOrDeleteCommand::DoCommand(const char *aCommandName, 1.352 + nsISupports *aCommandRefCon) 1.353 +{ 1.354 + nsCOMPtr<nsIEditor> editor = do_QueryInterface(aCommandRefCon); 1.355 + if (editor) 1.356 + { 1.357 + nsCOMPtr<nsISelection> selection; 1.358 + nsresult rv = editor->GetSelection(getter_AddRefs(selection)); 1.359 + if (NS_SUCCEEDED(rv) && selection && selection->Collapsed()) { 1.360 + return editor->DeleteSelection(nsIEditor::eNextWord, nsIEditor::eStrip); 1.361 + } 1.362 + return editor->Copy(); 1.363 + } 1.364 + 1.365 + return NS_ERROR_FAILURE; 1.366 +} 1.367 + 1.368 +NS_IMETHODIMP 1.369 +nsCopyOrDeleteCommand::DoCommandParams(const char *aCommandName, 1.370 + nsICommandParams *aParams, 1.371 + nsISupports *aCommandRefCon) 1.372 +{ 1.373 + return DoCommand(aCommandName, aCommandRefCon); 1.374 +} 1.375 + 1.376 +NS_IMETHODIMP 1.377 +nsCopyOrDeleteCommand::GetCommandStateParams(const char *aCommandName, 1.378 + nsICommandParams *aParams, 1.379 + nsISupports *aCommandRefCon) 1.380 +{ 1.381 + bool canUndo; 1.382 + IsCommandEnabled(aCommandName, aCommandRefCon, &canUndo); 1.383 + return aParams->SetBooleanValue(STATE_ENABLED,canUndo); 1.384 +} 1.385 + 1.386 +NS_IMETHODIMP 1.387 +nsPasteCommand::IsCommandEnabled(const char *aCommandName, 1.388 + nsISupports *aCommandRefCon, 1.389 + bool *outCmdEnabled) 1.390 +{ 1.391 + NS_ENSURE_ARG_POINTER(outCmdEnabled); 1.392 + nsCOMPtr<nsIEditor> editor = do_QueryInterface(aCommandRefCon); 1.393 + if (editor) 1.394 + { 1.395 + bool isEditable = false; 1.396 + nsresult rv = editor->GetIsSelectionEditable(&isEditable); 1.397 + NS_ENSURE_SUCCESS(rv, rv); 1.398 + if (isEditable) 1.399 + return editor->CanPaste(nsIClipboard::kGlobalClipboard, outCmdEnabled); 1.400 + } 1.401 + 1.402 + *outCmdEnabled = false; 1.403 + return NS_OK; 1.404 +} 1.405 + 1.406 + 1.407 +NS_IMETHODIMP 1.408 +nsPasteCommand::DoCommand(const char *aCommandName, nsISupports *aCommandRefCon) 1.409 +{ 1.410 + nsCOMPtr<nsIEditor> editor = do_QueryInterface(aCommandRefCon); 1.411 + NS_ENSURE_TRUE(editor, NS_ERROR_FAILURE); 1.412 + 1.413 + return editor->Paste(nsIClipboard::kGlobalClipboard); 1.414 +} 1.415 + 1.416 +NS_IMETHODIMP 1.417 +nsPasteCommand::DoCommandParams(const char *aCommandName, 1.418 + nsICommandParams *aParams, 1.419 + nsISupports *aCommandRefCon) 1.420 +{ 1.421 + return DoCommand(aCommandName, aCommandRefCon); 1.422 +} 1.423 + 1.424 +NS_IMETHODIMP 1.425 +nsPasteCommand::GetCommandStateParams(const char *aCommandName, 1.426 + nsICommandParams *aParams, 1.427 + nsISupports *aCommandRefCon) 1.428 +{ 1.429 + bool canUndo; 1.430 + IsCommandEnabled(aCommandName, aCommandRefCon, &canUndo); 1.431 + return aParams->SetBooleanValue(STATE_ENABLED,canUndo); 1.432 +} 1.433 + 1.434 +NS_IMETHODIMP 1.435 +nsPasteTransferableCommand::IsCommandEnabled(const char *aCommandName, 1.436 + nsISupports *aCommandRefCon, 1.437 + bool *outCmdEnabled) 1.438 +{ 1.439 + NS_ENSURE_ARG_POINTER(outCmdEnabled); 1.440 + nsCOMPtr<nsIEditor> editor = do_QueryInterface(aCommandRefCon); 1.441 + if (editor) 1.442 + { 1.443 + bool isEditable = false; 1.444 + nsresult rv = editor->GetIsSelectionEditable(&isEditable); 1.445 + NS_ENSURE_SUCCESS(rv, rv); 1.446 + if (isEditable) 1.447 + return editor->CanPasteTransferable(nullptr, outCmdEnabled); 1.448 + } 1.449 + 1.450 + *outCmdEnabled = false; 1.451 + return NS_OK; 1.452 +} 1.453 + 1.454 +NS_IMETHODIMP 1.455 +nsPasteTransferableCommand::DoCommand(const char *aCommandName, nsISupports *aCommandRefCon) 1.456 +{ 1.457 + return NS_ERROR_FAILURE; 1.458 +} 1.459 + 1.460 +NS_IMETHODIMP 1.461 +nsPasteTransferableCommand::DoCommandParams(const char *aCommandName, 1.462 + nsICommandParams *aParams, 1.463 + nsISupports *aCommandRefCon) 1.464 +{ 1.465 + nsCOMPtr<nsIEditor> editor = do_QueryInterface(aCommandRefCon); 1.466 + NS_ENSURE_TRUE(editor, NS_ERROR_FAILURE); 1.467 + 1.468 + nsCOMPtr<nsISupports> supports; 1.469 + aParams->GetISupportsValue("transferable", getter_AddRefs(supports)); 1.470 + NS_ENSURE_TRUE(supports, NS_ERROR_FAILURE); 1.471 + 1.472 + nsCOMPtr<nsITransferable> trans = do_QueryInterface(supports); 1.473 + NS_ENSURE_TRUE(trans, NS_ERROR_FAILURE); 1.474 + 1.475 + return editor->PasteTransferable(trans); 1.476 +} 1.477 + 1.478 +NS_IMETHODIMP 1.479 +nsPasteTransferableCommand::GetCommandStateParams(const char *aCommandName, 1.480 + nsICommandParams *aParams, 1.481 + nsISupports *aCommandRefCon) 1.482 +{ 1.483 + nsCOMPtr<nsIEditor> editor = do_QueryInterface(aCommandRefCon); 1.484 + NS_ENSURE_TRUE(editor, NS_ERROR_FAILURE); 1.485 + 1.486 + nsCOMPtr<nsITransferable> trans; 1.487 + 1.488 + nsCOMPtr<nsISupports> supports; 1.489 + aParams->GetISupportsValue("transferable", getter_AddRefs(supports)); 1.490 + if (supports) { 1.491 + trans = do_QueryInterface(supports); 1.492 + NS_ENSURE_TRUE(trans, NS_ERROR_FAILURE); 1.493 + } 1.494 + 1.495 + bool canPaste; 1.496 + nsresult rv = editor->CanPasteTransferable(trans, &canPaste); 1.497 + NS_ENSURE_SUCCESS(rv, rv); 1.498 + 1.499 + return aParams->SetBooleanValue(STATE_ENABLED, canPaste); 1.500 +} 1.501 + 1.502 +NS_IMETHODIMP 1.503 +nsSwitchTextDirectionCommand::IsCommandEnabled(const char *aCommandName, 1.504 + nsISupports *aCommandRefCon, 1.505 + bool *outCmdEnabled) 1.506 +{ 1.507 + NS_ENSURE_ARG_POINTER(outCmdEnabled); 1.508 + nsCOMPtr<nsIEditor> editor = do_QueryInterface(aCommandRefCon); 1.509 + if (editor) 1.510 + return editor->GetIsSelectionEditable(outCmdEnabled); 1.511 + 1.512 + *outCmdEnabled = false; 1.513 + return NS_OK; 1.514 +} 1.515 + 1.516 +NS_IMETHODIMP 1.517 +nsSwitchTextDirectionCommand::DoCommand(const char *aCommandName, nsISupports *aCommandRefCon) 1.518 +{ 1.519 + nsCOMPtr<nsIEditor> editor = do_QueryInterface(aCommandRefCon); 1.520 + NS_ENSURE_TRUE(editor, NS_ERROR_FAILURE); 1.521 + 1.522 + return editor->SwitchTextDirection(); 1.523 +} 1.524 + 1.525 +NS_IMETHODIMP 1.526 +nsSwitchTextDirectionCommand::DoCommandParams(const char *aCommandName, 1.527 + nsICommandParams *aParams, 1.528 + nsISupports *aCommandRefCon) 1.529 +{ 1.530 + return DoCommand(aCommandName, aCommandRefCon); 1.531 +} 1.532 + 1.533 +NS_IMETHODIMP 1.534 +nsSwitchTextDirectionCommand::GetCommandStateParams(const char *aCommandName, 1.535 + nsICommandParams *aParams, 1.536 + nsISupports *aCommandRefCon) 1.537 +{ 1.538 + bool canSwitchTextDirection = true; 1.539 + IsCommandEnabled(aCommandName, aCommandRefCon, &canSwitchTextDirection); 1.540 + return aParams->SetBooleanValue(STATE_ENABLED, canSwitchTextDirection); 1.541 +} 1.542 + 1.543 +NS_IMETHODIMP 1.544 +nsDeleteCommand::IsCommandEnabled(const char* aCommandName, 1.545 + nsISupports* aCommandRefCon, 1.546 + bool* outCmdEnabled) 1.547 +{ 1.548 + NS_ENSURE_ARG_POINTER(outCmdEnabled); 1.549 + nsCOMPtr<nsIEditor> editor = do_QueryInterface(aCommandRefCon); 1.550 + *outCmdEnabled = false; 1.551 + 1.552 + NS_ENSURE_TRUE(editor, NS_OK); 1.553 + 1.554 + // We can generally delete whenever the selection is editable. However, 1.555 + // cmd_delete doesn't make sense if the selection is collapsed because it's 1.556 + // directionless, which is the same condition under which we can't cut. 1.557 + nsresult rv = editor->GetIsSelectionEditable(outCmdEnabled); 1.558 + NS_ENSURE_SUCCESS(rv, rv); 1.559 + 1.560 + if (!nsCRT::strcmp("cmd_delete", aCommandName) && *outCmdEnabled) { 1.561 + rv = editor->CanCut(outCmdEnabled); 1.562 + NS_ENSURE_SUCCESS(rv, rv); 1.563 + } 1.564 + 1.565 + return NS_OK; 1.566 +} 1.567 + 1.568 + 1.569 +NS_IMETHODIMP 1.570 +nsDeleteCommand::DoCommand(const char* aCommandName, 1.571 + nsISupports* aCommandRefCon) 1.572 +{ 1.573 + nsCOMPtr<nsIEditor> editor = do_QueryInterface(aCommandRefCon); 1.574 + NS_ENSURE_TRUE(editor, NS_ERROR_FAILURE); 1.575 + 1.576 + nsIEditor::EDirection deleteDir = nsIEditor::eNone; 1.577 + 1.578 + if (!nsCRT::strcmp("cmd_delete", aCommandName)) { 1.579 + // Really this should probably be eNone, but it only makes a difference if 1.580 + // the selection is collapsed, and then this command is disabled. So let's 1.581 + // keep it as it always was to avoid breaking things. 1.582 + deleteDir = nsIEditor::ePrevious; 1.583 + } else if (!nsCRT::strcmp("cmd_deleteCharForward", aCommandName)) { 1.584 + deleteDir = nsIEditor::eNext; 1.585 + } else if (!nsCRT::strcmp("cmd_deleteCharBackward", aCommandName)) { 1.586 + deleteDir = nsIEditor::ePrevious; 1.587 + } else if (!nsCRT::strcmp("cmd_deleteWordBackward", aCommandName)) { 1.588 + deleteDir = nsIEditor::ePreviousWord; 1.589 + } else if (!nsCRT::strcmp("cmd_deleteWordForward", aCommandName)) { 1.590 + deleteDir = nsIEditor::eNextWord; 1.591 + } else if (!nsCRT::strcmp("cmd_deleteToBeginningOfLine", aCommandName)) { 1.592 + deleteDir = nsIEditor::eToBeginningOfLine; 1.593 + } else if (!nsCRT::strcmp("cmd_deleteToEndOfLine", aCommandName)) { 1.594 + deleteDir = nsIEditor::eToEndOfLine; 1.595 + } else { 1.596 + MOZ_CRASH("Unrecognized nsDeleteCommand"); 1.597 + } 1.598 + 1.599 + return editor->DeleteSelection(deleteDir, nsIEditor::eStrip); 1.600 +} 1.601 + 1.602 +NS_IMETHODIMP 1.603 +nsDeleteCommand::DoCommandParams(const char *aCommandName, 1.604 + nsICommandParams *aParams, 1.605 + nsISupports *aCommandRefCon) 1.606 +{ 1.607 + return DoCommand(aCommandName, aCommandRefCon); 1.608 +} 1.609 + 1.610 +NS_IMETHODIMP 1.611 +nsDeleteCommand::GetCommandStateParams(const char *aCommandName, 1.612 + nsICommandParams *aParams, 1.613 + nsISupports *aCommandRefCon) 1.614 +{ 1.615 + bool canUndo; 1.616 + IsCommandEnabled(aCommandName, aCommandRefCon, &canUndo); 1.617 + return aParams->SetBooleanValue(STATE_ENABLED,canUndo); 1.618 +} 1.619 + 1.620 +NS_IMETHODIMP 1.621 +nsSelectAllCommand::IsCommandEnabled(const char * aCommandName, 1.622 + nsISupports *aCommandRefCon, 1.623 + bool *outCmdEnabled) 1.624 +{ 1.625 + NS_ENSURE_ARG_POINTER(outCmdEnabled); 1.626 + 1.627 + nsresult rv = NS_OK; 1.628 + // You can always select all, unless the selection is editable, 1.629 + // and the editable region is empty! 1.630 + *outCmdEnabled = true; 1.631 + bool docIsEmpty; 1.632 + 1.633 + // you can select all if there is an editor which is non-empty 1.634 + nsCOMPtr<nsIEditor> editor = do_QueryInterface(aCommandRefCon); 1.635 + if (editor) { 1.636 + rv = editor->GetDocumentIsEmpty(&docIsEmpty); 1.637 + NS_ENSURE_SUCCESS(rv, rv); 1.638 + *outCmdEnabled = !docIsEmpty; 1.639 + } 1.640 + 1.641 + return rv; 1.642 +} 1.643 + 1.644 + 1.645 +NS_IMETHODIMP 1.646 +nsSelectAllCommand::DoCommand(const char *aCommandName, 1.647 + nsISupports *aCommandRefCon) 1.648 +{ 1.649 + nsCOMPtr<nsIEditor> editor = do_QueryInterface(aCommandRefCon); 1.650 + if (editor) 1.651 + return editor->SelectAll(); 1.652 + 1.653 + return NS_ERROR_FAILURE; 1.654 +} 1.655 + 1.656 +NS_IMETHODIMP 1.657 +nsSelectAllCommand::DoCommandParams(const char *aCommandName, 1.658 + nsICommandParams *aParams, 1.659 + nsISupports *aCommandRefCon) 1.660 +{ 1.661 + return DoCommand(aCommandName, aCommandRefCon); 1.662 +} 1.663 + 1.664 +NS_IMETHODIMP 1.665 +nsSelectAllCommand::GetCommandStateParams(const char *aCommandName, 1.666 + nsICommandParams *aParams, 1.667 + nsISupports *aCommandRefCon) 1.668 +{ 1.669 + bool canUndo; 1.670 + IsCommandEnabled(aCommandName, aCommandRefCon, &canUndo); 1.671 + return aParams->SetBooleanValue(STATE_ENABLED,canUndo); 1.672 +} 1.673 + 1.674 + 1.675 +NS_IMETHODIMP 1.676 +nsSelectionMoveCommands::IsCommandEnabled(const char * aCommandName, 1.677 + nsISupports *aCommandRefCon, 1.678 + bool *outCmdEnabled) 1.679 +{ 1.680 + NS_ENSURE_ARG_POINTER(outCmdEnabled); 1.681 + nsCOMPtr<nsIEditor> editor = do_QueryInterface(aCommandRefCon); 1.682 + if (editor) 1.683 + return editor->GetIsSelectionEditable(outCmdEnabled); 1.684 + 1.685 + *outCmdEnabled = false; 1.686 + return NS_OK; 1.687 +} 1.688 + 1.689 +NS_IMETHODIMP 1.690 +nsSelectionMoveCommands::DoCommand(const char *aCommandName, 1.691 + nsISupports *aCommandRefCon) 1.692 +{ 1.693 + nsCOMPtr<nsIEditor> editor = do_QueryInterface(aCommandRefCon); 1.694 + NS_ENSURE_TRUE(editor, NS_ERROR_FAILURE); 1.695 + 1.696 + nsCOMPtr<nsIDOMDocument> domDoc; 1.697 + editor->GetDocument(getter_AddRefs(domDoc)); 1.698 + nsCOMPtr<nsIDocument> doc = do_QueryInterface(domDoc); 1.699 + if (doc) { 1.700 + // Most of the commands below (possibly all of them) need layout to 1.701 + // be up to date. 1.702 + doc->FlushPendingNotifications(Flush_Layout); 1.703 + } 1.704 + 1.705 + nsCOMPtr<nsISelectionController> selCont; 1.706 + nsresult rv = editor->GetSelectionController(getter_AddRefs(selCont)); 1.707 + NS_ENSURE_SUCCESS(rv, rv); 1.708 + NS_ENSURE_TRUE(selCont, NS_ERROR_FAILURE); 1.709 + 1.710 + // complete scroll commands 1.711 + if (!nsCRT::strcmp(aCommandName,"cmd_scrollTop")) 1.712 + return selCont->CompleteScroll(false); 1.713 + else if (!nsCRT::strcmp(aCommandName,"cmd_scrollBottom")) 1.714 + return selCont->CompleteScroll(true); 1.715 + 1.716 + // complete move commands 1.717 + else if (!nsCRT::strcmp(aCommandName,"cmd_moveTop")) 1.718 + return selCont->CompleteMove(false, false); 1.719 + else if (!nsCRT::strcmp(aCommandName,"cmd_moveBottom")) 1.720 + return selCont->CompleteMove(true, false); 1.721 + else if (!nsCRT::strcmp(aCommandName,"cmd_selectTop")) 1.722 + return selCont->CompleteMove(false, true); 1.723 + else if (!nsCRT::strcmp(aCommandName,"cmd_selectBottom")) 1.724 + return selCont->CompleteMove(true, true); 1.725 + 1.726 + // line move commands 1.727 + else if (!nsCRT::strcmp(aCommandName,"cmd_lineNext")) 1.728 + return selCont->LineMove(true, false); 1.729 + else if (!nsCRT::strcmp(aCommandName,"cmd_linePrevious")) 1.730 + return selCont->LineMove(false, false); 1.731 + else if (!nsCRT::strcmp(aCommandName,"cmd_selectLineNext")) 1.732 + return selCont->LineMove(true, true); 1.733 + else if (!nsCRT::strcmp(aCommandName,"cmd_selectLinePrevious")) 1.734 + return selCont->LineMove(false, true); 1.735 + 1.736 + // character move commands 1.737 + else if (!nsCRT::strcmp(aCommandName,"cmd_charPrevious")) 1.738 + return selCont->CharacterMove(false, false); 1.739 + else if (!nsCRT::strcmp(aCommandName,"cmd_charNext")) 1.740 + return selCont->CharacterMove(true, false); 1.741 + else if (!nsCRT::strcmp(aCommandName,"cmd_selectCharPrevious")) 1.742 + return selCont->CharacterMove(false, true); 1.743 + else if (!nsCRT::strcmp(aCommandName,"cmd_selectCharNext")) 1.744 + return selCont->CharacterMove(true, true); 1.745 + 1.746 + // intra line move commands 1.747 + else if (!nsCRT::strcmp(aCommandName,"cmd_beginLine")) 1.748 + return selCont->IntraLineMove(false, false); 1.749 + else if (!nsCRT::strcmp(aCommandName,"cmd_endLine")) 1.750 + return selCont->IntraLineMove(true, false); 1.751 + else if (!nsCRT::strcmp(aCommandName,"cmd_selectBeginLine")) 1.752 + return selCont->IntraLineMove(false, true); 1.753 + else if (!nsCRT::strcmp(aCommandName,"cmd_selectEndLine")) 1.754 + return selCont->IntraLineMove(true, true); 1.755 + 1.756 + // word move commands 1.757 + else if (!nsCRT::strcmp(aCommandName,"cmd_wordPrevious")) 1.758 + return selCont->WordMove(false, false); 1.759 + else if (!nsCRT::strcmp(aCommandName,"cmd_wordNext")) 1.760 + return selCont->WordMove(true, false); 1.761 + else if (!nsCRT::strcmp(aCommandName,"cmd_selectWordPrevious")) 1.762 + return selCont->WordMove(false, true); 1.763 + else if (!nsCRT::strcmp(aCommandName,"cmd_selectWordNext")) 1.764 + return selCont->WordMove(true, true); 1.765 + 1.766 + // scroll page commands 1.767 + else if (!nsCRT::strcmp(aCommandName,"cmd_scrollPageUp")) 1.768 + return selCont->ScrollPage(false); 1.769 + else if (!nsCRT::strcmp(aCommandName,"cmd_scrollPageDown")) 1.770 + return selCont->ScrollPage(true); 1.771 + 1.772 + // scroll line commands 1.773 + else if (!nsCRT::strcmp(aCommandName,"cmd_scrollLineUp")) 1.774 + return selCont->ScrollLine(false); 1.775 + else if (!nsCRT::strcmp(aCommandName,"cmd_scrollLineDown")) 1.776 + return selCont->ScrollLine(true); 1.777 + 1.778 + // page move commands 1.779 + else if (!nsCRT::strcmp(aCommandName,"cmd_movePageUp")) 1.780 + return selCont->PageMove(false, false); 1.781 + else if (!nsCRT::strcmp(aCommandName,"cmd_movePageDown")) 1.782 + return selCont->PageMove(true, false); 1.783 + else if (!nsCRT::strcmp(aCommandName,"cmd_selectPageUp")) 1.784 + return selCont->PageMove(false, true); 1.785 + else if (!nsCRT::strcmp(aCommandName,"cmd_selectPageDown")) 1.786 + return selCont->PageMove(true, true); 1.787 + 1.788 + return NS_ERROR_FAILURE; 1.789 +} 1.790 + 1.791 +NS_IMETHODIMP 1.792 +nsSelectionMoveCommands::DoCommandParams(const char *aCommandName, 1.793 + nsICommandParams *aParams, 1.794 + nsISupports *aCommandRefCon) 1.795 +{ 1.796 + return DoCommand(aCommandName, aCommandRefCon); 1.797 +} 1.798 + 1.799 +NS_IMETHODIMP 1.800 +nsSelectionMoveCommands::GetCommandStateParams(const char *aCommandName, 1.801 + nsICommandParams *aParams, 1.802 + nsISupports *aCommandRefCon) 1.803 +{ 1.804 + bool canUndo; 1.805 + IsCommandEnabled(aCommandName, aCommandRefCon, &canUndo); 1.806 + return aParams->SetBooleanValue(STATE_ENABLED,canUndo); 1.807 +} 1.808 + 1.809 + 1.810 +NS_IMETHODIMP 1.811 +nsInsertPlaintextCommand::IsCommandEnabled(const char * aCommandName, 1.812 + nsISupports *refCon, 1.813 + bool *outCmdEnabled) 1.814 +{ 1.815 + NS_ENSURE_ARG_POINTER(outCmdEnabled); 1.816 + nsCOMPtr<nsIEditor> editor = do_QueryInterface(refCon); 1.817 + if (editor) 1.818 + return editor->GetIsSelectionEditable(outCmdEnabled); 1.819 + 1.820 + *outCmdEnabled = false; 1.821 + return NS_ERROR_NOT_IMPLEMENTED; 1.822 +} 1.823 + 1.824 + 1.825 +NS_IMETHODIMP 1.826 +nsInsertPlaintextCommand::DoCommand(const char *aCommandName, 1.827 + nsISupports *refCon) 1.828 +{ 1.829 + return NS_ERROR_NOT_IMPLEMENTED; 1.830 +} 1.831 + 1.832 +NS_IMETHODIMP 1.833 +nsInsertPlaintextCommand::DoCommandParams(const char *aCommandName, 1.834 + nsICommandParams *aParams, 1.835 + nsISupports *refCon) 1.836 +{ 1.837 + NS_ENSURE_ARG_POINTER(aParams); 1.838 + 1.839 + nsCOMPtr<nsIPlaintextEditor> editor = do_QueryInterface(refCon); 1.840 + NS_ENSURE_TRUE(editor, NS_ERROR_NOT_IMPLEMENTED); 1.841 + 1.842 + // Get text to insert from command params 1.843 + nsAutoString text; 1.844 + nsresult rv = aParams->GetStringValue(STATE_DATA, text); 1.845 + NS_ENSURE_SUCCESS(rv, rv); 1.846 + 1.847 + if (!text.IsEmpty()) 1.848 + return editor->InsertText(text); 1.849 + 1.850 + return NS_OK; 1.851 +} 1.852 + 1.853 +NS_IMETHODIMP 1.854 +nsInsertPlaintextCommand::GetCommandStateParams(const char *aCommandName, 1.855 + nsICommandParams *aParams, 1.856 + nsISupports *refCon) 1.857 +{ 1.858 + NS_ENSURE_ARG_POINTER(aParams); 1.859 + 1.860 + bool outCmdEnabled = false; 1.861 + IsCommandEnabled(aCommandName, refCon, &outCmdEnabled); 1.862 + return aParams->SetBooleanValue(STATE_ENABLED, outCmdEnabled); 1.863 +} 1.864 + 1.865 + 1.866 +NS_IMETHODIMP 1.867 +nsPasteQuotationCommand::IsCommandEnabled(const char * aCommandName, 1.868 + nsISupports *refCon, 1.869 + bool *outCmdEnabled) 1.870 +{ 1.871 + NS_ENSURE_ARG_POINTER(outCmdEnabled); 1.872 + 1.873 + nsCOMPtr<nsIEditor> editor = do_QueryInterface(refCon); 1.874 + nsCOMPtr<nsIEditorMailSupport> mailEditor = do_QueryInterface(refCon); 1.875 + if (editor && mailEditor) { 1.876 + uint32_t flags; 1.877 + editor->GetFlags(&flags); 1.878 + if (!(flags & nsIPlaintextEditor::eEditorSingleLineMask)) 1.879 + return editor->CanPaste(nsIClipboard::kGlobalClipboard, outCmdEnabled); 1.880 + } 1.881 + 1.882 + *outCmdEnabled = false; 1.883 + return NS_OK; 1.884 +} 1.885 + 1.886 + 1.887 +NS_IMETHODIMP 1.888 +nsPasteQuotationCommand::DoCommand(const char *aCommandName, 1.889 + nsISupports *refCon) 1.890 +{ 1.891 + nsCOMPtr<nsIEditorMailSupport> mailEditor = do_QueryInterface(refCon); 1.892 + if (mailEditor) 1.893 + return mailEditor->PasteAsQuotation(nsIClipboard::kGlobalClipboard); 1.894 + 1.895 + return NS_ERROR_NOT_IMPLEMENTED; 1.896 +} 1.897 + 1.898 +NS_IMETHODIMP 1.899 +nsPasteQuotationCommand::DoCommandParams(const char *aCommandName, 1.900 + nsICommandParams *aParams, 1.901 + nsISupports *refCon) 1.902 +{ 1.903 + nsCOMPtr<nsIEditorMailSupport> mailEditor = do_QueryInterface(refCon); 1.904 + if (mailEditor) 1.905 + return mailEditor->PasteAsQuotation(nsIClipboard::kGlobalClipboard); 1.906 + 1.907 + return NS_ERROR_NOT_IMPLEMENTED; 1.908 +} 1.909 + 1.910 +NS_IMETHODIMP 1.911 +nsPasteQuotationCommand::GetCommandStateParams(const char *aCommandName, 1.912 + nsICommandParams *aParams, 1.913 + nsISupports *refCon) 1.914 +{ 1.915 + nsCOMPtr<nsIEditor> editor = do_QueryInterface(refCon); 1.916 + if (editor) 1.917 + { 1.918 + bool enabled = false; 1.919 + editor->CanPaste(nsIClipboard::kGlobalClipboard, &enabled); 1.920 + aParams->SetBooleanValue(STATE_ENABLED, enabled); 1.921 + } 1.922 + 1.923 + return NS_OK; 1.924 +} 1.925 +