/** * Copyright (C) 2015 Valkyrie RCP * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package org.valkyriercp.application.docking; import org.valkyriercp.application.ApplicationWindow; import org.valkyriercp.application.PageComponent; import org.valkyriercp.application.PageDescriptor; import org.valkyriercp.application.PageLayoutBuilder; import org.valkyriercp.application.ViewDescriptor; import org.valkyriercp.application.support.AbstractApplicationPage; import javax.swing.*; import bibliothek.gui.DockFrontend; import bibliothek.gui.Dockable; import bibliothek.gui.dock.SplitDockStation; /** * @author Rogan Dawes */ public class DockingFramesApplicationPage extends AbstractApplicationPage implements PageLayoutBuilder { private SplitDockStation desktop; private DockFrontend dockFrontend; private boolean resolving = false; public DockingFramesApplicationPage(ApplicationWindow window, PageDescriptor pageDescriptor) { super(window, pageDescriptor); desktop = new SplitDockStation(); dockFrontend = new DockFrontend(window.getControl()); dockFrontend.addRoot("root", desktop); } protected PageComponent getPageComponent(Dockable dockable) { if (dockable instanceof ViewDescriptorDockable) return ((ViewDescriptorDockable) dockable).getPageComponent(); return null; } protected Dockable getDockable(PageComponent pageComponent) { for (int i = 0; i < desktop.getDockableCount(); i++) { Dockable dockable = desktop.getDockable(i); PageComponent pc = getPageComponent(dockable); if (pc == pageComponent) return dockable; } return null; } protected boolean giveFocusTo(PageComponent pageComponent) { Dockable dockable = getDockable(pageComponent); if (dockable == null) { return false; } // Don't request focus here, the DockingDesktop already shifts focus. If requesting focus at this point, // the DockingDesktop catches this event and fires another focus event. This might cause loops when // maximizing/minimizing/restoring because at that point a remove of the component is done which shifts // focus and after setting the correct docking state, a focus request is done. // see RCP-558 return true; } public void addView(String viewDescriptorId) { showView(viewDescriptorId); } protected void doAddPageComponent(PageComponent pageComponent) { if (resolving) return; pageComponent.getControl(); Dockable dockable = getDockable(pageComponent); if (dockable != null) return; dockable = createDockable(pageComponent); desktop.drop(dockable); } protected Dockable createDockable(PageComponent pageComponent) { return createDockable(getViewDescriptor(pageComponent.getId()), pageComponent); } protected Dockable createDockable(ViewDescriptor descriptor, PageComponent pageComponent) { return new ViewDescriptorDockable(descriptor, pageComponent); } protected void doRemovePageComponent(PageComponent pageComponent) { Dockable dockable = getDockable(pageComponent); if (dockable != null) { dockFrontend.remove(dockable); } } protected JComponent createControl() { return (JComponent) desktop.getComponent(); } protected void updatePageComponentProperties(PageComponent pageComponent) { Dockable dockable = getDockable(pageComponent); if(dockable instanceof ViewDescriptorDockable) { ViewDescriptorDockable vdd = (ViewDescriptorDockable) dockable; vdd.setTitleText(pageComponent.getCaption()); vdd.setTitleIcon(pageComponent.getIcon()); } } }