1 22 23 package org.gjt.sp.jedit; 24 25 import java.awt.datatransfer.*; 27 import java.awt.Toolkit ; 28 import java.io.*; 29 30 import org.gjt.sp.jedit.buffer.JEditBuffer; 31 import org.gjt.sp.jedit.gui.HistoryModel; 32 import org.gjt.sp.jedit.textarea.TextArea; 33 import org.gjt.sp.jedit.textarea.Selection; 34 import org.gjt.sp.util.Log; 35 37 62 public class Registers 63 { 64 73 public static void copy(TextArea textArea, char register) 74 { 75 String selection = textArea.getSelectedText(); 76 if(selection == null) 77 return; 78 79 setRegister(register,selection); 80 HistoryModel.getModel("clipboard").addItem(selection); 81 82 } 84 93 public static void cut(TextArea textArea, char register) 94 { 95 if(textArea.isEditable()) 96 { 97 String selection = textArea.getSelectedText(); 98 if(selection == null) 99 return; 100 101 setRegister(register,selection); 102 HistoryModel.getModel("clipboard").addItem(selection); 103 104 textArea.setSelectedText(""); 105 } 106 else 107 textArea.getToolkit().beep(); 108 } 110 117 public static void append(TextArea textArea, char register) 118 { 119 append(textArea,register,"\n",false); 120 } 122 129 public static void append(TextArea textArea, char register, 130 String separator) 131 { 132 append(textArea,register,separator,false); 133 } 135 144 public static void append(TextArea textArea, char register, 145 String separator, boolean cut) 146 { 147 if(cut && !textArea.isEditable()) 148 { 149 textArea.getToolkit().beep(); 150 return; 151 } 152 153 String selection = textArea.getSelectedText(); 154 if(selection == null) 155 return; 156 157 Register reg = getRegister(register); 158 159 if(reg != null) 160 { 161 String registerContents = reg.toString(); 162 if(registerContents != null) 163 { 164 if(registerContents.endsWith(separator)) 165 selection = registerContents + selection; 166 else 167 selection = registerContents + separator + selection; 168 } 169 } 170 171 setRegister(register,selection); 172 HistoryModel.getModel("clipboard").addItem(selection); 173 174 if(cut) 175 textArea.setSelectedText(""); 176 } 178 185 public static void paste(TextArea textArea, char register) 186 { 187 paste(textArea,register,false); 188 } 190 198 public static void paste(TextArea textArea, char register, 199 boolean vertical) 200 { 201 if(!textArea.isEditable()) 202 { 203 textArea.getToolkit().beep(); 204 return; 205 } 206 207 Register reg = getRegister(register); 208 209 if(reg == null) 210 { 211 textArea.getToolkit().beep(); 212 return; 213 } 214 215 String selection = reg.toString(); 216 if(selection == null) 217 { 218 textArea.getToolkit().beep(); 219 return; 220 } 221 JEditBuffer buffer = textArea.getBuffer(); 222 try 223 { 224 buffer.beginCompoundEdit(); 225 226 227 if(vertical && textArea.getSelectionCount() == 0) 228 { 229 int caret = textArea.getCaretPosition(); 230 int caretLine = textArea.getCaretLine(); 231 Selection.Rect rect = new Selection.Rect( 232 caretLine,caret,caretLine,caret); 233 textArea.setSelectedText(rect,selection); 234 caretLine = textArea.getCaretLine(); 235 236 if(caretLine != textArea.getLineCount() - 1) 237 { 238 int startColumn = rect.getStartColumn( 239 buffer); 240 int offset = buffer 241 .getOffsetOfVirtualColumn( 242 caretLine + 1,startColumn,null); 243 if(offset == -1) 244 { 245 buffer.insertAtColumn(caretLine + 1,startColumn,""); 246 textArea.setCaretPosition( 247 buffer.getLineEndOffset( 248 caretLine + 1) - 1); 249 } 250 else 251 { 252 textArea.setCaretPosition( 253 buffer.getLineStartOffset( 254 caretLine + 1) + offset); 255 } 256 } 257 } 258 else 259 { 260 textArea.replaceSelection(selection); 261 } 262 } 263 finally { 264 buffer.endCompoundEdit(); 265 } 266 HistoryModel.getModel("clipboard").addItem(selection); 267 } 269 274 public static Register getRegister(char name) 275 { 276 if(name != '$' && name != '%') 277 { 278 if(!loaded) 279 loadRegisters(); 280 } 281 282 if(registers == null || name >= registers.length) 283 return null; 284 else 285 return registers[name]; 286 } 288 294 public static void setRegister(char name, Register newRegister) 295 { 296 touchRegister(name); 297 298 if(name >= registers.length) 299 { 300 Register[] newRegisters = new Register[ 301 Math.min(1<<16, name<<1)]; 302 System.arraycopy(registers,0,newRegisters,0, 303 registers.length); 304 registers = newRegisters; 305 } 306 307 registers[name] = newRegister; 308 if (listener != null) 309 listener.registerChanged(name); 310 } 312 318 public static void setRegister(char name, String value) 319 { 320 touchRegister(name); 321 Register register = getRegister(name); 322 if(register != null) 323 { 324 register.setValue(value); 325 if (listener != null) 326 listener.registerChanged(name); 327 } 328 else 329 setRegister(name,new StringRegister(value)); 330 } 332 337 public static void clearRegister(char name) 338 { 339 if(name >= registers.length) 340 return; 341 342 Register register = registers[name]; 343 if(name == '$' || name == '%') 344 register.setValue(""); 345 else 346 { 347 registers[name] = null; 348 modified = true; 349 } 350 } 352 357 public static Register[] getRegisters() 358 { 359 if(!loaded) 360 loadRegisters(); 361 return registers; 362 } 364 370 public static String getRegisterStatusPrompt(String action) 371 { 372 String registerNameString = getRegisterNameString(); 373 return jEdit.getProperty("view.status." + action, 374 new String [] {registerNameString == null ? 375 jEdit.getProperty("view.status.no-registers") : 376 registerNameString}); 377 } 379 385 public static String getRegisterNameString() 386 { 387 if(!loaded) 388 loadRegisters(); 389 390 StringBuilder buf = new StringBuilder (registers.length << 1); 391 for(int i = 0; i < registers.length; i++) 392 { 393 if(registers[i] != null) 394 { 395 if(buf.length() != 0) 396 buf.append(' '); 397 buf.append((char)i); 398 } 399 } 400 401 if(buf.length() == 0) 402 return null; 403 else 404 return buf.toString(); 405 } 407 public static void saveRegisters() 409 { 410 if(!loaded || !modified) 411 return; 412 413 if (saver != null) 414 { 415 saver.saveRegisters(); 416 modified = false; 417 } 418 } 420 public static void setListener(RegistersListener listener) 422 { 423 Registers.listener = listener; 424 } 426 public static void setSaver(RegisterSaver saver) 428 { 429 Registers.saver = saver; 430 } 432 public static boolean isLoading() 434 { 435 return loading; 436 } 438 public static void setLoading(boolean loading) 440 { 441 Registers.loading = loading; 442 } 444 private static Register[] registers; 446 private static boolean loaded, loading; 447 private static RegisterSaver saver; 448 private static RegistersListener listener; 449 453 private static boolean modified; 454 455 private Registers() {} 456 457 static 458 { 459 registers = new Register[256]; 460 Toolkit toolkit = Toolkit.getDefaultToolkit(); 461 registers['$'] = new ClipboardRegister( 462 toolkit.getSystemClipboard()); 463 Clipboard selection = toolkit.getSystemSelection(); 464 if(selection != null) 465 registers['%'] = new ClipboardRegister(selection); 466 } 467 468 private static void touchRegister(char name) 470 { 471 if(name == '%' || name == '$') 472 return; 473 474 if(!loaded) 475 loadRegisters(); 476 477 if(!loading) 478 modified = true; 479 } 481 private static void loadRegisters() 483 { 484 if (saver != null) 485 { 486 loaded = true; 487 saver.loadRegisters(); 488 } 489 } 491 493 495 499 public interface Register 500 { 501 504 String toString(); 505 506 509 void setValue(String value); 510 } 512 517 public static class ClipboardRegister implements Register 518 { 519 Clipboard clipboard; 520 521 public ClipboardRegister(Clipboard clipboard) 522 { 523 this.clipboard = clipboard; 524 } 525 526 529 public void setValue(String value) 530 { 531 StringSelection selection = new StringSelection(value); 532 clipboard.setContents(selection,null); 533 } 534 535 538 public String toString() 539 { 540 try 541 { 542 543 if (false) { 544 554 Log.log(Log.DEBUG,this,"clipboard.getContents(this)="+clipboard.getContents(this)+'.'); 555 debugListDataFlavors(clipboard.getContents(this)); 556 } 557 558 String selection = (String )clipboard 559 .getContents(this).getTransferData( 560 DataFlavor.stringFlavor); 561 562 boolean trailingEOL = selection.endsWith("\n") 563 || selection.endsWith(System.getProperty( 564 "line.separator")); 565 566 BufferedReader in = new BufferedReader( 570 new StringReader(selection)); 571 StringBuilder buf = new StringBuilder (); 572 String line; 573 while((line = in.readLine()) != null) 574 { 575 if(line.endsWith("\0")) 578 { 579 line = line.substring(0, 580 line.length() - 1); 581 } 582 buf.append(line); 583 buf.append('\n'); 584 } 585 if(!trailingEOL && buf.length() != 0) 587 buf.setLength(buf.length() - 1); 588 return buf.toString(); 589 } 590 catch(Exception e) 591 { 592 Log.log(Log.NOTICE,this,e); 593 return null; 594 } 595 } 596 } 598 protected static void debugListDataFlavors(Transferable transferable) { 599 DataFlavor[] dataFlavors = transferable.getTransferDataFlavors(); 600 601 for (int i = 0;i<dataFlavors.length;i++) { 602 DataFlavor dataFlavor = dataFlavors[i]; 603 604 Log.log(Log.DEBUG,Registers.class,"debugListDataFlavors(): dataFlavor="+dataFlavor+'.'); 605 606 } 607 608 if (dataFlavors.length==0) { 609 Log.log(Log.DEBUG,Registers.class,"debugListDataFlavors(): no dataFlavor supported."); 610 } 611 } 612 613 617 public static class StringRegister implements Register 618 { 619 private String value; 620 621 625 public StringRegister(String value) 626 { 627 this.value = value; 628 } 629 630 633 public void setValue(String value) 634 { 635 this.value = value; 636 } 637 638 641 public String toString() 642 { 643 return value; 644 } 645 646 650 public void dispose() {} 651 } 653 } 655 | Popular Tags |