src/Tools/jEdit/src/pide_docking_framework.scala
author wenzelm
Thu, 08 May 2014 00:14:06 +0200
changeset 56906 408b526911f7
child 56936 6dd8866eca69
permissions -rw-r--r--
some odd tricks to provide "Detach" menu item, via "PIDE" docking framework;
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
56906
408b526911f7 some odd tricks to provide "Detach" menu item, via "PIDE" docking framework;
wenzelm
parents:
diff changeset
     1
/*  Title:      Tools/jEdit/src/pide_docking_framework.scala
408b526911f7 some odd tricks to provide "Detach" menu item, via "PIDE" docking framework;
wenzelm
parents:
diff changeset
     2
    Author:     Makarius
408b526911f7 some odd tricks to provide "Detach" menu item, via "PIDE" docking framework;
wenzelm
parents:
diff changeset
     3
408b526911f7 some odd tricks to provide "Detach" menu item, via "PIDE" docking framework;
wenzelm
parents:
diff changeset
     4
PIDE docking framework: "Original" with some add-ons.
408b526911f7 some odd tricks to provide "Detach" menu item, via "PIDE" docking framework;
wenzelm
parents:
diff changeset
     5
*/
408b526911f7 some odd tricks to provide "Detach" menu item, via "PIDE" docking framework;
wenzelm
parents:
diff changeset
     6
408b526911f7 some odd tricks to provide "Detach" menu item, via "PIDE" docking framework;
wenzelm
parents:
diff changeset
     7
package org.gjt.sp.jedit.gui  // sic!
408b526911f7 some odd tricks to provide "Detach" menu item, via "PIDE" docking framework;
wenzelm
parents:
diff changeset
     8
408b526911f7 some odd tricks to provide "Detach" menu item, via "PIDE" docking framework;
wenzelm
parents:
diff changeset
     9
408b526911f7 some odd tricks to provide "Detach" menu item, via "PIDE" docking framework;
wenzelm
parents:
diff changeset
    10
import isabelle._
408b526911f7 some odd tricks to provide "Detach" menu item, via "PIDE" docking framework;
wenzelm
parents:
diff changeset
    11
import isabelle.jedit._
408b526911f7 some odd tricks to provide "Detach" menu item, via "PIDE" docking framework;
wenzelm
parents:
diff changeset
    12
408b526911f7 some odd tricks to provide "Detach" menu item, via "PIDE" docking framework;
wenzelm
parents:
diff changeset
    13
import java.awt.event.{ActionListener, ActionEvent}
408b526911f7 some odd tricks to provide "Detach" menu item, via "PIDE" docking framework;
wenzelm
parents:
diff changeset
    14
import javax.swing.{JPopupMenu, JMenuItem}
408b526911f7 some odd tricks to provide "Detach" menu item, via "PIDE" docking framework;
wenzelm
parents:
diff changeset
    15
408b526911f7 some odd tricks to provide "Detach" menu item, via "PIDE" docking framework;
wenzelm
parents:
diff changeset
    16
import org.gjt.sp.jedit.View
408b526911f7 some odd tricks to provide "Detach" menu item, via "PIDE" docking framework;
wenzelm
parents:
diff changeset
    17
408b526911f7 some odd tricks to provide "Detach" menu item, via "PIDE" docking framework;
wenzelm
parents:
diff changeset
    18
408b526911f7 some odd tricks to provide "Detach" menu item, via "PIDE" docking framework;
wenzelm
parents:
diff changeset
    19
class PIDE_Docking_Framework extends DockableWindowManagerProvider
408b526911f7 some odd tricks to provide "Detach" menu item, via "PIDE" docking framework;
wenzelm
parents:
diff changeset
    20
{
408b526911f7 some odd tricks to provide "Detach" menu item, via "PIDE" docking framework;
wenzelm
parents:
diff changeset
    21
  override def create(
408b526911f7 some odd tricks to provide "Detach" menu item, via "PIDE" docking framework;
wenzelm
parents:
diff changeset
    22
    view: View,
408b526911f7 some odd tricks to provide "Detach" menu item, via "PIDE" docking framework;
wenzelm
parents:
diff changeset
    23
    instance: DockableWindowFactory,
408b526911f7 some odd tricks to provide "Detach" menu item, via "PIDE" docking framework;
wenzelm
parents:
diff changeset
    24
    config: View.ViewConfig): DockableWindowManager =
408b526911f7 some odd tricks to provide "Detach" menu item, via "PIDE" docking framework;
wenzelm
parents:
diff changeset
    25
  new DockableWindowManagerImpl(view, instance, config)
408b526911f7 some odd tricks to provide "Detach" menu item, via "PIDE" docking framework;
wenzelm
parents:
diff changeset
    26
  {
408b526911f7 some odd tricks to provide "Detach" menu item, via "PIDE" docking framework;
wenzelm
parents:
diff changeset
    27
    override def createPopupMenu(
408b526911f7 some odd tricks to provide "Detach" menu item, via "PIDE" docking framework;
wenzelm
parents:
diff changeset
    28
      container: DockableWindowContainer,
408b526911f7 some odd tricks to provide "Detach" menu item, via "PIDE" docking framework;
wenzelm
parents:
diff changeset
    29
      dockable_name: String,
408b526911f7 some odd tricks to provide "Detach" menu item, via "PIDE" docking framework;
wenzelm
parents:
diff changeset
    30
      clone: Boolean): JPopupMenu =
408b526911f7 some odd tricks to provide "Detach" menu item, via "PIDE" docking framework;
wenzelm
parents:
diff changeset
    31
    {
408b526911f7 some odd tricks to provide "Detach" menu item, via "PIDE" docking framework;
wenzelm
parents:
diff changeset
    32
      val menu = super.createPopupMenu(container, dockable_name, clone)
408b526911f7 some odd tricks to provide "Detach" menu item, via "PIDE" docking framework;
wenzelm
parents:
diff changeset
    33
408b526911f7 some odd tricks to provide "Detach" menu item, via "PIDE" docking framework;
wenzelm
parents:
diff changeset
    34
      val detach_operation: Option[() => Unit] =
408b526911f7 some odd tricks to provide "Detach" menu item, via "PIDE" docking framework;
wenzelm
parents:
diff changeset
    35
        container match {
408b526911f7 some odd tricks to provide "Detach" menu item, via "PIDE" docking framework;
wenzelm
parents:
diff changeset
    36
          case floating: FloatingWindowContainer =>
408b526911f7 some odd tricks to provide "Detach" menu item, via "PIDE" docking framework;
wenzelm
parents:
diff changeset
    37
            val entry = Untyped.get(floating, "entry")
408b526911f7 some odd tricks to provide "Detach" menu item, via "PIDE" docking framework;
wenzelm
parents:
diff changeset
    38
            val win = Untyped.get(entry, "win")
408b526911f7 some odd tricks to provide "Detach" menu item, via "PIDE" docking framework;
wenzelm
parents:
diff changeset
    39
            win match {
408b526911f7 some odd tricks to provide "Detach" menu item, via "PIDE" docking framework;
wenzelm
parents:
diff changeset
    40
              case dockable: Dockable => dockable.detach_operation
408b526911f7 some odd tricks to provide "Detach" menu item, via "PIDE" docking framework;
wenzelm
parents:
diff changeset
    41
              case _ => None
408b526911f7 some odd tricks to provide "Detach" menu item, via "PIDE" docking framework;
wenzelm
parents:
diff changeset
    42
            }
408b526911f7 some odd tricks to provide "Detach" menu item, via "PIDE" docking framework;
wenzelm
parents:
diff changeset
    43
408b526911f7 some odd tricks to provide "Detach" menu item, via "PIDE" docking framework;
wenzelm
parents:
diff changeset
    44
          case panel: PanelWindowContainer =>
408b526911f7 some odd tricks to provide "Detach" menu item, via "PIDE" docking framework;
wenzelm
parents:
diff changeset
    45
            val entries =
408b526911f7 some odd tricks to provide "Detach" menu item, via "PIDE" docking framework;
wenzelm
parents:
diff changeset
    46
              Untyped.get(panel, "dockables").asInstanceOf[java.util.List[AnyRef]].toArray
408b526911f7 some odd tricks to provide "Detach" menu item, via "PIDE" docking framework;
wenzelm
parents:
diff changeset
    47
            val wins =
408b526911f7 some odd tricks to provide "Detach" menu item, via "PIDE" docking framework;
wenzelm
parents:
diff changeset
    48
              (for {
408b526911f7 some odd tricks to provide "Detach" menu item, via "PIDE" docking framework;
wenzelm
parents:
diff changeset
    49
                entry <- entries.iterator
408b526911f7 some odd tricks to provide "Detach" menu item, via "PIDE" docking framework;
wenzelm
parents:
diff changeset
    50
                if Untyped.get(Untyped.get(entry, "factory"), "name") == dockable_name
408b526911f7 some odd tricks to provide "Detach" menu item, via "PIDE" docking framework;
wenzelm
parents:
diff changeset
    51
                win = Untyped.get(entry, "win")
408b526911f7 some odd tricks to provide "Detach" menu item, via "PIDE" docking framework;
wenzelm
parents:
diff changeset
    52
                if win != null
408b526911f7 some odd tricks to provide "Detach" menu item, via "PIDE" docking framework;
wenzelm
parents:
diff changeset
    53
              } yield win).toList
408b526911f7 some odd tricks to provide "Detach" menu item, via "PIDE" docking framework;
wenzelm
parents:
diff changeset
    54
            wins match {
408b526911f7 some odd tricks to provide "Detach" menu item, via "PIDE" docking framework;
wenzelm
parents:
diff changeset
    55
              case List(dockable: Dockable) => dockable.detach_operation
408b526911f7 some odd tricks to provide "Detach" menu item, via "PIDE" docking framework;
wenzelm
parents:
diff changeset
    56
              case _ => None
408b526911f7 some odd tricks to provide "Detach" menu item, via "PIDE" docking framework;
wenzelm
parents:
diff changeset
    57
            }
408b526911f7 some odd tricks to provide "Detach" menu item, via "PIDE" docking framework;
wenzelm
parents:
diff changeset
    58
408b526911f7 some odd tricks to provide "Detach" menu item, via "PIDE" docking framework;
wenzelm
parents:
diff changeset
    59
          case _ => None
408b526911f7 some odd tricks to provide "Detach" menu item, via "PIDE" docking framework;
wenzelm
parents:
diff changeset
    60
        }
408b526911f7 some odd tricks to provide "Detach" menu item, via "PIDE" docking framework;
wenzelm
parents:
diff changeset
    61
      if (detach_operation.isDefined) {
408b526911f7 some odd tricks to provide "Detach" menu item, via "PIDE" docking framework;
wenzelm
parents:
diff changeset
    62
        val detach_item = new JMenuItem("Detach")
408b526911f7 some odd tricks to provide "Detach" menu item, via "PIDE" docking framework;
wenzelm
parents:
diff changeset
    63
        detach_item.addActionListener(new ActionListener {
408b526911f7 some odd tricks to provide "Detach" menu item, via "PIDE" docking framework;
wenzelm
parents:
diff changeset
    64
          def actionPerformed(evt: ActionEvent) { detach_operation.get.apply() }
408b526911f7 some odd tricks to provide "Detach" menu item, via "PIDE" docking framework;
wenzelm
parents:
diff changeset
    65
        })
408b526911f7 some odd tricks to provide "Detach" menu item, via "PIDE" docking framework;
wenzelm
parents:
diff changeset
    66
        menu.add(detach_item)
408b526911f7 some odd tricks to provide "Detach" menu item, via "PIDE" docking framework;
wenzelm
parents:
diff changeset
    67
      }
408b526911f7 some odd tricks to provide "Detach" menu item, via "PIDE" docking framework;
wenzelm
parents:
diff changeset
    68
408b526911f7 some odd tricks to provide "Detach" menu item, via "PIDE" docking framework;
wenzelm
parents:
diff changeset
    69
      menu
408b526911f7 some odd tricks to provide "Detach" menu item, via "PIDE" docking framework;
wenzelm
parents:
diff changeset
    70
    }
408b526911f7 some odd tricks to provide "Detach" menu item, via "PIDE" docking framework;
wenzelm
parents:
diff changeset
    71
  }
408b526911f7 some odd tricks to provide "Detach" menu item, via "PIDE" docking framework;
wenzelm
parents:
diff changeset
    72
}