# This patch file was generated by NetBeans IDE # Following Index: paths are relative to: D:\projects\nb # This patch can be applied using context Tools: Patch action on respective folder. # It uses platform neutral UTF-8 encoding and \n newlines. # Above lines and this line are ignored by the patching process. Index: debuggercore/src/org/netbeans/modules/debugger/resources/modes/debugger/callstack.wstcref *** D:\projects\nb\debuggercore\src\org\netbeans\modules\debugger\resources\modes\debugger\callstack.wstcref Base (1.5) --- D:\projects\nb\debuggercore\src\org\netbeans\modules\debugger\resources\modes\debugger\callstack.wstcref Locally Modified (Based On 1.5) *************** *** 2,14 **** --- 2,15 ---- + Index: core/windows/src/org/netbeans/core/windows/persistence/TCRefParser.java *** D:\projects\nb\core\windows\src\org\netbeans\core\windows\persistence\TCRefParser.java Base (1.18) --- D:\projects\nb\core\windows\src\org\netbeans\core\windows\persistence\TCRefParser.java Locally Modified (Based On 1.18) *************** *** 46,51 **** --- 46,53 ---- = "-//NetBeans//DTD Top Component in Mode Properties 2.0//EN"; // NOI18N public static final String INSTANCE_DTD_ID_2_1 = "-//NetBeans//DTD Top Component in Mode Properties 2.1//EN"; // NOI18N + public static final String INSTANCE_DTD_ID_2_2 + = "-//NetBeans//DTD Top Component in Mode Properties 2.2//EN"; // NOI18N private static final boolean DEBUG = Debug.isLoggable(TCRefParser.class); *************** *** 254,264 **** handleTcId(attrs); } else if ("state".equals(qname)) { // NOI18N handleState(attrs); ! } else if ("previousMode".equals(qname)) { handlePreviousMode(attrs); } } else { --- 256,267 ---- handleTcId(attrs); } else if ("state".equals(qname)) { // NOI18N handleState(attrs); ! } else if ("previousMode".equals(qname)) { // NOI18N handlePreviousMode(attrs); + } else if ("dockingStatus".equals(qname)) { // NOI18N + handleDockingStatus(attrs); + } else if ("slideInStatus".equals(qname)) { // NOI18N + handleSlideInStatus(attrs); } } else { log("-- TCRefParser.startElement PARSING OLD"); *************** *** 381,388 **** --- 387,455 ---- + " of element \"previousMode\"."); // NOI18N tcRefConfig.previousMode = null; } + + String index = attrs.getValue("index"); // NOI18N; + if (index != null) { + try { + tcRefConfig.previousIndex = Integer.parseInt( index ); + } catch( NumberFormatException nfE ) { + PersistenceManager.LOG.log(Level.WARNING, + "[WinSys.TCRefParser.handlePreviousMode]" // NOI18N + + " Warning: Invalid value of attribute \"index\"" // NOI18N + + " of element \"previousMode\"."); // NOI18N + tcRefConfig.previousIndex = -1; } + } + } + private void handleDockingStatus (Attributes attrs) throws SAXException { + String status = attrs.getValue("maximizedMode"); // NOI18N; + if (status != null) { + if ("docked".equals(status)) { // NOI18N + tcRefConfig.dockedInMaximizedMode = true; + } else if ("slided".equals(status)) { // NOI18N + tcRefConfig.dockedInMaximizedMode = false; + } else { + PersistenceManager.LOG.log(Level.WARNING, + "[WinSys.TCRefParser.handleDockingStatus]" // NOI18N + + " Warning: Invalid value of attribute \"maximizedMode\"" // NOI18N + + " of element \"dockingStatus\"."); // NOI18N + tcRefConfig.dockedInMaximizedMode = false; + } + } + status = attrs.getValue("defaultMode"); // NOI18N; + if (status != null) { + if ("docked".equals(status)) { // NOI18N + tcRefConfig.dockedInDefaultMode = true; + } else if ("slided".equals(status)) { // NOI18N + tcRefConfig.dockedInDefaultMode = false; + } else { + PersistenceManager.LOG.log(Level.WARNING, + "[WinSys.TCRefParser.handleDockingStatus]" // NOI18N + + " Warning: Invalid value of attribute \"defaultMode\"" // NOI18N + + " of element \"dockingStatus\"."); // NOI18N + tcRefConfig.dockedInDefaultMode = true; + } + } + } + + private void handleSlideInStatus (Attributes attrs) throws SAXException { + String status = attrs.getValue("maximized"); // NOI18N; + if (status != null) { + if ("true".equals(status)) { // NOI18N + tcRefConfig.slidedInMaximized = true; + } else if ("slided".equals(status)) { // NOI18N + tcRefConfig.slidedInMaximized = false; + } else { + PersistenceManager.LOG.log(Level.WARNING, + "[WinSys.TCRefParser.handleSlideInStatus]" // NOI18N + + " Warning: Invalid value of attribute \"maximized\"" // NOI18N + + " of element \"slideInStatus\"."); // NOI18N + tcRefConfig.slidedInMaximized = false; + } + } + } + /** Writes data from asociated tcRef to the xml representation */ void writeData (TCRefConfig tcRefCfg, InternalConfig ic) throws IOException { final StringBuffer buff = fillBuffer(tcRefCfg, ic); *************** *** 421,429 **** // header buff.append("\n\n"); // NOI18N /*buff.append("\n\n"); // NOI18N*/ ! buff.append("\n"); // NOI18N appendModule(ic, buff); appendTcId(tcRefCfg, buff); --- 488,496 ---- // header buff.append("\n\n"); // NOI18N /*buff.append("\n\n"); // NOI18N*/ ! buff.append("\n"); // NOI18N appendModule(ic, buff); appendTcId(tcRefCfg, buff); *************** *** 431,436 **** --- 498,505 ---- if (tcRefCfg.previousMode != null) { appendPreviousMode(tcRefCfg, buff); } + appendDockingStatus( tcRefCfg, buff ); + appendSlideInStatus( tcRefCfg, buff ); buff.append("\n"); // NOI18N return buff; *************** *** 476,485 **** buff.append(" />\n"); // NOI18N } private void appendPreviousMode(TCRefConfig tcRefCfg, StringBuffer buff) { buff.append(" \n"); // NOI18N } } --- 545,573 ---- buff.append(" />\n"); // NOI18N } + private void appendDockingStatus (TCRefConfig tcRefCfg, StringBuffer buff) { + if( tcRefCfg.dockedInMaximizedMode || !tcRefCfg.dockedInDefaultMode ) { + buff.append(" \n"); // NOI18N + } + } + + private void appendSlideInStatus (TCRefConfig tcRefCfg, StringBuffer buff) { + if( tcRefCfg.slidedInMaximized ) { + buff.append(" \n"); // NOI18N + } + } + private void appendPreviousMode(TCRefConfig tcRefCfg, StringBuffer buff) { buff.append(" = 0 ) ! buff.append( " index=\"" ).append( tcRefCfg.previousIndex ).append( "\" " ); ! buff.append(" />\n"); // NOI18N } } Index: core/windows/src/org/netbeans/core/windows/ConfigFactory.java *** D:\projects\nb\core\windows\src\org\netbeans\core\windows\ConfigFactory.java Base (1.7) --- D:\projects\nb\core\windows\src\org\netbeans\core\windows\ConfigFactory.java Locally Modified (Based On 1.7) *************** *** 70,76 **** wmc.screenSize = new Dimension(1024, 750); wmc.activeModeName = "editor"; // NOI18N ! wmc.maximizedModeName = null; wmc.toolbarConfiguration = "Standard"; // NOI18N wmc.preferredToolbarIconSize = 24; wmc.modes = createDefaultModeConfigs(); --- 70,77 ---- wmc.screenSize = new Dimension(1024, 750); wmc.activeModeName = "editor"; // NOI18N ! wmc.editorMaximizedModeName = ""; ! wmc.viewMaximizedModeName = ""; wmc.toolbarConfiguration = "Standard"; // NOI18N wmc.preferredToolbarIconSize = 24; wmc.modes = createDefaultModeConfigs(); *************** *** 282,287 **** --- 283,289 ---- TCRefConfig tcrc = new TCRefConfig(); tcrc.tc_id = "CommonPalette"; // NOI18N tcrc.opened = true; + tcrc.dockedInMaximizedMode = true; return tcrc; } Index: core/windows/src/org/netbeans/core/windows/ModeImpl.java *** D:\projects\nb\core\windows\src\org\netbeans\core\windows\ModeImpl.java Base (1.25) --- D:\projects\nb\core\windows\src\org\netbeans\core\windows\ModeImpl.java Locally Modified (Based On 1.25) *************** *** 24,39 **** import org.openide.windows.TopComponent; import org.openide.windows.Workspace; - import javax.swing.*; - import java.awt.*; import java.beans.PropertyChangeListener; import java.beans.PropertyChangeSupport; import java.util.Iterator; import java.util.List; import java.util.Set; --- 24,37 ---- import org.openide.windows.TopComponent; import org.openide.windows.Workspace; import java.beans.PropertyChangeListener; import java.beans.PropertyChangeSupport; import java.util.Iterator; import java.util.List; import java.util.Set; + import javax.swing.SwingUtilities; + import java.awt.Image; + import java.awt.Rectangle; /** This class is an implementation of Mode interface. *************** *** 245,254 **** --- 246,282 ---- return getCentral().getModeSelectedTopComponent(this); } + /** + * Remember which top component was previously the selected one. + * Used when switching to/from maximized mode. + */ + public void setPreviousSelectedTopComponent(TopComponent tc) { + TopComponent old = getPreviousSelectedTopComponent(); + if(tc == old) { + return; + } + + getCentral().setModePreviousSelectedTopComponent(this, tc); + } + + /** + * @return The top component that was the selected one before switching to/from + * the maximized mode. + */ + public TopComponent getPreviousSelectedTopComponent() { + WindowManagerImpl.assertEventDispatchThread(); + + return getCentral().getModePreviousSelectedTopComponent(this); + } + public void addOpenedTopComponent(TopComponent tc) { getCentral().addModeOpenedTopComponent(this, tc); } + public void addOpenedTopComponent(TopComponent tc, int index) { + getCentral().insertModeOpenedTopComponent( this, tc, index ); + } + public void addClosedTopComponent(TopComponent tc) { getCentral().addModeClosedTopComponent(this, tc); } *************** *** 261,266 **** --- 289,298 ---- getCentral().setUnloadedSelectedTopComponent(this, tcID); } + public void setUnloadedPreviousSelectedTopComponent(String tcID) { + getCentral().setUnloadedPreviousSelectedTopComponent(this, tcID); + } + // XXX public List getOpenedTopComponentsIDs() { return getCentral().getModeOpenedTopComponentsIDs(this); Index: core/windows/src/org/netbeans/core/windows/view/SlidingView.java *** D:\projects\nb\core\windows\src\org\netbeans\core\windows\view\SlidingView.java Base (1.6) --- D:\projects\nb\core\windows\src\org\netbeans\core\windows\view\SlidingView.java Locally Modified (Based On 1.6) *************** *** 70,75 **** --- 70,86 ---- TopComponent tc = getSelectedTopComponent(); //check if the slided-in TopComponent has a custom size defined if( null != tc ) { + WindowManagerImpl wm = WindowManagerImpl.getInstance(); + String tcID = wm.findTopComponentID( tc ); + if( wm.isTopComponentMaximizedWhenSlidedIn( tcID ) ) { + //force maximum size when the slided-in window is maximized, + //the DesktopImpl will adjust the size to fit the main window + if( Constants.BOTTOM.equals( side ) ) { + res.height = Integer.MAX_VALUE; + } else { + res.width = Integer.MAX_VALUE; + } + } else { Integer prevSlideSize = slideInSizes.get( tc ); if( null != prevSlideSize ) { if( null == res ) *************** *** 81,86 **** --- 92,98 ---- } } } + } return res; } Index: core/windows/src/org/netbeans/core/windows/view/ui/slides/CommandManager.java *** D:\projects\nb\core\windows\src\org\netbeans\core\windows\view\ui\slides\CommandManager.java Base (1.20) --- D:\projects\nb\core\windows\src\org\netbeans\core\windows\view\ui\slides\CommandManager.java Locally Modified (Based On 1.20) *************** *** 194,205 **** Utilities.actionsToPopup(actions, tc.getLookup()), tae.getMouseEvent().getPoint(), tae.getMouseEvent().getComponent()); } ! } ! else if (TabbedContainer.COMMAND_DISABLE_AUTO_HIDE.equals(e.getActionCommand())) { slideIntoDesktop(curSlidedIndex, true); } else { // convert event - fix index, local tabbed container index isn't right in slide bar context --- 194,204 ---- Utilities.actionsToPopup(actions, tc.getLookup()), tae.getMouseEvent().getPoint(), tae.getMouseEvent().getComponent()); } ! } else if (TabbedContainer.COMMAND_DISABLE_AUTO_HIDE.equals(e.getActionCommand())) { slideIntoDesktop(curSlidedIndex, true); + } else if (TabbedContainer.COMMAND_MAXIMIZE.equals(e.getActionCommand())) { + //inform the window system that the slided window changes its maximized status + postEvent(new SlideBarActionEvent(slideBar, SlideBar.COMMAND_MAXIMIZE, null, null, curSlidedIndex)); } else { // convert event - fix index, local tabbed container index isn't right in slide bar context TabActionEvent tae = (TabActionEvent)e; Index: core/windows/src/org/netbeans/core/windows/persistence/WindowManagerConfig.java *** D:\projects\nb\core\windows\src\org\netbeans\core\windows\persistence\WindowManagerConfig.java Base (1.5) --- D:\projects\nb\core\windows\src\org\netbeans\core\windows\persistence\WindowManagerConfig.java Locally Modified (Based On 1.5) *************** *** 166,173 **** public Dimension screenSize; /** Name of active mode. */ public String activeModeName; ! /** Name of maximized mode. */ ! public String maximizedModeName; /** Name of toolbar configuration. */ public String toolbarConfiguration; /** Preferred size of toolbar icons. */ --- 166,175 ---- public Dimension screenSize; /** Name of active mode. */ public String activeModeName; ! /** Name of maximized mode (editor). */ ! public String editorMaximizedModeName; ! /** Name of maximized mode (view). */ ! public String viewMaximizedModeName; /** Name of toolbar configuration. */ public String toolbarConfiguration; /** Preferred size of toolbar icons. */ *************** *** 183,189 **** public WindowManagerConfig() { editorAreaConstraints = new SplitConstraint[0]; activeModeName = ""; // NOI18N ! maximizedModeName = ""; // NOI18N toolbarConfiguration = ""; // NOI18N modes = new ModeConfig[0]; groups = new GroupConfig[0]; --- 185,192 ---- public WindowManagerConfig() { editorAreaConstraints = new SplitConstraint[0]; activeModeName = ""; // NOI18N ! editorMaximizedModeName = ""; // NOI18N ! viewMaximizedModeName = ""; // NOI18N toolbarConfiguration = ""; // NOI18N modes = new ModeConfig[0]; groups = new GroupConfig[0]; *************** *** 285,296 **** if (!activeModeName.equals(wmCfg.activeModeName)) { return false; } ! if (!maximizedModeName.equals(wmCfg.maximizedModeName)) { return false; } if (!toolbarConfiguration.equals(wmCfg.toolbarConfiguration)) { return false; --- 288,299 ---- if (!activeModeName.equals(wmCfg.activeModeName)) { return false; } ! if (!editorMaximizedModeName.equals(wmCfg.editorMaximizedModeName)) { return false; } + if (!viewMaximizedModeName.equals(wmCfg.viewMaximizedModeName)) { + return false; + } if (!toolbarConfiguration.equals(wmCfg.toolbarConfiguration)) { return false; } *************** *** 388,394 **** hash = 37 * hash + screenSize.hashCode(); } hash = 37 * hash + activeModeName.hashCode(); ! hash = 37 * hash + maximizedModeName.hashCode(); hash = 37 * hash + toolbarConfiguration.hashCode(); hash = 37 * hash + preferredToolbarIconSize; for (int i = 0; i < modes.length; i++) { --- 394,401 ---- hash = 37 * hash + screenSize.hashCode(); } hash = 37 * hash + activeModeName.hashCode(); ! hash = 37 * hash + editorMaximizedModeName.hashCode(); ! hash = 37 * hash + viewMaximizedModeName.hashCode(); hash = 37 * hash + toolbarConfiguration.hashCode(); hash = 37 * hash + preferredToolbarIconSize; for (int i = 0; i < modes.length; i++) { Index: core/windows/src/org/netbeans/core/windows/model/DefaultModel.java *** D:\projects\nb\core\windows\src\org\netbeans\core\windows\model\DefaultModel.java Base (1.23) --- D:\projects\nb\core\windows\src\org\netbeans\core\windows\model\DefaultModel.java Locally Modified (Based On 1.23) *************** *** 84,91 **** private int editorAreaFrameState = Frame.NORMAL; /** Name of toolbars configuration. */ private String toolbarConfigName = "Standard"; // NOI18N - /** Modes structure. */ private ModesSubModel modesSubModel = new ModesSubModel(this); --- 84,99 ---- private int editorAreaFrameState = Frame.NORMAL; /** Name of toolbars configuration. */ private String toolbarConfigName = "Standard"; // NOI18N + /** The docking status (slided-out/docked) for TopComponents in maximized editor mode */ + private DockingStatus maximizedDockingStatus = new DockingStatus( this ); + /** The docking status (slided-out/docked) for TopComponents in the default mode (nothing is maximized)*/ + private DockingStatus defaultDockingStatus = new DefaultDockingStatus( this ); + /** TopComponents that are maximized when slided-in. */ + private Set slideInMaximizedTopComponents = new HashSet( 3 ); /** Modes structure. */ private ModesSubModel modesSubModel = new ModesSubModel(this); *************** *** 275,290 **** } } ! /** Sets maximized mode. */ ! public void setMaximizedMode(ModeImpl maximizedMode) { synchronized(LOCK_MODES) { ! modesSubModel.setMaximizedMode(maximizedMode); } } /** Setter for toolbarConfigName property. */ public void setToolbarConfigName(String toolbarConfigName) { --- 280,301 ---- } } ! /** Sets editor mode that is currenlty maximized */ ! public void setEditorMaximizedMode(ModeImpl maximizedMode) { ! assert null == maximizedMode || maximizedMode.getKind() == Constants.MODE_KIND_EDITOR; synchronized(LOCK_MODES) { ! modesSubModel.setEditorMaximizedMode(maximizedMode); } } + /** Sets view mode that is currenlty maximized */ + public void setViewMaximizedMode(ModeImpl maximizedMode) { + assert null == maximizedMode || maximizedMode.getKind() == Constants.MODE_KIND_VIEW; + synchronized(LOCK_MODES) { + modesSubModel.setViewMaximizedMode(maximizedMode); + } + } + /** Setter for toolbarConfigName property. */ public void setToolbarConfigName(String toolbarConfigName) { synchronized(LOCK_TOOLBAR_CONFIG) { *************** *** 312,318 **** toolbarConfigName = "Standard"; // NOI18N modesSubModel = new ModesSubModel(this); topComponentGroups.clear(); ! } ///////////////////////////////////// --- 326,334 ---- toolbarConfigName = "Standard"; // NOI18N modesSubModel = new ModesSubModel(this); topComponentGroups.clear(); ! maximizedDockingStatus.clear(); ! defaultDockingStatus.clear(); ! slideInMaximizedTopComponents.clear(); } ///////////////////////////////////// *************** *** 435,450 **** } } ! /** Gets maximized mode. */ ! public ModeImpl getMaximizedMode() { synchronized(LOCK_MODES) { ! return modesSubModel.getMaximizedMode(); } } /** Getter for toolbarConfigName property. */ public String getToolbarConfigName() { --- 451,498 ---- } } ! /** ! * @return The docking status (docked/slided) of TopComponents before the window system ! * switched to maximized mode. ! */ ! public DockingStatus getDefaultDockingStatus() { ! return defaultDockingStatus; ! } ! ! /** ! * @return The docking status (docked/slided) of TopComponents in maximized editor mode. ! */ ! public DockingStatus getMaximizedDockingStatus() { ! return maximizedDockingStatus; ! } ! ! /** Gets editor maximized mode. */ ! public ModeImpl getEditorMaximizedMode() { synchronized(LOCK_MODES) { ! return modesSubModel.getEditorMaximizedMode(); } } + /** Gets view maximized mode. */ + public ModeImpl getViewMaximizedMode() { + synchronized(LOCK_MODES) { + return modesSubModel.getViewMaximizedMode(); + } + } + + /** + * Find the side (LEFT/RIGHT/BOTTOM) where the TopComponent from the given + * mode should slide to. + * + * @param mode Mode + * @return The slide side for TopComponents from the given mode. + */ + public String getSlideSideForMode( ModeImpl mode ) { + synchronized(LOCK_MODES) { + return modesSubModel.getSlideSideForMode( mode ); + } + } + /** Getter for toolbarConfigName property. */ public String getToolbarConfigName() { synchronized(LOCK_TOOLBAR_CONFIG) { *************** *** 449,465 **** --- 500,541 ---- } } + /** + * Gets the sizes (width or height) of TopComponents in the given sliding + * side, the key in the Map is TopComponent's ID + */ public Map getSlideInSizes(String side) { synchronized(LOCK_MODES) { return modesSubModel.getSlideInSizes( side ); } } + /** Set the size (width or height of the given TopComponent when it is slided in */ public void setSlideInSize(String side, TopComponent tc, int size) { synchronized(LOCK_MODES) { modesSubModel.setSlideInSize(side, tc, size); } } + + /** + * @return True if the given TopComponent is maximized when it is slided-in. + */ + public boolean isTopComponentMaximizedWhenSlidedIn( String tcid ) { + return null != tcid && slideInMaximizedTopComponents.contains( tcid ); + } + + /** + * Set whether the given TopComponent is maximized when it is slided-in. + */ + public void setTopComponentMaximizedWhenSlidedIn( String tcid, boolean maximized ) { + if( null != tcid ) { + if( maximized ) + slideInMaximizedTopComponents.add( tcid ); + else + slideInMaximizedTopComponents.remove( tcid ); + } + } + ///////////////////////////////////// // Accessor methods << ///////////////////////////////////// *************** *** 514,519 **** --- 590,603 ---- } } + /** Remember which top component was the selected one before switching to/from maximized mode */ + public void setModePreviousSelectedTopComponent(ModeImpl mode, TopComponent prevSelected) { + ModeModel modeModel = getModelForMode(mode); + if(modeModel != null) { + modeModel.setPreviousSelectedTopComponent(prevSelected); + } + } + /** Adds opened TopComponent. */ public void addModeOpenedTopComponent(ModeImpl mode, TopComponent tc) { ModeModel modeModel = getModelForMode(mode); *************** *** 554,559 **** --- 638,650 ---- } } + public void setModeUnloadedPreviousSelectedTopComponent(ModeImpl mode, String tcID) { + ModeModel modeModel = getModelForMode(mode); + if(modeModel != null) { + modeModel.setUnloadedPreviousSelectedTopComponent(tcID); + } + } + /** */ public void removeModeTopComponent(ModeImpl mode, TopComponent tc) { ModeModel modeModel = getModelForMode(mode); *************** *** 584,594 **** /** * @param mode - sliding mode * @param previousMode - the original mode. */ ! public void setModeTopComponentPreviousMode(ModeImpl mode, String tcID, ModeImpl previousMode) { ModeModel modeModel = getModelForMode(mode); if(modeModel != null) { ! modeModel.setTopComponentPreviousMode(tcID, previousMode); } } --- 675,686 ---- /** * @param mode - sliding mode * @param previousMode - the original mode. + * @param prevIndex - the tab index in the original mode */ ! public void setModeTopComponentPreviousMode(ModeImpl mode, String tcID, ModeImpl previousMode, int prevIndex) { ModeModel modeModel = getModelForMode(mode); if(modeModel != null) { ! modeModel.setTopComponentPreviousMode(tcID, previousMode, prevIndex); } } *************** *** 698,703 **** --- 790,805 ---- } } + /** Get the top component that had been the selected one before switching to/from maximzied mode */ + public TopComponent getModePreviousSelectedTopComponent(ModeImpl mode) { + ModeModel modeModel = getModelForMode(mode); + if(modeModel != null) { + return modeModel.getPreviousSelectedTopComponent(); + } else { + return null; + } + } + /** Gets list of top components. */ public List getModeTopComponents(ModeImpl mode) { ModeModel modeModel = getModelForMode(mode); *************** *** 756,761 **** --- 858,869 ---- return modeModel == null ? null : modeModel.getTopComponentPreviousMode(tcID); } + /** Gets the tab index of the given top component before it was moved to sliding/separate mode */ + public int getModeTopComponentPreviousIndex(ModeImpl mode, String tcID) { + ModeModel modeModel = getModelForMode(mode); + return modeModel == null ? null : modeModel.getTopComponentPreviousIndex(tcID); + } + // End of mode specific. *************** *** 1034,1039 **** --- 1142,1148 ---- modesSubModel.setSplitWeights(snapshots, splitWeights); } } + // Controller updates << ///////////////////////// *************** *** 1048,1054 **** ModeImpl activeMode = getActiveMode(); wsms.setActiveModeSnapshot(activeMode == null ? null : mss.findModeSnapshot(activeMode.getName())); ! ModeImpl maximizedMode = getMaximizedMode(); wsms.setMaximizedModeSnapshot(maximizedMode == null ? null : mss.findModeSnapshot(maximizedMode.getName())); wsms.setMainWindowBoundsJoined(getMainWindowBoundsJoined()); --- 1157,1163 ---- ModeImpl activeMode = getActiveMode(); wsms.setActiveModeSnapshot(activeMode == null ? null : mss.findModeSnapshot(activeMode.getName())); ! ModeImpl maximizedMode = null != getViewMaximizedMode() ? getViewMaximizedMode() : null; wsms.setMaximizedModeSnapshot(maximizedMode == null ? null : mss.findModeSnapshot(maximizedMode.getName())); wsms.setMainWindowBoundsJoined(getMainWindowBoundsJoined()); *************** *** 1104,1112 **** --- 1213,1257 ---- } } + /** + * A special subclass of DockingStatus for default mode when no TopComponent is maximized. + */ + private static class DefaultDockingStatus extends DockingStatus { + public DefaultDockingStatus( Model model ) { + super( model ); + } + /** + * When switching back to default mode, only slide those TopComponents + * there were slided-out before. + */ + public boolean shouldSlide( String tcID ) { + return null != tcID && slided.contains( tcID ); } + /** + * In default mode all TopComponents are docked by default. + */ + public boolean shouldDock( String tcID ) { + return null != tcID && (docked.contains( tcID ) || (!docked.contains( tcID ) && !slided.contains( tcID ))); + } + + public void mark() { + super.mark(); + Set modes = model.getModes(); + for( Iterator i=modes.iterator(); i.hasNext(); ) { + ModeImpl modeImpl = i.next(); + if( modeImpl.getState() != Constants.MODE_KIND_VIEW ) + continue; + + //also remember which top component is the selected one + modeImpl.setPreviousSelectedTopComponent( modeImpl.getSelectedTopComponent() ); + } + } + } + } + Index: core/windows/src/org/netbeans/core/windows/view/ui/slides/SlideOperationFactory.java *** D:\projects\nb\core\windows\src\org\netbeans\core\windows\view\ui\slides\SlideOperationFactory.java Base (1.3) --- D:\projects\nb\core\windows\src\org\netbeans\core\windows\view\ui\slides\SlideOperationFactory.java Locally Modified (Based On 1.3) *************** *** 88,94 **** --- 88,98 ---- return result; } + public static SlideOperation createSlideResize(Component component, String side) { + return createSlideResize( component, SlideOperationImpl.side2Orientation( side ) ); } + } Index: core/palette/src/org/netbeans/modules/palette/resources/CommonPalette.wstcref *** D:\projects\nb\core\palette\src\org\netbeans\modules\palette\resources\CommonPalette.wstcref Base (1.2) --- D:\projects\nb\core\palette\src\org\netbeans\modules\palette\resources\CommonPalette.wstcref Locally Modified (Based On 1.2) *************** *** 2,15 **** --- 2,16 ---- + Index: openide/windows/manifest.mf *** D:\projects\nb\openide\windows\manifest.mf Base (1.10) --- D:\projects\nb\openide\windows\manifest.mf Locally Modified (Based On 1.10) *************** *** 1,5 **** Manifest-Version: 1.0 OpenIDE-Module: org.openide.windows ! OpenIDE-Module-Specification-Version: 6.9 OpenIDE-Module-Localizing-Bundle: org/openide/windows/Bundle.properties --- 1,5 ---- Manifest-Version: 1.0 OpenIDE-Module: org.openide.windows ! OpenIDE-Module-Specification-Version: 6.11 OpenIDE-Module-Localizing-Bundle: org/openide/windows/Bundle.properties Index: core/windows/src/org/netbeans/core/windows/view/ui/tabcontrol/TabbedAdapter.java *** D:\projects\nb\core\windows\src\org\netbeans\core\windows\view\ui\tabcontrol\TabbedAdapter.java Base (1.35) --- D:\projects\nb\core\windows\src\org\netbeans\core\windows\view\ui\tabcontrol\TabbedAdapter.java Locally Modified (Based On 1.35) *************** *** 461,467 **** * false otherwise */ public static boolean isInMaximizedMode (Component comp) { ! ModeImpl maxMode = WindowManagerImpl.getInstance().getMaximizedMode(); if (maxMode == null) { return false; } --- 461,467 ---- * false otherwise */ public static boolean isInMaximizedMode (Component comp) { ! ModeImpl maxMode = WindowManagerImpl.getInstance().getCurrentMaximizedMode(); if (maxMode == null) { return false; } Index: core/windows/src/org/netbeans/core/windows/ModeStructureSnapshot.java *** D:\projects\nb\core\windows\src\org\netbeans\core\windows\ModeStructureSnapshot.java Base (1.9) --- D:\projects\nb\core\windows\src\org\netbeans\core\windows\ModeStructureSnapshot.java Locally Modified (Based On 1.9) *************** *** 334,339 **** --- 334,345 ---- return false; } + if(mode.getKind() == Constants.MODE_KIND_EDITOR ) { + WindowManagerImpl wm = WindowManagerImpl.getInstance(); + if( null != wm.getEditorMaximizedMode() && wm.getEditorMaximizedMode() != mode ) + return false; + } + return true; } Index: core/windows/src/org/netbeans/core/windows/resources/windowmanager-properties2_2.dtd *** D:\projects\nb\core\windows\src\org\netbeans\core\windows\resources\windowmanager-properties2_2.dtd No Base Revision --- D:\projects\nb\core\windows\src\org\netbeans\core\windows\resources\windowmanager-properties2_2.dtd Locally New *************** *** 1,0 **** --- 1,296 ---- + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Index: core/windows/src/org/netbeans/core/windows/actions/RecentViewListAction.java *** D:\projects\nb\core\windows\src\org\netbeans\core\windows\actions\RecentViewListAction.java Base (1.15) --- D:\projects\nb\core\windows\src\org\netbeans\core\windows\actions\RecentViewListAction.java Locally Modified (Based On 1.15) *************** *** 106,113 **** // #37226 Unmaximized the other mode if needed. WindowManagerImpl wm = WindowManagerImpl.getInstance(); ModeImpl mode = (ModeImpl) wm.findMode(tc); ! if(mode != null && mode != wm.getMaximizedMode()) { ! wm.setMaximizedMode(null); } tc.requestActive(); --- 106,113 ---- // #37226 Unmaximized the other mode if needed. WindowManagerImpl wm = WindowManagerImpl.getInstance(); ModeImpl mode = (ModeImpl) wm.findMode(tc); ! if(mode != null && mode != wm.getCurrentMaximizedMode()) { ! wm.switchMaximizedMode(null); } tc.requestActive(); Index: core/windows/src/org/netbeans/core/windows/model/EditorSplitSubModel.java *** D:\projects\nb\core\windows\src\org\netbeans\core\windows\model\EditorSplitSubModel.java Base (1.6) --- D:\projects\nb\core\windows\src\org\netbeans\core\windows\model\EditorSplitSubModel.java Locally Modified (Based On 1.6) *************** *** 84,90 **** /** Class which represents editor area position in EditorSplitSubModel. */ ! private static class EditorNode extends SplitSubModel.Node { /** Ref to editor area. */ private final SplitSubModel editorArea; --- 84,90 ---- /** Class which represents editor area position in EditorSplitSubModel. */ ! static class EditorNode extends SplitSubModel.Node { /** Ref to editor area. */ private final SplitSubModel editorArea; Index: core/windows/src/org/netbeans/core/windows/actions/MaximizeWindowAction.java *** D:\projects\nb\core\windows\src\org\netbeans\core\windows\actions\MaximizeWindowAction.java Base (1.13) --- D:\projects\nb\core\windows\src\org\netbeans\core\windows\actions\MaximizeWindowAction.java Locally Modified (Based On 1.13) *************** *** 89,109 **** if(wm.isDocked(curTC)) { // inside main window ! ModeImpl previousMax = wm.getMaximizedMode(); ! if (previousMax == null) { ! // maximize, but only non-sliding windows.. ! ModeImpl curMax = (ModeImpl)wm.findMode(curTC); ! if (curMax != null && curMax.getKind() != Constants.MODE_KIND_SLIDING) { ! wm.setMaximizedMode(curMax); } } else { ! // restore ! wm.setMaximizedMode(null); } } else { // separate windows ModeImpl curMax = (ModeImpl)wm.findMode(curTC); --- 89,115 ---- if(wm.isDocked(curTC)) { // inside main window ! ModeImpl mode = (ModeImpl)wm.findMode(curTC); ! String tcID = wm.findTopComponentID( curTC ); ! ! if( mode.getKind() == Constants.MODE_KIND_SLIDING ) { ! //maximize/restore slided-in window ! wm.userToggledTopComponentSlideInMaximize( tcID ); ! } else if( null != mode ) { ! ModeImpl previousMax = wm.getCurrentMaximizedMode(); ! if( null != previousMax ) { ! if( previousMax.getKind() == Constants.MODE_KIND_EDITOR && mode.getKind() == Constants.MODE_KIND_VIEW ) { ! wm.switchMaximizedMode( mode ); ! } else { ! wm.switchMaximizedMode( null ); } } else { ! wm.switchMaximizedMode( mode ); } } else { + wm.switchMaximizedMode( null ); + } + } else { // separate windows ModeImpl curMax = (ModeImpl)wm.findMode(curTC); if (curMax != null) { *************** *** 143,156 **** } if (wm.isDocked(active)) { ! maximize = wm.getMaximizedMode() == null; } else { maximize = activeMode.getFrameState() == Frame.NORMAL; } String label; if(maximize) { --- 152,166 ---- } if (wm.isDocked(active)) { ! maximize = wm.getCurrentMaximizedMode() == null; } else { maximize = activeMode.getFrameState() == Frame.NORMAL; } + if (activeMode != null && activeMode.getKind() == Constants.MODE_KIND_SLIDING) { + maximize = null != active && !wm.isTopComponentMaximizedWhenSlidedIn( wm.findTopComponentID( active ) ); + } + String label; if(maximize) { label = NbBundle.getMessage(MaximizeWindowAction.class, "CTL_MaximizeWindowAction", param); *************** *** 155,165 **** label = NbBundle.getMessage(MaximizeWindowAction.class, "CTL_UnmaximizeWindowAction", param); } putValue(Action.NAME, (isPopup ? Actions.cutAmpersand(label) : label)); ! if (activeMode != null && activeMode.getKind() == Constants.MODE_KIND_SLIDING) { ! maximize = false; } - setEnabled(activeMode != null && activeMode.getKind() != Constants.MODE_KIND_SLIDING); - } private TopComponent getTCToWorkWith () { if (topComponent != null) { --- 168,179 ---- label = NbBundle.getMessage(MaximizeWindowAction.class, "CTL_UnmaximizeWindowAction", param); } putValue(Action.NAME, (isPopup ? Actions.cutAmpersand(label) : label)); ! ! setEnabled(activeMode != null /*&& activeMode.getKind() != Constants.MODE_KIND_SLIDING*/); } private TopComponent getTCToWorkWith () { Index: core/windows/src/org/netbeans/core/windows/persistence/ModeParser.java *** D:\projects\nb\core\windows\src\org\netbeans\core\windows\persistence\ModeParser.java Base (1.30) --- D:\projects\nb\core\windows\src\org\netbeans\core\windows\persistence\ModeParser.java Locally Modified (Based On 1.30) *************** *** 61,66 **** --- 61,68 ---- = "-//NetBeans//DTD Mode Properties 2.1//EN"; // NOI18N public static final String INSTANCE_DTD_ID_2_2 = "-//NetBeans//DTD Mode Properties 2.2//EN"; // NOI18N + public static final String INSTANCE_DTD_ID_2_3 + = "-//NetBeans//DTD Mode Properties 2.3//EN"; // NOI18N /** Name of extended attribute for order of children */ private static final String EA_ORDER = "WinSys-TCRef-Order"; // NOI18N *************** *** 1406,1412 **** --- 1408,1420 ---- } else { modeConfig.selectedTopComponentID = ""; // NOI18N } + String prevId = attrs.getValue("prev-id"); // NOI18N + if (prevId != null) { + modeConfig.previousSelectedTopComponentID = prevId; + } else { + modeConfig.previousSelectedTopComponentID = ""; // NOI18N } + } /** Reads element "empty-behavior" */ private void handleEmptyBehavior (Attributes attrs) { *************** *** 1460,1468 **** // header buff.append("\n\n"). // NOI18N /*buff.append("\n\n"); // NOI18N*/ ! append("\n"); // NOI18N appendModule(ic, buff); appendName(mc, buff); --- 1468,1476 ---- // header buff.append("\n\n"). // NOI18N /*buff.append("\n\n"); // NOI18N*/ ! append("\n"); // NOI18N appendModule(ic, buff); appendName(mc, buff); *************** *** 1598,1613 **** } private void appendActiveTC (ModeConfig mc, StringBuffer buff) { ! if ((mc.selectedTopComponentID != null) && !"".equals(mc.selectedTopComponentID)) { String tcName = PersistenceManager.escapeTcId4XmlContent(mc.selectedTopComponentID); ! buff.append(" \n"); // NOI18N } } private void appendEmptyBehavior (ModeConfig mc, StringBuffer buff) { buff.append(" \n"); // NOI18N } - } } --- 1606,1634 ---- } private void appendActiveTC (ModeConfig mc, StringBuffer buff) { ! if ((mc.selectedTopComponentID != null && !"".equals(mc.selectedTopComponentID)) ! || (mc.previousSelectedTopComponentID != null && !"".equals(mc.previousSelectedTopComponentID)) ) { ! buff.append(" \n"); // NOI18N + } + } private void appendEmptyBehavior (ModeConfig mc, StringBuffer buff) { buff.append(" \n"); // NOI18N } } Index: core/windows/src/org/netbeans/core/windows/view/ui/slides/SlideOperationImpl.java *** D:\projects\nb\core\windows\src\org\netbeans\core\windows\view\ui\slides\SlideOperationImpl.java Base (1.6) --- D:\projects\nb\core\windows\src\org\netbeans\core\windows\view\ui\slides\SlideOperationImpl.java Locally Modified (Based On 1.6) *************** *** 163,171 **** } } ! } --- 163,181 ---- } } ! static int side2Orientation(String side) { ! int orientation = SlideBarDataModel.WEST; ! if (Constants.LEFT.equals(side)) { ! orientation = SlideBarDataModel.WEST; ! } else if (Constants.RIGHT.equals(side)) { ! orientation = SlideBarDataModel.EAST; ! } else if (Constants.BOTTOM.equals(side)) { ! orientation = SlideBarDataModel.SOUTH; } + return orientation; + } + } Index: core/windows/src/org/netbeans/core/windows/persistence/TCRefConfig.java *** D:\projects\nb\core\windows\src\org\netbeans\core\windows\persistence\TCRefConfig.java Base (1.5) --- D:\projects\nb\core\windows\src\org\netbeans\core\windows\persistence\TCRefConfig.java Locally Modified (Based On 1.5) *************** *** 37,46 **** --- 37,61 ---- public boolean opened; public String previousMode; + /** tab index in the previous mode */ + public int previousIndex; + /** True if this TopComponent is docked when the editor is maximized, + * false (default) if it should slide out */ + public boolean dockedInMaximizedMode; + /** True (default) if this TopComponent is docked in the default mode, + * false if it is slided out */ + public boolean dockedInDefaultMode; + /** True if this TopComponent is maximized when slided-in (covers the whole main window) */ + public boolean slidedInMaximized; + /** Creates a new instance of TCRefConfig */ public TCRefConfig() { tc_id = ""; // NOI18N + dockedInMaximizedMode = false; + dockedInDefaultMode = true; + slidedInMaximized = false; + previousIndex = -1; } public boolean equals (Object obj) { *************** *** 49,56 **** } if (obj instanceof TCRefConfig) { TCRefConfig tcRefCfg = (TCRefConfig) obj; ! return (tc_id.equals(tcRefCfg.tc_id) && ! (opened == tcRefCfg.opened)); } return false; } --- 64,75 ---- } if (obj instanceof TCRefConfig) { TCRefConfig tcRefCfg = (TCRefConfig) obj; ! return (tc_id.equals(tcRefCfg.tc_id) ! && (opened == tcRefCfg.opened) ! && (dockedInMaximizedMode == tcRefCfg.dockedInMaximizedMode) ! && (dockedInDefaultMode == tcRefCfg.dockedInDefaultMode) ! && (slidedInMaximized == tcRefCfg.slidedInMaximized) ! && (previousIndex == tcRefCfg.previousIndex)); } return false; } *************** *** 59,69 **** int hash = 17; hash = 37 * hash + tc_id.hashCode(); hash = 37 * hash + (opened ? 0 : 1); return hash; } public String toString () { ! return "TCRefConfig: tc_id=" + tc_id + ", opened=" + opened; } } --- 78,95 ---- int hash = 17; hash = 37 * hash + tc_id.hashCode(); hash = 37 * hash + (opened ? 0 : 1); + hash = 37 * hash + (dockedInMaximizedMode ? 0 : 1); + hash = 37 * hash + (dockedInDefaultMode ? 0 : 1); + hash = 37 * hash + (slidedInMaximized ? 0 : 1); + hash = 37 * hash + previousIndex; return hash; } public String toString () { ! return "TCRefConfig: tc_id=" + tc_id + ", opened=" + opened ! + ", maximizedMode=" + dockedInMaximizedMode ! + ", defaultMode=" + dockedInDefaultMode ! + ", slidedInMaximized=" + slidedInMaximized; } } Index: core/windows/src/org/netbeans/core/windows/view/ui/DesktopImpl.java *** D:\projects\nb\core\windows\src\org\netbeans\core\windows\view\ui\DesktopImpl.java Base (1.26) --- D:\projects\nb\core\windows\src\org\netbeans\core\windows\view\ui\DesktopImpl.java Locally Modified (Based On 1.26) *************** *** 37,42 **** --- 37,44 ---- import org.netbeans.core.windows.view.SlidingView; import org.netbeans.core.windows.view.ViewElement; import org.netbeans.core.windows.view.ui.slides.SlideOperation; + import org.netbeans.core.windows.view.ui.slides.SlideOperationFactory; + import org.netbeans.swing.tabcontrol.TabbedContainer; import org.openide.windows.TopComponent; *************** *** 238,243 **** --- 240,264 ---- performSlide(operation); } + public void performSlideToggleMaximize( TopComponent tc, String side, Rectangle editorBounds ) { + Component tabbed = findTabbed( tc ); + if( null != tabbed ) { + SlideOperation operation = SlideOperationFactory.createSlideResize( tabbed, side ); + Rectangle slideInBounds = computeSlideInBounds(operation, editorBounds); + operation.setFinishBounds(slideInBounds); + performSlide(operation); + } + } + + private Component findTabbed( Component comp ) { + while( comp.getParent() != null ) { + if( comp.getParent() instanceof TabbedContainer ) { + return comp.getParent(); + } + comp = comp.getParent(); + } + return null; + } /************** private stuff ***********/ private void performSlide(SlideOperation operation) { *************** *** 285,291 **** } if (result.width > splitRootRect.width) { // make sure we are not bigger than the current window.. ! result.width = splitRootRect.width - (splitRootRect.width / 10); } } else if (Constants.RIGHT.equals(side)) { int rightLimit = /*layeredPane.getBounds().x + */ layeredPane.getBounds().width - Math.max(viewRect.width, viewPreferred.width); --- 306,312 ---- } if (result.width > splitRootRect.width) { // make sure we are not bigger than the current window.. ! result.width = splitRootRect.width; } } else if (Constants.RIGHT.equals(side)) { int rightLimit = /*layeredPane.getBounds().x + */ layeredPane.getBounds().width - Math.max(viewRect.width, viewPreferred.width); *************** *** 293,299 **** ? rightLimit - splitRootRect.width / 3 : rightLimit - view.getSlideBounds().width; if (result.x < 0) { // make sure we are not bigger than the current window.. ! result.x = splitRootRect.width / 10; } result.y = 0; result.height = splitRootRect.height; --- 314,320 ---- ? rightLimit - splitRootRect.width / 3 : rightLimit - view.getSlideBounds().width; if (result.x < 0) { // make sure we are not bigger than the current window.. ! result.x = 0; } result.y = 0; result.height = splitRootRect.height; *************** *** 306,312 **** ? lowerLimit - splitRootRect.height / 3 : lowerLimit - view.getSlideBounds().height; if (result.y < 0) { // make sure we are not bigger than the current window.. ! result.y = splitRootRect.width / 10; } result.height = lowerLimit - result.y; result.width = splitRootRect.width; --- 327,333 ---- ? lowerLimit - splitRootRect.height / 3 : lowerLimit - view.getSlideBounds().height; if (result.y < 0) { // make sure we are not bigger than the current window.. ! result.y = 0; } result.height = lowerLimit - result.y; result.width = splitRootRect.width; Index: core/windows/src/org/netbeans/core/windows/Central.java *** D:\projects\nb\core\windows\src\org\netbeans\core\windows\Central.java Base (1.46) --- D:\projects\nb\core\windows\src\org\netbeans\core\windows\Central.java Locally Modified (Based On 1.46) *************** *** 20,41 **** package org.netbeans.core.windows; import javax.swing.SwingUtilities; import org.netbeans.core.windows.model.Model; import org.netbeans.core.windows.model.ModelElement; import org.netbeans.core.windows.model.ModelFactory; import org.netbeans.core.windows.view.ControllerHandler; - import org.netbeans.core.windows.view.ModeView; import org.netbeans.core.windows.view.View; - import org.openide.util.Utilities; - import org.openide.windows.Mode; import org.openide.windows.TopComponent; import org.openide.windows.WindowManager; - import java.awt.*; - import java.util.*; - import java.util.List; - import org.netbeans.core.windows.persistence.PersistenceManager; /** --- 20,52 ---- package org.netbeans.core.windows; + import java.awt.Dimension; + import java.awt.Frame; + import java.awt.Point; + import java.awt.Rectangle; + import java.util.ArrayList; + import java.util.Arrays; + import java.util.Collections; + import java.util.HashSet; + import java.util.Iterator; + import java.util.List; + import java.util.Map; + import java.util.Set; import javax.swing.SwingUtilities; + + import org.netbeans.core.windows.model.DockingStatus; import org.netbeans.core.windows.model.Model; import org.netbeans.core.windows.model.ModelElement; import org.netbeans.core.windows.model.ModelFactory; + import org.netbeans.core.windows.persistence.PersistenceManager; import org.netbeans.core.windows.view.ControllerHandler; import org.netbeans.core.windows.view.View; import org.openide.windows.TopComponent; import org.openide.windows.WindowManager; *************** *** 52,58 **** /** Helper class for managing requests to view. */ private final ViewRequestor viewRequestor = new ViewRequestor(this); - /** Constructor. */ public Central() { } --- 60,65 ---- *************** *** 316,343 **** } } ! /** Sets maximized mode into model and requests view (if needed). */ ! public void setMaximizedMode(ModeImpl maximizedMode) { ! ModeImpl old = getMaximizedMode(); ! if(maximizedMode == old) { return; } ! model.setMaximizedMode(maximizedMode); if(isVisible()) { viewRequestor.scheduleRequest( new ViewRequest(null, View.CHANGE_MAXIMIZED_MODE_CHANGED, ! old, maximizedMode)); } WindowManagerImpl.getInstance().doFirePropertyChange( ! WindowManagerImpl.PROP_MAXIMIZED_MODE, old, maximizedMode); } /** Sets constraints for mode into model and requests view (if needed). */ public void setModeConstraints(ModeImpl mode, SplitConstraint[] modeConstraints) { --- 323,464 ---- } } ! /** Sets new maximized mode into model and requests view update (if needed). */ ! void switchMaximizedMode(ModeImpl newMaximizedMode) { ! ModeImpl old = getCurrentMaximizedMode(); ! if(newMaximizedMode == old) { return; } ! WindowManagerImpl wm = WindowManagerImpl.getInstance(); ! if( null == newMaximizedMode ) { ! //cancel current maximized mode ! if( isViewMaximized() ) { ! //some non-editor TopComponent is currently maximized + //restore docking status of other components + if( isEditorMaximized() ) { + restoreViews( model.getMaximizedDockingStatus() ); + } else { + restoreViews( model.getDefaultDockingStatus() ); + } + + //return the maximized TopComponent to its original mode + ModeImpl currentMaximizedMode = getViewMaximizedMode(); + assert currentMaximizedMode.getTopComponents().length == 1; + TopComponent maximizedTC = currentMaximizedMode.getTopComponents()[0]; + String tcID = wm.findTopComponentID( maximizedTC ); + //find the mode where the TopComponent was before its maximization + ModeImpl prevMode = getModeTopComponentPreviousMode( tcID, currentMaximizedMode ); + int prevIndex = model.getModeTopComponentPreviousIndex( currentMaximizedMode, tcID ); + if( null == prevMode ) { + //TODO log a warning here because we somehow lost the previous mode + if ((prevMode == null) || !model.getModes().contains(prevMode)) { + // mode to return to isn't valid anymore, try constraints + SplitConstraint[] constraints = model.getModeTopComponentPreviousConstraints(currentMaximizedMode, tcID); + if (constraints != null) { + // create mode with the same constraints to dock topcomponent back into + prevMode = WindowManagerImpl.getInstance().createModeImpl( + ModeImpl.getUnusedModeName(), Constants.MODE_KIND_VIEW, false); + model.addMode(prevMode, constraints); + } + } + + if (prevMode == null) { + // fallback, previous saved mode not found somehow, use default modes + prevMode = WindowManagerImpl.getInstance().getDefaultViewMode(); + } + } + prevMode.addOpenedTopComponent( maximizedTC, prevIndex ); + prevMode.setSelectedTopComponent( maximizedTC ); + setActiveMode(prevMode); + model.removeMode( currentMaximizedMode ); + //cancel the maximized mode + setViewMaximizedMode( null ); + + } else if( isEditorMaximized() ) { + //an editor TopComponent is maximized + model.getMaximizedDockingStatus().mark(); + ModeImpl prevActiveMode = getActiveMode(); + //restore the docking status of other components + restoreViews( model.getDefaultDockingStatus() ); + + //cancel the maximized mode + setEditorMaximizedMode( null ); + + setActiveMode( prevActiveMode ); + + } + } else { + assert !isViewMaximized(); + + //set new maximized mode + if( newMaximizedMode.getKind() == Constants.MODE_KIND_EDITOR ) { + //the new maximized mode is an editor TopComponent + + //remember the current docking status of opened TopComponents + model.getDefaultDockingStatus().mark(); + //slide-out/dock some TopComponents according to their previous state in maximized mode + restoreViews( model.getMaximizedDockingStatus() ); + + setEditorMaximizedMode( newMaximizedMode ); + + } else if( newMaximizedMode.getKind() == Constants.MODE_KIND_VIEW ) { + //the new maximized mode is non-editor TopComponent + + //remember the docking status of opened components + if( isEditorMaximized() ) { + model.getMaximizedDockingStatus().mark(); + } else { + model.getDefaultDockingStatus().mark(); + } + + //get the TopComponent that will be maximized + TopComponent tcToMaximize = newMaximizedMode.getSelectedTopComponent(); + String tcID = wm.findTopComponentID( tcToMaximize ); + int prevIndex = newMaximizedMode.getOpenedTopComponents().indexOf( tcToMaximize ); + + //create a new mode for the maximization + ModeImpl mode = WindowManagerImpl.getInstance().createModeImpl(ModeImpl.getUnusedModeName(), Constants.MODE_KIND_VIEW, true); + model.addMode(mode, new SplitConstraint[0]); + //the mode has just one TopComponent + mode.addOpenedTopComponent( tcToMaximize ); + mode.setSelectedTopComponent( tcToMaximize ); + //remember where to put the TopComponent back when un-maximizing + setModeTopComponentPreviousMode( tcID, mode, newMaximizedMode, prevIndex ); + + setViewMaximizedMode( mode ); + + //slide-out all other TopComponents (the editor area won't be visible) + slideAllViews(); + + setActiveMode( mode ); + + } else { + throw new IllegalArgumentException( "Cannot maximize a sliding view" ); + } + } + if(isVisible()) { viewRequestor.scheduleRequest( new ViewRequest(null, View.CHANGE_MAXIMIZED_MODE_CHANGED, ! old, getCurrentMaximizedMode())); } WindowManagerImpl.getInstance().doFirePropertyChange( ! WindowManagerImpl.PROP_MAXIMIZED_MODE, old, getCurrentMaximizedMode()); } + /** Sets editor mode that is currenlty maximized (used when the window system loads) */ + void setEditorMaximizedMode(ModeImpl editorMaximizedMode) { + model.setEditorMaximizedMode( editorMaximizedMode ); + } + + /** Sets view mode that is currenlty maximized (used when the window system loads) */ + void setViewMaximizedMode(ModeImpl viewMaximizedMode) { + model.setViewMaximizedMode( viewMaximizedMode ); + } + /** Sets constraints for mode into model and requests view (if needed). */ public void setModeConstraints(ModeImpl mode, SplitConstraint[] modeConstraints) { SplitConstraint[] old = getModeConstraints(mode); *************** *** 562,567 **** --- 686,701 ---- } } + /** + * Remember which TopComponent was previously the selected one, used when switching to/from maximized mode. + * + * @param mode + * @param tc TopComponent that was previously selected. + */ + public void setModePreviousSelectedTopComponent(ModeImpl mode, TopComponent tc) { + model.setModePreviousSelectedTopComponent( mode, tc ); + } + /** Adds opened TopComponent into model and requests view (if needed). */ public void addModeOpenedTopComponent(ModeImpl mode, TopComponent tc) { if(getModeOpenedTopComponents(mode).contains(tc)) { *************** *** 627,634 **** } // Unmaximize mode if necessary. ! if(model.getMaximizedMode() == mode && model.getModeOpenedTopComponents(mode).isEmpty()) { ! model.setMaximizedMode(null); } if(isVisible() && opened) { --- 761,768 ---- } // Unmaximize mode if necessary. ! if(getCurrentMaximizedMode() == mode && model.getModeOpenedTopComponents(mode).isEmpty()) { ! switchMaximizedMode(null); } if(isVisible() && opened) { *************** *** 666,671 **** --- 800,809 ---- model.setModeUnloadedSelectedTopComponent(mode, tcID); } + public void setUnloadedPreviousSelectedTopComponent(ModeImpl mode, String tcID) { + model.setModeUnloadedPreviousSelectedTopComponent(mode, tcID); + } + // XXX public List getModeOpenedTopComponentsIDs(ModeImpl mode) { return model.getModeOpenedTopComponentsIDs(mode); *************** *** 739,746 **** } // Unmaximize mode if necessary. ! if(model.getMaximizedMode() == mode && model.getModeOpenedTopComponents(mode).isEmpty()) { ! model.setMaximizedMode(null); } // debugLog("removeModeTopComponent()"); --- 877,884 ---- } // Unmaximize mode if necessary. ! if(getCurrentMaximizedMode() == mode && model.getModeOpenedTopComponents(mode).isEmpty()) { ! switchMaximizedMode(null); } // debugLog("removeModeTopComponent()"); *************** *** 846,851 **** --- 984,992 ---- return; } + if( isEditorMaximized() && isViewMaximized() ) + switchMaximizedMode( null ); + Set openedBeforeTopComponents = new HashSet(); Set tcs = tcGroup.getTopComponents(); for(Iterator it = tcs.iterator(); it.hasNext(); ) { *************** *** 867,872 **** --- 1008,1021 ---- mode = wm.getDefaultViewMode(); } model.addModeOpenedTopComponent(mode, tc); + + if( isEditorMaximized() && mode.getState() != Constants.MODE_STATE_SEPARATED ) { + String tcID = wm.findTopComponentID( tc ); + if( !isTopComponentDockedInMaximizedMode( tcID ) ) { + //slide the TopComponent to edgebar and slide it out + slide( tc, mode, getSlideSideForMode( mode ) ); + } + } openedTcs.add(tc); } } *************** *** 1103,1117 **** return model.getEditorAreaFrameState(); } ! /** Gets maximized mode from model. */ ! public ModeImpl getMaximizedMode() { ! return model.getMaximizedMode(); } /** Gets constraints for mode from model. */ public SplitConstraint[] getModeConstraints(ModeImpl mode) { --- 1252,1276 ---- return model.getEditorAreaFrameState(); } ! /** Gets mode that is currently maximized (can be an editor or view component). */ ! ModeImpl getCurrentMaximizedMode() { ! if( isViewMaximized() ) ! return model.getViewMaximizedMode(); ! if( isEditorMaximized() ) ! return model.getEditorMaximizedMode(); ! return null; } + /** Gets editor maximized mode. */ + ModeImpl getEditorMaximizedMode() { + return model.getEditorMaximizedMode(); + } + /** Gets view maximized mode. */ + ModeImpl getViewMaximizedMode() { + return model.getViewMaximizedMode(); + } + /** Gets constraints for mode from model. */ public SplitConstraint[] getModeConstraints(ModeImpl mode) { return model.getModeConstraints(mode); *************** *** 1163,1168 **** --- 1325,1336 ---- public TopComponent getModeSelectedTopComponent(ModeImpl mode) { return model.getModeSelectedTopComponent(mode); } + /** + * @return TopComponent that was previously selected in the given mode or null. + */ + public TopComponent getModePreviousSelectedTopComponent(ModeImpl mode) { + return model.getModePreviousSelectedTopComponent( mode ); + } /** Gets list of top components in this workspace. */ public List getModeTopComponents(ModeImpl mode) { return model.getModeTopComponents(mode); *************** *** 1327,1340 **** // needed for precise docking back ModeImpl prevMode; String tcID; for (int i = 0; i < tcs.length; i++) { prevMode = (ModeImpl) wmi.findMode(tcs[i]); tcID = wmi.findTopComponentID(tcs[i]); if (prevMode.getState() == Constants.MODE_STATE_SEPARATED) { prevMode = model.getModeTopComponentPreviousMode(prevMode, tcID); } if (prevMode != null) { ! model.setModeTopComponentPreviousMode(newMode, tcID, prevMode); model.setModeTopComponentPreviousConstraints(newMode, wmi.findTopComponentID(tcs[i]), prevMode.getConstraints()); } } --- 1495,1510 ---- // needed for precise docking back ModeImpl prevMode; String tcID; + int prevIndex; for (int i = 0; i < tcs.length; i++) { prevMode = (ModeImpl) wmi.findMode(tcs[i]); tcID = wmi.findTopComponentID(tcs[i]); if (prevMode.getState() == Constants.MODE_STATE_SEPARATED) { prevMode = model.getModeTopComponentPreviousMode(prevMode, tcID); } + prevIndex = prevMode.getOpenedTopComponentsIDs().indexOf( tcID ); if (prevMode != null) { ! model.setModeTopComponentPreviousMode(newMode, tcID, prevMode, prevIndex); model.setModeTopComponentPreviousConstraints(newMode, wmi.findTopComponentID(tcs[i]), prevMode.getConstraints()); } } *************** *** 1428,1433 **** --- 1598,1614 ---- return viewRequestor.guessSlideSide(tc); } + /** + * Find the side (LEFT/RIGHT/BOTTOM) where the TopComponent from the given + * mode should slide to. + * + * @param mode Mode + * @return The slide side for TopComponents from the given mode. + */ + String getSlideSideForMode(ModeImpl mode) { + return model.getSlideSideForMode( mode ); + } + /** Tells whether given top component is inside joined mode (in main window) * or inside separate mode (separate window). * *************** *** 1574,1581 **** // Unmaximize if necessary. if(mode.getOpenedTopComponents().isEmpty() ! && mode == getMaximizedMode()) { ! setMaximizedMode(null); } } --- 1755,1762 ---- // Unmaximize if necessary. if(mode.getOpenedTopComponents().isEmpty() ! && mode == getCurrentMaximizedMode()) { ! switchMaximizedMode(null); } } *************** *** 1584,1592 **** closeMode(mode); // Unmaximize if necessary. if(mode.getOpenedTopComponents().isEmpty() ! && mode == getMaximizedMode()) { ! setMaximizedMode(null); } } --- 1765,1773 ---- closeMode(mode); // Unmaximize if necessary. if(mode.getOpenedTopComponents().isEmpty() ! && mode == getCurrentMaximizedMode()) { ! switchMaximizedMode(null); } } *************** *** 1647,1652 **** --- 1828,1834 ---- String tcID = WindowManagerImpl.getInstance().findTopComponentID(tc); ModeImpl source = (ModeImpl) WindowManagerImpl.getInstance().findMode(tc); dockTo = model.getModeTopComponentPreviousMode(source, tcID); + int dockIndex = model.getModeTopComponentPreviousIndex(source, tcID); if ((dockTo == null) || !model.getModes().contains(dockTo)) { // mode to dock to back isn't valid anymore, try constraints SplitConstraint[] constraints = model.getModeTopComponentPreviousConstraints(source, tcID); *************** *** 1664,1670 **** : WindowManagerImpl.getInstance().getDefaultViewMode(); } ! updateViewAfterDnD(moveTopComponentsIntoMode(dockTo, new TopComponent[] { tc })); } private boolean moveTopComponentsIntoMode(ModeImpl mode, TopComponent[] tcs) { --- 1846,1852 ---- : WindowManagerImpl.getInstance().getDefaultViewMode(); } ! updateViewAfterDnD(moveTopComponentsIntoMode(dockTo, new TopComponent[] { tc }, dockIndex)); } private boolean moveTopComponentsIntoMode(ModeImpl mode, TopComponent[] tcs) { *************** *** 1695,1700 **** --- 1877,1883 ---- break; } } + int prevIndex = prevMode != null && (intoSliding || intoSeparate) ? prevMode.getOpenedTopComponentsIDs().indexOf( tcID ) : -1; if(removeTopComponentFromOtherModes(mode, tc)) { moved = true; } *************** *** 1705,1711 **** } if (prevMode != null && (intoSliding || intoSeparate)) { // remember previous mode and constraints for precise de-auto-hide ! model.setModeTopComponentPreviousMode(mode, tcID, prevMode); model.setModeTopComponentPreviousConstraints(mode, tcID, model.getModeConstraints(prevMode)); } } --- 1888,1894 ---- } if (prevMode != null && (intoSliding || intoSeparate)) { // remember previous mode and constraints for precise de-auto-hide ! model.setModeTopComponentPreviousMode(mode, tcID, prevMode, prevIndex); model.setModeTopComponentPreviousConstraints(mode, tcID, model.getModeConstraints(prevMode)); } } *************** *** 1732,1739 **** private void updateViewAfterDnD(boolean unmaximize) { ! if(unmaximize && getMaximizedMode() != null) { ! model.setMaximizedMode(null); } if(isVisible()) { --- 1915,1922 ---- private void updateViewAfterDnD(boolean unmaximize) { ! if( unmaximize ) { ! switchMaximizedMode(null); } if(isVisible()) { *************** *** 1767,1772 **** --- 1950,1967 ---- } public void userEnabledAutoHide(TopComponent tc, ModeImpl source, String targetSide) { + + String tcID = WindowManagerImpl.getInstance().findTopComponentID(tc); + if( isEditorMaximized() ) + setTopComponentDockedInMaximizedMode( tcID, false ); + + slide( tc, source, targetSide ); + } + + /** + * Slide out the given TopComponent + */ + void slide(TopComponent tc, ModeImpl source, String targetSide) { ModeImpl targetMode = model.getSlidingMode(targetSide); if (targetMode == null) { targetMode = WindowManagerImpl.getInstance().createModeImpl( *************** *** 1797,1803 **** } else { WindowManagerImpl.notifyRegistryTopComponentActivated(null); } - } public void userResizedSlidingMode(ModeImpl mode, Rectangle rect) { --- 1992,1997 ---- *************** *** 1807,1827 **** model.setSlideInSize( side, mode.getSelectedTopComponent(), Constants.BOTTOM.equals( side ) ? rect.height : rect.width ); } public void userDisabledAutoHide(TopComponent tc, ModeImpl source) { // unmaximize if needed ! if(getMaximizedMode() != null) { ! model.setMaximizedMode(null); } String tcID = WindowManagerImpl.getInstance().findTopComponentID(tc); ModeImpl targetMode = model.getModeTopComponentPreviousMode(source, tcID); ! // debugLog("userDisabledAutoHide()=" + targetMode); if ((targetMode == null) || !model.getModes().contains(targetMode)) { - // debugLog("userDisabledAutoHide- previous one doesn't exist"); // mode to return to isn't valid anymore, try constraints SplitConstraint[] constraints = model.getModeTopComponentPreviousConstraints(source, tcID); if (constraints != null) { --- 2001,2039 ---- model.setSlideInSize( side, mode.getSelectedTopComponent(), Constants.BOTTOM.equals( side ) ? rect.height : rect.width ); + if( null != mode.getSelectedTopComponent() ) { + String tcID = WindowManagerImpl.getInstance().findTopComponentID( mode.getSelectedTopComponent() ); + model.setTopComponentMaximizedWhenSlidedIn( tcID, false ); } + } public void userDisabledAutoHide(TopComponent tc, ModeImpl source) { // unmaximize if needed ! if( isViewMaximized() ) { ! switchMaximizedMode(null); } String tcID = WindowManagerImpl.getInstance().findTopComponentID(tc); + if( isEditorMaximized() ) + setTopComponentDockedInMaximizedMode( tcID, true ); + + unSlide( tc, source ); + } + + /** + * Cancel the sliding mode of the given TopComponent. + */ + private void unSlide(TopComponent tc, ModeImpl source) { + String tcID = WindowManagerImpl.getInstance().findTopComponentID(tc); + ModeImpl targetMode = model.getModeTopComponentPreviousMode(source, tcID); ! int targetIndex = model.getModeTopComponentPreviousIndex(source, tcID); if ((targetMode == null) || !model.getModes().contains(targetMode)) { // mode to return to isn't valid anymore, try constraints SplitConstraint[] constraints = model.getModeTopComponentPreviousConstraints(source, tcID); *************** *** 1839,1848 **** : WindowManagerImpl.getInstance().getDefaultViewMode(); } ! moveTopComponentsIntoMode(targetMode, new TopComponent[] { tc } ); if (source.isEmpty()) { - // debugLog("userDisabledAutoHide- removing " + source.getDisplayName()); model.removeMode(source); } --- 2048,2059 ---- : WindowManagerImpl.getInstance().getDefaultViewMode(); } ! moveTopComponentsIntoMode(targetMode, new TopComponent[] { tc }, targetIndex); if (source.isEmpty()) { model.removeMode(source); } *************** *** 1855,1886 **** } public ModeImpl getModeTopComponentPreviousMode(String tcID, ModeImpl currentSlidingMode) { return model.getModeTopComponentPreviousMode(currentSlidingMode, tcID); } ! public void setModeTopComponentPreviousMode(String tcID, ModeImpl currentSlidingMode, ModeImpl prevMode) { ! model.setModeTopComponentPreviousMode(currentSlidingMode, tcID, prevMode); } ! public Map getSlideInSizes( String side ) { return model.getSlideInSizes( side ); } ! public void setSlideInSize( String side, TopComponent tc, int size ) { ! model.setSlideInSize( side, tc, size ); } // ControllerHandler << //////////////////////////// private static void debugLog(String message) { Debug.log(Central.class, message); } - - } --- 2063,2256 ---- } + /** + * @return The mode where the given TopComponent had been before it was moved to sliding or separate mode. + */ public ModeImpl getModeTopComponentPreviousMode(String tcID, ModeImpl currentSlidingMode) { return model.getModeTopComponentPreviousMode(currentSlidingMode, tcID); } ! /** ! * @return The position (tab index) of the given TopComponent before it was moved to sliding or separate mode. ! */ ! public int getModeTopComponentPreviousIndex(String tcID, ModeImpl currentSlidingMode) { ! return model.getModeTopComponentPreviousIndex(currentSlidingMode, tcID); } ! /** ! * Remember the mode and position where the given TopComponent was before moving into sliding or separate mode. ! * ! * @param tcID TopComponent's id ! * @param currentSlidingMode The mode where the TopComponent is at the moment. ! * @param prevMode The mode where the TopComponent had been before it was moved to the sliding mode. ! * @param prevIndex Tab index of the TopComponent before it was moved to the new mode. ! */ ! public void setModeTopComponentPreviousMode(String tcID, ModeImpl currentSlidingMode, ModeImpl prevMode, int prevIndex) { ! model.setModeTopComponentPreviousMode(currentSlidingMode, tcID, prevMode, prevIndex); ! } ! ! Map getSlideInSizes( String side ) { return model.getSlideInSizes( side ); } ! /** ! * Set the state of the TopComponent when the editor is maximized. ! * ! * @param tcID TopComponent id ! * @param docked True if the TopComponent should stay docked in maximized editor mode, ! * false if it should slide out when the editor is maximized. ! */ ! void setTopComponentDockedInMaximizedMode( String tcID, boolean docked ) { ! if( docked ) ! model.getMaximizedDockingStatus().addDocked( tcID ); ! else ! model.getMaximizedDockingStatus().addSlided( tcID ); } + /** + * Get the state of the TopComponent when the editor is maximized. + * + * @param tcID TopComponent id. + * @return True if the TopComponent should stay docked in maximized editor mode, + * false if it should slide out when the editor is maximized. + */ + boolean isTopComponentDockedInMaximizedMode( String tcID ) { + return model.getMaximizedDockingStatus().isDocked( tcID ); + } + + /** + * Set the state of the TopComponent when no mode is maximized. + * + * @param tcID TopComponent id + * @param slided True if the TopComponent is slided in the default mode, + * false if it is docked. + */ + void setTopComponentSlidedInDefaultMode( String tcID, boolean slided ) { + if( slided ) + model.getDefaultDockingStatus().addSlided( tcID ); + else + model.getDefaultDockingStatus().addDocked( tcID ); + } + + /** + * Get the state of the TopComponent when it is slided-in. + * + * @param tcID TopComponent id. + * @return true if the TopComponent is maximized when slided-in. + */ + boolean isTopComponentMaximizedWhenSlidedIn( String tcID ) { + return model.isTopComponentMaximizedWhenSlidedIn( tcID ); + } + + /** + * Set the state of the TopComponent when it is slided-in. + * + * @param tcID TopComponent id. + * @param maximized true if the TopComponent is maximized when slided-in. + */ + void setTopComponentMaximizedWhenSlidedIn( String tcID, boolean maximized ) { + model.setTopComponentMaximizedWhenSlidedIn( tcID, maximized ); + } + + void userToggledTopComponentSlideInMaximize( String tcID ) { + setTopComponentMaximizedWhenSlidedIn( tcID, !isTopComponentMaximizedWhenSlidedIn( tcID ) ); + if( isVisible() ) { + TopComponent tc = WindowManagerImpl.getInstance().findTopComponent( tcID ); + ModeImpl mode = WindowManagerImpl.getInstance().findModeForOpenedID( tcID ); + if( null != tc && null != mode && null != mode.getSide() ) { + viewRequestor.scheduleRequest ( + new ViewRequest(tc, View.CHANGE_MAXIMIZE_TOPCOMPONENT_SLIDE_IN, null, mode.getSide())); + } + } + } + + /** + * Get the state of the TopComponent when no mode is maximized. + * + * @param tcID TopComponent id. + * @return True if the TopComponent is slided in the default mode, + * false if it is docked. + */ + boolean isTopComponentSlidedInDefaultMode( String tcID ) { + return model.getDefaultDockingStatus().isSlided( tcID ); + } + + boolean isEditorMaximized() { + return null != model.getEditorMaximizedMode(); + } + + boolean isViewMaximized() { + return null != model.getViewMaximizedMode(); + } + + /** + * Slide-out or dock opened TopComponent according to their previous state. + */ + private void restoreViews( DockingStatus viewStatus ) { + WindowManagerImpl wm = WindowManagerImpl.getInstance(); + Set modes = getModes(); + for( Iterator i=modes.iterator(); i.hasNext(); ) { + ModeImpl modeImpl = i.next(); + if( modeImpl.getState() == Constants.MODE_STATE_SEPARATED ) + continue; + + if( modeImpl.getKind() == Constants.MODE_KIND_VIEW ) { + List views = getModeOpenedTopComponents( modeImpl ); + Collections.reverse( views ); + for( Iterator j=views.iterator(); j.hasNext(); ) { + TopComponent tc = j.next(); + String tcID = wm.findTopComponentID( tc ); + if( viewStatus.shouldSlide( tcID ) ) { + slide( tc, modeImpl, guessSlideSide( tc ) ); + } + } + //make sure that the same view is selected as before + TopComponent prevActiveTc = modeImpl.getPreviousSelectedTopComponent(); + if( null != prevActiveTc ) { + setModeSelectedTopComponent( modeImpl, prevActiveTc ); + } + } else if( modeImpl.getKind() == Constants.MODE_KIND_SLIDING ) { + List views = getModeOpenedTopComponents( modeImpl ); + Collections.reverse( views ); + for( Iterator j=views.iterator(); j.hasNext(); ) { + TopComponent tc = j.next(); + String tcID = wm.findTopComponentID( tc ); + if( viewStatus.shouldDock( tcID ) ) { + unSlide( tc, modeImpl ); + } + } + } + } + } + + /** + * Slide out all non-editor TopComponents. + */ + private void slideAllViews() { + Set modes = getModes(); + for( Iterator i=modes.iterator(); i.hasNext(); ) { + ModeImpl modeImpl = i.next();; + if( modeImpl.getKind() == Constants.MODE_KIND_VIEW + && modeImpl != getViewMaximizedMode() + && modeImpl.getState() != Constants.MODE_STATE_SEPARATED ) { + List views = getModeOpenedTopComponents( modeImpl ); + Collections.reverse( views ); + for( Iterator j=views.iterator(); j.hasNext(); ) { + TopComponent tc = j.next(); + slide( tc, modeImpl, guessSlideSide( tc ) ); + } + } + } + } + // ControllerHandler << //////////////////////////// private static void debugLog(String message) { Debug.log(Central.class, message); } } Index: openide/windows/apichanges.xml *** D:\projects\nb\openide\windows\apichanges.xml Base (1.8) --- D:\projects\nb\openide\windows\apichanges.xml Locally Modified (Based On 1.8) *************** *** 24,29 **** --- 24,59 ---- + + + Enhanced logic for maximized mode + + + + + + When switching an editor TopComponent to maximized mode other components slide out while + some components (e.g. palette) stay docked. It's also possible to maximize + slided-in windows. Full description in http://ui.netbeans.org/docs/ui/fullscreen/fullscreen.html + + + + + + + Slided-in windows remember their size + + + + + + Each TopComponent in a sliding mode (left/right/bottom) can now have a different width/height when slided-in. These user defined sizes are + stored in sliding mode's properties. + + + + + New constants PROP_TC_OPENED and PROP_TC_CLOSED in TopComponent.Registry Index: core/windows/src/org/netbeans/core/windows/resources/layer.xml *** D:\projects\nb\core\windows\src\org\netbeans\core\windows\resources\layer.xml Base (1.47) --- D:\projects\nb\core\windows\src\org\netbeans\core\windows\resources\layer.xml Locally Modified (Based On 1.47) *************** *** 239,244 **** --- 239,247 ---- + + + *************** *** 257,262 **** --- 260,268 ---- + + + Index: core/windows/src/org/netbeans/core/windows/model/ModesSubModel.java *** D:\projects\nb\core\windows\src\org\netbeans\core\windows\model\ModesSubModel.java Base (1.12) --- D:\projects\nb\core\windows\src\org\netbeans\core\windows\model\ModesSubModel.java Locally Modified (Based On 1.12) *************** *** 63,69 **** /** Active mode. */ private ModeImpl activeMode; /** Maximized mode. */ ! private ModeImpl maximizedMode; // (sliding side + TopComponent ID) -> size in pixels (width or height //depending on the sliding side) private final Map slideInSizes = new HashMap(15); --- 63,71 ---- /** Active mode. */ private ModeImpl activeMode; /** Maximized mode. */ ! private ModeImpl editorMaximizedMode; ! private ModeImpl viewMaximizedMode; ! // (sliding side + TopComponent ID) -> size in pixels (width or height //depending on the sliding side) private final Map slideInSizes = new HashMap(15); *************** *** 97,102 **** --- 99,115 ---- } } + /** + * Find the side (LEFT/RIGHT/BOTTOM) where the TopComponent from the given + * mode should slide to. + * + * @param mode Mode + * @return The slide side for TopComponents from the given mode. + */ + public String getSlideSideForMode( ModeImpl mode ) { + return editorSplitSubModel.getSlideSideForMode( mode ); + } + public String getSlidingModeConstraints(ModeImpl mode) { return slidingModes2Sides.get(mode); } *************** *** 273,282 **** return this.activeMode; } ! /** Sets maximized mode. */ ! public boolean setMaximizedMode(ModeImpl maximizedMode) { if(maximizedMode == null || modes.contains(maximizedMode)) { ! this.maximizedMode = maximizedMode; return true; } --- 286,295 ---- return this.activeMode; } ! /** Sets maximized mode for editor components. */ ! public boolean setEditorMaximizedMode(ModeImpl maximizedMode) { if(maximizedMode == null || modes.contains(maximizedMode)) { ! this.editorMaximizedMode = maximizedMode; return true; } *************** *** 283,296 **** return false; } ! /** Gets maximized mode. */ ! public ModeImpl getMaximizedMode() { ! return this.maximizedMode; } public Set getModes() { return new HashSet(modes); --- 296,321 ---- return false; } ! /** Gets maximized mode for editor components. */ ! public ModeImpl getEditorMaximizedMode() { ! return this.editorMaximizedMode; } + /** Sets maximized mode for non-editor components. */ + public boolean setViewMaximizedMode(ModeImpl maximizedMode) { + if(maximizedMode == null || modes.contains(maximizedMode)) { + this.viewMaximizedMode = maximizedMode; + return true; + } + + return false; + } + + /** Gets maximized mode for non-editor components. */ + public ModeImpl getViewMaximizedMode() { + return this.viewMaximizedMode; + } + public Set getModes() { return new HashSet(modes); } Index: core/windows/src/org/netbeans/core/windows/view/ui/DocumentsDlg.java *** D:\projects\nb\core\windows\src\org\netbeans\core\windows\view\ui\DocumentsDlg.java Base (1.25) --- D:\projects\nb\core\windows\src\org\netbeans\core\windows\view\ui\DocumentsDlg.java Locally Modified (Based On 1.25) *************** *** 319,326 **** // #37226-41075 Unmaximized the other mode if needed. WindowManagerImpl wm = WindowManagerImpl.getInstance(); ModeImpl mode = (ModeImpl)wm.findMode(tc); ! if(mode != null && mode != wm.getMaximizedMode()) { ! wm.setMaximizedMode(null); } tc.requestActive(); } --- 319,326 ---- // #37226-41075 Unmaximized the other mode if needed. WindowManagerImpl wm = WindowManagerImpl.getInstance(); ModeImpl mode = (ModeImpl)wm.findMode(tc); ! if(mode != null && mode != wm.getCurrentMaximizedMode()) { ! wm.switchMaximizedMode(null); } tc.requestActive(); } Index: core/windows/src/org/netbeans/core/windows/model/Model.java *** D:\projects\nb\core\windows\src\org\netbeans\core\windows\model\Model.java Base (1.17) --- D:\projects\nb\core\windows\src\org\netbeans\core\windows\model\Model.java Locally Modified (Based On 1.17) *************** *** 66,73 **** public void setToolbarConfigName(String toolbarConfigName); /** Sets active mode. */ public void setActiveMode(ModeImpl mode); ! /** Sets maximized mode. */ ! public void setMaximizedMode(ModeImpl maximizedMode); /** Adds mode. */ public void addMode(ModeImpl mode, SplitConstraint[] constraints); /** Adds mode. */ --- 66,75 ---- public void setToolbarConfigName(String toolbarConfigName); /** Sets active mode. */ public void setActiveMode(ModeImpl mode); ! /** Sets editor mode that is currenlty maximized */ ! public void setEditorMaximizedMode(ModeImpl maximizedMode); ! /** Sets view mode that is currenlty maximized */ ! public void setViewMaximizedMode(ModeImpl maximizedMode); /** Adds mode. */ public void addMode(ModeImpl mode, SplitConstraint[] constraints); /** Adds mode. */ *************** *** 93,98 **** --- 95,105 ---- public void reset(); /** Set the size (width or height of the given TopComponent when it is slided in */ public void setSlideInSize(String side, TopComponent tc, int size); + /** + * Set whether the given TopComponent is maximized when it is slided-in. + */ + public void setTopComponentMaximizedWhenSlidedIn( String tcid, boolean maximized ); + // Mutators (global level) << ///////////////////////////// *************** *** 124,131 **** public String getToolbarConfigName(); /** Gets active mode. */ public ModeImpl getActiveMode(); ! /** Gets maximized mode. */ ! public ModeImpl getMaximizedMode(); /** Gets set of modes. */ public Set getModes(); /** Gets mode constraints. */ --- 131,140 ---- public String getToolbarConfigName(); /** Gets active mode. */ public ModeImpl getActiveMode(); ! /** Gets editor maximized mode. */ ! public ModeImpl getEditorMaximizedMode(); ! /** Gets view maximized mode. */ ! public ModeImpl getViewMaximizedMode(); /** Gets set of modes. */ public Set getModes(); /** Gets mode constraints. */ *************** *** 142,147 **** --- 151,177 ---- * side, the key in the Map is TopComponent's ID */ public Map getSlideInSizes(String side); + /** + * @return The docking status (docked/slided) of TopComponents before the window system + * switched to maximized mode. + */ + public DockingStatus getDefaultDockingStatus(); + /** + * @return The docking status (docked/slided) of TopComponents in maximized editor mode. + */ + public DockingStatus getMaximizedDockingStatus(); + /** + * Find the side (LEFT/RIGHT/BOTTOM) where the TopComponent from the given + * mode should slide to. + * + * @param mode Mode + * @return The slide side for TopComponents from the given mode. + */ + public String getSlideSideForMode( ModeImpl mode ); + /** + * @return True if the given TopComponent is maximized when it is slided-in. + */ + public boolean isTopComponentMaximizedWhenSlidedIn( String tcid ); // Accessors (global level) >> ////////////////////////////// *************** *** 161,166 **** --- 191,198 ---- public void setModeFrameState(ModeImpl mode, int frameState); /** Sets selected TopComponent. */ public void setModeSelectedTopComponent(ModeImpl mode, TopComponent selected); + /** Remember which top component was the selected one before switching to/from maximized mode */ + public void setModePreviousSelectedTopComponent(ModeImpl mode, TopComponent prevSelected); /** Adds opened TopComponent. */ public void addModeOpenedTopComponent(ModeImpl mode, TopComponent tc); /** Inserts opened TopComponent. */ *************** *** 172,177 **** --- 204,211 ---- public void addModeUnloadedTopComponent(ModeImpl mode, String tcID); // XXX public void setModeUnloadedSelectedTopComponent(ModeImpl mode, String tcID); + /** Remember which top component was the selected one before switching to/from maximized mode */ + public void setModeUnloadedPreviousSelectedTopComponent(ModeImpl mode, String tcID); /** */ public void removeModeTopComponent(ModeImpl mode, TopComponent tc); // XXX *************** *** 180,186 **** // Info about previous top component context, used by sliding kind of modes /** Sets information of previous mode top component was in. */ ! public void setModeTopComponentPreviousMode(ModeImpl mode, String tcID, ModeImpl previousMode); /** Sets information of previous constraints of mode top component was in. */ public void setModeTopComponentPreviousConstraints(ModeImpl mode, String tcID, SplitConstraint[] constraints); --- 214,220 ---- // Info about previous top component context, used by sliding kind of modes /** Sets information of previous mode top component was in. */ ! public void setModeTopComponentPreviousMode(ModeImpl mode, String tcID, ModeImpl previousMode, int previousIndex); /** Sets information of previous constraints of mode top component was in. */ public void setModeTopComponentPreviousConstraints(ModeImpl mode, String tcID, SplitConstraint[] constraints); *************** *** 212,217 **** --- 246,253 ---- public boolean containsModeTopComponent(ModeImpl mode, TopComponent tc); /** Gets selected TopComponent. */ public TopComponent getModeSelectedTopComponent(ModeImpl mode); + /** Get the top component that had been the selected one before switching to/from maximzied mode */ + public TopComponent getModePreviousSelectedTopComponent(ModeImpl mode); /** Gets list of top components in this workspace. */ public List getModeTopComponents(ModeImpl mode); /** Gets list of top components in this workspace. */ *************** *** 225,230 **** --- 261,268 ---- public ModeImpl getModeTopComponentPreviousMode(ModeImpl mode, String tcID); public SplitConstraint[] getModeTopComponentPreviousConstraints(ModeImpl mode, String tcID); + /** Gets the tab index of the given top component before it was moved to sliding/separate mode */ + public int getModeTopComponentPreviousIndex(ModeImpl mode, String tcID); // Accessors (mode level) << //////////////////////////// Index: debuggercore/src/org/netbeans/modules/debugger/resources/modes/debugger/watches.wstcref *** D:\projects\nb\debuggercore\src\org\netbeans\modules\debugger\resources\modes\debugger\watches.wstcref Base (1.5) --- D:\projects\nb\debuggercore\src\org\netbeans\modules\debugger\resources\modes\debugger\watches.wstcref Locally Modified (Based On 1.5) *************** *** 2,14 **** --- 2,15 ---- + Index: core/windows/src/org/netbeans/core/windows/model/ModeModel.java *** D:\projects\nb\core\windows\src\org\netbeans\core\windows\model\ModeModel.java Base (1.10) --- D:\projects\nb\core\windows\src\org\netbeans\core\windows\model\ModeModel.java Locally Modified (Based On 1.10) *************** *** 46,56 **** public void setBoundsSeparatedHelp(Rectangle bounds); /** Sets frame state. */ public void setFrameState(int frameState); ! /** Sets seleted TopComponent. */ public void setSelectedTopComponent(TopComponent selected); /** Adds opened TopComponent. */ public void addOpenedTopComponent(TopComponent tc); --- 46,55 ---- public void setBoundsSeparatedHelp(Rectangle bounds); /** Sets frame state. */ public void setFrameState(int frameState); ! /** Sets selected TopComponent. */ public void setSelectedTopComponent(TopComponent selected); + /** Set top component that was selected before switching to/from maximized mode */ + public void setPreviousSelectedTopComponent(TopComponent prevSelected); /** Adds opened TopComponent. */ public void addOpenedTopComponent(TopComponent tc); /** Inserts opened TopComponent. */ *************** *** 58,63 **** --- 60,67 ---- public void addUnloadedTopComponent(String tcID); // XXX public void setUnloadedSelectedTopComponent(String tcID); + /** Set top component that was selected before switching to/from maximized mode */ + public void setUnloadedPreviousSelectedTopComponent(String tcID); /** Removes TopComponent from mode. */ public void removeTopComponent(TopComponent tc); // XXX *************** *** 66,72 **** // Info about previous top component context, used by sliding kind of modes /** Sets information of previous mode top component was in. */ ! public void setTopComponentPreviousMode(String tcID, ModeImpl mode); /** Sets information of previous constraints of mode top component was in. */ public void setTopComponentPreviousConstraints(String tcID, SplitConstraint[] constraints); --- 70,76 ---- // Info about previous top component context, used by sliding kind of modes /** Sets information of previous mode top component was in. */ ! public void setTopComponentPreviousMode(String tcID, ModeImpl mode, int prevIndex); /** Sets information of previous constraints of mode top component was in. */ public void setTopComponentPreviousConstraints(String tcID, SplitConstraint[] constraints); *************** *** 91,96 **** --- 95,102 ---- public boolean containsTopComponent(TopComponent tc); /** Gets selected TopComponent. */ public TopComponent getSelectedTopComponent(); + /** Gets the top component that was selected before switching to/from maximized mode */ + public TopComponent getPreviousSelectedTopComponent(); /** Gets list of top components in mode. */ public List getTopComponents(); /** Gets list of top components in mode. */ *************** *** 103,108 **** --- 109,116 ---- // Info about previous top component context, used by sliding kind of modes public ModeImpl getTopComponentPreviousMode(String tcID); + /** Gets the tab index of the top component in its previous mode */ + public int getTopComponentPreviousIndex(String tcID); public SplitConstraint[] getTopComponentPreviousConstraints(String tcID); Index: core/windows/src/org/netbeans/core/windows/persistence/WindowManagerParser.java *** D:\projects\nb\core\windows\src\org\netbeans\core\windows\persistence\WindowManagerParser.java Base (1.25) --- D:\projects\nb\core\windows\src\org\netbeans\core\windows\persistence\WindowManagerParser.java Locally Modified (Based On 1.25) *************** *** 1553,1568 **** /** Reads element "maximized-mode" and updates window manager config content */ private void handleMaximizedMode (Attributes attrs) { ! String name = attrs.getValue("name"); // NOI18N if (name != null) { ! winMgrConfig.maximizedModeName = name; } else { ! winMgrConfig.maximizedModeName = ""; // NOI18N } } /** Reads element "toolbar" and updates window manager config content */ --- 1553,1572 ---- /** Reads element "maximized-mode" and updates window manager config content */ private void handleMaximizedMode (Attributes attrs) { ! String name = attrs.getValue("editor"); // NOI18N if (name != null) { ! winMgrConfig.editorMaximizedModeName = name; } else { ! winMgrConfig.editorMaximizedModeName = ""; // NOI18N } + + name = attrs.getValue("view"); // NOI18N + if (name != null) { + winMgrConfig.viewMaximizedModeName = name; + } else { + winMgrConfig.viewMaximizedModeName = ""; // NOI18N } + } /** Reads element "toolbar" and updates window manager config content */ private void handleToolbar (Attributes attrs) { *************** *** 1800,1807 **** } private void appendMaximizedMode (WindowManagerConfig wmc, StringBuffer buff) { ! if ((wmc.maximizedModeName != null) && !"".equals(wmc.maximizedModeName)) { ! buff.append(" \n"); // NOI18N } } --- 1807,1820 ---- } private void appendMaximizedMode (WindowManagerConfig wmc, StringBuffer buff) { ! if ((wmc.editorMaximizedModeName != null && !"".equals(wmc.editorMaximizedModeName)) ! || (wmc.viewMaximizedModeName != null && !"".equals(wmc.viewMaximizedModeName))) { ! buff.append(" \n"); // NOI18N } } Index: core/windows/src/org/netbeans/core/windows/view/ViewHierarchy.java *** D:\projects\nb\core\windows\src\org\netbeans\core\windows\view\ViewHierarchy.java Base (1.46) --- D:\projects\nb\core\windows\src\org\netbeans\core\windows\view\ViewHierarchy.java Locally Modified (Based On 1.46) *************** *** 744,749 **** --- 744,753 ---- desktop.performSlideResize(operation); } + public void performSlideToggleMaximize( TopComponent tc, String side ) { + desktop.performSlideToggleMaximize( tc, side, getPureEditorAreaBounds()); + } + private void setMainWindowDesktop(Component component) { setDesktop(component, true); } Index: core/windows/src/org/netbeans/core/windows/view/View.java *** D:\projects\nb\core\windows\src\org\netbeans\core\windows\view\View.java Base (1.8) --- D:\projects\nb\core\windows\src\org\netbeans\core\windows\view\View.java Locally Modified (Based On 1.8) *************** *** 81,86 **** --- 81,87 ---- public int TOPCOMPONENT_REQUEST_ATTENTION = 63; public int TOPCOMPONENT_CANCEL_REQUEST_ATTENTION = 64; + public int CHANGE_MAXIMIZE_TOPCOMPONENT_SLIDE_IN = 65; /** Provides GUI changes to manifest model changes to user. */ public void changeGUI(ViewEvent[] viewEvents, WindowSystemSnapshot snapshot); Index: core/windows/src/org/netbeans/core/windows/model/DefaultModeModel.java *** D:\projects\nb\core\windows\src\org\netbeans\core\windows\model\DefaultModeModel.java Base (1.11) --- D:\projects\nb\core\windows\src\org\netbeans\core\windows\model\DefaultModeModel.java Locally Modified (Based On 1.11) *************** *** 137,142 **** --- 137,148 ---- } } + public void setUnloadedPreviousSelectedTopComponent(String tcID) { + synchronized(LOCK_TOPCOMPONENTS) { + topComponentSubModel.setUnloadedPreviousSelectedTopComponent(tcID); + } + } + /** Sets seleted TopComponent. */ public void setSelectedTopComponent(TopComponent selected) { synchronized(LOCK_TOPCOMPONENTS) { *************** *** 144,149 **** --- 150,161 ---- } } + public void setPreviousSelectedTopComponent(TopComponent prevSelected) { + synchronized(LOCK_TOPCOMPONENTS) { + topComponentSubModel.setPreviousSelectedTopComponent(prevSelected); + } + } + /** Sets frame state */ public void setFrameState(int frameState) { synchronized(LOCK_FRAMESTATE) { *************** *** 241,246 **** --- 253,264 ---- return topComponentSubModel.getSelectedTopComponent(); } } + /** Gets the top component that was selected before switching to/from maximized mode */ + public TopComponent getPreviousSelectedTopComponent() { + synchronized(LOCK_TOPCOMPONENTS) { + return topComponentSubModel.getPreviousSelectedTopComponent(); + } + } /** Gets list of top components. */ public List getOpenedTopComponents() { *************** *** 279,284 **** --- 297,308 ---- return getContextSubModel().getTopComponentPreviousMode(tcID); } } + /** Gets the tab index of the top component in its previous mode */ + public int getTopComponentPreviousIndex(String tcID) { + synchronized(LOCK_TC_CONTEXTS) { + return getContextSubModel().getTopComponentPreviousIndex(tcID); + } + } public void setTopComponentPreviousConstraints(String tcID, SplitConstraint[] constraints) { synchronized(LOCK_TC_CONTEXTS) { *************** *** 286,294 **** } } ! public void setTopComponentPreviousMode(String tcID, ModeImpl mode) { synchronized(LOCK_TC_CONTEXTS) { ! getContextSubModel().setTopComponentPreviousMode(tcID, mode); } } --- 310,318 ---- } } ! public void setTopComponentPreviousMode(String tcID, ModeImpl mode, int prevIndex) { synchronized(LOCK_TC_CONTEXTS) { ! getContextSubModel().setTopComponentPreviousMode(tcID, mode, prevIndex); } } Index: core/windows/src/org/netbeans/core/windows/model/TopComponentSubModel.java *** D:\projects\nb\core\windows\src\org\netbeans\core\windows\model\TopComponentSubModel.java Base (1.13) --- D:\projects\nb\core\windows\src\org\netbeans\core\windows\model\TopComponentSubModel.java Locally Modified (Based On 1.13) *************** *** 47,52 **** --- 47,54 ---- private final int kind; /** Selected TopComponent ID. Has to be present in openedTopComponenets. */ private String selectedTopComponentID; + /** ID of top component that was the selected one before switching to/from maximized mode */ + private String previousSelectedTopComponentID; public TopComponentSubModel(int kind) { this.kind = kind; *************** *** 264,269 **** --- 266,278 ---- } } + public void setPreviousSelectedTopComponent(TopComponent tc) { + if(tc != null ) + previousSelectedTopComponentID = getID(tc); + else + previousSelectedTopComponentID = null; + } + public void setUnloadedSelectedTopComponent(String tcID) { if(tcID != null && !getOpenedTopComponentsIDs().contains(tcID)) { return; *************** *** 272,277 **** --- 281,290 ---- selectedTopComponentID = tcID; } + public void setUnloadedPreviousSelectedTopComponent(String tcID) { + previousSelectedTopComponentID = tcID; + } + public List getOpenedTopComponentsIDs() { List l = new ArrayList(openedTopComponents.size()); for(Iterator it = openedTopComponents.iterator(); it.hasNext(); ) { *************** *** 301,306 **** --- 314,325 ---- return getTopComponent(selectedTopComponentID); } + public TopComponent getPreviousSelectedTopComponent() { + if( null != previousSelectedTopComponentID ) + return getTopComponent(previousSelectedTopComponentID); + return null; + } + private static TopComponent getTopComponent(String tcID) { return WindowManagerImpl.getInstance().getTopComponentForID(tcID); } Index: core/windows/src/org/netbeans/core/windows/PersistenceHandler.java *** D:\projects\nb\core\windows\src\org\netbeans\core\windows\PersistenceHandler.java Base (1.44) --- D:\projects\nb\core\windows\src\org\netbeans\core\windows\PersistenceHandler.java Locally Modified (Based On 1.44) *************** *** 139,145 **** } ModeImpl activeMode = null; ! ModeImpl maximizedMode = null; // First create empty modes. Map mode2config = new HashMap(); --- 139,146 ---- } ModeImpl activeMode = null; ! ModeImpl editorMaximizedMode = null; ! ModeImpl viewMaximizedMode = null; // First create empty modes. Map mode2config = new HashMap(); *************** *** 154,161 **** if(mc.name.equals(wmc.activeModeName)) { activeMode = mode; } ! if(mc.name.equals(wmc.maximizedModeName)) { ! maximizedMode = mode; } } --- 155,164 ---- if(mc.name.equals(wmc.activeModeName)) { activeMode = mode; } ! if(mc.name.equals(wmc.editorMaximizedModeName)) { ! editorMaximizedMode = mode; ! } else if(mc.name.equals(wmc.viewMaximizedModeName)) { ! viewMaximizedMode = mode; } } *************** *** 170,176 **** --- 173,182 ---- if(mc.selectedTopComponentID != null) { mode.setUnloadedSelectedTopComponent(mc.selectedTopComponentID); } + if(mc.previousSelectedTopComponentID != null) { + mode.setUnloadedPreviousSelectedTopComponent(mc.previousSelectedTopComponentID); } + } //Initialize top component groups for (int i = 0; i < wmc.groups.length; i++) { *************** *** 190,196 **** // project layer, that can cause out of synch state when switching projects... // setting null is however considered a valid state. wm.setActiveMode(activeMode); ! wm.setMaximizedMode(maximizedMode); Rectangle joinedBounds = computeBounds( wmc.centeredHorizontallyJoined, --- 196,203 ---- // project layer, that can cause out of synch state when switching projects... // setting null is however considered a valid state. wm.setActiveMode(activeMode); ! wm.setEditorMaximizedMode(editorMaximizedMode); ! wm.setViewMaximizedMode(viewMaximizedMode); Rectangle joinedBounds = computeBounds( wmc.centeredHorizontallyJoined, *************** *** 307,313 **** } } if (previous != null) { ! WindowManagerImpl.getInstance().setPreviousModeForTopComponent(tcRefConfig.tc_id, mode, previous); } else { Logger.getLogger(PersistenceHandler.class.getName()).log(Level.WARNING, null, new java.lang.NullPointerException("Cannot find previous mode named \'" + --- 314,320 ---- } } if (previous != null) { ! WindowManagerImpl.getInstance().setPreviousModeForTopComponent(tcRefConfig.tc_id, mode, previous, tcRefConfig.previousIndex); } else { Logger.getLogger(PersistenceHandler.class.getName()).log(Level.WARNING, null, new java.lang.NullPointerException("Cannot find previous mode named \'" + *************** *** 320,325 **** --- 327,333 ---- } private ModeImpl initModeFromConfig(ModeImpl mode, ModeConfig mc) { + WindowManagerImpl wm = WindowManagerImpl.getInstance(); for (int j = 0; j < mc.tcRefConfigs.length; j++) { TCRefConfig tcRefConfig = (TCRefConfig) mc.tcRefConfigs[j]; if(DEBUG) { *************** *** 336,341 **** --- 344,352 ---- } else { mode.addUnloadedTopComponent(tcRefConfig.tc_id); } + wm.setTopComponentDockedInMaximizedMode( tcRefConfig.tc_id, tcRefConfig.dockedInMaximizedMode ); + wm.setTopComponentSlidedInDefaultMode( tcRefConfig.tc_id, !tcRefConfig.dockedInDefaultMode ); + wm.setTopComponentMaximizedWhenSlidedIn( tcRefConfig.tc_id, tcRefConfig.slidedInMaximized ); } // PENDING Refine the unneded computing. *************** *** 478,494 **** wmc.activeModeName = mo.getName(); } ! mo = wmi.getMaximizedMode(); if(DEBUG) { ! debugLog("maximized mode=" + mo); // NOI18N } if (mo != null) { ! wmc.maximizedModeName = mo.getName(); } wmc.toolbarConfiguration = wmi.getToolbarConfigName(); if(DEBUG) { --- 489,510 ---- wmc.activeModeName = mo.getName(); } ! mo = wmi.getEditorMaximizedMode(); if(DEBUG) { ! debugLog("editor maximized mode=" + mo); // NOI18N } if (mo != null) { ! wmc.editorMaximizedModeName = mo.getName(); } + mo = wmi.getViewMaximizedMode(); + if(DEBUG) { + debugLog("view maximized mode=" + mo); // NOI18N + } + if (mo != null) { + wmc.viewMaximizedModeName = mo.getName(); + } + wmc.toolbarConfiguration = wmi.getToolbarConfigName(); if(DEBUG) { debugLog("toolbarConfiguration=" + wmc.toolbarConfiguration); // NOI18N *************** *** 586,591 **** --- 605,621 ---- debugLog("mode permanent=" + modeCfg.permanent); // NOI18N } + TopComponent prevSelectedTC = mode.getPreviousSelectedTopComponent(); + if(prevSelectedTC != null) { + if (pm.isTopComponentPersistent(prevSelectedTC)) { + String tc_id = wm.findTopComponentID(prevSelectedTC); + if(DEBUG) { + debugLog("previous selected tc=" + selectedTC.getName()); // NOI18N + } + modeCfg.previousSelectedTopComponentID = tc_id; + } + } + // TopComponents: List tcRefCfgList = new ArrayList(); List openedTcIDs = mode.getOpenedTopComponentsIDs(); *************** *** 593,603 **** String tcID = (String)it.next(); boolean opened = openedTcIDs.contains(tcID); - if(opened) { TopComponent tc = wm.findTopComponent(tcID); if(tc == null || !pm.isTopComponentPersistent(tc)) { continue; --- 623,630 ---- String tcID = (String)it.next(); boolean opened = openedTcIDs.contains(tcID); TopComponent tc = wm.findTopComponent(tcID); + if(opened) { if(tc == null || !pm.isTopComponentPersistent(tc)) { continue; } *************** *** 602,614 **** // #45981: save previous mode even for closed tcs String modeName = null; ! if (mode.getKind() == Constants.MODE_KIND_SLIDING) { ModeImpl prev = wm.getPreviousModeForTopComponent(tcID, mode); if (prev != null) { modeName = prev.getName(); } } --- 632,643 ---- // #45981: save previous mode even for closed tcs String modeName = null; ! int prevIndex = -1; ! if (mode.getKind() == Constants.MODE_KIND_SLIDING || mode.getState() == Constants.MODE_STATE_SEPARATED) { ModeImpl prev = wm.getPreviousModeForTopComponent(tcID, mode); if (prev != null) { modeName = prev.getName(); + prevIndex = wm.getPreviousIndexForTopComponent(tcID, mode); } } *************** *** 616,621 **** --- 648,657 ---- tcRefCfg.tc_id = tcID; tcRefCfg.opened = opened; tcRefCfg.previousMode = modeName; + tcRefCfg.previousIndex = prevIndex; + tcRefCfg.dockedInMaximizedMode = wm.isTopComponentDockedInMaximizedMode( tcID ); + tcRefCfg.dockedInDefaultMode = !wm.isTopComponentSlidedInDefaultMode( tcID ); + tcRefCfg.slidedInMaximized = wm.isTopComponentMaximizedWhenSlidedIn( tcID ); tcRefCfgList.add(tcRefCfg); } *************** *** 707,712 **** --- 743,753 ---- debugLog("WMI.topComponentRefConfigAdded mo:" + modeName + " tcRef:" + tcRefConfig.tc_id); // NOI18N } + WindowManagerImpl wm = WindowManagerImpl.getInstance(); + wm.setTopComponentDockedInMaximizedMode( tcRefConfig.tc_id, tcRefConfig.dockedInMaximizedMode ); + wm.setTopComponentSlidedInDefaultMode( tcRefConfig.tc_id, !tcRefConfig.dockedInDefaultMode ); + wm.setTopComponentMaximizedWhenSlidedIn( tcRefConfig.tc_id, tcRefConfig.slidedInMaximized ); + TopComponent tc = getTopComponentForID(tcRefConfig.tc_id); if(tc != null) { ModeImpl mode = (ModeImpl)name2mode.get(modeName); *************** *** 848,854 **** buffer.append("\n-- screenSize: " + wmc.screenSize); buffer.append("\n-- activeModeName: " + wmc.activeModeName); ! buffer.append("\n-- maximizedModeName: " + wmc.maximizedModeName); buffer.append("\n-- toolbarconfig: " + wmc.toolbarConfiguration); buffer.append("\n-- modes: " + Arrays.toString(wmc.modes) + " size " + (wmc.modes == null ? -1 : wmc.modes.length)); for (int i = 0; i < wmc.modes.length; i++) { --- 889,896 ---- buffer.append("\n-- screenSize: " + wmc.screenSize); buffer.append("\n-- activeModeName: " + wmc.activeModeName); ! buffer.append("\n-- editorMaximizedModeName: " + wmc.editorMaximizedModeName); ! buffer.append("\n-- viewMaximizedModeName: " + wmc.viewMaximizedModeName); buffer.append("\n-- toolbarconfig: " + wmc.toolbarConfiguration); buffer.append("\n-- modes: " + Arrays.toString(wmc.modes) + " size " + (wmc.modes == null ? -1 : wmc.modes.length)); for (int i = 0; i < wmc.modes.length; i++) { Index: core/windows/src/org/netbeans/core/windows/view/DefaultView.java *** D:\projects\nb\core\windows\src\org\netbeans\core\windows\view\DefaultView.java Base (1.57) --- D:\projects\nb\core\windows\src\org\netbeans\core\windows\view\DefaultView.java Locally Modified (Based On 1.57) *************** *** 88,94 **** toReturn = Constants.LEFT; } } else { - Rectangle compb = comp.getBounds(); Rectangle editorb = hierarchy.getPureEditorAreaBounds(); Point leftTop = new Point(0, 0); SwingUtilities.convertPointToScreen(leftTop, comp); --- 88,93 ---- *************** *** 106,112 **** return toReturn; } - public void changeGUI(ViewEvent[] viewEvents, WindowSystemSnapshot snapshot) { // Change to view understandable-convenient structure. --- 105,110 ---- *************** *** 446,457 **** Logger.getLogger(DefaultView.class.getName()).fine( "Could not find mode " + viewEvent.getSource()); } ! } } Set toHide = new HashSet(oldShowing); --- 444,458 ---- Logger.getLogger(DefaultView.class.getName()).fine( "Could not find mode " + viewEvent.getSource()); } ! } else if (changeType == View.CHANGE_MAXIMIZE_TOPCOMPONENT_SLIDE_IN) { ! if (DEBUG) { ! debugLog("Slided-in top component toggle maximize"); //NOI18N } + TopComponent tc = (TopComponent)viewEvent.getSource(); + String side = (String)viewEvent.getNewValue(); + hierarchy.performSlideToggleMaximize( tc, side ); } + } Set toHide = new HashSet(oldShowing); toHide.removeAll(newShowing); Index: core/windows/src/org/netbeans/core/windows/resources/tc-ref2_2.dtd *** D:\projects\nb\core\windows\src\org\netbeans\core\windows\resources\tc-ref2_2.dtd No Base Revision --- D:\projects\nb\core\windows\src\org\netbeans\core\windows\resources\tc-ref2_2.dtd Locally New *************** *** 1,0 **** --- 1,102 ---- + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Index: core/windows/src/org/netbeans/core/windows/view/ui/slides/SlideBar.java *** D:\projects\nb\core\windows\src\org\netbeans\core\windows\view\ui\slides\SlideBar.java Base (1.25) --- D:\projects\nb\core\windows\src\org\netbeans\core\windows\view\ui\slides\SlideBar.java Locally Modified (Based On 1.25) *************** *** 90,95 **** --- 90,98 ---- /** Action command indicating that component is going from auto-hide state to regular */ public static final String COMMAND_DISABLE_AUTO_HIDE = "disableAutoHide"; //NOI18N + /** Action command indicating that component is going from regular to maximized size and vice versa */ + public static final String COMMAND_MAXIMIZE = "slideMaximize"; //NOI18N + /** Asociation with Tabbed implementation */ private final TabbedSlideAdapter tabbed; /** Holds all data of slide bar */ Index: core/windows/src/org/netbeans/core/windows/resources/mode-properties2_3.dtd *** D:\projects\nb\core\windows\src\org\netbeans\core\windows\resources\mode-properties2_3.dtd No Base Revision --- D:\projects\nb\core\windows\src\org\netbeans\core\windows\resources\mode-properties2_3.dtd Locally New *************** *** 1,0 **** --- 1,193 ---- + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Index: core/windows/src/org/netbeans/core/windows/model/TopComponentContextSubModel.java *** D:\projects\nb\core\windows\src\org\netbeans\core\windows\model\TopComponentContextSubModel.java Base (1.5) --- D:\projects\nb\core\windows\src\org\netbeans\core\windows\model\TopComponentContextSubModel.java Locally Modified (Based On 1.5) *************** *** 40,45 **** --- 40,47 ---- private static final class Context { // XXX we should use weak reference for holding mode, to let it vanish ModeImpl mode; + //tab index + int index = -1; SplitConstraint[] constraints; } // end of Context *************** *** 59,74 **** context.constraints = constraints; } ! public void setTopComponentPreviousMode(String tcID, ModeImpl mode) { Context context = tcID2Contexts.get(tcID); if (context == null) { context = new Context(); tcID2Contexts.put(tcID, context); } context.mode = mode; } --- 61,74 ---- context.constraints = constraints; } ! public void setTopComponentPreviousMode(String tcID, ModeImpl mode, int index) { Context context = tcID2Contexts.get(tcID); if (context == null) { context = new Context(); tcID2Contexts.put(tcID, context); } context.mode = mode; + context.index = index; } public SplitConstraint[] getTopComponentPreviousConstraints(String tcID) { *************** *** 78,84 **** --- 81,92 ---- return context == null ? null : context.mode; } + public int getTopComponentPreviousIndex(String tcID) { + Context context = tcID2Contexts.get(tcID); + return context == null ? -1 : context.index; } + } Index: core/windows/src/org/netbeans/core/windows/view/ui/TabbedHandler.java *** D:\projects\nb\core\windows\src\org\netbeans\core\windows\view\ui\TabbedHandler.java Base (1.25) --- D:\projects\nb\core\windows\src\org\netbeans\core\windows\view\ui\TabbedHandler.java Locally Modified (Based On 1.25) *************** *** 341,346 **** --- 341,350 ---- } else if (SlideBar.COMMAND_DISABLE_AUTO_HIDE.equals(cmd)) { TopComponent tc = (TopComponent) tabbed.getTopComponentAt(sbe.getTabIndex()); modeView.getController().userDisabledAutoHide(modeView, tc); + } else if( SlideBar.COMMAND_MAXIMIZE == cmd ) { + TopComponent tc = (TopComponent) tabbed.getTopComponentAt(sbe.getTabIndex()); + MaximizeWindowAction mwa = new MaximizeWindowAction(tc); + mwa.actionPerformed(e); } } } *************** *** 518,524 **** public void setStartBounds(Rectangle bounds) { original.setStartBounds(bounds); } - } } --- 522,527 ---- Index: core/windows/src/org/netbeans/core/windows/WindowManagerImpl.java *** D:\projects\nb\core\windows\src\org\netbeans\core\windows\WindowManagerImpl.java Base (1.50) --- D:\projects\nb\core\windows\src\org\netbeans\core\windows\WindowManagerImpl.java Locally Modified (Based On 1.50) *************** *** 19,26 **** package org.netbeans.core.windows; - import java.util.ArrayList; - import java.awt.*; import java.beans.*; import java.net.URL; --- 19,24 ---- *************** *** 657,673 **** return central.getEditorAreaFrameState(); } ! public void setMaximizedMode(ModeImpl maximizedMode) { ! central.setMaximizedMode(maximizedMode); } ! public ModeImpl getMaximizedMode() { ! return central.getMaximizedMode(); } /** Sets constraints, delegates from ModeImpl. */ public void setModeConstraints(ModeImpl mode, SplitConstraint[] modeConstraints) { --- 655,693 ---- return central.getEditorAreaFrameState(); } ! /** ! * Sets new maximized mode or cancels the current one. ! * @param newMaximizedMode Mode to set as the maximized one or null to cancel the current one. ! */ ! public void switchMaximizedMode(ModeImpl newMaximizedMode) { ! central.switchMaximizedMode(newMaximizedMode); } ! /** Sets editor mode that is currenlty maximized (used when the window system loads) */ ! public void setEditorMaximizedMode(ModeImpl editorMaximizedMode) { ! central.setEditorMaximizedMode(editorMaximizedMode); } + /** Sets view mode that is currenlty maximized (used when the window system loads) */ + public void setViewMaximizedMode(ModeImpl viewMaximizedMode) { + central.setViewMaximizedMode(viewMaximizedMode); + } + + /** Gets mode that is currently maximized. */ + public ModeImpl getCurrentMaximizedMode() { + return central.getCurrentMaximizedMode(); + } + + /** Gets editor maximized mode. */ + public ModeImpl getEditorMaximizedMode() { + return central.getEditorMaximizedMode(); + } + + /** Gets view maximized mode. */ + public ModeImpl getViewMaximizedMode() { + return central.getViewMaximizedMode(); + } + /** Sets constraints, delegates from ModeImpl. */ public void setModeConstraints(ModeImpl mode, SplitConstraint[] modeConstraints) { central.setModeConstraints(mode, modeConstraints); *************** *** 1011,1016 **** --- 1034,1040 ---- "TopComponent"); //NOI18N } + ModeImpl mode = getMode(tc); if(mode == null) { *************** *** 1019,1038 **** tc.putClientProperty (Constants.TOPCOMPONENT_ALLOW_DOCK_ANYWHERE, Boolean.TRUE); } } // XXX PENDING If necessary, unmaximize the state, but exclude sliding modes // Consider to put it in addOpenedTopComponent, to do it in one step. ! ModeImpl maximizedMode = getMaximizedMode(); ! if(maximizedMode != null && mode != maximizedMode && ! mode.getKind() != Constants.MODE_KIND_SLIDING) { ! setMaximizedMode(null); } mode.addOpenedTopComponent(tc); } protected void topComponentClose(TopComponent tc) { --- 1043,1074 ---- tc.putClientProperty (Constants.TOPCOMPONENT_ALLOW_DOCK_ANYWHERE, Boolean.TRUE); } } + boolean alreadyOpened = mode.getOpenedTopComponents().contains( tc ); // XXX PENDING If necessary, unmaximize the state, but exclude sliding modes // Consider to put it in addOpenedTopComponent, to do it in one step. ! ModeImpl maximizedMode = getCurrentMaximizedMode(); ! if(maximizedMode != null && mode != maximizedMode ! && mode.getKind() != Constants.MODE_KIND_SLIDING ! && central.isViewMaximized() ) { ! switchMaximizedMode(null); } mode.addOpenedTopComponent(tc); + + if( central.isEditorMaximized() + && !alreadyOpened + && mode.getState() != Constants.MODE_STATE_SEPARATED ) { + //the editor is maximized so the newly opened TopComponent should slide out + String tcID = findTopComponentID( tc ); + if( !isTopComponentDockedInMaximizedMode( tcID ) ) { + //slide the TopComponent to edgebar and slide it out + central.slide( tc, mode, central.getSlideSideForMode( mode ) ); + + topComponentRequestActive( tc ); } + } + } protected void topComponentClose(TopComponent tc) { assertEventDispatchThreadWeak(); *************** *** 1204,1221 **** return null; } ! public ModeImpl getPreviousModeForTopComponent(String tcID, ModeImpl slidingMode) { return getCentral().getModeTopComponentPreviousMode(tcID, slidingMode); } ! public void setPreviousModeForTopComponent(String tcID, ModeImpl slidingMode, ModeImpl prevMode) { ! getCentral().setModeTopComponentPreviousMode(tcID, slidingMode, prevMode); } /** Finds out if given Window is used as separate floating window or not. * --- 1243,1343 ---- return null; } ! /** ! * @return The mode where the given TopComponent had been before it was moved to sliding or separate mode. ! */ public ModeImpl getPreviousModeForTopComponent(String tcID, ModeImpl slidingMode) { return getCentral().getModeTopComponentPreviousMode(tcID, slidingMode); } ! /** ! * @return The position (tab index) of the given TopComponent before it was moved to sliding or separate mode. ! */ ! public int getPreviousIndexForTopComponent(String tcID, ModeImpl slidingMode) { ! return getCentral().getModeTopComponentPreviousIndex(tcID, slidingMode); ! } + /** + * Remember the mode and position where the given TopComponent was before moving into sliding or separate mode. + * + * @param tcID TopComponent's id + * @param currentSlidingMode The mode where the TopComponent is at the moment. + * @param prevMode The mode where the TopComponent had been before it was moved to the sliding mode. + * @param prevIndex Tab index of the TopComponent before it was moved to the new mode. + */ + public void setPreviousModeForTopComponent(String tcID, ModeImpl slidingMode, ModeImpl prevMode, int prevIndex) { + getCentral().setModeTopComponentPreviousMode(tcID, slidingMode, prevMode, prevIndex); + } + + /** + * Set the state of the TopComponent when the editor is maximized. + * + * @param tcID TopComponent id + * @param docked True if the TopComponent should stay docked in maximized editor mode, + * false if it should slide out when the editor is maximized. + */ + public void setTopComponentDockedInMaximizedMode( String tcID, boolean docked ) { + getCentral().setTopComponentDockedInMaximizedMode( tcID, docked ); + } + + /** + * Get the state of the TopComponent when the editor is maximized. + * + * @param tcID TopComponent id. + * @return True if the TopComponent should stay docked in maximized editor mode, + * false if it should slide out when the editor is maximized. + */ + public boolean isTopComponentDockedInMaximizedMode( String tcID ) { + return getCentral().isTopComponentDockedInMaximizedMode( tcID ); + } + + /** + * Set the state of the TopComponent when no mode is maximized. + * + * @param tcID TopComponent id + * @param slided True if the TopComponent is slided in the default mode, + * false if it is docked. + */ + public void setTopComponentSlidedInDefaultMode( String tcID, boolean slided ) { + getCentral().setTopComponentSlidedInDefaultMode( tcID, slided ); + } + + /** + * Get the state of the TopComponent when no mode is maximized. + * + * @param tcID TopComponent id. + * @return True if the TopComponent is slided in the default mode, + * false if it is docked. + */ + public boolean isTopComponentSlidedInDefaultMode( String tcID ) { + return getCentral().isTopComponentSlidedInDefaultMode( tcID ); + } + + /** + * Get the state of the TopComponent when it is slided-in. + * + * @param tcID TopComponent id. + * @return true if the TopComponent is maximized when slided-in. + */ + public boolean isTopComponentMaximizedWhenSlidedIn( String tcID ) { + return getCentral().isTopComponentMaximizedWhenSlidedIn( tcID ); + } + + /** + * Set the state of the TopComponent when it is slided-in. + * + * @param tcID TopComponent id. + * @param maximized true if the TopComponent is maximized when slided-in. + */ + public void setTopComponentMaximizedWhenSlidedIn( String tcID, boolean maximized ) { + getCentral().setTopComponentMaximizedWhenSlidedIn( tcID, maximized ); + } + + public void userToggledTopComponentSlideInMaximize( String tcID ) { + getCentral().userToggledTopComponentSlideInMaximize( tcID ); + } + /** Finds out if given Window is used as separate floating window or not. * * @return true if Window is separate floating window, false if window Index: core/windows/src/org/netbeans/core/windows/persistence/PersistenceManager.java *** D:\projects\nb\core\windows\src\org\netbeans\core\windows\persistence\PersistenceManager.java Base (1.39) --- D:\projects\nb\core\windows\src\org\netbeans\core\windows\persistence\PersistenceManager.java Locally Modified (Based On 1.39) *************** *** 943,953 **** --- 943,955 ---- || ModeParser.INSTANCE_DTD_ID_2_0.equals(publicId) || ModeParser.INSTANCE_DTD_ID_2_1.equals(publicId) || ModeParser.INSTANCE_DTD_ID_2_2.equals(publicId) + || ModeParser.INSTANCE_DTD_ID_2_3.equals(publicId) || GroupParser.INSTANCE_DTD_ID_2_0.equals(publicId) || TCGroupParser.INSTANCE_DTD_ID_2_0.equals(publicId) || TCRefParser.INSTANCE_DTD_ID_1_0.equals(publicId) || TCRefParser.INSTANCE_DTD_ID_2_0.equals(publicId) || TCRefParser.INSTANCE_DTD_ID_2_1.equals(publicId) + || TCRefParser.INSTANCE_DTD_ID_2_2.equals(publicId) || WindowManagerParser.INSTANCE_DTD_ID_1_0.equals(publicId) || WindowManagerParser.INSTANCE_DTD_ID_1_1.equals(publicId) || WindowManagerParser.INSTANCE_DTD_ID_2_0.equals(publicId) *************** *** 1103,1108 **** --- 1105,1113 ---- if (id.equals(mc.selectedTopComponentID)) { mc.selectedTopComponentID = ""; } + if (id.equals(mc.previousSelectedTopComponentID)) { + mc.previousSelectedTopComponentID = ""; + } boolean removeFromMode = false; for (int j = 0; j < mc.tcRefConfigs.length; j++) { if (id.equals(mc.tcRefConfigs[j].tc_id)) { Index: core/windows/src/org/netbeans/core/windows/actions/SwitchToRecentDocumentAction.java *** D:\projects\nb\core\windows\src\org\netbeans\core\windows\actions\SwitchToRecentDocumentAction.java Base (1.5) --- D:\projects\nb\core\windows\src\org\netbeans\core\windows\actions\SwitchToRecentDocumentAction.java Locally Modified (Based On 1.5) *************** *** 66,73 **** if(mode.getKind() == Constants.MODE_KIND_EDITOR) { // #37030 Unmaximize other mode if needed. ! if(mode != wm.getMaximizedMode()) { ! wm.setMaximizedMode(null); } tc.requestActive(); break; --- 66,73 ---- if(mode.getKind() == Constants.MODE_KIND_EDITOR) { // #37030 Unmaximize other mode if needed. ! if(mode != wm.getCurrentMaximizedMode()) { ! wm.switchMaximizedMode(null); } tc.requestActive(); break; Index: core/windows/src/org/netbeans/core/windows/persistence/ModeConfig.java *** D:\projects\nb\core\windows\src\org\netbeans\core\windows\persistence\ModeConfig.java Base (1.8) --- D:\projects\nb\core\windows\src\org\netbeans\core\windows\persistence\ModeConfig.java Locally Modified (Based On 1.8) *************** *** 69,80 **** --- 69,84 ---- /** TopComponent ID -> slided-in size (width or height) - applies to sliding modes only*/ public Map slideInSizes; + /** ID of top component that was selected before switching to/from maximized mode */ + public String previousSelectedTopComponentID; + /** Creates a new instance of ModeConfig */ public ModeConfig() { name = ""; // NOI18N constraints = new SplitConstraint[0]; selectedTopComponentID = ""; // NOI18N tcRefConfigs = new TCRefConfig[0]; + previousSelectedTopComponentID = ""; // NOI18N } public boolean equals (Object obj) { *************** *** 148,153 **** --- 152,160 ---- } else if( null != slideInSizes || null != modeCfg.slideInSizes ) { return false; } + if (!previousSelectedTopComponentID.equals(modeCfg.previousSelectedTopComponentID)) { + return false; + } return true; } *************** *** 181,186 **** --- 188,194 ---- hash = 37 * hash + slideInSizes.get(key).hashCode(); } } + hash = 37 * hash + previousSelectedTopComponentID.hashCode(); return hash; } Index: core/windows/src/org/netbeans/core/windows/model/SplitSubModel.java *** D:\projects\nb\core\windows\src\org\netbeans\core\windows\model\SplitSubModel.java Base (1.16) --- D:\projects\nb\core\windows\src\org\netbeans\core\windows\model\SplitSubModel.java Locally Modified (Based On 1.16) *************** *** 87,92 **** --- 87,158 ---- return modeNode.getNodeConstraints(); } + /** + * Find the side (LEFT/RIGHT/BOTTOM) where the TopComponent from the given + * mode should slide to. The position is deducted from mode's position relative + * to the editor mode in the split hierarchy. + * + * @param mode Mode + * @return The slide side for TopComponents from the given mode. + */ + public String getSlideSideForMode( ModeImpl mode ) { + ModeNode modeNode = getModeNode( mode ); + return getPositionRelativeToEditor( modeNode, modeNode.getParent() ); + } + + /** + * Find recursively the position of the given Node relative to editor node. + * + * @param node The Node who's position is being compared with editor node's position. + * @param parent Node's split parent. + * @return LEFT/RIGHT/BOTTOM/TOP according to Node's position in the hierarchy. + */ + private String getPositionRelativeToEditor( Node node, SplitNode parent ) { + if( null == parent ) + return Constants.LEFT; //fallback - we're at the top level of the hierarchy + + Node editorNode = getEditorChildNode( parent ); + if( null != editorNode ) { + //the split parent contains a node or sub-tree with editor node + //so let's compare their positions + int orientation = parent.getOrientation(); + int nodeIndex = parent.getChildIndex( node ); + int editorIndex = parent.getChildIndex( editorNode ); + if( orientation == Constants.VERTICAL ) { + if( nodeIndex > editorIndex ) + return Constants.BOTTOM; + return Constants.TOP; //TODO: is this really OK? + } else { + if( nodeIndex < editorIndex ) + return Constants.LEFT; + return Constants.RIGHT; + } + } + //try one level up in the tree hierarchy + return getPositionRelativeToEditor( parent, parent.getParent() ); + } + + /** + * Find the child node that contains the editor node or the child that has the editor + * node in its sub-tree. + * + * @param split SplitNode searched for editor node. + * @return Node which is the editor node or which has the editor node in its sub-tree. + */ + private Node getEditorChildNode( SplitNode split ) { + List children = split.getChildren(); + for( Iterator i=children.iterator(); i.hasNext(); ) { + Node node = i.next(); + if( node instanceof EditorSplitSubModel.EditorNode + || + node instanceof SplitNode && null != getEditorChildNode( (SplitNode)node ) ) { + return node; + } + } + return null; + } + + /** Adds mode which is Node * with specified constraints designating the path in model. * Note: It is important to know that adding of mode can affect the structure *************** *** 1020,1025 **** --- 1086,1097 ---- return false; } + if(mode.getKind() == Constants.MODE_KIND_EDITOR ) { + WindowManagerImpl wm = WindowManagerImpl.getInstance(); + if( null != wm.getEditorMaximizedMode() && wm.getEditorMaximizedMode() != mode ) + return false; + } + return true; } Index: core/windows/src/org/netbeans/core/windows/model/DockingStatus.java *** D:\projects\nb\core\windows\src\org\netbeans\core\windows\model\DockingStatus.java No Base Revision --- D:\projects\nb\core\windows\src\org\netbeans\core\windows\model\DockingStatus.java Locally New *************** *** 1,0 **** --- 1,129 ---- + /* + * The contents of this file are subject to the terms of the Common Development + * and Distribution License (the License). You may not use this file except in + * compliance with the License. + * + * You can obtain a copy of the License at http://www.netbeans.org/cddl.html + * or http://www.netbeans.org/cddl.txt. + * + * When distributing Covered Code, include this CDDL Header Notice in each file + * and include the License file at http://www.netbeans.org/cddl.txt. + * If applicable, add the following below the CDDL Header, with the fields + * enclosed by brackets [] replaced by your own identifying information: + * "Portions Copyrighted [year] [name of copyright owner]" + * + * The Original Software is NetBeans. The Initial Developer of the Original + * Software is Sun Microsystems, Inc. Portions Copyright 1997-2006 Sun + * Microsystems, Inc. All Rights Reserved. + */ + + package org.netbeans.core.windows.model; + + import java.util.ArrayList; + import java.util.Iterator; + import java.util.List; + import java.util.Set; + import org.netbeans.core.windows.Constants; + import org.netbeans.core.windows.ModeImpl; + import org.netbeans.core.windows.WindowManagerImpl; + import org.openide.windows.Mode; + import org.openide.windows.TopComponent; + + /** + * This class stores the snapshot of the docking status (docked/slided-out) of TopComponents + * when switching to or from maximized mode. + * + * @author S. Aubrecht + */ + public class DockingStatus { + + protected Model model; + protected List docked = new ArrayList(10); + protected List slided = new ArrayList(10); + + /** Creates a new instance of DockingStatus */ + DockingStatus( Model model ) { + this.model = model; + } + + /** + * Remember which TopComponents are docked and which are slided. + */ + public void mark() { + Set modes = model.getModes(); + for( Iterator i=modes.iterator(); i.hasNext(); ) { + ModeImpl modeImpl = i.next(); + if( modeImpl.getState() == Constants.MODE_STATE_SEPARATED ) + continue; + + List views = model.getModeOpenedTopComponentsIDs( modeImpl ); + if( modeImpl.getKind() == Constants.MODE_KIND_VIEW ) { + docked.addAll( views ); + slided.removeAll( views ); + } else if( modeImpl.getKind() == Constants.MODE_KIND_SLIDING ) { + docked.removeAll( views ); + slided.addAll( views ); + } + } + } + + /** + * @return True if the TopComponent should switch to docked status + * (Used when switching to/from maximized mode) + */ + public boolean shouldDock( String tcID ) { + return null != tcID && docked.contains( tcID ); + } + + /** + * @return True if the TopComponent should slide-out + * (Used when switching to/from maximized mode) + */ + public boolean shouldSlide( String tcID ) { + return null != tcID && slided.contains( tcID ); + } + + /** + * Adds 'docked' TopComponent (used when the window system loads) + */ + public void addDocked( String tcID ) { + if( null != tcID ) { + docked.add( tcID ); + slided.remove( tcID ); + } + } + + /** + * Adds 'slided-out' TopComponent (used when the window system loads) + */ + public void addSlided( String tcID ) { + if( null != tcID ) { + slided.add( tcID ); + docked.remove( tcID ); + } + } + + /** + * (Used when the window system gets stored) + * @return True if the given TopComponent was docked when its snapshot was taken. + */ + public boolean isDocked( String tcID ) { + return null != tcID && docked.contains( tcID ); + } + + /** + * (Used when the window system gets stored) + * @return True if the given TopComponent was slided when its snapshot was taken. + */ + public boolean isSlided( String tcID ) { + return null != tcID && slided.contains( tcID ); + } + + /** + * Reset to defaults + */ + void clear() { + docked.clear(); + slided.clear(); + } + } Index: core/windows/src/org/netbeans/core/windows/resources/mode-properties2_2.dtd *** D:\projects\nb\core\windows\src\org\netbeans\core\windows\resources\mode-properties2_2.dtd Base (1.1) --- D:\projects\nb\core\windows\src\org\netbeans\core\windows\resources\mode-properties2_2.dtd Locally Modified (Based On 1.1) *************** *** 75,82 **** > ! ! --- 2,15 ---- +