2011-11-29 23:29:02 +00:00
|
|
|
/**
|
|
|
|
* Creates an es.ContextView object.
|
|
|
|
*
|
|
|
|
* @class
|
|
|
|
* @constructor
|
|
|
|
* @param {jQuery} $overlay DOM selection to add nodes to
|
|
|
|
*/
|
|
|
|
es.ContextView = function( surfaceView, $overlay ) {
|
|
|
|
this.surfaceView = surfaceView;
|
|
|
|
this.$ = $( '<div class="es-contextView"></div>' ).appendTo( $overlay || $( 'body' ) );
|
2011-11-30 22:35:06 +00:00
|
|
|
this.$toolbar = $( '<div class="es-contextView-menuSection"></div>' );
|
2011-12-01 22:43:50 +00:00
|
|
|
this.$container = $( '<div class="es-contextView-container"></div>' )
|
|
|
|
.appendTo( this.$ );
|
2011-11-30 22:35:06 +00:00
|
|
|
this.$menu = $( '<div class="es-contextView-menu"></div>' )
|
|
|
|
.append( this.$toolbar )
|
2011-12-01 22:43:50 +00:00
|
|
|
.appendTo( this.$container );
|
|
|
|
this.$panels = $( '<div class="es-contextView-panels"></div>' )
|
|
|
|
.appendTo( this.$container );
|
2011-11-30 22:35:06 +00:00
|
|
|
this.$icon = $( '<div class="es-contextView-icon"></div>' )
|
|
|
|
.appendTo( this.$ );
|
2011-11-30 23:40:33 +00:00
|
|
|
this.toolbarView = new es.ToolbarView(
|
|
|
|
this.$toolbar,
|
|
|
|
this.surfaceView,
|
|
|
|
[{ 'name': 'textStyle', 'items' : [ 'bold', 'italic', 'formatting', 'clear' ] }]
|
|
|
|
);
|
2011-11-29 23:48:11 +00:00
|
|
|
|
|
|
|
// Example menu items
|
|
|
|
this.$menu.append(
|
2011-12-01 22:43:50 +00:00
|
|
|
'<div class="es-contextView-menuItem-break"></div>' +
|
|
|
|
'<div class="es-contextView-menuItem" rel="link">Link to...</div>' +
|
2011-11-30 00:06:46 +00:00
|
|
|
'<div class="es-contextView-menuItem-break"></div>' +
|
2011-11-29 23:48:11 +00:00
|
|
|
'<div class="es-contextView-menuItem">Copy</div>' +
|
2011-12-01 00:04:59 +00:00
|
|
|
'<div class="es-contextView-menuItem">Cut</div>' +
|
|
|
|
'<div class="es-contextView-menuItem">Paste</div>'
|
2011-11-29 23:48:11 +00:00
|
|
|
);
|
|
|
|
|
2011-12-01 22:43:50 +00:00
|
|
|
this.$panels.append(
|
|
|
|
'<div class="es-contextView-panel" rel="link">' +
|
|
|
|
'<div><label>Page title or URL <input type="text"></label></div>' +
|
|
|
|
'<div><a href="#cancel">Cancel</a> <button>Change</button></div>' +
|
|
|
|
'</div>'
|
|
|
|
);
|
|
|
|
|
2011-11-29 23:48:11 +00:00
|
|
|
// Events
|
|
|
|
var _this = this;
|
|
|
|
this.$icon.click( function() {
|
2011-12-01 22:43:50 +00:00
|
|
|
_this.$container.toggle();
|
|
|
|
} );
|
|
|
|
|
|
|
|
this.$menu.find( '[rel="link"]' ).click( function() {
|
|
|
|
_this.$menu.hide();
|
|
|
|
_this.$panels.find( '[rel="link"]' ).show();
|
|
|
|
_this.$panels.find( '[rel="link"] input:first' ).focus();
|
|
|
|
} );
|
|
|
|
this.$panels.find( 'button, [href="#cancel"]' ).click( function() {
|
|
|
|
_this.$menu.show();
|
|
|
|
_this.$panels.children().hide();
|
|
|
|
_this.$container.toggle();
|
|
|
|
_this.surfaceView.$input.focus();
|
|
|
|
return false;
|
2011-11-29 23:48:11 +00:00
|
|
|
} );
|
2011-11-29 23:29:02 +00:00
|
|
|
};
|
|
|
|
|
|
|
|
/* Methods */
|
|
|
|
|
|
|
|
es.ContextView.prototype.set = function() {
|
2011-12-01 22:43:50 +00:00
|
|
|
|
2011-11-30 00:48:46 +00:00
|
|
|
this.$.removeClass(
|
|
|
|
'es-contextView-position-below es-contextView-position-above ' +
|
2011-11-30 22:30:35 +00:00
|
|
|
'es-contextView-position-left es-contextView-position-right ' +
|
2011-11-30 01:23:37 +00:00
|
|
|
'es-contextView-position-start es-contextView-position-end'
|
2011-11-30 00:48:46 +00:00
|
|
|
);
|
2011-11-29 23:29:02 +00:00
|
|
|
var selection = this.surfaceView.getModel().getSelection(),
|
|
|
|
position,
|
2011-11-30 01:23:37 +00:00
|
|
|
offset;
|
2011-11-29 23:29:02 +00:00
|
|
|
if ( selection.from < selection.to ) {
|
|
|
|
var $lastRange = this.surfaceView.$.find( '.es-contentView-range:visible:last' );
|
|
|
|
if ( $lastRange.length ) {
|
|
|
|
offset = $lastRange.offset();
|
|
|
|
position = new es.Position(
|
|
|
|
offset.left + $lastRange.width(), offset.top + $lastRange.height()
|
|
|
|
);
|
2011-11-30 01:23:37 +00:00
|
|
|
this.$.addClass( 'es-contextView-position-end' );
|
2011-11-29 23:29:02 +00:00
|
|
|
}
|
|
|
|
} else if ( selection.from > selection.to ) {
|
|
|
|
var $firstRange = this.surfaceView.$.find( '.es-contentView-range:visible:first' );
|
|
|
|
if ( $firstRange.length ) {
|
|
|
|
offset = $firstRange.offset();
|
|
|
|
position = new es.Position( offset.left, offset.top );
|
2011-11-30 01:23:37 +00:00
|
|
|
this.$.addClass( 'es-contextView-position-start' );
|
2011-11-29 23:29:02 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
if ( position ) {
|
2011-12-01 22:43:50 +00:00
|
|
|
if ( position.left + this.$container.width() < $( 'body' ).width() ) {
|
2011-11-30 00:48:46 +00:00
|
|
|
this.$.addClass( 'es-contextView-position-left' );
|
|
|
|
} else {
|
|
|
|
this.$.addClass( 'es-contextView-position-right' );
|
|
|
|
}
|
2011-12-01 22:43:50 +00:00
|
|
|
if ( position.top + this.$container.height() < $( window ).height() + $( window ).scrollTop() ) {
|
2011-11-30 01:23:37 +00:00
|
|
|
this.$.addClass( 'es-contextView-position-below' );
|
|
|
|
} else {
|
|
|
|
this.$.addClass( 'es-contextView-position-above' );
|
|
|
|
}
|
2011-11-29 23:29:02 +00:00
|
|
|
this.$.css( { 'left': position.left, 'top': position.top } );
|
|
|
|
this.$icon.fadeIn( 'fast' );
|
|
|
|
}
|
|
|
|
};
|
|
|
|
|
|
|
|
es.ContextView.prototype.clear = function() {
|
|
|
|
this.$icon.hide();
|
2011-12-01 22:43:50 +00:00
|
|
|
this.$container.hide();
|
2011-11-29 23:29:02 +00:00
|
|
|
};
|