Skip to content
This repository has been archived by the owner on Jun 26, 2020. It is now read-only.

Commit

Permalink
Merge pull request #115 from ckeditor/t/ckeditor5-ui/442
Browse files Browse the repository at this point in the history
Other: Aligned `tableToolbar` to the widget toolbar repository. Closes #107.
  • Loading branch information
Piotr Jasiun authored Sep 20, 2018
2 parents 76857ba + 5086cfd commit e276e66
Show file tree
Hide file tree
Showing 2 changed files with 12 additions and 122 deletions.
128 changes: 9 additions & 119 deletions src/tabletoolbar.js
Original file line number Diff line number Diff line change
Expand Up @@ -8,17 +8,13 @@
*/

import Plugin from '@ckeditor/ckeditor5-core/src/plugin';
import ToolbarView from '@ckeditor/ckeditor5-ui/src/toolbar/toolbarview';
import ContextualBalloon from '@ckeditor/ckeditor5-ui/src/panel/balloon/contextualballoon';
import { isTableWidgetSelected, isTableContentSelected } from './utils';
import { repositionContextualBalloon, getBalloonPositionData } from './ui/utils';

const balloonClassName = 'ck-toolbar-container';
import { isTableContentSelected } from './utils';
import WidgetToolbarRepository from '@ckeditor/ckeditor5-widget/src/widgettoolbarrepository';

/**
* The table toolbar class. It creates a table toolbar that shows up when the table widget is selected.
* The table toolbar class. It creates a table toolbar that shows up when the table content is selected.
*
* Instanecs of toolbar components (e.g. buttons) are created using the editor's
* Instances of toolbar components (e.g. buttons) are created using the editor's
* {@link module:ui/componentfactory~ComponentFactory component factory}
* based on the {@link module:table/table~TableConfig#toolbar `table.toolbar` configuration option}.
*
Expand All @@ -31,7 +27,7 @@ export default class TableToolbar extends Plugin {
* @inheritDoc
*/
static get requires() {
return [ ContextualBalloon ];
return [ WidgetToolbarRepository ];
}

/**
Expand All @@ -41,123 +37,17 @@ export default class TableToolbar extends Plugin {
return 'TableToolbar';
}

/**
* @inheritDoc
*/
init() {
const editor = this.editor;
const balloonToolbar = editor.plugins.get( 'BalloonToolbar' );

// If the `BalloonToolbar` plugin is loaded, it should be disabled for tables
// which have their own toolbar to avoid duplication.
// https://github.com/ckeditor/ckeditor5-image/issues/110
if ( balloonToolbar ) {
this.listenTo( balloonToolbar, 'show', evt => {
if ( isTableWidgetSelected( editor.editing.view.document.selection ) ) {
evt.stop();
}
}, { priority: 'high' } );
}
}

/**
* @inheritDoc
*/
afterInit() {
const editor = this.editor;
const toolbarConfig = editor.config.get( 'table.toolbar' );

// Don't add the toolbar if there is no configuration.
if ( !toolbarConfig || !toolbarConfig.length ) {
return;
}
const widgetToolbarRepository = editor.plugins.get( WidgetToolbarRepository );

/**
* A contextual balloon plugin instance.
*
* @private
* @member {module:ui/panel/balloon/contextualballoon~ContextualBalloon}
*/
this._balloon = this.editor.plugins.get( 'ContextualBalloon' );

/**
* A toolbar view instance used to display the buttons specific for table editing.
*
* @protected
* @type {module:ui/toolbar/toolbarview~ToolbarView}
*/
this._toolbar = new ToolbarView();

// Add buttons to the toolbar.
this._toolbar.fillFromConfig( toolbarConfig, editor.ui.componentFactory );

// Show balloon panel each time table widget is selected.
this.listenTo( editor.ui, 'update', () => {
this._checkIsVisible();
widgetToolbarRepository.register( 'table', {
items: editor.config.get( 'table.toolbar' ) || [],
visibleWhen: isTableContentSelected,
} );

// There is no render method after focus is back in editor, we need to check if balloon panel should be visible.
this.listenTo( editor.ui.focusTracker, 'change:isFocused', () => {
this._checkIsVisible();
}, { priority: 'low' } );
}

/**
* Checks whether the toolbar should show up or hide depending on the current selection.
*
* @private
*/
_checkIsVisible() {
const editor = this.editor;
const viewSelection = editor.editing.view.document.selection;

if ( !editor.ui.focusTracker.isFocused || !isTableContentSelected( viewSelection ) ) {
this._hideToolbar();
} else {
this._showToolbar();
}
}

/**
* Shows the {@link #_toolbar} in the {@link #_balloon}.
*
* @private
*/
_showToolbar() {
const editor = this.editor;

if ( this._isVisible ) {
repositionContextualBalloon( editor );
} else if ( !this._balloon.hasView( this._toolbar ) ) {
this._balloon.add( {
view: this._toolbar,
position: getBalloonPositionData( editor ),
balloonClassName
} );
}
}

/**
* Removes the {@link #_toolbar} from the {@link #_balloon}.
*
* @private
*/
_hideToolbar() {
if ( !this._isVisible ) {
return;
}

this._balloon.remove( this._toolbar );
}

/**
* Returns `true` when the {@link #_toolbar} is the visible view in the {@link #_balloon}.
*
* @private
* @type {Boolean}
*/
get _isVisible() {
return this._balloon.visibleView == this._toolbar;
}
}

Expand Down
6 changes: 3 additions & 3 deletions tests/tabletoolbar.js
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@ import View from '@ckeditor/ckeditor5-ui/src/view';
import { setData } from '@ckeditor/ckeditor5-engine/src/dev-utils/model';

describe( 'TableToolbar', () => {
let editor, model, doc, plugin, toolbar, balloon, editorElement;
let editor, model, doc, widgetToolbarRepository, toolbar, balloon, editorElement;

beforeEach( () => {
editorElement = global.document.createElement( 'div' );
Expand All @@ -34,8 +34,8 @@ describe( 'TableToolbar', () => {
editor = newEditor;
model = newEditor.model;
doc = model.document;
plugin = editor.plugins.get( TableToolbar );
toolbar = plugin._toolbar;
widgetToolbarRepository = editor.plugins.get( 'WidgetToolbarRepository' );
toolbar = widgetToolbarRepository._toolbars.get( 'table' ).view;
balloon = editor.plugins.get( 'ContextualBalloon' );
} );
} );
Expand Down

0 comments on commit e276e66

Please sign in to comment.