Cut,Copy,Paste"

From Documentation
m
m
Line 3: Line 3:
 
__TOC__
 
__TOC__
  
 +
===Purpose===
 
ZK Spreadsheet use Range to represents a cell, a row, a column, or selection of cells. We can use Range to get information or execute command. In here, we use Range to demonstrate how to implement cut, copy, and paste command.
 
ZK Spreadsheet use Range to represents a cell, a row, a column, or selection of cells. We can use Range to get information or execute command. In here, we use Range to demonstrate how to implement cut, copy, and paste command.
  
==Purpose==
 
 
Use menu or control key to execute cut, copy or paste command.<br/>
 
Use menu or control key to execute cut, copy or paste command.<br/>
 
For control key, use Ctrl + 'C' for copy, Ctrl + 'X' for cut, and Ctrl + 'V' for paste.
 
For control key, use Ctrl + 'C' for copy, Ctrl + 'X' for cut, and Ctrl + 'V' for paste.
  
==Copy function==
+
===Copy function===
 
1. We can construct Range object by Ranges, it has various functions, for example
 
1. We can construct Range object by Ranges, it has various functions, for example
 
<source lang="java" >
 
<source lang="java" >
Line 31: Line 31:
 
</source>
 
</source>
  
==Cut function==
+
===Cut function===
  
 
We can save a boolean object to distinguish between cut and paset command.<br/>
 
We can save a boolean object to distinguish between cut and paset command.<br/>
Line 49: Line 49:
 
</source>
 
</source>
  
==Paste function==
+
===Paste function===
 
We can use Range.copy(Range destination) to copy user's selection
 
We can use Range.copy(Range destination) to copy user's selection
  
Line 100: Line 100:
 
</source>
 
</source>
  
=Zul example=
+
===ZUML===
 
In zul, we declare a composer for event handling.   
 
In zul, we declare a composer for event handling.   
  
Line 123: Line 123:
 
</source>
 
</source>
  
=Composer=
+
===Composer===
 
In composer, we need to handle events, including onCellRightClick, Menuitem's onClick event and onCtrlKey event
 
In composer, we need to handle events, including onCellRightClick, Menuitem's onClick event and onCtrlKey event
  
 
In here, we use <javadoc>org.zkoss.zk.ui.util.GenericForwardComposer</javadoc>, it allow us to write intuitive onXxx$myid event handler methods and it can auto-wired variable.
 
In here, we use <javadoc>org.zkoss.zk.ui.util.GenericForwardComposer</javadoc>, it allow us to write intuitive onXxx$myid event handler methods and it can auto-wired variable.
  
==onCellRightClick==
+
====Open menu====
 
onCellRightClick is spreadsheet's event, this event occurs when user right click on a cell. We use this event to popup menu, allow user to select cut, copy or paste function.  
 
onCellRightClick is spreadsheet's event, this event occurs when user right click on a cell. We use this event to popup menu, allow user to select cut, copy or paste function.  
  
Line 139: Line 139:
 
</source>
 
</source>
  
==onClick==
+
====Execute command====
 
We can register menuitem's onClick event to execute corresponding command.
 
We can register menuitem's onClick event to execute corresponding command.
 
<source lang="java">
 
<source lang="java">
Line 155: Line 155:
 
</source>
 
</source>
  
==onCtrlKey==
+
====Use control key====
 
We can also register control key event to execute corresponding command.
 
We can also register control key event to execute corresponding command.
 
<source lang="java">
 
<source lang="java">

Revision as of 10:11, 22 November 2010


Purpose

ZK Spreadsheet use Range to represents a cell, a row, a column, or selection of cells. We can use Range to get information or execute command. In here, we use Range to demonstrate how to implement cut, copy, and paste command.

Use menu or control key to execute cut, copy or paste command.
For control key, use Ctrl + 'C' for copy, Ctrl + 'X' for cut, and Ctrl + 'V' for paste.

Copy function

1. We can construct Range object by Ranges, it has various functions, for example

Ranges.range(sheet, "A1:D4");

2. We can use AbstractComponent.getAttribute(String) to save user's current selection range

private void setSource() {
	Rect selectedRect = spreadsheet.getSelection();
	Range range = Ranges.range(spreadsheet.getSelectedSheet(), 
				selectedRect.getTop(), 
				selectedRect.getLeft(), 
				selectedRect.getBottom(),
				selectedRect.getRight());

        //save user selection range
	spreadsheet.setAttribute(KEY_SOURCE_RANGE, range);
	spreadsheet.setAttribute(KEY_SOURCE_RECT, selectedRect);
	}

Cut function

We can save a boolean object to distinguish between cut and paset command.
The reason why we need save this is variable is because paste function needs to know whether is cut or paste.
If cut, we need to clear previous selection's content; if copy, we can keep previous selection.

private void onCut() {
   spreadsheet.setAttribute(KEY_IS_CUT, Boolean.valueOf(true));
.....
}

private boolean isCut() {
	return Boolean.valueOf( 
			(Boolean)spreadsheet.getAttribute(KEY_IS_CUT));
}

Paste function

We can use Range.copy(Range destination) to copy user's selection

1. Retrieve user's previous selection. Refer to Copy, Cut
We can retrieve by AbstractComponent.getAttribute(String, Object), for example

private void onPaste() {
   Range srcRange = (Range)spreadsheet.getAttribute(KEY_SOURCE_RANGE);
   Rect srcRect = (Rect)spreadsheet.getAttribute(KEY_SOURCE_RECT);
....

2. Construct destination Range object

After we get previous selection range and current position, we can construct destination Range, and execute copy

int columnCount = srcRect.getRight() - srcRect.getLeft();
int rowCount = srcRect.getBottom() - srcRect.getTop();

Rect dstRect = spreadsheet.getSelection();
int rowIndex = dstRect.getTop();
int columnIndex = dstRect.getLeft();

Range dst = Ranges.range(spreadsheet.getSelectedSheet(),
					rowIndex, 
					columnIndex, 
					rowIndex + rowCount, 
					columnIndex + columnCount);
srcRange.copy(dst);

3. If command is cut, clear highlight area of spreadsheet and clear previous selection's content.

private void clearCutRangeIfNeeded() {
	if (!isCut())
		return;
		
	Range srcRange = (Range)spreadsheet.getAttribute(KEY_SOURCE_RANGE);
	srcRange.clearContents();
	/* clear cell style*/
	CellStyle defaultCellStyle = spreadsheet.getBook().getCellStyleAt((short)0);
	srcRange.setStyle(defaultCellStyle);
}


private void clearHighlightIfNeeded() {
	if (isCut())
		spreadsheet.setHighlight(null);
}

ZUML

In zul, we declare a composer for event handling.

<zk>
	<div height="100%" width="100%" apply="demo.CopyPasteComposer">
		<spreadsheet id="spreadsheet" 
			src="/demo_sample.xls"
			maxrows="200" 
			maxcolumns="40" 
			vflex="1" 
			width="100%"
			ctrlKeys="^c^v^x">
		</spreadsheet>
		<menupopup id="cellMenu">
			<menuitem id="cutMenu" label="Cut" />
			<menuitem id="copyMenu" label="Copy" />
			<menuitem id="pasteMenu" label="Paste" />
		</menupopup>
	</div>
</zk>

Composer

In composer, we need to handle events, including onCellRightClick, Menuitem's onClick event and onCtrlKey event

In here, we use GenericForwardComposer, it allow us to write intuitive onXxx$myid event handler methods and it can auto-wired variable.

Open menu

onCellRightClick is spreadsheet's event, this event occurs when user right click on a cell. We use this event to popup menu, allow user to select cut, copy or paste function.

Also, we can retrieve mouse position from CellMouseEvent and set menupopup's popup position.

public void onCellRightClick$spreadsheet(CellMouseEvent event) {
	cellMenu.open(event.getClientx(),  event.getClienty());
}

Execute command

We can register menuitem's onClick event to execute corresponding command.

public void onClick$cutMenu() {
	onCut();
}
	
public void onClick$copyMenu(Event evt) {
	onCopy();
}

public void onClick$pasteMenu(Event evt) {
	onPaste();
}

Use control key

We can also register control key event to execute corresponding command.

public void onCtrlKey$spreadsheet(KeyEvent evt) {
	if (evt.isCtrlKey()) {
		switch (evt.getKeyCode()) {
		case 'C':
			onCopy();
			break;
		case 'V':
			onPaste();
			break;
		case 'X':
			onCut();
			break;
		}
			
		}
	}

Version History

Last Update : 2010/11/22


Version Date Content
     


All source code listed in this book is at Github.


Last Update : 2010/11/22

Copyright © Potix Corporation. This article is licensed under GNU Free Documentation License.