mutieditor

  1: /*******************************************************************************
   2:  * Copyright (c) 2000, 2006 IBM Corporation and others.
   3:  * All rights reserved. This program and the accompanying materials
   4:  * are made available under the terms of the Eclipse Public License v1.0
   5:  * which accompanies this distribution, and is available at
   6:  * http://www.eclipse.org/legal/epl-v10.html
   7:  *
   8:  * Contributors:
   9:  *     IBM Corporation - initial API and implementation
  10:  *******************************************************************************/
  11: 
  12: package org.eclipse.ui.part;
  13: 
  14: import org.eclipse.core.runtime.IProgressMonitor;
  15: import org.eclipse.jface.resource.ColorRegistry;
  16: import org.eclipse.swt.SWT;
  17: import org.eclipse.swt.graphics.Color;
  18: import org.eclipse.swt.layout.FillLayout;
  19: import org.eclipse.swt.widgets.Composite;
  20: import org.eclipse.swt.widgets.Event;
  21: import org.eclipse.swt.widgets.Listener;
  22: import org.eclipse.ui.IEditorInput;
  23: import org.eclipse.ui.IEditorPart;
  24: import org.eclipse.ui.IEditorSite;
  25: import org.eclipse.ui.IPartListener2;
  26: import org.eclipse.ui.IWorkbenchPart;
  27: import org.eclipse.ui.IWorkbenchPartReference;
  28: import org.eclipse.ui.PartInitException;
  29: import org.eclipse.ui.internal.EditorSite;
  30: import org.eclipse.ui.internal.IWorkbenchThemeConstants;
  31: import org.eclipse.ui.internal.PartService;
  32: import org.eclipse.ui.internal.PartSite;
  33: import org.eclipse.ui.internal.WorkbenchPage;
  34: import org.eclipse.ui.internal.WorkbenchWindow;
  35: import org.eclipse.ui.themes.ITheme;
  36: 
  37: /**
  38:  * A MultiEditor is a composite of editors.
  39:  * 
  40:  * This class is intended to be subclassed.
  41:  *         
  42:  */
  43:	  public abstract class MultiEditor extends EditorPart {
  44:
  45:    private int activeEditorIndex;
  46:
  47:    private IEditorPart innerEditors[];
  48:
  49:    private IPartListener2 propagationListener;
  50:
  51:    /**
  52:     * Constructor for TileEditor.
  53:     */
  54:	      public MultiEditor() {
  55:        super();
  56:    }
  57:
  58:    /*
  59:     * @see IEditorPart#doSave(IProgressMonitor)
  60:     */
  61:	      public void doSave(IProgressMonitor monitor) {
  62:	          for (int i = 0; i < innerEditors.length; i++) {
  63:            IEditorPart e = innerEditors[i];
  64:            e.doSave(monitor);
  65:        }
  66:    }
  67:
  68:    /**
  69:     * Create the control of the inner editor.
  70:     * 
  71:     * Must be called by subclass.
  72:     */
  73:    public Composite createInnerPartControl(Composite parent,
  74:	              final IEditorPart e) {
  75:        Composite content = new Composite(parent, SWT.NONE);
  76:        content.setLayout(new FillLayout());
  77:        e.createPartControl(content);
  78:	          parent.addListener(SWT.Activate, new Listener() {
  79:	              public void handleEvent(Event event) {
  80:	                  if (event.type == SWT.Activate) {
  81:                    activateEditor(e);
  82:                }
  83:            }
  84:        });
  85:        return content;
  86:    }
  87:
  88:    /*
  89:     * @see IEditorPart#doSaveAs()
  90:     */
  91:	      public void doSaveAs() {
  92:        //no-op
  93:    }
  94:
  95:    /*
  96:     * @see IEditorPart#init(IEditorSite, IEditorInput)
  97:     */
  98:    public void init(IEditorSite site, IEditorInput input)
  99:	              throws PartInitException {
 100:        init(site, (MultiEditorInput) input);
 101:    }
 102:
 103:    /*
 104:     * @see IEditorPart#init(IEditorSite, IEditorInput)
 105:     */
 106:    public void init(IEditorSite site, MultiEditorInput input)
 107:	              throws PartInitException {
 108:        setInput(input);
 109:        setSite(site);
 110:        setPartName(input.getName());
 111:        setTitleToolTip(input.getToolTipText());
 112:        setupEvents();
 113:    }
 114:
 115:    /*
 116:     * @see IEditorPart#isDirty()
 117:     */
 118:	      public boolean isDirty() {
 119:	          for (int i = 0; i < innerEditors.length; i++) {
 120:            IEditorPart e = innerEditors[i];
 121:	              if (e.isDirty()) {
 122:                return true;
 123:            }
 124:        }
 125:        return false;
 126:    }
 127:
 128:    /*
 129:     * @see IEditorPart#isSaveAsAllowed()
 130:     */
 131:	      public boolean isSaveAsAllowed() {
 132:        return false;
 133:    }
 134:
 135:    /*
 136:     * @see IWorkbenchPart#setFocus()
 137:     */
 138:	      public void setFocus() {
 139:        innerEditors[activeEditorIndex].setFocus();
 140:        updateGradient(innerEditors[activeEditorIndex]);
 141:    }
 142:
 143:    /**
 144:     * Returns the active inner editor.
 145:     */
 146:	      public final IEditorPart getActiveEditor() {
 147:        return innerEditors[activeEditorIndex];
 148:    }
 149:
 150:    /**
 151:     * Returns an array with all inner editors.
 152:     */
 153:	      public final IEditorPart[] getInnerEditors() {
 154:        return innerEditors;
 155:    }
 156:
 157:    /**
 158:     * Set the inner editors.
 159:     * 
 160:     * Should not be called by clients.
 161:     */
 162:	      public final void setChildren(IEditorPart[] children) {
 163:        innerEditors = children;
 164:        activeEditorIndex = 0;
 165:    }
 166:
 167:    /**
 168:     * Activates the given nested editor.
 169:     * 
 170:     * @param part the nested editor
 171:     * @since 3.0
 172:     */
 173:	      protected void activateEditor(IEditorPart part) {
 174:        IEditorPart oldEditor = getActiveEditor();
 175:        activeEditorIndex = getIndex(part);
 176:        IEditorPart e = getActiveEditor();
 177:        EditorSite innerSite = (EditorSite) e.getEditorSite();
 178:        ((WorkbenchPage) innerSite.getPage()).requestActivation(e);
 179:        updateGradient(oldEditor);
 180:    }
 181:
 182:    /**
 183:     * Returns the index of the given nested editor.
 184:     * 
 185:     * @return the index of the nested editor
 186:     * @since 3.0
 187:     */
 188:	      protected int getIndex(IEditorPart editor) {
 189:	          for (int i = 0; i < innerEditors.length; i++) {
 190:	              if (innerEditors[i] == editor) {
 191:                return i;
 192:            }
 193:        }
 194:        return -1;
 195:    }
 196:
 197:    /**
 198:     * Updates the gradient in the title bar.
 199:     */
 200:	      public void updateGradient(IEditorPart editor) {
 201:        boolean activeEditor = editor == getSite().getPage().getActiveEditor();
 202:        boolean activePart = editor == getSite().getPage().getActivePart();
 203:
 204:        ITheme theme = editor.getEditorSite().getWorkbenchWindow()
 205:                .getWorkbench().getThemeManager().getCurrentTheme();
 206:        Gradient g = new Gradient();
 207:
 208:        ColorRegistry colorRegistry = theme.getColorRegistry();
 209:	          if (activePart) {
 210:            g.fgColor = colorRegistry
 211:                    .get(IWorkbenchThemeConstants.ACTIVE_TAB_TEXT_COLOR);
 212:            g.bgColors = new Color[2];
 213:            g.bgColors[0] = colorRegistry
 214:                    .get(IWorkbenchThemeConstants.ACTIVE_TAB_BG_START);
 215:            g.bgColors[1] = colorRegistry
 216:                    .get(IWorkbenchThemeConstants.ACTIVE_TAB_BG_END);
 217:        } else {
 218:	              if (activeEditor) {
 219:                g.fgColor = colorRegistry
 220:                        .get(IWorkbenchThemeConstants.ACTIVE_TAB_TEXT_COLOR);
 221:                g.bgColors = new Color[2];
 222:                g.bgColors[0] = colorRegistry
 223:                        .get(IWorkbenchThemeConstants.ACTIVE_TAB_BG_START);
 224:                g.bgColors[1] = colorRegistry
 225:                        .get(IWorkbenchThemeConstants.ACTIVE_TAB_BG_END);
 226:            } else {
 227:                g.fgColor = colorRegistry
 228:                        .get(IWorkbenchThemeConstants.INACTIVE_TAB_TEXT_COLOR);
 229:                g.bgColors = new Color[2];
 230:                g.bgColors[0] = colorRegistry
 231:                        .get(IWorkbenchThemeConstants.INACTIVE_TAB_BG_START);
 232:                g.bgColors[1] = colorRegistry
 233:                        .get(IWorkbenchThemeConstants.INACTIVE_TAB_BG_END);
 234:            }
 235:        }
 236:	          g.bgPercents = new int[] { theme
 237:                .getInt(IWorkbenchThemeConstants.ACTIVE_TAB_PERCENT) };
 238:
 239:        drawGradient(editor, g);
 240:    }
 241:
 242:    /**
 243:     * Draw the gradient in the title bar.
 244:     */
 245:    protected abstract void drawGradient(IEditorPart innerEditor, Gradient g);
 246:
 247:    /**
 248:     * Return true if the shell is activated.
 249:     */
 250:	      protected boolean getShellActivated() {
 251:        WorkbenchWindow window = (WorkbenchWindow) getSite().getPage()
 252:                .getWorkbenchWindow();
 253:        return window.getShellActivated();
 254:    }
 255:
 256:    /**
 257:     * The colors used to draw the title bar of the inner editors
 258:     */
 259:	      public static class Gradient {
 260:        public Color fgColor;
 261:
 262:        public Color[] bgColors;
 263:
 264:        public int[] bgPercents;
 265:    }
 266:    
 267:    
 268:    
 269:    /**
 270:     * Set up the MultiEditor to propagate events like partClosed().
 271:     *
 272:     * @since 3.2
 273:     */
 274:	      private void setupEvents() {
 275:	          propagationListener = new IPartListener2() {
 276:	              public void partActivated(IWorkbenchPartReference partRef) {
 277:            }
 278:
 279:	              public void partBroughtToTop(IWorkbenchPartReference partRef) {
 280:            }
 281:
 282:	              public void partClosed(IWorkbenchPartReference partRef) {
 283:                IWorkbenchPart part = partRef.getPart(false);
 284:	                  if (part == MultiEditor.this && innerEditors != null) {
 285:                    PartService partService = ((WorkbenchPage) getSite()
 286:                            .getPage()).getPartService();
 287:	   for (int i = 0; i < innerEditors.length; i++) { 288: IEditorPart editor = innerEditors[i]; 289: IWorkbenchPartReference innerRef = ((PartSite) editor 290: .getSite()).getPartReference(); 291: partService.firePartClosed(innerRef); 292: }
 293:                }
 294:            }
 295:
 296:	              public void partDeactivated(IWorkbenchPartReference partRef) {
 297:            }
 298:
 299:	              public void partOpened(IWorkbenchPartReference partRef) {
 300:                IWorkbenchPart part = partRef.getPart(false);
 301:	                  if (part == MultiEditor.this && innerEditors != null) {
 302:                    PartService partService = ((WorkbenchPage) getSite()
 303:                            .getPage()).getPartService();
 304:	   for (int i = 0; i < innerEditors.length; i++) { 305: IEditorPart editor = innerEditors[i]; 306: IWorkbenchPartReference innerRef = ((PartSite) editor 307: .getSite()).getPartReference(); 308: partService.firePartOpened(innerRef); 309: }
 310:                }
 311:            }
 312:
 313:	              public void partHidden(IWorkbenchPartReference partRef) {
 314:            }
 315:
 316:	              public void partVisible(IWorkbenchPartReference partRef) {
 317:            }
 318:
 319:	              public void partInputChanged(IWorkbenchPartReference partRef) {
 320:            }
 321:        };
 322:        getSite().getPage().addPartListener(propagationListener);
 323:    }
 324:
 325:    /**
 326:     * Release the added listener.
 327:     * 
 328:     * @since 3.2
 329:     */
 330:	      public void dispose() {
 331:        getSite().getPage().removePartListener(propagationListener);
 332:        super.dispose();
 333:    }
 334:}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值