/* * Licensed to the Apache Software Foundation (ASF) under one * or more contributor license agreements. See the NOTICE file * distributed with this work for additional information * regarding copyright ownership. The ASF licenses this file * to you under the Apache License, Version 2.0 (the * "License"); you may not use this file except in compliance * with the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, * software distributed under the License is distributed on an * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * KIND, either express or implied. See the License for the * specific language governing permissions and limitations * under the License. * */ package org.apache.directory.studio.aciitemeditor.widgets; import java.text.ParseException; import org.apache.directory.studio.aciitemeditor.ACIITemConstants; import org.apache.directory.studio.aciitemeditor.ACIItemValueWithContext; import org.eclipse.core.runtime.IStatus; import org.eclipse.core.runtime.Status; import org.eclipse.jface.dialogs.ErrorDialog; import org.eclipse.swt.SWT; import org.eclipse.swt.events.SelectionAdapter; import org.eclipse.swt.events.SelectionEvent; import org.eclipse.swt.layout.GridData; import org.eclipse.swt.layout.GridLayout; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.TabFolder; import org.eclipse.swt.widgets.TabItem; /** * This composite contains the tabs with visual and source editor. * It also manages the synchronization between these two tabs. * * * @author <a href="mailto:dev@directory.apache.org">Apache Directory Project</a> */ public class ACIItemTabFolderComposite extends Composite { /** The index of the visual tab */ public static final int VISUAL_TAB_INDEX = 0; /** The index of the source tab */ public static final int SOURCE_TAB_INDEX = 1; /** The tab folder */ private TabFolder tabFolder; /** The visual editor composite */ private ACIItemVisualEditorComposite visualComposite; /** The source editor composite */ private ACIItemSourceEditorComposite sourceComposite; /** * Creates a new instance of TabFolderComposite. * * @param parent * @param style */ public ACIItemTabFolderComposite( Composite parent, int style ) { super( parent, style ); GridLayout layout = new GridLayout(); layout.marginWidth = layout.marginHeight = 0; setLayout( layout ); setLayoutData( new GridData( SWT.FILL, SWT.FILL, true, true ) ); createTabFolder(); createVisualTab(); createSourceTab(); initListeners(); } /** * Initializes the listeners. * */ private void initListeners() { tabFolder.addSelectionListener( new SelectionAdapter() { @Override public void widgetSelected( SelectionEvent event ) { tabSelected(); } } ); } /** * Creates the source tab and configures the source editor. * */ private void createSourceTab() { // create inner container Composite sourceContainer = new Composite( tabFolder, SWT.NONE ); GridLayout layout = new GridLayout(); layout.marginWidth = layout.marginHeight = 0; sourceContainer.setLayout( layout ); sourceContainer.setLayoutData( new GridData( SWT.FILL, SWT.FILL, true, true ) ); // create source editor sourceComposite = new ACIItemSourceEditorComposite( sourceContainer, SWT.NONE ); sourceComposite.setLayoutData( new GridData( SWT.FILL, SWT.FILL, true, true ) ); // create tab TabItem sourceTab = new TabItem( tabFolder, SWT.NONE, SOURCE_TAB_INDEX ); sourceTab.setText( Messages.getString( "ACIItemTabFolderComposite.source.tab" ) ); //$NON-NLS-1$ sourceTab.setControl( sourceContainer ); } /** * Creates the visual tab and the GUI editor. * */ private void createVisualTab() { // create inner container Composite visualContainer = new Composite( tabFolder, SWT.NONE ); visualContainer.setLayout( new GridLayout() ); visualContainer.setLayoutData( new GridData( SWT.FILL, SWT.FILL, true, true ) ); // create the visual ACIItem composite visualComposite = new ACIItemVisualEditorComposite( visualContainer, SWT.NONE ); visualComposite.setLayoutData( new GridData( SWT.FILL, SWT.FILL, true, true ) ); // create tab TabItem visualTab = new TabItem( tabFolder, SWT.NONE, VISUAL_TAB_INDEX ); visualTab.setText( Messages.getString( "ACIItemTabFolderComposite.visual.tab" ) ); //$NON-NLS-1$ visualTab.setControl( visualContainer ); } /** * Creates the tab folder and the listeners. * */ private void createTabFolder() { tabFolder = new TabFolder( this, SWT.TOP ); tabFolder.setLayoutData( new GridData( SWT.FILL, SWT.FILL, true, true ) ); } /** * Called, when a tab is selected. This method manages the synchronization * between visual and source editor. */ private void tabSelected() { int index = tabFolder.getSelectionIndex(); if ( index == SOURCE_TAB_INDEX ) { // switched to source tab: serialize visual and set to source // on parse error: print message and return to visual tab try { String input = visualComposite.getInput(); sourceComposite.setInput( input ); } catch ( ParseException pe ) { IStatus status = new Status( IStatus.ERROR, ACIITemConstants.PLUGIN_ID, 1, Messages .getString( "ACIItemTabFolderComposite.error.onVisualEditor" ), pe ); //$NON-NLS-1$ ErrorDialog.openError( getShell(), Messages.getString( "ACIItemTabFolderComposite.error.title" ), null, status ); //$NON-NLS-1$ tabFolder.setSelection( VISUAL_TAB_INDEX ); } } else if ( index == VISUAL_TAB_INDEX ) { // switched to visual tab: parse source and populate to visual // on parse error: print message and return to source tab try { String input = sourceComposite.getInput(); visualComposite.setInput( input ); } catch ( ParseException pe ) { IStatus status = new Status( IStatus.ERROR, ACIITemConstants.PLUGIN_ID, 1, Messages .getString( "ACIItemTabFolderComposite.error.onSourceEditor" ), pe ); //$NON-NLS-1$ ErrorDialog.openError( getShell(), Messages.getString( "ACIItemTabFolderComposite.error.title" ), null, status ); //$NON-NLS-1$ tabFolder.setSelection( SOURCE_TAB_INDEX ); } } } /** * Sets the input to both the source editor and to the visual editor. * If the syntax is invalid the source editor is activated. * * @param input The string representation of the ACI item */ public void setInput( String input ) { // set input to source editor sourceComposite.forceSetInput( input ); // set input to visual editor, on parse error switch to source editor try { visualComposite.setInput( input ); } catch ( ParseException pe ) { IStatus status = new Status( IStatus.ERROR, ACIITemConstants.PLUGIN_ID, 1, Messages .getString( "ACIItemTabFolderComposite.error.onInput" ), pe ); //$NON-NLS-1$ ErrorDialog.openError( getShell(), Messages.getString( "ACIItemTabFolderComposite.error.title" ), null, status ); //$NON-NLS-1$ tabFolder.setSelection( SOURCE_TAB_INDEX ); } } /** * Returns the string representation of the ACI item. * A syntax check is performed before returning the input, an * invalid syntax causes a ParseException. * * @return the valid string representation of the ACI item * @throws ParseException it the syntax check fails. */ public String getInput() throws ParseException { int index = tabFolder.getSelectionIndex(); if ( index == VISUAL_TAB_INDEX ) { String input = visualComposite.getInput(); return input; } else { String input = sourceComposite.getInput(); return input; } } /** * Sets the context. * * @param context the context */ public void setContext( ACIItemValueWithContext context ) { sourceComposite.setContext( context ); visualComposite.setContext( context ); } /** * Formats the content. */ public void format() { sourceComposite.format(); //visualComposite.format(); } }